aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--Covers/Covers.ini19
-rw-r--r--Covers/NoCover.jpgbin0 -> 33592 bytes
-rw-r--r--Covers/Thumbs.dbbin0 -> 14848 bytes
-rw-r--r--Game/Changelog.german.txt389
-rw-r--r--Game/Changelog.txt392
-rw-r--r--Game/Code/Classes/TextGL.pas345
-rw-r--r--Game/Code/Classes/UCatCovers.pas143
-rw-r--r--Game/Code/Classes/UCommandLine.pas280
-rw-r--r--Game/Code/Classes/UCovers.pas226
-rw-r--r--Game/Code/Classes/UDLLManager.pas226
-rw-r--r--Game/Code/Classes/UDataBase.pas500
-rw-r--r--Game/Code/Classes/UDraw.pas1715
-rw-r--r--Game/Code/Classes/UFiles.pas1153
-rw-r--r--Game/Code/Classes/UGraphic.pas564
-rw-r--r--Game/Code/Classes/UGraphicClasses.pas655
-rw-r--r--Game/Code/Classes/UHelp.pas401
-rw-r--r--Game/Code/Classes/UIni.pas820
-rw-r--r--Game/Code/Classes/UJoystick.pas273
-rw-r--r--Game/Code/Classes/ULCD.pas289
-rw-r--r--Game/Code/Classes/ULanguage.pas222
-rw-r--r--Game/Code/Classes/ULight.pas116
-rw-r--r--Game/Code/Classes/ULog.pas227
-rw-r--r--Game/Code/Classes/ULyrics.pas389
-rw-r--r--Game/Code/Classes/UMain.pas735
-rw-r--r--Game/Code/Classes/UMusic.pas951
-rw-r--r--Game/Code/Classes/UParty.pas433
-rw-r--r--Game/Code/Classes/UPartyM2.pas693
-rw-r--r--Game/Code/Classes/UPlaylist.pas453
-rw-r--r--Game/Code/Classes/UPliki.pas833
-rw-r--r--Game/Code/Classes/URecord.pas371
-rw-r--r--Game/Code/Classes/USkins.pas162
-rw-r--r--Game/Code/Classes/USongs.pas794
-rw-r--r--Game/Code/Classes/UTexture.pas884
-rw-r--r--Game/Code/Classes/UThemes.pas2611
-rw-r--r--Game/Code/Classes/UTime.pas81
-rw-r--r--Game/Code/Classes/UVideo.pas737
-rw-r--r--Game/Code/Menu/UDisplay.pas460
-rw-r--r--Game/Code/Menu/UDrawTexture.pas101
-rw-r--r--Game/Code/Menu/UMenu.pas1448
-rw-r--r--Game/Code/Menu/UMenuButton.pas488
-rw-r--r--Game/Code/Menu/UMenuButtonCollection.pas68
-rw-r--r--Game/Code/Menu/UMenuInteract.pas14
-rw-r--r--Game/Code/Menu/UMenuSelect.pas198
-rw-r--r--Game/Code/Menu/UMenuSelectSlide.pas345
-rw-r--r--Game/Code/Menu/UMenuStatic.pas84
-rw-r--r--Game/Code/Menu/UMenuText.pas324
-rw-r--r--Game/Code/SMpeg/USmpeg.pas307
-rw-r--r--Game/Code/Screens/UScreenCredits.pas1110
-rw-r--r--Game/Code/Screens/UScreenEdit.pas109
-rw-r--r--Game/Code/Screens/UScreenEditConvert.pas531
-rw-r--r--Game/Code/Screens/UScreenEditHeader.pas366
-rw-r--r--Game/Code/Screens/UScreenEditSub.pas1854
-rw-r--r--Game/Code/Screens/UScreenLevel.pas104
-rw-r--r--Game/Code/Screens/UScreenLoading.pas46
-rw-r--r--Game/Code/Screens/UScreenMain.pas329
-rw-r--r--Game/Code/Screens/UScreenName.pas243
-rw-r--r--Game/Code/Screens/UScreenOpen.pas165
-rw-r--r--Game/Code/Screens/UScreenOptions.pas176
-rw-r--r--Game/Code/Screens/UScreenOptionsAdvanced.pas112
-rw-r--r--Game/Code/Screens/UScreenOptionsGame.pas117
-rw-r--r--Game/Code/Screens/UScreenOptionsGraphics.pas107
-rw-r--r--Game/Code/Screens/UScreenOptionsLyrics.pas101
-rw-r--r--Game/Code/Screens/UScreenOptionsRecord.pas142
-rw-r--r--Game/Code/Screens/UScreenOptionsSound.pas107
-rw-r--r--Game/Code/Screens/UScreenOptionsThemes.pas166
-rw-r--r--Game/Code/Screens/UScreenPartyNewRound.pas376
-rw-r--r--Game/Code/Screens/UScreenPartyNewRoundM2.pas313
-rw-r--r--Game/Code/Screens/UScreenPartyOptions.pas649
-rw-r--r--Game/Code/Screens/UScreenPartyOptionsM2.pas819
-rw-r--r--Game/Code/Screens/UScreenPartyPlayer.pas340
-rw-r--r--Game/Code/Screens/UScreenPartyPlayerM2.pas256
-rw-r--r--Game/Code/Screens/UScreenPartyScore.pas301
-rw-r--r--Game/Code/Screens/UScreenPartyWin.pas267
-rw-r--r--Game/Code/Screens/UScreenPopup.pas862
-rw-r--r--Game/Code/Screens/UScreenScore.pas544
-rw-r--r--Game/Code/Screens/UScreenSing.pas1611
-rw-r--r--Game/Code/Screens/UScreenSingModi.pas772
-rw-r--r--Game/Code/Screens/UScreenSong.pas3133
-rw-r--r--Game/Code/Screens/UScreenSongJumpto.pas213
-rw-r--r--Game/Code/Screens/UScreenSongMenu.pas661
-rw-r--r--Game/Code/Screens/UScreenStatDetail.pas259
-rw-r--r--Game/Code/Screens/UScreenStatMain.pas235
-rw-r--r--Game/Code/Screens/UScreenTop.pas210
-rw-r--r--Game/Code/Screens/UScreenWelcome.pas118
-rw-r--r--Game/Code/UltraStar.bdsproj175
-rw-r--r--Game/Code/UltraStar.bdsproj.local2
-rw-r--r--Game/Code/UltraStar.cfg44
-rw-r--r--Game/Code/UltraStar.dpr364
-rw-r--r--Game/Code/UltraStar.rc37
-rw-r--r--Game/Code/UltraStar.resbin0 -> 2291944 bytes
-rw-r--r--Game/Code/bamboo-build-win-delphi.bat24
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/JEDI-SDL-README.txt244
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/geometry.pas1994
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/gl.pas2300
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/glext.pas9578
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/glu.pas582
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/glut.pas688
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/glx.pas280
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/fastevents.pas201
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/jedi-sdl.inc438
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/libxmlparser.pas2688
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/logger.pas189
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/moduleloader.pas319
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/registryuserpreferences.pas229
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdl.pas4321
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdl_cpuinfo.pas155
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlgameinterface.pas202
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdli386utils.pas5236
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlinput.pas923
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlstreams.pas216
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlticks.pas197
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlutils.pas4361
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlwindow.pas566
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/userpreferences.pas159
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/xplatformutils.pas126
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL_Image/Pas/sdl_image.pas349
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL_ttf/Demos/GLFont/glfont.dpr625
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL_ttf/Demos/ShowFont/showfont.dpr384
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL_ttf/Pas/sdl_ttf.pas505
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/SDL_ttf/Pas/sdltruetypefont.pas565
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/placeholder.txt4
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/GLMovie/glmovie.dpr434
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/Campus.jpgbin0 -> 4836 bytes
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/MPEGPlay.dpr26
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/Main.dfmbin0 -> 1314 bytes
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/Main.pas91
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/Main.xfm106
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/README.1ST21
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/sdlmpegpanel.pas149
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/video40.dpk33
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/video50.dpk33
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/video60.dpk35
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/SMpegPlayer/SMpegPlayer.cfg38
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/SMpegPlayer/SMpegPlayer.dof136
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/SMpegPlayer/SMpegPlayer.dpr278
-rw-r--r--Game/Code/lib/JEDI-SDLv1.0/smpeg/Pas/smpeg.pas465
-rw-r--r--Game/Code/lib/PngImage/Tpngimage.DPK34
-rw-r--r--Game/Code/lib/PngImage/Tpngimage.cfg40
-rw-r--r--Game/Code/lib/PngImage/Tpngimage.drc62
-rw-r--r--Game/Code/lib/PngImage/Tpngimage.resbin0 -> 1536 bytes
-rw-r--r--Game/Code/lib/PngImage/Tpngimage.stat10
-rw-r--r--Game/Code/lib/PngImage/lazarustest.lpi239
-rw-r--r--Game/Code/lib/PngImage/lazarustest.lpr15
-rw-r--r--Game/Code/lib/PngImage/obj/adler32.objbin0 -> 602 bytes
-rw-r--r--Game/Code/lib/PngImage/obj/deflate.objbin0 -> 6993 bytes
-rw-r--r--Game/Code/lib/PngImage/obj/infblock.objbin0 -> 5347 bytes
-rw-r--r--Game/Code/lib/PngImage/obj/infcodes.objbin0 -> 3600 bytes
-rw-r--r--Game/Code/lib/PngImage/obj/inffast.objbin0 -> 2323 bytes
-rw-r--r--Game/Code/lib/PngImage/obj/inflate.objbin0 -> 3188 bytes
-rw-r--r--Game/Code/lib/PngImage/obj/inftrees.objbin0 -> 7995 bytes
-rw-r--r--Game/Code/lib/PngImage/obj/infutil.objbin0 -> 1339 bytes
-rw-r--r--Game/Code/lib/PngImage/obj/trees.objbin0 -> 11623 bytes
-rw-r--r--Game/Code/lib/PngImage/pngimage.chmbin0 -> 162254 bytes
-rw-r--r--Game/Code/lib/PngImage/pngimage.pas5213
-rw-r--r--Game/Code/lib/PngImage/pnglang.pas301
-rw-r--r--Game/Code/lib/PngImage/pngzlib.pas172
-rw-r--r--Game/Code/lib/SQLite/SQLite3.pas189
-rw-r--r--Game/Code/lib/SQLite/SQLiteTable3.pas805
-rw-r--r--Game/Code/lib/SQLite/readme.txt82
-rw-r--r--Game/Code/lib/acinerella/acinerella.c783
-rw-r--r--Game/Code/lib/acinerella/acinerella.h257
-rw-r--r--Game/Code/lib/acinerella/acinerella.pas282
-rw-r--r--Game/Code/lib/acinerella/makefile13
-rw-r--r--Game/Code/lib/bass/bass.chmbin0 -> 200682 bytes
-rw-r--r--Game/Code/lib/bass/bass.txt1546
-rw-r--r--Game/Code/lib/bass/delphi/bass.bpg64
-rw-r--r--Game/Code/lib/bass/delphi/bass.pas968
-rw-r--r--Game/Code/lib/midi/CIRCBUF.PAS192
-rw-r--r--Game/Code/lib/midi/DELPHMCB.PAS140
-rw-r--r--Game/Code/lib/midi/MIDIDEFS.PAS47
-rw-r--r--Game/Code/lib/midi/MIDITYPE.PAS79
-rw-r--r--Game/Code/lib/midi/MidiFile.pas956
-rw-r--r--Game/Code/lib/midi/MidiScope.pas193
-rw-r--r--Game/Code/lib/midi/Midicons.pas42
-rw-r--r--Game/Code/lib/midi/Midiin.pas712
-rw-r--r--Game/Code/lib/midi/Midiout.pas600
-rw-r--r--Game/Code/lib/midi/midiComp.cfg35
-rw-r--r--Game/Code/lib/midi/midiComp.dpk45
-rw-r--r--Game/Code/lib/midi/midiComp.resbin0 -> 876 bytes
-rw-r--r--Game/Code/lib/midi/readme.txt60
-rw-r--r--Game/Code/lib/requirements.txt48
-rw-r--r--Game/Code/lib/zlportio/README.TXT27
-rw-r--r--Game/Code/lib/zlportio/Sys/zlportio.sysbin0 -> 4016 bytes
-rw-r--r--Game/Code/lib/zlportio/ddkint.pas253
-rw-r--r--Game/Code/lib/zlportio/zlportio.pas285
-rw-r--r--Game/Code/rccompillieren.bat1
-rw-r--r--Game/Fonts/Bold/Font 1024 Bold 16.pngbin0 -> 44587 bytes
-rw-r--r--Game/Fonts/Bold/Font 1024 Bold.datbin0 -> 256 bytes
-rw-r--r--Game/Fonts/Bold/Thumbs.dbbin0 -> 70656 bytes
-rw-r--r--Game/Fonts/Bold/eurostar_regular_bold.datbin0 -> 256 bytes
-rw-r--r--Game/Fonts/Bold/eurostar_regular_bold.pngbin0 -> 30258 bytes
-rw-r--r--Game/Fonts/Normal/Font Normal 16.pngbin0 -> 47016 bytes
-rw-r--r--Game/Fonts/Normal/Font Normal.datbin0 -> 256 bytes
-rw-r--r--Game/Fonts/Normal/Thumbs.dbbin0 -> 62464 bytes
-rw-r--r--Game/Fonts/Normal/eurostar_regular.datbin0 -> 256 bytes
-rw-r--r--Game/Fonts/Normal/eurostar_regular.pngbin0 -> 23199 bytes
-rw-r--r--Game/Fonts/Outline 1/Outline 1.datbin0 -> 256 bytes
-rw-r--r--Game/Fonts/Outline 1/Outline 1.pngbin0 -> 49840 bytes
-rw-r--r--Game/Fonts/Outline 1/Thumbs.dbbin0 -> 33792 bytes
-rw-r--r--Game/Fonts/Outline 2/Outline 2.datbin0 -> 256 bytes
-rw-r--r--Game/Fonts/Outline 2/Outline 2.pngbin0 -> 40714 bytes
-rw-r--r--Game/Fonts/Outline 2/Thumbs.dbbin0 -> 33792 bytes
-rw-r--r--Game/Graphics/NoCover.jpgbin0 -> 33592 bytes
-rw-r--r--Game/Graphics/credits_v5_bg.pngbin0 -> 264166 bytes
-rw-r--r--Game/Graphics/credits_v5_overlay.pngbin0 -> 380739 bytes
-rw-r--r--Game/Graphics/intro-l-01.pngbin0 -> 31481 bytes
-rw-r--r--Game/Graphics/intro-l-02.pngbin0 -> 27728 bytes
-rw-r--r--Game/Graphics/intro-l-03.pngbin0 -> 222080 bytes
-rw-r--r--Game/Graphics/intro-l-04.pngbin0 -> 102638 bytes
-rw-r--r--Game/Graphics/intro-l-05.pngbin0 -> 22767 bytes
-rw-r--r--Game/Graphics/intro-l-06.pngbin0 -> 77860 bytes
-rw-r--r--Game/Graphics/intro-l-07.pngbin0 -> 31873 bytes
-rw-r--r--Game/Graphics/intro-l-08.pngbin0 -> 13041 bytes
-rw-r--r--Game/Graphics/intro-l-09.pngbin0 -> 7553 bytes
-rw-r--r--Game/Graphics/names_blindy.pngbin0 -> 15088 bytes
-rw-r--r--Game/Graphics/names_canni.pngbin0 -> 14650 bytes
-rw-r--r--Game/Graphics/names_ggkfc.pngbin0 -> 14643 bytes
-rw-r--r--Game/Graphics/names_jaybinks.pngbin0 -> 15111 bytes
-rw-r--r--Game/Graphics/names_linnex.pngbin0 -> 10744 bytes
-rw-r--r--Game/Graphics/names_mog.pngbin0 -> 12363 bytes
-rw-r--r--Game/Graphics/names_omgdutch.pngbin0 -> 14620 bytes
-rw-r--r--Game/Graphics/names_skillmaster.pngbin0 -> 18925 bytes
-rw-r--r--Game/Graphics/names_whiteshark.pngbin0 -> 14679 bytes
-rw-r--r--Game/Graphics/outro-bg.pngbin0 -> 639470 bytes
-rw-r--r--Game/Graphics/outro-esc.pngbin0 -> 75369 bytes
-rw-r--r--Game/Graphics/outro-exit-dark.pngbin0 -> 94897 bytes
-rw-r--r--Game/Graphics/us.icobin0 -> 766 bytes
-rw-r--r--Game/Graphics/ustar-icon_v01.icobin0 -> 22486 bytes
-rw-r--r--Game/Output/Changelog.german.txt389
-rw-r--r--Game/Output/Changelog.txt392
-rw-r--r--Game/Output/Covers/Covers.ini19
-rw-r--r--Game/Output/Covers/NoCover.jpgbin0 -> 33592 bytes
-rw-r--r--Game/Output/Covers/Thumbs.dbbin0 -> 14848 bytes
-rw-r--r--Game/Output/Languages/English.ini1389
-rw-r--r--Game/Output/Languages/German.ini1393
-rw-r--r--Game/Output/Languages/Italian.ini1381
-rw-r--r--Game/Output/Languages/TODOs/Catalan.ini299
-rw-r--r--Game/Output/Languages/TODOs/Croatian.ini308
-rw-r--r--Game/Output/Languages/TODOs/Danish.ini298
-rw-r--r--Game/Output/Languages/TODOs/Dutch.ini299
-rw-r--r--Game/Output/Languages/TODOs/Euskara.ini298
-rw-r--r--Game/Output/Languages/TODOs/French.ini300
-rw-r--r--Game/Output/Languages/TODOs/Norwegian.ini298
-rw-r--r--Game/Output/Languages/TODOs/Polish.ini305
-rw-r--r--Game/Output/Languages/TODOs/Portuguese.ini299
-rw-r--r--Game/Output/Languages/TODOs/Serbian.ini299
-rw-r--r--Game/Output/Languages/TODOs/Slovak.ini302
-rw-r--r--Game/Output/Languages/TODOs/Spanish.ini298
-rw-r--r--Game/Output/Languages/TODOs/Swedish.ini299
-rw-r--r--Game/Output/Languages/readme.txt288
-rw-r--r--Game/Output/License.txt125
-rw-r--r--Game/Output/Plugins/Blind.dllbin0 -> 14848 bytes
-rw-r--r--Game/Output/Plugins/Duell.dllbin0 -> 14848 bytes
-rw-r--r--Game/Output/Plugins/HauDenLukas.dllbin0 -> 115712 bytes
-rw-r--r--Game/Output/Plugins/Hold_The_Line.dllbin0 -> 113152 bytes
-rw-r--r--Game/Output/Plugins/IDontSeeMyScore.dllbin0 -> 14848 bytes
-rw-r--r--Game/Output/Plugins/More1000.dllbin0 -> 15360 bytes
-rw-r--r--Game/Output/Plugins/More500.dllbin0 -> 15360 bytes
-rw-r--r--Game/Output/Plugins/TeamDuell.dllbin0 -> 117248 bytes
-rw-r--r--Game/Output/Plugins/Until5000.dllbin0 -> 14848 bytes
-rw-r--r--Game/Output/Plugins/Until5000Blind.dllbin0 -> 14848 bytes
-rw-r--r--Game/Output/Plugins/Until5000BlindScore.dllbin0 -> 14848 bytes
-rw-r--r--Game/Output/ReadMe.txt112
-rw-r--r--Game/Output/SDL.dllbin0 -> 320512 bytes
-rw-r--r--Game/Output/Skins/Deluxe/Blue.ini157
-rw-r--r--Game/Output/Skins/Deluxe/Fall.ini157
-rw-r--r--Game/Output/Skins/Deluxe/Summer.ini157
-rw-r--r--Game/Output/Skins/Deluxe/Thumbs.dbbin0 -> 54784 bytes
-rw-r--r--Game/Output/Skins/Deluxe/Winter.ini156
-rw-r--r--Game/Output/Skins/Deluxe/[bg-load]blue.jpgbin0 -> 111299 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[bg-load]fall.jpgbin0 -> 471938 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[bg-load]summer.jpgbin0 -> 381304 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[bg-load]winter.jpgbin0 -> 243663 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[bg-main]blue.jpgbin0 -> 65305 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[bg-main]fall.jpgbin0 -> 392979 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[bg-main]summer.jpgbin0 -> 447517 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[bg-main]winter.jpgbin0 -> 268024 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[button]13.jpgbin0 -> 1453 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[button]alt.jpgbin0 -> 1499 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[button]az.jpgbin0 -> 1475 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[button]enter.jpgbin0 -> 1600 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[button]esc.jpgbin0 -> 1407 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[button]j.jpgbin0 -> 854 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[button]m.jpgbin0 -> 882 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[button]navi.jpgbin0 -> 1330 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[button]p.jpgbin0 -> 869 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[effect]goldenNoteStar.jpgbin0 -> 24894 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[effect]perfectNoteStar.jpgbin0 -> 27633 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[helper]buttonFade.jpgbin0 -> 825 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[helper]rectangle.jpgbin0 -> 604 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[icon]calcmedley.jpgbin0 -> 1323 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[icon]cd.jpgbin0 -> 1175 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[icon]error.jpgbin0 -> 620 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[icon]main.jpgbin0 -> 1153 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[icon]medley.jpgbin0 -> 1325 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[icon]options.jpgbin0 -> 1063 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[icon]party.jpgbin0 -> 1528 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[icon]question.jpgbin0 -> 663 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[icon]score.jpgbin0 -> 1150 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[icon]search.jpgbin0 -> 759 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[icon]songmenu.jpgbin0 -> 1659 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[icon]stats.jpgbin0 -> 1741 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[icon]video.jpgbin0 -> 2608 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[main]button.jpgbin0 -> 1519 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[main]buttonf.jpgbin0 -> 17717 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[main]mainBar.jpgbin0 -> 2957 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[main]playerNumberBox.jpgbin0 -> 1071 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[main]selectbg.jpgbin0 -> 4100 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[main]songCover.jpgbin0 -> 30254 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[main]songSelection1.jpgbin0 -> 2710 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[main]songSelection2.jpgbin0 -> 1031 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[menu]PopUpBg.JPGbin0 -> 2676 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[menu]PopUpFg.JPGbin0 -> 5993 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[menu]jumpToBg.jpgbin0 -> 1870 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[menu]songMenuBg.jpgbin0 -> 5287 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[menu]songMenuSelectBg.jpgbin0 -> 1674 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[party]Joker.jpgbin0 -> 7169 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[party]playerButton.jpgbin0 -> 1519 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[party]playerTeamButton.jpgbin0 -> 2428 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[party]pointer.bmpbin0 -> 6198 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[party]roundBG1.jpgbin0 -> 1043 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[party]roundBG2.jpgbin0 -> 978 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[party]roundBG3.jpgbin0 -> 1251 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[party]roundBG4.jpgbin0 -> 1229 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[party]roundTeamButton.jpgbin0 -> 2887 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[party]scoreBG1.jpgbin0 -> 1226 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[party]scoreBG2.jpgbin0 -> 653 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[party]scoreDecoration.jpgbin0 -> 6179 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[party]teamPoints.jpgbin0 -> 729 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[party]winDecoration1.jpgbin0 -> 4331 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[party]winTeamButton1.jpgbin0 -> 1925 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[party]winTeamButton2.jpgbin0 -> 1783 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[party]winTeamButton3.jpgbin0 -> 1458 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[score]Line.jpgbin0 -> 559 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[score]box.jpgbin0 -> 690 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[score]endcap.jpgbin0 -> 984 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[score]level.jpgbin0 -> 1264 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[score]levelRound.jpgbin0 -> 614 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[sing]LyricsBall.bmpbin0 -> 536 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[sing]lineBonusPopUp.jpgbin0 -> 2356 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[sing]lyricsHelpBar.bmpbin0 -> 3126 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[sing]notesBgLeft.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[sing]notesBgMid.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[sing]notesBgRight.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[sing]notesLeft.bmpbin0 -> 822 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[sing]notesMid.bmpbin0 -> 3126 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[sing]notesRight.bmpbin0 -> 822 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[sing]p.jpgbin0 -> 2630 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[sing]scoreBg.jpgbin0 -> 2005 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[sing]singBarBack.jpgbin0 -> 388 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[sing]singBarBar.jpgbin0 -> 371 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[sing]singBarFront.jpgbin0 -> 549 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[sing]textBar.jpgbin0 -> 1558 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[sing]timeBar.jpgbin0 -> 504 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[sing]timeBar1.jpgbin0 -> 483 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[sing]timeBarBG.jpgbin0 -> 540 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[special]bar1.jpgbin0 -> 2419 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[special]bar2.jpgbin0 -> 1648 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[stat]detailBG1.jpgbin0 -> 653 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[stat]mainBG1.jpgbin0 -> 652 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[stat]mainBG2.jpgbin0 -> 2942 bytes
-rw-r--r--Game/Output/Skins/Deluxe/[stat]mainBG3.jpgbin0 -> 596 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/Simple.ini173
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/Thumbs.dbbin0 -> 233524 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[bg-diff]blue.jpgbin0 -> 134279 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[bg-load]blue.jpgbin0 -> 151638 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[bg-main]blue.jpgbin0 -> 113271 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[bg-menu]blue.jpgbin0 -> 162279 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[bg-name]blue.jpgbin0 -> 295021 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[bg-option]blue.jpgbin0 -> 197014 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[bg-party]blue.jpgbin0 -> 109647 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[bg-song]blue.jpgbin0 -> 127202 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[bg-top5]blue.jpgbin0 -> 116725 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[button]13.jpgbin0 -> 893 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[button]alt.jpgbin0 -> 892 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[button]az.jpgbin0 -> 900 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[button]enter.jpgbin0 -> 911 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[button]esc.jpgbin0 -> 892 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[button]j.jpgbin0 -> 880 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[button]m.jpgbin0 -> 889 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[button]navi.jpgbin0 -> 938 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[button]p.jpgbin0 -> 884 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[effect]goldenNoteStar.jpgbin0 -> 7210 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[effect]perfectNoteStar.jpgbin0 -> 27633 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[helper]buttonFade.jpgbin0 -> 2071 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[helper]buttonFade2.jpgbin0 -> 22026 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[helper]rectangle.jpgbin0 -> 1390 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[icon]cd.jpgbin0 -> 3054 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[icon]error.jpgbin0 -> 620 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[icon]main.jpgbin0 -> 1169 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[icon]options.jpgbin0 -> 2529 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[icon]party.jpgbin0 -> 2475 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[icon]question.jpgbin0 -> 663 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[icon]score.jpgbin0 -> 1575 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[icon]search.jpgbin0 -> 894 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[icon]songmenu.jpgbin0 -> 1061 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[icon]stats.jpgbin0 -> 2745 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[icon]video.jpgbin0 -> 1464 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[main]button.jpgbin0 -> 2996 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[main]buttonf.jpgbin0 -> 17717 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[main]buttonmenu.jpgbin0 -> 2288 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[main]mainBar.jpgbin0 -> 4578 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[main]playerNumberBox.jpgbin0 -> 1071 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[main]selectbg.jpgbin0 -> 7411 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[main]songCover.jpgbin0 -> 30254 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[main]songSelection1.jpgbin0 -> 859 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[main]songSelection2.jpgbin0 -> 2483 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[menu]PopUpBg.JPGbin0 -> 2676 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[menu]PopUpFg.JPGbin0 -> 5993 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[menu]jumpToBg.jpgbin0 -> 4177 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[menu]songMenuBg.jpgbin0 -> 4365 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[menu]songMenuSelectBg.jpgbin0 -> 1674 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[option]button.jpgbin0 -> 2391 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[party]Joker.jpgbin0 -> 2272 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[party]playerButton.jpgbin0 -> 2768 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[party]playerTeamButton.jpgbin0 -> 2179 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[party]pointer.bmpbin0 -> 6198 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[party]roundBG1.jpgbin0 -> 1887 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[party]roundBG2.jpgbin0 -> 1842 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[party]roundBG3.jpgbin0 -> 2160 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[party]roundBG4.jpgbin0 -> 2871 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[party]roundTeamButton.jpgbin0 -> 2525 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[party]scoreBG1.jpgbin0 -> 4135 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[party]scoreBG2.jpgbin0 -> 2982 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[party]scoreDecoration.jpgbin0 -> 6179 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[party]teamPoints.jpgbin0 -> 729 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[party]winDecoration1.jpgbin0 -> 4331 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[party]winTeamButton1.jpgbin0 -> 2866 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[party]winTeamButton2.jpgbin0 -> 2333 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[party]winTeamButton3.jpgbin0 -> 1954 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[score]Line.jpgbin0 -> 984 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[score]box.jpgbin0 -> 906 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[score]endcap.jpgbin0 -> 984 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[score]level.jpgbin0 -> 1763 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[score]levelRound.jpgbin0 -> 864 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[sing]LyricsBall.bmpbin0 -> 774 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[sing]lineBonusPopUp.jpgbin0 -> 2356 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[sing]lyricsHelpBar.bmpbin0 -> 3126 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[sing]notesBgLeft.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[sing]notesBgMid.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[sing]notesBgRight.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[sing]notesLeft.bmpbin0 -> 822 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[sing]notesMid.bmpbin0 -> 3126 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[sing]notesRight.bmpbin0 -> 822 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[sing]p.jpgbin0 -> 1879 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[sing]scoreBg.jpgbin0 -> 1309 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[sing]singBarBack.jpgbin0 -> 668 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[sing]singBarBar.jpgbin0 -> 669 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[sing]singBarFront.jpgbin0 -> 549 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[sing]textBar.jpgbin0 -> 7056 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[sing]timeBar.jpgbin0 -> 673 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[sing]timeBar1.jpgbin0 -> 765 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[sing]timeBarBG.jpgbin0 -> 2357 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[special]bar1.jpgbin0 -> 771 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[special]bar2.jpgbin0 -> 1071 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[stat]detailBG1.jpgbin0 -> 2285 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[stat]mainBG1.jpgbin0 -> 2493 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[stat]mainBG2.jpgbin0 -> 7244 bytes
-rw-r--r--Game/Output/Skins/TODOs/Blue Sensation/[stat]mainBG3.jpgbin0 -> 2446 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/Star.ini153
-rw-r--r--Game/Output/Skins/TODOs/Classic/Thumbs.dbbin0 -> 13312 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[button]13.jpgbin0 -> 893 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[button]alt.jpgbin0 -> 892 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[button]az.jpgbin0 -> 900 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[button]e.jpgbin0 -> 883 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[button]enter.jpgbin0 -> 911 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[button]esc.jpgbin0 -> 892 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[button]j.jpgbin0 -> 880 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[button]m.jpgbin0 -> 889 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[button]navi.jpgbin0 -> 938 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[button]p.jpgbin0 -> 884 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[effect]goldenNoteStar.jpgbin0 -> 24894 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[effect]perfectNoteStar.jpgbin0 -> 27633 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[helper]rectangle.jpgbin0 -> 604 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[icon]Star.jpgbin0 -> 942 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[icon]error.jpgbin0 -> 1407 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[icon]question.jpgbin0 -> 1695 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[icon]stats.jpgbin0 -> 1010 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[icon]video.jpgbin0 -> 2608 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[main]Bar.jpgbin0 -> 3689 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[main]Bar1.jpgbin0 -> 2115 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[main]Button.jpgbin0 -> 1377 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[main]Button2.jpgbin0 -> 2506 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[main]Button3.jpgbin0 -> 3068 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[main]ButtonEditor.jpgbin0 -> 5112 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[main]Logo.jpgbin0 -> 19821 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[main]songCover.jpgbin0 -> 30254 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[main]square.jpgbin0 -> 1574 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[mainbutton]Exit.jpgbin0 -> 3065 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[mainbutton]Multi.jpgbin0 -> 2965 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[mainbutton]Options.jpgbin0 -> 2875 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[mainbutton]Solo.jpgbin0 -> 3070 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[mainbutton]Stats.jpgbin0 -> 3246 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[menu]PopUpBg.JPGbin0 -> 4013 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[menu]PopUpFg.JPGbin0 -> 4151 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[menu]jumpToBg.jpgbin0 -> 885 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[menu]songMenuBg.jpgbin0 -> 1327 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[menu]songMenuBorder.jpgbin0 -> 2076 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[menu]songMenuButtonBG.jpgbin0 -> 720 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[menu]songMenuSelectBG.jpgbin0 -> 889 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[party]Joker.jpgbin0 -> 2334 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[party]playerButton.jpgbin0 -> 1519 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[party]playerTeamButton.jpgbin0 -> 2428 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[party]pointer.bmpbin0 -> 6198 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[party]roundBG1.jpgbin0 -> 1043 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[party]roundBG2.jpgbin0 -> 978 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[party]roundBG3.jpgbin0 -> 1251 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[party]roundBG4.jpgbin0 -> 1229 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[party]roundTeamButton.jpgbin0 -> 2887 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[party]scoreBG1.jpgbin0 -> 1226 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[party]scoreBG2.jpgbin0 -> 653 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[party]scoreDecoration.jpgbin0 -> 6179 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[party]teamPoints.jpgbin0 -> 729 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[party]winDecoration.jpgbin0 -> 3878 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[party]winTeamButton1.jpgbin0 -> 1925 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[party]winTeamButton2.jpgbin0 -> 1783 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[party]winTeamButton3.jpgbin0 -> 1458 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[score]box.jpgbin0 -> 690 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[score]level.jpgbin0 -> 1245 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[score]levelround.jpgbin0 -> 616 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[score]line.jpgbin0 -> 730 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[sing]LyricsBall.bmpbin0 -> 536 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[sing]lineBonusPopUp.jpgbin0 -> 2356 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[sing]lyricsHelpBar.bmpbin0 -> 3126 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[sing]notesBgLeft.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[sing]notesBgMid.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[sing]notesBgRight.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[sing]notesLeft.bmpbin0 -> 822 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[sing]notesMid.bmpbin0 -> 3126 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[sing]notesRight.bmpbin0 -> 822 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[sing]p.jpgbin0 -> 1487 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[sing]scoreBg.jpgbin0 -> 2005 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[sing]singBarBack.jpgbin0 -> 388 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[sing]singBarBar.jpgbin0 -> 371 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[sing]singBarFront.jpgbin0 -> 549 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[sing]textBar.jpgbin0 -> 1558 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[song]BGFade.jpgbin0 -> 2537 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[song]EqualizerBG.jpgbin0 -> 1169 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[song]selection.jpgbin0 -> 3418 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[stat]detailBG1.jpgbin0 -> 653 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[stat]mainBG1.jpgbin0 -> 652 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[stat]mainBG2.jpgbin0 -> 2942 bytes
-rw-r--r--Game/Output/Skins/TODOs/Classic/[stat]mainBG3.jpgbin0 -> 747 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/Orange.ini162
-rw-r--r--Game/Output/Skins/TODOs/Orange/Thumbs.dbbin0 -> 6656 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[bg-load].jpgbin0 -> 263559 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[button]13.jpgbin0 -> 13724 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[button]alt.jpgbin0 -> 13650 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[button]az.jpgbin0 -> 13641 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[button]enter.jpgbin0 -> 10565 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[button]esc.jpgbin0 -> 13869 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[button]j.jpgbin0 -> 13123 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[button]m.jpgbin0 -> 13547 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[button]navi.jpgbin0 -> 15755 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[button]p.jpgbin0 -> 13323 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[effect]goldenNoteStar.jpgbin0 -> 24894 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[effect]perfectNoteStar.jpgbin0 -> 27633 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[helper]buttonFade.jpgbin0 -> 825 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[helper]rectangle.jpgbin0 -> 604 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[icon]cd.jpgbin0 -> 1175 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[icon]error.jpgbin0 -> 620 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[icon]main.jpgbin0 -> 1153 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[icon]options.jpgbin0 -> 1063 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[icon]party.jpgbin0 -> 1528 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[icon]question.jpgbin0 -> 663 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[icon]score.jpgbin0 -> 1150 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[icon]search.jpgbin0 -> 759 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[icon]songmenu.jpgbin0 -> 1659 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[icon]stats.jpgbin0 -> 1741 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[icon]video.jpgbin0 -> 2608 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[main]button-m-1.jpgbin0 -> 13594 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[main]button-m-2.jpgbin0 -> 13539 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[main]button-m-3.jpgbin0 -> 13900 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[main]button-m-4.jpgbin0 -> 13874 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[main]button.jpgbin0 -> 1519 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[main]button2.jpgbin0 -> 10896 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[main]button3.jpgbin0 -> 9880 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[main]buttonf.jpgbin0 -> 17717 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[main]mainBar.jpgbin0 -> 13339 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[main]playerNumberBox.jpgbin0 -> 1071 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[main]selectbg.jpgbin0 -> 16605 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[main]songCover.jpgbin0 -> 30254 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[main]songSelection1.jpgbin0 -> 2219 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[main]songSelection2.jpgbin0 -> 1031 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[menu]PopUpBg.JPGbin0 -> 2676 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[menu]PopUpFg.JPGbin0 -> 5993 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[menu]jumpToBg.jpgbin0 -> 1870 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[menu]songMenuBg.jpgbin0 -> 5287 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[menu]songMenuSelectBg.jpgbin0 -> 1674 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[party]Joker.jpgbin0 -> 7169 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[party]playerButton.jpgbin0 -> 1519 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[party]playerTeamButton.jpgbin0 -> 2428 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[party]pointer.bmpbin0 -> 6198 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[party]roundBG1.jpgbin0 -> 1043 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[party]roundBG2.jpgbin0 -> 978 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[party]roundBG3.jpgbin0 -> 1251 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[party]roundBG4.jpgbin0 -> 1229 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[party]roundTeamButton.jpgbin0 -> 2887 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[party]scoreBG1.jpgbin0 -> 1226 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[party]scoreBG2.jpgbin0 -> 653 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[party]scoreDecoration.jpgbin0 -> 6179 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[party]teamPoints.jpgbin0 -> 729 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[party]winDecoration1.jpgbin0 -> 4331 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[party]winTeamButton1.jpgbin0 -> 1925 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[party]winTeamButton2.jpgbin0 -> 1783 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[party]winTeamButton3.jpgbin0 -> 1458 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[score]Line.jpgbin0 -> 559 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[score]box.jpgbin0 -> 690 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[score]endcap.jpgbin0 -> 984 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[score]level.jpgbin0 -> 1264 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[score]levelRound.jpgbin0 -> 614 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[sing]LyricsBall.bmpbin0 -> 536 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[sing]lineBonusPopUp.jpgbin0 -> 2356 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[sing]lyricsHelpBar.bmpbin0 -> 3128 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[sing]notesBgLeft.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[sing]notesBgMid.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[sing]notesBgRight.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[sing]notesLeft.bmpbin0 -> 824 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[sing]notesMid.bmpbin0 -> 3128 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[sing]notesRight.bmpbin0 -> 824 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[sing]p.jpgbin0 -> 2630 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[sing]scoreBg.jpgbin0 -> 13662 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[sing]singBarBack.jpgbin0 -> 388 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[sing]singBarBar.jpgbin0 -> 371 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[sing]singBarFront.jpgbin0 -> 549 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[sing]textBar.jpgbin0 -> 18326 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[sing]timeBar.jpgbin0 -> 10716 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[sing]timeBarBG.jpgbin0 -> 13122 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[special]bar1.jpgbin0 -> 9726 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[special]bar2.jpgbin0 -> 9177 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[stat]detailBG1.jpgbin0 -> 653 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[stat]mainBG1.jpgbin0 -> 652 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[stat]mainBG2.jpgbin0 -> 2942 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/[stat]mainBG3.jpgbin0 -> 596 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/bg-main.jpgbin0 -> 254174 bytes
-rw-r--r--Game/Output/Skins/TODOs/Orange/bg-song.jpgbin0 -> 51259 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/Streetlight lite.ini156
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/Streetlight.ini156
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/Thumbs.dbbin0 -> 47616 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[bg-load].jpgbin0 -> 571091 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[button]13.jpgbin0 -> 13724 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[button]alt.jpgbin0 -> 13650 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[button]az.jpgbin0 -> 13641 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[button]enter.jpgbin0 -> 10565 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[button]esc.jpgbin0 -> 13869 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[button]j.jpgbin0 -> 13123 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[button]m.jpgbin0 -> 13547 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[button]navi.jpgbin0 -> 15755 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[button]p.jpgbin0 -> 13323 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[effect]goldenNoteStar.jpgbin0 -> 24894 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[effect]perfectNoteStar.jpgbin0 -> 27633 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[helper]buttonFade.jpgbin0 -> 825 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[helper]rectangle.jpgbin0 -> 604 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[icon]cd.jpgbin0 -> 1175 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[icon]error.jpgbin0 -> 620 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[icon]main.jpgbin0 -> 1153 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[icon]options.jpgbin0 -> 1063 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[icon]party.jpgbin0 -> 1528 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[icon]question.jpgbin0 -> 663 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[icon]score.jpgbin0 -> 1150 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[icon]search.jpgbin0 -> 759 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[icon]songmenu.jpgbin0 -> 1659 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[icon]stats.jpgbin0 -> 1741 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[icon]video.jpgbin0 -> 2608 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[main]button.jpgbin0 -> 1519 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[main]button2.jpgbin0 -> 13459 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[main]buttonf.jpgbin0 -> 17717 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[main]mainBar.jpgbin0 -> 13339 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[main]playerNumberBox.jpgbin0 -> 1071 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[main]selectbg.jpgbin0 -> 16605 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[main]songCover.jpgbin0 -> 30254 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[main]songSelection1.jpgbin0 -> 2219 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[main]songSelection2.jpgbin0 -> 8840 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[menu]PopUpBg.JPGbin0 -> 2676 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[menu]PopUpFg.JPGbin0 -> 5993 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[menu]jumpToBg.jpgbin0 -> 1870 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[menu]songMenuBg.jpgbin0 -> 5287 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[menu]songMenuSelectBg.jpgbin0 -> 1674 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[party]Joker.jpgbin0 -> 7169 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[party]playerButton.jpgbin0 -> 1519 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[party]playerTeamButton.jpgbin0 -> 2428 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[party]pointer.bmpbin0 -> 6198 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[party]roundBG1.jpgbin0 -> 1043 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[party]roundBG2.jpgbin0 -> 978 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[party]roundBG3.jpgbin0 -> 1251 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[party]roundBG4.jpgbin0 -> 1229 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[party]roundTeamButton.jpgbin0 -> 2887 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[party]scoreBG1.jpgbin0 -> 1226 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[party]scoreBG2.jpgbin0 -> 653 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[party]scoreDecoration.jpgbin0 -> 6179 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[party]teamPoints.jpgbin0 -> 729 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[party]winDecoration1.jpgbin0 -> 4331 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[party]winTeamButton1.jpgbin0 -> 1925 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[party]winTeamButton2.jpgbin0 -> 1783 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[party]winTeamButton3.jpgbin0 -> 1458 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[score]Line.jpgbin0 -> 559 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[score]box.jpgbin0 -> 690 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[score]endcap.jpgbin0 -> 984 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[score]level.jpgbin0 -> 1264 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[score]levelRound.jpgbin0 -> 614 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[sing]LyricsBall.bmpbin0 -> 536 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[sing]lineBonusPopUp.jpgbin0 -> 2356 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[sing]lyricsHelpBar.bmpbin0 -> 3128 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[sing]notesBgLeft.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[sing]notesBgMid.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[sing]notesBgRight.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[sing]notesLeft.bmpbin0 -> 824 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[sing]notesMid.bmpbin0 -> 3128 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[sing]notesRight.bmpbin0 -> 824 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[sing]p.jpgbin0 -> 2630 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[sing]scoreBg.jpgbin0 -> 13662 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[sing]singBarBack.jpgbin0 -> 388 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[sing]singBarBar.jpgbin0 -> 371 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[sing]singBarFront.jpgbin0 -> 549 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[sing]textBar.jpgbin0 -> 18326 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[sing]timeBar.jpgbin0 -> 10716 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[sing]timeBarBG.jpgbin0 -> 13122 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[special]bar1.jpgbin0 -> 8623 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[special]bar2.jpgbin0 -> 8803 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[stat]detailBG1.jpgbin0 -> 653 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[stat]mainBG1.jpgbin0 -> 652 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[stat]mainBG2.jpgbin0 -> 2942 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/[stat]mainBG3.jpgbin0 -> 596 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/bg-main.jpgbin0 -> 570461 bytes
-rw-r--r--Game/Output/Skins/TODOs/Streetlight/bg-song.jpgbin0 -> 111237 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/Thumbs.dbbin0 -> 15872 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/Vistar.ini150
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[button]13.jpgbin0 -> 13724 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[button]alt.jpgbin0 -> 13650 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[button]az.jpgbin0 -> 13641 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[button]enter.jpgbin0 -> 10565 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[button]esc.jpgbin0 -> 13869 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[button]j.jpgbin0 -> 13123 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[button]m.jpgbin0 -> 13547 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[button]navi.jpgbin0 -> 15755 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[button]p.jpgbin0 -> 13323 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[effect]goldenNoteStar.jpgbin0 -> 24894 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[effect]perfectNoteStar.jpgbin0 -> 27633 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[helper]rectangle.jpgbin0 -> 604 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[icon]cd.jpgbin0 -> 1175 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[icon]error.jpgbin0 -> 620 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[icon]main.jpgbin0 -> 1153 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[icon]options.jpgbin0 -> 1063 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[icon]party.jpgbin0 -> 1528 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[icon]question.jpgbin0 -> 663 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[icon]score.jpgbin0 -> 1150 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[icon]search.jpgbin0 -> 759 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[icon]songmenu.jpgbin0 -> 1659 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[icon]stats.jpgbin0 -> 1741 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[icon]video.jpgbin0 -> 2608 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[main]button.jpgbin0 -> 12579 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[main]buttonf.jpgbin0 -> 17717 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[main]mainBar.jpgbin0 -> 11261 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[main]playerNumberBox.jpgbin0 -> 1071 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[main]selectbg.jpgbin0 -> 11647 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[main]songCover.jpgbin0 -> 30254 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[main]songSelection2.jpgbin0 -> 1031 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[mainbutton]Exit.jpgbin0 -> 3065 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[mainbutton]Multi.jpgbin0 -> 2965 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[mainbutton]Options.jpgbin0 -> 2875 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[mainbutton]Solo.jpgbin0 -> 3070 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[mainbutton]Stats.jpgbin0 -> 3246 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[menu]PopUpBg.JPGbin0 -> 2676 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[menu]PopUpFg.JPGbin0 -> 5993 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[menu]jumpToBg.jpgbin0 -> 1870 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[menu]songMenuBg.jpgbin0 -> 5287 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[menu]songMenuSelectBg.jpgbin0 -> 1674 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[party]Joker.jpgbin0 -> 7169 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[party]playerButton.jpgbin0 -> 1519 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[party]playerTeamButton.jpgbin0 -> 2428 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[party]pointer.bmpbin0 -> 6198 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[party]roundBG1.jpgbin0 -> 1043 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[party]roundBG2.jpgbin0 -> 978 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[party]roundBG3.jpgbin0 -> 1251 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[party]roundBG4.jpgbin0 -> 1229 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[party]roundTeamButton.jpgbin0 -> 2887 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[party]scoreBG1.jpgbin0 -> 1226 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[party]scoreBG2.jpgbin0 -> 653 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[party]scoreDecoration.jpgbin0 -> 6179 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[party]teamPoints.jpgbin0 -> 729 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[party]winDecoration1.jpgbin0 -> 4331 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[party]winTeamButton1.jpgbin0 -> 1925 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[party]winTeamButton2.jpgbin0 -> 1783 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[party]winTeamButton3.jpgbin0 -> 1458 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[score]Line.jpgbin0 -> 559 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[score]box.jpgbin0 -> 690 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[score]endcap.jpgbin0 -> 984 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[score]level.jpgbin0 -> 1264 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[score]levelRound.jpgbin0 -> 614 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[sing]LyricsBall.bmpbin0 -> 536 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[sing]lineBonusPopUp.jpgbin0 -> 2356 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[sing]lyricsHelpBar.bmpbin0 -> 3128 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[sing]notesBgLeft.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[sing]notesBgMid.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[sing]notesBgRight.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[sing]notesLeft.bmpbin0 -> 824 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[sing]notesMid.bmpbin0 -> 3128 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[sing]notesRight.bmpbin0 -> 824 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[sing]p.jpgbin0 -> 2630 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[sing]scoreBg.jpgbin0 -> 13662 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[sing]singBarBack.jpgbin0 -> 388 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[sing]singBarBar.jpgbin0 -> 371 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[sing]singBarFront.jpgbin0 -> 549 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[sing]textBar.jpgbin0 -> 18326 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[sing]timeBar.jpgbin0 -> 10716 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[sing]timeBar1.jpgbin0 -> 483 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[sing]timeBarBG.jpgbin0 -> 13122 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[stat]detailBG1.jpgbin0 -> 653 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[stat]mainBG1.jpgbin0 -> 652 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[stat]mainBG2.jpgbin0 -> 2942 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/[stat]mainBG3.jpgbin0 -> 596 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/bg-lite.jpgbin0 -> 374718 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/bg-load.jpgbin0 -> 167719 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/bg-main.jpgbin0 -> 341234 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/bg-score.jpgbin0 -> 85402 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/bg-song.jpgbin0 -> 324890 bytes
-rw-r--r--Game/Output/Skins/TODOs/Vistar/main-buttons.jpgbin0 -> 21723 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/Thumbs.dbbin0 -> 74752 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[bg-load]sensation.jpgbin0 -> 209546 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[bg-load]simple.jpgbin0 -> 18852 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[bg-main]sensation.jpgbin0 -> 171475 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[bg-main]simple.jpgbin0 -> 19469 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[bg-menu]sensation.jpgbin0 -> 219910 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[bg-menu]simple.jpgbin0 -> 34723 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[button]13.jpgbin0 -> 893 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[button]alt.jpgbin0 -> 892 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[button]az.jpgbin0 -> 900 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[button]e.jpgbin0 -> 883 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[button]enter.jpgbin0 -> 911 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[button]esc.jpgbin0 -> 892 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[button]j.jpgbin0 -> 880 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[button]m.jpgbin0 -> 889 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[button]navi.jpgbin0 -> 938 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[button]p.jpgbin0 -> 884 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[effect]goldenNoteStar.jpgbin0 -> 24894 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[effect]perfectNoteStar.jpgbin0 -> 27633 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[helper]buttonFade.jpgbin0 -> 825 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[helper]rectangle.jpgbin0 -> 604 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[icon]cd.jpgbin0 -> 3054 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[icon]error.jpgbin0 -> 620 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[icon]main.jpgbin0 -> 1169 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[icon]options.jpgbin0 -> 2529 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[icon]party.jpgbin0 -> 2475 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[icon]question.jpgbin0 -> 663 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[icon]score.jpgbin0 -> 1575 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[icon]search.jpgbin0 -> 894 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[icon]songmenu.jpgbin0 -> 1061 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[icon]stats.jpgbin0 -> 2745 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[icon]video.jpgbin0 -> 1464 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[main]Button.jpgbin0 -> 1614 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[main]buttonf.jpgbin0 -> 17717 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[main]mainBar.jpgbin0 -> 3757 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[main]playerNumberBox.jpgbin0 -> 1071 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[main]selectbg.jpgbin0 -> 6612 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[main]songCover.jpgbin0 -> 30254 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[main]songSelection1.jpgbin0 -> 2710 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[main]songSelection2.jpgbin0 -> 1031 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[menu]PopUpBg.JPGbin0 -> 2676 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[menu]PopUpFg.JPGbin0 -> 5993 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[menu]jumpToBg.jpgbin0 -> 1870 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[menu]songMenuBg.jpgbin0 -> 5287 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[menu]songMenuSelectBg.jpgbin0 -> 1674 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[party]Joker.jpgbin0 -> 2272 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[party]playerButton.jpgbin0 -> 1519 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[party]playerTeamButton.jpgbin0 -> 2428 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[party]pointer.bmpbin0 -> 6198 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[party]roundBG1.jpgbin0 -> 1043 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[party]roundBG2.jpgbin0 -> 978 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[party]roundBG3.jpgbin0 -> 1251 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[party]roundBG4.jpgbin0 -> 1229 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[party]roundTeamButton.jpgbin0 -> 2887 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[party]scoreBG1.jpgbin0 -> 1226 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[party]scoreBG2.jpgbin0 -> 653 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[party]scoreDecoration.jpgbin0 -> 6179 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[party]teamPoints.jpgbin0 -> 729 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[party]winDecoration1.jpgbin0 -> 4331 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[party]winTeamButton1.jpgbin0 -> 1925 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[party]winTeamButton2.jpgbin0 -> 1783 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[party]winTeamButton3.jpgbin0 -> 1458 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[score]Line.jpgbin0 -> 559 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[score]box.jpgbin0 -> 690 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[score]endcap.jpgbin0 -> 984 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[score]level.jpgbin0 -> 1264 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[score]levelRound.jpgbin0 -> 614 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[sing]LyricsBall.bmpbin0 -> 774 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[sing]lineBonusPopUp.jpgbin0 -> 2356 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[sing]lyricsHelpBar.bmpbin0 -> 3126 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[sing]notesBgLeft.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[sing]notesBgMid.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[sing]notesBgRight.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[sing]notesLeft.bmpbin0 -> 822 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[sing]notesMid.bmpbin0 -> 3126 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[sing]notesRight.bmpbin0 -> 822 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[sing]p.jpgbin0 -> 1879 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[sing]scoreBg.jpgbin0 -> 1075 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[sing]singBarBack.jpgbin0 -> 672 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[sing]singBarBar.jpgbin0 -> 672 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[sing]singBarFront.jpgbin0 -> 1166 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[sing]textBar.jpgbin0 -> 3366 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[sing]timeBar.jpgbin0 -> 865 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[sing]timeBar1.jpgbin0 -> 865 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[sing]timeBarBG.jpgbin0 -> 1468 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[special]bar1.jpgbin0 -> 755 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[special]bar2.jpgbin0 -> 905 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[stat]detailBG1.jpgbin0 -> 653 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[stat]mainBG1.jpgbin0 -> 652 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[stat]mainBG2.jpgbin0 -> 2942 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/[stat]mainBG3.jpgbin0 -> 596 bytes
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/sensation.ini155
-rw-r--r--Game/Output/Skins/TODOs/White Sensation/simple.ini155
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/Thumbs.dbbin0 -> 9728 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/White.ini157
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[bg-load]white.jpgbin0 -> 28907 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[bg-main]white.JPGbin0 -> 39825 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[bg-options]white.jpgbin0 -> 75052 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[bg-partyl]white.JPGbin0 -> 33827 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[bg-partyscore2l]white.JPGbin0 -> 28215 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[bg-partyscorel]white.JPGbin0 -> 28254 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[bg-song]white.JPGbin0 -> 24434 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[bg-stats]white.JPGbin0 -> 31157 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[bg-statsdetail]white.JPGbin0 -> 31746 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[bg-suboptions]white.JPGbin0 -> 18623 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[bg-subparty]white.JPGbin0 -> 21488 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[button]13.jpgbin0 -> 3381 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[button]alt.jpgbin0 -> 3612 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[button]az.jpgbin0 -> 3629 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[button]enter.jpgbin0 -> 795 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[button]esc.jpgbin0 -> 877 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[button]j.jpgbin0 -> 2949 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[button]m.jpgbin0 -> 3395 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[button]navi.jpgbin0 -> 742 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[button]p.jpgbin0 -> 3015 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[effect]goldenNoteStar.jpgbin0 -> 24894 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[effect]perfectNoteStar.jpgbin0 -> 27633 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[helper]buttonFade.jpgbin0 -> 825 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[helper]rectangle - Kopie.jpgbin0 -> 604 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[helper]rectangle.jpgbin0 -> 2170 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[icon]cd.jpgbin0 -> 1175 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[icon]error.jpgbin0 -> 620 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[icon]main.jpgbin0 -> 1418 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[icon]options.jpgbin0 -> 7280 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[icon]party.jpgbin0 -> 2493 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[icon]question.jpgbin0 -> 663 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[icon]score.jpgbin0 -> 1503 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[icon]search.jpgbin0 -> 759 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[icon]songmenu.jpgbin0 -> 9330 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[icon]stats.jpgbin0 -> 8587 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[icon]video.jpgbin0 -> 2608 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[main]button.jpgbin0 -> 1519 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[main]buttonf.jpgbin0 -> 17717 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[main]mainBar.jpgbin0 -> 2957 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[main]playerNumberBox.jpgbin0 -> 1058 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[main]selectbg.jpgbin0 -> 4100 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[main]songCover.jpgbin0 -> 30254 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[main]songSelection1.jpgbin0 -> 1677 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[main]songSelection2.jpgbin0 -> 1031 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[menu]PopUpBg.JPGbin0 -> 2676 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[menu]PopUpFg.JPGbin0 -> 5993 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[menu]jumpToBg.jpgbin0 -> 1870 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[menu]songMenuBg.jpgbin0 -> 5287 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[menu]songMenuSelectBg.jpgbin0 -> 1674 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[party]Joker.jpgbin0 -> 2057 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[party]playerButton.jpgbin0 -> 1519 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[party]playerTeamButton.jpgbin0 -> 2428 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[party]pointer.bmpbin0 -> 6198 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[party]roundBG1.jpgbin0 -> 1043 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[party]roundBG2.jpgbin0 -> 978 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[party]roundBG3.jpgbin0 -> 1251 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[party]roundBG4.jpgbin0 -> 1229 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[party]roundTeamButton.jpgbin0 -> 2887 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[party]scoreBG1.jpgbin0 -> 1818 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[party]scoreBG2.jpgbin0 -> 653 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[party]scoreDecoration.jpgbin0 -> 6179 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[party]teamPoints.jpgbin0 -> 729 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[party]winDecoration1.jpgbin0 -> 4331 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[party]winTeamButton1.jpgbin0 -> 1925 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[party]winTeamButton2.jpgbin0 -> 1783 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[party]winTeamButton3.jpgbin0 -> 1458 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[score]Line.jpgbin0 -> 559 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[score]box.jpgbin0 -> 690 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[score]endcap.jpgbin0 -> 984 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[score]level.jpgbin0 -> 1264 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[score]levelRound.jpgbin0 -> 614 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[sing]LyricsBall.bmpbin0 -> 536 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[sing]lineBonusPopUp.jpgbin0 -> 2356 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[sing]lyricsHelpBar.bmpbin0 -> 3126 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[sing]notesBgLeft.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[sing]notesBgMid.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[sing]notesBgRight.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[sing]notesLeft.bmpbin0 -> 822 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[sing]notesMid.bmpbin0 -> 3126 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[sing]notesRight.bmpbin0 -> 822 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[sing]p.jpgbin0 -> 1030 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[sing]scoreBg.jpgbin0 -> 2005 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[sing]singBarBack.jpgbin0 -> 388 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[sing]singBarBar.jpgbin0 -> 371 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[sing]singBarFront.jpgbin0 -> 549 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[sing]textBar.jpgbin0 -> 1558 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[sing]timeBar.jpgbin0 -> 504 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[sing]timeBar1.jpgbin0 -> 483 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[sing]timeBarBG.jpgbin0 -> 540 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[special]bar.jpgbin0 -> 1327 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[stat]detailBG1.jpgbin0 -> 653 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[stat]mainBG1.jpgbin0 -> 652 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[stat]mainBG2.jpgbin0 -> 2942 bytes
-rw-r--r--Game/Output/Skins/TODOs/WiiStar/[stat]mainBG3.jpgbin0 -> 596 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/Apple.ini163
-rw-r--r--Game/Output/Skins/TODOs/iStar/Thumbs.dbbin0 -> 234496 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[bg-load]blue.jpgbin0 -> 83400 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[bg-main]blue.jpgbin0 -> 77252 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[bg-menu]blue.jpgbin0 -> 87336 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[button]13.jpgbin0 -> 23549 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[button]alt.jpgbin0 -> 23442 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[button]az.jpgbin0 -> 23566 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[button]enter.jpgbin0 -> 23938 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[button]esc.jpgbin0 -> 23826 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[button]j.jpgbin0 -> 22958 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[button]m.jpgbin0 -> 22709 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[button]navi.jpgbin0 -> 23945 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[button]p.jpgbin0 -> 22676 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[effect]goldenNoteStar.jpgbin0 -> 24894 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[effect]perfectNoteStar.jpgbin0 -> 27633 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[helper]buttonFade.jpgbin0 -> 21948 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[helper]buttonFade2.jpgbin0 -> 22026 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[helper]rectangle.jpgbin0 -> 604 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[icon]cd.jpgbin0 -> 1175 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[icon]error.jpgbin0 -> 620 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[icon]main.jpgbin0 -> 1153 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[icon]options.jpgbin0 -> 1063 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[icon]party.jpgbin0 -> 1528 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[icon]question.jpgbin0 -> 663 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[icon]score.jpgbin0 -> 1150 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[icon]search.jpgbin0 -> 759 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[icon]songmenu.jpgbin0 -> 1659 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[icon]stats.jpgbin0 -> 1741 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[icon]video.jpgbin0 -> 23562 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[main]button.jpgbin0 -> 27909 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[main]buttonf.jpgbin0 -> 17717 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[main]buttonmenu1.jpgbin0 -> 38922 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[main]buttonmenu2.jpgbin0 -> 41655 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[main]buttonmenu3.jpgbin0 -> 39980 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[main]buttonmenu4.jpgbin0 -> 41356 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[main]buttonmenu5.jpgbin0 -> 40170 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[main]mainBar.jpgbin0 -> 2957 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[main]playerNumberBox.jpgbin0 -> 1071 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[main]selectbg.jpgbin0 -> 4100 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[main]songCover.jpgbin0 -> 30254 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[main]songSelection1.jpgbin0 -> 32889 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[main]songSelection2.jpgbin0 -> 25146 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[menu]PopUpBg.JPGbin0 -> 2676 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[menu]PopUpFg.JPGbin0 -> 5993 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[menu]jumpToBg.jpgbin0 -> 1870 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[menu]songMenuBg.jpgbin0 -> 5287 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[menu]songMenuSelectBg.jpgbin0 -> 1674 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[party]Joker.jpgbin0 -> 33618 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[party]playerButton.jpgbin0 -> 1519 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[party]playerTeamButton.jpgbin0 -> 2428 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[party]pointer.bmpbin0 -> 6198 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[party]roundBG1.jpgbin0 -> 1043 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[party]roundBG2.jpgbin0 -> 978 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[party]roundBG3.jpgbin0 -> 1251 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[party]roundBG4.jpgbin0 -> 1229 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[party]roundTeamButton.jpgbin0 -> 2887 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[party]scoreBG1.jpgbin0 -> 1226 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[party]scoreBG2.jpgbin0 -> 653 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[party]scoreDecoration.jpgbin0 -> 6179 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[party]teamPoints.jpgbin0 -> 729 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[party]winDecoration1.jpgbin0 -> 4331 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[party]winTeamButton1.jpgbin0 -> 1925 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[party]winTeamButton2.jpgbin0 -> 1783 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[party]winTeamButton3.jpgbin0 -> 1458 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[score]Line.jpgbin0 -> 559 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[score]box.jpgbin0 -> 690 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[score]endcap.jpgbin0 -> 984 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[score]level.jpgbin0 -> 1264 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[score]levelRound.jpgbin0 -> 614 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[sing]LyricsBall.bmpbin0 -> 536 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[sing]lineBonusPopUp.jpgbin0 -> 2356 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[sing]lyricsHelpBar.bmpbin0 -> 3126 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[sing]notesBgLeft.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[sing]notesBgMid.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[sing]notesBgRight.bmpbin0 -> 1590 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[sing]notesLeft.bmpbin0 -> 822 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[sing]notesMid.bmpbin0 -> 3126 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[sing]notesRight.bmpbin0 -> 822 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[sing]p.jpgbin0 -> 2630 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[sing]scoreBg.jpgbin0 -> 13662 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[sing]singBarBack.jpgbin0 -> 388 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[sing]singBarBar.jpgbin0 -> 371 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[sing]singBarFront.jpgbin0 -> 549 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[sing]textBar.jpgbin0 -> 26285 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[sing]timeBar.jpgbin0 -> 10716 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[sing]timeBar1.jpgbin0 -> 483 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[sing]timeBarBG.jpgbin0 -> 13122 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[special]bar1.jpgbin0 -> 24304 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[special]bar2.jpgbin0 -> 23352 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[stat]detailBG1.jpgbin0 -> 653 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[stat]mainBG1.jpgbin0 -> 652 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[stat]mainBG2.jpgbin0 -> 2942 bytes
-rw-r--r--Game/Output/Skins/TODOs/iStar/[stat]mainBG3.jpgbin0 -> 596 bytes
-rw-r--r--Game/Output/Sounds/Applause.mp3bin0 -> 58224 bytes
-rw-r--r--Game/Output/Sounds/Common back.mp3bin0 -> 23431 bytes
-rw-r--r--Game/Output/Sounds/Common start.mp3bin0 -> 23431 bytes
-rw-r--r--Game/Output/Sounds/PLUGIN_HauDenLukas_Bell.mp3bin0 -> 8681 bytes
-rw-r--r--Game/Output/Sounds/credits-outro-tune.mp3bin0 -> 156212 bytes
-rw-r--r--Game/Output/Sounds/dismissed.mp3bin0 -> 5433 bytes
-rw-r--r--Game/Output/Sounds/menu swoosh.mp3bin0 -> 5246 bytes
-rw-r--r--Game/Output/Sounds/option change col.mp3bin0 -> 3734 bytes
-rw-r--r--Game/Output/Sounds/rimshot022b.mp3bin0 -> 2090 bytes
-rw-r--r--Game/Output/Sounds/select music change music 50.mp3bin0 -> 17580 bytes
-rw-r--r--Game/Output/Sounds/select music change music.mp3bin0 -> 8565 bytes
-rw-r--r--Game/Output/Sounds/wome-credits-tune.mp3bin0 -> 1682311 bytes
-rw-r--r--Game/Output/Themes/Deluxe.ini10278
-rw-r--r--Game/Output/Themes/TODOs/Blue Sensation.ini7955
-rw-r--r--Game/Output/Themes/TODOs/Classic.ini7424
-rw-r--r--Game/Output/Themes/TODOs/Orange.ini8088
-rw-r--r--Game/Output/Themes/TODOs/Streetlight.ini8009
-rw-r--r--Game/Output/Themes/TODOs/Vistar.ini7634
-rw-r--r--Game/Output/Themes/TODOs/White Sensation.ini7993
-rw-r--r--Game/Output/Themes/TODOs/WiiStar.ini7771
-rw-r--r--Game/Output/Themes/TODOs/iStar.ini7953
-rw-r--r--Game/Output/acinerella.dllbin0 -> 6393363 bytes
-rw-r--r--Game/Output/bass.dllbin0 -> 93240 bytes
-rw-r--r--Game/Output/documentation.pdfbin0 -> 575306 bytes
-rw-r--r--Game/Output/sqlite3.dllbin0 -> 388126 bytes
-rw-r--r--Game/ReadMe.txt112
-rw-r--r--Game/Sounds/dismissed.mp3bin0 -> 5433 bytes
-rw-r--r--Game/Sounds/wome_-_echoes.mp3bin0 -> 1063307 bytes
-rw-r--r--Installer/Readme.txt19
-rw-r--r--Installer/UltraStarDeluxe.nsi557
-rw-r--r--Installer/UltraStarDeluxeFull.nsi599
-rw-r--r--Installer/clanguage/English.nsh94
-rw-r--r--Installer/clanguage/German.nsh94
-rw-r--r--Installer/gdf/UltraStar Deluxe.gdf.xmlbin0 -> 3494 bytes
-rw-r--r--Installer/gdf/UltraStar Deluxe.rc33
-rw-r--r--Installer/gdf/boxart.pngbin0 -> 36578 bytes
-rw-r--r--Installer/gdf/gameux.h250
-rw-r--r--Installer/gdf/icon.icobin0 -> 22486 bytes
-rw-r--r--Installer/settings/GameExplorer.nsh198
-rw-r--r--Installer/settings/files_in.nsh269
-rw-r--r--Installer/settings/files_un.nsh349
-rw-r--r--Installer/settings/functions.nsh78
-rw-r--r--Installer/settings/io.ini19
-rw-r--r--Installer/settings/langstrings.nsh69
-rw-r--r--Installer/settings/optional/in_orange.nsh102
-rw-r--r--Installer/settings/optional/in_song1.nsh10
-rw-r--r--Installer/settings/optional/in_song2.nsh11
-rw-r--r--Installer/settings/optional/in_song3.nsh11
-rw-r--r--Installer/settings/optional/in_streetlight.nsh100
-rw-r--r--Installer/settings/optional/in_vistar.nsh102
-rw-r--r--Installer/settings/optional/opt_uninstall.nsh292
-rw-r--r--Installer/settings/settings-1031.ini131
-rw-r--r--Installer/settings/settings-1033.ini131
-rw-r--r--Installer/settings/variables.nsh70
-rw-r--r--Installer/u3portable/7za.exebin0 -> 476672 bytes
-rw-r--r--Installer/u3portable/Data/Ultrastar.dbbin0 -> 3072 bytes
-rw-r--r--Installer/u3portable/Data/config.ini0
-rw-r--r--Installer/u3portable/Host/U3.lnkbin0 -> 1165 bytes
-rw-r--r--Installer/u3portable/Host/appstop.exebin0 -> 24576 bytes
-rw-r--r--Installer/u3portable/Host/start.bat21
-rw-r--r--Installer/u3portable/License.txt549
-rw-r--r--Installer/u3portable/Manifest/USdx.icobin0 -> 2238 bytes
-rw-r--r--Installer/u3portable/Manifest/manifest.u3i17
-rw-r--r--Installer/u3portable/Readme.txt5
-rw-r--r--Installer/u3portable/copy.bat20
-rw-r--r--Installer/uninstall.icobin0 -> 22486 bytes
-rw-r--r--Installer/ustar.icobin0 -> 22486 bytes
-rw-r--r--InstallerDependencies/dll/SDL.dllbin0 -> 320512 bytes
-rw-r--r--InstallerDependencies/dll/avcodec-51.dllbin0 -> 3345408 bytes
-rw-r--r--InstallerDependencies/dll/avformat-50.dllbin0 -> 448512 bytes
-rw-r--r--InstallerDependencies/dll/avutil-49.dllbin0 -> 19968 bytes
-rw-r--r--InstallerDependencies/dll/bass.dllbin0 -> 93240 bytes
-rw-r--r--InstallerDependencies/dll/sqlite3.dllbin0 -> 388126 bytes
-rw-r--r--InstallerDependencies/documents/Changelog.german.txt237
-rw-r--r--InstallerDependencies/documents/Changelog.txt230
-rw-r--r--InstallerDependencies/documents/License.txt125
-rw-r--r--InstallerDependencies/documents/ReadMe.txt112
-rw-r--r--InstallerDependencies/documents/documentation.pdfbin0 -> 575306 bytes
-rw-r--r--InstallerDependencies/images/header.bmpbin0 -> 25820 bytes
-rw-r--r--InstallerDependencies/images/left.bmpbin0 -> 618008 bytes
-rw-r--r--InstallerDependencies/images/modern.bmpbin0 -> 1652 bytes
-rw-r--r--InstallerDependencies/plugins/NSISdl.dllbin0 -> 14848 bytes
-rw-r--r--InstallerDependencies/plugins/gdf.dllbin0 -> 126976 bytes
-rw-r--r--InstallerDependencies/plugins/nsProcess.dllbin0 -> 4096 bytes
-rw-r--r--InstallerDependencies/plugins/nsisunz.dllbin0 -> 40960 bytes
-rw-r--r--Languages/Catalan.ini299
-rw-r--r--Languages/Croatian.ini308
-rw-r--r--Languages/Danish.ini298
-rw-r--r--Languages/Dutch.ini299
-rw-r--r--Languages/English.ini302
-rw-r--r--Languages/Euskara.ini298
-rw-r--r--Languages/French.ini300
-rw-r--r--Languages/German.ini303
-rw-r--r--Languages/Italian.ini299
-rw-r--r--Languages/Norwegian.ini298
-rw-r--r--Languages/Polish.ini305
-rw-r--r--Languages/Portuguese.ini299
-rw-r--r--Languages/Serbian.ini299
-rw-r--r--Languages/Slovak.ini302
-rw-r--r--Languages/Spanish.ini298
-rw-r--r--Languages/Swedish.ini299
-rw-r--r--Languages/readme.txt288
-rw-r--r--License.txt125
-rw-r--r--Modis/5000Points/Until5000.dpr91
-rw-r--r--Modis/5000Points/Until5000.identcachebin0 -> 121 bytes
-rw-r--r--Modis/Blind/Blind.dpr102
-rw-r--r--Modis/Don't_Get_Worse/Hold_The_Line.dpr212
-rw-r--r--Modis/Duell/Duell.dpr99
-rw-r--r--Modis/SDK/ModiSDK.dcubin0 -> 4173 bytes
-rw-r--r--Modis/SDK/ModiSDK.pas160
-rw-r--r--Modis/SDK/StrUtils.pas70
-rw-r--r--Modis/Team_Duell/TeamDuell.dpr237
-rw-r--r--ScoreConverter/ScoreConverter.dpr17
-rw-r--r--ScoreConverter/ScoreConverter.icobin0 -> 766 bytes
-rw-r--r--ScoreConverter/ScoreConverter.resbin0 -> 876 bytes
-rw-r--r--ScoreConverter/UScores.pas102
-rw-r--r--ScoreConverter/USongs.pas160
-rw-r--r--ScoreConverter/Umainform.dfm123
-rw-r--r--ScoreConverter/Umainform.pas230
-rw-r--r--Skins/Classic/Star.ini153
-rw-r--r--Skins/Classic/Thumbs.dbbin0 -> 16896 bytes
-rw-r--r--Skins/Classic/[button]13.jpgbin0 -> 893 bytes
-rw-r--r--Skins/Classic/[button]alt.jpgbin0 -> 892 bytes
-rw-r--r--Skins/Classic/[button]az.jpgbin0 -> 900 bytes
-rw-r--r--Skins/Classic/[button]e.jpgbin0 -> 883 bytes
-rw-r--r--Skins/Classic/[button]enter.jpgbin0 -> 911 bytes
-rw-r--r--Skins/Classic/[button]esc.jpgbin0 -> 892 bytes
-rw-r--r--Skins/Classic/[button]j.jpgbin0 -> 880 bytes
-rw-r--r--Skins/Classic/[button]m.jpgbin0 -> 889 bytes
-rw-r--r--Skins/Classic/[button]navi.jpgbin0 -> 938 bytes
-rw-r--r--Skins/Classic/[button]p.jpgbin0 -> 884 bytes
-rw-r--r--Skins/Classic/[effect]goldenNoteStar.jpgbin0 -> 24894 bytes
-rw-r--r--Skins/Classic/[effect]perfectNoteStar.jpgbin0 -> 27633 bytes
-rw-r--r--Skins/Classic/[helper]rectangle.jpgbin0 -> 604 bytes
-rw-r--r--Skins/Classic/[icon]Star.jpgbin0 -> 942 bytes
-rw-r--r--Skins/Classic/[icon]error.jpgbin0 -> 1407 bytes
-rw-r--r--Skins/Classic/[icon]question.jpgbin0 -> 1695 bytes
-rw-r--r--Skins/Classic/[icon]stats.jpgbin0 -> 1010 bytes
-rw-r--r--Skins/Classic/[icon]video.jpgbin0 -> 2608 bytes
-rw-r--r--Skins/Classic/[main]Bar.jpgbin0 -> 3689 bytes
-rw-r--r--Skins/Classic/[main]Bar1.jpgbin0 -> 2115 bytes
-rw-r--r--Skins/Classic/[main]Button.jpgbin0 -> 1377 bytes
-rw-r--r--Skins/Classic/[main]Button2.jpgbin0 -> 2506 bytes
-rw-r--r--Skins/Classic/[main]Button3.jpgbin0 -> 3068 bytes
-rw-r--r--Skins/Classic/[main]ButtonEditor.jpgbin0 -> 5112 bytes
-rw-r--r--Skins/Classic/[main]Logo.jpgbin0 -> 19821 bytes
-rw-r--r--Skins/Classic/[main]songCover.jpgbin0 -> 30254 bytes
-rw-r--r--Skins/Classic/[main]square.jpgbin0 -> 1574 bytes
-rw-r--r--Skins/Classic/[mainbutton]Exit.jpgbin0 -> 3065 bytes
-rw-r--r--Skins/Classic/[mainbutton]Multi.jpgbin0 -> 2965 bytes
-rw-r--r--Skins/Classic/[mainbutton]Options.jpgbin0 -> 2875 bytes
-rw-r--r--Skins/Classic/[mainbutton]Solo.jpgbin0 -> 3070 bytes
-rw-r--r--Skins/Classic/[mainbutton]Stats.jpgbin0 -> 3246 bytes
-rw-r--r--Skins/Classic/[menu]PopUpBg.JPGbin0 -> 4013 bytes
-rw-r--r--Skins/Classic/[menu]PopUpFg.JPGbin0 -> 4151 bytes
-rw-r--r--Skins/Classic/[menu]jumpToBg.jpgbin0 -> 885 bytes
-rw-r--r--Skins/Classic/[menu]songMenuBg.jpgbin0 -> 1327 bytes
-rw-r--r--Skins/Classic/[menu]songMenuBorder.jpgbin0 -> 2076 bytes
-rw-r--r--Skins/Classic/[menu]songMenuButtonBG.jpgbin0 -> 720 bytes
-rw-r--r--Skins/Classic/[menu]songMenuSelectBG.jpgbin0 -> 889 bytes
-rw-r--r--Skins/Classic/[party]Joker.jpgbin0 -> 2334 bytes
-rw-r--r--Skins/Classic/[party]playerButton.jpgbin0 -> 1519 bytes
-rw-r--r--Skins/Classic/[party]playerTeamButton.jpgbin0 -> 2428 bytes
-rw-r--r--Skins/Classic/[party]pointer.bmpbin0 -> 6198 bytes
-rw-r--r--Skins/Classic/[party]roundBG1.jpgbin0 -> 1043 bytes
-rw-r--r--Skins/Classic/[party]roundBG2.jpgbin0 -> 978 bytes
-rw-r--r--Skins/Classic/[party]roundBG3.jpgbin0 -> 1251 bytes
-rw-r--r--Skins/Classic/[party]roundBG4.jpgbin0 -> 1229 bytes
-rw-r--r--Skins/Classic/[party]roundTeamButton.jpgbin0 -> 2887 bytes
-rw-r--r--Skins/Classic/[party]scoreBG1.jpgbin0 -> 1226 bytes
-rw-r--r--Skins/Classic/[party]scoreBG2.jpgbin0 -> 653 bytes
-rw-r--r--Skins/Classic/[party]scoreDecoration.jpgbin0 -> 6179 bytes
-rw-r--r--Skins/Classic/[party]teamPoints.jpgbin0 -> 729 bytes
-rw-r--r--Skins/Classic/[party]winDecoration.jpgbin0 -> 3878 bytes
-rw-r--r--Skins/Classic/[party]winTeamButton1.jpgbin0 -> 1925 bytes
-rw-r--r--Skins/Classic/[party]winTeamButton2.jpgbin0 -> 1783 bytes
-rw-r--r--Skins/Classic/[party]winTeamButton3.jpgbin0 -> 1458 bytes
-rw-r--r--Skins/Classic/[score]box.jpgbin0 -> 690 bytes
-rw-r--r--Skins/Classic/[score]level.jpgbin0 -> 1245 bytes
-rw-r--r--Skins/Classic/[score]levelround.jpgbin0 -> 616 bytes
-rw-r--r--Skins/Classic/[score]line.jpgbin0 -> 730 bytes
-rw-r--r--Skins/Classic/[sing]LyricsBall.bmpbin0 -> 536 bytes
-rw-r--r--Skins/Classic/[sing]lineBonusPopUp.jpgbin0 -> 2356 bytes
-rw-r--r--Skins/Classic/[sing]lyricsHelpBar.bmpbin0 -> 3126 bytes
-rw-r--r--Skins/Classic/[sing]notesBgLeft.bmpbin0 -> 1590 bytes
-rw-r--r--Skins/Classic/[sing]notesBgMid.bmpbin0 -> 1590 bytes
-rw-r--r--Skins/Classic/[sing]notesBgRight.bmpbin0 -> 1590 bytes
-rw-r--r--Skins/Classic/[sing]notesLeft.bmpbin0 -> 822 bytes
-rw-r--r--Skins/Classic/[sing]notesMid.bmpbin0 -> 3126 bytes
-rw-r--r--Skins/Classic/[sing]notesRight.bmpbin0 -> 822 bytes
-rw-r--r--Skins/Classic/[sing]p.jpgbin0 -> 1487 bytes
-rw-r--r--Skins/Classic/[sing]scoreBg.jpgbin0 -> 2005 bytes
-rw-r--r--Skins/Classic/[sing]singBarBack.jpgbin0 -> 388 bytes
-rw-r--r--Skins/Classic/[sing]singBarBar.jpgbin0 -> 371 bytes
-rw-r--r--Skins/Classic/[sing]singBarFront.jpgbin0 -> 549 bytes
-rw-r--r--Skins/Classic/[sing]textBar.jpgbin0 -> 1558 bytes
-rw-r--r--Skins/Classic/[song]BGFade.jpgbin0 -> 2537 bytes
-rw-r--r--Skins/Classic/[song]EqualizerBG.jpgbin0 -> 1169 bytes
-rw-r--r--Skins/Classic/[song]selection.jpgbin0 -> 3418 bytes
-rw-r--r--Skins/Classic/[stat]detailBG1.jpgbin0 -> 653 bytes
-rw-r--r--Skins/Classic/[stat]mainBG1.jpgbin0 -> 652 bytes
-rw-r--r--Skins/Classic/[stat]mainBG2.jpgbin0 -> 2942 bytes
-rw-r--r--Skins/Classic/[stat]mainBG3.jpgbin0 -> 747 bytes
-rw-r--r--Skins/Deluxe/Blue.ini154
-rw-r--r--Skins/Deluxe/Fall.ini155
-rw-r--r--Skins/Deluxe/Summer.ini154
-rw-r--r--Skins/Deluxe/Thumbs.dbbin0 -> 10752 bytes
-rw-r--r--Skins/Deluxe/Winter.ini153
-rw-r--r--Skins/Deluxe/[bg-load]blue.jpgbin0 -> 111299 bytes
-rw-r--r--Skins/Deluxe/[bg-load]fall.jpgbin0 -> 471938 bytes
-rw-r--r--Skins/Deluxe/[bg-load]summer.jpgbin0 -> 381304 bytes
-rw-r--r--Skins/Deluxe/[bg-load]winter.jpgbin0 -> 243663 bytes
-rw-r--r--Skins/Deluxe/[bg-main]blue.jpgbin0 -> 65305 bytes
-rw-r--r--Skins/Deluxe/[bg-main]fall.jpgbin0 -> 392979 bytes
-rw-r--r--Skins/Deluxe/[bg-main]summer.jpgbin0 -> 447517 bytes
-rw-r--r--Skins/Deluxe/[bg-main]winter.jpgbin0 -> 268024 bytes
-rw-r--r--Skins/Deluxe/[button]13.jpgbin0 -> 1453 bytes
-rw-r--r--Skins/Deluxe/[button]alt.jpgbin0 -> 1499 bytes
-rw-r--r--Skins/Deluxe/[button]az.jpgbin0 -> 1475 bytes
-rw-r--r--Skins/Deluxe/[button]enter.jpgbin0 -> 1600 bytes
-rw-r--r--Skins/Deluxe/[button]esc.jpgbin0 -> 1407 bytes
-rw-r--r--Skins/Deluxe/[button]j.jpgbin0 -> 854 bytes
-rw-r--r--Skins/Deluxe/[button]m.jpgbin0 -> 882 bytes
-rw-r--r--Skins/Deluxe/[button]navi.jpgbin0 -> 1330 bytes
-rw-r--r--Skins/Deluxe/[button]p.jpgbin0 -> 869 bytes
-rw-r--r--Skins/Deluxe/[effect]goldenNoteStar.jpgbin0 -> 24894 bytes
-rw-r--r--Skins/Deluxe/[effect]perfectNoteStar.jpgbin0 -> 27633 bytes
-rw-r--r--Skins/Deluxe/[helper]buttonFade.jpgbin0 -> 825 bytes
-rw-r--r--Skins/Deluxe/[helper]rectangle.jpgbin0 -> 604 bytes
-rw-r--r--Skins/Deluxe/[icon]cd.jpgbin0 -> 1175 bytes
-rw-r--r--Skins/Deluxe/[icon]error.jpgbin0 -> 620 bytes
-rw-r--r--Skins/Deluxe/[icon]main.jpgbin0 -> 1153 bytes
-rw-r--r--Skins/Deluxe/[icon]options.jpgbin0 -> 1063 bytes
-rw-r--r--Skins/Deluxe/[icon]party.jpgbin0 -> 1528 bytes
-rw-r--r--Skins/Deluxe/[icon]question.jpgbin0 -> 663 bytes
-rw-r--r--Skins/Deluxe/[icon]score.jpgbin0 -> 1150 bytes
-rw-r--r--Skins/Deluxe/[icon]search.jpgbin0 -> 759 bytes
-rw-r--r--Skins/Deluxe/[icon]songmenu.jpgbin0 -> 1659 bytes
-rw-r--r--Skins/Deluxe/[icon]stats.jpgbin0 -> 1741 bytes
-rw-r--r--Skins/Deluxe/[icon]video.jpgbin0 -> 2608 bytes
-rw-r--r--Skins/Deluxe/[main]button.jpgbin0 -> 1519 bytes
-rw-r--r--Skins/Deluxe/[main]buttonf.jpgbin0 -> 17717 bytes
-rw-r--r--Skins/Deluxe/[main]mainBar.jpgbin0 -> 2957 bytes
-rw-r--r--Skins/Deluxe/[main]playerNumberBox.jpgbin0 -> 1071 bytes
-rw-r--r--Skins/Deluxe/[main]selectbg.jpgbin0 -> 4100 bytes
-rw-r--r--Skins/Deluxe/[main]songCover.jpgbin0 -> 30254 bytes
-rw-r--r--Skins/Deluxe/[main]songSelection1.jpgbin0 -> 2710 bytes
-rw-r--r--Skins/Deluxe/[main]songSelection2.jpgbin0 -> 1031 bytes
-rw-r--r--Skins/Deluxe/[menu]PopUpBg.JPGbin0 -> 2676 bytes
-rw-r--r--Skins/Deluxe/[menu]PopUpFg.JPGbin0 -> 5993 bytes
-rw-r--r--Skins/Deluxe/[menu]jumpToBg.jpgbin0 -> 1870 bytes
-rw-r--r--Skins/Deluxe/[menu]songMenuBg.jpgbin0 -> 5287 bytes
-rw-r--r--Skins/Deluxe/[menu]songMenuSelectBg.jpgbin0 -> 1674 bytes
-rw-r--r--Skins/Deluxe/[party]Joker.jpgbin0 -> 7169 bytes
-rw-r--r--Skins/Deluxe/[party]playerButton.jpgbin0 -> 1519 bytes
-rw-r--r--Skins/Deluxe/[party]playerTeamButton.jpgbin0 -> 2428 bytes
-rw-r--r--Skins/Deluxe/[party]pointer.bmpbin0 -> 6198 bytes
-rw-r--r--Skins/Deluxe/[party]roundBG1.jpgbin0 -> 1043 bytes
-rw-r--r--Skins/Deluxe/[party]roundBG2.jpgbin0 -> 978 bytes
-rw-r--r--Skins/Deluxe/[party]roundBG3.jpgbin0 -> 1251 bytes
-rw-r--r--Skins/Deluxe/[party]roundBG4.jpgbin0 -> 1229 bytes
-rw-r--r--Skins/Deluxe/[party]roundTeamButton.jpgbin0 -> 2887 bytes
-rw-r--r--Skins/Deluxe/[party]scoreBG1.jpgbin0 -> 1226 bytes
-rw-r--r--Skins/Deluxe/[party]scoreBG2.jpgbin0 -> 653 bytes
-rw-r--r--Skins/Deluxe/[party]scoreDecoration.jpgbin0 -> 6179 bytes
-rw-r--r--Skins/Deluxe/[party]teamPoints.jpgbin0 -> 729 bytes
-rw-r--r--Skins/Deluxe/[party]winDecoration1.jpgbin0 -> 4331 bytes
-rw-r--r--Skins/Deluxe/[party]winTeamButton1.jpgbin0 -> 1925 bytes
-rw-r--r--Skins/Deluxe/[party]winTeamButton2.jpgbin0 -> 1783 bytes
-rw-r--r--Skins/Deluxe/[party]winTeamButton3.jpgbin0 -> 1458 bytes
-rw-r--r--Skins/Deluxe/[score]Line.jpgbin0 -> 559 bytes
-rw-r--r--Skins/Deluxe/[score]box.jpgbin0 -> 690 bytes
-rw-r--r--Skins/Deluxe/[score]endcap.jpgbin0 -> 984 bytes
-rw-r--r--Skins/Deluxe/[score]level.jpgbin0 -> 1264 bytes
-rw-r--r--Skins/Deluxe/[score]levelRound.jpgbin0 -> 614 bytes
-rw-r--r--Skins/Deluxe/[sing]LyricsBall.bmpbin0 -> 536 bytes
-rw-r--r--Skins/Deluxe/[sing]lineBonusPopUp.jpgbin0 -> 2356 bytes
-rw-r--r--Skins/Deluxe/[sing]lyricsHelpBar.bmpbin0 -> 3126 bytes
-rw-r--r--Skins/Deluxe/[sing]notesBgLeft.bmpbin0 -> 1590 bytes
-rw-r--r--Skins/Deluxe/[sing]notesBgMid.bmpbin0 -> 1590 bytes
-rw-r--r--Skins/Deluxe/[sing]notesBgRight.bmpbin0 -> 1590 bytes
-rw-r--r--Skins/Deluxe/[sing]notesLeft.bmpbin0 -> 822 bytes
-rw-r--r--Skins/Deluxe/[sing]notesMid.bmpbin0 -> 3126 bytes
-rw-r--r--Skins/Deluxe/[sing]notesRight.bmpbin0 -> 822 bytes
-rw-r--r--Skins/Deluxe/[sing]p.jpgbin0 -> 2630 bytes
-rw-r--r--Skins/Deluxe/[sing]scoreBg.jpgbin0 -> 2005 bytes
-rw-r--r--Skins/Deluxe/[sing]singBarBack.jpgbin0 -> 388 bytes
-rw-r--r--Skins/Deluxe/[sing]singBarBar.jpgbin0 -> 371 bytes
-rw-r--r--Skins/Deluxe/[sing]singBarFront.jpgbin0 -> 549 bytes
-rw-r--r--Skins/Deluxe/[sing]textBar.jpgbin0 -> 1558 bytes
-rw-r--r--Skins/Deluxe/[sing]timeBar.jpgbin0 -> 504 bytes
-rw-r--r--Skins/Deluxe/[sing]timeBar1.jpgbin0 -> 483 bytes
-rw-r--r--Skins/Deluxe/[sing]timeBarBG.jpgbin0 -> 540 bytes
-rw-r--r--Skins/Deluxe/[special]bar1.jpgbin0 -> 2419 bytes
-rw-r--r--Skins/Deluxe/[special]bar1_blue.jpgbin0 -> 2126 bytes
-rw-r--r--Skins/Deluxe/[special]bar1_brown.jpgbin0 -> 2201 bytes
-rw-r--r--Skins/Deluxe/[special]bar1_pink.jpgbin0 -> 2169 bytes
-rw-r--r--Skins/Deluxe/[special]bar2.jpgbin0 -> 1648 bytes
-rw-r--r--Skins/Deluxe/[stat]detailBG1.jpgbin0 -> 653 bytes
-rw-r--r--Skins/Deluxe/[stat]mainBG1.jpgbin0 -> 652 bytes
-rw-r--r--Skins/Deluxe/[stat]mainBG2.jpgbin0 -> 2942 bytes
-rw-r--r--Skins/Deluxe/[stat]mainBG3.jpgbin0 -> 596 bytes
-rw-r--r--Skins/Deluxe/x_[party]scoreDecoration.jpgbin0 -> 6179 bytes
-rw-r--r--Skins/Deluxe/x_[party]winDecoration1.jpgbin0 -> 4331 bytes
-rw-r--r--Skins/Orange/Orange.ini162
-rw-r--r--Skins/Orange/Thumbs.dbbin0 -> 20480 bytes
-rw-r--r--Skins/Orange/[bg-load].jpgbin0 -> 263559 bytes
-rw-r--r--Skins/Orange/[button]13.jpgbin0 -> 13724 bytes
-rw-r--r--Skins/Orange/[button]alt.jpgbin0 -> 13650 bytes
-rw-r--r--Skins/Orange/[button]az.jpgbin0 -> 13641 bytes
-rw-r--r--Skins/Orange/[button]enter.jpgbin0 -> 10565 bytes
-rw-r--r--Skins/Orange/[button]esc.jpgbin0 -> 13869 bytes
-rw-r--r--Skins/Orange/[button]j.jpgbin0 -> 13123 bytes
-rw-r--r--Skins/Orange/[button]m.jpgbin0 -> 13547 bytes
-rw-r--r--Skins/Orange/[button]navi.jpgbin0 -> 15755 bytes
-rw-r--r--Skins/Orange/[button]p.jpgbin0 -> 13323 bytes
-rw-r--r--Skins/Orange/[effect]goldenNoteStar.jpgbin0 -> 24894 bytes
-rw-r--r--Skins/Orange/[effect]perfectNoteStar.jpgbin0 -> 27633 bytes
-rw-r--r--Skins/Orange/[helper]buttonFade.jpgbin0 -> 825 bytes
-rw-r--r--Skins/Orange/[helper]rectangle.jpgbin0 -> 604 bytes
-rw-r--r--Skins/Orange/[icon]cd.jpgbin0 -> 1175 bytes
-rw-r--r--Skins/Orange/[icon]error.jpgbin0 -> 620 bytes
-rw-r--r--Skins/Orange/[icon]main.jpgbin0 -> 1153 bytes
-rw-r--r--Skins/Orange/[icon]options.jpgbin0 -> 1063 bytes
-rw-r--r--Skins/Orange/[icon]party.jpgbin0 -> 1528 bytes
-rw-r--r--Skins/Orange/[icon]question.jpgbin0 -> 663 bytes
-rw-r--r--Skins/Orange/[icon]score.jpgbin0 -> 1150 bytes
-rw-r--r--Skins/Orange/[icon]search.jpgbin0 -> 759 bytes
-rw-r--r--Skins/Orange/[icon]songmenu.jpgbin0 -> 1659 bytes
-rw-r--r--Skins/Orange/[icon]stats.jpgbin0 -> 1741 bytes
-rw-r--r--Skins/Orange/[icon]video.jpgbin0 -> 2608 bytes
-rw-r--r--Skins/Orange/[main]button-m-1.jpgbin0 -> 13594 bytes
-rw-r--r--Skins/Orange/[main]button-m-2.jpgbin0 -> 13539 bytes
-rw-r--r--Skins/Orange/[main]button-m-3.jpgbin0 -> 13900 bytes
-rw-r--r--Skins/Orange/[main]button-m-4.jpgbin0 -> 13874 bytes
-rw-r--r--Skins/Orange/[main]button.jpgbin0 -> 1519 bytes
-rw-r--r--Skins/Orange/[main]button2.jpgbin0 -> 10896 bytes
-rw-r--r--Skins/Orange/[main]button3.jpgbin0 -> 9880 bytes
-rw-r--r--Skins/Orange/[main]buttonf.jpgbin0 -> 17717 bytes
-rw-r--r--Skins/Orange/[main]mainBar.jpgbin0 -> 13339 bytes
-rw-r--r--Skins/Orange/[main]playerNumberBox.jpgbin0 -> 1071 bytes
-rw-r--r--Skins/Orange/[main]selectbg.jpgbin0 -> 16605 bytes
-rw-r--r--Skins/Orange/[main]songCover.jpgbin0 -> 30254 bytes
-rw-r--r--Skins/Orange/[main]songSelection1.jpgbin0 -> 2219 bytes
-rw-r--r--Skins/Orange/[main]songSelection2.jpgbin0 -> 1031 bytes
-rw-r--r--Skins/Orange/[menu]PopUpBg.JPGbin0 -> 2676 bytes
-rw-r--r--Skins/Orange/[menu]PopUpFg.JPGbin0 -> 5993 bytes
-rw-r--r--Skins/Orange/[menu]jumpToBg.jpgbin0 -> 1870 bytes
-rw-r--r--Skins/Orange/[menu]songMenuBg.jpgbin0 -> 5287 bytes
-rw-r--r--Skins/Orange/[menu]songMenuSelectBg.jpgbin0 -> 1674 bytes
-rw-r--r--Skins/Orange/[party]Joker.jpgbin0 -> 7169 bytes
-rw-r--r--Skins/Orange/[party]playerButton.jpgbin0 -> 1519 bytes
-rw-r--r--Skins/Orange/[party]playerTeamButton.jpgbin0 -> 2428 bytes
-rw-r--r--Skins/Orange/[party]pointer.bmpbin0 -> 6198 bytes
-rw-r--r--Skins/Orange/[party]roundBG1.jpgbin0 -> 1043 bytes
-rw-r--r--Skins/Orange/[party]roundBG2.jpgbin0 -> 978 bytes
-rw-r--r--Skins/Orange/[party]roundBG3.jpgbin0 -> 1251 bytes
-rw-r--r--Skins/Orange/[party]roundBG4.jpgbin0 -> 1229 bytes
-rw-r--r--Skins/Orange/[party]roundTeamButton.jpgbin0 -> 2887 bytes
-rw-r--r--Skins/Orange/[party]scoreBG1.jpgbin0 -> 1226 bytes
-rw-r--r--Skins/Orange/[party]scoreBG2.jpgbin0 -> 653 bytes
-rw-r--r--Skins/Orange/[party]scoreDecoration.jpgbin0 -> 6179 bytes
-rw-r--r--Skins/Orange/[party]teamPoints.jpgbin0 -> 729 bytes
-rw-r--r--Skins/Orange/[party]winDecoration1.jpgbin0 -> 4331 bytes
-rw-r--r--Skins/Orange/[party]winTeamButton1.jpgbin0 -> 1925 bytes
-rw-r--r--Skins/Orange/[party]winTeamButton2.jpgbin0 -> 1783 bytes
-rw-r--r--Skins/Orange/[party]winTeamButton3.jpgbin0 -> 1458 bytes
-rw-r--r--Skins/Orange/[score]Line.jpgbin0 -> 559 bytes
-rw-r--r--Skins/Orange/[score]box.jpgbin0 -> 690 bytes
-rw-r--r--Skins/Orange/[score]endcap.jpgbin0 -> 984 bytes
-rw-r--r--Skins/Orange/[score]level.jpgbin0 -> 1264 bytes
-rw-r--r--Skins/Orange/[score]levelRound.jpgbin0 -> 614 bytes
-rw-r--r--Skins/Orange/[sing]LyricsBall.bmpbin0 -> 536 bytes
-rw-r--r--Skins/Orange/[sing]lineBonusPopUp.jpgbin0 -> 2356 bytes
-rw-r--r--Skins/Orange/[sing]lyricsHelpBar.bmpbin0 -> 3128 bytes
-rw-r--r--Skins/Orange/[sing]notesBgLeft.bmpbin0 -> 1590 bytes
-rw-r--r--Skins/Orange/[sing]notesBgMid.bmpbin0 -> 1590 bytes
-rw-r--r--Skins/Orange/[sing]notesBgRight.bmpbin0 -> 1590 bytes
-rw-r--r--Skins/Orange/[sing]notesLeft.bmpbin0 -> 824 bytes
-rw-r--r--Skins/Orange/[sing]notesMid.bmpbin0 -> 3128 bytes
-rw-r--r--Skins/Orange/[sing]notesRight.bmpbin0 -> 824 bytes
-rw-r--r--Skins/Orange/[sing]p.jpgbin0 -> 2630 bytes
-rw-r--r--Skins/Orange/[sing]scoreBg.jpgbin0 -> 13662 bytes
-rw-r--r--Skins/Orange/[sing]singBarBack.jpgbin0 -> 388 bytes
-rw-r--r--Skins/Orange/[sing]singBarBar.jpgbin0 -> 371 bytes
-rw-r--r--Skins/Orange/[sing]singBarFront.jpgbin0 -> 549 bytes
-rw-r--r--Skins/Orange/[sing]textBar.jpgbin0 -> 18326 bytes
-rw-r--r--Skins/Orange/[sing]timeBar.jpgbin0 -> 10716 bytes
-rw-r--r--Skins/Orange/[sing]timeBarBG.jpgbin0 -> 13122 bytes
-rw-r--r--Skins/Orange/[special]bar1.jpgbin0 -> 9726 bytes
-rw-r--r--Skins/Orange/[special]bar2.jpgbin0 -> 9177 bytes
-rw-r--r--Skins/Orange/[stat]detailBG1.jpgbin0 -> 653 bytes
-rw-r--r--Skins/Orange/[stat]mainBG1.jpgbin0 -> 652 bytes
-rw-r--r--Skins/Orange/[stat]mainBG2.jpgbin0 -> 2942 bytes
-rw-r--r--Skins/Orange/[stat]mainBG3.jpgbin0 -> 596 bytes
-rw-r--r--Skins/Orange/bg-main.jpgbin0 -> 254174 bytes
-rw-r--r--Skins/Orange/bg-song.jpgbin0 -> 51259 bytes
-rw-r--r--Skins/Streetlight/Streetlight lite.ini156
-rw-r--r--Skins/Streetlight/Streetlight.ini156
-rw-r--r--Skins/Streetlight/Thumbs.dbbin0 -> 8192 bytes
-rw-r--r--Skins/Streetlight/[bg-load].jpgbin0 -> 571091 bytes
-rw-r--r--Skins/Streetlight/[button]13.jpgbin0 -> 13724 bytes
-rw-r--r--Skins/Streetlight/[button]alt.jpgbin0 -> 13650 bytes
-rw-r--r--Skins/Streetlight/[button]az.jpgbin0 -> 13641 bytes
-rw-r--r--Skins/Streetlight/[button]enter.jpgbin0 -> 10565 bytes
-rw-r--r--Skins/Streetlight/[button]esc.jpgbin0 -> 13869 bytes
-rw-r--r--Skins/Streetlight/[button]j.jpgbin0 -> 13123 bytes
-rw-r--r--Skins/Streetlight/[button]m.jpgbin0 -> 13547 bytes
-rw-r--r--Skins/Streetlight/[button]navi.jpgbin0 -> 15755 bytes
-rw-r--r--Skins/Streetlight/[button]p.jpgbin0 -> 13323 bytes
-rw-r--r--Skins/Streetlight/[effect]goldenNoteStar.jpgbin0 -> 24894 bytes
-rw-r--r--Skins/Streetlight/[effect]perfectNoteStar.jpgbin0 -> 27633 bytes
-rw-r--r--Skins/Streetlight/[helper]buttonFade.jpgbin0 -> 825 bytes
-rw-r--r--Skins/Streetlight/[helper]rectangle.jpgbin0 -> 604 bytes
-rw-r--r--Skins/Streetlight/[icon]cd.jpgbin0 -> 1175 bytes
-rw-r--r--Skins/Streetlight/[icon]error.jpgbin0 -> 620 bytes
-rw-r--r--Skins/Streetlight/[icon]main.jpgbin0 -> 1153 bytes
-rw-r--r--Skins/Streetlight/[icon]options.jpgbin0 -> 1063 bytes
-rw-r--r--Skins/Streetlight/[icon]party.jpgbin0 -> 1528 bytes
-rw-r--r--Skins/Streetlight/[icon]question.jpgbin0 -> 663 bytes
-rw-r--r--Skins/Streetlight/[icon]score.jpgbin0 -> 1150 bytes
-rw-r--r--Skins/Streetlight/[icon]search.jpgbin0 -> 759 bytes
-rw-r--r--Skins/Streetlight/[icon]songmenu.jpgbin0 -> 1659 bytes
-rw-r--r--Skins/Streetlight/[icon]stats.jpgbin0 -> 1741 bytes
-rw-r--r--Skins/Streetlight/[icon]video.jpgbin0 -> 2608 bytes
-rw-r--r--Skins/Streetlight/[main]button.jpgbin0 -> 1519 bytes
-rw-r--r--Skins/Streetlight/[main]button2.jpgbin0 -> 13459 bytes
-rw-r--r--Skins/Streetlight/[main]buttonf.jpgbin0 -> 17717 bytes
-rw-r--r--Skins/Streetlight/[main]mainBar.jpgbin0 -> 13339 bytes
-rw-r--r--Skins/Streetlight/[main]playerNumberBox.jpgbin0 -> 1071 bytes
-rw-r--r--Skins/Streetlight/[main]selectbg.jpgbin0 -> 16605 bytes
-rw-r--r--Skins/Streetlight/[main]songCover.jpgbin0 -> 30254 bytes
-rw-r--r--Skins/Streetlight/[main]songSelection1.jpgbin0 -> 2219 bytes
-rw-r--r--Skins/Streetlight/[main]songSelection2.jpgbin0 -> 8840 bytes
-rw-r--r--Skins/Streetlight/[menu]PopUpBg.JPGbin0 -> 2676 bytes
-rw-r--r--Skins/Streetlight/[menu]PopUpFg.JPGbin0 -> 5993 bytes
-rw-r--r--Skins/Streetlight/[menu]jumpToBg.jpgbin0 -> 1870 bytes
-rw-r--r--Skins/Streetlight/[menu]songMenuBg.jpgbin0 -> 5287 bytes
-rw-r--r--Skins/Streetlight/[menu]songMenuSelectBg.jpgbin0 -> 1674 bytes
-rw-r--r--Skins/Streetlight/[party]Joker.jpgbin0 -> 7169 bytes
-rw-r--r--Skins/Streetlight/[party]playerButton.jpgbin0 -> 1519 bytes
-rw-r--r--Skins/Streetlight/[party]playerTeamButton.jpgbin0 -> 2428 bytes
-rw-r--r--Skins/Streetlight/[party]pointer.bmpbin0 -> 6198 bytes
-rw-r--r--Skins/Streetlight/[party]roundBG1.jpgbin0 -> 1043 bytes
-rw-r--r--Skins/Streetlight/[party]roundBG2.jpgbin0 -> 978 bytes
-rw-r--r--Skins/Streetlight/[party]roundBG3.jpgbin0 -> 1251 bytes
-rw-r--r--Skins/Streetlight/[party]roundBG4.jpgbin0 -> 1229 bytes
-rw-r--r--Skins/Streetlight/[party]roundTeamButton.jpgbin0 -> 2887 bytes
-rw-r--r--Skins/Streetlight/[party]scoreBG1.jpgbin0 -> 1226 bytes
-rw-r--r--Skins/Streetlight/[party]scoreBG2.jpgbin0 -> 653 bytes
-rw-r--r--Skins/Streetlight/[party]scoreDecoration.jpgbin0 -> 6179 bytes
-rw-r--r--Skins/Streetlight/[party]teamPoints.jpgbin0 -> 729 bytes
-rw-r--r--Skins/Streetlight/[party]winDecoration1.jpgbin0 -> 4331 bytes
-rw-r--r--Skins/Streetlight/[party]winTeamButton1.jpgbin0 -> 1925 bytes
-rw-r--r--Skins/Streetlight/[party]winTeamButton2.jpgbin0 -> 1783 bytes
-rw-r--r--Skins/Streetlight/[party]winTeamButton3.jpgbin0 -> 1458 bytes
-rw-r--r--Skins/Streetlight/[score]Line.jpgbin0 -> 559 bytes
-rw-r--r--Skins/Streetlight/[score]box.jpgbin0 -> 690 bytes
-rw-r--r--Skins/Streetlight/[score]endcap.jpgbin0 -> 984 bytes
-rw-r--r--Skins/Streetlight/[score]level.jpgbin0 -> 1264 bytes
-rw-r--r--Skins/Streetlight/[score]levelRound.jpgbin0 -> 614 bytes
-rw-r--r--Skins/Streetlight/[sing]LyricsBall.bmpbin0 -> 536 bytes
-rw-r--r--Skins/Streetlight/[sing]lineBonusPopUp.jpgbin0 -> 2356 bytes
-rw-r--r--Skins/Streetlight/[sing]lyricsHelpBar.bmpbin0 -> 3128 bytes
-rw-r--r--Skins/Streetlight/[sing]notesBgLeft.bmpbin0 -> 1590 bytes
-rw-r--r--Skins/Streetlight/[sing]notesBgMid.bmpbin0 -> 1590 bytes
-rw-r--r--Skins/Streetlight/[sing]notesBgRight.bmpbin0 -> 1590 bytes
-rw-r--r--Skins/Streetlight/[sing]notesLeft.bmpbin0 -> 824 bytes
-rw-r--r--Skins/Streetlight/[sing]notesMid.bmpbin0 -> 3128 bytes
-rw-r--r--Skins/Streetlight/[sing]notesRight.bmpbin0 -> 824 bytes
-rw-r--r--Skins/Streetlight/[sing]p.jpgbin0 -> 2630 bytes
-rw-r--r--Skins/Streetlight/[sing]scoreBg.jpgbin0 -> 13662 bytes
-rw-r--r--Skins/Streetlight/[sing]singBarBack.jpgbin0 -> 388 bytes
-rw-r--r--Skins/Streetlight/[sing]singBarBar.jpgbin0 -> 371 bytes
-rw-r--r--Skins/Streetlight/[sing]singBarFront.jpgbin0 -> 549 bytes
-rw-r--r--Skins/Streetlight/[sing]textBar.jpgbin0 -> 18326 bytes
-rw-r--r--Skins/Streetlight/[sing]timeBar.jpgbin0 -> 10716 bytes
-rw-r--r--Skins/Streetlight/[sing]timeBarBG.jpgbin0 -> 13122 bytes
-rw-r--r--Skins/Streetlight/[special]bar1.jpgbin0 -> 8623 bytes
-rw-r--r--Skins/Streetlight/[special]bar2.jpgbin0 -> 8803 bytes
-rw-r--r--Skins/Streetlight/[stat]detailBG1.jpgbin0 -> 653 bytes
-rw-r--r--Skins/Streetlight/[stat]mainBG1.jpgbin0 -> 652 bytes
-rw-r--r--Skins/Streetlight/[stat]mainBG2.jpgbin0 -> 2942 bytes
-rw-r--r--Skins/Streetlight/[stat]mainBG3.jpgbin0 -> 596 bytes
-rw-r--r--Skins/Streetlight/bg-main.jpgbin0 -> 570461 bytes
-rw-r--r--Skins/Streetlight/bg-song.jpgbin0 -> 111237 bytes
-rw-r--r--Skins/Vistar/Thumbs.dbbin0 -> 11264 bytes
-rw-r--r--Skins/Vistar/Vistar.ini150
-rw-r--r--Skins/Vistar/[button]13.jpgbin0 -> 13724 bytes
-rw-r--r--Skins/Vistar/[button]alt.jpgbin0 -> 13650 bytes
-rw-r--r--Skins/Vistar/[button]az.jpgbin0 -> 13641 bytes
-rw-r--r--Skins/Vistar/[button]enter.jpgbin0 -> 10565 bytes
-rw-r--r--Skins/Vistar/[button]esc.jpgbin0 -> 13869 bytes
-rw-r--r--Skins/Vistar/[button]j.jpgbin0 -> 13123 bytes
-rw-r--r--Skins/Vistar/[button]m.jpgbin0 -> 13547 bytes
-rw-r--r--Skins/Vistar/[button]navi.jpgbin0 -> 15755 bytes
-rw-r--r--Skins/Vistar/[button]p.jpgbin0 -> 13323 bytes
-rw-r--r--Skins/Vistar/[effect]goldenNoteStar.jpgbin0 -> 24894 bytes
-rw-r--r--Skins/Vistar/[effect]perfectNoteStar.jpgbin0 -> 27633 bytes
-rw-r--r--Skins/Vistar/[helper]rectangle.jpgbin0 -> 604 bytes
-rw-r--r--Skins/Vistar/[icon]cd.jpgbin0 -> 1175 bytes
-rw-r--r--Skins/Vistar/[icon]error.jpgbin0 -> 620 bytes
-rw-r--r--Skins/Vistar/[icon]main.jpgbin0 -> 1153 bytes
-rw-r--r--Skins/Vistar/[icon]options.jpgbin0 -> 1063 bytes
-rw-r--r--Skins/Vistar/[icon]party.jpgbin0 -> 1528 bytes
-rw-r--r--Skins/Vistar/[icon]question.jpgbin0 -> 663 bytes
-rw-r--r--Skins/Vistar/[icon]score.jpgbin0 -> 1150 bytes
-rw-r--r--Skins/Vistar/[icon]search.jpgbin0 -> 759 bytes
-rw-r--r--Skins/Vistar/[icon]songmenu.jpgbin0 -> 1659 bytes
-rw-r--r--Skins/Vistar/[icon]stats.jpgbin0 -> 1741 bytes
-rw-r--r--Skins/Vistar/[icon]video.jpgbin0 -> 2608 bytes
-rw-r--r--Skins/Vistar/[main]button.jpgbin0 -> 12579 bytes
-rw-r--r--Skins/Vistar/[main]buttonf.jpgbin0 -> 17717 bytes
-rw-r--r--Skins/Vistar/[main]mainBar.jpgbin0 -> 11261 bytes
-rw-r--r--Skins/Vistar/[main]playerNumberBox.jpgbin0 -> 1071 bytes
-rw-r--r--Skins/Vistar/[main]selectbg.jpgbin0 -> 11647 bytes
-rw-r--r--Skins/Vistar/[main]songCover.jpgbin0 -> 30254 bytes
-rw-r--r--Skins/Vistar/[main]songSelection2.jpgbin0 -> 1031 bytes
-rw-r--r--Skins/Vistar/[mainbutton]Exit.jpgbin0 -> 3065 bytes
-rw-r--r--Skins/Vistar/[mainbutton]Multi.jpgbin0 -> 2965 bytes
-rw-r--r--Skins/Vistar/[mainbutton]Options.jpgbin0 -> 2875 bytes
-rw-r--r--Skins/Vistar/[mainbutton]Solo.jpgbin0 -> 3070 bytes
-rw-r--r--Skins/Vistar/[mainbutton]Stats.jpgbin0 -> 3246 bytes
-rw-r--r--Skins/Vistar/[menu]PopUpBg.JPGbin0 -> 2676 bytes
-rw-r--r--Skins/Vistar/[menu]PopUpFg.JPGbin0 -> 5993 bytes
-rw-r--r--Skins/Vistar/[menu]jumpToBg.jpgbin0 -> 1870 bytes
-rw-r--r--Skins/Vistar/[menu]songMenuBg.jpgbin0 -> 5287 bytes
-rw-r--r--Skins/Vistar/[menu]songMenuSelectBg.jpgbin0 -> 1674 bytes
-rw-r--r--Skins/Vistar/[party]Joker.jpgbin0 -> 7169 bytes
-rw-r--r--Skins/Vistar/[party]playerButton.jpgbin0 -> 1519 bytes
-rw-r--r--Skins/Vistar/[party]playerTeamButton.jpgbin0 -> 2428 bytes
-rw-r--r--Skins/Vistar/[party]pointer.bmpbin0 -> 6198 bytes
-rw-r--r--Skins/Vistar/[party]roundBG1.jpgbin0 -> 1043 bytes
-rw-r--r--Skins/Vistar/[party]roundBG2.jpgbin0 -> 978 bytes
-rw-r--r--Skins/Vistar/[party]roundBG3.jpgbin0 -> 1251 bytes
-rw-r--r--Skins/Vistar/[party]roundBG4.jpgbin0 -> 1229 bytes
-rw-r--r--Skins/Vistar/[party]roundTeamButton.jpgbin0 -> 2887 bytes
-rw-r--r--Skins/Vistar/[party]scoreBG1.jpgbin0 -> 1226 bytes
-rw-r--r--Skins/Vistar/[party]scoreBG2.jpgbin0 -> 653 bytes
-rw-r--r--Skins/Vistar/[party]scoreDecoration.jpgbin0 -> 6179 bytes
-rw-r--r--Skins/Vistar/[party]teamPoints.jpgbin0 -> 729 bytes
-rw-r--r--Skins/Vistar/[party]winDecoration1.jpgbin0 -> 4331 bytes
-rw-r--r--Skins/Vistar/[party]winTeamButton1.jpgbin0 -> 1925 bytes
-rw-r--r--Skins/Vistar/[party]winTeamButton2.jpgbin0 -> 1783 bytes
-rw-r--r--Skins/Vistar/[party]winTeamButton3.jpgbin0 -> 1458 bytes
-rw-r--r--Skins/Vistar/[score]Line.jpgbin0 -> 559 bytes
-rw-r--r--Skins/Vistar/[score]box.jpgbin0 -> 690 bytes
-rw-r--r--Skins/Vistar/[score]endcap.jpgbin0 -> 984 bytes
-rw-r--r--Skins/Vistar/[score]level.jpgbin0 -> 1264 bytes
-rw-r--r--Skins/Vistar/[score]levelRound.jpgbin0 -> 614 bytes
-rw-r--r--Skins/Vistar/[sing]LyricsBall.bmpbin0 -> 536 bytes
-rw-r--r--Skins/Vistar/[sing]lineBonusPopUp.jpgbin0 -> 2356 bytes
-rw-r--r--Skins/Vistar/[sing]lyricsHelpBar.bmpbin0 -> 3128 bytes
-rw-r--r--Skins/Vistar/[sing]notesBgLeft.bmpbin0 -> 1590 bytes
-rw-r--r--Skins/Vistar/[sing]notesBgMid.bmpbin0 -> 1590 bytes
-rw-r--r--Skins/Vistar/[sing]notesBgRight.bmpbin0 -> 1590 bytes
-rw-r--r--Skins/Vistar/[sing]notesLeft.bmpbin0 -> 824 bytes
-rw-r--r--Skins/Vistar/[sing]notesMid.bmpbin0 -> 3128 bytes
-rw-r--r--Skins/Vistar/[sing]notesRight.bmpbin0 -> 824 bytes
-rw-r--r--Skins/Vistar/[sing]p.jpgbin0 -> 2630 bytes
-rw-r--r--Skins/Vistar/[sing]scoreBg.jpgbin0 -> 13662 bytes
-rw-r--r--Skins/Vistar/[sing]singBarBack.jpgbin0 -> 388 bytes
-rw-r--r--Skins/Vistar/[sing]singBarBar.jpgbin0 -> 371 bytes
-rw-r--r--Skins/Vistar/[sing]singBarFront.jpgbin0 -> 549 bytes
-rw-r--r--Skins/Vistar/[sing]textBar.jpgbin0 -> 18326 bytes
-rw-r--r--Skins/Vistar/[sing]timeBar.jpgbin0 -> 10716 bytes
-rw-r--r--Skins/Vistar/[sing]timeBar1.jpgbin0 -> 483 bytes
-rw-r--r--Skins/Vistar/[sing]timeBarBG.jpgbin0 -> 13122 bytes
-rw-r--r--Skins/Vistar/[stat]detailBG1.jpgbin0 -> 653 bytes
-rw-r--r--Skins/Vistar/[stat]mainBG1.jpgbin0 -> 652 bytes
-rw-r--r--Skins/Vistar/[stat]mainBG2.jpgbin0 -> 2942 bytes
-rw-r--r--Skins/Vistar/[stat]mainBG3.jpgbin0 -> 596 bytes
-rw-r--r--Skins/Vistar/bg-lite.jpgbin0 -> 374718 bytes
-rw-r--r--Skins/Vistar/bg-load.jpgbin0 -> 167719 bytes
-rw-r--r--Skins/Vistar/bg-main.jpgbin0 -> 341234 bytes
-rw-r--r--Skins/Vistar/bg-score.jpgbin0 -> 85402 bytes
-rw-r--r--Skins/Vistar/bg-song.jpgbin0 -> 324890 bytes
-rw-r--r--Skins/Vistar/main-buttons.jpgbin0 -> 21723 bytes
-rw-r--r--Sounds/Common back.mp3bin0 -> 23431 bytes
-rw-r--r--Sounds/Common start.mp3bin0 -> 23431 bytes
-rw-r--r--Sounds/credits-outro-tune.mp3bin0 -> 156212 bytes
-rw-r--r--Sounds/dismissed.mp3bin0 -> 5433 bytes
-rw-r--r--Sounds/menu swoosh.mp3bin0 -> 5246 bytes
-rw-r--r--Sounds/option change col.mp3bin0 -> 3734 bytes
-rw-r--r--Sounds/rimshot022b.mp3bin0 -> 2090 bytes
-rw-r--r--Sounds/select music change music 50.mp3bin0 -> 17580 bytes
-rw-r--r--Sounds/select music change music.mp3bin0 -> 8565 bytes
-rw-r--r--Sounds/wome-credits-tune.mp3bin0 -> 1682311 bytes
-rw-r--r--Themes/Classic.ini7424
-rw-r--r--Themes/Deluxe.ini7993
-rw-r--r--Themes/Orange.ini8088
-rw-r--r--Themes/Streetlight lite.ini8009
-rw-r--r--Themes/Streetlight.ini8009
-rw-r--r--Themes/Vistar.ini7634
1694 files changed, 241738 insertions, 0 deletions
diff --git a/Covers/Covers.ini b/Covers/Covers.ini
new file mode 100644
index 00000000..a81cf002
--- /dev/null
+++ b/Covers/Covers.ini
@@ -0,0 +1,19 @@
+[Edition]
+Singstar=Singstar.jpg
+Singstar Part 2=Singstar.jpg
+Singstar German=Singstar.jpg
+Singstar Spanish=Singstar.jpg
+Singstar Italian=Singstar.jpg
+Singstar French=Singstar.jpg
+Singstar Party=Singstar Party.jpg
+Singstar Popworld=Singstar Popworld.jpg
+Singstar 80s=Singstar 80s.jpg
+Singstar 80s Polish=Singstar 80s.jpg
+Singstar Rocks=Singstar Rocks.jpg
+Singstar Anthems=Singstar Anthems.jpg
+Singstar Deutsch Rock-Pop=Singstar Deutsch Rock-Pop.jpg
+Singstar Norske Hits=Singstar Norske Hits.jpg
+Singstar Svenska Hits=Singstar Svenska Hits.jpg
+[Genre]
+[Language]
+[Folder] \ No newline at end of file
diff --git a/Covers/NoCover.jpg b/Covers/NoCover.jpg
new file mode 100644
index 00000000..0a424708
--- /dev/null
+++ b/Covers/NoCover.jpg
Binary files differ
diff --git a/Covers/Thumbs.db b/Covers/Thumbs.db
new file mode 100644
index 00000000..aadee2a9
--- /dev/null
+++ b/Covers/Thumbs.db
Binary files differ
diff --git a/Game/Changelog.german.txt b/Game/Changelog.german.txt
new file mode 100644
index 00000000..04cd36bc
--- /dev/null
+++ b/Game/Changelog.german.txt
@@ -0,0 +1,389 @@
+Ultrastar Deluxe v1.0.1a Challenge MOD r6b vom 17.02.2010
+-----------------------------
+Fix: (Medley) #Relative und Medley vertragen sich (noch) nicht. Wird nun abgefangen.
+Fix: (Videos) Es wurde oft fälschlicherweise Crop eingestellt.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r6a vom 16.02.2010
+-----------------------------
+New: (Allgemein) Medley Surprise und Medley Surprise Blind als "Plugin".
+Upd: (Videos) Neue FFmpeg-Version.
+Fix: (Allgemein) Ab und zu ist das Programm in der Songauswahl abgestürzt.
+Fix: (Challenge) Plugins konnten nicht komplett abgeschaltet werden.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r6 vom 15.02.2010
+-----------------------------
+New: (Allgemein) Medley-Modus als Plugin: Medley normal, Medley blind und Medley no score.
+New: (Allgemein) Plugins sind nun in den Party-Optionen an/abwählbar (über Leertaste bzw. Links/Rechts).
+New: (Medley) Die Medley-Playliste lässt sich in der Songauswahl mit F frei zusammenstellen. Bis zu 99 Songs sind möglich. Mit Shif+F wird das zuletzt hinzugefügte wieder entfernt bzw. der Modus deaktiviert.
+Upd: (Challenge) Spielerauswahl verbessert. Der maximaler Abstand zwischen den Sängern, die am öftesten und am seltesten gesungen haben, beträgt nun maximal 1.
+Upd: (Challenge) Spielerpaarungen werden erst in der aktuellen Runde angezeigt.
+Upd: (Hilfe) JumpTo- und Popup-Menu mit eigenen Hilfetexten.
+Upd: (Party) Per Joker übersprungene Lieder werden nicht noch einmal in der gleichen Auswahlrunde vorgeschlagen.
+Upd: (Songauswahl) Bei Random wird nicht sofort wieder das gleiche Lied vorgeschlagen.
+Fix: (Videos) Videodarstellung bei Verwendung von zwei Bildschirmen korrigiert.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r5c vom 06.02.2010
+-----------------------------
+Upd: (Videos) Aspect-Einstellung wird nun für jedes Lied einzeln gespeichert. Vorwahl im Menu dient lediglich als Vorwahl, wenn ein Video noch nicht gespielt worden ist. Speichertort ist die Datenbank.
+Upd: (Videos) Die Videos lassen sich nun auch komplett abschalten (Option).
+Fix: (Challenge) Medley-Symbole werden im Challenge-Modus ausgeblendet.
+Fix: (Songauswahl) Performance beim Scrollen mit Videovorschau verbessert.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r5b vom 05.02.2010
+-----------------------------
+Upd: (Party) Pluginname wird bei Songauswahl angezeigt
+Upd: (Songauswahl) Videovorschau wird nun eingeblendet
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r5a vom 05.02.2010
+-----------------------------
+New: (Sonauswahl) Videovorschau (maximieren/verkleinern mit V)
+Fix: (Videos) Alle Videos müssten nun synchron laufen.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r5 vom 23.01.2010
+-----------------------------
+New: (Allgemein) Erste Version eines Hilfesystems für jeden Bildschirm (mit TAB aufrufbar). Es sind noch nicht alle Texte vorhanden (keine englischen Texte).
+New: (Medley) Countdownziffern beim Starten während FadeIn.
+Upd: (Party) Maximale Rundenanzahl von 7 auf 32 erhöht.
+Fix: (Challenge) Im Zusammnhang mit Plugins wurde der falsche Sieger gekürt. Punkte wurden doppelt berechnet.
+Fix: (Editor) FixTimings korrigiert: Wenn zwischen zwei Zeilen exakt 4 Beats waren, hat die Funktion den Zeilenübergang auf den Anfang der ersten Note gelegt.
+Fix: (Editor) Medley-tags ließen sich nicht entfernen.
+Fix: (Editor) Wenn man die letzte Note verlängert, verkürzt oder verschoben hat, so ist der Editor weiter gesprungen. Egal ob es eine Überschneidung gab oder die nächste Note in weiter Ferne lag. Das Problem war, dass die Timings zwischen den Sätzen dann nicht mehr stimmten.
+Fix: (Medley) Bei Medley-Start am Anfang eines Liedes gab es keinen FadeIn.
+Fix: (Medley) Freestyle- Passagen werden nun von der Medley-Berechnung ausgeschlossen.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4g vom 13.01.2010
+-----------------------------
+Fix: (Videos) Spuleffekt am Anfang mancher Lieder beseitigt. Es müssten nun mehr Videos wieder laufen. Bei einigen Videos gibt es aber nach wie vor Probleme beim Spulen und mit der Synchronität. Diese sind aber meist nicht sauber codiert oder falsch geschnitten.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4f vom 13.01.2010
+-----------------------------
+Fix: (Editor) Zeilensprung, wenn Noten "nur" aneinander kleben beseitigt.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4e vom 12.01.2010
+-----------------------------
+Upd: (Editor) Grelle, blaue Augenkrebsfarbe abgeschwächt.
+Fix: (Editor) Midi-Noten wurden nicht richtig abgespielt. Führte zur Instabilität.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4d vom 12.01.2010
+-----------------------------
+Fix: (Editor) Beim speichern sind manchmal TXTs zerstört worden (blöder Fehler...).
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4c vom 11.01.2010
+-----------------------------
+Fix: (Editor) Beim Abspielen einer einzelnen Note im Editor ist die ausgewählte Note weggesprungen.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4b vom 10.01.2010
+-----------------------------
+Upd: (Allgemein) Doppelte Zeilenumbrüche in txts werden nun erkannt und in der Error.log protokolliert.
+Upd: (Editor) Die aktuell ausgewählte Note wandert mit, wenn mit P die ganze Zeile gespielt wird. Springt am Ende wieder zurück zur zuletzt ausgewählten Note.
+Upd: (Editor) Die aktuell bearbeitete Note hat nun die Farbe rot.
+Upd: (Editor) Esc dient im TextEditMode (F4) nicht mehr dazu, den Editor komplett zu verlassen, sondern, um die gerade gemachten Änderungen an der aktuellen Silbe rückgängig zu machen.
+Upd: (Editor) Medley-Tags nun in Klartext statt "MS" und "ME"
+Upd: (Editor) Mit Alt+J kann man nun die Medley-Passage am Stück im Editor abspielen.
+Upd: (Editor) Wenn man Medley-tags setzt/rücksetzt oder zu den Medley-tags springt, wird unten die aktuelle Länge des Medleys in Sekunden angezeigt.
+Upd: (Editor) Zusätzlich zu den bekannten P+(Shif bzw. Strg) kann man nun die Taste ALT drücken. Hierbei bleiben die bestehenden Funktionen, wobei das Lied aber ab dem aktuellen Satz bis zu Ende gespielt wird.
+Upd: (Medley) Titelanzeige ist nur noch während des FadeIn sichtbar.
+Upd: (Videos) Neuere FFmpeg-Version.
+Fix: (Allgemein) Die Zeit lief im Party und Challenge-Modus nicht rückwärts.
+Fix: (Allgemein) PopUps (Lineboni) gingen schräg nach oben weg.
+Fix: (Challenge) Manchmal wurde der falsche Spieler zum Sieger erklärt, wenn Plugins gewählt waren.
+Fix: (Editor) Bei Textänderungen wird die Lyriczeile nun komplett aktualisiert, statt nur der gerade editierten Silbe.
+Fix: (Editor) Bug beim speichern behoben: In der Songauswahl kam es hinterher zu Fehlern.
+Fix: (Editor) Nun sind alle Zeichen der Tastatur nutzbar. Zuvor gingen u.a. "ö", "ü", "." und "'" (Apostroph) nicht.
+Fix: (Medley) Das FadeOut war nicht immer optimal.
+Fix: (Videos) Aspect-Ratio wird nun richtig aus der INI geladen.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4a vom 08.01.2010
+-----------------------------
+Fix: (Fading) Die Musik wird nach verlassen des Top-Screens im Challenge mode nun "ausgefaded".
+Fix: (Fading) In der Songauswahl "schepperte" die Musik manchmal.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4 vom 07.01.2010
+-----------------------------
+New: (Editor) Unterstützung für Preview-tag. Setzen mit K. Springen zum Previewtag mit SHIFT+K. Ist dieses Tag gesetzt, so wird in der Songauswahl von diesem Zeitstempel an die Preview gestartet. Ist kompatibel mit dem Tag aus der Version 0.7
+New: (Editor) Unterstützung von Medley-Tags. Medley-Start-Tag setzen/rücksetzen mit A, End-Tag setzen/rücksetzen mit SHIFT+A. Springen zum Medley Start mit J, Sprung zum Medley-End mit SHIFT+J. Bei den Medley-Tags handelt es sich um Beat-Angaben. Das Start-Tag liegt immer auf dem Anfang einer Note. Das End-Tag auf dem Ende einer Note (Notenstart-Beat+Notenlänge). Die Standard FadeIn und -Out-Zeiten betragen 8 bzw 4 Sekunden.
+New: (Medley) Medley-Modus: Das Refrain von bis zu fünf verschiedenen Liedern hintereinander singen. Solange keine Medley-Tags gesetzt sind, versucht das Programm die Medley-Stellen zu errechnen (klappt besonders gut bei Pop-Liedern). Im Editor können diese Stellen dann korrigiert werden. Start eines einzelnen getaggten Refrains mit S, eines errechneten mit SHIFT+S. Bis zu fünf aus einem Ordner/Kategorie entsprechend mit D bzw. SHIFT+D. Wendet man das auf eine Kategorie/Ordner an, so wird die Playlist kunterbund aus allen Ordnern gebildet.
+New: (Videos) AspectRatio-Umschaltung beim Singen mit A (Stretch, Crop, LetterBox). Wird beim Umschalten für 3 Sekunden oben im SingScreen eingeblendet.
+Upd: (Allgemein) Im Scorescreen und Highscore-Screen wird das gerade gesungene Lied abgespielt. Im Medley-Modus umschaltbar.
+Upd: (Editor) Kann nur noch mit der Esc-Taste verlassen werden
+Upd: (Editor) Optisch etwas aufgefrischt.
+Upd: (Editor) Song neu laden mit R.
+Upd: (Medley) FadeIn und FadeOut wird immer auf den Anfang bzw. Ende eines Satzes gelegt.
+Upd: (Stats) Bei "Highscores" wird nun auch das Datum angezeigt. Bei "Beste Sänger" wird angezeigt, wie oft jemand gesungen hat.
+Fix: (Allgemein) Zeitfortschrittsbalken fängt nun ganz links an zu laufen. Zeit läuft rückwärts bis Null.
+Fix: (Videos) Einige Videos (divx, mp4) starteten mit einem Standbild.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r3 vom 04.01.2010
+-----------------------------
+Upd: (Challenge) Bei weniger als 9 Spielern werden nicht benutzte Tabellenelemente ausgeblendet.
+Upd: (Challenge) Handicap Modus entschäft. Jetzt werden nur noch maximal die letzten 10 Highscores eines Spielers berücksichtigt.
+Upd: (Party) Plugin-Auswahl nicht mehr so "zufällig", dafür kommt jetzt keins mehr 3x hintereinander.
+Upd: (Videos) Aktualisierte FFmpeg Version (über acinerella). Performance und Kompatibilität für Videos gesteigert, MKV wird nun unterstützt.
+Fix: (Challenge) PARTY_END hat nun auch einen Eintrag in der Language.txt
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r2 vom 02.01.2010
+-----------------------------
+New: (Challenge) Handicap-Modus: Wenn mehr als 3 Highscore-Einträge für beide Spieler vorhanden sind, so werden dem schlechteren Spieler nach dem Singen prozentual Punkte abgezogen (macht leider bei Hold The Line wenig Sinn).
+Fix: (Allgemein) Screenshots funktionieren nun wieder.
+Fix: (Allgemein) Spielernamen werden im Party- und Challenge-Modus in Templates gespeichert (ALT+F1..F12).
+Fix: (Challenge) Wenn Plugins abgewählt sind, so muss zumindest das Plugin "Duell" vorhanden sein.
+Fix: (ScreenScore) Mit eingeschaltetem Fade und 4/6 Spielern ist das Spiel nach dem zweiten Song abgestürzt. Wenn es nicht gerade abgestürzt ist, so gab es Darstellungsfehler und Highscores wurden doppelt eingetragen.
+Fix: (ScreenScore) Spielernummern der Spieler 4 bis 6 wurden als P1..P3 dargestellt
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r1 vom 31.12.2009
+-----------------------------
+New: (Challenge) Ein Algorithmus sorgt dafür, dass ein Spieler nicht allzu oft hintereinander singt und nicht allzu oft hintereinander P1 ist (=Lied aussuchen darf)
+New: (Challenge) Es wird nach jeder Runde eine Tabelle mit den Platzierungen angezeigt (wie bei Fussball mit 2-Punkte-System)
+New: (Challenge) Es wird nie während einer Partie ein Lied 2x gesungen! Es sei denn die Lieder gehen einem "aus".
+New: (Challenge) Jeder singt nach Möglichkeit gegen jeden - mit Hin- und Rückrunde: Hinrunde bedeutet, dass der Spieler P1 das Lied aussuchen darf, Rückrunde bedeutet, dass der Gegenspieler P1 ist, und somit aussuchen darf
+New: (Challenge) Lied "aussuchen" mit R (random) oder J (Joker)
+New: (Challenge) Man kann auswählen, ob die Plugins benutzt werden sollen oder nicht (Duell-Plugin ist Standard-Plugin)
+New: (Challenge) Solange random nicht angewendet worden ist, kann zwischen Ordnern hin- und hergeschaltet werden (Kategoriewechsel). Es sei denn man nutzt eine Playlist oder hat eine Kategorie vorgegeben.
+New: (Challenge) Verbesserte "Würfel-Funktion" bei der Auswahl der Plugins: die Plugins sind nicht mehr ganz zufällig, dafür gibt es aber auch mehr Abwechslung.
+New: (Challenge) Wenn jemand P1 ist und somit das Lied aussuchen darf, so hat er jedes mal 5 Joker (plus einmal frei)
+New: (Challenge) Während einer Aussucherei wird nie ein Lied 2x per random vorgeschlagen.
+Upd: (Highscores) Aus der Top-5 Liste ist eine Top-8 Liste geworden.
+Upd: (Highscores) Ein Lied muss erstmal komplett bis zur letzten Note gesungen werden, damit es als gesungen gezählt und in die DB übernommen wird.
+Upd: (Highscores) Ergebnisse unter 100 Punkte werden nicht mehr in die DB eingetragen und das Lied zählt als nicht gesungen!
+Upd: (Highscores) Es werden keine Einträge mehr aus der DB gelöscht (jaja... es wurden immer nur 5 pro Spieler und Lied gespeichert..)
+Upd: (Highscores) Es wird jeweils pro Spieler mit dem jeweils besten Score zusammengefasst (Top-8 Liste).
+Upd: (Highscores) Zu jedem Highscore wird auch das Datum gespeichert! Anzeige in Highscoreliste (in Stats kommt bald).
+Upd: (Party) "Cheaten" im Classic-Modus mit ALT+1, +2, +3
+Info: (Allgemein) Bisher nur Deluxe-Theme und Spachen deutsch und englisch.
+
+UltraStar Deluxe 1.01a
+-----------------------------
+Fix: VideoGap funktioniert wieder mit Mpeg Videos
+Fix: Video Start wird nun richtig berechnet wenn der Start-Tag benutzt wird
+
+UltraStar Deluxe 1.01
+-----------------------------
+Upd: Neue SDL-Lib
+Upd: Neue Bass.dll
+Upd: Video support neu geschrieben (FFMpeg anstatt SMPeg)
+ ->Fast alle Videoformate werden nun unterstützt. Bessere Synchronisation der meisten Videos.
+Upd: Theme, Skin und Farbe können ohne Neustart geändert werden
+Upd: Einige Geschwindigkeitsverbesserungen
+Upd: Backspace ist nun identisch mit ESC bei den meisten Screens
+Upd: Editor: Singlenote-playback (SHIFT + Leertaste / STRG + SHIFT + Leertaste)
+Upd: Editor: Mehr Buchstaben funktionieren nun im Texteditmodus z.B. '~'
+Upd: Deluxe-Theme verschönert.
+ - Neue Texturen für die Leiste
+ - Neue Hintergründe für die Deluxe Skins
+ - Farbe ist nun im Deluxe-Theme änderbar \o/
+Upd: Executable Name zu USdx.exe geändert
+Upd: Neue Sounds für die Menüs
+Upd: 3 neue Skins von Skar/Alajasam hinzugefügt
+Upd: TeamDuell (ähnlich Gib das Mikro weiter) Modiplugin hinzugefügt
+
+Add: Installer verfügbar
+
+Fix: 4/6 Spieler: Richtige Punktzahlen werden auf dem Scorescreen angezeigt
+Fix: Doppeltes hinzufügen der Scores bei Screens=2
+Fix: Überlappen einiger Artistennamen mit den Songname sollte nun in den meisten Fällen gefixed sein.
+Fix: License- und Readme.txt Dateien tauchen nicht mehr in der error.log auf
+Fix: Einige Sounds, (hauptsächlich der Editor 'klick'-Sound) waren zu leise
+Fix: USdx sollte nun mit Girder funktionieren
+
+UltraStar Deluxe 1.00 (by Ultrastar Deluxe Team)
+-----------------------------
+
+--------------
+Theme System
+--------------
+Upd: Neues Skin/Theme System aus Ultrastar 0.5.1
+Upd: Laden von selbsterstellten Themes ermöglicht
+Upd: Covereigenschaften in Theme.ini ausgelagert (z.B. Position)
+Upd: Optionale Coverspiegelungen hinzugefügt
+Upd: Neue Coveranordnung (Bessereres Aussehen mit vielen Songs). (Kann im Theme an und ausgeschaltet werden)
+Upd: SongScreen Equalizer Objekt hinzugefügt
+Upd: Optionale Spiegelungen zu Buttons und Statics hinzugefügt. (Reflection = 1)
+Upd: Buttons können nun im Theme zu Gruppen zusammengefasst werden.z.B. Deluxe Theme Main Menu Tools Collection.
+Upd: Buttons könen vom Theme ausgeblendet werden. z.B. für den Exit Button, oder falls Hotkeys existieren.
+Upd: Texte können nun eine Länge (w= ..) erhalten. Sie werden dann bei der gegebenen Länge umgebrochen.
+
+--------------
+Aufnahme Optionen
+--------------
+Upd: Ultrastar 0.5.2 Recording Optionen hinzugefügt
+Fix: Soundcard Einträge wurden mehrmals in die Config.Ini eingetragen
+Fix: Mehr als ein Singstaradapter sind jetzt möglich(2 Soundkarten mit dem selben Namen)
+
+--------------
+Song Screen
+--------------
+Upd: Playlist Support hinzugefügt
+
+Upd: Song Suche (mit Interface)
+Upd: Jump to Letter Hotkey
+Upd: Songscreen Menu ähnlich wie bei Singstar
+Upd: Spielernamen können nun vor dem Singen geändert werden
+Upd: Song Vorschau Lautstärke kann nun geändert werden
+Upd: Song Vorschau kann eingefadet werden
+
+--------------
+Party Modus
+--------------
+Upd: Party Modus hinzugefügt:
+ 3 Teams mit bis zu 4 Spielern möglich
+ => insgesamt 12 Spieler
+Upd: Modi SDK: Party Modi können mit etwas Programmiererfahrung leicht erstellt werden.
+Upd: 4 Standard Party Modi Plugins: Duell, Hold the Line, Until 5000, Blind Mode
+
+--------------
+Effekte
+--------------
+Upd: Neue Perfect Note Effekte
+Upd: Effekt bei perfekt gesungenem Satz hinzugefügt
+Upd: Goldene Noten haben jetzt einen Singstar ähnlichen Glitzereffekt, und sind nicht mehr gelb.
+Upd: Neuer Effekt bei getroffenen Goldenen Noten
+Upd: Neuer Menü-Übergangs-Effekt: Screen verschwimmt und "fliegt aus dem Bild heraus". Neue Möglichkeiten für Theme-Ersteller
+
+--------------
+Sonstiges
+--------------
+Upd: Deluxe Theme hinzugefügt: Theme mit PS3 ähnlichem Aussehen
+Upd: Neues Score Speicherungssystem (basierend auf SQLite)
+Upd: Statistiken hinzugefügt. Generelle Statistiken und
+ Beste Scores, Beste Sänger, beliebteste Songs, beliebteste Bands
+Upd: Einige On Screen Fehler Benachrichtigungen hinzugefügt, die neuen Spielern helfen sollten.
+Upd: Neuer Erweiterter Options Screen hinzugefügt
+Upd: Abfrage vor dem Beenden hinzugefügt
+Upd: Song Hintergrundbilder können jetzt auch auf voller Bildschrimfläche dargestellt werden.
+Upd: Im Editor werden jetzt zusätzlich die richtigen Notennamen ausgegeben (C, F#, etc.)
+Upd: Neue Schriftarten
+Upd: Bessere Unterstützung für Kommandozeilen Parameter
+Fix: Nahezu keine Abstürze mehr wegen fehlerhaften TXT-Dateien.
+ In Game Popup hinzugefügt und einen Rücksprunk zum Songscreen.
+ Selbst der Partymodus wird nicht unterbrochen.
+Fix: Workaround für Cover und Hintergrund JPEG-Errors
+Fix: Videosize kann wieder geändert werden.
+Fix: Bug in LineBonus Popup behoben das zu Speicherüberläufen führen kann.
+Fix: Bug in SelectSlide behoben der zu Fehlern mit weniger als 3 optionen führen kann.
+ Automatisches Resizing hinzugefügt
+Fix: Backgrounds can be used now in option Screens, too
+Fix: Unnützer Speicherverbauch wenn ein Song mit Video abgespielt wird. Einige Videodaten blieben im Speicher nachdem der Song beendet wurde.
+ Dies könnte zu einem Out Of Memory Error führen wenn viele Songs mit Video gespielt werden.
+Fix: Einige Speichernutzungs und Ladezeit Updates
+Fix: Falsche Satzübergänge wenn T im Editor benutzt wurde und sich 2 Noten von verschiedenen
+ Sätzen überlagerten.
+Fix: Editor stürzte ab wenn die letzte Note eines Satzes gelöscht wurde.
+Fix: [Midi Converter]Noten wurden mehrmals hinzugefügt wenn eine Datei mehrmals geöffnet wurde
+ oder der Save Button mehrmals gedrückt wurde.
+Fix: [Midi Converter]Satzübergänge werden nun vom Mide Converter automatisch berechnet.
+
+UltraStar 0.5.0 ultra-star.dl.am Mod X-Mas Edition (by Mota und Whiteshark)
+-----------------------------
+Upd: Neue schnellerer und fehlerresistenter Headereinlesefunktion
+Upd: Bewertungs Bar (Singstar Like)
+Upd: PhrasenBonus + Popups
+
+Upd: Skin verschönert
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r10 (by Mota und Whiteshark)
+-----------------------------
+Fix: Ein kleiner Bug bei der Pause Funktion wurde gefixt.
+Fix: Ein Bug im Theme System wurde behoben. (SelectSlide konnte nicht weniger als 3 Einträge enthalten.)
+Fix: Skin, Beschränkung auf 4 Skins aufgehoben
+Fix: Noten Texturen werden anders/besser eingelesen
+
+Upd: Zahlen bei der Songauswahl sind jetzt sinnvoller.
+Upd: Anzahl der Songs die eine Kategorie beinhaltet wird in der Übersicht angezeigt
+Upd: Neuer Notenskin
+
+Upd: LanguageTag + Sortierung
+Upd: Unterstützung der Covers.ini aus 0.5.1 - Für alle Sortier-Funtionen. Die alte Möglichkeit ohne die Covers.ini ist weiterhin möglich, genauso wie eine Kombination beider Methoden.
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r9 (Release by Whiteshark)
+-----------------------------
+
+Upd: BPM und VideoGap Angaben mit Punkt werden jetzt auch eingelesen. Es wird aber in diesem Fall in der Error.log eine meldung mit dem Namen des Fehlerhaften Songs ausgegeben.
+Upd: Sollte beim Einlesen eines Songs(speziell beim Header) ein Fehler auftreten wird in der Error.log der Songname + Zeile ausgegeben.
+
+Upd, Beta: Pause. P drücken und der Song wird pausiert, nocheinmal P und es kann wieder gesungen werden. Noch keine Anzeige ob Pause aktiviert wird, und noch kein Pause Menü.
+
+bekannte Probleme:
+Stellt man die Aufnahme Funktion ein, kommt es zu einem extremen CPU-Zeit verbrauch und es fängt an zu Laggen
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r8b (Release by Whiteshark)
+-----------------------------
+Fix: Random Funktionen funktionieren alle ohne Fehler
+Fix: In der Kategorieauswahl wird jetzt beim Start immer die erste Kategorie angezeigt
+Fix: Musik wird nach Kategoriewechsel korrekt abgespielt
+Fix: Richtiger Text wird jetzt nicht mehr zu falscher Musik abgespielt
+Fix: Nach Beenden eines Songs ist dieser jetzt wieder in der Übersicht angewählt
+Fix: Midi-konvertor Bug behoben (Nur Freestyle Noten anstatt Normalen)
+
+Thx to: dennisthemenace und mota für die super Bug-Reports :P
+
+Upd: doomhammers Cover sind Integriert: thx to doomhammer
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r8a (Release by Whiteshark)
+-----------------------------
+Fix: Theme System konnte nicht ausgewählt werden (workaround: Nur bis zu 4 Themes möglich)
+Fix: Richtige Kategorie wird angezeigt nach Druck von Escape
+
+Upd: Neue Random Funktionen: R + [Strg]: Random in allen Kategorien (Hier wird die Kategorie oben noch falsch angezeigt); R + [Shift]: Zufällige Kategorie
+Upd: Gerade gewählte Kategorie wird oben links in der Ecke gezeigt
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r8 (Release by Whiteshark)
+-----------------------------
+Fix: Creatorbug behoben
+Fix: Wenn Tabs=on kam es manchmal vor das der angewählte Song nicht mit dem Angezeigten übereingestimmt hat
+
+Upd: Theme System komplett
+ -Bei Start nach Themes Suchen
+ -Den ThemeOptions Screen ändern
+Upd: Neue Farben für Themes :)
+Upd: kleine änderungen am Editor
+ -Leerzeichen im Header werden automatisch korrigiert
+ -Header ist nicht mehr Case Sensitive
+
+Upd: Skin Ordner gesäubert, Es gibt jetzt 2 Skins: Motas und der Original Skin
+Upd: Ordner haben ihr eigenes Cover, welches angezeigt wird falls kein spezielles Cover vorhanden ist
+Upd: Der BewertungsText (Ultrastar, Singstar, etc.) kann jetzt übersetzt werden
+
+Upd: Falls eine Sprache nicht komplett ist werden die nicht übersetzten Texte, mit der Englischen Sprachdatei übersetzt. (Falls es zu nicht kompletten Sprachdateien kommt)
+
+Upd: neues Kategorie System:
+ -Wenn eine Kategorie angewählt wird, werden nur die enthaltenden Songs angezeigt.
+ -Mit Escape gehts zurück in die Kategorie Auswahl
+ -Mit Hoch und Runter kann die Kategorie gewechselt werden.
+
+UltraStar 0.5.0 mota patch r7 (Release by Mota)
+-----------------------------
+- Neues Notendesign.
+- versch. Neue Grafiken.
+- Neue Bewertung "Ultrastar" ab 9810 Punkte.
+- Textgröße-Bug im Editor behoben.
+
+UltraStar 0.5.0 mota patch r6 - 17.11.06 (Release by Mota)
+----------------------------------------
+- Editiorfunktionen für Goldene/Freestyle-Noten. (Tasten [G] und [F])
+- Speicherfunktion des Editors angepasst.
+- Verändertes Theme "SingStar".
+
+UltraStar 0.5.0 mota patch r5 - 16.11.06 (Release by Mota)
+----------------------------------------
+- Goldene Noten werden dargestellt
+- Zufallsauswahl verbessert
+
+UltraStar 0.5.0 mota patch r4 (Release by Mota)
+-----------------------------
+- Perfekt-Stern animation
+
+UltraStar 0.5.0 mota patch r3 (Release by Mota)
+-----------------------------
+- Sortierung Title2 und Artist2 -> Zahlen in Ordner "#"
+
+UltraStar 0.5.0 mota patch r2 (Release by Mota)
+-----------------------------
+- Eigene Cover für alle Sortierungen
+
+UltraStar 0.5.0 mota patch (Release by Mota)
+--------------------------
+- Eigene Cover für Sortierung nach Edition.
+
+UltraStar 0.5.0 (by Corvus5)
+--------------------------
+- Original Code \ No newline at end of file
diff --git a/Game/Changelog.txt b/Game/Changelog.txt
new file mode 100644
index 00000000..302d3bff
--- /dev/null
+++ b/Game/Changelog.txt
@@ -0,0 +1,392 @@
+Ultrastar Deluxe v1.0.1a Challenge MOD r6b (17.02.2010)
+-----------------------------
+Fix: (Medley) #Relative tag and medley does not work (for now). Added message and fixed crash.
+Fix: (Videos) Wrong video-aspect (crop) in singscreen.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r6a (16.02.2010)
+-----------------------------
+New: (General) Medley Surprise and Medley Surprise Blind as "Plugin".
+Upd: (Videos) Newer FFmpeg-version.
+Fix: (General) Fixed crashes in song-menu.
+Fix: (Challenge) Deactivating the plugins in challenge-mode.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r6 (15.02.2010)
+-----------------------------
+New: (General) Medley-mode as plugin: medley normal, medley blind and medley no score.
+New: (General) Plugins are choosable in the party-options (space or left/right).
+New: (Medley) You can build up the medley-playlist manually in the song-menu. Add up to 99 songs with F. Delete tehe last added song with Shift+F. You can deactivate the medley-mode if you delete the last song from the medley-playlist.
+Upd: (Challenge) Better choosing of players. No one should sing more then one time more than any other.
+Upd: (Challenge) The choosing of the players will only appear on the actual round.
+Upd: (Help) JumpTo- and Popup-Menu with their own help texts (the help system is still in german, a translation into english will follow soon).
+Upd: (Party) If you skip a song using a joker, the skipped song will not appear again in the same round.
+Upd: (Song-menu) If you use random, the skipped song is not suggested again in the same selection round.
+Fix: (Videos) Fixed video aspect when using two screens.
+
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r5c (06.02.2010)
+-----------------------------
+Upd: (Videos) The aspect-correction will be safed individually for each song in the database.
+Upd: (Videos) Ability to switch-off the videos (option).
+Fix: (Challenge) Medley-symbols are no longer shown in challenge-mode.
+Fix: (Song-menu) Enhanced performance when scrolling with video-preview on.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r5b (05.02.2010)
+-----------------------------
+Upd: (Party) Plugin name is shown in the song selection
+Upd: (Song-menu) Video preview will be faded in
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r5a (05.02.2010)
+-----------------------------
+New: (Song-menu) Video preview (max/min with V)
+Upd: (General) Italian translation (thx to Claudio)
+Fix: (Videos) Videos should be in sync now.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r5 (23.01.2010):
+-----------------------------
+New: (General) First version of a help-system, but there is no english translation so far.
+New: (Medley) Countdown during fade-in in medley mode.
+Upd: (Party) You can play now up to 32 rounds instead of 7.
+Fix: (Challenge) Fix double scores und wrong winner when using plugins.
+Fix: (Editor) Correction of FixTimings: If the space between two sentences were 4 beats than the beginning of next sentence was on first note.
+Fix: (Editor) Deleting of Medley-tags is now possible.
+Fix: (Editor) If note-length was changed and you have tried to play that note, then the focus moved to next sentence.
+Fix: (Medley) Fix fadeIn if start was on first note of song.
+Fix: (Medley) Excluding freestyle-notes from calculation of chorus-tags.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4g (13.01.2010):
+-----------------------------
+Fix: (Videos) Removed fast-forwarding effect at the beginning of some songs. Now more videos should run without problems. Problems with fast-forwarding and synchronicity remain for some videos. Those videos are mostly poorly coded or wrongly cut.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4f (13.01.2010):
+-----------------------------
+Fix: (Editor) Removed line jump when notes where only touching.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4e (12.01.2010):
+-----------------------------
+Upd: (Editor) Changed glary blue (eye cancer provoking) background color.
+Fix: (Editor) Midi notes were note played correctly and caused instability.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4d (12.01.2010):
+-----------------------------
+Fix: (Editor) TXTs were sometimes destroyed when saving (stupid mistake...).
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4c (11.01.2010):
+-----------------------------
+Fix: (Editor) Playing a single note in the editor caused the current selection to jump away.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4b (10.01.2010):
+-----------------------------
+Upd: (General) Duplicate line breaks in TXT files are now detected and are logged in the error.log.
+Upd: (Editor) The currently selected note moves along when an entire lyrics line is played with P. It jumps back to the last selected note afterwards.
+Upd: (Editor) The current note is now highlighted in red.
+Upd: (Editor) ESC in text edit mode (F4) now longer exits the editor completely. Instead, it is used to undo the changes made to the currently edited syllable.
+Upd: (Editor) Medley tags are now in plain language instead of "MS" and "ME"
+Upd: (Editor) The medley section can be played in one piece with ALT+J.
+Upd: (Editor) If medley tags are set/reset or if you jump to the medley tags, the current length of the medley in seconeds is displayed at the bottom.
+Upd: (Editor) In addition to the exisiting P+(Shift / Strg), the ALT key can be pressed. The function of the existing modifiers remains unchanged, however the song is played from the current line until the very end.
+Upd: (Medley) Song artist and title are only visible during fade-in.
+Upd: (Videos) Updated FFmpeg version.
+Fix: (General) The time did not count backwards in party and challenge mode.
+Fix: (General) Pop-ups (line bonuses) flew out diagonally.
+Fix: (Challenge) Sometimes the wrong player was incorrectly declared the winner, when plugins were used.
+Fix: (Editor) When changing lyrics, the entire lyrics line instead of only the currently edited syllable is updated.
+Fix: (Editor) Fixed bug then saving: errors occured during song selection afterwards.
+Fix: (Editor) Now all keyboard characters can be used. Before the fix, "ö", "ü", "." and "'" (apostrophe), amongst others, did not work.
+Fix: (Medley) Fade out was not always optimal.
+Fix: (Videos) Aspect ratio is now successfully loaded from the INI.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4a (08.01.2010):
+-----------------------------
+Fix: (Fading) Music will be faded out after quitting the top screen in challenge mode.
+Fix: (Fading) In the song selection, the music sometimes clanked.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4 (07.01.2010):
+-----------------------------
+New: (Editor) Support of the PREVIEW tag. Set tag with K, jump to preview with SHIFT+K. If this tag is set, the song preview in the song selection starts with this time stamp. Tag is compatible with the PREVIEW tag from Ultrastar version 0.7.
+New: (Editor) Support of medley tags. Set/reset medley start tag with A, set/reset medley end tag with SHIFT+A. Jump to medley start with J, jump to medley end with SHIFT+J. Medley tags refer to beats. The medley start tag always coincides with the beginning of a note. The medley end tag always coincides with the end of a note (note start beat + note length). The default fade in and fade out times are 8 and 4 seconds, respectively.
+New: (Medley) Medley mode: Sing chorus of up to five different songs subsequently. As long as no medley tags are set, the program will try to calculate medley sections automatically (works particularly well with pop songs). These sections can then be corrected in the song editor. Start of a single tagged chorus with S, of a calculated chorus with SHIFT+S. Up to five songs of one folder/category with D and SHIFT+D, respectively. Applying this to a category/folder, the playlist will be a mix of all folders.
+New: (Videos) Aspect ratio of video switchable while singing with the A key (Stretch, Crop, LetterBox). Current selection will be displayed at the top of the singscreen for 3 seconds when switched.
+Upd: (General) During the diplay of the scorescreen and the highscore screen, the current song is played. Switchable in medley mode.
+Upd: (Editor) Exiting the editor is only possible using the ESC key.
+Upd: (Editor) Visual/cosmetic enhancements.
+Upd: (Editor) Reload song with R.
+Upd: (Medley) FadeIn and FadeOut will always be placed on the beginning and the end of a complete lyric line respectively.
+Upd: (Stats) "Highscores" include dates. "Beste singers" includes the informatin, how many times one has sung the song.
+Fix: (General) Time progress bar now starts at the very left. Time counts down towards zero.
+Fix: (Videos) Some videos (divx, mp4) started with a freeze image.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r3b (06.01.2010):
+-----------------------------
+Fix: (Videos) With a negative GAP and if a song has played entirely before, the following video was not displayed.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r3a (05.01.2010):
+-----------------------------
+Fix: (Videos) Corrected the processing of the START-tag. Videos are now synchronous again.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r3 (04.01.2010):
+-----------------------------
+Upd: (Challenge) With less than 9 players, unused table elements are hidden.
+Upd: (Challenge) Handicap Modus defused. Now only the last 10 highscores of a player will be taken into account at maximum.
+Upd: (Party) Plugin selection less "random", none will appear more than three times in a row.
+Upd: (Videos) Updated FFmpeg version (through acinerella). Performance and compatibility for video files increased, MKV container format now supported.
+Fix: (Challenge) PARTY_END now also has an entry in the language.txt
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r2 (02.01.2010):
+-----------------------------
+New: (Challenge) Handicap-Mode: if more than 3 highscore entries exist for both players, the player with the lower score will be punished by reducing his score by a certain percentage (makes hardly any sense with the "Hold The Line" mode).
+Fix: (General) Screenshots are working again.
+Fix: (General) Player names are stored in templates in party and challenge mode (ALT+F1..F12).
+Fix: (Challenge) If plugins are disabled, at least the duel plugin has to exist.
+Fix: (ScreenScore) With activated fade and 4 or 6 players, the game crashed after the second song. Even if it didn't crash, there were display problems and highscores were recorded twice.
+Fix: (ScreenScore) Numbers of players 4 to 6 were displayed as P1 to P3
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r1 (31.12.2009):
+-----------------------------
+New: (Challenge) An algorithm assures that a certain player does not sing too many times in a row and is not too often P1 (= can decide on the song)
+New: (Challenge) After each round, a table of rankings is displayed (using the two point soccer system: 2 points (win), 0 points (lose), 1 point (tie))
+New: (Challenge) In a challenge, no song is played twice, unless you're running out of songs!
+New: (Challenge) Each player sings against everybody, if possible. First round, P1 gets to decide on the song, secound round the choice is up to the opponent
+New: (Challenge) Song "selection" with R (random) or J (Joker)
+New: (Challenge) Choose, if plugins should be enabled or disabled (duel plugin is standard)
+New: (Challenge) As long as the random search has not been used, switching between folders (change of category) is possible, unless a playlist is in use or a category is set
+New: (Challenge) Improved "randomness" in the selection of plugins: plugins are chosen less randomly, resulting in a greater diversity of plugins
+New: (Challenge) Player P1, who choses the next song, can use 5 jokers in each round (plus 1 additionally)
+New: (Challenge) No duplicate songs on subsequent random song searches.
+Upd: (Highscores) Top-5 list changed to a Top-8 list.
+Upd: (Highscores) A song has to be sung completely to the last note that it counts as being sung and that it is stored into the database.
+Upd: (Highscores) Scores below 100 will not be stored into the database and the song is not counted as sung.
+Upd: (Highscores) No entries will deleted from the database (only 5 entries per player and song were stored..)
+Upd: (Highscores) Best scores are combined for each player (Top-8 list).
+Upd: (Highscores) Every highscore is stored with corresponding date. Date is displayed in highscore list (display in stats coming soon).
+Upd: (Party) "Cheating" in classic mode using ALT+1, +2, +3
+
+
+UltraStar Deluxe 1.01a
+-----------------------------
+Fix: VideoGap works now again with mpeg videos
+Fix: Video start is calculated correctly now if start tag is used
+
+UltraStar Deluxe 1.01
+-----------------------------
+Upd: SDL-Lib update
+Upd: Bass update
+Upd: New video support (FFMpeg instead of SMPeg)
+ ->nearly all video formats are supported. Better synchronisation of most vids.
+Upd: On demand theme, skin and color changing
+Upd: Some speed improvements
+Upd: Backspace works now like ESC on most screens
+Upd: Editor: Singlenote-playback (SHIFT + Space / CTRL + SHIFT + Space)
+Upd: Editor: More characters work in text-edit-mode e.g. '~'
+Upd: Beautified Deluxe theme.
+ - New textures for the bar
+ - New backgrounds for the Deluxe skins
+ - Color is changeable in Deluxe theme now \o/
+Upd: Executable name changed to USdx.exe
+Upd: New menusounds
+Upd: Added 3 new skins by Skar/Alajasam
+Upd: Added TeamDuell modi-plugin
+
+Add: Installer available
+
+Fix: 4/6 Players: Scores are shown correctly on the scorescreen
+Fix: Double adding of Highscores if screens=2
+Fix: Overlapping of some artists names with songs should be fixed in most cases
+Fix: License and Readme files caused error messages in error.log
+Fix: Some sounds, (mainly the editors 'click' sound) were to quiet
+Fix: Should now work with Girder
+
+UltraStar Deluxe 1.00 (by Ultrastar Deluxe Team)
+-----------------------------
+
+--------------
+Theme System
+--------------
+Upd: New Ultrastar 0.5.1 Skin/Theme Sytem
+Upd: Add ability to 0.5.1 System to load third party Themes to add usability
+Upd: Add ability to change Positions and some other things relating to Covers within the Theme
+Upd: Add ability to add reflections to the Covers
+Upd: New Method for displaying Covers in a Circle. Looks better with many Songs. (Turn Off On within the Theme)
+Upd: Add Equalizer Object to SongScreen
+Upd: Add ability to add reflection to Buttons and Statics (Reflection = 1)
+Upd: Add ability to Group Buttons to a Buttonmenu, see Deluxe Theme Main Menu Tools Collection
+Upd: Add ability to Hide Buttons within Theme. Useful for example for Mainscreen Exit Button
+Upd: Add ability to give Texts a Width, so the Text breaks at the given Position.
+
+--------------
+Recording Options
+--------------
+Upd: Ultrastar 0.5.2 Recording Options added
+Fix: Write Soundcards more then one Time to Ini
+Fix: Use of more then one SingStar Mic. adapter now Possible(2 Soundcards with same Name Patch)
+
+--------------
+Song Screen
+--------------
+Upd: Added Playlist Support
+
+Upd: Song Search (with Screen interface)
+Upd: Jump to Letter Hotkey
+Upd: Menu in Songscreen similar to Singstars
+Upd: Ability to change Playernames before singing
+Upd: Ability to change Song Preview Volume
+Upd: Song Preview Fade in
+
+--------------
+Party Mode
+--------------
+Upd: Added Party Mode:
+ 3 Teams possible with up to 4 Players
+ => total of 12 Players
+Upd: Modi SDK: Possibility to create nearly any Modi with some Programming Skill
+Upd: 4 Custom Party Modi Plugins: Duell, Hold the Line, Until 5000, Blind Mode
+
+--------------
+Effects
+--------------
+Upd: New Perfect Note Effects
+Upd: Add Perfect Sentence Effect
+Upd: Golden Notes now with Singstar like Star Twinkle Effect, instead of just Yellow coloring
+Upd: Add Effect: Golden notes "Glow" when they are hit
+Upd: New Screen Fading Effect: Screen Blurs and "Flys" out of the Screen
+ looks better with every Background. More possibility for Theme Creators
+
+--------------
+Other
+--------------
+Upd: Added Deluxe Theme: Theme that has a look similiar to PS3 Singstar.
+Upd: New Score Saving System (SQLite Based)
+Upd: Statistic Screen with general Statistics and some Tables:
+ Best Scores, Best Singers, Most Popular Songs, Most Popular Bands
+Upd: Add some on Screen Error Messages helping new Peoples
+Upd: Add Advanced Screen with some new Options.
+Upd: Add a Question PopUp before exiting
+Upd: Add ability to scale Background Images in Singscreen to Fullsize
+Upd: Show real Note in Editor (C, F#, etc.)
+Upd: New fonts added
+Upd: Add better support for Command-Line Parameters
+Fix: No crashes caused by corrupted Textfiles anymore.
+ Added inGame Errormessage Popup and Jump Back to Songscreen. So even the Party Mode,
+ isn't interuppted.
+Fix: Workaround for Cover and BG JPG Errors
+Fix: Videosize can now be changed again
+Fix: Bug in LineBonus Popup that can end up in a Memory Overflow
+Fix: Bug in SelectSlide with less then 3 Options, No Overlapping anymore. Automatic resizing
+Fix: Backgrounds can be used now in option Screens, too
+Fix: useless Memory usement when Song with Video is Played. When a Song with Video is played
+ there was some Memory that was not freeed at the End of the Song. This could have caused
+ too much Memory usement when many Songs with Video are Played.
+Fix: Some Changes in Memory usement and better Loading speed.
+Fix: Wrong Timings pressing T in Editor if 2 Notes from different Sentences overlap
+Fix: Editor crashes when last note of a sentence is deleted
+Fix: [Midi Converter]Notes are added more than once when a File is opened twice or the save button is pressed multiple times.
+Fix: [Midi Converter]Sentence Timings are calculated automaticly when Midi File is converted
+
+UltraStar 0.5.0 ultra-star.dl.am Mod X-Mas Edition (by Mota und Whiteshark)
+-----------------------------
+Upd: New faster and Error resistant Header reader
+Upd: Bewertungs Bar (Singstar Like)
+Upd: LineBonus + Popups
+
+Upd: Skin beautified
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r10 (by Mota und Whiteshark)
+-----------------------------
+Fix: Minor Bug in Pause Method fixed.
+Fix: Fixed a Bug in Theme System
+Fix: New Note Texture Reading
+
+Upd: Numbers in SongSelection are now more meaningful
+Upd: Show Count of Songs in Category in Category Overview
+Upd: New Note Texture
+
+Upd: LanguageTag + Sorting
+Upd: Support for the Covers.ini from 0.5.1 - for all sorting options. The old behaviour without Covers.ini is also possible, just as well as a combination of both methods.
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r9 (Release by Whiteshark)
+-----------------------------
+
+Upd: BPM and VideoGap Can now be read, too. But there will be an Errormessage in Error.log
+
+Upd, Beta: Pause. Press P and the Song will be paused, press P again and it will be continued. Pause Display and Menu missing.
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r8b (Release by Whiteshark)
+-----------------------------
+Fix: Random Methods now work without Errors
+Fix: First Category is now shown at Startup.
+Fix: Music is played correctly after categorychange
+Fix: No wrong MP3 playing anymore
+Fix: After exit Singing Mode the Song is chossen in Song Screen
+Fix: Midi-konvertor Bug (Only Freestyle Notes instead of normal)
+
+Thx to: dennisthemenace and mota for Bug-Reports :P
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r8a (Release by Whiteshark)
+-----------------------------
+Fix: Themes could not be Selected (workaround: Only 4 Themes possible)
+Fix: Correct category is displayed after pressing Escape
+
+Upd: new Random functions: R + [Strg]: Random in all Categorys;
+ R + [Shift]: Random Category
+Upd: Chossen Category is displayed in the top left
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r8 (Release by Whiteshark)
+-----------------------------
+Fix: Creatorbug fixed
+Fix: Tabs=on Preview Bug
+
+Upd: Theme System ready
+ -Look for Themes at Startup
+ -ThemeOptions Screen working
+Upd: New Theme Colors :)
+Upd: Little changes at Editor
+ -Spaces in Header are corrected automaticaly
+ -Header is not Case Sensitive anymore
+
+Upd: Skin Folder Cleaned up, There are 2 Skins now: Motas and the Original Skin
+Upd: Categorys have their own noCover Image
+Upd: Rating Text (Ultrastar, Singstar, etc.) can now be Translated
+
+Upd: Inomplete Languages are corrected with Entrys from the English Language File
+
+Upd: new Category System:
+ -If a category is choosen only the Songs from this category are shown
+ -Press Escape to leave a category
+ -Press up or down to change the category.
+
+UltraStar 0.5.0 mota patch r7 (Release by Mota)
+-----------------------------
+- New Note Texture.
+- other new grafics.
+- New rating "Ultrastar" with more than 9810 Points.
+- Textsize-Bug in editor fixed.
+
+UltraStar 0.5.0 mota patch r6 - 17.11.06 (Release by Mota)
+----------------------------------------
+- Editiorfunctions for Golden/Freestyle-Notes. (Press [G] or [F])
+- Saving Methods of Editor changed
+- Changed Theme "SingStar".
+
+UltraStar 0.5.0 mota patch r5 - 16.11.06 (Release by Mota)
+----------------------------------------
+- Goldene Notes are displayed
+- Randomizing improved
+
+UltraStar 0.5.0 mota patch r4 (Release by Mota)
+-----------------------------
+- Perfect-Star animation
+
+UltraStar 0.5.0 mota patch r3 (Release by Mota)
+-----------------------------
+- Sorting Title2 and Artist2 -> Numbers in Category "#"
+
+UltraStar 0.5.0 mota patch r2 (Release by Mota)
+-----------------------------
+- Cover for all Categorys and Sortings can be choosen
+
+UltraStar 0.5.0 mota patch (Release by Mota)
+--------------------------
+- Cover for Edition sorting can be choosen
+
+UltraStar 0.5.0 (by Corvus5)
+--------------------------
+- Original Code \ No newline at end of file
diff --git a/Game/Code/Classes/TextGL.pas b/Game/Code/Classes/TextGL.pas
new file mode 100644
index 00000000..7ebe1151
--- /dev/null
+++ b/Game/Code/Classes/TextGL.pas
@@ -0,0 +1,345 @@
+unit TextGL;
+
+interface
+
+uses gl, SDL, UTexture, Classes, ULog;
+
+procedure BuildFont; // Build Our Bitmap Font
+procedure KillFont; // Delete The Font
+function glTextWidth(text: pchar): real; // Returns Text Width
+procedure glPrintDone(text: pchar; Done: real; ColR, ColG, ColB: real);
+procedure glPrintLetter(letter: char);
+procedure glPrintLetterCut(letter: char; Start, Finish: real);
+procedure glPrint(text: pchar); // Custom GL "Print" Routine
+procedure glPrintCut(text: pchar);
+procedure SetFontPos(X, Y: real); // Sets X And Y
+procedure SetFontSize(Size: real);
+procedure SetFontStyle(Style: integer); // sets active font style (normal, bold, etc)
+procedure SetFontItalic(Enable: boolean); // sets italic type letter (works for all fonts)
+procedure SetFontAspectW(Aspect: real);
+
+type
+ TTextGL = record
+ X: real;
+ Y: real;
+ Text: string;
+ Size: real;
+ ColR: real;
+ ColG: real;
+ ColB: real;
+ end;
+
+ TFont = record
+ Tex: TTexture;
+ Width: array[0..255] of byte;
+ AspectW: real;
+ Centered: boolean;
+ Done: real;
+ Outline: real;
+ Italic: boolean;
+ end;
+
+
+var
+ base: GLuint; // Base Display List For The Font Set
+ Fonts: array of TFont;
+ ActFont: integer;
+ PColR: real; // temps for glPrintDone
+ PColG: real;
+ PColB: real;
+
+implementation
+
+uses UMain, Windows, SysUtils, UGraphic;
+
+procedure BuildFont; // Build Our Bitmap Font
+var
+ font: HFONT; // Windows Font ID
+ h_dc: hdc;
+ Rejestr: TResourceStream;
+ Pet: integer;
+begin
+ ActFont := 0;
+
+ SetLength(Fonts, 5);
+ Fonts[0].Tex := Texture.LoadTexture(true, 'Font', 'PNG', 'Font', 0);
+ Fonts[0].Tex.H := 30;
+ Fonts[0].AspectW := 0.9;
+ Fonts[0].Done := -1;
+ Fonts[0].Outline := 0;
+
+ Fonts[1].Tex := Texture.LoadTexture(true, 'FontB', 'PNG', 'Font', 0);
+ Fonts[1].Tex.H := 30;
+ Fonts[1].AspectW := 1;
+ Fonts[1].Done := -1;
+ Fonts[1].Outline := 0;
+
+ Fonts[2].Tex := Texture.LoadTexture(true, 'FontO', 'PNG', 'Font Outline', 0);
+ Fonts[2].Tex.H := 30;
+ Fonts[2].AspectW := 0.95;
+ Fonts[2].Done := -1;
+ Fonts[2].Outline := 5;
+
+ Fonts[3].Tex := Texture.LoadTexture(true, 'FontO2', 'PNG', 'Font Outline 2', 0);
+ Fonts[3].Tex.H := 30;
+ Fonts[3].AspectW := 0.95;
+ Fonts[3].Done := -1;
+ Fonts[3].Outline := 4;
+
+{ Fonts[4].Tex := Texture.LoadTexture('FontO', 'BMP', 'Arrow', 0); // for score screen
+ Fonts[4].Tex.H := 30;
+ Fonts[4].AspectW := 0.95;
+ Fonts[4].Done := -1;
+ Fonts[4].Outline := 5;}
+
+
+ Rejestr := TResourceStream.Create(HInstance, 'Font', 'FNT');
+ Rejestr.Read(Fonts[0].Width, 256);
+ Rejestr.Free;
+
+ Rejestr := TResourceStream.Create(HInstance, 'FontB', 'FNT');
+ Rejestr.Read(Fonts[1].Width, 256);
+ Rejestr.Free;
+
+ Rejestr := TResourceStream.Create(HInstance, 'FontO', 'FNT');
+ Rejestr.Read(Fonts[2].Width, 256);
+ Rejestr.Free;
+
+ Rejestr := TResourceStream.Create(HInstance, 'FontO2', 'FNT');
+ Rejestr.Read(Fonts[3].Width, 256);
+ Rejestr.Free;
+
+{ Rejestr := TResourceStream.Create(HInstance, 'FontO', 'FNT');
+ Rejestr.Read(Fonts[4].Width, 256);
+ Rejestr.Free;}
+
+ for Pet := 0 to 255 do
+ Fonts[1].Width[Pet] := Fonts[1].Width[Pet] div 2;
+
+ for Pet := 0 to 255 do
+ Fonts[2].Width[Pet] := Fonts[2].Width[Pet] div 2 + 2;
+
+ for Pet := 0 to 255 do
+ Fonts[3].Width[Pet] := Fonts[3].Width[Pet] + 1;
+
+{ for Pet := 0 to 255 do
+ Fonts[4].Width[Pet] := Fonts[4].Width[Pet] div 2 + 2;}
+
+end;
+
+procedure KillFont; // Delete The Font
+begin
+// glDeleteLists(base, 256); // Delete All 96 Characters
+end;
+
+function glTextWidth(text: pchar): real;
+var
+ Letter: char;
+begin
+// Log.LogStatus(Text, 'glTextWidth');
+ Result := 0;
+ while (length(text) > 0) do begin
+ Letter := Text[0];
+ text := pchar(Copy(text, 2, Length(text)-1));
+ Result := Result + Fonts[ActFont].Width[Ord(Letter)] * Fonts[ActFont].Tex.H / 30 * Fonts[ActFont].AspectW;
+ end; // while
+end;
+
+procedure glPrintDone(text: pchar; Done: real; ColR, ColG, ColB: real);
+begin
+ Fonts[ActFont].Done := Done;
+ PColR := ColR;
+ PColG := ColG;
+ PColB := ColB;
+ glPrintCut(text);
+ Fonts[ActFont].Done := -1;
+end;
+
+procedure glPrintLetter(Letter: char);
+var
+ TexX, TexY: real;
+ TexR, TexB: real;
+ FWidth: real;
+ PL, PT: real;
+ PR, PB: real;
+ XItal: real; // X shift for italic type letter
+begin
+ with Fonts[ActFont].Tex do begin
+ FWidth := Fonts[ActFont].Width[Ord(Letter)];
+
+ W := FWidth * (H/30) * Fonts[ActFont].AspectW;
+// H := 30;
+
+ // set texture positions
+ TexX := (ord(Letter) mod 16) * 1/16 + 1/32 - FWidth/1024 - Fonts[ActFont].Outline/1024;
+ TexY := (ord(Letter) div 16) * 1/16 + 2/1024; // 2/1024
+ TexR := (ord(Letter) mod 16) * 1/16 + 1/32 + FWidth/1024 + Fonts[ActFont].Outline/1024;
+ TexB := (1 + ord(Letter) div 16) * 1/16 - 2/1024;
+
+ // set vector positions
+ PL := X - Fonts[ActFont].Outline * (H/30) * Fonts[ActFont].AspectW /2;
+ PT := Y;
+ PR := PL + W + Fonts[ActFont].Outline * (H/30) * Fonts[ActFont].AspectW;
+ PB := PT + H;
+ if Fonts[ActFont].Italic = false then
+ XItal := 0
+ else
+ XItal := 12;
+
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glBindTexture(GL_TEXTURE_2D, TexNum);
+ glBegin(GL_QUADS);
+ glTexCoord2f(TexX, TexY); glVertex2f(PL+XItal, PT);
+ glTexCoord2f(TexX, TexB); glVertex2f(PL, PB);
+ glTexCoord2f(TexR, TexB); glVertex2f(PR, PB);
+ glTexCoord2f(TexR, TexY); glVertex2f(PR+XItal, PT);
+ glEnd;
+ X := X + W;
+ glDisable(GL_BLEND);
+ glDisable(GL_TEXTURE_2D);
+ end; // with
+end;
+
+procedure glPrintLetterCut(letter: char; Start, Finish: real);
+var
+ TexX, TexY: real;
+ TexR, TexB: real;
+ TexTemp: real;
+ FWidth: real;
+ PL, PT: real;
+ PR, PB: real;
+ OutTemp: real;
+ XItal: real;
+begin
+ with Fonts[ActFont].Tex do begin
+ FWidth := Fonts[ActFont].Width[Ord(Letter)];
+
+ W := FWidth * (H/30) * Fonts[ActFont].AspectW;
+// H := 30;
+ OutTemp := Fonts[ActFont].Outline * (H/30) * Fonts[ActFont].AspectW;
+
+ // set texture positions
+ TexX := (ord(Letter) mod 16) * 1/16 + 1/32 - FWidth/1024 - Fonts[ActFont].Outline/1024;
+ TexY := (ord(Letter) div 16) * 1/16 + 2/1024; // 2/1024
+ TexR := (ord(Letter) mod 16) * 1/16 + 1/32 + FWidth/1024 + Fonts[ActFont].Outline/1024;
+ TexB := (1 + ord(Letter) div 16) * 1/16 - 2/1024;
+
+ TexTemp := TexX + Start * (TexR - TexX);
+ TexR := TexX + Finish * (TexR - TexX);
+ TexX := TexTemp;
+
+ // set vector positions
+ PL := X - OutTemp / 2 + OutTemp * Start;
+ PT := Y;
+ PR := PL + (W + OutTemp) * (Finish - Start);
+ PB := PT + H;
+ if Fonts[ActFont].Italic = false then
+ XItal := 0
+ else
+ XItal := 12;
+
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glBindTexture(GL_TEXTURE_2D, TexNum);
+ glBegin(GL_QUADS);
+ glTexCoord2f(TexX, TexY); glVertex2f(PL+XItal, PT);
+ glTexCoord2f(TexX, TexB); glVertex2f(PL, PB);
+ glTexCoord2f(TexR, TexB); glVertex2f(PR, PB);
+ glTexCoord2f(TexR, TexY); glVertex2f(PR+XItal, PT); // not tested with XItal
+ glEnd;
+ X := X + W * (Finish - Start);
+ glDisable(GL_BLEND);
+ glDisable(GL_TEXTURE_2D);
+ end; // with
+
+end;
+
+procedure glPrint(text: pchar); // Custom GL "Print" Routine
+var
+ Letter: char;
+begin
+ if (Text = '') then // If There's No Text
+ Exit; // Do Nothing
+
+ while (length(text) > 0) do begin
+ // cut
+ Letter := Text[0];
+ Text := pchar(Copy(Text, 2, Length(Text)-1));
+
+ // print
+ glPrintLetter(Letter);
+ end; // while
+end;
+
+procedure glPrintCut(text: pchar);
+var
+ Letter: char;
+ PToDo: real;
+ PTotWidth: real;
+ PDoingNow: real;
+ S: string;
+begin
+ if (Text = '') then // If There's No Text
+ Exit; // Do Nothing
+
+ PTotWidth := glTextWidth(Text);
+ PToDo := Fonts[ActFont].Done;
+
+ while (length(text) > 0) do begin
+ // cut
+ Letter := Text[0];
+ Text := pchar(Copy(Text, 2, Length(Text)-1));
+
+ // analyze
+ S := Letter;
+ PDoingNow := glTextWidth(pchar(S)) / PTotWidth;
+
+ // drawing
+ if (PToDo > 0) and (PDoingNow <= PToDo) then
+ glPrintLetter(Letter);
+
+ if (PToDo > 0) and (PDoingNow > PToDo) then begin
+ glPrintLetterCut(Letter, 0, PToDo / PDoingNow);
+ glColor3f(PColR, PColG, PColB);
+ glPrintLetterCut(Letter, PToDo / PDoingNow, 1);
+ end;
+
+ if (PToDo <= 0) then
+ glPrintLetter(Letter);
+
+ PToDo := PToDo - PDoingNow;
+
+ end; // while
+end;
+
+
+procedure SetFontPos(X, Y: real);
+begin
+ Fonts[ActFont].Tex.X := X;
+ Fonts[ActFont].Tex.Y := Y;
+end;
+
+procedure SetFontSize(Size: real);
+begin
+ Fonts[ActFont].Tex.H := 30 * (Size/10);
+end;
+
+procedure SetFontStyle(Style: integer);
+begin
+ ActFont := Style;
+end;
+
+procedure SetFontItalic(Enable: boolean);
+begin
+ Fonts[ActFont].Italic := Enable;
+end;
+
+procedure SetFontAspectW(Aspect: real);
+begin
+ Fonts[ActFont].AspectW := Aspect;
+end;
+
+end.
diff --git a/Game/Code/Classes/UCatCovers.pas b/Game/Code/Classes/UCatCovers.pas
new file mode 100644
index 00000000..34742902
--- /dev/null
+++ b/Game/Code/Classes/UCatCovers.pas
@@ -0,0 +1,143 @@
+unit UCatCovers;
+/////////////////////////////////////////////////////////////////////////
+// UCatCovers by Whiteshark //
+// Class for listing and managing the Category Covers //
+/////////////////////////////////////////////////////////////////////////
+
+interface
+uses UIni;
+
+type
+ TCatCovers = class
+ protected
+ cNames: array [low(ISorting)..high(ISorting)] of array of string;
+ cFiles: array [low(ISorting)..high(ISorting)] of array of string;
+ public
+ constructor Create;
+ procedure Load; //Load Cover aus Cover.ini and Cover Folder
+ procedure Add(Sorting: integer; Name, Filename: string); //Add a Cover
+ function CoverExists(Sorting: integer; Name: string): boolean; //Returns True when a cover with the given Name exists
+ function GetCover(Sorting: integer; Name: string): string; //Returns the Filename of a Cover
+ end;
+
+var
+CatCovers: TCatCovers;
+
+implementation
+uses IniFiles, SysUtils, Classes, UFiles, ULog;
+
+constructor TCatCovers.Create;
+begin
+ Load;
+end;
+
+ //Load Cover aus Cover.ini and Cover Folder
+procedure TCatCovers.Load;
+var
+ Ini: TMemIniFile;
+ SR: TSearchRec;
+ List: TStringlist;
+ I, J: Integer;
+ Name, Filename, Temp: string;
+begin
+try
+ Ini := TMemIniFile.Create(CoversPath + 'covers.ini');
+ List := TStringlist.Create;
+
+ //Add every Cover in Covers Ini for Every Sorting option
+ for I := low(ISorting) to high(ISorting) do
+ begin
+ Ini.ReadSection(ISorting[I], List);
+
+ for J := 0 to List.Count - 1 do
+ Add(I, List.Strings[J], CoversPath + Ini.ReadString(ISorting[I], List.Strings[J], 'NoCover.jpg'));
+ end;
+
+finally
+ Ini.Free;
+ List.Free;
+end;
+
+try
+ //Add Covers from Folder
+ if (FindFirst (CoversPath + '*.jpg', faAnyFile, SR) = 0) then
+ repeat
+ //Add Cover if it doesn't exist for every Section
+ Name := SR.Name;
+ Filename := CoversPath + Name;
+ Delete (Name, length(Name) - 3, 4);
+
+ for I := low(ISorting) to high(ISorting) do
+ begin
+ Temp := Name;
+ if ((I = sTitle) or (I = sTitle2)) and (Pos ('Title', Temp) <> 0) then
+ Delete (Temp, Pos ('Title', Temp), 5)
+ else if (I = sArtist) or (I = sArtist2) and (Pos ('Artist', Temp) <> 0) then
+ Delete (Temp, Pos ('Artist', Temp), 6);
+
+ if not CoverExists(I, Temp) then
+ Add (I, Temp, Filename);
+ end;
+ until FindNext (SR) <> 0;
+
+finally
+ FindClose (SR);
+end;
+
+end;
+
+ //Add a Cover
+procedure TCatCovers.Add(Sorting: integer; Name, Filename: string);
+begin
+if FileExists (Filename) then //If Exists -> Add
+begin
+SetLength (CNames[Sorting], Length(CNames[Sorting]) + 1);
+SetLength (CFiles[Sorting], Length(CNames[Sorting]) + 1);
+
+CNames[Sorting][high(cNames[Sorting])] := Uppercase(Name);
+CFiles[Sorting][high(cNames[Sorting])] := FileName;
+end;
+end;
+
+ //Returns True when a cover with the given Name exists
+function TCatCovers.CoverExists(Sorting: integer; Name: string): boolean;
+var
+I: Integer;
+begin
+Result := False;
+Name := Uppercase(Name); //Case Insensitiv
+
+for I := low(cNames[Sorting]) to high(cNames[Sorting]) do
+begin
+ if (cNames[Sorting][I] = Name) then //Found Name
+ begin
+ Result := true;
+ break; //Break For Loop
+ end;
+end;
+end;
+
+ //Returns the Filename of a Cover
+function TCatCovers.GetCover(Sorting: integer; Name: string): string;
+var
+I: Integer;
+begin
+Result := '';
+Name := Uppercase(Name);
+
+for I := low(cNames[Sorting]) to high(cNames[Sorting]) do
+begin
+ if cNames[Sorting][I] = Name then
+ begin
+ Result := cFiles[Sorting][I];
+ Break;
+ end;
+end;
+
+//No Cover
+if (Result = '') AND (FileExists(CoversPath + 'NoCover.jpg')) then
+ Result := CoversPath + 'NoCover.jpg';
+
+end;
+
+end.
diff --git a/Game/Code/Classes/UCommandLine.pas b/Game/Code/Classes/UCommandLine.pas
new file mode 100644
index 00000000..03229721
--- /dev/null
+++ b/Game/Code/Classes/UCommandLine.pas
@@ -0,0 +1,280 @@
+unit UCommandLine;
+
+interface
+
+type
+ //-----------
+ // TCMDParams - Class Reaads Infos from ParamStr and set some easy Interface Variables
+ //-----------
+ TCMDParams = class
+ private
+ sLanguage: String;
+ sResolution: String;
+ public
+ //Some Boolean Variables Set when Reading Infos
+ Debug: Boolean;
+ Benchmark: Boolean;
+ NoLog: Boolean;
+ FullScreen: Boolean;
+ Joypad: Boolean;
+
+ //Some Value Variables Set when Reading Infos {-1: Not Set, others: Value}
+ Depth: Integer;
+ Screens: Integer;
+
+ //Some Strings Set when Reading Infos {Length=0 Not Set}
+ SongPath: String;
+ ConfigFile: String;
+ ScoreFile: String;
+
+ //Pseudo Integer Values
+ Function GetLanguage: Integer;
+ Property Language: Integer read GetLanguage;
+
+ Function GetResolution: Integer;
+ Property Resolution: Integer read GetResolution;
+
+ //Some Procedures for Reading Infos
+ Constructor Create;
+
+ Procedure ResetVariables;
+ Procedure ReadParamInfo;
+ end;
+
+var
+ Params: TCMDParams;
+
+implementation
+uses SysUtils, UIni;
+
+//-------------
+// Constructor - Create class, Reset Variables and Read Infos
+//-------------
+Constructor TCMDParams.Create;
+begin
+ ResetVariables;
+ ReadParamInfo;
+end;
+
+//-------------
+// ResetVariables - Reset Class Variables
+//-------------
+Procedure TCMDParams.ResetVariables;
+begin
+ Debug := False;
+ Benchmark := False;
+ NoLog := False;
+ FullScreen := False;
+ Joypad := False;
+
+ //Some Value Variables Set when Reading Infos {-1: Not Set, others: Value}
+ sResolution := '';
+ sLanguage := '';
+ Depth := -1;
+ Screens := -1;
+
+ //Some Strings Set when Reading Infos {Length=0 Not Set}
+ SongPath := '';
+ ConfigFile := '';
+ ScoreFile := '';
+end;
+
+//-------------
+// ReadParamInfo - Read Infos from Parameters
+//-------------
+Procedure TCMDParams.ReadParamInfo;
+var
+ I: Integer;
+ PCount: Integer;
+ Command: String;
+begin
+ PCount := ParamCount;
+ //Log.LogError('ParamCount: ' + Inttostr(PCount));
+
+ //Check all Parameters
+ For I := 1 to PCount do
+ begin
+ Command := Paramstr(I);
+ //Log.LogError('Start parsing Command: ' + Command);
+ //Is String Parameter ?
+ if (Length(Command) > 1) AND (Command[1] = '-') then
+ begin
+ //Remove - from Command
+ Command := Lowercase(Trim(Copy(Command, 2, Length(Command) - 1)));
+ //Log.LogError('Command prepared: ' + Command);
+
+ //Check Command
+
+ // Boolean Triggers:
+ if (Command = 'debug') then
+ Debug := True
+ else if (Command = 'benchmark') then
+ Benchmark := True
+ else if (Command = 'nolog') then
+ NoLog := True
+ else if (Command = 'fullscreen') then
+ Fullscreen := True
+ else if (Command = 'joypad') then
+ Joypad := True
+
+ //Integer Variables
+ else if (Command = 'depth') then
+ begin
+ //Check if there is another Parameter to get the Value from
+ if (PCount > I) then
+ begin
+ Command := ParamStr(I + 1);
+
+ //Check for valid Value
+ If (Command = '16') then
+ Depth := 0
+ Else If (Command = '32') then
+ Depth := 1;
+ end;
+ end
+
+ else if (Command = 'screens') then
+ begin
+ //Check if there is another Parameter to get the Value from
+ if (PCount > I) then
+ begin
+ Command := ParamStr(I + 1);
+
+ //Check for valid Value
+ If (Command = '1') then
+ Screens := 0
+ Else If (Command = '2') then
+ Screens := 1;
+ end;
+ end
+
+ //Pseudo Integer Values
+ else if (Command = 'language') then
+ begin
+ //Check if there is another Parameter to get the Value from
+ if (PCount > I) then
+ begin
+ //Write Value to String
+ sLanguage := Lowercase(ParamStr(I + 1));
+ end;
+ end
+
+ else if (Command = 'resolution') then
+ begin
+ //Check if there is another Parameter to get the Value from
+ if (PCount > I) then
+ begin
+ //Write Value to String
+ sResolution := Lowercase(ParamStr(I + 1));
+ end;
+ end
+
+ //String Values
+ else if (Command = 'songpath') then
+ begin
+ //Check if there is another Parameter to get the Value from
+ if (PCount > I) then
+ begin
+ //Write Value to String
+ SongPath := ParamStr(I + 1);
+ end;
+ end
+
+ else if (Command = 'configfile') then
+ begin
+ //Check if there is another Parameter to get the Value from
+ if (PCount > I) then
+ begin
+ //Write Value to String
+ ConfigFile := ParamStr(I + 1);
+
+ //is this a relative PAth -> then add Gamepath
+ if Not ((Length(ConfigFile) > 2) AND (ConfigFile[2] = ':')) then
+ ConfigFile := ExtractFilePath(ParamStr(0)) + Configfile;
+ end;
+ end
+
+ else if (Command = 'scorefile') then
+ begin
+ //Check if there is another Parameter to get the Value from
+ if (PCount > I) then
+ begin
+ //Write Value to String
+ ScoreFile := ParamStr(I + 1);
+ end;
+ end;
+
+ end;
+
+ end;
+
+{ Log.LogError('Values: ');
+
+ if Debug then
+ Log.LogError('Debug');
+
+ if Benchmark then
+ Log.LogError('Benchmark');
+
+ if NoLog then
+ Log.LogError('NoLog');
+
+ if Fullscreen then
+ Log.LogError('FullScreen');
+
+ if JoyStick then
+ Log.LogError('Joystick');
+
+
+ Log.LogError('Screens: ' + Inttostr(Screens));
+ Log.LogError('Depth: ' + Inttostr(Depth));
+
+ Log.LogError('Resolution: ' + Inttostr(Resolution));
+ Log.LogError('Resolution: ' + Inttostr(Language));
+
+ Log.LogError('sResolution: ' + sResolution);
+ Log.LogError('sLanguage: ' + sLanguage);
+
+ Log.LogError('ConfigFile: ' + ConfigFile);
+ Log.LogError('SongPath: ' + SongPath);
+ Log.LogError('ScoreFile: ' + ScoreFile); }
+
+end;
+
+//-------------
+// GetLanguage - Get Language ID from saved String Information
+//-------------
+Function TCMDParams.GetLanguage: Integer;
+var
+ I: integer;
+begin
+ Result := -1;
+
+ //Search for Language
+ For I := 0 to high(ILanguage) do
+ if (LowerCase(ILanguage[I]) = sLanguage) then
+ begin
+ Result := I;
+ Break;
+ end;
+end;
+
+//-------------
+// GetResolution - Get Resolution ID from saved String Information
+//-------------
+Function TCMDParams.GetResolution: Integer;
+var
+ I: integer;
+begin
+ Result := -1;
+
+ //Search for Resolution
+ For I := 0 to high(IResolution) do
+ if (LowerCase(IResolution[I]) = sResolution) then
+ begin
+ Result := I;
+ Break;
+ end;
+end;
+
+end. \ No newline at end of file
diff --git a/Game/Code/Classes/UCovers.pas b/Game/Code/Classes/UCovers.pas
new file mode 100644
index 00000000..b7bef8e6
--- /dev/null
+++ b/Game/Code/Classes/UCovers.pas
@@ -0,0 +1,226 @@
+unit UCovers;
+
+interface
+uses gl, Windows, Math, Classes, SysUtils, Graphics, UThemes, UTexture;
+
+type
+ TCover = record
+ Name: string;
+ W: word;
+ H: word;
+ Size: integer;
+ Position: integer; // position of picture in the cache file
+// Data: array of byte;
+ end;
+
+ TCovers = class
+ Cover: array of TCover;
+ W: word;
+ H: word;
+ Size: integer;
+ Data: array of byte;
+ WritetoFile: Boolean;
+
+ constructor Create;
+ procedure Load;
+ procedure Save;
+ procedure AddCover(Name: string);
+ function CoverExists(Name: string): boolean;
+ function CoverNumber(Name: string): integer;
+ procedure PrepareData(Name: string);
+ end;
+
+var
+ Covers: TCovers;
+
+implementation
+uses UFiles, ULog, DateUtils;
+
+constructor TCovers.Create;
+begin
+ W := 128;
+ H := 128;
+ Size := W*H*3;
+ Load;
+ WritetoFile := True;
+end;
+
+procedure TCovers.Load;
+var
+ F: File;
+ C: integer; // cover number
+ W: word;
+ H: word;
+ Bits: byte;
+ NLen: word;
+ Name: string;
+// Data: array of byte;
+begin
+ if FileExists(GamePath + 'covers.cache') then begin
+ AssignFile(F, GamePath + 'covers.cache');
+ Reset(F, 1);
+
+ WritetoFile := not FileIsReadOnly(GamePath + 'covers.cache');
+
+ SetLength(Cover, 0);
+
+ while not EOF(F) do begin
+ SetLength(Cover, Length(Cover)+1);
+
+ BlockRead(F, W, 2);
+ Cover[High(Cover)].W := W;
+
+ BlockRead(F, H, 2);
+ Cover[High(Cover)].H := H;
+
+ BlockRead(F, Bits, 1);
+
+ Cover[High(Cover)].Size := W * H * (Bits div 8);
+
+ // test
+// W := 128;
+// H := 128;
+// Bits := 24;
+// Seek(F, FilePos(F) + 3);
+
+ BlockRead(F, NLen, 2);
+ SetLength(Name, NLen);
+
+ BlockRead(F, Name[1], NLen);
+ Cover[High(Cover)].Name := Name;
+
+ Cover[High(Cover)].Position := FilePos(F);
+ Seek(F, FilePos(F) + W*H*(Bits div 8));
+
+// SetLength(Cover[High(Cover)].Data, W*H*(Bits div 8));
+// BlockRead(F, Cover[High(Cover)].Data[0], W*H*(Bits div 8));
+
+ end;
+
+ CloseFile(F);
+ end; // fileexists
+end;
+
+procedure TCovers.Save;
+var
+ F: File;
+ C: integer; // cover number
+ W: word;
+ H: word;
+ NLen: word;
+ Bits: byte;
+begin
+{ AssignFile(F, GamePath + 'covers.cache');
+ Rewrite(F, 1);
+
+ Bits := 24;
+ for C := 0 to High(Cover) do begin
+ W := Cover[C].W;
+ H := Cover[C].H;
+
+ BlockWrite(F, W, 2);
+ BlockWrite(F, H, 2);
+ BlockWrite(F, Bits, 1);
+
+ NLen := Length(Cover[C].Name);
+ BlockWrite(F, NLen, 2);
+ BlockWrite(F, Cover[C].Name[1], NLen);
+ BlockWrite(F, Cover[C].Data[0], W*H*(Bits div 8));
+ end;
+
+ CloseFile(F);}
+end;
+
+procedure TCovers.AddCover(Name: string);
+var
+ B: integer;
+ F: File;
+ C: integer; // cover number
+ NLen: word;
+ Bits: byte;
+begin
+ if not CoverExists(Name) then begin
+ SetLength(Cover, Length(Cover)+1);
+ Cover[High(Cover)].Name := Name;
+
+ Cover[High(Cover)].W := W;
+ Cover[High(Cover)].H := H;
+ Cover[High(Cover)].Size := Size;
+
+ // do not copy data. write them directly to file
+// SetLength(Cover[High(Cover)].Data, Size);
+// for B := 0 to Size-1 do
+// Cover[High(Cover)].Data[B] := CacheMipmap[B];
+
+ if WritetoFile then
+ begin
+ AssignFile(F, GamePath + 'covers.cache');
+ if FileExists(GamePath + 'covers.cache') then begin
+ Reset(F, 1);
+ Seek(F, FileSize(F));
+ end else
+ Rewrite(F, 1);
+
+ Bits := 24;
+
+ BlockWrite(F, W, 2);
+ BlockWrite(F, H, 2);
+ BlockWrite(F, Bits, 1);
+
+ NLen := Length(Name);
+ BlockWrite(F, NLen, 2);
+ BlockWrite(F, Name[1], NLen);
+
+ Cover[High(Cover)].Position := FilePos(F);
+ BlockWrite(F, CacheMipmap[0], W*H*(Bits div 8));
+
+ CloseFile(F);
+ end;
+ end
+ else
+ Cover[High(Cover)].Position := 0;
+end;
+
+function TCovers.CoverExists(Name: string): boolean;
+var
+ C: integer; // cover
+begin
+ Result := false;
+ C := 0;
+ while (C <= High(Cover)) and (Result = false) do begin
+ if Cover[C].Name = Name then Result := true;
+ Inc(C);
+ end;
+end;
+
+function TCovers.CoverNumber(Name: string): integer;
+var
+ C: integer;
+begin
+ Result := -1;
+ C := 0;
+ while (C <= High(Cover)) and (Result = -1) do begin
+ if Cover[C].Name = Name then Result := C;
+ Inc(C);
+ end;
+end;
+
+procedure TCovers.PrepareData(Name: string);
+var
+ F: File;
+ C: integer;
+begin
+ if FileExists(GamePath + 'covers.cache') then begin
+ AssignFile(F, GamePath + 'covers.cache');
+ Reset(F, 1);
+
+ C := CoverNumber(Name);
+ SetLength(Data, Cover[C].Size);
+ if Length(Data) < 6 then beep;
+ Seek(F, Cover[C].Position);
+ BlockRead(F, Data[0], Cover[C].Size);
+ CloseFile(F);
+ end;
+end;
+
+end.
diff --git a/Game/Code/Classes/UDLLManager.pas b/Game/Code/Classes/UDLLManager.pas
new file mode 100644
index 00000000..4b8838b9
--- /dev/null
+++ b/Game/Code/Classes/UDLLManager.pas
@@ -0,0 +1,226 @@
+unit UDLLManager;
+
+interface
+uses ModiSDK, UFiles;
+
+type
+ TDLLMan = class
+ private
+ hLib: THandle;
+ P_Init: fModi_Init;
+ P_Draw: fModi_Draw;
+ P_Finish: fModi_Finish;
+ P_RData: pModi_RData;
+ public
+ Plugins: array of TPluginInfo;
+ PluginPaths: array of String;
+ Selected: ^TPluginInfo;
+
+ constructor Create;
+
+ procedure GetPluginList;
+ procedure ClearPluginInfo(No: Cardinal);
+ function LoadPluginInfo(Filename: String; No: Cardinal): boolean;
+
+ function LoadPlugin(No: Cardinal): boolean;
+ procedure UnLoadPlugin;
+
+ function PluginInit (const TeamInfo: TTeamInfo; var Playerinfo: TPlayerinfo; const Sentences: TSentences; const LoadTex: fModi_LoadTex; const Print: fModi_Print; LoadSound: fModi_LoadSound; PlaySound: pModi_PlaySound): boolean;
+ function PluginDraw (var Playerinfo: TPlayerinfo; const CurSentence: Cardinal): boolean;
+ function PluginFinish (var Playerinfo: TPlayerinfo): byte;
+ procedure PluginRData (handle: HSTREAM; buffer: Pointer; len: DWORD; user: DWORD);
+ end;
+
+var
+ DLLMan: TDLLMan;
+
+const DLLPath = 'Plugins\';
+
+implementation
+uses Windows, ULog, SysUtils;
+
+
+constructor TDLLMan.Create;
+begin
+ SetLength(Plugins, 0);
+ SetLength(PluginPaths, Length(Plugins));
+ GetPluginList;
+end;
+
+procedure TDLLMan.GetPluginList;
+var
+ SR: TSearchRec;
+begin
+
+ if FindFirst(DLLPath + '*.dll', faAnyFile , SR) = 0 then
+ begin
+ repeat
+ SetLength(Plugins, Length(Plugins)+1);
+ SetLength(PluginPaths, Length(Plugins));
+
+ if LoadPluginInfo(SR.Name, High(Plugins)) then //Loaded succesful
+ begin
+ PluginPaths[High(PluginPaths)] := SR.Name;
+ end
+ else //Error Loading
+ begin
+ SetLength(Plugins, Length(Plugins)-1);
+ SetLength(PluginPaths, Length(Plugins));
+ end;
+
+ until FindNext(SR) <> 0;
+ FindClose(SR);
+ end;
+end;
+
+procedure TDLLMan.ClearPluginInfo(No: Cardinal);
+begin
+ //Set to Party Modi Plugin
+ Plugins[No].Typ := 8;
+
+ Plugins[No].Name := 'unknown';
+ Plugins[No].NumPlayers := 0;
+
+ Plugins[No].Creator := 'Nobody';
+ Plugins[No].PluginDesc := 'NO_PLUGIN_DESC';
+
+ Plugins[No].LoadSong := True;
+ Plugins[No].ShowScore := True;
+ Plugins[No].ShowBars := False;
+ Plugins[No].ShowNotes := True;
+ Plugins[No].LoadVideo := True;
+ Plugins[No].LoadBack := True;
+
+ Plugins[No].TeamModeOnly := False;
+ Plugins[No].GetSoundData := False;
+ Plugins[No].Dummy := False;
+
+
+ Plugins[No].BGShowFull := False;
+ Plugins[No].BGShowFull_O := True;
+
+ Plugins[No].ShowRateBar:= False;
+ Plugins[No].ShowRateBar_O := True;
+
+ Plugins[No].EnLineBonus := False;
+ Plugins[No].EnLineBonus_O := True;
+end;
+
+function TDLLMan.LoadPluginInfo(Filename: String; No: Cardinal): boolean;
+var
+ hLibg: THandle;
+ Info: pModi_PluginInfo;
+ I: Integer;
+begin
+ Result := False;
+ //Clear Plugin Info
+ ClearPluginInfo(No);
+
+ {//Workaround Plugins Loaded 2 Times
+ For I := low(PluginPaths) to high(PluginPaths) do
+ if (PluginPaths[I] = Filename) then
+ exit; }
+
+ //Load Libary
+ hLibg := LoadLibrary(PChar(DLLPath + Filename));
+ //If Loaded
+ if (hLibg <> 0) then
+ begin
+ //Load Info Procedure
+ @Info := GetProcAddress (hLibg, PChar('PluginInfo'));
+
+ //If Loaded
+ if (@Info <> nil) then
+ begin
+ //Load PluginInfo
+ Info (Plugins[No]);
+ Result := True;
+ end
+ else
+ Log.LogError('Could not Load Plugin "' + Filename + '": Info Procedure not Found');
+
+ FreeLibrary (hLibg);
+ end
+ else
+ Log.LogError('Could not Load Plugin "' + Filename + '": Libary not Loaded');
+end;
+
+function TDLLMan.LoadPlugin(No: Cardinal): boolean;
+begin
+ Result := False;
+ //Load Libary
+ hLib := LoadLibrary(PChar(DLLPath + PluginPaths[No]));
+ //If Loaded
+ if (hLib <> 0) then
+ begin
+ //Load Info Procedure
+ @P_Init := GetProcAddress (hLib, PChar('Init'));
+ @P_Draw := GetProcAddress (hLib, PChar('Draw'));
+ @P_Finish := GetProcAddress (hLib, PChar('Finish'));
+
+ //If Loaded
+ if (@P_Init <> nil) And (@P_Draw <> nil) And (@P_Finish <> nil) then
+ begin
+ Selected := @Plugins[No];
+ Result := True;
+ end
+ else
+ begin
+ Log.LogError('Could not Load Plugin "' + PluginPaths[No] + '": Procedures not Found');
+
+ end;
+ end
+ else
+ Log.LogError('Could not Load Plugin "' + PluginPaths[No] + '": Libary not Loaded');
+end;
+
+procedure TDLLMan.UnLoadPlugin;
+begin
+if (hLib <> 0) then
+ FreeLibrary (hLib);
+
+//Selected := nil;
+@P_Init := nil;
+@P_Draw := nil;
+@P_Finish := nil;
+@P_RData := nil;
+end;
+
+function TDLLMan.PluginInit (const TeamInfo: TTeamInfo; var Playerinfo: TPlayerinfo; const Sentences: TSentences; const LoadTex: fModi_LoadTex; const Print: fModi_Print; LoadSound: fModi_LoadSound; PlaySound: pModi_PlaySound): boolean;
+var
+ Methods: TMethodRec;
+begin
+ Methods.LoadTex := LoadTex;
+ Methods.Print := Print;
+ Methods.LoadSound := LoadSound;
+ Methods.PlaySound := PlaySound;
+
+ if (@P_Init <> nil) then
+ Result := P_Init (TeamInfo, PlayerInfo, Sentences, Methods)
+ else
+ Result := False
+end;
+
+function TDLLMan.PluginDraw (var Playerinfo: TPlayerinfo; const CurSentence: Cardinal): boolean;
+begin
+if (@P_Draw <> nil) then
+ Result := P_Draw (PlayerInfo, CurSentence)
+else
+ Result := False
+end;
+
+function TDLLMan.PluginFinish (var Playerinfo: TPlayerinfo): byte;
+begin
+if (@P_Finish <> nil) then
+ Result := P_Finish (PlayerInfo)
+else
+ Result := 0;
+end;
+
+procedure TDLLMan.PluginRData (handle: HSTREAM; buffer: Pointer; len: DWORD; user: DWORD);
+begin
+if (@P_RData <> nil) then
+ P_RData (handle, buffer, len, user);
+end;
+
+end.
diff --git a/Game/Code/Classes/UDataBase.pas b/Game/Code/Classes/UDataBase.pas
new file mode 100644
index 00000000..580f7144
--- /dev/null
+++ b/Game/Code/Classes/UDataBase.pas
@@ -0,0 +1,500 @@
+unit UDataBase;
+
+interface
+
+uses USongs, SQLiteTable3;
+
+//--------------------
+//DataBaseSystem - Class including all DB Methods
+//--------------------
+type
+ THandicapResult = record
+ P1m: real;
+ P2m: real;
+ end;
+
+ TStatResult = record
+ Case Typ: Byte of
+ 0: (Singer: ShortString; //best scores
+ Score: Word;
+ Difficulty: Byte;
+ SongArtist: ShortString;
+ SongTitle: ShortString;
+ Date: ShortString);
+
+ 1: (Player: ShortString; //best singers
+ AverageScore: Word;
+ SungTimes: Word);
+
+ 2: (Artist: ShortString; //most sung song
+ Title: ShortString;
+ TimesSung: Word);
+
+ 3: (ArtistName: ShortString; //most sung band
+ TimesSungtot: Word);
+ end;
+ AStatResult = Array of TStatResult;
+
+ TDataBaseSystem = class
+ private
+ ScoreDB: TSqliteDatabase;
+ sFilename: string;
+ public
+
+
+ property Filename: String read sFilename;
+
+ Destructor Free;
+
+ Procedure Init(const Filename: string);
+ procedure ReadScore(var Song: TSong);
+ procedure AddScore(var Song: TSong; Level: integer; Name: string; Score: integer; TimeStamp: integer);
+ procedure WriteScore(var Song: TSong);
+
+ Function GetStats(var Stats: AStatResult; const Typ, Count: Byte; const Page: Cardinal; const Reversed: Boolean): Boolean;
+ Function GetTotalEntrys(const Typ: Byte): Cardinal;
+ function FormatDate(time_stamp: integer): String;
+ function GetHandicap(P1: string; P2: string): THandicapResult; //for Handicap-Mode
+ function GetAspect(Artist, Title: string; def: integer): integer;
+ procedure SetAspect(Artist, Title: string; aspect: integer);
+ end;
+
+var
+ DataBase: TDataBaseSystem;
+
+implementation
+
+uses IniFiles, SysUtils, DateUtils, ULanguage;
+
+function TDataBaseSystem.GetHandicap(P1: string; P2: string): THandicapResult;
+const
+ min = 3;
+var
+ P1m, P2m, temp: real;
+ P1c, P2c: integer;
+begin
+ if not Assigned(ScoreDB) then
+ Exit;
+
+ //init
+ Result.P1m := 1;
+ Result.P2m := 1;
+ P1m := 0;
+ P2m := 0;
+ P1c := 0;
+ P2c := 0;
+
+ try
+ P1c := ScoreDB.GetTableValue('SELECT COUNT(`SongID`) FROM `US_Scores` '+
+ 'WHERE `Player` = "' + P1 + '";');
+ P2c := ScoreDB.GetTableValue('SELECT COUNT(`SongID`) FROM `US_Scores` '+
+ 'WHERE `Player` = "' + P2 + '";');
+
+ if (P1c>min) and (P2c>min) then
+ begin
+ P1m := ScoreDB.GetTableFloat('SELECT AVG(`Score`) FROM `US_Scores` '+
+ 'WHERE `Score` IN ('+
+ 'SELECT Score FROM `US_Scores` '+
+ 'WHERE `Player` = "' + P1 + '" ORDER BY `rowid` DESC LIMIT 10);');
+
+ P2m := ScoreDB.GetTableFloat('SELECT AVG(`Score`) FROM `US_Scores` '+
+ 'WHERE `Score` IN ('+
+ 'SELECT Score FROM `US_Scores` '+
+ 'WHERE `Player` = "' + P2 + '" ORDER BY `rowid` DESC LIMIT 10);');
+ end;
+ except
+ P1m := 0;
+ P2m := 0;
+ end;
+
+ if (P1m>0) and (P2m>0) then
+ begin
+ if (P1m>P2m) then
+ begin
+ temp := (P2m/P1m) + (P2m/P1m)*0.2;
+ if temp<=1 then
+ Result.P1m := temp
+ else
+ Result.P1m := 1;
+ end else
+ begin
+ temp := (P1m/P2m) + (P1m/P2m)*0.2;
+ if temp<=1 then
+ Result.P2m := temp
+ else
+ Result.P2m := 1;
+ end;
+ end;
+end;
+
+function TDataBaseSystem.GetAspect(Artist, Title: string; def: integer): integer;
+var
+ ID: Integer;
+
+begin
+ try
+ ID := ScoreDB.GetTableValue('SELECT `ID` FROM `US_Songs` WHERE `Artist` = "' +
+ Artist + '" AND `Title` = "' + Title + '"');
+
+ if ID = 0 then //Song doesn't exist -> Create
+ begin
+ ScoreDB.ExecSQL ('INSERT INTO `US_Songs` ( `ID` , `Artist` , `Title` , `TimesPlayed`, `Aspect` ) '+
+ 'VALUES (NULL , "' + Artist + '", "' + Title + '", "0", "'+ IntToStr(def) +'");');
+ Result := def;
+ end else
+ begin
+ Result := ScoreDB.GetTableValue('SELECT `Aspect` FROM `US_Songs` WHERE `ID` = "' +
+ IntToStr(ID) + '"');
+ end;
+ except
+ Result := def;
+ end;
+end;
+
+procedure TDataBaseSystem.SetAspect(Artist, Title: string; aspect: integer);
+var
+ ID: Integer;
+
+begin
+ try
+ ID := ScoreDB.GetTableValue('SELECT `ID` FROM `US_Songs` WHERE `Artist` = "' +
+ Artist + '" AND `Title` = "' + Title + '"');
+
+ if ID = 0 then //Song doesn't exist -> Create
+ begin
+ ScoreDB.ExecSQL ('INSERT INTO `US_Songs` ( `ID` , `Artist` , `Title` , `TimesPlayed`, `Aspect` ) '+
+ 'VALUES (NULL , "' + Artist + '", "' + Title + '", "0", "'+ IntToStr(Aspect) +'");');
+ end else
+ begin
+
+ //Create new Entry
+ ScoreDB.ExecSQL ('UPDATE `Us_Songs` SET `Aspect` = "' + IntToStr(aspect) + '" WHERE `ID` = "' +
+ IntToStr(ID) + '"');
+ end;
+ except
+
+ end;
+end;
+
+(**
+ * Format a UNIX-Timestamp into DATE (If 0 then '')
+ *)
+function TDataBaseSystem.FormatDate(time_stamp: integer): String;
+var
+ Year, Month, Day: word;
+begin
+ Result:='';
+ try
+ if time_stamp<>0 then
+ begin
+ DecodeDate(UnixToDateTime(time_stamp), Year, Month, Day);
+ Result := Format(Language.Translate('STAT_FORMAT_DATE'), [Day, Month, Year]);
+ end;
+ except
+ on E: EConvertError do
+ //Log.LogError('Error Parsing FormatString "STAT_FORMAT_DATE": ' + E.Message); TODO
+ end;
+end;
+
+
+
+//--------------------
+//Create - Opens Database and Create Tables if not Exist
+//--------------------
+
+Procedure TDataBaseSystem.Init(const Filename: string);
+begin
+ //Open Database
+ ScoreDB := TSqliteDatabase.Create(Filename);
+ sFilename := Filename;
+
+ try
+ //Look for Tables => When not exist Create them
+ if not ScoreDB.TableExists('US_Scores') then
+ ScoreDB.execsql('CREATE TABLE `US_Scores` (`SongID` INT( 11 ) NOT NULL , '+
+ '`Difficulty` INT( 1 ) NOT NULL , `Player` VARCHAR( 150 ) NOT NULL , '+
+ '`Score` INT( 5 ) NOT NULL , `Date` INT NULL)');
+
+ if not ScoreDB.TableExists('US_Songs') then
+ ScoreDB.execsql('CREATE TABLE `US_Songs` (`ID` INTEGER PRIMARY KEY, '+
+ '`Artist` VARCHAR( 255 ) NOT NULL , `Title` VARCHAR( 255 ) NOT NULL , `TimesPlayed` int(5) NOT NULL );');
+
+ //add column date to cUS-Scores
+ if not ScoreDB.ContainsColumn('US_Scores', 'Date') then
+ begin
+ //Log.LogInfo('adding column date to "' + cUS_Scores + '"', 'TDataBaseSystem.Init'); TODO
+ ScoreDB.ExecSQL('ALTER TABLE ' + '`US_Scores`' + ' ADD COLUMN `Date` INT NULL');
+ end;
+
+ //add column aspect to cUS-Songs
+ if not ScoreDB.ContainsColumn('US_Songs', 'Aspect') then
+ begin
+ //0=acoStretch; 1=acoCrop; 2=acoLetterBox
+ ScoreDB.ExecSQL('ALTER TABLE ' + '`US_Songs`' + ' ADD COLUMN `Aspect` INT NULL');
+ end;
+ finally
+ //ScoreDB.Free;
+ end;
+
+end;
+
+//--------------------
+//Free - Frees Database
+//--------------------
+Destructor TDataBaseSystem.Free;
+begin
+ ScoreDB.Free;
+end;
+
+//--------------------
+//ReadScore - Read Scores into SongArray
+//--------------------
+procedure TDataBaseSystem.ReadScore(var Song: TSong);
+var
+ TableData: TSqliteTable;
+ Difficulty: Byte;
+ I: integer;
+ PlayerListed: boolean;
+ DateStr: string;
+
+begin
+ if not Assigned(ScoreDB) then
+ Exit;
+
+ try
+ //Search Song in DB
+ TableData := ScoreDB.GetTable('SELECT `Difficulty`, `Player`, `Score`, `Date` '+
+ 'FROM `us_scores` WHERE '+
+ '`SongID` = (SELECT `ID` FROM `us_songs` WHERE `Artist` = "' +
+ Song.Artist + '" AND `Title` = "' + Song.Title +
+ '" LIMIT 1) ORDER BY `Score` DESC;');
+ //Empty Old Scores
+ SetLength (Song.Score[0], 0); //easy
+ SetLength (Song.Score[1], 0); //medium
+ SetLength (Song.Score[2], 0); //hard
+
+ // Go through all Entrys
+ while (not TableData.EOF) do
+ begin
+ // Add one Entry to Array
+ Difficulty := StrToInt(TableData.FieldAsString(TableData.FieldIndex['Difficulty']));
+ if ((Difficulty >= 0) and (Difficulty <= 2)) and
+ (Length(Song.Score[Difficulty]) < 8) then
+ begin
+ //filter player
+ PlayerListed:=false;
+ if (Length(Song.Score[Difficulty])>0) then
+ begin
+ for I := 0 to Length(Song.Score[Difficulty]) - 1 do
+ begin
+ if (Song.Score[Difficulty, I].Name = TableData.FieldAsString(TableData.FieldIndex['Player'])) then
+ begin
+ PlayerListed:=true;
+ break;
+ end;
+ end;
+ end;
+
+ if not PlayerListed then
+ begin
+ SetLength(Song.Score[Difficulty], Length(Song.Score[Difficulty]) + 1);
+
+ Song.Score[Difficulty, High(Song.Score[Difficulty])].Name :=
+ TableData.FieldAsString(TableData.FieldIndex['Player']);
+ Song.Score[Difficulty, High(Song.Score[Difficulty])].Score :=
+ StrtoInt(TableData.FieldAsString(TableData.FieldIndex['Score']));
+ DateStr := TableData.FieldAsString(TableData.FieldIndex['Date']);
+ if DateStr<>'' then
+ Song.Score[Difficulty, High(Song.Score[Difficulty])].Date :=
+ FormatDate(StrToInt(DateStr))
+ else
+ Song.Score[Difficulty, High(Song.Score[Difficulty])].Date := '??.??.20??';
+ end;
+ end;
+
+ TableData.Next;
+ end; // while
+
+ except
+ for Difficulty := 0 to 2 do
+ begin
+ SetLength(Song.Score[Difficulty], 1);
+ Song.Score[Difficulty, 1].Name := 'Error Reading ScoreDB';
+ end;
+ end;
+
+end;
+
+//--------------------
+//AddScore - Add one new Score to DB
+//--------------------
+procedure TDataBaseSystem.AddScore(var Song: TSong; Level: integer; Name: string; Score: integer; TimeStamp: integer);
+var
+ID: Integer;
+TableData: TSqliteTable;
+begin
+ //ScoreDB := TSqliteDatabase.Create(sFilename);
+ try
+ //Prevent 0 Scores from being added
+ if (Score > 0) then
+ begin
+ try //todo : wrapper shouldn't throw exceptions at all - this fixed a wine bug, thanks linnex! (11.11.07)
+ ID := ScoreDB.GetTableValue('SELECT `ID` FROM `US_Songs` WHERE `Artist` = "' + Song.Artist + '" AND `Title` = "' + Song.Title + '"');
+ if ID = 0 then //Song doesn't exist -> Create
+ begin
+ ScoreDB.ExecSQL ('INSERT INTO `US_Songs` ( `ID` , `Artist` , `Title` , `TimesPlayed` ) '+
+ 'VALUES (NULL , "' + Song.Artist + '", "' + Song.Title + '", "0");');
+ ID := ScoreDB.GetTableValue('SELECT `ID` FROM `US_Songs` WHERE `Artist` = "' + Song.Artist + '" AND `Title` = "' + Song.Title + '"');
+
+ if ID = 0 then //Could not Create Table
+ exit;
+ end;
+
+ //Create new Entry
+ ScoreDB.ExecSQL('INSERT INTO `US_Scores` ( `SongID` , `Difficulty` , `Player` , `Score` , `Date` ) '+
+ 'VALUES ("' + InttoStr(ID) + '", "' + InttoStr(Level) + '", "' +
+ Name + '", "' + InttoStr(Score) + '","' + InttoStr(TimeStamp) + '");');
+
+ {
+ //Delete Last Position when there are more than 5 Entrys
+ if ScoreDB.GetTableValue('SELECT COUNT(`SongID`) FROM `US_Scores` WHERE `SongID` = "' + InttoStr(ID) + '" AND `Difficulty` = "' + InttoStr(Level) +'"') > 5 then
+ begin
+ TableData := ScoreDB.GetTable('SELECT `Player`, `Score` FROM `US_Scores` WHERE SongID = "' + InttoStr(ID) + '" AND `Difficulty` = "' + InttoStr(Level) +'" ORDER BY `Score` ASC LIMIT 1');
+ ScoreDB.ExecSQL('DELETE FROM `US_Scores` WHERE SongID = "' + InttoStr(ID) + '" AND `Difficulty` = "' + InttoStr(Level) +'" AND `Player` = "' + TableData.FieldAsString(TableData.FieldIndex['Player']) + '" AND `Score` = "' + TableData.FieldAsString(TableData.FieldIndex['Score']) + '"');
+ end; }
+ except
+ // katze!
+ end;
+ end;
+ finally
+ //ScoreDB.Free;
+ end;
+end;
+
+//--------------------
+//WriteScore - Not needed with new System; But used for Increment Played Count
+//--------------------
+procedure TDataBaseSystem.WriteScore(var Song: TSong);
+begin
+ try
+ //Increase TimesPlayed
+ ScoreDB.ExecSQL ('UPDATE `us_songs` SET `TimesPlayed` = `TimesPlayed` + "1" WHERE `Title` = "' + Song.Title + '" AND `Artist` = "' + Song.Artist + '";');
+ except
+
+ end;
+end;
+
+//--------------------
+//GetStats - Write some Stats to Array, Returns True if Chossen Page has Entrys
+//Case Typ of
+//0 - Best Scores
+//1 - Best Singers
+//2 - Most sung Songs
+//3 - Most popular Band
+//--------------------
+Function TDataBaseSystem.GetStats(var Stats: AStatResult; const Typ, Count: Byte; const Page: Cardinal; const Reversed: Boolean): Boolean;
+var
+ Query: String;
+ TableData: TSqliteTable;
+ DateStr: String;
+begin
+ Result := False;
+
+ if (Length(Stats) < Count) then
+ Exit;
+
+ {Todo:
+ Add Prevention that only Players with more than 5 Scores are Selected at Typ 2}
+
+ //Create Query
+ Case Typ of
+ 0: Query := 'SELECT `Player` , `Difficulty` , `Score` , `Artist` , `Title` , `Date` FROM `US_Scores` INNER JOIN `US_Songs` ON (`SongID` = `ID`) ORDER BY `Score`';
+ 1: Query := 'SELECT `Player` , ROUND (Sum(`Score`) / COUNT(`Score`)), COUNT(`rowid`) FROM `US_Scores` GROUP BY `Player` ORDER BY (Sum(`Score`) / COUNT(`Score`))';
+ 2: Query := 'SELECT `Artist` , `Title` , `TimesPlayed` FROM `US_Songs` ORDER BY `TimesPlayed`';
+ 3: Query := 'SELECT `Artist` , Sum(`TimesPlayed`) FROM `US_Songs` GROUP BY `Artist` ORDER BY Sum(`TimesPlayed`)';
+ end;
+
+ //Add Order Direction
+ If Reversed then
+ Query := Query + ' ASC'
+ else
+ Query := Query + ' DESC';
+
+ //Add Limit
+ Query := Query + ' LIMIT ' + InttoStr(Count * Page) + ', ' + InttoStr(Count) + ';';
+
+ //Execute Query
+ //try
+ TableData := ScoreDB.GetTable(Query);
+ {except
+ exit;
+ end;}
+
+ //if Result empty -> Exit
+ if (TableData.RowCount < 1) then
+ exit;
+
+ //Copy Result to Stats Array
+ while not TableData.Eof do
+ begin
+ Stats[TableData.Row].Typ := Typ;
+
+ Case Typ of
+ 0:begin
+ Stats[TableData.Row].Singer := TableData.Fields[0];
+
+ Stats[TableData.Row].Difficulty := StrtoIntDef(TableData.Fields[1], 0);
+
+ Stats[TableData.Row].Score := StrtoIntDef(TableData.Fields[2], 0){TableData.FieldAsInteger(2)};
+ Stats[TableData.Row].SongArtist := TableData.Fields[3];
+ Stats[TableData.Row].SongTitle := TableData.Fields[4];
+ DateStr := TableData.Fields[5];
+ if DateStr<>'' then
+ Stats[TableData.Row].Date := FormatDate(StrToInt(DateStr))
+ else
+ Stats[TableData.Row].Date := '??.??.20??';
+ end;
+
+ 1:begin
+ Stats[TableData.Row].Player := TableData.Fields[0];
+ Stats[TableData.Row].AverageScore := StrtoIntDef(TableData.Fields[1], 0);
+ Stats[TableData.Row].SungTimes := StrtoIntDef(TableData.Fields[2], 0);
+ end;
+
+ 2:begin
+ Stats[TableData.Row].Artist := TableData.Fields[0];
+ Stats[TableData.Row].Title := TableData.Fields[1];
+ Stats[TableData.Row].TimesSung := StrtoIntDef(TableData.Fields[2], 0);
+ end;
+
+ 3:begin
+ Stats[TableData.Row].ArtistName := TableData.Fields[0];
+ Stats[TableData.Row].TimesSungtot := StrtoIntDef(TableData.Fields[1], 0);
+ end;
+
+ end;
+
+ TableData.Next;
+ end;
+
+ Result := True;
+end;
+
+//--------------------
+//GetTotalEntrys - Get Total Num of entrys for a Stats Query
+//--------------------
+Function TDataBaseSystem.GetTotalEntrys(const Typ: Byte): Cardinal;
+var Query: String;
+begin
+ //Create Query
+ Case Typ of
+ 0: Query := 'SELECT COUNT(`SongID`) FROM `US_Scores`;';
+ 1: Query := 'SELECT COUNT(DISTINCT `Player`) FROM `US_Scores`;';
+ 2: Query := 'SELECT COUNT(`ID`) FROM `US_Songs`;';
+ 3: Query := 'SELECT COUNT(DISTINCT `Artist`) FROM `US_Songs`;';
+ end;
+
+ Result := ScoreDB.GetTableValue(Query);
+end;
+
+end.
diff --git a/Game/Code/Classes/UDraw.pas b/Game/Code/Classes/UDraw.pas
new file mode 100644
index 00000000..5b0a284c
--- /dev/null
+++ b/Game/Code/Classes/UDraw.pas
@@ -0,0 +1,1715 @@
+unit UDraw;
+
+interface
+uses UThemes, ModiSDK, UGraphicClasses;
+
+procedure SingDraw;
+procedure SingModiDraw (PlayerInfo: TPlayerInfo);
+procedure SingDrawBackground;
+procedure SingDrawOscilloscope(X, Y, W, H: real; NrSound: integer);
+procedure SingDrawNoteLines(Left, Top, Right: real; Space: integer);
+procedure SingDrawBeatDelimeters(Left, Top, Right: real; NrCzesci: integer);
+procedure SingDrawCzesc(Left, Top, Right: real; NrCzesci: integer; Space: integer);
+procedure SingDrawPlayerCzesc(X, Y, W: real; NrGracza: integer; Space: integer);
+procedure SingDrawPlayerBGCzesc(Left, Top, Right: real; NrCzesci, NrGracza: integer; Space: integer);
+
+// TimeBar mod
+procedure SingDrawTimeBar();
+// eoa TimeBar mod
+
+{ for no use since we have UGraphicClasses
+procedure SingDrawStar(X, Y, A: real);
+procedure SingGoldenStar(X, Y, A: real);
+}
+// The Singbar
+procedure SingDrawSingbar(X, Y, W, H: real; Percent: integer);
+
+//Phrasen Bonus - Line Bonus
+procedure SingDrawLineBonus( const X, Y: Single; Color: TRGB; Alpha: Single; Text: string; Age: Integer);
+
+//Draw Editor NoteLines
+procedure EditDrawCzesc(Left, Top, Right: real; NrCzesci: integer; Space: integer);
+
+
+type
+ TRecR = record
+ Top: real;
+ Left: real;
+ Right: real;
+ Bottom: real;
+
+ Width: real;
+ WMid: real;
+ Height: real;
+ HMid: real;
+
+ Mid: real;
+ end;
+
+var
+ NotesW: real;
+ NotesH: real;
+ Starfr: integer;
+ StarfrG: integer;
+
+
+
+ //SingBar Mod
+ TickOld: cardinal;
+ TickOld2:cardinal;
+ //end Singbar Mod
+
+
+
+
+const
+ Przedz = 32;
+
+implementation
+
+uses
+ Windows,
+ gl,
+ UGraphic,
+ SysUtils,
+ UMusic,
+ URecord,
+ ULog,
+ UScreenSing,
+ UScreenSingModi,
+ ULyrics,
+ UMain,
+ TextGL,
+ UTexture,
+ UDrawTexture,
+ UIni,
+ USongs,
+ Math,
+ UDLLManager;
+
+procedure SingDrawBackground;
+var
+ Rec: TRecR;
+ TexRec: TRecR;
+begin
+ if ScreenSing.Tex_Background.TexNum >= 1 then begin
+
+ glClearColor (1, 1, 1, 1);
+ glColor4f (1, 1, 1, 1);
+
+ if (Ini.MovieSize < 1) then //HalfSize BG
+ begin
+ (* half screen + gradient *)
+ Rec.Top := 110; // 80
+ Rec.Bottom := Rec.Top + 20;
+ Rec.Left := 0;
+ Rec.Right := 800;
+
+ TexRec.Top := (Rec.Top / 600) * ScreenSing.Tex_Background.TexH;
+ TexRec.Bottom := (Rec.Bottom / 600) * ScreenSing.Tex_Background.TexH;
+ TexRec.Left := 0;
+ TexRec.Right := ScreenSing.Tex_Background.TexW;
+
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, ScreenSing.Tex_Background.TexNum);
+ glEnable(GL_BLEND);
+ glBegin(GL_QUADS);
+ (* gradient draw *)
+ (* top *)
+ glColor4f(1, 1, 1, 0);
+ glTexCoord2f(TexRec.Right, TexRec.Top); glVertex2f(Rec.Right, Rec.Top);
+ glTexCoord2f(TexRec.Left, TexRec.Top); glVertex2f(Rec.Left, Rec.Top);
+ glColor4f(1, 1, 1, 1);
+ glTexCoord2f(TexRec.Left, TexRec.Bottom); glVertex2f(Rec.Left, Rec.Bottom);
+ glTexCoord2f(TexRec.Right, TexRec.Bottom); glVertex2f(Rec.Right, Rec.Bottom);
+ (* mid *)
+ Rec.Top := Rec.Bottom;
+ Rec.Bottom := 490 - 20; // 490 - 20
+ TexRec.Top := TexRec.Bottom;
+ TexRec.Bottom := (Rec.Bottom / 600) * ScreenSing.Tex_Background.TexH;
+ glTexCoord2f(TexRec.Left, TexRec.Top); glVertex2f(Rec.Left, Rec.Top);
+ glTexCoord2f(TexRec.Left, TexRec.Bottom); glVertex2f(Rec.Left, Rec.Bottom);
+ glTexCoord2f(TexRec.Right, TexRec.Bottom); glVertex2f(Rec.Right, Rec.Bottom);
+ glTexCoord2f(TexRec.Right, TexRec.Top); glVertex2f(Rec.Right, Rec.Top);
+ (* bottom *)
+ Rec.Top := Rec.Bottom;
+ Rec.Bottom := 490; // 490
+ TexRec.Top := TexRec.Bottom;
+ TexRec.Bottom := (Rec.Bottom / 600) * ScreenSing.Tex_Background.TexH;
+ glTexCoord2f(TexRec.Right, TexRec.Top); glVertex2f(Rec.Right, Rec.Top);
+ glTexCoord2f(TexRec.Left, TexRec.Top); glVertex2f(Rec.Left, Rec.Top);
+ glColor4f(1, 1, 1, 0);
+ glTexCoord2f(TexRec.Left, TexRec.Bottom); glVertex2f(Rec.Left, Rec.Bottom);
+ glTexCoord2f(TexRec.Right, TexRec.Bottom); glVertex2f(Rec.Right, Rec.Bottom);
+
+ glEnd;
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+ end
+ else //Full Size BG
+ begin
+ glEnable(GL_TEXTURE_2D);
+ glBindTexture(GL_TEXTURE_2D, ScreenSing.Tex_Background.TexNum);
+ //glEnable(GL_BLEND);
+ glBegin(GL_QUADS);
+
+ glTexCoord2f(0, 0); glVertex2f(0, 0);
+ glTexCoord2f(0, ScreenSing.Tex_Background.TexH); glVertex2f(0, 600);
+ glTexCoord2f( ScreenSing.Tex_Background.TexW, ScreenSing.Tex_Background.TexH); glVertex2f(800, 600);
+ glTexCoord2f( ScreenSing.Tex_Background.TexW, 0); glVertex2f(800, 0);
+
+ glEnd;
+ glDisable(GL_TEXTURE_2D);
+ //glDisable(GL_BLEND);
+ end;
+ end;
+end;
+
+procedure SingDrawOscilloscope(X, Y, W, H: real; NrSound: integer);
+var
+ Pet: integer;
+begin;
+// Log.LogStatus('Oscilloscope', 'SingDraw');
+ glColor3f(Skin_OscR, Skin_OscG, Skin_OscB);
+ {if (ParamStr(1) = '-black') or (ParamStr(1) = '-fsblack') then
+ glColor3f(1, 1, 1); }
+
+ glBegin(GL_LINE_STRIP);
+ glVertex2f(X, -Sound[NrSound].BufferArray[1] / $10000 * H + Y + H/2);
+ for Pet := 2 to Sound[NrSound].n div 1 do begin
+ glVertex2f(X + (Pet-1) * W / (Sound[NrSound].n - 1),
+ -Sound[NrSound].BufferArray[Pet] / $10000 * H + Y + H/2);
+ end;
+ glEnd;
+end;
+
+procedure SingDrawNoteLines(Left, Top, Right: real; Space: integer);
+var
+ Pet: integer;
+begin
+ glEnable(GL_BLEND);
+ glColor4f(Skin_P1_LinesR, Skin_P1_LinesG, Skin_P1_LinesB, 0.4);
+ glBegin(GL_LINES);
+ for Pet := 0 to 9 do begin
+ glVertex2f(Left, Top + Pet * Space);
+ glVertex2f(Right, Top + Pet * Space);
+ end;
+ glEnd;
+ glDisable(GL_BLEND);
+end;
+
+procedure SingDrawBeatDelimeters(Left, Top, Right: real; NrCzesci: integer);
+var
+ Pet: integer;
+ TempR: real;
+begin
+ TempR := (Right-Left) / (Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt].Koniec - Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt].StartNote);
+ glEnable(GL_BLEND);
+ glBegin(GL_LINES);
+ for Pet := Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt].StartNote to Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt].Koniec do begin
+ if (Pet mod Czesci[NrCzesci].Resolution) = Czesci[NrCzesci].NotesGAP then
+ glColor4f(0, 0, 0, 1)
+ else
+ glColor4f(0, 0, 0, 0.3);
+ glVertex2f(Left + TempR * (Pet - Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt].StartNote), Top);
+ glVertex2f(Left + TempR * (Pet - Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt].StartNote), Top + 135);
+ end;
+ glEnd;
+ glDisable(GL_BLEND);
+end;
+
+// draw blank Notebars
+procedure SingDrawCzesc(Left, Top, Right: real; NrCzesci: integer; Space: integer);
+var
+ Rec: TRecR;
+ Pet: integer;
+ TempR: real;
+ R,G,B: real;
+
+ GoldenStarPos : real;
+begin
+ glColor3f(1, 1, 1);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ TempR := (Right-Left) / (Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt].Koniec - Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt].StartNote);
+ with Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt] do begin
+ for Pet := 0 to HighNut do begin
+ with Nuta[Pet] do begin
+ if not FreeStyle then begin
+
+
+ if Ini.EffectSing = 0 then
+ // If Golden note Effect of then Change not Color
+ begin
+ case Wartosc of
+ 1: glColor4f(1, 1, 1, 0.85);
+ 2: glColor4f(1, 1, 0.3, 0.85); // no stars, paint yellow -> glColor4f(1, 1, 0.3, 0.85);
+ end; // case
+ end //Else all Notes same Color
+ else
+ glColor4f(1, 1, 1, 0.85);
+
+ // lewa czesc - left part
+ Rec.Left := (Start-Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt].StartNote) * TempR + Left + 0.5 + 10*ScreenX;
+ Rec.Right := Rec.Left + NotesW;
+ Rec.Top := Top - (Ton-BaseNote)*Space/2 - NotesH;
+ Rec.Bottom := Rec.Top + 2 * NotesH;
+ glBindTexture(GL_TEXTURE_2D, Tex_Left[Color].TexNum);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0); glVertex2f(Rec.Left, Rec.Top);
+ glTexCoord2f(0, 1); glVertex2f(Rec.Left, Rec.Bottom);
+ glTexCoord2f(1, 1); glVertex2f(Rec.Right, Rec.Bottom);
+ glTexCoord2f(1, 0); glVertex2f(Rec.Right, Rec.Top);
+ glEnd;
+
+ //We keep the postion of the top left corner b4 it's overwritten
+ GoldenStarPos := Rec.Left;
+ //done
+
+
+ // srodkowa czesc - middle part
+ Rec.Left := Rec.Right;
+ Rec.Right := (Start+Dlugosc-Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt].StartNote) * TempR + Left - NotesW - 0.5 + 10*ScreenX;
+
+ glBindTexture(GL_TEXTURE_2D, Tex_Mid[Color].TexNum);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0); glVertex2f(Rec.Left, Rec.Top);
+ glTexCoord2f(0, 1); glVertex2f(Rec.Left, Rec.Bottom);
+ glTexCoord2f(1, 1); glVertex2f(Rec.Right, Rec.Bottom);
+ glTexCoord2f(1, 0); glVertex2f(Rec.Right, Rec.Top);
+ glEnd;
+
+ // prawa czesc - right part
+ Rec.Left := Rec.Right;
+ Rec.Right := Rec.Right + NotesW;
+
+ glBindTexture(GL_TEXTURE_2D, Tex_Right[Color].TexNum);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0); glVertex2f(Rec.Left, Rec.Top);
+ glTexCoord2f(0, 1); glVertex2f(Rec.Left, Rec.Bottom);
+ glTexCoord2f(1, 1); glVertex2f(Rec.Right, Rec.Bottom);
+ glTexCoord2f(1, 0); glVertex2f(Rec.Right, Rec.Top);
+ glEnd;
+
+ // Golden Star Patch
+ if (Wartosc = 2) AND (Ini.EffectSing=1) then
+ begin
+ GoldenRec.SaveGoldenStarsRec(GoldenStarPos, Rec.Top, Rec.Right, Rec.Bottom);
+ end;
+
+ end; // if not FreeStyle
+ end; // with
+ end; // for
+ end; // with
+
+ glDisable(GL_BLEND);
+ glDisable(GL_TEXTURE_2D);
+end;
+
+
+// draw sung notes
+procedure SingDrawPlayerCzesc(X, Y, W: real; NrGracza: integer; Space: integer);
+var
+ TempR: real;
+ Rec: TRecR;
+ N: integer;
+ R: real;
+ G: real;
+ B: real;
+ A: real;
+ NotesH2: real;
+ begin
+// Log.LogStatus('Player notes', 'SingDraw');
+
+// if NrGracza = 0 then LoadColor(R, G, B, 'P1Light')
+// else LoadColor(R, G, B, 'P2Light');
+
+// R := 71/255;
+// G := 175/255;
+// B := 247/255;
+
+
+ glColor3f(1, 1, 1);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ if Player[NrGracza].IlNut > 0 then begin
+ TempR := W / (Czesci[0].Czesc[Czesci[0].Akt].Koniec - Czesci[0].Czesc[Czesci[0].Akt].StartNote);
+ for N := 0 to Player[NrGracza].HighNut do begin
+ with Player[NrGracza].Nuta[N] do begin
+ // lewa czesc
+ Rec.Left := X + (Start-Czesci[0].Czesc[Czesci[0].Akt].StartNote) * TempR + 0.5 + 10*ScreenX;
+ Rec.Right := Rec.Left + NotesW;
+
+
+ // Half size Notes Patch
+ if Hit then begin
+ NotesH2 := NotesH
+ end else begin
+ NotesH2 := int(NotesH * 0.65);
+ end; //if
+
+
+
+ // if True then
+ Rec.Top := Y - (Ton-Czesci[0].Czesc[Czesci[0].Akt].BaseNote)*Space/2 - NotesH2;
+ Rec.Bottom := Rec.Top + 2 *NotesH2;
+
+ glColor3f(1, 1, 1);
+ glBindTexture(GL_TEXTURE_2D, Tex_Left[NrGracza+1].TexNum);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0); glVertex2f(Rec.Left, Rec.Top);
+ glTexCoord2f(0, 1); glVertex2f(Rec.Left, Rec.Bottom);
+ glTexCoord2f(1, 1); glVertex2f(Rec.Right, Rec.Bottom);
+ glTexCoord2f(1, 0); glVertex2f(Rec.Right, Rec.Top);
+ glEnd;
+
+ // srodkowa czesc
+ Rec.Left := Rec.Right;
+ Rec.Right := X + (Start+Dlugosc-Czesci[0].Czesc[Czesci[0].Akt].StartNote) * TempR - NotesW - 0.5 + 10*ScreenX;
+ // (nowe)
+ if (Start+Dlugosc-1 = Czas.AktBeatD) then
+ Rec.Right := Rec.Right - (1-Frac(Czas.MidBeatD)) * TempR;
+
+ if Rec.Right <= Rec.Left then Rec.Right := Rec.Left;
+
+
+// glColor3f(R, G, B);
+// glBindTexture(GL_TEXTURE_2D, Tex_MidGray.TexNum);
+ glBindTexture(GL_TEXTURE_2D, Tex_Mid[NrGracza+1].TexNum);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0); glVertex2f(Rec.Left, Rec.Top);
+ glTexCoord2f(0, 1); glVertex2f(Rec.Left, Rec.Bottom);
+ glTexCoord2f(1, 1); glVertex2f(Rec.Right, Rec.Bottom);
+ glTexCoord2f(1, 0); glVertex2f(Rec.Right, Rec.Top);
+ glEnd;
+ glColor3f(1, 1, 1);
+
+ // prawa czesc
+ Rec.Left := Rec.Right;
+ Rec.Right := Rec.Right + NotesW;
+
+ glBindTexture(GL_TEXTURE_2D, Tex_Right[NrGracza+1].TexNum);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0); glVertex2f(Rec.Left, Rec.Top);
+ glTexCoord2f(0, 1); glVertex2f(Rec.Left, Rec.Bottom);
+ glTexCoord2f(1, 1); glVertex2f(Rec.Right, Rec.Bottom);
+ glTexCoord2f(1, 0); glVertex2f(Rec.Right, Rec.Top);
+ glEnd;
+
+
+
+ //Rec.Right := X + (Start+Dlugosc-Czesci[0].Czesc[Czesci[0].Akt].StartNote) * TempR - NotesW - 0.5 + 10*ScreenX;
+ //if (Start+Dlugosc-1 = Czas.AktBeatD) then
+ if Perfect and (Ini.EffectSing=1) then begin
+// A := sqrt((1+sin(Music.Position * 3))/2);
+ A := 1 - 2*(Czas.Teraz - GetTimeFromBeat(Start+Dlugosc));
+ if not (Start+Dlugosc-1 = Czas.AktBeatD) then
+
+ //Star animation counter
+ //inc(Starfr);
+ //Starfr := Starfr mod 128;
+ GoldenRec.SavePerfectNotePos(Rec.Left, Rec.Top);
+ { SingDrawStar(Rec.Left+2, Rec.Top+4, A);}
+ end;
+
+ // detekt
+{ Rec.Left := Round((Detekt-Czesci.Czesc[Czesci.Akt].Start) * TempR) + 130;
+ glColor3f(1, 0.2, 0.2);
+ glDisable(GL_BLEND);
+ glDisable(GL_TEXTURE_2D);
+ glBegin(GL_QUADS);
+ glVertex(Rec.Left, Rec.Top-5);
+ glVertex(Rec.Left, Rec.Bottom+5);
+ glVertex(Rec.Left+1, Rec.Bottom+5);
+ glVertex(Rec.Left+1, Rec.Top-5);
+ glEnd;
+ glColor3f(1, 1, 1);
+ glEnable(GL_BLEND);
+ glEnable(GL_TEXTURE_2D);}
+
+ // detekt + FFT length
+{ Rec.Right := (Detekt-Czesci.Czesc[Czesci.Akt].Start) * TempR + 130;
+ // TempR = dlugosc 1 kostki
+ // 60 * 4 / BPM = czas w sekundach na 1 kostke, np. 0,4s
+ // 4096 / 44100 = czas jednego sampla FFT, np. 0,1s
+ // ile to ma kostek? np. 0.25
+ // (4096 / 44100) / (60 * 4 / BPM), np. 0,1s / 0,4s = 0.25
+ // * TempR = dlugosc sampla FFT
+ Rec.Left := Rec.Right - (Sound.n / 44100) / (60 * 4 / Muzyka.BPM) * TempR;
+
+ glColor3f(1, 0.2, 0.2);
+ glVertex(Rec.Left, Rec.Top-4);
+ glVertex(Rec.Left, Rec.Bottom+4);
+ glVertex(Rec.Right, Rec.Bottom+4);
+ glVertex(Rec.Right, Rec.Top-4);}
+
+ end; // with
+ end; // for
+ // eigentlich brauchen wir hier einen vergleich, um festzustellen, ob wir mit
+ // singen schon weiter wären, als bei Rec.Right, _auch, wenn nicht gesungen wird_
+
+ // passing on NrGracza... hope this is really something like the player-number, not only
+ // some kind of weird index into a colour-table
+
+ if (Ini.EffectSing=1) then
+ GoldenRec.GoldenNoteTwinkle(Rec.Top,Rec.Bottom,Rec.Right, NrGracza);
+ end; // if
+end;
+
+//draw Note glow
+procedure SingDrawPlayerBGCzesc(Left, Top, Right: real; NrCzesci, NrGracza: integer; Space: integer);
+var
+ Rec: TRecR;
+ Pet: integer;
+ TempR: real;
+ R,G,B: real;
+ X1, X2, X3, X4: real;
+ W, H: real;
+begin
+ if (Player[NrGracza].ScoreTotalI >= 0) then begin
+ glColor4f(1, 1, 1, sqrt((1+sin(Music.Position * 3))/4)/ 2 + 0.5 );
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ TempR := (Right-Left) / (Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt].Koniec - Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt].StartNote);
+ with Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt] do begin
+ for Pet := 0 to HighNut do begin
+ with Nuta[Pet] do begin
+ if not FreeStyle then begin
+ // begin: 14, 20
+ // easy: 6, 11
+ W := NotesW * 2 + 2;
+ H := NotesH * 1.5 + 3.5;
+
+ X2 := (Start-Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt].StartNote) * TempR + Left + 0.5 + 10*ScreenX + 4; // wciecie
+ X1 := X2-W;
+
+ X3 := (Start+Dlugosc-Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt].StartNote) * TempR + Left - 0.5 + 10*ScreenX - 4; // wciecie
+ X4 := X3+W;
+
+ // left
+ Rec.Left := X1;
+ Rec.Right := X2;
+ Rec.Top := Top - (Ton-BaseNote)*Space/2 - H;
+ Rec.Bottom := Rec.Top + 2 * H;
+
+ glBindTexture(GL_TEXTURE_2D, Tex_BG_Left[NrGracza+1].TexNum);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0); glVertex2f(Rec.Left, Rec.Top);
+ glTexCoord2f(0, 1); glVertex2f(Rec.Left, Rec.Bottom);
+ glTexCoord2f(1, 1); glVertex2f(Rec.Right, Rec.Bottom);
+ glTexCoord2f(1, 0); glVertex2f(Rec.Right, Rec.Top);
+ glEnd;
+
+
+ // srodkowa czesc
+ Rec.Left := X2;
+ Rec.Right := X3;
+
+ glBindTexture(GL_TEXTURE_2D, Tex_BG_Mid[NrGracza+1].TexNum);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0); glVertex2f(Rec.Left, Rec.Top);
+ glTexCoord2f(0, 1); glVertex2f(Rec.Left, Rec.Bottom);
+ glTexCoord2f(1, 1); glVertex2f(Rec.Right, Rec.Bottom);
+ glTexCoord2f(1, 0); glVertex2f(Rec.Right, Rec.Top);
+ glEnd;
+
+ // prawa czesc
+ Rec.Left := X3;
+ Rec.Right := X4;
+
+ glBindTexture(GL_TEXTURE_2D, Tex_BG_Right[NrGracza+1].TexNum);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0); glVertex2f(Rec.Left, Rec.Top);
+ glTexCoord2f(0, 1); glVertex2f(Rec.Left, Rec.Bottom);
+ glTexCoord2f(1, 1); glVertex2f(Rec.Right, Rec.Bottom);
+ glTexCoord2f(1, 0); glVertex2f(Rec.Right, Rec.Top);
+ glEnd;
+ end; // if not FreeStyle
+ end; // with
+ end; // for
+ end; // with
+
+ glDisable(GL_BLEND);
+ glDisable(GL_TEXTURE_2D);
+ end;
+end;
+
+{not used anymore tough we have UGraphicClasses
+procedure SingDrawStar(X, Y, A: real);
+var
+ TempR: real;
+ W, H: real;
+ Starframe: real;
+ begin
+ W := 32;
+ H := 32;
+
+// Golden Star Patch
+// case Z of
+// 1: glColor4f(1, 1, 1, A);
+// 2: glColor4f(1, 1, 0.3, A);
+// end; // case
+
+ glColor4f(1, 1, 1, A);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glBindTexture(GL_TEXTURE_2D, Tex_Note_Star.TexNum);
+
+ Starframe := 15 - ((GetTickCount div 33) mod 16);
+
+ glBegin(GL_QUADS);
+ glTexCoord2f((1/16) * Starframe, 0); glVertex2f(X-W, Y-H);
+ glTexCoord2f((1/16) * Starframe + (1/16), 0); glVertex2f(X-W, Y+H);
+ glTexCoord2f((1/16) * Starframe + (1/16), 1); glVertex2f(X+W, Y+H);
+ glTexCoord2f((1/16) * Starframe, 1); glVertex2f(X+W, Y-H);
+ glEnd;
+end;
+}
+
+{not used anymore tough we have UGraphicClasses
+procedure SingGoldenStar(X, Y, A: real);
+var
+ TempR: real;
+ W, H: real;
+ StarfrG2: real;
+ begin
+ W := 16;
+ H := 16;
+ glColor4f(1, 1, 0.3, A);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glBindTexture(GL_TEXTURE_2D, Tex_Note_Star.TexNum);
+ StarfrG2 := 15 - ((GetTickCount div 67) mod 16);
+ glBegin(GL_QUADS);
+ //x1
+ glTexCoord2f((1/16) * StarfrG2, 0); glVertex2f(X-W, Y-H);
+ glTexCoord2f((1/16) * StarfrG2 + (1/16), 0); glVertex2f(X-W, Y+H);
+ glTexCoord2f((1/16) * StarfrG2 + (1/16), 1); glVertex2f(X+W, Y+H);
+ glTexCoord2f((1/16) * StarfrG2, 1); glVertex2f(X+W, Y-H);
+ glEnd;
+end;
+}
+
+procedure SingDraw;
+var
+ Pet: integer;
+ Pet2: integer;
+ TempR: real;
+ Rec: TRecR;
+ TexRec: TRecR;
+ NR: TRecR;
+ FS: real;
+ BarFrom: integer;
+ BarAlpha: real;
+ BarWspol: real;
+ TempCol: real;
+ Tekst: string;
+ LyricTemp: string;
+ PetCz: integer;
+
+
+
+ //SingBar Mod
+ A: Integer;
+ E: Integer;
+ I: Integer;
+ //end Singbar Mod
+
+
+
+begin
+ // positions
+ if Ini.SingWindow = 0 then begin
+ NR.Left := 120;
+ end else begin
+ NR.Left := 20;
+ end;
+ NR.Right := 780;
+
+ NR.Width := NR.Right - NR.Left;
+ NR.WMid := NR.Width / 2;
+ NR.Mid := NR.Left + NR.WMid;
+
+ // background //BG Fullsize Mod
+ //SingDrawBackground;
+
+ //TimeBar mod
+ SingDrawTimeBar();
+ //eoa TimeBar mod
+
+ // rysuje paski pod nutami
+ if PlayersPlay = 1 then
+ SingDrawNoteLines(Nr.Left + 10*ScreenX, Skin_P2_NotesB - 105, Nr.Right + 10*ScreenX, 15);
+ if (PlayersPlay = 2) or (PlayersPlay = 4) then begin
+ SingDrawNoteLines(Nr.Left + 10*ScreenX, Skin_P1_NotesB - 105, Nr.Right + 10*ScreenX, 15);
+ SingDrawNoteLines(Nr.Left + 10*ScreenX, Skin_P2_NotesB - 105, Nr.Right + 10*ScreenX, 15);
+ end;
+
+ if (PlayersPlay = 3) or (PlayersPlay = 6) then begin
+ SingDrawNoteLines(Nr.Left + 10*ScreenX, 120, Nr.Right + 10*ScreenX, 12);
+ SingDrawNoteLines(Nr.Left + 10*ScreenX, 245, Nr.Right + 10*ScreenX, 12);
+ SingDrawNoteLines(Nr.Left + 10*ScreenX, 370, Nr.Right + 10*ScreenX, 12);
+ end;
+
+ // rysuje tekst - new Lyric engine
+ ScreenSing.LyricMain.Draw;
+ ScreenSing.LyricSub.Draw;
+
+ // rysuje pasek, podpowiadajacy poczatek spiwania w scenie
+ FS := 1.3;
+ BarFrom := Czesci[0].Czesc[Czesci[0].Akt].StartNote - Czesci[0].Czesc[Czesci[0].Akt].Start;
+ if BarFrom > 40 then BarFrom := 40;
+ if (Czesci[0].Czesc[Czesci[0].Akt].StartNote - Czesci[0].Czesc[Czesci[0].Akt].Start > 8) and // dluga przerwa //16->12 for more help bars and then 12->8 for even more
+ (Czesci[0].Czesc[Czesci[0].Akt].StartNote - Czas.MidBeat > 0) and // przed tekstem
+ (Czesci[0].Czesc[Czesci[0].Akt].StartNote - Czas.MidBeat < 40) then begin // ale nie za wczesnie
+ BarWspol := (Czas.MidBeat - (Czesci[0].Czesc[Czesci[0].Akt].StartNote - BarFrom)) / BarFrom;
+ Rec.Left := NR.Left + BarWspol *
+// (NR.WMid - Czesci[0].Czesc[Czesci[0].Akt].LyricWidth / 2 * FS - 50);
+ (ScreenSing.LyricMain.ClientX - NR.Left - 50) + 10*ScreenX;
+ Rec.Right := Rec.Left + 50;
+ Rec.Top := Skin_LyricsT + 3;
+ Rec.Bottom := Rec.Top + 33;//SingScreen.LyricMain.Size * 3;
+{ // zapalanie
+ BarAlpha := (BarWspol*10) * 0.5;
+ if BarAlpha > 0.5 then BarAlpha := 0.5;
+
+ // gaszenie
+ if BarWspol > 0.95 then BarAlpha := 0.5 * (1 - (BarWspol - 0.95) * 20);}
+
+ //Change fuer Crazy Joker
+
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glBindTexture(GL_TEXTURE_2D, Tex_Lyric_Help_Bar.TexNum);
+ glBegin(GL_QUADS);
+ glColor4f(1, 1, 1, 0);
+ glTexCoord2f(0, 0); glVertex2f(Rec.Left, Rec.Top);
+ glTexCoord2f(0, 1); glVertex2f(Rec.Left, Rec.Bottom);
+ glColor4f(1, 1, 1, 0.5);
+ glTexCoord2f(1, 1); glVertex2f(Rec.Right, Rec.Bottom);
+ glTexCoord2f(1, 0); glVertex2f(Rec.Right, Rec.Top);
+ glEnd;
+ glDisable(GL_BLEND);
+
+ end;
+
+ // oscilloscope
+ if Ini.Oscilloscope = 1 then begin
+ if PlayersPlay = 1 then
+ SingDrawOscilloscope(190 + 10*ScreenX, 55, 180, 40, 0);
+
+ if PlayersPlay = 2 then begin
+ SingDrawOscilloscope(190 + 10*ScreenX, 55, 180, 40, 0);
+ SingDrawOscilloscope(425 + 10*ScreenX, 55, 180, 40, 1);
+ end;
+
+ if PlayersPlay = 4 then begin
+ if ScreenAct = 1 then begin
+ SingDrawOscilloscope(190 + 10*ScreenX, 55, 180, 40, 0);
+ SingDrawOscilloscope(425 + 10*ScreenX, 55, 180, 40, 1);
+ end;
+ if ScreenAct = 2 then begin
+ SingDrawOscilloscope(190 + 10*ScreenX, 55, 180, 40, 2);
+ SingDrawOscilloscope(425 + 10*ScreenX, 55, 180, 40, 3);
+ end;
+ end;
+
+ if PlayersPlay = 3 then begin
+ SingDrawOscilloscope(75 + 10*ScreenX, 95, 100, 20, 0);
+ SingDrawOscilloscope(370 + 10*ScreenX, 95, 100, 20, 1);
+ SingDrawOscilloscope(670 + 10*ScreenX, 95, 100, 20, 2);
+ end;
+
+ if PlayersPlay = 6 then begin
+ if ScreenAct = 1 then begin
+ SingDrawOscilloscope( 75 + 10*ScreenX, 95, 100, 20, 0);
+ SingDrawOscilloscope(370 + 10*ScreenX, 95, 100, 20, 1);
+ SingDrawOscilloscope(670 + 10*ScreenX, 95, 100, 20, 2);
+ end;
+ if ScreenAct = 2 then begin
+ SingDrawOscilloscope( 75 + 10*ScreenX, 95, 100, 20, 3);
+ SingDrawOscilloscope(370 + 10*ScreenX, 95, 100, 20, 4);
+ SingDrawOscilloscope(670 + 10*ScreenX, 95, 100, 20, 5);
+ end;
+ end;
+
+ end
+
+ //SingBar Mod
+ //modded again to make it moveable: it's working, so why try harder
+ else if Ini.Oscilloscope = 2 then begin
+ A := GetTickCount div 33;
+ if A <> Tickold then begin
+ Tickold := A;
+ for E := 0 to (PlayersPlay - 1) do begin //Set new Pos + Alpha
+ I := Player[E].ScorePercentTarget - Player[E].ScorePercent;
+ if I > 0 then Inc(Player[E].ScorePercent)
+ else if I < 0 then Dec(Player[E].ScorePercent);
+ end; //for
+ end; //if
+ if PlayersPlay = 1 then begin
+ //SingDrawSingbar( 75 + 10*ScreenX, 95, 100, 8, Player[0].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP1SingBar.x, Theme.Sing.StaticP1SingBar.y, Theme.Sing.StaticP1SingBar.w, Theme.Sing.StaticP1SingBar.h , Player[0].ScorePercent);
+ end;
+ if PlayersPlay = 2 then begin
+ //SingDrawSingbar( 75 + 10*ScreenX, 95, 100, 8, Player[0].ScorePercent);
+ //SingDrawSingbar(620 + 10*ScreenX, 95, 100, 8, Player[1].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP1TwoPSingBar.x, Theme.Sing.StaticP1TwoPSingBar.y, Theme.Sing.StaticP1TwoPSingBar.w, Theme.Sing.StaticP1TwoPSingBar.h , Player[0].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP2RSingBar.x, Theme.Sing.StaticP2RSingBar.y, Theme.Sing.StaticP2RSingBar.w, Theme.Sing.StaticP2RSingBar.h , Player[1].ScorePercent);
+ end;
+ if PlayersPlay = 3 then begin
+ //SingDrawSingbar( 75 + 10*ScreenX, 95, 100, 8, Player[0].ScorePercent);
+ //SingDrawSingbar(370 + 10*ScreenX, 95, 100, 8, Player[1].ScorePercent);
+ //SingDrawSingbar(670 + 10*ScreenX, 95, 100, 8, Player[2].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP1ThreePSingBar.x, Theme.Sing.StaticP1ThreePSingBar.y, Theme.Sing.StaticP1ThreePSingBar.w, Theme.Sing.StaticP1ThreePSingBar.h , Player[0].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP2MSingBar.x, Theme.Sing.StaticP2MSingBar.y, Theme.Sing.StaticP2MSingBar.w, Theme.Sing.StaticP2MSingBar.h , Player[1].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP3SingBar.x, Theme.Sing.StaticP3SingBar.y, Theme.Sing.StaticP3SingBar.w, Theme.Sing.StaticP3SingBar.h , Player[2].ScorePercent);
+ end;
+ if PlayersPlay = 4 then begin
+ if ScreenAct = 1 then begin
+ //SingDrawSingbar( 75 + 10*ScreenX, 95, 100, 8, Player[0].ScorePercent);
+ //SingDrawSingbar(620 + 10*ScreenX, 95, 100, 8, Player[1].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP1TwoPSingBar.x, Theme.Sing.StaticP1TwoPSingBar.y, Theme.Sing.StaticP1TwoPSingBar.w, Theme.Sing.StaticP1TwoPSingBar.h , Player[0].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP2RSingBar.x, Theme.Sing.StaticP2RSingBar.y, Theme.Sing.StaticP2RSingBar.w, Theme.Sing.StaticP2RSingBar.h , Player[1].ScorePercent);
+ end;
+ if ScreenAct = 2 then begin
+ //SingDrawSingbar( 75 + 10*ScreenX, 95, 100, 8, Player[2].ScorePercent);
+ //SingDrawSingbar(620 + 10*ScreenX, 95, 100, 8, Player[3].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP1TwoPSingBar.x, Theme.Sing.StaticP1TwoPSingBar.y, Theme.Sing.StaticP1TwoPSingBar.w, Theme.Sing.StaticP1TwoPSingBar.h , Player[2].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP2RSingBar.x, Theme.Sing.StaticP2RSingBar.y, Theme.Sing.StaticP2RSingBar.w, Theme.Sing.StaticP2RSingBar.h , Player[3].ScorePercent);
+ end;
+ end;
+ if PlayersPlay = 6 then begin
+ if ScreenAct = 1 then begin
+ //SingDrawSingbar( 75 + 10*ScreenX, 95, 100, 8, Player[0].ScorePercent);
+ //SingDrawSingbar(370 + 10*ScreenX, 95, 100, 8, Player[1].ScorePercent);
+ //SingDrawSingbar(670 + 10*ScreenX, 95, 100, 8, Player[2].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP1ThreePSingBar.x, Theme.Sing.StaticP1ThreePSingBar.y, Theme.Sing.StaticP1ThreePSingBar.w, Theme.Sing.StaticP1ThreePSingBar.h , Player[0].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP2MSingBar.x, Theme.Sing.StaticP2MSingBar.y, Theme.Sing.StaticP2MSingBar.w, Theme.Sing.StaticP2MSingBar.h , Player[1].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP3SingBar.x, Theme.Sing.StaticP3SingBar.y, Theme.Sing.StaticP3SingBar.w, Theme.Sing.StaticP3SingBar.h , Player[2].ScorePercent);
+ end;
+ if ScreenAct = 2 then begin
+ //SingDrawSingbar( 75 + 10*ScreenX, 95, 100, 8, Player[3].ScorePercent);
+ //SingDrawSingbar(370 + 10*ScreenX, 95, 100, 8, Player[4].ScorePercent);
+ //SingDrawSingbar(670 + 10*ScreenX, 95, 100, 8, Player[5].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP1ThreePSingBar.x, Theme.Sing.StaticP1ThreePSingBar.y, Theme.Sing.StaticP1ThreePSingBar.w, Theme.Sing.StaticP1ThreePSingBar.h , Player[3].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP2MSingBar.x, Theme.Sing.StaticP2MSingBar.y, Theme.Sing.StaticP2MSingBar.w, Theme.Sing.StaticP2MSingBar.h , Player[4].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP3SingBar.x, Theme.Sing.StaticP3SingBar.y, Theme.Sing.StaticP3SingBar.w, Theme.Sing.StaticP3SingBar.h , Player[5].ScorePercent);
+ end;
+ end;
+ end;
+ //end Singbar Mod
+
+ //PhrasenBonus - Line Bonus Mod
+ if Ini.LineBonus > 0 then begin
+ A := GetTickCount div 33;
+ if (A <> Tickold2) AND (Player[0].LineBonus_Visible) then begin
+ Tickold2 := A;
+ for E := 0 to (PlayersPlay - 1) do begin
+ //Change Alpha
+ Player[E].LineBonus_Alpha := Player[E].LineBonus_Alpha - 0.02;
+ if Player[E].LineBonus_Alpha <= 0 then
+ begin
+ Player[E].LineBonus_Age := 0;
+ Player[E].LineBonus_Visible := False
+ end
+ else
+ begin
+ inc(Player[E].LineBonus_Age, 1);
+ //Change Position
+ if (Player[E].LineBonus_PosX < Player[E].LineBonus_TargetX) then
+ Player[E].LineBonus_PosX := Player[E].LineBonus_PosX + (2 - Player[E].LineBonus_Alpha * 1.5)
+ else if (Player[E].LineBonus_PosX > Player[E].LineBonus_TargetX) then
+ Player[E].LineBonus_PosX := Player[E].LineBonus_PosX - (2 - Player[E].LineBonus_Alpha * 1.5);
+
+ if (Player[E].LineBonus_PosY < Player[E].LineBonus_TargetY) then
+ Player[E].LineBonus_PosY := Player[E].LineBonus_PosY + (2 - Player[E].LineBonus_Alpha * 1.5)
+ else if (Player[E].LineBonus_PosY > Player[E].LineBonus_TargetY) then
+ Player[E].LineBonus_PosY := Player[E].LineBonus_PosY - (2 - Player[E].LineBonus_Alpha * 1.5);
+
+ end;
+ end;
+ end; //if
+
+ if PlayersPlay = 1 then begin
+ SingDrawLineBonus( Player[0].LineBonus_PosX, Player[0].LineBonus_PosY, Player[0].LineBonus_Color, Player[0].LineBonus_Alpha, Player[0].LineBonus_Text, Player[0].LineBonus_Age);
+ end
+ else if PlayersPlay = 2 then begin
+ SingDrawLineBonus( Player[0].LineBonus_PosX, Player[0].LineBonus_PosY, Player[0].LineBonus_Color, Player[0].LineBonus_Alpha, Player[0].LineBonus_Text, Player[0].LineBonus_Age);
+ SingDrawLineBonus( Player[1].LineBonus_PosX, Player[1].LineBonus_PosY, Player[1].LineBonus_Color, Player[1].LineBonus_Alpha, Player[1].LineBonus_Text, Player[1].LineBonus_Age);
+ end
+ else if PlayersPlay = 3 then begin
+ SingDrawLineBonus( Player[0].LineBonus_PosX, Player[0].LineBonus_PosY, Player[0].LineBonus_Color, Player[0].LineBonus_Alpha, Player[0].LineBonus_Text, Player[0].LineBonus_Age);
+ SingDrawLineBonus( Player[1].LineBonus_PosX, Player[1].LineBonus_PosY, Player[1].LineBonus_Color, Player[1].LineBonus_Alpha, Player[1].LineBonus_Text, Player[1].LineBonus_Age);
+ SingDrawLineBonus( Player[2].LineBonus_PosX, Player[2].LineBonus_PosY, Player[2].LineBonus_Color, Player[2].LineBonus_Alpha, Player[2].LineBonus_Text, Player[2].LineBonus_Age);
+ end
+ else if PlayersPlay = 4 then begin
+ if ScreenAct = 1 then begin
+ SingDrawLineBonus( Player[0].LineBonus_PosX, Player[0].LineBonus_PosY, Player[0].LineBonus_Color, Player[0].LineBonus_Alpha, Player[0].LineBonus_Text, Player[0].LineBonus_Age);
+ SingDrawLineBonus( Player[1].LineBonus_PosX, Player[1].LineBonus_PosY, Player[1].LineBonus_Color, Player[1].LineBonus_Alpha, Player[1].LineBonus_Text, Player[1].LineBonus_Age);
+ end;
+ if ScreenAct = 2 then begin
+ SingDrawLineBonus( Player[2].LineBonus_PosX, Player[2].LineBonus_PosY, Player[2].LineBonus_Color, Player[2].LineBonus_Alpha, Player[2].LineBonus_Text, Player[2].LineBonus_Age);
+ SingDrawLineBonus( Player[3].LineBonus_PosX, Player[3].LineBonus_PosY, Player[3].LineBonus_Color, Player[3].LineBonus_Alpha, Player[3].LineBonus_Text, Player[3].LineBonus_Age);
+ end;
+ end;
+ if PlayersPlay = 6 then begin
+ if ScreenAct = 1 then begin
+ SingDrawLineBonus( Player[0].LineBonus_PosX, Player[0].LineBonus_PosY, Player[0].LineBonus_Color, Player[0].LineBonus_Alpha, Player[0].LineBonus_Text, Player[0].LineBonus_Age);
+ SingDrawLineBonus( Player[1].LineBonus_PosX, Player[1].LineBonus_PosY, Player[1].LineBonus_Color, Player[1].LineBonus_Alpha, Player[1].LineBonus_Text, Player[1].LineBonus_Age);
+ SingDrawLineBonus( Player[2].LineBonus_PosX, Player[2].LineBonus_PosY, Player[2].LineBonus_Color, Player[2].LineBonus_Alpha, Player[2].LineBonus_Text, Player[2].LineBonus_Age);
+ end;
+ if ScreenAct = 2 then begin
+ SingDrawLineBonus( Player[3].LineBonus_PosX, Player[3].LineBonus_PosY, Player[3].LineBonus_Color, Player[3].LineBonus_Alpha, Player[3].LineBonus_Text, Player[3].LineBonus_Age);
+ SingDrawLineBonus( Player[4].LineBonus_PosX, Player[4].LineBonus_PosY, Player[4].LineBonus_Color, Player[4].LineBonus_Alpha, Player[4].LineBonus_Text, Player[4].LineBonus_Age);
+ SingDrawLineBonus( Player[5].LineBonus_PosX, Player[5].LineBonus_PosY, Player[5].LineBonus_Color, Player[5].LineBonus_Alpha, Player[5].LineBonus_Text, Player[5].LineBonus_Age);
+ end;
+ end;
+ end;
+ //PhrasenBonus - Line Bonus Mod End
+
+
+ // rysuje paski
+// Log.LogStatus('Original notes', 'SingDraw');
+ case Ini.Difficulty of
+ 0:
+ begin
+ NotesH := 11; // 9
+ NotesW := 6; // 5
+ end;
+ 1:
+ begin
+ NotesH := 8; // 7
+ NotesW := 4; // 4
+ end;
+ 2:
+ begin
+ NotesH := 5;
+ NotesW := 3;
+ end;
+ end;
+
+ if PlayersPlay = 1 then begin
+ SingDrawPlayerBGCzesc(NR.Left + 20, Skin_P2_NotesB, NR.Right - 20, 0, 0, 15);
+ SingDrawCzesc(NR.Left + 20, Skin_P2_NotesB, NR.Right - 20, 0, 15);
+ SingDrawPlayerCzesc(Nr.Left + 20, Skin_P2_NotesB, Nr.Width - 40, 0, 15);
+ end;
+
+ if (PlayersPlay = 2) then begin
+ SingDrawPlayerBGCzesc(Nr.Left + 20, Skin_P1_NotesB, Nr.Right - 20, 0, 0, 15);
+ SingDrawPlayerBGCzesc(Nr.Left + 20, Skin_P2_NotesB, Nr.Right - 20, 0, 1, 15);
+
+ SingDrawCzesc(NR.Left + 20, Skin_P1_NotesB, NR.Right - 20, 0, 15);
+ SingDrawCzesc(NR.Left + 20, Skin_P2_NotesB, NR.Right - 20, 0, 15);
+
+ SingDrawPlayerCzesc(Nr.Left + 20, Skin_P1_NotesB, Nr.Width - 40, 0, 15);
+ SingDrawPlayerCzesc(Nr.Left + 20, Skin_P2_NotesB, Nr.Width - 40, 1, 15);
+ end;
+
+ if PlayersPlay = 3 then begin
+ NotesW := NotesW * 0.8;
+ NotesH := NotesH * 0.8;
+
+ SingDrawPlayerBGCzesc(Nr.Left + 20, 120+95, Nr.Right - 20, 0, 0, 12);
+ SingDrawPlayerBGCzesc(Nr.Left + 20, 245+95, Nr.Right - 20, 0, 1, 12);
+ SingDrawPlayerBGCzesc(Nr.Left + 20, 370+95, Nr.Right - 20, 0, 2, 12);
+
+ SingDrawCzesc(NR.Left + 20, 120+95, NR.Right - 20, 0, 12);
+ SingDrawCzesc(NR.Left + 20, 245+95, NR.Right - 20, 0, 12);
+ SingDrawCzesc(NR.Left + 20, 370+95, NR.Right - 20, 0, 12);
+
+ SingDrawPlayerCzesc(Nr.Left + 20, 120+95, Nr.Width - 40, 0, 12);
+ SingDrawPlayerCzesc(Nr.Left + 20, 245+95, Nr.Width - 40, 1, 12);
+ SingDrawPlayerCzesc(Nr.Left + 20, 370+95, Nr.Width - 40, 2, 12);
+ end;
+
+ if PlayersPlay = 4 then begin
+ if ScreenAct = 1 then begin
+ SingDrawPlayerBGCzesc(Nr.Left + 20, Skin_P1_NotesB, Nr.Right - 20, 0, 0, 15);
+ SingDrawPlayerBGCzesc(Nr.Left + 20, Skin_P2_NotesB, Nr.Right - 20, 0, 1, 15);
+ end;
+ if ScreenAct = 2 then begin
+ SingDrawPlayerBGCzesc(Nr.Left + 20, Skin_P1_NotesB, Nr.Right - 20, 0, 2, 15);
+ SingDrawPlayerBGCzesc(Nr.Left + 20, Skin_P2_NotesB, Nr.Right - 20, 0, 3, 15);
+ end;
+
+ SingDrawCzesc(NR.Left + 20, Skin_P1_NotesB, NR.Right - 20, 0, 15);
+ SingDrawCzesc(NR.Left + 20, Skin_P2_NotesB, NR.Right - 20, 0, 15);
+
+ if ScreenAct = 1 then begin
+ SingDrawPlayerCzesc(Nr.Left + 20, Skin_P1_NotesB, Nr.Width - 40, 0, 15);
+ SingDrawPlayerCzesc(Nr.Left + 20, Skin_P2_NotesB, Nr.Width - 40, 1, 15);
+ end;
+ if ScreenAct = 2 then begin
+ SingDrawPlayerCzesc(Nr.Left + 20, Skin_P1_NotesB, Nr.Width - 40, 2, 15);
+ SingDrawPlayerCzesc(Nr.Left + 20, Skin_P2_NotesB, Nr.Width - 40, 3, 15);
+ end;
+ end;
+
+ if PlayersPlay = 6 then begin
+ NotesW := NotesW * 0.8;
+ NotesH := NotesH * 0.8;
+
+ if ScreenAct = 1 then begin
+ SingDrawPlayerBGCzesc(Nr.Left + 20, 120+95, Nr.Right - 20, 0, 0, 12);
+ SingDrawPlayerBGCzesc(Nr.Left + 20, 245+95, Nr.Right - 20, 0, 1, 12);
+ SingDrawPlayerBGCzesc(Nr.Left + 20, 370+95, Nr.Right - 20, 0, 2, 12);
+ end;
+ if ScreenAct = 2 then begin
+ SingDrawPlayerBGCzesc(Nr.Left + 20, 120+95, Nr.Right - 20, 0, 3, 12);
+ SingDrawPlayerBGCzesc(Nr.Left + 20, 245+95, Nr.Right - 20, 0, 4, 12);
+ SingDrawPlayerBGCzesc(Nr.Left + 20, 370+95, Nr.Right - 20, 0, 5, 12);
+ end;
+
+ SingDrawCzesc(NR.Left + 20, 120+95, NR.Right - 20, 0, 12);
+ SingDrawCzesc(NR.Left + 20, 245+95, NR.Right - 20, 0, 12);
+ SingDrawCzesc(NR.Left + 20, 370+95, NR.Right - 20, 0, 12);
+
+ if ScreenAct = 1 then begin
+ SingDrawPlayerCzesc(Nr.Left + 20, 120+95, Nr.Width - 40, 0, 12);
+ SingDrawPlayerCzesc(Nr.Left + 20, 245+95, Nr.Width - 40, 1, 12);
+ SingDrawPlayerCzesc(Nr.Left + 20, 370+95, Nr.Width - 40, 2, 12);
+ end;
+ if ScreenAct = 2 then begin
+ SingDrawPlayerCzesc(Nr.Left + 20, 120+95, Nr.Width - 40, 3, 12);
+ SingDrawPlayerCzesc(Nr.Left + 20, 245+95, Nr.Width - 40, 4, 12);
+ SingDrawPlayerCzesc(Nr.Left + 20, 370+95, Nr.Width - 40, 5, 12);
+ end;
+ end;
+
+ glDisable(GL_BLEND);
+ glDisable(GL_TEXTURE_2D);
+end;
+
+procedure SingModiDraw (PlayerInfo: TPlayerInfo);
+var
+ Pet: integer;
+ Pet2: integer;
+ TempR: real;
+ Rec: TRecR;
+ TexRec: TRecR;
+ NR: TRecR;
+ FS: real;
+ BarFrom: integer;
+ BarAlpha: real;
+ BarWspol: real;
+ TempCol: real;
+ Tekst: string;
+ LyricTemp: string;
+ PetCz: integer;
+
+
+
+ //SingBar Mod
+ A: Integer;
+ E: Integer;
+ I: Integer;
+ //end Singbar Mod
+
+
+
+begin
+ // positions
+ if Ini.SingWindow = 0 then begin
+ NR.Left := 120;
+ end else begin
+ NR.Left := 20;
+ end;
+ NR.Right := 780;
+
+ NR.Width := NR.Right - NR.Left;
+ NR.WMid := NR.Width / 2;
+ NR.Mid := NR.Left + NR.WMid;
+
+ // background //BG Fullsize Mod
+ //SingDrawBackground;
+
+ // time bar
+// Log.LogStatus('Time Bar', 'SingDraw');
+ SingDrawTimeBar();
+
+ if DLLMan.Selected.ShowNotes then
+ begin
+ // rysuje paski pod nutami
+ if PlayersPlay = 1 then
+ SingDrawNoteLines(Nr.Left + 10*ScreenX, Skin_P2_NotesB - 105, Nr.Right + 10*ScreenX, 15);
+ if (PlayersPlay = 2) or (PlayersPlay = 4) then begin
+ SingDrawNoteLines(Nr.Left + 10*ScreenX, Skin_P1_NotesB - 105, Nr.Right + 10*ScreenX, 15);
+ SingDrawNoteLines(Nr.Left + 10*ScreenX, Skin_P2_NotesB - 105, Nr.Right + 10*ScreenX, 15);
+ end;
+
+ if (PlayersPlay = 3) or (PlayersPlay = 6) then begin
+ SingDrawNoteLines(Nr.Left + 10*ScreenX, 120, Nr.Right + 10*ScreenX, 12);
+ SingDrawNoteLines(Nr.Left + 10*ScreenX, 245, Nr.Right + 10*ScreenX, 12);
+ SingDrawNoteLines(Nr.Left + 10*ScreenX, 370, Nr.Right + 10*ScreenX, 12);
+ end;
+ end;
+
+ // rysuje tekst - new Lyric engine
+ ScreenSingModi.LyricMain.Draw;
+ ScreenSingModi.LyricSub.Draw;
+
+ // rysuje pasek, podpowiadajacy poczatek spiwania w scenie
+ FS := 1.3;
+ BarFrom := Czesci[0].Czesc[Czesci[0].Akt].StartNote - Czesci[0].Czesc[Czesci[0].Akt].Start;
+ if BarFrom > 40 then BarFrom := 40;
+ if (Czesci[0].Czesc[Czesci[0].Akt].StartNote - Czesci[0].Czesc[Czesci[0].Akt].Start > 8) and // dluga przerwa //16->12 for more help bars and then 12->8 for even more
+ (Czesci[0].Czesc[Czesci[0].Akt].StartNote - Czas.MidBeat > 0) and // przed tekstem
+ (Czesci[0].Czesc[Czesci[0].Akt].StartNote - Czas.MidBeat < 40) then begin // ale nie za wczesnie
+ BarWspol := (Czas.MidBeat - (Czesci[0].Czesc[Czesci[0].Akt].StartNote - BarFrom)) / BarFrom;
+ Rec.Left := NR.Left + BarWspol *
+ // (NR.WMid - Czesci[0].Czesc[Czesci[0].Akt].LyricWidth / 2 * FS - 50);
+ (ScreenSingModi.LyricMain.ClientX - NR.Left - 50) + 10*ScreenX;
+ Rec.Right := Rec.Left + 50;
+ Rec.Top := Skin_LyricsT + 3;
+ Rec.Bottom := Rec.Top + 33;//SingScreen.LyricMain.Size * 3;
+{ // zapalanie
+ BarAlpha := (BarWspol*10) * 0.5;
+ if BarAlpha > 0.5 then BarAlpha := 0.5;
+
+ // gaszenie
+ if BarWspol > 0.95 then BarAlpha := 0.5 * (1 - (BarWspol - 0.95) * 20);}
+
+ //Change fuer Crazy Joker
+
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glBindTexture(GL_TEXTURE_2D, Tex_Lyric_Help_Bar.TexNum);
+ glBegin(GL_QUADS);
+ glColor4f(1, 1, 1, 0);
+ glTexCoord2f(0, 0); glVertex2f(Rec.Left, Rec.Top);
+ glTexCoord2f(0, 1); glVertex2f(Rec.Left, Rec.Bottom);
+ glColor4f(1, 1, 1, 0.5);
+ glTexCoord2f(1, 1); glVertex2f(Rec.Right, Rec.Bottom);
+ glTexCoord2f(1, 0); glVertex2f(Rec.Right, Rec.Top);
+ glEnd;
+ glDisable(GL_BLEND);
+ end;
+
+ // oscilloscope
+ if (((Ini.Oscilloscope = 1) AND (DLLMan.Selected.ShowRateBar_O)) AND (NOT DLLMan.Selected.ShowRateBar)) then begin
+ if PlayersPlay = 1 then
+ if PlayerInfo.Playerinfo[0].Enabled then
+ SingDrawOscilloscope(190 + 10*ScreenX, 55, 180, 40, 0);
+
+ if PlayersPlay = 2 then begin
+ if PlayerInfo.Playerinfo[0].Enabled then
+ SingDrawOscilloscope(190 + 10*ScreenX, 55, 180, 40, 0);
+ if PlayerInfo.Playerinfo[1].Enabled then
+ SingDrawOscilloscope(425 + 10*ScreenX, 55, 180, 40, 1);
+ end;
+
+ if PlayersPlay = 4 then begin
+ if ScreenAct = 1 then begin
+ if PlayerInfo.Playerinfo[0].Enabled then
+ SingDrawOscilloscope(190 + 10*ScreenX, 55, 180, 40, 0);
+ if PlayerInfo.Playerinfo[1].Enabled then
+ SingDrawOscilloscope(425 + 10*ScreenX, 55, 180, 40, 1);
+ end;
+ if ScreenAct = 2 then begin
+ if PlayerInfo.Playerinfo[2].Enabled then
+ SingDrawOscilloscope(190 + 10*ScreenX, 55, 180, 40, 2);
+ if PlayerInfo.Playerinfo[3].Enabled then
+ SingDrawOscilloscope(425 + 10*ScreenX, 55, 180, 40, 3);
+ end;
+ end;
+
+ if PlayersPlay = 3 then begin
+ if PlayerInfo.Playerinfo[0].Enabled then
+ SingDrawOscilloscope(75 + 10*ScreenX, 95, 100, 20, 0);
+ if PlayerInfo.Playerinfo[1].Enabled then
+ SingDrawOscilloscope(370 + 10*ScreenX, 95, 100, 20, 1);
+ if PlayerInfo.Playerinfo[2].Enabled then
+ SingDrawOscilloscope(670 + 10*ScreenX, 95, 100, 20, 2);
+ end;
+
+ if PlayersPlay = 6 then begin
+ if ScreenAct = 1 then begin
+ if PlayerInfo.Playerinfo[0].Enabled then
+ SingDrawOscilloscope( 75 + 10*ScreenX, 95, 100, 20, 0);
+ if PlayerInfo.Playerinfo[1].Enabled then
+ SingDrawOscilloscope(370 + 10*ScreenX, 95, 100, 20, 1);
+ if PlayerInfo.Playerinfo[2].Enabled then
+ SingDrawOscilloscope(670 + 10*ScreenX, 95, 100, 20, 2);
+ end;
+ if ScreenAct = 2 then begin
+ if PlayerInfo.Playerinfo[3].Enabled then
+ SingDrawOscilloscope( 75 + 10*ScreenX, 95, 100, 20, 3);
+ if PlayerInfo.Playerinfo[4].Enabled then
+ SingDrawOscilloscope(370 + 10*ScreenX, 95, 100, 20, 4);
+ if PlayerInfo.Playerinfo[5].Enabled then
+ SingDrawOscilloscope(670 + 10*ScreenX, 95, 100, 20, 5);
+ end;
+ end;
+
+ end
+
+ //SingBar Mod
+ // was fürn sinn hattn der quark hier?
+ else if ((Ini.Oscilloscope = 2) AND (DLLMan.Selected.ShowRateBar_O)) OR (DLLMan.Selected.ShowRateBar) then begin
+ A := GetTickCount div 33;
+ if A <> Tickold then begin
+ Tickold := A;
+ for E := 0 to (PlayersPlay - 1) do begin //Set new Pos + Alpha
+ I := Player[E].ScorePercentTarget - Player[E].ScorePercent;
+ if I > 0 then Inc(Player[E].ScorePercent)
+ else if I < 0 then Dec(Player[E].ScorePercent);
+ end; //for
+ end; //if
+ if PlayersPlay = 1 then begin
+ if PlayerInfo.Playerinfo[0].Enabled then
+ //SingDrawSingbar( 75 + 10*ScreenX, 95, 100, 8, Player[0].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP1SingBar.x, Theme.Sing.StaticP1SingBar.y, Theme.Sing.StaticP1SingBar.w, Theme.Sing.StaticP1SingBar.h , Player[0].ScorePercent);
+ end;
+ if PlayersPlay = 2 then begin
+ if PlayerInfo.Playerinfo[0].Enabled then
+ //SingDrawSingbar( 75 + 10*ScreenX, 95, 100, 8, Player[0].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP1TwoPSingBar.x, Theme.Sing.StaticP1TwoPSingBar.y, Theme.Sing.StaticP1TwoPSingBar.w, Theme.Sing.StaticP1TwoPSingBar.h , Player[0].ScorePercent);
+ if PlayerInfo.Playerinfo[1].Enabled then
+ //SingDrawSingbar(620 + 10*ScreenX, 95, 100, 8, Player[1].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP2RSingBar.x, Theme.Sing.StaticP2RSingBar.y, Theme.Sing.StaticP2RSingBar.w, Theme.Sing.StaticP2RSingBar.h , Player[1].ScorePercent);
+ end;
+ if PlayersPlay = 3 then begin
+ if PlayerInfo.Playerinfo[0].Enabled then
+ //SingDrawSingbar( 75 + 10*ScreenX, 95, 100, 8, Player[0].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP1ThreePSingBar.x, Theme.Sing.StaticP1ThreePSingBar.y, Theme.Sing.StaticP1ThreePSingBar.w, Theme.Sing.StaticP1ThreePSingBar.h , Player[0].ScorePercent);
+ if PlayerInfo.Playerinfo[1].Enabled then
+ //SingDrawSingbar(370 + 10*ScreenX, 95, 100, 8, Player[1].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP2MSingBar.x, Theme.Sing.StaticP2MSingBar.y, Theme.Sing.StaticP2MSingBar.w, Theme.Sing.StaticP2MSingBar.h , Player[1].ScorePercent);
+ if PlayerInfo.Playerinfo[2].Enabled then
+ //SingDrawSingbar(670 + 10*ScreenX, 95, 100, 8, Player[2].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP3SingBar.x, Theme.Sing.StaticP3SingBar.y, Theme.Sing.StaticP3SingBar.w, Theme.Sing.StaticP3SingBar.h , Player[2].ScorePercent);
+ end;
+ if PlayersPlay = 4 then begin
+ if ScreenAct = 1 then begin
+ if PlayerInfo.Playerinfo[0].Enabled then
+ //SingDrawSingbar( 75 + 10*ScreenX, 95, 100, 8, Player[0].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP1TwoPSingBar.x, Theme.Sing.StaticP1TwoPSingBar.y, Theme.Sing.StaticP1TwoPSingBar.w, Theme.Sing.StaticP1TwoPSingBar.h , Player[0].ScorePercent);
+ if PlayerInfo.Playerinfo[1].Enabled then
+ //SingDrawSingbar(620 + 10*ScreenX, 95, 100, 8, Player[1].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP2RSingBar.x, Theme.Sing.StaticP2RSingBar.y, Theme.Sing.StaticP2RSingBar.w, Theme.Sing.StaticP2RSingBar.h , Player[1].ScorePercent);
+ end;
+ if ScreenAct = 2 then begin
+ if PlayerInfo.Playerinfo[2].Enabled then
+ //SingDrawSingbar( 75 + 10*ScreenX, 95, 100, 8, Player[2].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP1TwoPSingBar.x, Theme.Sing.StaticP1TwoPSingBar.y, Theme.Sing.StaticP1TwoPSingBar.w, Theme.Sing.StaticP1TwoPSingBar.h , Player[2].ScorePercent);
+ if PlayerInfo.Playerinfo[3].Enabled then
+ //SingDrawSingbar(620 + 10*ScreenX, 95, 100, 8, Player[3].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP2RSingBar.x, Theme.Sing.StaticP2RSingBar.y, Theme.Sing.StaticP2RSingBar.w, Theme.Sing.StaticP2RSingBar.h , Player[3].ScorePercent);
+ end;
+ end;
+ if PlayersPlay = 6 then begin
+ if ScreenAct = 1 then begin
+ if PlayerInfo.Playerinfo[0].Enabled then
+ //SingDrawSingbar( 75 + 10*ScreenX, 95, 100, 8, Player[0].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP1ThreePSingBar.x, Theme.Sing.StaticP1ThreePSingBar.y, Theme.Sing.StaticP1ThreePSingBar.w, Theme.Sing.StaticP1ThreePSingBar.h , Player[0].ScorePercent);
+ if PlayerInfo.Playerinfo[1].Enabled then
+ //SingDrawSingbar(370 + 10*ScreenX, 95, 100, 8, Player[1].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP2MSingBar.x, Theme.Sing.StaticP2MSingBar.y, Theme.Sing.StaticP2MSingBar.w, Theme.Sing.StaticP2MSingBar.h , Player[1].ScorePercent);
+ if PlayerInfo.Playerinfo[2].Enabled then
+ //SingDrawSingbar(670 + 10*ScreenX, 95, 100, 8, Player[2].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP3SingBar.x, Theme.Sing.StaticP3SingBar.y, Theme.Sing.StaticP3SingBar.w, Theme.Sing.StaticP3SingBar.h , Player[2].ScorePercent);
+ end;
+ if ScreenAct = 2 then begin
+ if PlayerInfo.Playerinfo[3].Enabled then
+ //SingDrawSingbar( 75 + 10*ScreenX, 95, 100, 8, Player[3].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP1ThreePSingBar.x, Theme.Sing.StaticP1ThreePSingBar.y, Theme.Sing.StaticP1ThreePSingBar.w, Theme.Sing.StaticP1ThreePSingBar.h , Player[3].ScorePercent);
+ if PlayerInfo.Playerinfo[4].Enabled then
+ //SingDrawSingbar(370 + 10*ScreenX, 95, 100, 8, Player[4].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP2MSingBar.x, Theme.Sing.StaticP2MSingBar.y, Theme.Sing.StaticP2MSingBar.w, Theme.Sing.StaticP2MSingBar.h , Player[4].ScorePercent);
+ if PlayerInfo.Playerinfo[5].Enabled then
+ //SingDrawSingbar(670 + 10*ScreenX, 95, 100, 8, Player[5].ScorePercent);
+ SingDrawSingbar(Theme.Sing.StaticP3SingBar.x, Theme.Sing.StaticP3SingBar.y, Theme.Sing.StaticP3SingBar.w, Theme.Sing.StaticP3SingBar.h , Player[5].ScorePercent);
+ end;
+ end;
+ end;
+ //end Singbar Mod
+
+ //PhrasenBonus - Line Bonus Mod
+ if ((Ini.LineBonus > 0) AND (DLLMan.Selected.EnLineBonus_O)) OR (DLLMan.Selected.EnLineBonus) then begin
+ A := GetTickCount div 33;
+ if (A <> Tickold2) AND (Player[0].LineBonus_Visible) then begin
+ Tickold2 := A;
+ for E := 0 to (PlayersPlay - 1) do begin
+ //Change Alpha
+ Player[E].LineBonus_Alpha := Player[E].LineBonus_Alpha - 0.02;
+
+
+ if Player[E].LineBonus_Alpha <= 0 then
+ begin
+ Player[E].LineBonus_Age := 0;
+ Player[E].LineBonus_Visible := False
+
+ end
+ else
+ begin
+ inc(Player[E].LineBonus_Age, 1);
+
+ //Change Position
+ if (Player[E].LineBonus_PosX < Player[E].LineBonus_TargetX) then
+ Player[E].LineBonus_PosX := Player[E].LineBonus_PosX + (2 - Player[E].LineBonus_Alpha * 1.5)
+ else if (Player[E].LineBonus_PosX > Player[E].LineBonus_TargetX) then
+ Player[E].LineBonus_PosX := Player[E].LineBonus_PosX - (2 - Player[E].LineBonus_Alpha * 1.5);
+
+ if (Player[E].LineBonus_PosY < Player[E].LineBonus_TargetY) then
+ Player[E].LineBonus_PosY := Player[E].LineBonus_PosY + (2 - Player[E].LineBonus_Alpha * 1.5)
+ else if (Player[E].LineBonus_PosY > Player[E].LineBonus_TargetY) then
+ Player[E].LineBonus_PosY := Player[E].LineBonus_PosY - (2 - Player[E].LineBonus_Alpha * 1.5);
+
+ end;
+ end;
+ end; //if
+
+ if PlayersPlay = 1 then begin
+ if PlayerInfo.Playerinfo[0].Enabled then
+ SingDrawLineBonus( Player[0].LineBonus_PosX, Player[0].LineBonus_PosY, Player[0].LineBonus_Color, Player[0].LineBonus_Alpha, Player[0].LineBonus_Text, Player[0].LineBonus_Age);
+ end
+ else if PlayersPlay = 2 then begin
+ if PlayerInfo.Playerinfo[0].Enabled then
+ SingDrawLineBonus( Player[0].LineBonus_PosX, Player[0].LineBonus_PosY, Player[0].LineBonus_Color, Player[0].LineBonus_Alpha, Player[0].LineBonus_Text, Player[0].LineBonus_Age);
+ if PlayerInfo.Playerinfo[1].Enabled then
+ SingDrawLineBonus( Player[1].LineBonus_PosX, Player[1].LineBonus_PosY, Player[1].LineBonus_Color, Player[1].LineBonus_Alpha, Player[1].LineBonus_Text, Player[1].LineBonus_Age);
+ end
+ else if PlayersPlay = 3 then begin
+ if PlayerInfo.Playerinfo[0].Enabled then
+ SingDrawLineBonus( Player[0].LineBonus_PosX, Player[0].LineBonus_PosY, Player[0].LineBonus_Color, Player[0].LineBonus_Alpha, Player[0].LineBonus_Text, Player[0].LineBonus_Age);
+ if PlayerInfo.Playerinfo[1].Enabled then
+ SingDrawLineBonus( Player[1].LineBonus_PosX, Player[1].LineBonus_PosY, Player[1].LineBonus_Color, Player[1].LineBonus_Alpha, Player[1].LineBonus_Text, Player[1].LineBonus_Age);
+ if PlayerInfo.Playerinfo[2].Enabled then
+ SingDrawLineBonus( Player[2].LineBonus_PosX, Player[2].LineBonus_PosY, Player[2].LineBonus_Color, Player[2].LineBonus_Alpha, Player[2].LineBonus_Text, Player[2].LineBonus_Age);
+ end
+ else if PlayersPlay = 4 then begin
+ if ScreenAct = 1 then begin
+ if PlayerInfo.Playerinfo[0].Enabled then
+ SingDrawLineBonus( Player[0].LineBonus_PosX, Player[0].LineBonus_PosY, Player[0].LineBonus_Color, Player[0].LineBonus_Alpha, Player[0].LineBonus_Text, Player[0].LineBonus_Age);
+ if PlayerInfo.Playerinfo[1].Enabled then
+ SingDrawLineBonus( Player[1].LineBonus_PosX, Player[1].LineBonus_PosY, Player[1].LineBonus_Color, Player[1].LineBonus_Alpha, Player[1].LineBonus_Text, Player[1].LineBonus_Age);
+ end;
+ if ScreenAct = 2 then begin
+ if PlayerInfo.Playerinfo[2].Enabled then
+ SingDrawLineBonus( Player[2].LineBonus_PosX, Player[2].LineBonus_PosY, Player[2].LineBonus_Color, Player[2].LineBonus_Alpha, Player[2].LineBonus_Text, Player[2].LineBonus_Age);
+ if PlayerInfo.Playerinfo[3].Enabled then
+ SingDrawLineBonus( Player[3].LineBonus_PosX, Player[3].LineBonus_PosY, Player[3].LineBonus_Color, Player[3].LineBonus_Alpha, Player[3].LineBonus_Text, Player[3].LineBonus_Age);
+ end;
+ end;
+ if PlayersPlay = 6 then begin
+ if ScreenAct = 1 then begin
+ if PlayerInfo.Playerinfo[0].Enabled then
+ SingDrawLineBonus( Player[0].LineBonus_PosX, Player[0].LineBonus_PosY, Player[0].LineBonus_Color, Player[0].LineBonus_Alpha, Player[0].LineBonus_Text, Player[0].LineBonus_Age);
+ if PlayerInfo.Playerinfo[1].Enabled then
+ SingDrawLineBonus( Player[1].LineBonus_PosX, Player[1].LineBonus_PosY, Player[1].LineBonus_Color, Player[1].LineBonus_Alpha, Player[1].LineBonus_Text, Player[1].LineBonus_Age);
+ if PlayerInfo.Playerinfo[2].Enabled then
+ SingDrawLineBonus( Player[2].LineBonus_PosX, Player[2].LineBonus_PosY, Player[2].LineBonus_Color, Player[2].LineBonus_Alpha, Player[2].LineBonus_Text, Player[2].LineBonus_Age);
+ end;
+ if ScreenAct = 2 then begin
+ if PlayerInfo.Playerinfo[3].Enabled then
+ SingDrawLineBonus( Player[3].LineBonus_PosX, Player[3].LineBonus_PosY, Player[3].LineBonus_Color, Player[3].LineBonus_Alpha, Player[3].LineBonus_Text, Player[3].LineBonus_Age);
+ if PlayerInfo.Playerinfo[4].Enabled then
+ SingDrawLineBonus( Player[4].LineBonus_PosX, Player[4].LineBonus_PosY, Player[4].LineBonus_Color, Player[4].LineBonus_Alpha, Player[4].LineBonus_Text, Player[4].LineBonus_Age);
+ if PlayerInfo.Playerinfo[5].Enabled then
+ SingDrawLineBonus( Player[5].LineBonus_PosX, Player[5].LineBonus_PosY, Player[5].LineBonus_Color, Player[5].LineBonus_Alpha, Player[5].LineBonus_Text, Player[5].LineBonus_Age);
+ end;
+ end;
+ end;
+ //PhrasenBonus - Line Bonus Mod End
+
+
+ // rysuje paski
+// Log.LogStatus('Original notes', 'SingDraw');
+ case Ini.Difficulty of
+ 0:
+ begin
+ NotesH := 11; // 9
+ NotesW := 6; // 5
+ end;
+ 1:
+ begin
+ NotesH := 8; // 7
+ NotesW := 4; // 4
+ end;
+ 2:
+ begin
+ NotesH := 5;
+ NotesW := 3;
+ end;
+ end;
+
+ if (DLLMAn.Selected.ShowNotes And DLLMan.Selected.LoadSong) then
+ begin
+ if (PlayersPlay = 1) And PlayerInfo.Playerinfo[0].Enabled then begin
+ SingDrawPlayerBGCzesc(NR.Left + 20, Skin_P2_NotesB, NR.Right - 20, 0, 0, 15);
+ SingDrawCzesc(NR.Left + 20, Skin_P2_NotesB, NR.Right - 20, 0, 15);
+ SingDrawPlayerCzesc(Nr.Left + 20, Skin_P2_NotesB, Nr.Width - 40, 0, 15);
+ end;
+
+ if (PlayersPlay = 2) then begin
+ if PlayerInfo.Playerinfo[0].Enabled then
+ begin
+ SingDrawPlayerBGCzesc(Nr.Left + 20, Skin_P1_NotesB, Nr.Right - 20, 0, 0, 15);
+ SingDrawCzesc(NR.Left + 20, Skin_P1_NotesB, NR.Right - 20, 0, 15);
+ SingDrawPlayerCzesc(Nr.Left + 20, Skin_P1_NotesB, Nr.Width - 40, 0, 15);
+ end;
+ if PlayerInfo.Playerinfo[1].Enabled then
+ begin
+ SingDrawPlayerBGCzesc(Nr.Left + 20, Skin_P2_NotesB, Nr.Right - 20, 0, 1, 15);
+ SingDrawCzesc(NR.Left + 20, Skin_P2_NotesB, NR.Right - 20, 0, 15);
+ SingDrawPlayerCzesc(Nr.Left + 20, Skin_P2_NotesB, Nr.Width - 40, 1, 15);
+ end;
+
+ end;
+
+ if PlayersPlay = 3 then begin
+ NotesW := NotesW * 0.8;
+ NotesH := NotesH * 0.8;
+
+ if PlayerInfo.Playerinfo[0].Enabled then
+ begin
+ SingDrawPlayerBGCzesc(Nr.Left + 20, 120+95, Nr.Right - 20, 0, 0, 12);
+ SingDrawCzesc(NR.Left + 20, 120+95, NR.Right - 20, 0, 12);
+ SingDrawPlayerCzesc(Nr.Left + 20, 120+95, Nr.Width - 40, 0, 12);
+ end;
+
+ if PlayerInfo.Playerinfo[1].Enabled then
+ begin
+ SingDrawPlayerBGCzesc(Nr.Left + 20, 245+95, Nr.Right - 20, 0, 1, 12);
+ SingDrawCzesc(NR.Left + 20, 245+95, NR.Right - 20, 0, 12);
+ SingDrawPlayerCzesc(Nr.Left + 20, 245+95, Nr.Width - 40, 1, 12);
+ end;
+
+ if PlayerInfo.Playerinfo[2].Enabled then
+ begin
+ SingDrawPlayerBGCzesc(Nr.Left + 20, 370+95, Nr.Right - 20, 0, 2, 12);
+ SingDrawCzesc(NR.Left + 20, 370+95, NR.Right - 20, 0, 12);
+ SingDrawPlayerCzesc(Nr.Left + 20, 370+95, Nr.Width - 40, 2, 12);
+ end;
+ end;
+
+ if PlayersPlay = 4 then begin
+ if ScreenAct = 1 then begin
+ SingDrawPlayerBGCzesc(Nr.Left + 20, Skin_P1_NotesB, Nr.Right - 20, 0, 0, 15);
+ SingDrawPlayerBGCzesc(Nr.Left + 20, Skin_P2_NotesB, Nr.Right - 20, 0, 1, 15);
+ end;
+ if ScreenAct = 2 then begin
+ SingDrawPlayerBGCzesc(Nr.Left + 20, Skin_P1_NotesB, Nr.Right - 20, 0, 2, 15);
+ SingDrawPlayerBGCzesc(Nr.Left + 20, Skin_P2_NotesB, Nr.Right - 20, 0, 3, 15);
+ end;
+
+ SingDrawCzesc(NR.Left + 20, Skin_P1_NotesB, NR.Right - 20, 0, 15);
+ SingDrawCzesc(NR.Left + 20, Skin_P2_NotesB, NR.Right - 20, 0, 15);
+
+ if ScreenAct = 1 then begin
+ SingDrawPlayerCzesc(Nr.Left + 20, Skin_P1_NotesB, Nr.Width - 40, 0, 15);
+ SingDrawPlayerCzesc(Nr.Left + 20, Skin_P2_NotesB, Nr.Width - 40, 1, 15);
+ end;
+ if ScreenAct = 2 then begin
+ SingDrawPlayerCzesc(Nr.Left + 20, Skin_P1_NotesB, Nr.Width - 40, 2, 15);
+ SingDrawPlayerCzesc(Nr.Left + 20, Skin_P2_NotesB, Nr.Width - 40, 3, 15);
+ end;
+ end;
+
+ if PlayersPlay = 6 then begin
+ NotesW := NotesW * 0.8;
+ NotesH := NotesH * 0.8;
+
+ if ScreenAct = 1 then begin
+ SingDrawPlayerBGCzesc(Nr.Left + 20, 120+95, Nr.Right - 20, 0, 0, 12);
+ SingDrawPlayerBGCzesc(Nr.Left + 20, 245+95, Nr.Right - 20, 0, 1, 12);
+ SingDrawPlayerBGCzesc(Nr.Left + 20, 370+95, Nr.Right - 20, 0, 2, 12);
+ end;
+ if ScreenAct = 2 then begin
+ SingDrawPlayerBGCzesc(Nr.Left + 20, 120+95, Nr.Right - 20, 0, 3, 12);
+ SingDrawPlayerBGCzesc(Nr.Left + 20, 245+95, Nr.Right - 20, 0, 4, 12);
+ SingDrawPlayerBGCzesc(Nr.Left + 20, 370+95, Nr.Right - 20, 0, 5, 12);
+ end;
+
+ SingDrawCzesc(NR.Left + 20, 120+95, NR.Right - 20, 0, 12);
+ SingDrawCzesc(NR.Left + 20, 245+95, NR.Right - 20, 0, 12);
+ SingDrawCzesc(NR.Left + 20, 370+95, NR.Right - 20, 0, 12);
+
+ if ScreenAct = 1 then begin
+ SingDrawPlayerCzesc(Nr.Left + 20, 120+95, Nr.Width - 40, 0, 12);
+ SingDrawPlayerCzesc(Nr.Left + 20, 245+95, Nr.Width - 40, 1, 12);
+ SingDrawPlayerCzesc(Nr.Left + 20, 370+95, Nr.Width - 40, 2, 12);
+ end;
+ if ScreenAct = 2 then begin
+ SingDrawPlayerCzesc(Nr.Left + 20, 120+95, Nr.Width - 40, 3, 12);
+ SingDrawPlayerCzesc(Nr.Left + 20, 245+95, Nr.Width - 40, 4, 12);
+ SingDrawPlayerCzesc(Nr.Left + 20, 370+95, Nr.Width - 40, 5, 12);
+ end;
+ end;
+ end;
+
+ glDisable(GL_BLEND);
+ glDisable(GL_TEXTURE_2D);
+end;
+
+
+//SingBar Mod
+procedure SingDrawSingbar(X, Y, W, H: real; Percent: integer);
+var
+ R: Real;
+ G: Real;
+ B: Real;
+ A: cardinal;
+ I: Integer;
+
+begin;
+
+ //SingBar Background
+ glColor4f(1, 1, 1, 0.8);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glBindTexture(GL_TEXTURE_2D, Tex_SingBar_Back.TexNum);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0); glVertex2f(X, Y);
+ glTexCoord2f(0, 1); glVertex2f(X, Y+H);
+ glTexCoord2f(1, 1); glVertex2f(X+W, Y+H);
+ glTexCoord2f(1, 0); glVertex2f(X+W, Y);
+ glEnd;
+
+ //SingBar coloured Bar
+ Case Percent of
+ 0..22: begin
+ R := 1;
+ G := 0;
+ B := 0;
+ end;
+ 23..42: begin
+ R := 1;
+ G := ((Percent-23)/100)*5;
+ B := 0;
+ end;
+ 43..57: begin
+ R := 1;
+ G := 1;
+ B := 0;
+ end;
+ 58..77: begin
+ R := 1-(Percent - 58)/100*5;
+ G := 1;
+ B := 0;
+ end;
+ 78..99: begin
+ R := 0;
+ G := 1;
+ B := 0;
+ end;
+ End; //Case
+
+ glColor4f(R, G, B, 1);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glBindTexture(GL_TEXTURE_2D, Tex_SingBar_Bar.TexNum);
+ //Size= Player[PlayerNum].ScorePercent of W
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0); glVertex2f(X, Y);
+ glTexCoord2f(0, 1); glVertex2f(X, Y+H);
+ glTexCoord2f(1, 1); glVertex2f(X+(W/100 * (Percent +1)), Y+H);
+ glTexCoord2f(1, 0); glVertex2f(X+(W/100 * (Percent +1)), Y);
+ glEnd;
+
+ //SingBar Front
+ glColor4f(1, 1, 1, 0.6);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glBindTexture(GL_TEXTURE_2D, Tex_SingBar_Front.TexNum);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0); glVertex2f(X, Y);
+ glTexCoord2f(0, 1); glVertex2f(X, Y+H);
+ glTexCoord2f(1, 1); glVertex2f(X+W, Y+H);
+ glTexCoord2f(1, 0); glVertex2f(X+W, Y);
+ glEnd;
+end;
+//end Singbar Mod
+
+//PhrasenBonus - Line Bonus Mod
+procedure SingDrawLineBonus( const X, Y: Single; Color: TRGB; Alpha: Single; Text: string; Age: Integer);
+var
+Length, X2: Real; //Length of Text
+Size: Integer; //Size of Popup
+begin
+if Alpha <> 0 then
+begin
+
+//Set Font Propertys
+SetFontStyle(2); //Font: Outlined1
+if Age < 5 then SetFontSize(Age + 1) else SetFontSize(6);
+SetFontItalic(False);
+
+//Check Font Size
+Length := glTextWidth ( PChar(Text)) + 3; //Little Space for a Better Look ^^
+
+//Text
+SetFontPos (X + 50 - (Length / 2), Y + 12); //Position
+
+
+if Age < 5 then Size := Age * 10 else Size := 50;
+
+ //Draw Background
+ glColor4f(Color.R, Color.G, Color.B, Alpha); //Set Color
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ //glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+
+ //New Method, Not Variable
+ glBindTexture(GL_TEXTURE_2D, Tex_SingLineBonusBack.TexNum);
+
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0); glVertex2f(X + 50 - Size, Y + 25 - (Size/2));
+ glTexCoord2f(0, 1); glVertex2f(X + 50 - Size, Y + 25 + (Size/2));
+ glTexCoord2f(1, 1); glVertex2f(X + 50 + Size, Y + 25 + (Size/2));
+ glTexCoord2f(1, 0); glVertex2f(X + 50 + Size, Y + 25 - (Size/2));
+ glEnd;
+
+ glColor4f(1, 1, 1, Alpha); //Set Color
+ //Draw Text
+ glPrint (PChar(Text));
+end;
+end;
+//PhrasenBonus - Line Bonus Mod
+
+// Draw Note Bars for Editor
+//There are 11 Resons for a new Procdedure:
+// 1. It don't look good when you Draw the Golden Note Star Effect in the Editor
+// 2. You can see the Freestyle Notes in the Editor SemiTransparent
+// 3. Its easier and Faster then changing the old Procedure
+procedure EditDrawCzesc(Left, Top, Right: real; NrCzesci: integer; Space: integer);
+var
+ Rec: TRecR;
+ Pet: integer;
+ TempR: real;
+begin
+ glColor3f(1, 1, 1);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ TempR := (Right-Left) / (Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt].Koniec - Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt].StartNote);
+ with Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt] do begin
+ for Pet := 0 to HighNut do begin
+ with Nuta[Pet] do begin
+
+ // Golden Note Patch
+ if isMedley or isStartPreview then
+ begin
+ case Wartosc of
+ 0: glColor4f(0, 1, 1, 0.35);
+ 1: glColor4f(0, 1, 1, 0.85);
+ 2: glColor4f(0, 1, 0.3, 0.85);
+ end; // case
+ end else
+ begin
+ case Wartosc of
+ 0: glColor4f(1, 1, 1, 0.35); //freestyle
+ 1: glColor4f(1, 1, 1, 0.85); //normal
+ 2: glColor4f(1, 1, 0.3, 0.85); //golden (green)
+ end; // case
+ end;
+
+
+
+ // lewa czesc - left part
+ Rec.Left := (Start-Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt].StartNote) * TempR + Left + 0.5 + 10*ScreenX;
+ Rec.Right := Rec.Left + NotesW;
+ Rec.Top := Top - (Ton-BaseNote)*Space/2 - NotesH;
+ Rec.Bottom := Rec.Top + 2 * NotesH;
+ glBindTexture(GL_TEXTURE_2D, Tex_Left[Color].TexNum);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0); glVertex2f(Rec.Left, Rec.Top);
+ glTexCoord2f(0, 1); glVertex2f(Rec.Left, Rec.Bottom);
+ glTexCoord2f(1, 1); glVertex2f(Rec.Right, Rec.Bottom);
+ glTexCoord2f(1, 0); glVertex2f(Rec.Right, Rec.Top);
+ glEnd;
+
+ // srodkowa czesc - middle part
+ Rec.Left := Rec.Right;
+ Rec.Right := (Start+Dlugosc-Czesci[NrCzesci].Czesc[Czesci[NrCzesci].Akt].StartNote) * TempR + Left - NotesW - 0.5 + 10*ScreenX;
+
+ glBindTexture(GL_TEXTURE_2D, Tex_Mid[Color].TexNum);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0); glVertex2f(Rec.Left, Rec.Top);
+ glTexCoord2f(0, 1); glVertex2f(Rec.Left, Rec.Bottom);
+ glTexCoord2f(1, 1); glVertex2f(Rec.Right, Rec.Bottom);
+ glTexCoord2f(1, 0); glVertex2f(Rec.Right, Rec.Top);
+ glEnd;
+
+ // prawa czesc - right part
+ Rec.Left := Rec.Right;
+ Rec.Right := Rec.Right + NotesW;
+
+ glBindTexture(GL_TEXTURE_2D, Tex_Right[Color].TexNum);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0); glVertex2f(Rec.Left, Rec.Top);
+ glTexCoord2f(0, 1); glVertex2f(Rec.Left, Rec.Bottom);
+ glTexCoord2f(1, 1); glVertex2f(Rec.Right, Rec.Bottom);
+ glTexCoord2f(1, 0); glVertex2f(Rec.Right, Rec.Top);
+ glEnd;
+
+ end; // with
+ end; // for
+ end; // with
+
+ glDisable(GL_BLEND);
+ glDisable(GL_TEXTURE_2D);
+end;
+
+procedure SingDrawTimeBar();
+var x,y: real;
+ width, height: real;
+ CurTime, TotalTime: real;
+ progress: real;
+begin
+ x := Theme.Sing.StaticTimeProgress.x;
+ y := Theme.Sing.StaticTimeProgress.y;
+ width:= Theme.Sing.StaticTimeProgress.w;
+ height:= Theme.Sing.StaticTimeProgress.h;
+
+ if (ScreenSong.Mode = smMedley) then
+ begin
+ CurTime := Czas.Teraz - ScreenSing.MedleyStart;
+ TotalTime := ScreenSing.MedleyEnd - ScreenSing.MedleyStart;
+ end else if ScreenSong.PartyMedley then
+ begin
+ CurTime := Czas.Teraz - ScreenSingModi.MedleyStart;
+ TotalTime := ScreenSingModi.MedleyEnd - ScreenSingModi.MedleyStart;
+ end else
+ begin
+ CurTime := Czas.Teraz - AktSong.Start;
+ TotalTime := Czas.Razem - AktSong.Start;
+ end;
+
+ progress := CurTime/TotalTime;
+
+ glColor4f(Theme.Sing.StaticTimeProgress.ColR,
+ Theme.Sing.StaticTimeProgress.ColG,
+ Theme.Sing.StaticTimeProgress.ColB, 1); //Set Color
+
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+
+ glBindTexture(GL_TEXTURE_2D, Tex_TimeProgress.TexNum);
+
+ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0); glVertex2f(x,y);
+ glTexCoord2f(0, 1); glVertex2f(x+width*progress, y);
+ glTexCoord2f(1, 1); glVertex2f(x+width*progress, y+height);
+ glTexCoord2f(1, 0); glVertex2f(x, y+height);
+ glEnd;
+
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+ glcolor4f(1,1,1,1);
+end;
+
+end.
+
diff --git a/Game/Code/Classes/UFiles.pas b/Game/Code/Classes/UFiles.pas
new file mode 100644
index 00000000..3f450979
--- /dev/null
+++ b/Game/Code/Classes/UFiles.pas
@@ -0,0 +1,1153 @@
+unit UFiles;
+
+interface
+
+uses USongs,
+ SysUtils,
+ ULog,
+ UMusic;
+
+const
+ DEFAULT_FADE_IN_TIME = 8; //TODO in INI
+ DEFAULT_FADE_OUT_TIME = 2;
+
+procedure InitializePaths; //Function sets All Absolute Paths eg. for Songs
+function ReadTXTHeader(var Song: TSong): boolean; //Reads Standard TXT Header
+function AnalyseFile(var Song: TSong): boolean; //Analyse Song File and Read Header
+procedure ClearSong(var Song: TSong); //Clears Song Header values
+
+//Methodes Loading and Saving Songfiles
+procedure ResetSingTemp;
+procedure ParseNote(NrCzesci: integer; TypeP: char; StartP, DurationP, NoteP: integer; LyricS: string);
+procedure NewSentence(NrCzesciP: integer; Param1, Param2: integer; LoadFullFile: boolean);
+function LoadSong(Name: string; LoadFullFile: boolean): boolean;
+function SaveSong(Song: TSong; Czesc: TCzesci; Name: string; Relative: boolean): boolean;
+procedure FindRefrainStart(var Song: TSong);
+procedure SetMedleyMode;
+
+
+
+var
+ //Absolute Paths
+ GamePath: string;
+ SoundPath: string;
+ SongPath: string;
+ LogPath: string;
+ ThemePath: string;
+ ScreenshotsPath: string;
+ CoversPath: string;
+ LanguagesPath: string;
+ PluginPath: string;
+ PlayListPath: string;
+
+ SongFile: TextFile; // all procedures in this unit operates on this file
+ FileLineNo: integer; //Line which is readed at Last, for error reporting
+
+ // variables available for all procedures
+ Base: array[0..1] of integer;
+ Rel: array[0..1] of integer;
+ Mult: integer = 1;
+ MultBPM: integer = 4;
+
+implementation
+uses TextGL, UIni, UMain;
+
+
+//--------------------
+// Function sets all Absolute Paths e.g. Song Path and makes sure the Directorys exist
+//--------------------
+procedure InitializePaths;
+var
+ Writeable: Boolean;
+begin
+ GamePath := ExtractFilePath(ParamStr(0));
+
+ SoundPath := GamePath + 'Sounds\';
+ SongPath := GamePath + 'Songs\';
+ LogPath := GamePath;
+ ThemePath := GamePath + 'Themes\';
+ ScreenshotsPath := GamePath + 'Screenshots\';
+ CoversPath := GamePath + 'Covers\';
+ LanguagesPath := GamePath + 'Languages\';
+ PluginPath := GamePath + 'Plugins\';
+ PlaylistPath := GamePath + 'Playlists\';
+
+ Writeable := true;
+
+ //After Setting Paths, make sure that Paths exist
+ If not DirectoryExists(SoundPath) then
+ Writeable := ForceDirectories(SoundPath);
+
+ If Writeable And (not DirectoryExists(SongPath)) then
+ Writeable := ForceDirectories(SongPath);
+
+ If Writeable And (not DirectoryExists(ThemePath)) then
+ Writeable := ForceDirectories(ThemePath);
+
+ If Writeable And (not DirectoryExists(ScreenshotsPath)) then
+ Writeable := ForceDirectories(ScreenshotsPath);
+
+ If Writeable And (not DirectoryExists(CoversPath)) then
+ Writeable := ForceDirectories(CoversPath);
+
+ If Writeable And (not DirectoryExists(LanguagesPath)) then
+ Writeable := ForceDirectories(LanguagesPath);
+
+ If Writeable And (not DirectoryExists(PluginPath)) then
+ Writeable := ForceDirectories(PluginPath);
+
+ If Writeable And (not DirectoryExists(PlaylistPath)) then
+ Writeable := ForceDirectories(PlaylistPath);
+
+ if not Writeable then
+ Log.LogError('Error: Dir is Readonly');
+
+ DecimalSeparator := ',';
+end;
+
+//--------------------
+// Clears Song Header values
+//--------------------
+procedure ClearSong(var Song: TSong);
+begin
+ //Main Information
+ Song.Title := '';
+ Song.Artist := '';
+
+ //Sortings:
+ Song.Genre := 'Unknown';
+ Song.Edition := 'Unknown';
+ Song.Language := 'Unknown'; //Language Patch
+
+ //Required Information
+ Song.Mp3 := '';
+ Song.BPM := 0;
+ Song.GAP := 0;
+ Song.Start := 0;
+ Song.Finish := 0;
+
+ //Additional Information
+ Song.Background := '';
+ Song.Cover := '';
+ Song.Video := '';
+ Song.VideoGAP := 0;
+ Song.NotesGAP := 0;
+ Song.Resolution := 4;
+ Song.Creator := '';
+ Song.Medley.Source:=msNone;
+ Song.PreviewStart := 0;
+ SetLength(Song.CustomTags, 0);
+end;
+
+//--------------------
+// Reads Standard TXT Header
+//--------------------
+function ReadTXTHeader(var Song: TSong): boolean;
+var
+ Line, Identifier, Value: String;
+ Temp: word;
+ Done: byte;
+ MedleyFlags: byte; //bit-vector for medley/preview tags
+ lWarnIfTagsNotFound : Boolean;
+
+ { adds a custom header tag to the song
+ if there is no ':' in the read line, Tag should be empty
+ and the whole line should be in Content } //from usdx 1.1
+ procedure AddCustomTag(const Tag, Content: String);
+ var Len: Integer;
+ begin
+ Len := Length(Song.CustomTags);
+ SetLength(Song.CustomTags, Len + 1);
+ Song.CustomTags[Len].Tag := Tag;
+ Song.CustomTags[Len].Content := Content;
+ end;
+
+begin
+ Result := true;
+ Done := 0;
+ MedleyFlags := 0;
+
+ lWarnIfTagsNotFound := ( lowercase( Song.Filename ) <> 'license.txt' ) AND
+ ( lowercase( Song.Filename ) <> 'readme.txt' ) ;
+
+
+ //Read first Line
+ ReadLn (SongFile, Line);
+
+ if (Length(Line)<=0) then
+ begin
+ Log.LogError('File Starts with Empty Line: ' + Song.FileName);
+ Result := False;
+ Exit;
+ end;
+
+ //Read Lines while Line starts with #
+ While (Length(Line) = 0) OR (Line[1] = '#') do
+ begin
+ //Increase Line Number
+ Inc (FileLineNo);
+ Temp := Pos(':', Line);
+
+ //Line has a Seperator-> Headerline
+ if (Temp <> 0) then
+ begin
+ //Read Identifier and Value
+ Identifier := Uppercase(Trim(Copy(Line, 2, Temp - 2))); //Uppercase is for Case Insensitive Checks
+ Value := Trim(Copy(Line, Temp + 1,Length(Line) - Temp));
+
+ //Check the Identifier (If Value is given)
+ if (Length(Value) <> 0) then
+ begin
+
+ //-----------
+ //Required Attributes
+ //-----------
+
+ //Title
+ if (Identifier = 'TITLE') then
+ begin
+ Song.Title := Value;
+
+ //Add Title Flag to Done
+ Done := Done or 1;
+ end
+
+ //Artist
+ else if (Identifier = 'ARTIST') then
+ begin
+ Song.Artist := Value;
+
+ //Add Artist Flag to Done
+ Done := Done or 2;
+ end
+
+ //MP3 File //Test if Exists
+ else if (Identifier = 'MP3') AND (FileExists(Song.Path + Value)) then
+ begin
+ Song.Mp3 := Value;
+
+ //Add Mp3 Flag to Done
+ Done := Done or 4;
+ end
+
+ //Beats per Minute
+ else if (Identifier = 'BPM') then
+ begin
+ // Replace . with ,
+ if (Pos('.', Value) <> 0) then
+ Value[Pos('.', Value)] := ',';
+
+ SetLength(Song.BPM, 1);
+ Song.BPM[0].StartBeat := 0;
+
+ Song.BPM[0].BPM := StrtoFloatDef(Value, 0) * Mult * MultBPM;
+
+ if Song.BPM[0].BPM <> 0 then
+ begin
+ //Add BPM Flag to Done
+ Done := Done or 8;
+ end;
+ end
+
+ //---------
+ //Additional Header Information
+ //---------
+
+ // Video Gap
+ else if (Identifier = 'GAP') then
+ begin
+ // Replace . with ,
+ if (Pos('.', Value) <> 0) then
+ Value[Pos('.', Value)] := ',';
+
+ Song.GAP := StrtoFloatDef (Value, 0);
+ end
+
+ //Cover Picture
+ else if (Identifier = 'COVER') then
+ begin
+ Song.Cover := Value;
+ end
+
+ //Background Picture
+ else if (Identifier = 'BACKGROUND') then
+ begin
+ Song.Background := Value;
+ end
+
+ // Video File
+ else if (Identifier = 'VIDEO') then
+ begin
+ if (FileExists(Song.Path + Value)) then
+ Song.Video := Value
+ else
+ Log.LogError('Can''t find Video File in Song: ' + Song.Path + Song.FileName);
+ end
+
+ // Video Gap
+ else if (Identifier = 'VIDEOGAP') then
+ begin
+ // Replace . with ,
+ if (Pos('.', Value) <> 0) then
+ Value[Pos('.', Value)] := ',';
+
+ Song.VideoGAP := StrtoFloatDef (Value, 0);
+ end
+
+ //Genre Sorting
+ else if (Identifier = 'GENRE') then
+ begin
+ Song.Genre := Value;
+ end
+
+ //Edition Sorting
+ else if (Identifier = 'EDITION') then
+ begin
+ Song.Edition := Value;
+ end
+
+ //Creator Tag
+ else if (Identifier = 'CREATOR') then
+ begin
+ Song.Creator := Value;
+ end
+
+ //Language Sorting
+ else if (Identifier = 'LANGUAGE') then
+ begin
+ Song.Language := Value;
+ end
+
+ // Song Start
+ else if (Identifier = 'START') then
+ begin
+ // Replace . with ,
+ if (Pos('.', Value) <> 0) then
+ Value[Pos('.', Value)] := ',';
+
+ Song.Start := StrtoFloatDef(Value, 0);
+ end
+
+ // Song Ending
+ else if (Identifier = 'END') then
+ begin
+ TryStrtoInt(Value, Song.Finish);
+ end
+
+ // Resolution
+ else if (Identifier = 'RESOLUTION') then
+ begin
+ TryStrtoInt(Value, Song.Resolution);
+ end
+
+ // Notes Gap
+ else if (Identifier = 'NOTESGAP') then
+ begin
+ TryStrtoInt(Value, Song.NotesGAP);
+ end
+
+ // Relative Notes
+ else if (Identifier = 'RELATIVE') AND (uppercase(Value) = 'YES') then
+ begin
+ Song.Relative := True;
+ end
+
+ // PreviewStart
+ else if (Identifier = 'PREVIEWSTART') then
+ begin
+ Song.PreviewStart := StrToFloatDef(Value, 0);
+ if (Song.PreviewStart>0) then
+ MedleyFlags := MedleyFlags or 1;
+ end
+
+ // MedleyStartBeat
+ else if (Identifier = 'MEDLEYSTARTBEAT') and not Song.Relative then
+ begin
+ if TryStrtoInt(Value, Song.Medley.StartBeat) then
+ MedleyFlags := MedleyFlags or 2;
+ end
+
+ // MedleyEndBeat
+ else if (Identifier = 'MEDLEYENDBEAT') and not Song.Relative then
+ begin
+ if TryStrtoInt(Value, Song.Medley.EndBeat) then
+ MedleyFlags := MedleyFlags or 4;
+ end
+
+ // unsupported tag
+ else
+ begin
+ AddCustomTag(Identifier, Value);
+ end;
+
+ end;
+ end;
+
+ if not EOf(SongFile) then
+ ReadLn (SongFile, Line)
+ else
+ begin
+ Result := False;
+
+ if lWarnIfTagsNotFound then
+ begin
+ Log.LogError('File Incomplete or not Ultrastar TxT: ' + Song.FileName);
+ end;
+
+ break;
+ end;
+
+ {//End on first empty Line
+ if (Length(Line) = 0) then
+ break;}
+ end;
+
+ //Check if all Required Values are given
+ if (Done <> 15) then
+ begin
+ Result := False;
+ If lWarnIfTagsNotFound then
+ begin
+ if (Done and 8) = 0 then //No BPM Flag
+ Log.LogError('BPM Tag Missing: ' + Song.FileName)
+ else if (Done and 4) = 0 then //No MP3 Flag
+ Log.LogError('MP3 Tag/File Missing: ' + Song.FileName)
+ else if (Done and 2) = 0 then //No Artist Flag
+ Log.LogError('Artist Tag Missing: ' + Song.FileName)
+ else if (Done and 1) = 0 then //No Title Flag
+ Log.LogError('Title Tag Missing: ' + Song.FileName)
+ else //unknown Error
+ Log.LogError('File Incomplete or not Ultrastar TxT: ' + Song.FileName);
+ end;
+ end else
+ begin //check medley tags
+ if (MedleyFlags and 6)=6 then //MedleyStartBeat and MedleyEndBeat are both set
+ begin
+ if Song.Medley.StartBeat >= Song.Medley.EndBeat then
+ MedleyFlags := MedleyFlags - 6;
+ end;
+
+ if ((MedleyFlags and 1)=0) or (Song.PreviewStart<=0) then //PreviewStart is not set or <=0
+ begin
+ if (MedleyFlags and 2)=2 then
+ Song.PreviewStart := GetTimeFromBeat(Song.Medley.StartBeat) //fallback to MedleyStart
+ else
+ Song.PreviewStart := 0; //else set it to 0, it will be set in FindRefrainStart
+ end;
+
+ if (MedleyFlags and 6)=6 then
+ begin
+ Song.Medley.Source := msTag;
+
+ //calculate fade time
+ Song.Medley.FadeIn_time := DEFAULT_FADE_IN_TIME;
+
+ Song.Medley.FadeOut_time := DEFAULT_FADE_OUT_TIME;
+ end else
+ Song.Medley.Source := msNone;
+ end;
+
+end;
+
+//--------------------
+// Analyse Song File and Read Header
+//--------------------
+function AnalyseFile(var Song: TSong): boolean;
+begin
+Result := False;
+{try }
+ //Reset LineNo
+ FileLineNo := 0;
+
+ //Open File and set File Pointer to the beginning
+ AssignFile(SongFile, Song.Path + Song.FileName);
+ Reset(SongFile);
+
+ //Clear old Song Header
+ ClearSong(Song);
+
+ //Read Header
+ Result := ReadTxTHeader(Song);
+
+ //And Close File
+ CloseFile(SongFile);
+{except
+ CloseFile(SongFile);
+
+ Result := False;
+ //Error Reporting
+ Log.LogError('An Error occured reading Line ' + inttostr(FileLineNo) + ' from SongHeader: ' + Song.FileName);
+end;}
+end;
+
+//--------------------
+// Resets the temporary Sentence Arrays for each Player and some other Variables
+//--------------------
+procedure ResetSingTemp;
+var
+ Pet: integer;
+begin
+ SetLength(Czesci, Length(Player));
+ SetLength(AktSong.BPM, 0);
+ for Pet := 0 to High(Player) do begin
+ SetLength(Czesci[Pet].Czesc, 1);
+ SetLength(Czesci[Pet].Czesc[0].Nuta, 0);
+ Czesci[Pet].Czesc[0].Lyric := '';
+ Czesci[Pet].Czesc[0].LyricWidth := 0;
+ Player[pet].Score := 0;
+ Player[pet].IlNut := 0;
+ Player[pet].HighNut := -1;
+ end;
+ //Reset Path and Filename Values to Prevent Errors in Editor
+ AktSong.Path := '';
+ AktSong.FileName := '';
+end;
+
+//--------------------
+// Parses Note Infos and save them to Array
+//--------------------
+procedure ParseNote(NrCzesci: integer; TypeP: char; StartP, DurationP, NoteP: integer; LyricS: string);
+var
+ Space: boolean;
+begin
+ case Ini.Solmization of
+ 1: // european
+ begin
+ case (NoteP mod 12) of
+ 0..1: LyricS := ' do ';
+ 2..3: LyricS := ' re ';
+ 4: LyricS := ' mi ';
+ 5..6: LyricS := ' fa ';
+ 7..8: LyricS := ' sol ';
+ 9..10: LyricS := ' la ';
+ 11: LyricS := ' si ';
+ end;
+ end;
+ 2: // japanese
+ begin
+ case (NoteP mod 12) of
+ 0..1: LyricS := ' do ';
+ 2..3: LyricS := ' re ';
+ 4: LyricS := ' mi ';
+ 5..6: LyricS := ' fa ';
+ 7..8: LyricS := ' so ';
+ 9..10: LyricS := ' la ';
+ 11: LyricS := ' shi ';
+ end;
+ end;
+ 3: // american
+ begin
+ case (NoteP mod 12) of
+ 0..1: LyricS := ' do ';
+ 2..3: LyricS := ' re ';
+ 4: LyricS := ' mi ';
+ 5..6: LyricS := ' fa ';
+ 7..8: LyricS := ' sol ';
+ 9..10: LyricS := ' la ';
+ 11: LyricS := ' ti ';
+ end;
+ end;
+ end; // case
+
+ with Czesci[NrCzesci].Czesc[Czesci[NrCzesci].High] do begin
+ SetLength(Nuta, Length(Nuta) + 1);
+ IlNut := IlNut + 1;
+ HighNut := HighNut + 1;
+ Muzyka.IlNut := Muzyka.IlNut + 1;
+
+ Nuta[HighNut].Start := StartP;
+ if IlNut = 1 then begin
+ StartNote := Nuta[HighNut].Start;
+ if Czesci[NrCzesci].Ilosc = 1 then
+ Start := -100;
+// Start := Nuta[HighNut].Start;
+ end;
+
+ Nuta[HighNut].Dlugosc := DurationP;
+ Muzyka.DlugoscNut := Muzyka.DlugoscNut + Nuta[HighNut].Dlugosc;
+
+ // back to the normal system with normal, golden and now freestyle notes
+ case TypeP of
+ 'F': Nuta[HighNut].Wartosc := 0;
+ ':': Nuta[HighNut].Wartosc := 1;
+ '*': Nuta[HighNut].Wartosc := 2;
+ end;
+
+ Czesci[NrCzesci].Wartosc := Czesci[NrCzesci].Wartosc + Nuta[HighNut].Dlugosc * Nuta[HighNut].Wartosc;
+
+ Nuta[HighNut].Ton := NoteP;
+ if Nuta[HighNut].Ton < Base[NrCzesci] then Base[NrCzesci] := Nuta[HighNut].Ton;
+ Nuta[HighNut].TonGamy := Nuta[HighNut].TonGamy mod 12;
+
+ Nuta[HighNut].Tekst := Copy(LyricS, 2, 100);
+ Lyric := Lyric + Nuta[HighNut].Tekst;
+
+ if TypeP = 'F' then
+ Nuta[HighNut].FreeStyle := true;
+
+ Koniec := Nuta[HighNut].Start + Nuta[HighNut].Dlugosc;
+ end; // with
+end;
+
+//--------------------
+// Called when a new Sentence is found in the TXT File
+//--------------------
+procedure NewSentence(NrCzesciP: integer; Param1, Param2: integer; LoadFullFile: boolean);
+var
+I: Integer;
+begin
+
+ // stara czesc //Alter Satz //Update Old Part
+ Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].BaseNote := Base[NrCzesciP];
+ if LoadFullFile then
+ Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].LyricWidth := glTextWidth(PChar(Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].Lyric));
+
+ //Total Notes Patch
+ Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].TotalNotes := 0;
+ for I := low(Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].Nuta) to high(Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].Nuta) do
+ begin
+ Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].TotalNotes := Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].TotalNotes + Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].Nuta[I].Dlugosc * Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].Nuta[I].Wartosc;
+ end;
+ //Total Notes Patch End
+
+
+ // nowa czesc //Neuer Satz //Update New Part
+ SetLength(Czesci[NrCzesciP].Czesc, Czesci[NrCzesciP].Ilosc + 1);
+ Czesci[NrCzesciP].High := Czesci[NrCzesciP].High + 1;
+ Czesci[NrCzesciP].Ilosc := Czesci[NrCzesciP].Ilosc + 1;
+ Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].HighNut := -1;
+
+ if not AktSong.Relative then
+ Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].Start := Param1;
+
+ if AktSong.Relative then begin
+ Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].Start := Param1;
+ Rel[NrCzesciP] := Rel[NrCzesciP] + Param2;
+ end;
+
+ Base[NrCzesciP] := 100; // high number
+end;
+
+//--------------------
+// Load a Song
+//--------------------
+function LoadSong(Name: string; LoadFullFile: boolean): boolean;
+var
+ TempC: char;
+ Tekst: string;
+ CP: integer; // Current Player (0 or 1)
+ Pet: integer;
+ Both: boolean;
+ Param1: integer;
+ Param2: integer;
+ Param3: integer;
+ ParamS: string;
+ I: Integer;
+ isNewSentence: boolean;
+begin
+ Result := false;
+
+ if not FileExists(Name) then begin
+ Log.LogError('File not found: "' + Name + '"', 'LoadSong');
+ exit;
+ end;
+
+ try
+ MultBPM := 4; // 4 - mnoznik dla czasu nut
+ Mult := 1; // 4 - dokladnosc pomiaru nut
+ Base[0] := 100; // high number
+// Base[1] := 100; // high number
+ Czesci[0].Wartosc := 0;
+// Czesci[1].Wartosc := 0; // here was the error in 0.3.2
+ if LoadFullFile then
+ AktSong.Relative := false;
+
+ Rel[0] := 0;
+// Rel[1] := 0;
+ CP := 0;
+ Both := false;
+ if Length(Player) = 2 then Both := true;
+
+ FileMode := fmOpenRead;
+ AssignFile(SongFile, Name);
+
+ if LoadFullFile then
+ begin
+ Reset(SongFile);
+
+ //Clear old Song Header
+ ClearSong(AktSong);
+
+ if (AktSong.Path = '') then
+ AktSong.Path := ExtractFilePath(Name);
+
+ if (AktSong.FileName = '') then
+ AktSong.Filename := ExtractFileName(Name);
+ //Read Header
+ Result := ReadTxTHeader(AktSong);
+ if not Result then
+ begin
+ CloseFile(SongFile);
+ FileMode := fmOpenReadWrite;
+ Log.LogError('Error Loading SongHeader, abort Song Loading. File: ' + Name);
+ Exit;
+ end;
+ end;
+
+ Result := False;
+
+ Reset(SongFile);
+ FileLineNo := 0;
+ //Search for Note Begining
+ repeat
+ ReadLn(SongFile, Tekst);
+ Inc(FileLineNo);
+
+ if (EoF(SongFile)) then
+ begin //Song File Corrupted - No Notes
+ CloseFile(SongFile);
+ FileMode := fmOpenReadWrite;
+ Log.LogError('Could not load txt File, no Notes found: ' + Name);
+ Result := False;
+ Exit;
+ end;
+ Read(SongFile, TempC);
+ until ((TempC = ':') or (TempC = 'F') or (TempC = '*'));
+
+ SetLength(Czesci, 2);
+ for Pet := 0 to High(Czesci) do begin
+ SetLength(Czesci[Pet].Czesc, 1);
+ Czesci[Pet].High := 0;
+ Czesci[Pet].Ilosc := 1;
+ Czesci[Pet].Akt := 0;
+ Czesci[Pet].Resolution := AktSong.Resolution;
+ Czesci[Pet].NotesGAP := AktSong.NotesGAP;
+ Czesci[Pet].Czesc[0].IlNut := 0;
+ Czesci[Pet].Czesc[0].HighNut := -1;
+ end;
+
+// TempC := ':';
+// TempC := Tekst[1]; // read from backup variable, don't use default ':' value
+ isNewSentence := false;
+ while (TempC <> 'E') AND (not EOF(SongFile)) do begin
+ if (TempC = ':') or (TempC = '*') or (TempC = 'F') then begin
+ // wczytuje nute
+ Read(SongFile, Param1);
+ Read(SongFile, Param2);
+ Read(SongFile, Param3);
+ Read(SongFile, ParamS);
+
+ // dodaje nute
+ if not Both then
+ // P1
+ ParseNote(0, TempC, (Param1+Rel[0]) * Mult, Param2 * Mult, Param3, ParamS)
+ else begin
+ // P1 + P2
+ ParseNote(0, TempC, (Param1+Rel[0]) * Mult, Param2 * Mult, Param3, ParamS);
+ ParseNote(1, TempC, (Param1+Rel[1]) * Mult, Param2 * Mult, Param3, ParamS);
+ end;
+ isNewSentence := false;
+ end; // if
+ if TempC = '-' then begin
+ if isNewSentence then
+ begin
+ Log.LogError('Double sentence break in file: "' + Name + '" (LoadSong)');
+ Result := False;
+ Exit;
+ end;
+ // reads sentence
+ Read(SongFile, Param1);
+ if AktSong.Relative then Read(SongFile, Param2); // read one more data for relative system
+
+ // new sentence
+ if not Both then
+ // P1
+ NewSentence(0, (Param1 + Rel[0]) * Mult, Param2, LoadFullFile)
+ else begin
+ // P1 + P2
+ NewSentence(0, (Param1 + Rel[0]) * Mult, Param2, LoadFullFile);
+ NewSentence(1, (Param1 + Rel[1]) * Mult, Param2, LoadFullFile);
+ end;
+ isNewSentence := true;
+ end; // if
+
+ if TempC = 'B' then begin
+ SetLength(AktSong.BPM, Length(AktSong.BPM) + 1);
+ Read(SongFile, AktSong.BPM[High(AktSong.BPM)].StartBeat);
+ AktSong.BPM[High(AktSong.BPM)].StartBeat := AktSong.BPM[High(AktSong.BPM)].StartBeat + Rel[0];
+
+ Read(SongFile, Tekst);
+ AktSong.BPM[High(AktSong.BPM)].BPM := StrToFloat(Tekst);
+ AktSong.BPM[High(AktSong.BPM)].BPM := AktSong.BPM[High(AktSong.BPM)].BPM * Mult * MultBPM;
+ end;
+
+
+ if not Both then begin
+ Czesci[CP].Czesc[Czesci[CP].High].BaseNote := Base[CP];
+ if LoadFullFile then
+ Czesci[CP].Czesc[Czesci[CP].High].LyricWidth := glTextWidth(PChar(Czesci[CP].Czesc[Czesci[CP].High].Lyric));
+ //Total Notes Patch
+ Czesci[CP].Czesc[Czesci[CP].High].TotalNotes := 0;
+ for I := low(Czesci[CP].Czesc[Czesci[CP].High].Nuta) to high(Czesci[CP].Czesc[Czesci[CP].High].Nuta) do
+ begin
+ Czesci[CP].Czesc[Czesci[CP].High].TotalNotes := Czesci[CP].Czesc[Czesci[CP].High].TotalNotes + Czesci[CP].Czesc[Czesci[CP].High].Nuta[I].Dlugosc * Czesci[CP].Czesc[Czesci[CP].High].Nuta[I].Wartosc;
+ end;
+ //Total Notes Patch End
+ end else begin
+ for Pet := 0 to High(Czesci) do begin
+ Czesci[Pet].Czesc[Czesci[Pet].High].BaseNote := Base[Pet];
+ if LoadFullFile then
+ Czesci[Pet].Czesc[Czesci[Pet].High].LyricWidth := glTextWidth(PChar(Czesci[Pet].Czesc[Czesci[Pet].High].Lyric));
+ //Total Notes Patch
+ Czesci[Pet].Czesc[Czesci[Pet].High].TotalNotes := 0;
+ for I := low(Czesci[Pet].Czesc[Czesci[Pet].High].Nuta) to high(Czesci[Pet].Czesc[Czesci[Pet].High].Nuta) do
+ begin
+ Czesci[Pet].Czesc[Czesci[Pet].High].TotalNotes := Czesci[Pet].Czesc[Czesci[Pet].High].TotalNotes + Czesci[Pet].Czesc[Czesci[Pet].High].Nuta[I].Dlugosc * Czesci[Pet].Czesc[Czesci[Pet].High].Nuta[I].Wartosc;
+ end;
+ //Total Notes Patch End
+ end;
+ end;
+
+ Read(SongFile, TempC);
+ Inc(FileLineNo);
+ end; // while}
+
+ CloseFile(SongFile);
+ FileMode := fmOpenReadWrite;
+ except
+ try
+ CloseFile(SongFile);
+ FileMode := fmOpenReadWrite;
+ except
+
+ end;
+ Result := false;
+ Log.LogError('Error Loading File: "' + Name + '" in Line ' + inttostr(FileLineNo+1));
+ exit;
+ end;
+
+ Result := true;
+end;
+
+//--------------------
+// Saves a Song
+//--------------------
+function SaveSong(Song: TSong; Czesc: TCzesci; Name: string; Relative: boolean): boolean;
+var
+ C: integer;
+ N: integer;
+ S: string;
+ B: integer;
+ RelativeSubTime: integer;
+ NoteState: String;
+
+ procedure WriteCustomTags; //from 1.1 (modified)
+ var
+ I: integer;
+ Line: String;
+ begin
+ for I := 0 to High(Song.CustomTags) do
+ begin
+ Line := Song.CustomTags[I].Content;
+ if (Length(Song.CustomTags[I].Tag) > 0) then
+ Line := Song.CustomTags[I].Tag + ':' + Line;
+
+ WriteLn(SongFile, '#' + Line);
+ end;
+
+ end;
+begin
+// Relative := true; // override (idea - use shift+S to save with relative)
+ Result := true;
+ AssignFile(SongFile, Name);
+ Rewrite(SongFile);
+
+ WriteLn(SongFile, '#TITLE:' + Song.Title + '');
+ WriteLn(SongFile, '#ARTIST:' + Song.Artist);
+
+ if Song.Creator <> '' then WriteLn(SongFile, '#CREATOR:' + Song.Creator);
+ if Song.Edition <> 'Unknown' then WriteLn(SongFile, '#EDITION:' + Song.Edition);
+ if Song.Genre <> 'Unknown' then WriteLn(SongFile, '#GENRE:' + Song.Genre);
+ if Song.Language <> 'Unknown' then WriteLn(SongFile, '#LANGUAGE:' + Song.Language);
+
+ WriteLn(SongFile, '#MP3:' + Song.Mp3);
+
+ if Song.Cover <> '' then WriteLn(SongFile, '#COVER:' + Song.Cover);
+ if Song.Background <> '' then WriteLn(SongFile, '#BACKGROUND:' + Song.Background);
+ if Song.Video <> '' then WriteLn(SongFile, '#VIDEO:' + Song.Video);
+ if Song.VideoGAP <> 0 then WriteLn(SongFile, '#VIDEOGAP:' + FloatToStr(Song.VideoGAP));
+ if Song.Resolution <> 4 then WriteLn(SongFile, '#RESOLUTION:' + IntToStr(Song.Resolution));
+ if Song.NotesGAP <> 0 then WriteLn(SongFile, '#NOTESGAP:' + IntToStr(Song.NotesGAP));
+ if Song.Start <> 0 then WriteLn(SongFile, '#START:' + FloatToStr(Song.Start));
+ if Song.Finish <> 0 then WriteLn(SongFile, '#END:' + IntToStr(Song.Finish));
+ if Song.PreviewStart<> 0 then WriteLn(SongFile, '#PREVIEWSTART:'+ FloatToStr(Song.PREVIEWSTART));
+
+ if (Song.Medley.Source=msTag) and not Relative then
+ begin
+ WriteLn(SongFile, '#MedleyStartBeat:' + IntToStr(Song.Medley.StartBeat));
+ WriteLn(SongFile, '#MedleyEndBeat:' + IntToStr(Song.Medley.EndBeat));
+ end;
+
+ if Relative then WriteLn(SongFile, '#RELATIVE:yes');
+
+ WriteLn(SongFile, '#BPM:' + FloatToStr(Song.BPM[0].BPM / 4));
+ WriteLn(SongFile, '#GAP:' + FloatToStr(Song.GAP));
+
+ RelativeSubTime := 0;
+ for B := 1 to High(AktSong.BPM) do
+ WriteLn(SongFile, 'B ' + FloatToStr(AktSong.BPM[B].StartBeat) + ' ' + FloatToStr(AktSong.BPM[B].BPM/4));
+
+ // write custom header tags (from 1.1)
+ WriteCustomTags;
+
+ for C := 0 to Czesc.High do begin
+ for N := 0 to Czesc.Czesc[C].HighNut do begin
+ with Czesc.Czesc[C].Nuta[N] do begin
+
+
+ //Golden + Freestyle Note Patch
+ case Czesc.Czesc[C].Nuta[N].Wartosc of
+ 0: NoteState := 'F ';
+ 1: NoteState := ': ';
+ 2: NoteState := '* ';
+ end; // case
+ S := NoteState + IntToStr(Start-RelativeSubTime) + ' ' + IntToStr(Dlugosc) + ' ' + IntToStr(Ton) + ' ' + Tekst;
+
+
+ WriteLn(SongFile, S);
+ end; // with
+ end; // N
+
+ if C < Czesc.High then begin // don't write end of last sentence
+ if not Relative then
+ S := '- ' + IntToStr(Czesc.Czesc[C+1].Start)
+ else begin
+ S := '- ' + IntToStr(Czesc.Czesc[C+1].Start - RelativeSubTime) +
+ ' ' + IntToStr(Czesc.Czesc[C+1].Start - RelativeSubTime);
+ RelativeSubTime := Czesc.Czesc[C+1].Start;
+ end;
+ WriteLn(SongFile, S);
+ end;
+
+ end; // C
+
+
+ WriteLn(SongFile, 'E');
+ CloseFile(SongFile);
+end;
+
+{* new procedure for preview
+ tries find out the beginning of a refrain
+ and the end... *}
+procedure FindRefrainStart(var Song: TSong);
+Const
+ MEDLEY_MIN_DURATION = 40; //minimum duration of a medley-song in seconds
+
+Type
+ TSeries = record
+ start: integer; //Start sentence of series
+ end_: integer; //End sentence of series
+ len: integer; //Length of sentence series
+ end;
+
+var
+ I, J, K, num_lines: integer;
+ sentences: array of String;
+ series: array of TSeries;
+ temp_series: TSeries;
+ max: integer;
+ len_lines, len_notes: integer;
+ found_end: boolean;
+begin
+ if AktSong.Medley.Source = msTag then //will be deleted soon
+ Exit;
+
+ //relative is not supported for medley by now!
+ if AktSong.Relative then
+ begin
+ Log.LogError('Song '+Song.Artist+'-'+Song.Title+' contains #Relative, this is not supported by medley-function!');
+ Song.Medley.Source := msNone;
+ Exit;
+ end;
+
+ num_lines := Length(Czesci[0].Czesc);
+ SetLength(sentences, num_lines);
+
+ //build sentences array
+ for I := 0 to num_lines - 1 do
+ begin
+ sentences[I] := '';
+ for J := 0 to Length(Czesci[0].Czesc[I].Nuta) - 1 do
+ begin
+ if not Czesci[0].Czesc[I].Nuta[J].FreeStyle then
+ sentences[I] := sentences[I] + Czesci[0].Czesc[I].Nuta[J].Tekst;
+ end;
+ end;
+
+ //find equal sentences series
+ SetLength(series, 0);
+
+ for I := 0 to num_lines - 2 do
+ begin
+ for J := I+1 to num_lines - 1 do
+ begin
+ if sentences[I]=sentences[J] then
+ begin
+ temp_series.start := I;
+ temp_series.end_ := I;
+
+ if (J+J-I-1>num_lines-1) then
+ max:=num_lines-1-J
+ else
+ max:=J-I-1;
+
+ for K := 1 to max do
+ begin
+ if sentences[I+K]=sentences[J+K] then
+ temp_series.end_ := I+K
+ else
+ break;
+ end;
+ temp_series.len := temp_series.end_ - temp_series.start + 1;
+ SetLength(series, Length(series)+1);
+ series[Length(series)-1] := temp_series;
+ end;
+ end;
+ end;
+
+ //search for longest sequence
+ if Length(series)>0 then
+ begin
+ max := 0;
+ for I := 0 to Length(series) - 1 do
+ begin
+ if series[I].len > series[max].len then
+ max := I;
+ end;
+ end;
+
+ len_lines := length(Czesci[0].Czesc);
+
+ if (Length(series)>0) and (series[max].len > 3) then
+ begin
+ Song.Medley.StartBeat := Czesci[0].Czesc[series[max].start].Nuta[0].Start;
+ len_notes := length(Czesci[0].Czesc[series[max].end_].Nuta);
+ Song.Medley.EndBeat := Czesci[0].Czesc[series[max].end_].Nuta[len_notes-1].Start +
+ Czesci[0].Czesc[series[max].end_].Nuta[len_notes-1].Dlugosc;
+
+ found_end := false;
+
+ //set end if duration > MEDLEY_MIN_DURATION
+ if GetTimeFromBeat(Song.Medley.StartBeat)+ MEDLEY_MIN_DURATION >
+ GetTimeFromBeat(Song.Medley.EndBeat) then
+ begin
+ found_end := true;
+ end;
+
+ //estimate the end: just go MEDLEY_MIN_DURATION
+ //ahead an set to a line end (if possible)
+ if not found_end then
+ begin
+ for I := series[max].start+1 to len_lines-1 do
+ begin
+ len_notes := length(Czesci[0].Czesc[I].Nuta);
+ for J := 0 to len_notes - 1 do
+ begin
+ if GetTimeFromBeat(Song.Medley.StartBeat)+ MEDLEY_MIN_DURATION >
+ GetTimeFromBeat(Czesci[0].Czesc[I].Nuta[J].Start+
+ Czesci[0].Czesc[I].Nuta[J].Dlugosc) then
+ begin
+ found_end := true;
+ Song.Medley.EndBeat := Czesci[0].Czesc[I].Nuta[len_notes-1].Start+
+ Czesci[0].Czesc[I].Nuta[len_notes-1].Dlugosc;
+ break;
+ end;
+ end;
+ end;
+ end;
+
+
+ if found_end then
+ begin
+ Song.Medley.Source := msCalculated;
+
+ //calculate fade time
+ Song.Medley.FadeIn_time := DEFAULT_FADE_IN_TIME; //TODO in INI
+ Song.Medley.FadeOut_time := DEFAULT_FADE_OUT_TIME; //TODO in INI
+ end;
+ end;
+
+ //set PreviewStart if not set
+ if Song.PreviewStart=0 then
+ begin
+ len_notes := length(Czesci[0].Czesc[len_lines-1].Nuta);
+ if Song.Medley.Source = msCalculated then
+ Song.PreviewStart := GetTimeFromBeat(Song.Medley.StartBeat);{
+ else
+ Song.PreviewStart := (GetTimeFromBeat(Czesci[0].Czesc[len_lines-1].Nuta[len_notes-1].start+
+ Czesci[0].Czesc[len_lines-1].Nuta[len_notes-1].Dlugosc))/4; //TODO}
+ end;
+end;
+
+//sets a song to medley-mod:
+//converts all unneeded notes into freestyle
+//updates score values
+procedure SetMedleyMode;
+var
+ pl, line, note: integer;
+ cut_line: array of integer;
+ foundcut: array of boolean;
+ start: integer;
+ end_: integer;
+
+begin
+ start := AktSong.Medley.StartBeat;
+ end_ := AktSong.Medley.EndBeat;
+ SetLength(cut_line, Length(Czesci));
+ SetLength(foundcut, Length(Czesci));
+
+ for pl := 0 to Length(Czesci) - 1 do
+ begin
+ foundcut[pl] := false;
+ cut_line[pl] := high(Integer);
+ Czesci[pl].Wartosc := 0;
+ for line := 0 to Length(Czesci[pl].Czesc) - 1 do
+ begin
+ Czesci[pl].Czesc[line].TotalNotes := 0;
+ for note := 0 to Length(Czesci[pl].Czesc[line].Nuta) - 1 do
+ begin
+ if Czesci[pl].Czesc[line].Nuta[note].Start < start then //check start
+ Czesci[pl].Czesc[line].Nuta[note].FreeStyle := true
+ else if Czesci[pl].Czesc[line].Nuta[note].Start>= end_ then //check end
+ begin
+ Czesci[pl].Czesc[line].Nuta[note].FreeStyle := true;
+ if not foundcut[pl] then
+ begin
+ if (note=0) then
+ cut_line[pl] := line
+ else
+ cut_line[pl] := line+1;
+ end;
+ foundcut[pl] := true;
+ end else
+ begin
+ //add this notes value ("notes length" * "notes scorefactor") to the current songs entire value
+ Inc(Czesci[pl].Wartosc, Czesci[pl].Czesc[line].Nuta[note].Dlugosc * Czesci[pl].Czesc[line].Nuta[note].Wartosc);
+ //and to the current lines entire value
+ Inc(Czesci[pl].Czesc[line].TotalNotes, Czesci[pl].Czesc[line].Nuta[note].Dlugosc * Czesci[pl].Czesc[line].Nuta[note].Wartosc);
+ end;
+ end;
+ end;
+ end;
+
+ for pl := 0 to Length(Czesci) - 1 do
+ begin
+ if (foundcut[pl]) and (Length(Czesci[pl].Czesc)>cut_line[pl]) then
+ begin
+ SetLength(Czesci[pl].Czesc, cut_line[pl]);
+ Czesci[pl].high := cut_line[pl]-1;
+ end;
+ end;
+end;
+
+end. \ No newline at end of file
diff --git a/Game/Code/Classes/UGraphic.pas b/Game/Code/Classes/UGraphic.pas
new file mode 100644
index 00000000..bcb2aa65
--- /dev/null
+++ b/Game/Code/Classes/UGraphic.pas
@@ -0,0 +1,564 @@
+unit UGraphic;
+
+interface
+uses
+ SDL, gl, glext, UTexture, TextGL, ULog, SysUtils, ULyrics, UScreenLoading,
+ UScreenWelcome, UScreenMain, UScreenName, UScreenLevel, UScreenOptions, UScreenOptionsGame,
+ UScreenOptionsGraphics, UScreenOptionsSound, UScreenOptionsLyrics, UScreenOptionsThemes, UScreenOptionsRecord, UScreenOptionsAdvanced,
+ UScreenSong, UScreenSing, UScreenScore, UScreenTop, UScreenEditSub,
+ UScreenEdit, UScreenEditConvert, UScreenEditHeader, UScreenOpen, UThemes, USkins, UScreenSongMenu, UScreenSongJumpto,
+ {Party Screens} UScreenSingModi, UScreenPartyNewRound, UScreenPartyScore, UScreenPartyOptions, UScreenPartyWin, UScreenPartyPlayer,
+ {Stats Screens} UScreenStatMain, UScreenStatDetail,
+ {CreditsScreen} UScreenCredits,
+ {Popup for errors, etc.} UScreenPopup,
+ UScreenPartyOptionsM2, UScreenPartyPlayerM2, UScreenPartyNewRoundM2;
+
+type
+ TRecR = record
+ Top: real;
+ Left: real;
+ Right: real;
+ Bottom: real;
+ end;
+
+var
+ Screen: PSDL_Surface;
+
+ RenderW: integer;
+ RenderH: integer;
+ ScreenW: integer;
+ ScreenH: integer;
+ Screens: integer;
+ ScreenAct: integer;
+ ScreenX: integer;
+
+ ScreenLoading: TScreenLoading;
+ ScreenWelcome: TScreenWelcome;
+ ScreenMain: TScreenMain;
+ ScreenName: TScreenName;
+ ScreenLevel: TScreenLevel;
+ ScreenSong: TScreenSong;
+ ScreenSing: TScreenSing;
+ ScreenScore: TScreenScore;
+ ScreenTop: TScreenTop;
+ ScreenOptions: TScreenOptions;
+ ScreenOptionsGame: TScreenOptionsGame;
+ ScreenOptionsGraphics: TScreenOptionsGraphics;
+ ScreenOptionsSound: TScreenOptionsSound;
+ ScreenOptionsLyrics: TScreenOptionsLyrics;
+ ScreenOptionsThemes: TScreenOptionsThemes;
+ ScreenOptionsRecord: TScreenOptionsRecord;
+ ScreenOptionsAdvanced: TScreenOptionsAdvanced;
+ ScreenEditSub: TScreenEditSub;
+ ScreenEdit: TScreenEdit;
+ ScreenEditConvert: TScreenEditConvert;
+ ScreenEditHeader: TScreenEditHeader;
+ ScreenOpen: TScreenOpen;
+
+ ScreenSongMenu: TScreenSongMenu;
+ ScreenSongJumpto: TScreenSongJumpto;
+
+ //Party Screens
+ ScreenSingModi: TScreenSingModi;
+ ScreenPartyNewRound: TScreenPartyNewRound;
+ ScreenPartyScore: TScreenPartyScore;
+ ScreenPartyWin: TScreenPartyWin;
+ ScreenPartyOptions: TScreenPartyOptions;
+ ScreenPartyPlayer: TScreenPartyPlayer;
+
+ //PartyM2 Screens
+ //ScreenSingModi: TScreenSingModi;
+ ScreenPartyNewRoundM2: TScreenPartyNewRoundM2;
+ //ScreenPartyScore: TScreenPartyScore;
+ //ScreenPartyWin: TScreenPartyWin;
+ ScreenPartyOptionsM2: TScreenPartyOptionsM2;
+ ScreenPartyPlayerM2: TScreenPartyPlayerM2;
+
+ //StatsScreens
+ ScreenStatMain: TScreenStatMain;
+ ScreenStatDetail: TScreenStatDetail;
+
+ //CreditsScreen
+ ScreenCredits: TScreenCredits;
+
+ //popup mod
+ ScreenPopupCheck: TScreenPopupCheck;
+ ScreenPopupError: TScreenPopupError;
+
+ //popup Help-System
+ ScreenPopupHelp: TScreenPopupHelp;
+
+ //Notes
+ Tex_Left: array[0..6] of TTexture;
+ Tex_Mid: array[0..6] of TTexture;
+ Tex_Right: array[0..6] of TTexture;
+
+ Tex_BG_Left: array[1..6] of TTexture;
+ Tex_BG_Mid: array[1..6] of TTexture;
+ Tex_BG_Right: array[1..6] of TTexture;
+
+ Tex_Note_Star: TTexture;
+ Tex_Note_Perfect_Star: TTexture;
+
+
+ Tex_Ball: TTexture;
+ Tex_Lyric_Help_Bar: TTexture;
+ FullScreen: boolean;
+
+ Tex_TimeProgress: TTexture;
+
+ //Sing Bar Mod
+ Tex_SingBar_Back: TTexture;
+ Tex_SingBar_Bar: TTexture;
+ Tex_SingBar_Front: TTexture;
+ //end Singbar Mod
+
+ //PhrasenBonus - Line Bonus Mod
+ Tex_SingLineBonusBack: TTexture;
+ //End PhrasenBonus - Line Bonus Mod
+
+const
+ Skin_BGColorR = 1;
+ Skin_BGColorG = 1;
+ Skin_BGColorB = 1;
+
+ Skin_SpectrumR = 0;
+ Skin_SpectrumG = 0;
+ Skin_SpectrumB = 0;
+
+ Skin_Spectograph1R = 0.6;
+ Skin_Spectograph1G = 0.8;
+ Skin_Spectograph1B = 1;
+
+ Skin_Spectograph2R = 0;
+ Skin_Spectograph2G = 0;
+ Skin_Spectograph2B = 0.2;
+
+ Skin_SzczytR = 0.8;
+ Skin_SzczytG = 0;
+ Skin_SzczytB = 0;
+
+ Skin_SzczytLimitR = 0;
+ Skin_SzczytLimitG = 0.8;
+ Skin_SzczytLimitB = 0;
+
+ Skin_FontR = 0;
+ Skin_FontG = 0;
+ Skin_FontB = 0;
+
+ Skin_FontHighlightR = 0.3; // 0.3
+ Skin_FontHighlightG = 0.3; // 0.3
+ Skin_FontHighlightB = 1; // 1
+
+ Skin_TimeR = 0.25; //0,0,0
+ Skin_TimeG = 0.25;
+ Skin_TimeB = 0.25;
+
+ Skin_OscR = 0;
+ Skin_OscG = 0;
+ Skin_OscB = 0;
+
+ Skin_LyricsT = 494; // 500 / 510 / 400
+ Skin_SpectrumT = 470;
+ Skin_SpectrumBot = 570;
+ Skin_SpectrumH = 100;
+
+ Skin_P1_LinesR = 0.5; // 0.6 0.6 1
+ Skin_P1_LinesG = 0.5;
+ Skin_P1_LinesB = 0.5;
+
+ Skin_P2_LinesR = 0.5; // 1 0.6 0.6
+ Skin_P2_LinesG = 0.5;
+ Skin_P2_LinesB = 0.5;
+
+ Skin_P1_NotesB = 250;
+ Skin_P2_NotesB = 430; // 430 / 300
+
+ Skin_P1_ScoreT = 50;
+ Skin_P1_ScoreL = 20;
+
+ Skin_P2_ScoreT = 50;
+ Skin_P2_ScoreL = 640;
+
+procedure Initialize3D (Title: string);
+procedure Reinitialize3D;
+procedure SwapBuffers;
+
+procedure LoadTextures;
+procedure InitializeScreen;
+procedure LoadScreens( aShowLoading : boolean = true );
+procedure UnLoadScreens;
+
+
+implementation
+uses UMain, UIni, UDisplay, UCommandLine, Graphics, Classes, Windows;
+
+procedure LoadTextures;
+var
+ P: integer;
+ R, G, B: real;
+ Col: integer;
+begin
+ // zaladowanie tekstur
+ Log.LogStatus('Loading Textures', 'LoadTextures');
+ Tex_Left[0] := Texture.LoadTexture(pchar(Skin.GetTextureFileName('GrayLeft')), 'BMP', 'Transparent', 0);
+ Tex_Mid[0] := Texture.LoadTexture(pchar(Skin.GetTextureFileName('GrayMid')), 'BMP', 'Plain', 0);
+ Tex_Right[0] := Texture.LoadTexture(pchar(Skin.GetTextureFileName('GrayRight')), 'BMP', 'Transparent', 0);
+
+ // P1-6
+ for P := 1 to 6 do begin
+ LoadColor(R, G, B, 'P' + IntToStr(P) + 'Light');
+ Col := $10000 * Round(R*255) + $100 * Round(G*255) + Round(B*255);
+ Tex_Left[P] := Texture.LoadTexture(pchar(Skin.GetTextureFileName('GrayLeft')), 'BMP', 'Note Transparent', Col);
+ Tex_Mid[P] := Texture.LoadTexture(pchar(Skin.GetTextureFileName('GrayMid')), 'BMP', 'Note Plain', Col);
+ Tex_Right[P] := Texture.LoadTexture(pchar(Skin.GetTextureFileName('GrayRight')), 'BMP', 'Note Transparent', Col);
+
+ Tex_BG_Left[P] := Texture.LoadTexture(pchar(Skin.GetTextureFileName('NoteBGLeft')), 'BMP', 'Alpha Black Colored', Col);
+ Tex_BG_Mid[P] := Texture.LoadTexture(pchar(Skin.GetTextureFileName('NoteBGMid')), 'BMP', 'Alpha Black Colored', Col);
+ Tex_BG_Right[P] := Texture.LoadTexture(pchar(Skin.GetTextureFileName('NoteBGRight')), 'BMP', 'Alpha Black Colored', Col);
+ end;
+
+ Tex_Note_Perfect_Star := Texture.LoadTexture(pchar(Skin.GetTextureFileName('NotePerfectStar')), 'JPG', 'Font Black', 0);
+ Tex_Note_Star := Texture.LoadTexture(pchar(Skin.GetTextureFileName('NoteStar')) , 'JPG', 'Alpha Black Colored', $FFFFFF);
+ Tex_Ball := Texture.LoadTexture(pchar(Skin.GetTextureFileName('Ball')), 'BMP', 'Transparent', $FF00FF);
+ Tex_Lyric_Help_Bar := Texture.LoadTexture(pchar(Skin.GetTextureFileName('LyricHelpBar')), 'BMP', 'Transparent', $FF00FF);
+
+
+ //TimeBar mod
+ Tex_TimeProgress := Texture.LoadTexture(pchar(Skin.GetTextureFileName('TimeBar')));
+ //eoa TimeBar mod
+
+ //SingBar Mod
+ Tex_SingBar_Back := Texture.LoadTexture(pchar(Skin.GetTextureFileName('SingBarBack')), 'JPG', 'Plain', 0);
+ Tex_SingBar_Bar := Texture.LoadTexture(pchar(Skin.GetTextureFileName('SingBarBar')), 'JPG', 'Plain', 0);
+ Tex_SingBar_Front := Texture.LoadTexture(pchar(Skin.GetTextureFileName('SingBarFront')), 'JPG', 'Font', 0);
+ //end Singbar Mod
+
+ //PhrasenBonus - Line Bonus Mod
+ Tex_SingLineBonusBack := Texture.LoadTexture(pchar(Skin.GetTextureFileName('LineBonusBack')), 'JPG', 'Font Black', 0);
+ {//Set Texture to Font High
+ Tex_SingLineBonusL.H := 32; Tex_SingLineBonusL.W := 8;
+ Tex_SingLineBonusM.H := 32; //Tex_SingLineBonusM.TexW := Tex_SingLineBonusM.TexW/2;
+ Tex_SingLineBonusR.H := 32; Tex_SingLineBonusR.W := 8; }
+ //PhrasenBonus - Line Bonus Mod End
+
+ // tworzenie czcionek
+ Log.LogStatus('Building Fonts', 'LoadTextures');
+ BuildFont;
+end;
+
+procedure Initialize3D (Title: string);
+var
+ Icon: TIcon;
+ Res: TResourceStream;
+ ISurface: PSDL_Surface;
+ Pixel: PByteArray;
+begin
+ Log.LogStatus('LoadOpenGL', 'Initialize3D');
+ Log.BenchmarkStart(2);
+
+ LoadOpenGL( GLLibName );
+
+ Log.LogStatus('SDL_Init', 'Initialize3D');
+ if ( SDL_Init(SDL_INIT_VIDEO or SDL_INIT_AUDIO)= -1 ) then begin
+ Log.LogError('SDL_Init Failed', 'Initialize3D');
+ exit;
+ end;
+
+ { //Load Icon
+ Res := TResourceStream.CreateFromID(HInstance, 3, RT_ICON);
+ Icon := TIcon.Create;
+ Icon.LoadFromStream(Res);
+ Res.Free;
+ Icon.
+ //Create icon Surface
+ SDL_CreateRGBSurfaceFrom (
+ SDL_SWSURFACE,
+ Icon.Width,
+ Icon.Height,
+ 32,
+ 128 or 64,
+ 32 or 16,
+ 8 or 4,
+ 2 or 1);
+ //SDL_BlitSurface(
+
+
+ SDL_WM_SetIcon(SDL_LoadBMP('DEFAULT_WINDOW_ICON'), 0); //}
+
+ SDL_WM_SetCaption(PChar(Title), nil);
+
+ InitializeScreen;
+
+ Log.BenchmarkEnd(2);
+ Log.LogBenchmark('--> Setting Screen', 2);
+
+ // ladowanie tekstur
+ Log.BenchmarkStart(2);
+ Texture := TTextureUnit.Create;
+ Texture.Limit := 1024*1024;
+
+ LoadTextures;
+ Log.BenchmarkEnd(2);
+ Log.LogBenchmark('--> Loading Textures', 2);
+
+ Log.BenchmarkStart(2);
+ Lyric := TLyric.Create;
+ Log.BenchmarkEnd(2);
+ Log.LogBenchmark('--> Loading Fonts', 2);
+
+ Log.BenchmarkStart(2);
+ Display := TDisplay.Create;
+ SDL_EnableUnicode(1);
+ Log.BenchmarkEnd(2); Log.LogBenchmark('====> Creating Display', 2);
+
+ Log.LogStatus('Loading Screens', 'Initialize3D');
+ Log.BenchmarkStart(3);
+
+ LoadScreens;
+ Display.ActualScreen^.FadeTo(@ScreenMain);
+
+ Log.BenchmarkEnd(2);
+ Log.LogBenchmark('--> Loading Screens', 2);
+
+ Log.LogStatus('Finish', 'Initialize3D');
+end;
+
+procedure SwapBuffers;
+begin
+ SDL_GL_SwapBuffers;
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity;
+ glOrtho(0, 800, 600, 0, -1, 100);
+ glMatrixMode(GL_MODELVIEW);
+end;
+
+procedure Reinitialize3D;
+begin
+// InitializeScreen;
+// LoadTextures;
+// LoadScreens;
+end;
+
+procedure InitializeScreen;
+var
+ S: string;
+ I: integer;
+ W, H: integer;
+ Depth: Integer;
+begin
+ if (Params.Screens <> -1) then
+ Screens := Params.Screens + 1
+ else
+ Screens := Ini.Screens + 1;
+
+ SDL_GL_SetAttribute(SDL_GL_RED_SIZE, 5);
+ SDL_GL_SetAttribute(SDL_GL_GREEN_SIZE, 5);
+ SDL_GL_SetAttribute(SDL_GL_BLUE_SIZE, 5);
+ SDL_GL_SetAttribute(SDL_GL_DEPTH_SIZE, 16);
+ SDL_GL_SetAttribute(SDL_GL_DOUBLEBUFFER, 1);
+
+ // If there is a resolution in Parameters, use it, else use the Ini value
+ I := Params.Resolution;
+ if (I <> -1) then
+ S := IResolution[I]
+ else
+ S := IResolution[Ini.Resolution];
+
+ I := Pos('x', S);
+ W := StrToInt(Copy(S, 1, I-1)) * Screens;
+ H := StrToInt(Copy(S, I+1, 1000));
+
+ {if ParamStr(1) = '-fsblack' then begin
+ W := 800;
+ H := 600;
+ end;
+ if ParamStr(1) = '-320x240' then begin
+ W := 320;
+ H := 240;
+ end; }
+
+ If (Params.Depth <> -1) then
+ Depth := Params.Depth
+ else
+ Depth := Ini.Depth;
+
+
+ Log.LogStatus('SDL_SetVideoMode', 'Initialize3D');
+// SDL_SetRefreshrate(85);
+// SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
+ if (Ini.FullScreen = 0) and (Not Params.FullScreen) then
+ screen := SDL_SetVideoMode(W, H, (Depth+1) * 16, SDL_OPENGL)
+ else begin
+ screen := SDL_SetVideoMode(W, H, (Depth+1) * 16, SDL_OPENGL or SDL_FULLSCREEN or SDL_HWSURFACE);
+ SDL_ShowCursor(0);
+ end;
+ if (screen = nil) then begin
+ Log.LogError('SDL_SetVideoMode Failed', 'Initialize3D');
+ exit;
+ end;
+
+ // clear screen once window is being shown
+ glClearColor(1, 1, 1, 1);
+ glClear(GL_COLOR_BUFFER_BIT);
+ SwapBuffers;
+
+ // zmienne
+ RenderW := 800;
+ RenderH := 600;
+ ScreenW := W;
+ ScreenH := H;
+end;
+
+procedure LoadScreens( aShowLoading : boolean = true );
+begin
+
+ ScreenLoading := TScreenLoading.Create;
+ if aShowLoading then
+ begin
+ ScreenLoading.onShow;
+ Display.ActualScreen := @ScreenLoading;
+ ScreenLoading.Draw;
+ Display.Draw;
+ SwapBuffers;
+ end;
+
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Loading', 3); Log.BenchmarkStart(3);
+{ ScreenWelcome := TScreenWelcome.Create; //'BG', 4, 3);
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Welcome', 3); Log.BenchmarkStart(3);}
+ ScreenMain := TScreenMain.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Main', 3); Log.BenchmarkStart(3);
+ ScreenName := TScreenName.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Name', 3); Log.BenchmarkStart(3);
+ ScreenLevel := TScreenLevel.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Level', 3); Log.BenchmarkStart(3);
+ ScreenSong := TScreenSong.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Song', 3); Log.BenchmarkStart(3);
+ ScreenSongMenu := TScreenSongMenu.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Song Menu', 3); Log.BenchmarkStart(3);
+ ScreenSing := TScreenSing.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Sing', 3); Log.BenchmarkStart(3);
+ ScreenScore := TScreenScore.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Score', 3); Log.BenchmarkStart(3);
+ ScreenTop := TScreenTop.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Top5', 3); Log.BenchmarkStart(3);
+ ScreenOptions := TScreenOptions.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Options', 3); Log.BenchmarkStart(3);
+ ScreenOptionsGame := TScreenOptionsGame.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Options Game', 3); Log.BenchmarkStart(3);
+ ScreenOptionsGraphics := TScreenOptionsGraphics.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Options Graphics', 3); Log.BenchmarkStart(3);
+ ScreenOptionsSound := TScreenOptionsSound.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Options Sound', 3); Log.BenchmarkStart(3);
+ ScreenOptionsLyrics := TScreenOptionsLyrics.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Options Lyrics', 3); Log.BenchmarkStart(3);
+ ScreenOptionsThemes := TScreenOptionsThemes.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Options Themes', 3); Log.BenchmarkStart(3);
+ ScreenOptionsRecord := TScreenOptionsRecord.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Options Record', 3); Log.BenchmarkStart(3);
+ ScreenOptionsAdvanced := TScreenOptionsAdvanced.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Options Advanced', 3); Log.BenchmarkStart(3);
+ ScreenEditSub := TScreenEditSub.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Edit Sub', 3); Log.BenchmarkStart(3);
+ ScreenEdit := TScreenEdit.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Edit', 3); Log.BenchmarkStart(3);
+ ScreenEditConvert := TScreenEditConvert.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen EditConvert', 3); Log.BenchmarkStart(3);
+// ScreenEditHeader := TScreenEditHeader.Create(Skin.ScoreBG);
+// Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Edit Header', 3); Log.BenchmarkStart(3);
+ ScreenOpen := TScreenOpen.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Open', 3); Log.BenchmarkStart(3);
+ ScreenSingModi := TScreenSingModi.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Sing with Modi support', 3); Log.BenchmarkStart(3);
+ ScreenSongMenu := TScreenSongMenu.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen SongMenu', 3); Log.BenchmarkStart(3);
+ ScreenSongJumpto := TScreenSongJumpto.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen SongJumpto', 3); Log.BenchmarkStart(3);
+ ScreenPopupCheck := TScreenPopupCheck.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Popup (Check)', 3); Log.BenchmarkStart(3);
+ ScreenPopupError := TScreenPopupError.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Popup (Error)', 3); Log.BenchmarkStart(3);
+ ScreenPopupHelp := TScreenPopupHelp.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Popup (Help)', 3); Log.BenchmarkStart(3);
+ ScreenPartyNewRound := TScreenPartyNewRound.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen PartyNewRound', 3); Log.BenchmarkStart(3);
+ ScreenPartyScore := TScreenPartyScore.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen PartyScore', 3); Log.BenchmarkStart(3);
+ ScreenPartyWin := TScreenPartyWin.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen PartyWin', 3); Log.BenchmarkStart(3);
+ ScreenPartyOptions := TScreenPartyOptions.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen PartyOptions', 3); Log.BenchmarkStart(3);
+ ScreenPartyPlayer := TScreenPartyPlayer.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen PartyPlayer', 3); Log.BenchmarkStart(3);
+ ScreenStatMain := TScreenStatMain.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Stat Main', 3); Log.BenchmarkStart(3);
+ ScreenStatDetail := TScreenStatDetail.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Stat Detail', 3); Log.BenchmarkStart(3);
+ //Now Created when needed
+ //ScreenCredits := TScreenCredits.Create;
+ //Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen Credits', 3); Log.BenchmarkStart(3);
+
+ //PartyM2 Screens
+ ScreenPartyOptionsM2 := TScreenPartyOptionsM2.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen PartyOptionsM2', 3); Log.BenchmarkStart(3);
+ ScreenPartyPlayerM2 := TScreenPartyPlayerM2.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen PartyPlayerM2', 3); Log.BenchmarkStart(3);
+ ScreenPartyNewRoundM2 := TScreenPartyNewRoundM2.Create;
+ Log.BenchmarkEnd(3); Log.LogBenchmark('====> Screen PartyNewRoundM2', 3); Log.BenchmarkStart(3);
+ end;
+
+procedure UnLoadScreens;
+begin
+(*
+ ScreenLoading := TScreenLoading.Create;
+ ScreenLoading.onShow;
+
+ Display.ActualScreen := @ScreenLoading;
+
+ ScreenLoading.Draw;
+ Display.Draw;
+ SwapBuffers;
+*)
+
+ freeandnil( ScreenMain );
+ freeandnil( ScreenName );
+ freeandnil( ScreenLevel);
+ freeandnil( ScreenSong );
+ freeandnil( ScreenSongMenu );
+ freeandnil( ScreenSing );
+ freeandnil( ScreenScore);
+ freeandnil( ScreenTop );
+ freeandnil( ScreenOptions );
+ freeandnil( ScreenOptionsGame );
+ freeandnil( ScreenOptionsGraphics );
+ freeandnil( ScreenOptionsSound );
+ freeandnil( ScreenOptionsLyrics );
+// freeandnil( ScreenOptionsThemes );
+ freeandnil( ScreenOptionsRecord );
+ freeandnil( ScreenOptionsAdvanced );
+ freeandnil( ScreenEditSub );
+ freeandnil( ScreenEdit );
+ freeandnil( ScreenEditConvert );
+ freeandnil( ScreenOpen );
+ freeandnil( ScreenSingModi );
+ freeandnil( ScreenSongMenu );
+ freeandnil( ScreenSongJumpto);
+ freeandnil( ScreenPopupCheck );
+ freeandnil( ScreenPopupError );
+ freeandnil( ScreenPartyNewRound );
+ freeandnil( ScreenPartyScore );
+ freeandnil( ScreenPartyWin );
+ freeandnil( ScreenPartyOptions );
+ freeandnil( ScreenPartyPlayer );
+ freeandnil( ScreenStatMain );
+ freeandnil( ScreenStatDetail );
+
+ //Party M2 Screens
+ freeandnil( ScreenPartyNewRoundM2 );
+ //freeandnil( ScreenPartyScoreM2 );
+ //freeandnil( ScreenPartyWinM2 );
+ freeandnil( ScreenPartyOptionsM2 );
+ freeandnil( ScreenPartyPlayerM2 );
+end;
+
+end.
diff --git a/Game/Code/Classes/UGraphicClasses.pas b/Game/Code/Classes/UGraphicClasses.pas
new file mode 100644
index 00000000..6d1cd36e
--- /dev/null
+++ b/Game/Code/Classes/UGraphicClasses.pas
@@ -0,0 +1,655 @@
+// notes:
+unit UGraphicClasses;
+
+interface
+uses UTexture;
+const DelayBetweenFrames : Cardinal = 60;
+type
+
+ TParticleType=(GoldenNote, PerfectNote, NoteHitTwinkle, PerfectLineTwinkle, ColoredStar, Flare);
+
+ TColour3f = Record
+ r, g, b: Real;
+ end;
+
+ TParticle = Class
+ X, Y : Real; //Position
+ Screen : Integer;
+ W, H : Cardinal; //dimensions of particle
+ Col : array of TColour3f; // Colour(s) of particle
+ Scale : array of Real; // Scaling factors of particle layers
+ Frame : Byte; //act. Frame
+ Tex : Cardinal; //Tex num from Textur Manager
+ Live : Byte; //How many Cycles before Kill
+ RecIndex : Integer; //To which rectangle this particle belongs (only GoldenNote)
+ StarType : TParticleType; // GoldenNote | PerfectNote | NoteHitTwinkle | PerfectLineTwinkle
+ Alpha : Real; // used for fading...
+ mX, mY : Real; // movement-vector for PerfectLineTwinkle
+ SizeMod : Real; // experimental size modifier
+ SurviveSentenceChange : Boolean;
+
+ Constructor Create(cX,cY: Real; cScreen: Integer; cLive: Byte; cFrame : integer; cRecArrayIndex : Integer; cStarType : TParticleType; Player: Cardinal);
+ Destructor Destroy();
+ procedure Draw;
+ procedure LiveOn;
+ end;
+
+ RectanglePositions = Record
+ xTop, yTop, xBottom, yBottom : Real;
+ TotalStarCount : Integer;
+ CurrentStarCount : Integer;
+ Screen : Integer;
+ end;
+
+ PerfectNotePositions = Record
+ xPos, yPos : Real;
+ Screen : Integer;
+ end;
+
+ TEffectManager = Class
+ Particle : array of TParticle;
+ LastTime : Cardinal;
+ RecArray : Array of RectanglePositions;
+ TwinkleArray : Array[0..5] of Real; // store x-position of last twinkle for every player
+ PerfNoteArray : Array of PerfectNotePositions;
+
+ FlareTex: TTexture;
+
+ constructor Create;
+ destructor Destroy; override;
+ procedure Draw;
+ function Spawn(X, Y: Real;
+ Screen: Integer;
+ Live: Byte;
+ StartFrame: Integer;
+ RecArrayIndex: Integer; // this is only used with GoldenNotes
+ StarType: TParticleType;
+ Player: Cardinal // for PerfectLineTwinkle
+ ): Cardinal;
+ procedure SpawnRec();
+ procedure Kill(index: Cardinal);
+ procedure KillAll();
+ procedure SentenceChange();
+ procedure SaveGoldenStarsRec(Xtop, Ytop, Xbottom, Ybottom: Real);
+ procedure SavePerfectNotePos(Xtop, Ytop: Real);
+ procedure GoldenNoteTwinkle(Top,Bottom,Right: Real; Player: Integer);
+ procedure SpawnPerfectLineTwinkle();
+ end;
+
+var GoldenRec : TEffectManager;
+
+implementation
+uses sysutils, Windows, gl, UIni, UMain, UThemes, USkins, UGraphic, UDrawTexture, math, dialogs;
+
+//TParticle
+Constructor TParticle.Create(cX,cY: Real; cScreen: Integer; cLive: Byte; cFrame : integer; cRecArrayIndex : Integer; cStarType : TParticleType; Player: Cardinal);
+begin
+ inherited Create;
+ // in this constructor we set all initial values for our particle
+ X := cX;
+ Y := cY;
+ Screen := cScreen;
+ Live := cLive;
+ Frame:= cFrame;
+ RecIndex := cRecArrayIndex;
+ StarType := cStarType;
+ Alpha := (-cos((Frame+1)*2*pi/16)+1); // neat fade-in-and-out
+ SetLength(Scale,1);
+ Scale[0] := 1;
+ SurviveSentenceChange := False;
+ SizeMod := 1;
+ case cStarType of
+ GoldenNote:
+ begin
+ Tex := Tex_Note_Star.TexNum;
+ W := 20;
+ H := 20;
+ SetLength(Scale,4);
+ Scale[1]:=0.8;
+ Scale[2]:=0.4;
+ Scale[3]:=0.3;
+ SetLength(Col,4);
+ Col[0].r := 1;
+ Col[0].g := 0.7;
+ Col[0].b := 0.1;
+
+ Col[1].r := 1;
+ Col[1].g := 1;
+ Col[1].b := 0.4;
+
+ Col[2].r := 1;
+ Col[2].g := 1;
+ Col[2].b := 1;
+
+ Col[3].r := 1;
+ Col[3].g := 1;
+ Col[3].b := 1;
+ end;
+ PerfectNote:
+ begin
+ Tex := Tex_Note_Perfect_Star.TexNum;
+ W := 30;
+ H := 30;
+ SetLength(Col,1);
+ Col[0].r := 1;
+ Col[0].g := 1;
+ Col[0].b := 0.95;
+ end;
+ NoteHitTwinkle:
+ begin
+ Tex := Tex_Note_Star.TexNum;
+ Alpha := (Live/16); // linear fade-out
+ W := 15;
+ H := 15;
+ Setlength(Col,1);
+ Col[0].r := 1;
+ Col[0].g := 1;
+ Col[0].b := RandomRange(10*Live,100)/90; //0.9;
+ end;
+ PerfectLineTwinkle:
+ begin
+ Tex := Tex_Note_Star.TexNum;
+ W := RandomRange(10,20);
+ H := W;
+ SizeMod := (-cos((Frame+1)*5*2*pi/16)*0.5+1.1);
+ SurviveSentenceChange:=True;
+ // assign colours according to player given
+ SetLength(Scale,3);
+ Scale[1]:=0.3;
+ Scale[2]:=0.2;
+ SetLength(Col,3);
+ case Player of
+ 0: LoadColor(Col[0].r,Col[0].g,Col[0].b,'P1Light');
+ 1: LoadColor(Col[0].r,Col[0].g,Col[0].b,'P2Light');
+ 2: LoadColor(Col[0].r,Col[0].g,Col[0].b,'P3Light');
+ 3: LoadColor(Col[0].r,Col[0].g,Col[0].b,'P4Light');
+ 4: LoadColor(Col[0].r,Col[0].g,Col[0].b,'P5Light');
+ 5: LoadColor(Col[0].r,Col[0].g,Col[0].b,'P6Light');
+ else LoadColor(Col[0].r,Col[0].g,Col[0].b,'P1Light');
+ end;
+ Col[1].r := 1;
+ Col[1].g := 1;
+ Col[1].b := 0.4;
+ Col[2].r:=Col[0].r+0.5;
+ Col[2].g:=Col[0].g+0.5;
+ Col[2].b:=Col[0].b+0.5;
+ mX := RandomRange(-5,5);
+ mY := RandomRange(-5,5);
+ end;
+ ColoredStar:
+ begin
+ Tex := Tex_Note_Star.TexNum;
+ W := RandomRange(10,20);
+ H := W;
+ SizeMod := (-cos((Frame+1)*5*2*pi/16)*0.5+1.1);
+ SurviveSentenceChange:=True;
+ // assign colours according to player given
+ SetLength(Scale,1);
+ SetLength(Col,1);
+ Col[0].b := (Player and $ff)/255;
+ Col[0].g := ((Player shr 8) and $ff)/255;
+ Col[0].r := ((Player shr 16) and $ff)/255;
+ mX := 0;
+ mY := 0;
+ end;
+ Flare:
+ begin
+ Tex := Tex_Note_Star.TexNum;
+ W := 7;
+ H := 7;
+ SizeMod := (-cos((Frame+1)*5*2*pi/16)*0.5+1.1);
+ mX := RandomRange(-5,5);
+ mY := RandomRange(-5,5);
+ SetLength(Scale,4);
+ Scale[1]:=0.8;
+ Scale[2]:=0.4;
+ Scale[3]:=0.3;
+ SetLength(Col,4);
+ Col[0].r := 1;
+ Col[0].g := 0.7;
+ Col[0].b := 0.1;
+
+ Col[1].r := 1;
+ Col[1].g := 1;
+ Col[1].b := 0.4;
+
+ Col[2].r := 1;
+ Col[2].g := 1;
+ Col[2].b := 1;
+
+ Col[3].r := 1;
+ Col[3].g := 1;
+ Col[3].b := 1;
+
+ end;
+ else // just some random default values
+ begin
+ Tex := Tex_Note_Star.TexNum;
+ Alpha := 1;
+ W := 20;
+ H := 20;
+ SetLength(Col,1);
+ Col[0].r := 1;
+ Col[0].g := 1;
+ Col[0].b := 1;
+ end;
+ end;
+end;
+
+Destructor TParticle.Destroy();
+begin
+ SetLength(Scale,0);
+ SetLength(Col,0);
+ inherited;
+end;
+
+procedure TParticle.LiveOn;
+begin
+ //Live = 0 => Live forever <blindy> ?? die werden doch aber im Manager bei Draw getötet, wenns 0 is
+ if (Live > 0) then
+ Dec(Live);
+
+ // animate frames
+ Frame := ( Frame + 1 ) mod 16;
+
+ // make our particles do funny stuff (besides being animated)
+ // changes of any particle-values throughout its life are done here
+ case StarType of
+ GoldenNote:
+ begin
+ Alpha := (-cos((Frame+1)*2*pi/16)+1); // neat fade-in-and-out
+ end;
+ PerfectNote:
+ begin
+ Alpha := (-cos((Frame+1)*2*pi/16)+1); // neat fade-in-and-out
+ end;
+ NoteHitTwinkle:
+ begin
+ Alpha := (Live/10); // linear fade-out
+ end;
+ PerfectLineTwinkle:
+ begin
+ Alpha := (-cos((Frame+1)*2*pi/16)+1); // neat fade-in-and-out
+ SizeMod := (-cos((Frame+1)*5*2*pi/16)*0.5+1.1);
+ // move around
+ X := X + mX;
+ Y := Y + mY;
+ end;
+ ColoredStar:
+ begin
+ Alpha := (-cos((Frame+1)*2*pi/16)+1); // neat fade-in-and-out
+ end;
+ Flare:
+ begin
+ Alpha := (-cos((Frame+1)/16*1.7*pi+0.3*pi)+1); // neat fade-in-and-out
+ SizeMod := (-cos((Frame+1)*5*2*pi/16)*0.5+1.1);
+ // move around
+ X := X + mX;
+ Y := Y + mY;
+ mY:=mY+1.8;
+// mX:=mX/2;
+ end;
+ end;
+end;
+
+procedure TParticle.Draw;
+var L: Cardinal;
+begin
+ if ScreenAct = Screen then
+ // this draws (multiple) texture(s) of our particle
+ for L:=0 to High(Col) do
+ begin
+ glColor4f(Col[L].r, Col[L].g, Col[L].b, Alpha);
+
+ glBindTexture(GL_TEXTURE_2D, Tex);
+ glEnable(GL_TEXTURE_2D);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+
+ begin
+ glBegin(GL_QUADS);
+ glTexCoord2f((1/16) * Frame, 0); glVertex2f(X-W*Scale[L]*SizeMod, Y-H*Scale[L]*SizeMod);
+ glTexCoord2f((1/16) * Frame + (1/16), 0); glVertex2f(X-W*Scale[L]*SizeMod, Y+H*Scale[L]*SizeMod);
+ glTexCoord2f((1/16) * Frame + (1/16), 1); glVertex2f(X+W*Scale[L]*SizeMod, Y+H*Scale[L]*SizeMod);
+ glTexCoord2f((1/16) * Frame, 1); glVertex2f(X+W*Scale[L]*SizeMod, Y-H*Scale[L]*SizeMod);
+ glEnd;
+ end;
+ end;
+ glcolor4f(1,1,1,1);
+end;
+// end of TParticle
+
+// TEffectManager
+
+constructor TEffectManager.Create;
+var c: Cardinal;
+begin
+ inherited;
+ LastTime := GetTickCount;
+ for c:=0 to 5 do
+ begin
+ TwinkleArray[c] := 0;
+ end;
+end;
+
+destructor TEffectManager.Destroy;
+begin
+ Killall;
+ inherited;
+end;
+
+
+procedure TEffectManager.Draw;
+var
+ I: Integer;
+ CurrentTime: Cardinal;
+//const
+// DelayBetweenFrames : Cardinal = 100;
+begin
+
+ CurrentTime := GetTickCount;
+ //Manage particle life
+ if (CurrentTime - LastTime) > DelayBetweenFrames then
+ begin
+ LastTime := CurrentTime;
+ for I := 0 to high(Particle) do
+ Particle[I].LiveOn;
+ end;
+
+ I := 0;
+ //Kill dead particles
+ while (I <= High(Particle)) do
+ begin
+ if (Particle[I].Live <= 0) then
+ begin
+ kill(I);
+ end
+ else
+ begin
+ inc(I);
+ end;
+ end;
+
+ //Draw
+ for I := 0 to high(Particle) do
+ begin
+ Particle[I].Draw;
+ end;
+end;
+
+// this method creates just one particle
+function TEffectManager.Spawn(X, Y: Real; Screen: Integer; Live: Byte; StartFrame : Integer; RecArrayIndex : Integer; StarType : TParticleType; Player: Cardinal): Cardinal;
+begin
+ Result := Length(Particle);
+ SetLength(Particle, (Result + 1));
+ Particle[Result] := TParticle.Create(X, Y, Screen, Live, StartFrame, RecArrayIndex, StarType, Player);
+end;
+
+// manage Sparkling of GoldenNote Bars
+procedure TEffectManager.SpawnRec();
+Var
+ Xkatze, Ykatze : Real;
+ RandomFrame : Integer;
+ P : Integer; // P as seen on TV as Positionman
+begin
+//Spawn a random amount of stars within the given coordinates
+//RandomRange(0,14) <- this one starts at a random frame, 16 is our last frame - would be senseless to start a particle with 16, cause it would be dead at the next frame
+for P:= 0 to high(RecArray) do
+ begin
+ while (RecArray[P].TotalStarCount > RecArray[P].CurrentStarCount) do
+ begin
+ Xkatze := RandomRange(Ceil(RecArray[P].xTop), Ceil(RecArray[P].xBottom));
+ Ykatze := RandomRange(Ceil(RecArray[P].yTop), Ceil(RecArray[P].yBottom));
+ RandomFrame := RandomRange(0,14);
+ // Spawn a GoldenNote Particle
+ Spawn(Xkatze, Ykatze, RecArray[P].Screen, 16 - RandomFrame, RandomFrame, P, GoldenNote, 0);
+ inc(RecArray[P].CurrentStarCount);
+ end;
+ end;
+ draw;
+end;
+
+// kill one particle (with given index in our particle array)
+procedure TEffectManager.Kill(Index: Cardinal);
+var
+ LastParticleIndex : Integer;
+begin
+// delete particle indexed by Index,
+// overwrite it's place in our particle-array with the particle stored at the last array index,
+// shorten array
+ LastParticleIndex := high(Particle);
+ if not(LastParticleIndex = -1) then // is there still a particle to delete?
+ begin
+ if not(Particle[Index].RecIndex = -1) then // if it is a GoldenNote particle...
+ dec(RecArray[Particle[Index].RecIndex].CurrentStarCount); // take care of its associated GoldenRec
+ // now get rid of that particle
+ Particle[Index].Destroy;
+ Particle[Index] := Particle[LastParticleIndex];
+ SetLength(Particle, LastParticleIndex);
+ end;
+end;
+
+// clean up all particles and management structures
+procedure TEffectManager.KillAll();
+var c: Cardinal;
+begin
+//It's the kill all kennies rotuine
+ while Length(Particle) > 0 do // kill all existing particles
+ Kill(0);
+ SetLength(RecArray,0); // remove GoldenRec positions
+ SetLength(PerfNoteArray,0); // remove PerfectNote positions
+ for c:=0 to 5 do
+ begin
+ TwinkleArray[c] := 0; // reset GoldenNoteHit memory
+ end;
+end;
+
+procedure TEffectManager.SentenceChange();
+var c: Cardinal;
+begin
+ c:=0;
+ while c <= High(Particle) do
+ begin
+ if Particle[c].SurviveSentenceChange then
+ inc(c)
+ else
+ Kill(c);
+ end;
+ SetLength(RecArray,0); // remove GoldenRec positions
+ SetLength(PerfNoteArray,0); // remove PerfectNote positions
+ for c:=0 to 5 do
+ begin
+ TwinkleArray[c] := 0; // reset GoldenNoteHit memory
+ end;
+end;
+
+procedure TeffectManager.GoldenNoteTwinkle(Top,Bottom,Right: Real; Player: Integer);
+//Twinkle stars while golden note hit
+// this is called from UDraw.pas, SingDrawPlayerCzesc
+var
+ C, P, XKatze, YKatze, LKatze: Integer;
+ H: Real;
+begin
+ // make sure we spawn only one time at one position
+ if (TwinkleArray[Player] < Right) then
+ For P := 0 to high(RecArray) do // Are we inside a GoldenNoteRectangle?
+ begin
+ H := (Top+Bottom)/2; // helper...
+ with RecArray[P] do
+ if ((xBottom >= Right) and (xTop <= Right) and
+ (yTop <= H) and (yBottom >= H))
+ and (Screen = ScreenAct) then
+ begin
+ TwinkleArray[Player] := Right; // remember twinkle position for this player
+ for C := 1 to 10 do
+ begin
+ Ykatze := RandomRange(ceil(Top) , ceil(Bottom));
+ XKatze := RandomRange(-7,3);
+ LKatze := RandomRange(7,13);
+ Spawn(Ceil(Right)+XKatze, YKatze, ScreenAct, LKatze, 0, -1, NoteHitTwinkle, 0);
+ end;
+ for C := 1 to 3 do
+ begin
+ Ykatze := RandomRange(ceil(Top)-6 , ceil(Top));
+ XKatze := RandomRange(-5,1);
+ LKatze := RandomRange(4,7);
+ Spawn(Ceil(Right)+XKatze, YKatze, ScreenAct, LKatze, 0, -1, NoteHitTwinkle, 0);
+ end;
+ for C := 1 to 3 do
+ begin
+ Ykatze := RandomRange(ceil(Bottom), ceil(Bottom)+6);
+ XKatze := RandomRange(-5,1);
+ LKatze := RandomRange(4,7);
+ Spawn(Ceil(Right)+XKatze, YKatze, ScreenAct, LKatze, 0, -1, NoteHitTwinkle, 0);
+ end;
+ for C := 1 to 3 do
+ begin
+ Ykatze := RandomRange(ceil(Top)-10 , ceil(Top)-6);
+ XKatze := RandomRange(-5,1);
+ LKatze := RandomRange(1,4);
+ Spawn(Ceil(Right)+XKatze, YKatze, ScreenAct, LKatze, 0, -1, NoteHitTwinkle, 0);
+ end;
+ for C := 1 to 3 do
+ begin
+ Ykatze := RandomRange(ceil(Bottom)+6 , ceil(Bottom)+10);
+ XKatze := RandomRange(-5,1);
+ LKatze := RandomRange(1,4);
+ Spawn(Ceil(Right)+XKatze, YKatze, ScreenAct, LKatze, 0, -1, NoteHitTwinkle, 0);
+ end;
+
+ exit; // found a matching GoldenRec, did spawning stuff... done
+ end;
+ end;
+end;
+
+procedure TEffectManager.SaveGoldenStarsRec(Xtop, Ytop, Xbottom, Ybottom: Real);
+var
+ P : Integer; // P like used in Positions
+ NewIndex : Integer;
+begin
+ For P := 0 to high(RecArray) do // Do we already have that "new" position?
+ begin
+ if (ceil(RecArray[P].xTop) = ceil(Xtop)) and
+ (ceil(RecArray[P].yTop) = ceil(Ytop)) and
+ (ScreenAct = RecArray[p].Screen) then
+ exit; // it's already in the array, so we don't have to create a new one
+ end;
+
+ // we got a new position, add the new positions to our array
+ NewIndex := Length(RecArray);
+ SetLength(RecArray, NewIndex + 1);
+ RecArray[NewIndex].xTop := Xtop;
+ RecArray[NewIndex].yTop := Ytop;
+ RecArray[NewIndex].xBottom := Xbottom;
+ RecArray[NewIndex].yBottom := Ybottom;
+ RecArray[NewIndex].TotalStarCount := ceil(Xbottom - Xtop) div 12 + 3;
+ RecArray[NewIndex].CurrentStarCount := 0;
+ RecArray[NewIndex].Screen := ScreenAct;
+end;
+
+procedure TEffectManager.SavePerfectNotePos(Xtop, Ytop: Real);
+var
+ P : Integer; // P like used in Positions
+ NewIndex : Integer;
+ RandomFrame : Integer;
+ Xkatze, Ykatze : Integer;
+begin
+ For P := 0 to high(PerfNoteArray) do // Do we already have that "new" position?
+ begin
+ with PerfNoteArray[P] do
+ if (ceil(xPos) = ceil(Xtop)) and (ceil(yPos) = ceil(Ytop)) and
+ (Screen = ScreenAct) then
+ exit; // it's already in the array, so we don't have to create a new one
+ end; //for
+
+ // we got a new position, add the new positions to our array
+ NewIndex := Length(PerfNoteArray);
+ SetLength(PerfNoteArray, NewIndex + 1);
+ PerfNoteArray[NewIndex].xPos := Xtop;
+ PerfNoteArray[NewIndex].yPos := Ytop;
+ PerfNoteArray[NewIndex].Screen := ScreenAct;
+
+ for P:= 0 to 2 do
+ begin
+ Xkatze := RandomRange(ceil(Xtop) - 5 , ceil(Xtop) + 10);
+ Ykatze := RandomRange(ceil(Ytop) - 5 , ceil(Ytop) + 10);
+ RandomFrame := RandomRange(0,14);
+ Spawn(Xkatze, Ykatze, ScreenAct, 16 - RandomFrame, RandomFrame, -1, PerfectNote, 0);
+ end; //for
+
+end;
+
+procedure TEffectManager.SpawnPerfectLineTwinkle();
+var
+ P,I,Life: Cardinal;
+ Left, Right, Top, Bottom: Cardinal;
+ cScreen: Integer;
+begin
+// calculation of coordinates done with hardcoded values like in UDraw.pas
+// might need to be adjusted if drawing of SingScreen is modified
+// coordinates may still be a bit weird and need adjustment
+ if Ini.SingWindow = 0 then begin
+ Left := 130;
+ end else begin
+ Left := 30;
+ end;
+ Right := 770;
+ // spawn effect for every player with a perfect line
+ for P:=0 to PlayersPlay-1 do
+ if Player[P].LastSentencePerfect then
+ begin
+ // calculate area where notes of this player are drawn
+ case PlayersPlay of
+ 1: begin
+ Bottom:=Skin_P2_NotesB+10;
+ Top:=Bottom-105;
+ cScreen:=1;
+ end;
+ 2,4: begin
+ case P of
+ 0,2: begin
+ Bottom:=Skin_P1_NotesB+10;
+ Top:=Bottom-105;
+ end;
+ else begin
+ Bottom:=Skin_P2_NotesB+10;
+ Top:=Bottom-105;
+ end;
+ end;
+ case P of
+ 0,1: cScreen:=1;
+ else cScreen:=2;
+ end;
+ end;
+ 3,6: begin
+ case P of
+ 0,3: begin
+ Top:=130;
+ Bottom:=Top+85;
+ end;
+ 1,4: begin
+ Top:=255;
+ Bottom:=Top+85;
+ end;
+ 2,5: begin
+ Top:=380;
+ Bottom:=Top+85;
+ end;
+ end;
+ case P of
+ 0,1,2: cScreen:=1;
+ else cScreen:=2;
+ end;
+ end;
+ end;
+ // spawn Sparkling Stars inside calculated coordinates
+ for I:= 0 to 80 do
+ begin
+ Life:=RandomRange(8,16);
+ Spawn(RandomRange(Left,Right), RandomRange(Top,Bottom), cScreen, Life, 16-Life, -1, PerfectLineTwinkle, P);
+ end;
+ end;
+end;
+
+end.
+
diff --git a/Game/Code/Classes/UHelp.pas b/Game/Code/Classes/UHelp.pas
new file mode 100644
index 00000000..4691858c
--- /dev/null
+++ b/Game/Code/Classes/UHelp.pas
@@ -0,0 +1,401 @@
+unit UHelp;
+
+interface
+uses
+ IniFiles,
+ ULog,
+ SysUtils;
+
+type
+ TKeymap = record
+ Key: array of string; //key-combination translated
+ Text: string; //description text
+ end;
+
+ TSection = record
+ name: string;
+ Keys: array of TKeymap;
+ end;
+
+ TSub = record
+ title: string;
+ text: array of string;
+ end;
+
+ TKeyNames = record
+ Key: array of string;
+ end;
+
+ TTextResultSection = record
+ name: string;
+ Keys: array of TKeyNames;
+ KeyDescription: array of string;
+ end;
+
+ TTextResult = record
+ Title: String;
+ Description: String;
+ Subs: array of TSub;
+ Sections: array of TTextResultSection;
+ end;
+
+ TKeys = record
+ Key: string;
+ Translation: string;
+ end;
+
+ TEntry = record
+ ID: string;
+ Title: string;
+ Description: string;
+ Subs: array of TSub;
+ Sections: array of TSection;
+ end;
+
+ TLanguageList = record
+ Name: string;
+ end;
+
+ THelp = class
+ private
+ ScrollPos: double;
+ Entry: array of TEntry;
+ SEntry: array of TEntry;
+ AEntry: TEntry;
+ List: array of TLanguageList;
+ Implode_Glue1, Implode_Glue2: String;
+ public
+ MaxLines: integer;
+ constructor Create;
+ procedure LoadList;
+
+ procedure ChangeLanguage(Language: String);
+ //procedure LoadKeys;
+ function SetHelpID(ID: String):boolean;
+ function GetHelpStr(): TTextResult;
+ procedure SetScrollPos(pos: double);
+ function GetScrollPos(): double;
+ end;
+
+
+var
+ Help: THelp;
+
+
+implementation
+uses UFiles, SDL, Classes, ULanguage;
+
+//----------
+//Create - Construct Class then LoadList + Standard Language + Set Standard Implode Glues
+//----------
+constructor THelp.Create;
+var
+ I, J, K: Integer;
+begin
+ LoadList;
+ MaxLines := 0;
+ //LoadKeys;
+ //Set Implode Glues for Backward Compatibility
+ Implode_Glue1 := ', ';
+ Implode_Glue2 := ' and ';
+
+ if (Length(List) = 0) then //No Language Files Loaded -> Abort Loading
+ Log.CriticalError('Could not load any Language File (Help System)');
+
+ //Standard Language (If a Language File is Incomplete)
+ //Then use English Language
+ for I := 0 to high(List) do //Search for English Language
+ begin
+ //English Language Found -> Load
+ if Uppercase(List[I].Name) = 'ENGLISH' then
+ begin
+ ChangeLanguage('English');
+
+ SetLength(SEntry, Length(Entry));
+
+ for J := low(Entry) to high(Entry) do
+ begin
+ SetLength(SEntry[J].Sections, Length(Entry[J].Sections));
+ SEntry[J].ID := Entry[J].ID;
+ SEntry[J].Title := Entry[J].Title;
+ SEntry[J].Description := Entry[J].Description;
+ for K := low(Entry[J].Sections) to high(Entry[J].Sections) do
+ SEntry[J].Sections[K] := Entry[J].Sections[K];
+ end;
+
+ SetLength(List, 0);
+
+ Break;
+ end;
+
+ if (I = high(List)) then
+ Log.LogError('English Languagefile missing! No standard Translation loaded (Help System)');
+ end;
+ //Standard Language END
+
+end;
+
+//----------
+//LoadList - Parse the Help Dir searching Translations
+//----------
+procedure THelp.LoadList;
+var
+ SR: TSearchRec; // for parsing directory
+begin
+ SetLength(List, 0);
+
+ if FindFirst(LanguagesPath + '*.ini', 0, SR) = 0 then begin
+ repeat
+ SetLength(List, Length(List)+1);
+ SR.Name := ChangeFileExt(SR.Name, '');
+ List[High(List)].Name := SR.Name;
+ until FindNext(SR) <> 0;
+ SysUtils.FindClose(SR);
+ end; // if FindFirst
+end;
+
+//----------
+//ChangeLanguage - Load the specified LanguageFile
+//----------
+procedure THelp.ChangeLanguage(Language: String);
+var
+ IniFile: TIniFile;
+ E: integer; // entry
+ S: TStringList;
+ SL : TStringList;
+ num: Integer;
+ I, J: Integer;
+ Keys: array of TKeys;
+ tempStr: string;
+ ActSection: integer;
+ ActSub: integer;
+ ActKey: integer;
+ ActSubEntry: integer;
+
+ function GetIDStr(ID: integer):string;
+ var
+ S: string;
+ begin
+ S := IntToStr(ID);
+ while (Length(S)<3) do S := '0' + S;
+ Result := 'ID_' + S;
+ end;
+
+ function GetKeyTranslation(Key: string):string;
+ var
+ I: Integer;
+ begin
+ Result := 'Error';
+ for I := 0 to Length(Keys) - 1 do
+ begin
+ if Keys[I].Key=Key then
+ begin
+ Result := Keys[I].Translation;
+ break;
+ end;
+ end;
+ end;
+
+begin
+ IniFile := TIniFile.Create(LanguagesPath + Language + '.ini');
+
+ SetLength(Keys, 0);
+ //read keys
+ S := TStringList.Create;
+ IniFile.ReadSectionValues('Keymap', S);
+
+ SetLength(Keys, S.Count);
+ for E := 0 to high(Keys) do
+ begin
+ if S.Names[E] = 'IMPLODE_GLUE1' then
+ Implode_Glue1 := S.ValueFromIndex[E]+ ' '
+ else if S.Names[E] = 'IMPLODE_GLUE2' then
+ Implode_Glue2 := ' ' + S.ValueFromIndex[E] + ' ';
+
+ Keys[E].Key := S.Names[E];
+ Keys[E].Translation := S.ValueFromIndex[E];
+ end;
+
+ SetLength(Entry, 0);
+ num := IniFile.ReadInteger('config', 'NumIDs', 0);
+
+ if num>0 then
+ begin
+ SetLength(Entry, num);
+ for I:=1 to num do
+ begin
+
+ Entry[I-1].ID:= GetIDStr(I);
+ Entry[I-1].Title := IniFile.ReadString(GetIDStr(I), 'Title', 'error title: ' + GetIDStr(I));
+ Entry[I-1].Description := IniFile.ReadString(GetIDStr(I), 'Description', 'error description: ' + GetIDStr(I));
+
+ //read subs, sections and keymapping
+ S := TStringList.Create;
+ IniFile.ReadSectionValues(GetIDStr(I), S);
+ ActSub := -1;
+ ActSubEntry := -1;
+ ActSection := -1;
+ ActKey := -1;
+
+ //SetLength(Entry[I-1].Keys, S.Count-2);
+ for E := 0 to S.Count-1 do
+ begin
+ if S.Names[E] = 'IMPLODE_GLUE1' then
+ Implode_Glue1 := S.ValueFromIndex[E]+ ' '
+ else if S.Names[E] = 'IMPLODE_GLUE2' then
+ Implode_Glue2 := ' ' + S.ValueFromIndex[E] + ' ';
+
+ if (S.Names[E] <> 'Title') and (S.Names[E] <> 'Description') then
+ begin
+ tempStr := S.Names[E];
+
+ SL:=TStringList.Create;
+ try
+ ExtractStrings(['_'], [], PChar(tempStr), SL);
+ //check new Sub
+ if SL[0]='SUB' then
+ begin
+ inc(ActSub);
+ ActSubEntry := -1;
+ SetLength(Entry[I-1].Subs, ActSub+1);
+ Entry[I-1].Subs[ActSub].title := S.ValueFromIndex[E];
+
+ end
+
+ //check sub entry
+ else if SL[0]='ENT' then
+ begin
+ inc(ActSubEntry);
+ SetLength(Entry[I-1].Subs[ActSub].text, ActSubEntry+1);
+ Entry[I-1].Subs[ActSub].text[ActSubEntry] := S.ValueFromIndex[E];
+ end
+
+ //check new section
+ else if SL[0]='SEC' then
+ begin
+ inc(ActSection);
+ ActKey := -1;
+ SetLength(Entry[I-1].Sections, ActSection+1);
+ Entry[I-1].Sections[ActSection].name := S.ValueFromIndex[E];
+ end
+
+ //read keymap
+ else if ActSection=-1 then
+ begin
+ Log.LogError('No section in keymapping of ' + GetIDStr(I) + ' in ' + language + '.ini');
+ end else
+ begin
+ inc(ActKey);
+ SetLength(Entry[I-1].Sections[ActSection].Keys, ActKey +1);
+ Entry[I-1].Sections[ActSection].Keys[ActKey].Text := S.ValueFromIndex[E];
+
+ SetLength(Entry[I-1].Sections[ActSection].Keys[ActKey].Key, SL.Count);
+ for J := 0 to SL.Count-1 do
+ Entry[I-1].Sections[ActSection].Keys[ActKey].Key[J] := GetKeyTranslation(SL[J]);
+ end;
+
+ Finally
+ SL.Free;
+ end;
+
+ end;
+ end;
+
+ S.Free;
+ end;
+ end;
+
+ IniFile.Free;
+end;
+
+function THelp.SetHelpID(ID: String):boolean;
+var
+ E, J: integer; // entry
+begin
+ Result := false;
+ ScrollPos := 0.0;
+
+ for E := 0 to high(Entry) do
+ begin
+ if ID = Entry[E].ID then
+ begin
+ Result := true;
+ AEntry := Entry[E];
+ {
+ SetLength(AEntry.Keys, Length(Entry[E].Keys));
+ AEntry.ID := Entry[E].ID;
+ AEntry.Title := Entry[E].Title;
+ AEntry.Description := Entry[E].Description;
+ for J := low(Entry[E].Keys) to high(Entry[E].Keys) do
+ AEntry.Keys[J] := Entry[E].Keys[J];}
+ exit;
+ end;
+ end;
+
+ //Standard Language (If a Language File is Incomplete)
+ //Then use Standard Language
+ for E := low(SEntry) to high(SEntry) do
+ begin
+ if ID = SEntry[E].ID then
+ begin
+ Result := true;
+ AEntry := SEntry[E];
+ {
+ SetLength(AEntry.Keys, Length(SEntry[E].Keys));
+ AEntry.ID := SEntry[E].ID;
+ AEntry.Title := SEntry[E].Title;
+ AEntry.Description := SEntry[E].Description;
+ for J := low(SEntry[E].Keys) to high(SEntry[E].Keys) do
+ AEntry.Keys[J] := SEntry[E].Keys[J]; }
+
+ exit;
+ end;
+ end;
+ //Standard Language END
+end;
+
+function THelp.GetHelpStr(): TTextResult;
+var
+ K, I, J: Integer;
+ w: real;
+begin
+ SetLength(Result.Sections, Length(AEntry.Sections));
+ for K := 0 to Length(AEntry.Sections) - 1 do
+ begin
+ SetLength(Result.Sections[K].Keys, Length(AEntry.Sections[K].Keys));
+ SetLength(Result.Sections[K].KeyDescription, Length(AEntry.Sections[K].Keys));
+ Result.Sections[K].name := AEntry.Sections[K].name;
+
+ for I := 0 to Length(AEntry.Sections[K].Keys)-1 do
+ begin
+ SetLength(Result.Sections[K].Keys[I].Key, Length(AEntry.Sections[K].Keys[I].Key));
+ for J := 0 to Length(AEntry.Sections[K].Keys[I].Key) - 1 do
+ begin
+ Result.Sections[K].Keys[I].Key[J] := '[' + AEntry.Sections[K].Keys[I].Key[J] + ']';
+ end;
+ Result.Sections[K].KeyDescription[I] := AEntry.Sections[K].Keys[I].Text;
+ end;
+ end;
+
+ SetLength(Result.Subs, Length(AEntry.Subs));
+ for K := 0 to Length(AEntry.Subs) - 1 do
+ begin
+ Result.Subs[K].title := AEntry.Subs[K].title;
+ Result.Subs[K].text := AEntry.Subs[K].text;
+ end;
+
+ Result.Title := AEntry.Title;
+ Result.Description := AEntry.Description;
+end;
+
+procedure THelp.SetScrollPos(pos: double);
+begin
+ ScrollPos := pos;
+end;
+
+function THelp.GetScrollPos(): double;
+begin
+ Result := ScrollPos;
+end;
+
+end.
diff --git a/Game/Code/Classes/UIni.pas b/Game/Code/Classes/UIni.pas
new file mode 100644
index 00000000..8e452dd5
--- /dev/null
+++ b/Game/Code/Classes/UIni.pas
@@ -0,0 +1,820 @@
+unit UIni;
+
+interface
+uses IniFiles, ULog, SysUtils;
+
+type
+ TIni = class
+ Name: array[0..11] of string;
+
+ // Templates for Names Mod
+ NameTeam: array[0..2] of string;
+ NameTemplate: array[0..11] of string;
+
+ //Filename of the opened iniFile
+ Filename: string;
+
+ // Game
+ Players: integer;
+ Difficulty: integer;
+ Language: integer;
+ Tabs: integer;
+ Tabs_at_startup:integer; //Tabs at Startup fix
+ Sorting: integer;
+ Debug: integer;
+
+ // Graphics
+ Screens: integer;
+ Resolution: integer;
+ Depth: integer;
+ FullScreen: integer;
+ TextureSize: integer;
+ SingWindow: integer;
+ Oscilloscope: integer;
+ Spectrum: integer;
+ Spectrograph: integer;
+ MovieSize: integer;
+ MoviePreview: integer;
+ AspectCorrect: integer;
+
+ // Sound
+ MicBoost: integer;
+ ClickAssist: integer;
+ BeatClick: integer;
+ SavePlayback: integer;
+ Threshold: integer;
+
+ //Song Preview
+ PreviewVolume: integer;
+ PreviewFading: integer;
+
+ // Lyrics
+ LyricsFont: integer;
+ LyricsEffect: integer;
+ Solmization: integer;
+
+ // Themes
+ Theme: integer;
+ SkinNo: integer;
+ Color: integer;
+
+ // Record
+ Card: integer; // not saved in config.ini
+
+ CardList: array of record
+ Name: string;
+ Input: integer;
+ ChannelL: integer;
+ ChannelR: integer;
+ end;
+
+ // Advanced
+ LoadAnimation: integer;
+ EffectSing: integer;
+ ScreenFade: integer;
+ AskbeforeDel: integer;
+ OnSongClick: integer;
+ LineBonus: integer;
+ PartyPopup: integer;
+
+ // Controller
+ Joypad: integer;
+
+ // Soundcards
+ SoundCard: array[0..7, 1..2] of integer;
+
+ // Devices
+ LPT: integer;
+
+ procedure Load;
+ procedure Save;
+ procedure SaveNames;
+ procedure SaveLevel;
+ end;
+
+
+var
+ Ini: TIni;
+ IResolution: array of string;
+ ILanguage: array of string;
+ ITheme: array of string;
+ ISkin: array of string;
+ ICard: array of string;
+ IInput: array of string;
+
+const
+ IPlayers: array[0..4] of string = ('1', '2', '3', '4', '6');
+ IDifficulty: array[0..2] of string = ('Easy', 'Medium', 'Hard');
+ ITabs: array[0..1] of string = ('Off', 'On');
+
+ ISorting: array[0..7] of string = ('Edition', 'Genre', 'Language', 'Folder', 'Title', 'Artist', 'Title2', 'Artist2');
+ sEdition = 0;
+ sGenre = 1;
+ sLanguage = 2;
+ sFolder = 3;
+ sTitle = 4;
+ sArtist = 5;
+ sTitle2 = 6;
+ sArtist2 = 7;
+
+ IDebug: array[0..1] of string = ('Off', 'On');
+
+ IScreens: array[0..1] of string = ('1', '2');
+ IFullScreen: array[0..1] of string = ('Off', 'On');
+ IDepth: array[0..1] of string = ('16 bit', '32 bit');
+ ITextureSize: array[0..2] of string = ('128', '256', '512');
+ ISingWindow: array[0..1] of string = ('Small', 'Big');
+
+ //SingBar Mod
+ IOscilloscope: array[0..2] of string = ('Off', 'Osci', 'Bar');
+ //IOscilloscope: array[0..1] of string = ('Off', 'On');
+
+ ISpectrum: array[0..1] of string = ('Off', 'On');
+ ISpectrograph: array[0..1] of string = ('Off', 'On');
+ IMovieSize: array[0..2] of string = ('Half', 'Full', 'Off');
+ IMoviePreview: array[0..1] of string = ('Off', 'On');
+ IAspectCorrect: array[0..2] of String = ('Stretch', 'Crop', 'LetterBox');
+
+ IMicBoost: array[0..3] of string = ('Off', '+6dB', '+12dB', '+18dB');
+ IClickAssist: array[0..1] of string = ('Off', 'On');
+ IBeatClick: array[0..1] of string = ('Off', 'On');
+ ISavePlayback: array[0..1] of string = ('Off', 'On');
+ IThreshold: array[0..3] of string = ('5%', '10%', '15%', '20%');
+ //Song Preview
+ IPreviewVolume: array[0..10] of string = ('Off', '10%', '20%', '30%', '40%', '50%', '60%', '70%', '80%', '90%', '100%');
+ IPreviewFading: array[0..5] of string = ('Off', '1 Sec', '2 Secs', '3 Secs', '4 Secs', '5 Secs');
+
+
+ ILyricsFont: array[0..2] of string = ('Plain', 'OLine1', 'OLine2');
+ ILyricsEffect: array[0..3] of string = ('Simple', 'Zoom', 'Slide', 'Ball');
+ ISolmization: array[0..3] of string = ('Off', 'Euro', 'Jap', 'American');
+
+ IColor: array[0..8] of string = ('Blue', 'Green', 'Pink', 'Red', 'Violet', 'Orange', 'Yellow', 'Brown', 'Black');
+
+ // Advanced
+ ILoadAnimation: array[0..1] of string = ('Off', 'On');
+ IEffectSing: array[0..1] of string = ('Off', 'On');
+ IScreenFade: array [0..1] of String =('Off', 'On');
+ IAskbeforeDel: array[0..1] of string = ('Off', 'On');
+ IOnSongClick: array[0..2] of string = ('Sing', 'Select Players', 'Open Menu');
+ ILineBonus: array[0..2] of string = ('Off', 'At Score', 'At Notes');
+ IPartyPopup: array[0..1] of string = ('Off', 'On');
+
+ IJoypad: array[0..1] of string = ('Off', 'On');
+ ILPT: array[0..2] of string = ('Off', 'LCD', 'Lights');
+
+ IChannel: array[0..6] of string = ('Off', '1', '2', '3', '4', '5', '6');
+
+implementation
+uses UFiles, SDL, ULanguage, USkins, URecord, UCommandLine;
+
+procedure TIni.Load;
+var
+ IniFile: TMemIniFile;
+ ThemeIni: TMemIniFile;
+ Tekst: string;
+ Pet: integer;
+ B: boolean;
+ I, I2, I3: integer;
+ S: string;
+ Modes: PPSDL_Rect;
+ SR: TSearchRec; //Skin List Patch
+ found: boolean;
+
+ function GetFileName (S: String):String;
+ begin
+ //Result := copy (S,0,StrRScan (PChar(S),char('.'))+1);
+ Result := copy (S,0,Pos ('.ini',S)-1);
+ end;
+
+begin
+ GamePath := ExtractFilePath(ParamStr(0));
+
+ if (Params.ConfigFile <> '') then
+ try
+ IniFile := TMemIniFile.Create(Params.ConfigFile);
+ except
+ IniFile := TMemIniFile.Create(GamePath + 'config.ini');
+ end
+ else
+ IniFile := TMemIniFile.Create(GamePath + 'config.ini');
+
+
+ // Name
+ for I := 0 to 11 do
+ Ini.Name[I] := IniFile.ReadString('Name', 'P'+IntToStr(I+1), 'Player'+IntToStr(I+1));
+
+
+ // Templates for Names Mod
+ for I := 0 to 2 do
+ Ini.NameTeam[I] := IniFile.ReadString('NameTeam', 'T'+IntToStr(I+1), 'Team'+IntToStr(I+1));
+ for I := 0 to 11 do
+ Ini.NameTemplate[I] := IniFile.ReadString('NameTemplate', 'Name'+IntToStr(I+1), 'Template'+IntToStr(I+1));
+
+ // Players
+ Tekst := IniFile.ReadString('Game', 'Players', IPlayers[0]);
+ for Pet := 0 to High(IPlayers) do
+ if Tekst = IPlayers[Pet] then Ini.Players := Pet;
+
+ // Difficulty
+ Tekst := IniFile.ReadString('Game', 'Difficulty', 'Easy');
+ for Pet := 0 to High(IDifficulty) do
+ if Tekst = IDifficulty[Pet] then Ini.Difficulty := Pet;
+
+ // Language
+ Tekst := IniFile.ReadString('Game', 'Language', 'English');
+ for Pet := 0 to High(ILanguage) do
+ if Tekst = ILanguage[Pet] then Ini.Language := Pet;
+
+// Language.ChangeLanguage(ILanguage[Ini.Language]);
+
+ // Tabs
+ Tekst := IniFile.ReadString('Game', 'Tabs', ITabs[0]);
+ for Pet := 0 to High(ITabs) do
+ if Tekst = ITabs[Pet] then Ini.Tabs := Pet;
+
+ //Tabs at Startup fix
+ Ini.Tabs_at_startup := Ini.Tabs;
+
+ // Sorting
+ Tekst := IniFile.ReadString('Game', 'Sorting', ISorting[0]);
+ for Pet := 0 to High(ISorting) do
+ if Tekst = ISorting[Pet] then Ini.Sorting := Pet;
+
+ // Debug
+ Tekst := IniFile.ReadString('Game', 'Debug', IDebug[0]);
+ for Pet := 0 to High(IDebug) do
+ if Tekst = IDebug[Pet] then Ini.Debug := Pet;
+
+ //if Ini.Debug = 1 then SongPath := 'E:\UltraStar 03\Songs\';
+
+ // Screens
+ Tekst := IniFile.ReadString('Graphics', 'Screens', IScreens[0]);
+ for Pet := 0 to High(IScreens) do
+ if Tekst = IScreens[Pet] then Ini.Screens := Pet;
+
+ // Resolution
+ SetLength(IResolution, 0);
+ Modes := SDL_ListModes(nil, SDL_OPENGL or SDL_FULLSCREEN); // Check if there are any modes available
+
+ //this should solve the biggest wine problem | THANKS Linnex (11.11.07)
+ // if no modes were set, then fallback to 800x600
+ // as per http://sourceforge.net/forum/message.php?msg_id=4544965
+ // THANKS : linnex at users.sourceforge.net
+
+ if (modes = PPSDL_Rect( 0 ) ) then
+ begin //NO modes available => Fallback to 800x600
+ SetLength(IResolution, 1);
+ IResolution[High(IResolution)] := '800x600';
+ end
+ {Else If (modes = PPSDL_Rect(-1)) then
+ begin
+ //All Resolutions are Available
+ //This may be handled, too
+ // to-do : for future Version
+ end}
+ Else //Add all valid Modes
+ begin
+ I := 0;
+ Repeat
+ SetLength(IResolution, I + 1);
+ IResolution[I] := IntToStr((modes^)^.w) + 'x' + IntToStr((modes^)^.h);
+ Inc(I);
+ Inc(modes);
+ Until (modes^)=nil;
+ end;
+
+ // reverse order
+ for I := 0 to (Length(IResolution) div 2) - 1 do begin
+ S := IResolution[I];
+ IResolution[I] := IResolution[High(IResolution)-I];
+ IResolution[High(IResolution)-I] := S;
+ end;
+
+ Tekst := IniFile.ReadString('Graphics', 'Resolution', '800x600');
+ for Pet := 0 to High(IResolution) do
+ if Tekst = IResolution[Pet] then Ini.Resolution := Pet;
+
+ // FullScreen
+ Tekst := IniFile.ReadString('Graphics', 'FullScreen', 'On');
+ for Pet := 0 to High(IFullScreen) do
+ if Tekst = IFullScreen[Pet] then Ini.FullScreen := Pet;
+
+ // Resolution
+ Tekst := IniFile.ReadString('Graphics', 'Depth', '32 bit');
+ for Pet := 0 to High(IDepth) do
+ if Tekst = IDepth[Pet] then Ini.Depth := Pet;
+
+ // Texture Size
+ Tekst := IniFile.ReadString('Graphics', 'TextureSize', ITextureSize[1]);
+ for Pet := 0 to High(ITextureSize) do
+ if Tekst = ITextureSize[Pet] then Ini.TextureSize := Pet;
+
+ // SingWindow
+ Tekst := IniFile.ReadString('Graphics', 'SingWindow', 'Big');
+ for Pet := 0 to High(ISingWindow) do
+ if Tekst = ISingWindow[Pet] then Ini.SingWindow := Pet;
+
+ // Oscilloscope
+ Tekst := IniFile.ReadString('Graphics', 'Oscilloscope', 'Bar');
+ for Pet := 0 to High(IOscilloscope) do
+ if Tekst = IOscilloscope[Pet] then Ini.Oscilloscope := Pet;
+
+ // Spectrum
+ Tekst := IniFile.ReadString('Graphics', 'Spectrum', 'Off');
+ for Pet := 0 to High(ISpectrum) do
+ if Tekst = ISpectrum[Pet] then Ini.Spectrum := Pet;
+
+ // Spectrograph
+ Tekst := IniFile.ReadString('Graphics', 'Spectrograph', 'Off');
+ for Pet := 0 to High(ISpectrograph) do
+ if Tekst = ISpectrograph[Pet] then Ini.Spectrograph := Pet;
+
+ // MovieSize
+ Tekst := IniFile.ReadString('Graphics', 'MovieSize', IMovieSize[1]);
+ found := false;
+ for Pet := 0 to High(IMovieSize) do
+ begin
+ if Tekst = IMovieSize[Pet] then
+ begin
+ Ini.MovieSize := Pet;
+ found := true;
+ end;
+ end;
+
+ // MoviePreview
+ Tekst := IniFile.ReadString('Graphics', 'MoviePreview', IMoviePreview[1]);
+ for Pet := 0 to High(IMoviePreview) do
+ if Tekst = IMoviePreview[Pet] then Ini.MoviePreview := Pet;
+
+ // AspectCorrection
+ Tekst := IniFile.ReadString('Graphics', 'AspectCorrect', IAspectCorrect[2]);
+ for Pet := 0 to High(IAspectCorrect) do
+ if Tekst = IAspectCorrect[Pet] then Ini.AspectCorrect := Pet;
+
+ // MicBoost
+ Tekst := IniFile.ReadString('Sound', 'MicBoost', 'Off');
+ for Pet := 0 to High(IMicBoost) do
+ if Tekst = IMicBoost[Pet] then Ini.MicBoost := Pet;
+
+ // ClickAssist
+ Tekst := IniFile.ReadString('Sound', 'ClickAssist', 'Off');
+ for Pet := 0 to High(IClickAssist) do
+ if Tekst = IClickAssist[Pet] then Ini.ClickAssist := Pet;
+
+ // BeatClick
+ Tekst := IniFile.ReadString('Sound', 'BeatClick', IBeatClick[0]);
+ for Pet := 0 to High(IBeatClick) do
+ if Tekst = IBeatClick[Pet] then Ini.BeatClick := Pet;
+
+ // SavePlayback
+ Tekst := IniFile.ReadString('Sound', 'SavePlayback', ISavePlayback[0]);
+ for Pet := 0 to High(ISavePlayback) do
+ if Tekst = ISavePlayback[Pet] then Ini.SavePlayback := Pet;
+
+ // Threshold
+ Tekst := IniFile.ReadString('Sound', 'Threshold', IThreshold[2]);
+ for Pet := 0 to High(IThreshold) do
+ if Tekst = IThreshold[Pet] then Ini.Threshold := Pet;
+
+ //Song Preview
+ Tekst := IniFile.ReadString('Sound', 'PreviewVolume', IPreviewVolume[7]);
+ for Pet := 0 to High(IPreviewVolume) do
+ if Tekst = IPreviewVolume[Pet] then Ini.PreviewVolume := Pet;
+
+ Tekst := IniFile.ReadString('Sound', 'PreviewFading', IPreviewFading[1]);
+ for Pet := 0 to High(IPreviewFading) do
+ if Tekst = IPreviewFading[Pet] then Ini.PreviewFading := Pet;
+
+ // Lyrics Font
+ Tekst := IniFile.ReadString('Lyrics', 'LyricsFont', ILyricsFont[1]);
+ for Pet := 0 to High(ILyricsFont) do
+ if Tekst = ILyricsFont[Pet] then Ini.LyricsFont := Pet;
+
+ // Lyrics Effect
+ Tekst := IniFile.ReadString('Lyrics', 'LyricsEffect', ILyricsEffect[1]);
+ for Pet := 0 to High(ILyricsEffect) do
+ if Tekst = ILyricsEffect[Pet] then Ini.LyricsEffect := Pet;
+
+ // Solmization
+ Tekst := IniFile.ReadString('Lyrics', 'Solmization', ISolmization[0]);
+ for Pet := 0 to High(ISolmization) do
+ if Tekst = ISolmization[Pet] then Ini.Solmization := Pet;
+
+ // Theme
+
+ //Theme List Patch
+
+ //I2 Saves the no of the Deluxe (Standard-) Theme
+ I2 := 0;
+ //I counts is the cur. Theme no
+ I := 0;
+
+ SetLength(ITheme, 0);
+ FindFirst('Themes\*.ini',faAnyFile,SR);
+ Repeat
+ //Read Themename from Theme
+ ThemeIni := TMemIniFile.Create(SR.Name);
+ Tekst := UpperCase(ThemeIni.ReadString('Theme','Name',GetFileName(SR.Name)));
+ ThemeIni.Free;
+
+ //if Deluxe Theme then save Themeno to I2
+ if (Tekst = 'DELUXE') then
+ I2 := I;
+
+ //Search for Skins for this Theme
+ for Pet := low(Skin.Skin) to high(Skin.Skin) do
+ begin
+ if UpperCase(Skin.Skin[Pet].Theme) = Tekst then
+ begin
+ SetLength(ITheme, Length(ITheme)+1);
+ ITheme[High(ITheme)] := GetFileName(SR.Name);
+ break;
+ end;
+ end;
+
+ Inc(I);
+ Until FindNext(SR) <> 0;
+ FindClose(SR);
+ //Theme List Patch End }
+
+ //No Theme Found
+ if (Length(ITheme)=0) then
+ begin
+ Log.CriticalError('Could not find any valid Themes.');
+ end;
+
+
+ Tekst := IniFile.ReadString('Themes', 'Theme', ITheme[I2]);
+ Ini.Theme := 0;
+ for Pet := 0 to High(ITheme) do
+ if Uppercase(Tekst) = Uppercase(ITheme[Pet]) then Ini.Theme := Pet;
+
+ // Skin
+ Skin.onThemeChange;
+ Ini.SkinNo := 0;
+
+ Tekst := IniFile.ReadString('Themes', 'Skin', ISkin[0]);
+ for Pet := 0 to High(ISkin) do
+ if Tekst = ISkin[Pet] then Ini.SkinNo := Pet;
+
+ // Color
+ Tekst := IniFile.ReadString('Themes', 'Color', IColor[0]);
+ for Pet := 0 to High(IColor) do
+ if Tekst = IColor[Pet] then Ini.Color := Pet;
+
+ // Record - load ini list
+ SetLength(CardList, 0);
+ I := 1;
+ while (IniFile.ValueExists('Record', 'DeviceName' + IntToStr(I)) = true) do begin
+ //Automatically Delete not Existing Sound Cards
+ S := IniFile.ReadString('Record', 'DeviceName' + IntToStr(I), '');
+ //{
+ B := False;
+ //Look for Soundcard
+ for I2 := 0 to High(Recording.SoundCard) do
+ begin
+ if (S = Trim(Recording.SoundCard[I2].Description)) then
+ begin
+ B := True;
+ Break;
+ end;
+ end;
+
+ if B then
+ begin //}
+ I3 := Length(CardList);
+ SetLength(CardList, I3+1);
+ Ini.CardList[I3].Name := S;
+ Ini.CardList[I3].Input := IniFile.ReadInteger('Record', 'Input' + IntToStr(I), 0);
+ Ini.CardList[I3].ChannelL := IniFile.ReadInteger('Record', 'ChannelL' + IntToStr(I), 0);
+ Ini.CardList[I3].ChannelR := IniFile.ReadInteger('Record', 'ChannelR' + IntToStr(I), 0);
+ end;
+ Inc(I);
+ end;
+
+ // Record - append detected soundcards
+ for I := 0 to High(Recording.SoundCard) do
+ begin
+ B := False;
+ For I2 := 0 to High(CardList) do
+ begin //Search for Card in List
+ if (CardList[I2].Name = Trim(Recording.SoundCard[I].Description)) then
+ begin
+ B := True;
+ Break;
+ end;
+ end;
+
+ //If not in List -> Add
+ If not B then
+ begin
+ I3 := Length(CardList);
+ SetLength(CardList, I3+1);
+ CardList[I3].Name := Trim(Recording.SoundCard[I].Description);
+ CardList[I3].Input := 0;
+ CardList[I3].ChannelL := 0;
+ CardList[I3].ChannelR := 0;
+ // default for new users
+ if (Length(CardList) = 1) then
+ CardList[I].ChannelL := 1;
+ end;
+ end;
+
+ //Advanced Settings
+
+ // LoadAnimation
+ Tekst := IniFile.ReadString('Advanced', 'LoadAnimation', 'On');
+ for Pet := 0 to High(ILoadAnimation) do
+ if Tekst = ILoadAnimation[Pet] then Ini.LoadAnimation := Pet;
+
+ // ScreenFade
+ Tekst := IniFile.ReadString('Advanced', 'ScreenFade', 'On');
+ for Pet := 0 to High(IScreenFade) do
+ if Tekst = IScreenFade[Pet] then Ini.ScreenFade := Pet;
+
+ // EffectSing
+ Tekst := IniFile.ReadString('Advanced', 'EffectSing', 'On');
+ for Pet := 0 to High(IEffectSing) do
+ if Tekst = IEffectSing[Pet] then Ini.EffectSing := Pet;
+
+ // AskbeforeDel
+ Tekst := IniFile.ReadString('Advanced', 'AskbeforeDel', 'On');
+ for Pet := 0 to High(IAskbeforeDel) do
+ if Tekst = IAskbeforeDel[Pet] then Ini.AskbeforeDel := Pet;
+
+ // OnSongClick
+ Tekst := IniFile.ReadString('Advanced', 'OnSongClick', 'Sing');
+ for Pet := 0 to High(IOnSongClick) do
+ if Tekst = IOnSongClick[Pet] then Ini.OnSongClick := Pet;
+
+ // Linebonus
+ Tekst := IniFile.ReadString('Advanced', 'LineBonus', 'At Score');
+ for Pet := 0 to High(ILineBonus) do
+ if Tekst = ILineBonus[Pet] then Ini.LineBonus := Pet;
+
+ // PartyPopup
+ Tekst := IniFile.ReadString('Advanced', 'PartyPopup', 'On');
+ for Pet := 0 to High(IPartyPopup) do
+ if Tekst = IPartyPopup[Pet] then Ini.PartyPopup := Pet;
+
+
+ // Joypad
+ Tekst := IniFile.ReadString('Controller', 'Joypad', IJoypad[0]);
+ for Pet := 0 to High(IJoypad) do
+ if Tekst = IJoypad[Pet] then Ini.Joypad := Pet;
+
+ // LCD
+ Tekst := IniFile.ReadString('Devices', 'LPT', ILPT[0]);
+ for Pet := 0 to High(ILPT) do
+ if Tekst = ILPT[Pet] then Ini.LPT := Pet;
+
+
+ // SongPath
+ if (Params.SongPath <> '') then
+ SongPath := IncludeTrailingPathDelimiter(Params.SongPath)
+ else
+ SongPath := IncludeTrailingPathDelimiter(IniFile.ReadString('Path', 'Songs', SongPath));
+
+ Filename := IniFile.FileName;
+ IniFile.Free;
+ if not found then
+ begin
+ Ini.MovieSize := 1;
+ Save;
+ end;
+end;
+
+procedure TIni.Save;
+var
+ IniFile: TIniFile;
+ Tekst: string;
+ I: Integer;
+ S: String;
+begin
+ //if not (FileExists(GamePath + 'config.ini') and FileIsReadOnly(GamePath + 'config.ini')) then begin
+ if not (FileExists(Filename) and FileIsReadOnly(Filename)) then begin
+
+ IniFile := TIniFile.Create(Filename);
+
+ // Players
+ Tekst := IPlayers[Ini.Players];
+ IniFile.WriteString('Game', 'Players', Tekst);
+
+ // Difficulty
+ Tekst := IDifficulty[Ini.Difficulty];
+ IniFile.WriteString('Game', 'Difficulty', Tekst);
+
+ // Language
+ Tekst := ILanguage[Ini.Language];
+ IniFile.WriteString('Game', 'Language', Tekst);
+
+ // Tabs
+ Tekst := ITabs[Ini.Tabs];
+ IniFile.WriteString('Game', 'Tabs', Tekst);
+
+ // Sorting
+ Tekst := ISorting[Ini.Sorting];
+ IniFile.WriteString('Game', 'Sorting', Tekst);
+
+ // Debug
+ Tekst := IDebug[Ini.Debug];
+ IniFile.WriteString('Game', 'Debug', Tekst);
+
+ // Screens
+ Tekst := IScreens[Ini.Screens];
+ IniFile.WriteString('Graphics', 'Screens', Tekst);
+
+ // FullScreen
+ Tekst := IFullScreen[Ini.FullScreen];
+ IniFile.WriteString('Graphics', 'FullScreen', Tekst);
+
+ // Resolution
+ Tekst := IResolution[Ini.Resolution];
+ IniFile.WriteString('Graphics', 'Resolution', Tekst);
+
+ // Depth
+ Tekst := IDepth[Ini.Depth];
+ IniFile.WriteString('Graphics', 'Depth', Tekst);
+
+ // Resolution
+ Tekst := ITextureSize[Ini.TextureSize];
+ IniFile.WriteString('Graphics', 'TextureSize', Tekst);
+
+ // Sing Window
+ Tekst := ISingWindow[Ini.SingWindow];
+ IniFile.WriteString('Graphics', 'SingWindow', Tekst);
+
+ // Oscilloscope
+ Tekst := IOscilloscope[Ini.Oscilloscope];
+ IniFile.WriteString('Graphics', 'Oscilloscope', Tekst);
+
+ // Spectrum
+ Tekst := ISpectrum[Ini.Spectrum];
+ IniFile.WriteString('Graphics', 'Spectrum', Tekst);
+
+ // Spectrograph
+ Tekst := ISpectrograph[Ini.Spectrograph];
+ IniFile.WriteString('Graphics', 'Spectrograph', Tekst);
+
+ // Movie Size
+ Tekst := IMovieSize[Ini.MovieSize];
+ IniFile.WriteString('Graphics', 'MovieSize', Tekst);
+
+ // Movie Size
+ Tekst := IMoviePreview[Ini.MoviePreview];
+ IniFile.WriteString('Graphics', 'MoviePreview', Tekst);
+
+ // AspectCorrect
+ Tekst := IAspectCorrect[Ini.AspectCorrect];
+ IniFile.WriteString('Graphics', 'AspectCorrect', Tekst);
+
+ // MicBoost
+ Tekst := IMicBoost[Ini.MicBoost];
+ IniFile.WriteString('Sound', 'MicBoost', Tekst);
+
+ // ClickAssist
+ Tekst := IClickAssist[Ini.ClickAssist];
+ IniFile.WriteString('Sound', 'ClickAssist', Tekst);
+
+ // BeatClick
+ Tekst := IBeatClick[Ini.BeatClick];
+ IniFile.WriteString('Sound', 'BeatClick', Tekst);
+
+ // Threshold
+ Tekst := IThreshold[Ini.Threshold];
+ IniFile.WriteString('Sound', 'Threshold', Tekst);
+
+ // Song Preview
+ Tekst := IPreviewVolume[Ini.PreviewVolume];
+ IniFile.WriteString('Sound', 'PreviewVolume', Tekst);
+
+ Tekst := IPreviewFading[Ini.PreviewFading];
+ IniFile.WriteString('Sound', 'PreviewFading', Tekst);
+
+ // SavePlayback
+ Tekst := ISavePlayback[Ini.SavePlayback];
+ IniFile.WriteString('Sound', 'SavePlayback', Tekst);
+
+ // Lyrics Font
+ Tekst := ILyricsFont[Ini.LyricsFont];
+ IniFile.WriteString('Lyrics', 'LyricsFont', Tekst);
+
+ // Lyrics Effect
+ Tekst := ILyricsEffect[Ini.LyricsEffect];
+ IniFile.WriteString('Lyrics', 'LyricsEffect', Tekst);
+
+ // Solmization
+ Tekst := ISolmization[Ini.Solmization];
+ IniFile.WriteString('Lyrics', 'Solmization', Tekst);
+
+ // Theme
+ Tekst := ITheme[Ini.Theme];
+ IniFile.WriteString('Themes', 'Theme', Tekst);
+
+ // Skin
+ Tekst := ISkin[Ini.SkinNo];
+ IniFile.WriteString('Themes', 'Skin', Tekst);
+
+ // Color
+ Tekst := IColor[Ini.Color];
+ IniFile.WriteString('Themes', 'Color', Tekst);
+
+ // Record
+ for I := 0 to High(CardList) do begin
+ S := IntToStr(I+1);
+
+ Tekst := CardList[I].Name;
+ IniFile.WriteString('Record', 'DeviceName' + S, Tekst);
+
+ Tekst := IntToStr(CardList[I].Input);
+ IniFile.WriteString('Record', 'Input' + S, Tekst);
+
+ Tekst := IntToStr(CardList[I].ChannelL);
+ IniFile.WriteString('Record', 'ChannelL' + S, Tekst);
+
+ Tekst := IntToStr(CardList[I].ChannelR);
+ IniFile.WriteString('Record', 'ChannelR' + S, Tekst);
+ end;
+
+ //Log.LogError(InttoStr(Length(CardList)) + ' Cards Saved');
+
+ //Advanced Settings
+
+ //LoadAnimation
+ Tekst := ILoadAnimation[Ini.LoadAnimation];
+ IniFile.WriteString('Advanced', 'LoadAnimation', Tekst);
+
+ //EffectSing
+ Tekst := IEffectSing[Ini.EffectSing];
+ IniFile.WriteString('Advanced', 'EffectSing', Tekst);
+
+ //ScreenFade
+ Tekst := IScreenFade[Ini.ScreenFade];
+ IniFile.WriteString('Advanced', 'ScreenFade', Tekst);
+
+ //AskbeforeDel
+ Tekst := IAskbeforeDel[Ini.AskbeforeDel];
+ IniFile.WriteString('Advanced', 'AskbeforeDel', Tekst);
+
+ //OnSongClick
+ Tekst := IOnSongClick[Ini.OnSongClick];
+ IniFile.WriteString('Advanced', 'OnSongClick', Tekst);
+
+ //Line Bonus
+ Tekst := ILineBonus[Ini.LineBonus];
+ IniFile.WriteString('Advanced', 'LineBonus', Tekst);
+
+ //Party Popup
+ Tekst := IPartyPopup[Ini.PartyPopup];
+ IniFile.WriteString('Advanced', 'PartyPopup', Tekst);
+
+ // Joypad
+ Tekst := IJoypad[Ini.Joypad];
+ IniFile.WriteString('Controller', 'Joypad', Tekst);
+
+ IniFile.Free;
+ end;
+end;
+
+procedure TIni.SaveNames;
+var
+ IniFile: TIniFile;
+ I: integer;
+begin
+ //if not FileIsReadOnly(GamePath + 'config.ini') then begin
+ //IniFile := TIniFile.Create(GamePath + 'config.ini');
+ if not FileIsReadOnly(Filename) then begin
+ IniFile := TIniFile.Create(Filename);
+
+ //Name
+ // Templates for Names Mod
+ for I := 1 to 12 do
+ IniFile.WriteString('Name', 'P' + IntToStr(I), Ini.Name[I-1]);
+ for I := 1 to 3 do
+ IniFile.WriteString('NameTeam', 'T' + IntToStr(I), Ini.NameTeam[I-1]);
+ for I := 1 to 12 do
+ IniFile.WriteString('NameTemplate', 'Name' + IntToStr(I), Ini.NameTemplate[I-1]);
+
+ IniFile.Free;
+ end;
+end;
+
+procedure TIni.SaveLevel;
+var
+ IniFile: TIniFile;
+ I: integer;
+begin
+ //if not FileIsReadOnly(GamePath + 'config.ini') then begin
+ //IniFile := TIniFile.Create(GamePath + 'config.ini');
+ if not FileIsReadOnly(Filename) then begin
+ IniFile := TIniFile.Create(Filename);
+
+ // Difficulty
+ IniFile.WriteString('Game', 'Difficulty', IDifficulty[Ini.Difficulty]);
+
+ IniFile.Free;
+ end;
+end;
+
+end.
diff --git a/Game/Code/Classes/UJoystick.pas b/Game/Code/Classes/UJoystick.pas
new file mode 100644
index 00000000..b0c7b8cc
--- /dev/null
+++ b/Game/Code/Classes/UJoystick.pas
@@ -0,0 +1,273 @@
+unit UJoystick;
+
+interface
+
+uses SDL;
+
+type
+ TJoyButton = record
+ State: integer;
+ Enabled: boolean;
+ Type_: byte;
+ Sym: cardinal;
+ end;
+
+ TJoyHatState = record
+ State: Boolean;
+ LastTick: Cardinal;
+ Enabled: boolean;
+ Type_: byte;
+ Sym: cardinal;
+ end;
+
+ TJoyUnit = record
+ Button: array[0..15] of TJoyButton;
+ HatState: Array[0..3] of TJoyHatState;
+ end;
+
+ TJoy = class
+ constructor Create;
+ procedure Update;
+ end;
+
+var
+ Joy: TJoy;
+ JoyUnit: TJoyUnit;
+ SDL_Joy: PSDL_Joystick;
+ JoyEvent: TSDL_Event;
+
+implementation
+
+uses SysUtils, Windows, ULog;
+
+constructor TJoy.Create;
+var
+ B, N: integer;
+begin
+ //Old Corvus5 Method
+ {// joystick support
+ SDL_JoystickEventState(SDL_IGNORE);
+ SDL_InitSubSystem(SDL_INIT_JOYSTICK);
+ if SDL_NumJoysticks <> 1 then beep;
+
+ SDL_Joy := SDL_JoystickOpen(0);
+ if SDL_Joy = nil then beep;
+
+ if SDL_JoystickNumButtons(SDL_Joy) <> 16 then beep;
+
+// SDL_JoystickEventState(SDL_ENABLE);
+ // Events don't work - thay hang the whole application with SDL_JoystickEventState(SDL_ENABLE)
+
+ // clear states
+ for B := 0 to 15 do
+ JoyUnit.Button[B].State := 1;
+
+ // mapping
+ JoyUnit.Button[1].Enabled := true;
+ JoyUnit.Button[1].Type_ := SDL_KEYDOWN;
+ JoyUnit.Button[1].Sym := SDLK_RETURN;
+ JoyUnit.Button[2].Enabled := true;
+ JoyUnit.Button[2].Type_ := SDL_KEYDOWN;
+ JoyUnit.Button[2].Sym := SDLK_ESCAPE;
+
+ JoyUnit.Button[12].Enabled := true;
+ JoyUnit.Button[12].Type_ := SDL_KEYDOWN;
+ JoyUnit.Button[12].Sym := SDLK_LEFT;
+ JoyUnit.Button[13].Enabled := true;
+ JoyUnit.Button[13].Type_ := SDL_KEYDOWN;
+ JoyUnit.Button[13].Sym := SDLK_DOWN;
+ JoyUnit.Button[14].Enabled := true;
+ JoyUnit.Button[14].Type_ := SDL_KEYDOWN;
+ JoyUnit.Button[14].Sym := SDLK_RIGHT;
+ JoyUnit.Button[15].Enabled := true;
+ JoyUnit.Button[15].Type_ := SDL_KEYDOWN;
+ JoyUnit.Button[15].Sym := SDLK_UP;
+ }
+ //New Sarutas method
+ SDL_JoystickEventState(SDL_IGNORE);
+ SDL_InitSubSystem(SDL_INIT_JOYSTICK);
+ if SDL_NumJoysticks < 1 then
+ begin
+ Log.LogError('No Joystick found');
+ exit;
+ end;
+
+
+ SDL_Joy := SDL_JoystickOpen(0);
+ if SDL_Joy = nil then
+ begin
+ Log.LogError('Could not Init Joystick');
+ exit;
+ end;
+ N := SDL_JoystickNumButtons(SDL_Joy);
+ //if N < 6 then beep;
+
+ for B := 0 to 5 do begin
+ JoyUnit.Button[B].Enabled := true;
+ JoyUnit.Button[B].State := 1;
+ JoyUnit.Button[B].Type_ := SDL_KEYDOWN;
+ end;
+
+ JoyUnit.Button[0].Sym := SDLK_Return;
+ JoyUnit.Button[1].Sym := SDLK_Escape;
+ JoyUnit.Button[2].Sym := SDLK_M;
+ JoyUnit.Button[3].Sym := SDLK_R;
+
+ JoyUnit.Button[4].Sym := SDLK_RETURN;
+ JoyUnit.Button[5].Sym := SDLK_ESCAPE;
+
+ //Set HatState
+ for B := 0 to 3 do begin
+ JoyUnit.HatState[B].Enabled := true;
+ JoyUnit.HatState[B].State := False;
+ JoyUnit.HatState[B].Type_ := SDL_KEYDOWN;
+ end;
+
+ JoyUnit.HatState[0].Sym := SDLK_UP;
+ JoyUnit.HatState[1].Sym := SDLK_RIGHT;
+ JoyUnit.HatState[2].Sym := SDLK_DOWN;
+ JoyUnit.HatState[3].Sym := SDLK_LEFT;
+end;
+
+procedure TJoy.Update;
+var
+ B: integer;
+ State: UInt8;
+ Tick: Cardinal;
+ Axes: Smallint;
+begin
+ SDL_JoystickUpdate;
+
+ //Manage Buttons
+ for B := 0 to 15 do begin
+ if (JoyUnit.Button[B].Enabled) and (JoyUnit.Button[B].State <> SDL_JoystickGetButton(SDL_Joy, B)) and (JoyUnit.Button[B].State = 0) then begin
+ JoyEvent.type_ := JoyUnit.Button[B].Type_;
+ JoyEvent.key.keysym.sym := JoyUnit.Button[B].Sym;
+ SDL_PushEvent(@JoyEvent);
+ end;
+ end;
+
+
+ for B := 0 to 15 do begin
+ JoyUnit.Button[B].State := SDL_JoystickGetButton(SDL_Joy, B);
+ end;
+
+ //Get Tick
+ Tick := Gettickcount;
+
+ //Get CoolieHat
+ if (SDL_JoystickNumHats(SDL_Joy)>=1) then
+ State := SDL_JoystickGetHat(SDL_Joy, 0)
+ else
+ State := 0;
+
+ //Get Axis
+ if (SDL_JoystickNumAxes(SDL_Joy)>=2) then
+ begin
+ //Down - Up (X- Axis)
+ Axes := SDL_JoystickGetAxis(SDL_Joy, 1);
+ If Axes >= 15000 then
+ State := State or SDL_HAT_Down
+ Else If Axes <= -15000 then
+ State := State or SDL_HAT_UP;
+
+ //Left - Right (Y- Axis)
+ Axes := SDL_JoystickGetAxis(SDL_Joy, 0);
+ If Axes >= 15000 then
+ State := State or SDL_HAT_Right
+ Else If Axes <= -15000 then
+ State := State or SDL_HAT_Left;
+ end;
+
+ //Manage Hat and joystick Events
+ if (SDL_JoystickNumHats(SDL_Joy)>=1) OR (SDL_JoystickNumAxes(SDL_Joy)>=2) then
+ begin
+
+ //Up Button
+ If (JoyUnit.HatState[0].Enabled) and ((SDL_HAT_UP AND State) = SDL_HAT_UP) then
+ begin //IF Button is newly Pressed or if he is Pressed longer than 500 msecs
+ if (JoyUnit.HatState[0].State = False) OR (JoyUnit.HatState[0].Lasttick < Tick) then
+ begin
+ //Set Tick and State
+ if JoyUnit.HatState[0].State then
+ JoyUnit.HatState[0].Lasttick := Tick + 200
+ else
+ JoyUnit.HatState[0].Lasttick := Tick + 500;
+
+ JoyUnit.HatState[0].State := True;
+
+ JoyEvent.type_ := JoyUnit.HatState[0].Type_;
+ JoyEvent.key.keysym.sym := JoyUnit.HatState[0].Sym;
+ SDL_PushEvent(@JoyEvent);
+ end;
+ end
+ else
+ JoyUnit.HatState[0].State := False;
+
+ //Right Button
+ If (JoyUnit.HatState[1].Enabled) and ((SDL_HAT_RIGHT AND State) = SDL_HAT_RIGHT) then
+ begin //IF Button is newly Pressed or if he is Pressed longer than 500 msecs
+ if (JoyUnit.HatState[1].State = False) OR (JoyUnit.HatState[1].Lasttick < Tick) then
+ begin
+ //Set Tick and State
+ if JoyUnit.HatState[1].State then
+ JoyUnit.HatState[1].Lasttick := Tick + 200
+ else
+ JoyUnit.HatState[1].Lasttick := Tick + 500;
+
+ JoyUnit.HatState[1].State := True;
+
+ JoyEvent.type_ := JoyUnit.HatState[1].Type_;
+ JoyEvent.key.keysym.sym := JoyUnit.HatState[1].Sym;
+ SDL_PushEvent(@JoyEvent);
+ end;
+ end
+ else
+ JoyUnit.HatState[1].State := False;
+
+ //Down button
+ If (JoyUnit.HatState[2].Enabled) and ((SDL_HAT_DOWN AND State) = SDL_HAT_DOWN) then
+ begin //IF Button is newly Pressed or if he is Pressed longer than 230 msecs
+ if (JoyUnit.HatState[2].State = False) OR (JoyUnit.HatState[2].Lasttick < Tick) then
+ begin
+ //Set Tick and State
+ if JoyUnit.HatState[2].State then
+ JoyUnit.HatState[2].Lasttick := Tick + 200
+ else
+ JoyUnit.HatState[2].Lasttick := Tick + 500;
+
+ JoyUnit.HatState[2].State := True;
+
+ JoyEvent.type_ := JoyUnit.HatState[2].Type_;
+ JoyEvent.key.keysym.sym := JoyUnit.HatState[2].Sym;
+ SDL_PushEvent(@JoyEvent);
+ end;
+ end
+ else
+ JoyUnit.HatState[2].State := False;
+
+ //Left Button
+ If (JoyUnit.HatState[3].Enabled) and ((SDL_HAT_LEFT AND State) = SDL_HAT_LEFT) then
+ begin //IF Button is newly Pressed or if he is Pressed longer than 230 msecs
+ if (JoyUnit.HatState[3].State = False) OR (JoyUnit.HatState[3].Lasttick < Tick) then
+ begin
+ //Set Tick and State
+ if JoyUnit.HatState[3].State then
+ JoyUnit.HatState[3].Lasttick := Tick + 200
+ else
+ JoyUnit.HatState[3].Lasttick := Tick + 500;
+
+ JoyUnit.HatState[3].State := True;
+
+ JoyEvent.type_ := JoyUnit.HatState[3].Type_;
+ JoyEvent.key.keysym.sym := JoyUnit.HatState[3].Sym;
+ SDL_PushEvent(@JoyEvent);
+ end;
+ end
+ else
+ JoyUnit.HatState[3].State := False;
+ end;
+
+end;
+
+end.
diff --git a/Game/Code/Classes/ULCD.pas b/Game/Code/Classes/ULCD.pas
new file mode 100644
index 00000000..abdf3584
--- /dev/null
+++ b/Game/Code/Classes/ULCD.pas
@@ -0,0 +1,289 @@
+unit ULCD;
+
+interface
+
+type
+ TLCD = class
+ private
+ Enabled: boolean;
+ Text: array[1..6] of string;
+ StartPos: integer;
+ LineBR: integer;
+ Position: integer;
+ procedure WriteCommand(B: byte);
+ procedure WriteData(B: byte);
+ procedure WriteString(S: string);
+ public
+ HalfInterface: boolean;
+ constructor Create;
+ procedure Enable;
+ procedure Clear;
+ procedure WriteText(Line: integer; S: string);
+ procedure MoveCursor(Line, Pos: integer);
+ procedure ShowCursor;
+ procedure HideCursor;
+
+ // for 2x16
+ procedure AddTextBR(S: string);
+ procedure MoveCursorBR(Pos: integer);
+ procedure ScrollUpBR;
+ procedure AddTextArray(Line:integer; S: string);
+ end;
+
+var
+ LCD: TLCD;
+
+const
+ Data = $378; // domyœlny adres portu
+ Status = Data + 1;
+ Control = Data + 2;
+
+implementation
+
+uses
+ SysUtils,
+ zlportio,
+ UTime;
+
+procedure TLCD.WriteCommand(B: Byte);
+// Wysylanie komend sterujacych
+begin
+ if not HalfInterface then begin
+ zlioportwrite(Control, 0, $02);
+ zlioportwrite(Data, 0, B);
+ zlioportwrite(Control, 0, $03);
+ end else begin
+ zlioportwrite(Control, 0, $02);
+ zlioportwrite(Data, 0, B and $F0);
+ zlioportwrite(Control, 0, $03);
+
+ TimeSleep(0.1);
+
+ zlioportwrite(Control, 0, $02);
+ zlioportwrite(Data, 0, (B * 16) and $F0);
+ zlioportwrite(Control, 0, $03);
+ end;
+
+ if (B=1) or (B=2) then
+ Sleep(2)
+ else
+ TimeSleep(0.1);
+end;
+
+procedure TLCD.WriteData(B: Byte);
+// Wysylanie danych
+begin
+ if not HalfInterface then begin
+ zlioportwrite(Control, 0, $06);
+ zlioportwrite(Data, 0, B);
+ zlioportwrite(Control, 0, $07);
+ end else begin
+ zlioportwrite(Control, 0, $06);
+ zlioportwrite(Data, 0, B and $F0);
+ zlioportwrite(Control, 0, $07);
+
+ TimeSleep(0.1);
+
+ zlioportwrite(Control, 0, $06);
+ zlioportwrite(Data, 0, (B * 16) and $F0);
+ zlioportwrite(Control, 0, $07);
+ end;
+
+ TimeSleep(0.1);
+ Inc(Position);
+end;
+
+procedure TLCD.WriteString(S: string);
+// Wysylanie slow
+var
+ I: integer;
+begin
+ for I := 1 to Length(S) do
+ WriteData(Ord(S[I]));
+end;
+
+constructor TLCD.Create;
+begin
+//
+end;
+
+procedure TLCD.Enable;
+var
+ A: byte;
+ B: byte;
+begin
+ Enabled := true;
+ if not HalfInterface then
+ WriteCommand($38)
+ else begin
+ WriteCommand($33);
+ WriteCommand($32);
+ WriteCommand($28);
+ end;
+
+// WriteCommand($06);
+// WriteCommand($0C);
+// sleep(10);
+end;
+
+procedure TLCD.Clear;
+begin
+ if Enabled then begin
+ WriteCommand(1);
+ WriteCommand(2);
+ Text[1] := '';
+ Text[2] := '';
+ Text[3] := '';
+ Text[4] := '';
+ Text[5] := '';
+ Text[6] := '';
+ StartPos := 1;
+ LineBR := 1;
+ end;
+end;
+
+procedure TLCD.WriteText(Line: integer; S: string);
+begin
+ if Enabled then begin
+ if Line <= 2 then begin
+ MoveCursor(Line, 1);
+ WriteString(S);
+ end;
+
+ Text[Line] := '';
+ AddTextArray(Line, S);
+ end;
+end;
+
+procedure TLCD.MoveCursor(Line, Pos: integer);
+var
+ I: integer;
+begin
+ if Enabled then begin
+ Pos := Pos + (Line-1) * 40;
+
+ if Position > Pos then begin
+ WriteCommand(2);
+ for I := 1 to Pos-1 do
+ WriteCommand(20);
+ end;
+
+ if Position < Pos then
+ for I := 1 to Pos - Position do
+ WriteCommand(20);
+
+ Position := Pos;
+ end;
+end;
+
+procedure TLCD.ShowCursor;
+begin
+ if Enabled then begin
+ WriteCommand(14);
+ end;
+end;
+
+procedure TLCD.HideCursor;
+begin
+ if Enabled then begin
+ WriteCommand(12);
+ end;
+end;
+
+procedure TLCD.AddTextBR(S: string);
+var
+ Word: string;
+ W: integer;
+ P: integer;
+ L: integer;
+begin
+ if Enabled then begin
+ if LineBR <= 6 then begin
+ L := LineBR;
+ P := Pos(' ', S);
+
+ if L <= 2 then
+ MoveCursor(L, 1);
+
+ while (L <= 6) and (P > 0) do begin
+ Word := Copy(S, 1, P);
+ if (Length(Text[L]) + Length(Word)-1) > 16 then begin
+ L := L + 1;
+ if L <= 2 then
+ MoveCursor(L, 1);
+ end;
+
+ if L <= 6 then begin
+ if L <= 2 then
+ WriteString(Word);
+ AddTextArray(L, Word);
+ end;
+
+ Delete(S, 1, P);
+ P := Pos(' ', S)
+ end;
+
+ LineBR := L + 1;
+ end;
+ end;
+end;
+
+procedure TLCD.MoveCursorBR(Pos: integer);
+var
+ I: integer;
+ L: integer;
+begin
+ if Enabled then begin
+ Pos := Pos - (StartPos-1);
+ if Pos <= Length(Text[1]) then
+ MoveCursor(1, Pos);
+
+ if Pos > Length(Text[1]) then begin
+ // bez zawijania
+// Pos := Pos - Length(Text[1]);
+// MoveCursor(2, Pos);
+
+ // z zawijaniem
+ Pos := Pos - Length(Text[1]);
+ ScrollUpBR;
+ MoveCursor(1, Pos);
+ end;
+ end;
+end;
+
+procedure TLCD.ScrollUpBR;
+var
+ T: array[1..5] of string;
+ SP: integer;
+ LBR: integer;
+begin
+ if Enabled then begin
+ T[1] := Text[2];
+ T[2] := Text[3];
+ T[3] := Text[4];
+ T[4] := Text[5];
+ T[5] := Text[6];
+ SP := StartPos + Length(Text[1]);
+ LBR := LineBR;
+
+ Clear;
+
+ StartPos := SP;
+ WriteText(1, T[1]);
+ WriteText(2, T[2]);
+ WriteText(3, T[3]);
+ WriteText(4, T[4]);
+ WriteText(5, T[5]);
+ LineBR := LBR-1;
+ end;
+end;
+
+procedure TLCD.AddTextArray(Line: integer; S: string);
+begin
+ if Enabled then begin
+ Text[Line] := Text[Line] + S;
+ end;
+end;
+
+end.
+
diff --git a/Game/Code/Classes/ULanguage.pas b/Game/Code/Classes/ULanguage.pas
new file mode 100644
index 00000000..10fa1387
--- /dev/null
+++ b/Game/Code/Classes/ULanguage.pas
@@ -0,0 +1,222 @@
+unit ULanguage;
+
+interface
+
+type
+ TLanguageEntry = record
+ ID: string;
+ Text: string;
+ end;
+
+ TLanguageList = record
+ Name: string;
+ {FileName: string; }
+ end;
+
+ TLanguage = class
+ public
+ Entry: array of TLanguageEntry; //Entrys of Chosen Language
+ SEntry: array of TLanguageEntry; //Entrys of Standard Language
+ CEntry: array of TLanguageEntry; //Constant Entrys e.g. Version
+ Implode_Glue1, Implode_Glue2: String;
+ //public
+ List: array of TLanguageList;
+
+ constructor Create;
+ procedure LoadList;
+ function Translate(Text: String): String;
+ procedure ChangeLanguage(Language: String);
+ procedure AddConst(ID, Text: String);
+ procedure ChangeConst(ID, Text: String);
+ function Implode(Pieces: Array of String): String;
+ end;
+
+var
+ Language: TLanguage;
+
+implementation
+
+uses UFiles, UIni, IniFiles, Classes, SysUtils, Windows, ULog;
+
+//----------
+//Create - Construct Class then LoadList + Standard Language + Set Standard Implode Glues
+//----------
+constructor TLanguage.Create;
+var
+ I, J: Integer;
+begin
+ LoadList;
+
+ //Set Implode Glues for Backward Compatibility
+ Implode_Glue1 := ', ';
+ Implode_Glue2 := ' and ';
+
+ if (Length(List) = 0) then //No Language Files Loaded -> Abort Loading
+ Log.CriticalError('Could not load any Language File');
+
+ //Standard Language (If a Language File is Incomplete)
+ //Then use English Language
+ for I := 0 to high(List) do //Search for English Language
+ begin
+ //English Language Found -> Load
+ if Uppercase(List[I].Name) = 'ENGLISH' then
+ begin
+ ChangeLanguage('English');
+
+ SetLength(SEntry, Length(Entry));
+ for J := low(Entry) to high(Entry) do
+ SEntry[J] := Entry[J];
+
+ SetLength(Entry, 0);
+
+ Break;
+ end;
+
+ if (I = high(List)) then
+ Log.LogError('English Languagefile missing! No standard Translation loaded');
+ end;
+ //Standard Language END
+
+end;
+
+//----------
+//LoadList - Parse the Language Dir searching Translations
+//----------
+procedure TLanguage.LoadList;
+var
+ SR: TSearchRec; // for parsing directory
+begin
+ SetLength(List, 0);
+ SetLength(ILanguage, 0);
+
+ if FindFirst(LanguagesPath + '*.ini', 0, SR) = 0 then begin
+ repeat
+ SetLength(List, Length(List)+1);
+ SetLength(ILanguage, Length(ILanguage)+1);
+ SR.Name := ChangeFileExt(SR.Name, '');
+
+ List[High(List)].Name := SR.Name;
+ ILanguage[High(ILanguage)] := SR.Name;
+
+ until FindNext(SR) <> 0;
+ SysUtils.FindClose(SR);
+ end; // if FindFirst
+end;
+
+//----------
+//ChangeLanguage - Load the specified LanguageFile
+//----------
+procedure TLanguage.ChangeLanguage(Language: String);
+var
+ IniFile: TIniFile;
+ E: integer; // entry
+ S: TStringList;
+begin
+ SetLength(Entry, 0);
+ IniFile := TIniFile.Create(LanguagesPath + Language + '.ini');
+ S := TStringList.Create;
+
+ IniFile.ReadSectionValues('Text', S);
+ SetLength(Entry, S.Count);
+ for E := 0 to high(Entry) do
+ begin
+ if S.Names[E] = 'IMPLODE_GLUE1' then
+ Implode_Glue1 := S.ValueFromIndex[E]+ ' '
+ else if S.Names[E] = 'IMPLODE_GLUE2' then
+ Implode_Glue2 := ' ' + S.ValueFromIndex[E] + ' ';
+
+ Entry[E].ID := S.Names[E];
+ Entry[E].Text := S.ValueFromIndex[E];
+ end;
+
+ S.Free;
+ IniFile.Free;
+end;
+
+//----------
+//Translate - Translate the Text
+//----------
+Function TLanguage.Translate(Text: String): String;
+var
+ E: integer; // entry
+begin
+ Result := Text;
+ Text := Uppercase(Result);
+
+ //Const Mod
+ for E := 0 to high(CEntry) do
+ if Text = CEntry[E].ID then
+ begin
+ Result := CEntry[E].Text;
+ exit;
+ end;
+ //Const Mod End
+
+ for E := 0 to high(Entry) do
+ if Text = Entry[E].ID then
+ begin
+ Result := Entry[E].Text;
+ exit;
+ end;
+
+ //Standard Language (If a Language File is Incomplete)
+ //Then use Standard Language
+ for E := low(SEntry) to high(SEntry) do
+ if Text = SEntry[E].ID then
+ begin
+ Result := SEntry[E].Text;
+ Break;
+ end;
+ //Standard Language END
+end;
+
+//----------
+//AddConst - Add a Constant ID that will be Translated but not Loaded from the LanguageFile
+//----------
+procedure TLanguage.AddConst (ID, Text: String);
+begin
+ SetLength (CEntry, Length(CEntry) + 1);
+ CEntry[high(CEntry)].ID := ID;
+ CEntry[high(CEntry)].Text := Text;
+end;
+
+//----------
+//ChangeConst - Change a Constant Value by ID
+//----------
+procedure TLanguage.ChangeConst(ID, Text: String);
+var
+ I: Integer;
+begin
+ for I := 0 to high(CEntry) do
+ begin
+ if CEntry[I].ID = ID then
+ begin
+ CEntry[I].Text := Text;
+ Break;
+ end;
+ end;
+end;
+
+//----------
+//Implode - Connect an Array of Strings with ' and ' or ', ' to one String
+//----------
+function TLanguage.Implode(Pieces: Array of String): String;
+var
+ I: Integer;
+begin
+ Result := '';
+ //Go through Pieces
+ for I := low(Pieces) to high(Pieces) do
+ begin
+ //Add Value
+ Result := Result + Pieces[I];
+
+ //Add Glue
+ if (I < high(Pieces) - 1) then
+ Result := Result + Implode_Glue1
+ else if (I < high(Pieces)) then
+ Result := Result + Implode_Glue2;
+ end;
+end;
+
+end.
diff --git a/Game/Code/Classes/ULight.pas b/Game/Code/Classes/ULight.pas
new file mode 100644
index 00000000..967d2ea1
--- /dev/null
+++ b/Game/Code/Classes/ULight.pas
@@ -0,0 +1,116 @@
+unit ULight;
+interface
+
+type
+ TLight = class
+ private
+ Enabled: boolean;
+ Light: array[0..7] of boolean;
+ LightTime: array[0..7] of real; // time to stop, need to call update to change state
+ LastTime: real;
+ public
+ constructor Create;
+ procedure Enable;
+ procedure SetState(State: integer);
+ procedure AutoSetState;
+ procedure TurnOn;
+ procedure TurnOff;
+ procedure LightOne(Number: integer; Time: real);
+ procedure Refresh;
+ end;
+
+var
+ Light: TLight;
+
+const
+ Data = $378; // default port address
+ Status = Data + 1;
+ Control = Data + 2;
+
+implementation
+
+uses
+ SysUtils, zlportio, UTime;
+
+constructor TLight.Create;
+begin
+ Enabled := false;
+end;
+
+procedure TLight.Enable;
+begin
+ Enabled := true;
+ LastTime := GetTime;
+end;
+
+procedure TLight.SetState(State: integer);
+begin
+ if Enabled then
+ PortWriteB($378, State);
+end;
+
+procedure TLight.AutoSetState;
+var
+ State: integer;
+begin
+ if Enabled then begin
+ State := 0;
+ if Light[0] then State := State + 2;
+ if Light[1] then State := State + 1;
+ // etc
+ SetState(State);
+ end;
+end;
+
+procedure TLight.TurnOn;
+begin
+ if Enabled then
+ SetState(3);
+end;
+
+procedure TLight.TurnOff;
+begin
+ if Enabled then
+ SetState(0);
+end;
+
+procedure TLight.LightOne(Number: integer; Time: real);
+begin
+ if Enabled then begin
+ if Light[Number] = false then begin
+ Light[Number] := true;
+ AutoSetState;
+ end;
+
+ LightTime[Number] := GetTime + Time/1000; // [s]
+ end;
+end;
+
+procedure TLight.Refresh;
+var
+ Time: real;
+ TimeSkip: real;
+ L: integer;
+begin
+ if Enabled then begin
+ Time := GetTime;
+ TimeSkip := Time - LastTime;
+ for L := 0 to 7 do begin
+ if Light[L] = true then begin
+ if LightTime[L] > Time then begin
+ // jest jeszcze zapas - bez zmian
+ //LightTime[L] := LightTime[L] - TimeSkip;
+ end else begin
+ // czas minal
+ Light[L] := false;
+ end;
+ end;
+ end;
+ LastTime := Time;
+ AutoSetState;
+ end;
+end;
+
+end.
+
+
diff --git a/Game/Code/Classes/ULog.pas b/Game/Code/Classes/ULog.pas
new file mode 100644
index 00000000..9d20d2f1
--- /dev/null
+++ b/Game/Code/Classes/ULog.pas
@@ -0,0 +1,227 @@
+unit ULog;
+
+interface
+
+uses Classes;
+
+type
+ TLog = class
+ BenchmarkTimeStart: array[0..7] of real;
+ BenchmarkTimeLength: array[0..7] of real;//TDateTime;
+
+ FileBenchmark: TextFile;
+ FileBenchmarkO: boolean; // opened
+ FileError: TextFile;
+ FileErrorO: boolean; // opened
+
+ Title: String; //Application Title
+
+ //Should Log Files be written
+ Enabled: Boolean;
+
+ // destuctor
+ destructor Free;
+
+ // benchmark
+ procedure BenchmarkStart(Number: integer);
+ procedure BenchmarkEnd(Number: integer);
+ procedure LogBenchmark(Text: string; Number: integer);
+
+ // error
+ procedure LogError(Text: string); overload;
+
+ //Critical Error (Halt + MessageBox)
+ procedure CriticalError(Text: string);
+
+ // voice
+ procedure LogVoice(SoundNr: integer);
+
+ // compability
+ procedure LogStatus(Log1, Log2: string);
+ procedure LogError(Log1, Log2: string); overload;
+ end;
+
+var
+ Log: TLog;
+
+implementation
+uses UFiles, SysUtils, DateUtils, URecord, UTime, UIni, Windows, UCommandLine;
+
+destructor TLog.Free;
+begin
+ if FileBenchmarkO then CloseFile(FileBenchmark);
+// if FileAnalyzeO then CloseFile(FileAnalyze);
+ if FileErrorO then CloseFile(FileError);
+end;
+
+procedure TLog.BenchmarkStart(Number: integer);
+begin
+ BenchmarkTimeStart[Number] := USTime.GetTime; //Time;
+end;
+
+procedure TLog.BenchmarkEnd(Number: integer);
+begin
+ BenchmarkTimeLength[Number] := USTime.GetTime {Time} - BenchmarkTimeStart[Number];
+end;
+
+procedure TLog.LogBenchmark(Text: string; Number: integer);
+var
+ Minutes: integer;
+ Seconds: integer;
+ Miliseconds: integer;
+
+ MinutesS: string;
+ SecondsS: string;
+ MilisecondsS: string;
+
+ ValueText: string;
+begin
+ if Enabled AND (Params.Benchmark) then begin
+ if not FileBenchmarkO then begin
+ FileBenchmarkO := true;
+ AssignFile(FileBenchmark, LogPath + 'Benchmark.log');
+ {$I-}
+ Rewrite(FileBenchmark);
+ if IOResult = 0 then FileBenchmarkO := true;
+ {$I+}
+
+ //If File is opened write Date to Benchmark File
+ If (FileBenchmarkO) then
+ begin
+ WriteLn(FileBenchmark, Title + ' Benchmark File');
+ WriteLn(FileBenchmark, 'Date: ' + DatetoStr(Now) + ' Time: ' + TimetoStr(Now));
+ WriteLn(FileBenchmark, '-------------------');
+
+ Flush(FileBenchmark);
+ end;
+ end;
+
+ if FileBenchmarkO then begin
+ Miliseconds := Trunc(Frac(BenchmarkTimeLength[Number]) * 1000);
+ Seconds := Trunc(BenchmarkTimeLength[Number]) mod 60;
+ Minutes := Trunc((BenchmarkTimeLength[Number] - Seconds) / 60);
+// ValueText := FloatToStr(BenchmarkTimeLength[Number]);
+
+{ ValueText := FloatToStr(
+ SecondOf(BenchmarkTimeLength[Number]) + MilliSecondOf(BenchmarkTimeLength[Number])/1000
+ );
+ if MinuteOf(BenchmarkTimeLength[Number]) >= 1 then
+ ValueText := IntToStr(MinuteOf(BenchmarkTimeLength[Number])) + ':' + ValueText;
+ WriteLn(FileBenchmark, Text + ': ' + ValueText + ' seconds');}
+
+ if (Minutes = 0) and (Seconds = 0) then begin
+ MilisecondsS := IntToStr(Miliseconds);
+ ValueText := MilisecondsS + ' miliseconds';
+ end;
+
+ if (Minutes = 0) and (Seconds >= 1) then begin
+ MilisecondsS := IntToStr(Miliseconds);
+ while Length(MilisecondsS) < 3 do MilisecondsS := '0' + MilisecondsS;
+
+ SecondsS := IntToStr(Seconds);
+
+ ValueText := SecondsS + ',' + MilisecondsS + ' seconds';
+ end;
+
+ if Minutes >= 1 then begin
+ MilisecondsS := IntToStr(Miliseconds);
+ while Length(MilisecondsS) < 3 do MilisecondsS := '0' + MilisecondsS;
+
+ SecondsS := IntToStr(Seconds);
+ while Length(SecondsS) < 2 do SecondsS := '0' + SecondsS;
+
+ MinutesS := IntToStr(Minutes);
+
+ ValueText := MinutesS + ':' + SecondsS + ',' + MilisecondsS + ' minutes';
+ end;
+
+ WriteLn(FileBenchmark, Text + ': ' + ValueText);
+ Flush(FileBenchmark);
+ end;
+ end;
+end;
+
+procedure TLog.LogError(Text: string);
+begin
+ if Enabled AND (not FileErrorO) then begin
+ FileErrorO := true;
+ AssignFile(FileError, LogPath + 'Error.log');
+ {$I-}
+ Rewrite(FileError);
+ if IOResult = 0 then FileErrorO := true;
+ {$I+}
+
+ //If File is opened write Date to Error File
+ If (FileErrorO) then
+ begin
+ WriteLn(FileError, Title + ' Error Log');
+ WriteLn(FileError, 'Date: ' + DatetoStr(Now) + ' Time: ' + TimetoStr(Now));
+ WriteLn(FileError, '-------------------');
+
+ Flush(FileError);
+ end;
+ end;
+
+ if FileErrorO then begin
+ try
+ WriteLn(FileError, Text);
+ Flush(FileError);
+ except
+ FileErrorO := false;
+ end;
+ end;
+end;
+
+procedure TLog.LogVoice(SoundNr: integer);
+var
+ FileVoice: File;
+ FS: TFileStream;
+ FileName: string;
+ Num: integer;
+ BL: integer;
+begin
+ for Num := 1 to 9999 do begin
+ FileName := IntToStr(Num);
+ while Length(FileName) < 4 do FileName := '0' + FileName;
+ FileName := LogPath + 'Voice' + FileName + '.raw';
+ if not FileExists(FileName) then break
+ end;
+
+
+ FS := TFileStream.Create(FileName, fmCreate);
+
+ for BL := 0 to High(Sound[SoundNr].BufferLong) do begin
+ Sound[SoundNr].BufferLong[BL].Seek(0, soBeginning);
+ FS.CopyFrom(Sound[SoundNr].BufferLong[BL], Sound[SoundNr].BufferLong[BL].Size);
+ end;
+
+ FS.Free;
+end;
+
+procedure TLog.LogStatus(Log1, Log2: string);
+begin
+ //Just for Debugging
+ //Comment for Release
+ //LogAnalyze (Log2 + ': ' + Log1);
+end;
+
+procedure TLog.LogError(Log1, Log2: string);
+begin
+//asd
+end;
+
+procedure TLog.CriticalError(Text: string);
+begin
+ //Write Error to Logfile:
+ LogError (Text);
+
+ //Show Errormessage
+ Messagebox(0, PChar(Text), PChar(Title), MB_ICONERROR or MB_OK);
+
+ //Exit Application
+ Halt;
+end;
+
+end.
+
+
diff --git a/Game/Code/Classes/ULyrics.pas b/Game/Code/Classes/ULyrics.pas
new file mode 100644
index 00000000..07ecccac
--- /dev/null
+++ b/Game/Code/Classes/ULyrics.pas
@@ -0,0 +1,389 @@
+unit ULyrics;
+
+interface
+uses SysUtils, gl, glext, UMusic;
+
+type
+ TWord = record
+ X: real;
+ Y: real;
+ Size: real;
+ Width: real;
+ Text: string;
+ ColR: real;
+ ColG: real;
+ ColB: real;
+ Scale: real;
+ Done: real;
+ FontStyle: integer;
+ Italic: boolean;
+ Selected: boolean;
+ end;
+
+ TLyric = class
+ private
+ AlignI: integer;
+ XR: real;
+ YR: real;
+ SizeR: real;
+ SelectedI: integer;
+ ScaleR: real;
+ StyleI: integer; // 0 - one selection, 1 - long selection, 2 - one selection with fade to normal text, 3 - long selection with fade with color from left
+ FontStyleI: integer; // font number
+ Word: array of TWord;
+ procedure SetX(Value: real);
+ procedure SetY(Value: real);
+ function GetClientX: real;
+ procedure SetAlign(Value: integer);
+ function GetSize: real;
+ procedure SetSize(Value: real);
+ procedure SetSelected(Value: integer);
+ procedure SetDone(Value: real);
+ procedure SetScale(Value: real);
+ procedure SetStyle(Value: integer);
+ procedure SetFStyle(Value: integer);
+ procedure Refresh;
+ procedure DrawNormal(W: integer);
+ procedure DrawPlain(W: integer);
+ procedure DrawScaled(W: integer);
+ procedure DrawSlide(W: integer);
+ public
+ ColR: real;
+ ColG: real;
+ ColB: real;
+ ColSR: real;
+ ColSG: real;
+ ColSB: real;
+ Italic: boolean;
+ Text: string; // LCD
+
+ published
+ property X: real write SetX;
+ property Y: real write SetY;
+ property ClientX: real read GetClientX;
+ property Align: integer write SetAlign;
+ property Size: real read GetSize write SetSize;
+ property Selected: integer read SelectedI write SetSelected;
+ property Done: real write SetDone;
+ property Scale: real write SetScale;
+ property Style: integer write SetStyle;
+ property FontStyle: integer write SetFStyle;
+ procedure AddWord(Text: string);
+ procedure AddCzesc(NrCzesci: integer); //AddLine?
+ procedure ChangeCurText(Text: String);
+
+ function SelectedLetter: integer; // LCD
+ function SelectedLength: integer; // LCD
+
+ procedure Clear;
+ procedure Draw;
+
+ end;
+
+var
+ Lyric: TLyric;
+
+implementation
+uses TextGL, UGraphic, UDrawTexture;
+
+procedure TLyric.SetX(Value: real);
+begin
+ XR := Value;
+end;
+
+procedure TLyric.SetY(Value: real);
+begin
+ YR := Value;
+end;
+
+function TLyric.GetClientX: real;
+begin
+ Result := Word[0].X;
+end;
+
+procedure TLyric.SetAlign(Value: integer);
+begin
+ AlignI := Value;
+// if AlignInt = 0 then beep;
+end;
+
+function TLyric.GetSize: real;
+begin
+ Result := SizeR;
+end;
+
+procedure TLyric.SetSize(Value: real);
+begin
+ SizeR := Value;
+end;
+
+procedure TLyric.SetSelected(Value: integer);
+var
+ W: integer;
+begin
+ if (StyleI = 0) or (StyleI = 2) or (StyleI = 4) then begin
+ if (SelectedI > -1) and (SelectedI <= High(Word)) then begin
+ Word[SelectedI].Selected := false;
+ Word[SelectedI].ColR := ColR;
+ Word[SelectedI].ColG := ColG;
+ Word[SelectedI].ColB := ColB;
+ Word[SelectedI].Done := 0;
+ end;
+
+ SelectedI := Value;
+ if (Value > -1) and (Value <= High(Word)) then begin
+ Word[Value].Selected := true;
+ Word[Value].ColR := ColSR;
+ Word[Value].ColG := ColSG;
+ Word[Value].ColB := ColSB;
+ Word[Value].Scale := ScaleR;
+ end;
+ end;
+
+ if (StyleI = 1) or (StyleI = 3) then begin
+ if (SelectedI > -1) and (SelectedI <= High(Word)) then begin
+ for W := SelectedI to High(Word) do begin
+ Word[W].Selected := false;
+ Word[W].ColR := ColR;
+ Word[W].ColG := ColG;
+ Word[W].ColB := ColB;
+ Word[W].Done := 0;
+ end;
+ end;
+
+ SelectedI := Value;
+ if (Value > -1) and (Value <= High(Word)) then begin
+ for W := 0 to Value do begin
+ Word[W].Selected := true;
+ Word[W].ColR := ColSR;
+ Word[W].ColG := ColSG;
+ Word[W].ColB := ColSB;
+ Word[W].Scale := ScaleR;
+ Word[W].Done := 1;
+ end;
+ end;
+ end;
+
+ Refresh;
+end;
+
+procedure TLyric.SetDone(Value: real);
+var
+ W: integer;
+begin
+ W := SelectedI;
+ if W > -1 then
+ Word[W].Done := Value;
+end;
+
+procedure TLyric.SetScale(Value: real);
+begin
+ ScaleR := Value;
+end;
+
+procedure TLyric.SetStyle(Value: integer);
+begin
+ StyleI := Value;
+end;
+
+procedure TLyric.SetFStyle(Value: integer);
+begin
+ FontStyleI := Value;
+end;
+
+procedure TLyric.AddWord(Text: string);
+var
+ WordNum: integer;
+begin
+ WordNum := Length(Word);
+ SetLength(Word, WordNum + 1);
+ if WordNum = 0 then begin
+ Word[WordNum].X := XR;
+ end else begin
+ Word[WordNum].X := Word[WordNum - 1].X + Word[WordNum - 1].Width;
+ end;
+
+ Word[WordNum].Y := YR;
+ Word[WordNum].Size := SizeR;
+ Word[WordNum].FontStyle := FontStyleI; // new
+ SetFontStyle(FontStyleI);
+ SetFontSize(SizeR);
+ Word[WordNum].Width := glTextWidth(pchar(Text));
+ Word[WordNum].Text := Text;
+ Word[WordNum].ColR := ColR;
+ Word[WordNum].ColG := ColG;
+ Word[WordNum].ColB := ColB;
+ Word[WordNum].Scale := 1;
+ Word[WordNum].Done := 0;
+ Word[WordNum].Italic := Italic;
+
+ Refresh;
+end;
+
+procedure TLyric.AddCzesc(NrCzesci: integer);
+var
+ N: integer;
+begin
+ Clear;
+ for N := 0 to Czesci[0].Czesc[NrCzesci].HighNut do begin
+ Italic := Czesci[0].Czesc[NrCzesci].Nuta[N].FreeStyle;
+ AddWord(Czesci[0].Czesc[NrCzesci].Nuta[N].Tekst);
+ Text := Text + Czesci[0].Czesc[NrCzesci].Nuta[N].Tekst;
+ end;
+ Selected := -1;
+end;
+
+procedure TLyric.Clear;
+begin
+{ ColR := Skin_FontR;
+ ColG := Skin_FontG;
+ ColB := Skin_FontB;}
+ SetLength(Word, 0);
+ Text := '';
+ SelectedI := -1;
+end;
+
+procedure TLyric.Refresh;
+var
+ W: integer;
+ TotWidth: real;
+begin
+ if AlignI = 1 then begin
+ TotWidth := 0;
+ for W := 0 to High(Word) do
+ TotWidth := TotWidth + Word[W].Width;
+
+ Word[0].X := XR - TotWidth / 2;
+ for W := 1 to High(Word) do
+ Word[W].X := Word[W - 1].X + Word[W - 1].Width;
+ end;
+end;
+
+procedure TLyric.Draw;
+var
+ W: integer;
+begin
+ case StyleI of
+ 0:
+ begin
+ for W := 0 to High(Word) do
+ DrawNormal(W);
+ end;
+ 1:
+ begin
+ for W := 0 to High(Word) do
+ DrawPlain(W);
+ end;
+ 2: // zoom
+ begin
+ for W := 0 to High(Word) do
+ if not Word[W].Selected then
+ DrawNormal(W);
+
+ for W := 0 to High(Word) do
+ if Word[W].Selected then
+ DrawScaled(W);
+ end;
+ 3: // slide
+ begin
+ for W := 0 to High(Word) do begin
+ if not Word[W].Selected then
+ DrawNormal(W)
+ else
+ DrawSlide(W);
+ end;
+ end;
+ 4: // ball
+ begin
+ for W := 0 to High(Word) do
+ DrawNormal(W);
+
+ for W := 0 to High(Word) do
+ if Word[W].Selected then begin
+ Tex_Ball.X := (Word[W].X - 10) + Word[W].Done * Word[W].Width;
+ Tex_Ball.Y := 480 - 10*sin(Word[W].Done * pi);
+ Tex_Ball.W := 20;
+ Tex_Ball.H := 20;
+ DrawTexture(Tex_Ball);
+ end;
+ end;
+ end; // case
+end;
+
+procedure TLyric.DrawNormal(W: integer);
+begin
+ SetFontStyle(Word[W].FontStyle);
+ SetFontPos(Word[W].X+ 10*ScreenX, Word[W].Y);
+ SetFontSize(Word[W].Size);
+ SetFontItalic(Word[W].Italic);
+ glColor3f(Word[W].ColR, Word[W].ColG, Word[W].ColB);
+ glPrint(pchar(Word[W].Text));
+end;
+
+procedure TLyric.DrawPlain(W: integer);
+var
+ D: real;
+begin
+ D := Word[W].Done; // przyrost
+
+ SetFontStyle(Word[W].FontStyle);
+ SetFontPos(Word[W].X, Word[W].Y);
+ SetFontSize(Word[W].Size);
+ SetFontItalic(Word[W].Italic);
+
+ if D = 0 then
+ glColor3f(ColR, ColG, ColB)
+ else
+ glColor3f(ColSR, ColSG, ColSB);
+
+ glPrint(pchar(Word[W].Text));
+end;
+
+procedure TLyric.DrawScaled(W: integer);
+var
+ D: real;
+begin
+ // previous plus dynamic scaling effect
+ D := 1-Word[W].Done; // przyrost
+ SetFontStyle(Word[W].FontStyle);
+ SetFontPos(Word[W].X - D * Word[W].Width * (Word[W].Scale - 1) / 2 + (D+1)*10*ScreenX, Word[W].Y - D * 1.5 * Word[W].Size *(Word[W].Scale - 1));
+ SetFontSize(Word[W].Size + D * (Word[W].Size * Word[W].Scale - Word[W].Size));
+ SetFontItalic(Word[W].Italic);
+ glColor3f(Word[W].ColR, Word[W].ColG, Word[W].ColB);
+ glPrint(pchar(Word[W].Text))
+end;
+
+procedure TLyric.DrawSlide(W: integer);
+var
+ D: real;
+begin
+ D := Word[W].Done; // przyrost
+ SetFontStyle(Word[W].FontStyle);
+ SetFontPos(Word[W].X, Word[W].Y);
+ SetFontSize(Word[W].Size);
+ SetFontItalic(Word[W].Italic);
+ glColor3f(Word[W].ColR, Word[W].ColG, Word[W].ColB);
+ glPrintDone(pchar(Word[W].Text), D, ColR, ColG, ColB);
+end;
+
+function TLyric.SelectedLetter; // LCD
+var
+ W: integer;
+begin
+ Result := 1;
+
+ for W := 0 to SelectedI-1 do
+ Result := Result + Length(Word[W].Text);
+end;
+
+function TLyric.SelectedLength: integer; // LCD
+begin
+ Result := Length(Word[SelectedI].Text);
+end;
+
+procedure TLyric.ChangeCurText(Text: String);
+begin
+ Word[Selected].Text := Text;
+end;
+
+end.
diff --git a/Game/Code/Classes/UMain.pas b/Game/Code/Classes/UMain.pas
new file mode 100644
index 00000000..feaaedf1
--- /dev/null
+++ b/Game/Code/Classes/UMain.pas
@@ -0,0 +1,735 @@
+unit UMain;
+
+interface
+uses SDL, UGraphic, UMusic, URecord, UTime, SysUtils, UDisplay, UIni, ULog, ULyrics, UScreenSing,
+ gl, zlportio {you can disable it and all PortWriteB calls}, ULCD, ULight, UThemes{, UScreenPopup};
+
+type
+ TPlayer = record
+ Name: string;
+
+ Score: real;
+ ScoreLine: real;
+ ScoreGolden: real;
+
+ ScoreI: integer;
+ ScoreLineI: integer;
+ ScoreGoldenI: integer;
+ ScoreTotalI: integer;
+
+
+
+ //SingBar Mod
+ ScoreLast: Real;//Last Line Score
+ ScorePercent: integer;//Aktual Fillstate of the SingBar
+ ScorePercentTarget: integer;//Target Fillstate of the SingBar
+ //end Singbar Mod
+
+ //PhrasenBonus - Line Bonus Mod
+ LineBonus_PosX: Single;
+ LineBonus_PosY: Single;
+ LineBonus_Alpha: Single;
+ LineBonus_Visible: boolean;
+ LineBonus_Text: string;
+ LineBonus_Color: TRGB;
+ LineBonus_Age: Integer;
+
+ //Variable vor Positioning -> Set on ScreenShow, different when Playercount Changes
+ LineBonus_TargetX: integer;
+ LineBonus_TargetY: integer;
+ LineBonus_StartX: integer;
+ LineBonus_StartY: integer;
+ //PhrasenBonus - Line Bonus Mod End
+
+ //PerfectLineTwinkle Mod (effect)
+ LastSentencePerfect: Boolean;
+ //PerfectLineTwinkle Mod end
+
+
+// Meter: real;
+
+ HighNut: integer;
+ IlNut: integer;
+ Nuta: array of record
+ Start: integer;
+ Dlugosc: integer;
+ Detekt: real; // dokladne miejsce, w ktorym wykryto ta nute
+ Ton: real;
+ Perfect: boolean; // true if the note matches the original one, lit the star
+
+
+
+ // Half size Notes Patch
+ Hit: boolean; // true if the note Hits the Line
+ //end Half size Notes Patch
+
+
+
+ end;
+ end;
+
+ TStats = record
+ Player: array of TPlayer;
+ SongArtist: UTF8String;
+ SongTitle: UTF8String;
+ end;
+
+ TMedleyPlaylist = record
+ Song: array of integer;
+ NumMedleySongs: integer;
+ CurrentMedleySong: integer;
+ ApplausePlayed: boolean;
+ Stats: array of TStats;
+ NumPlayer: integer;
+ end;
+
+
+var
+ OGL: Boolean;
+ Done: Boolean;
+ Event: TSDL_event;
+ FileName: string;
+ Restart: boolean;
+
+ // gracz i jego nuty
+ Player: array of TPlayer;
+ PlayersPlay: integer;
+ PlaylistMedley: TMedleyPlaylist;
+
+
+procedure MainLoop;
+procedure CheckEvents;
+procedure Sing(Sender: TScreenSing);
+procedure NewSentence(Sender: TScreenSing);
+procedure NewBeat(Sender: TScreenSing); // executed when on then new beat
+procedure NewBeatC(Sender: TScreenSing); // executed when on then new beat for click
+procedure NewBeatD(Sender: TScreenSing); // executed when on then new beat for detection
+//procedure NewHalf; // executed when in the half between beats
+procedure NewNote(Sender: TScreenSing); // detect note
+function GetMidBeat(Time: real): real;
+function GetTimeFromBeat(Beat: integer): real;
+procedure ClearScores(PlayerNum: integer);
+
+implementation
+uses USongs, UJoystick, math, UCommandLine;
+
+procedure MainLoop;
+var
+ Delay: integer;
+begin
+ SDL_EnableKeyRepeat(125, 125);
+ While not Done do
+ Begin
+ // joypad
+ if (Ini.Joypad = 1) OR (Params.Joypad) then
+ Joy.Update;
+
+ // keyboard events
+ CheckEvents;
+
+ // display
+ done := not Display.Draw;
+ SwapBuffers;
+
+ // light
+ Light.Refresh;
+
+ // delay
+ CountMidTime;
+// if 1000*TimeMid > 100 then beep;
+ Delay := Floor(1000 / 100 - 1000 * TimeMid);
+ if Delay >= 1 then
+ SDL_Delay(Delay); // dynamic, maximum is 100 fps
+ CountSkipTime;
+
+ // reinitialization of graphics
+ if Restart then begin
+ Reinitialize3D;
+ Restart := false;
+ end;
+
+ End;
+ FreeOpenGL;
+End;
+
+Procedure CheckEvents;
+//var
+// p: pointer;
+Begin
+ if not Assigned(Display.NextScreen) then
+ While SDL_PollEvent( @event ) = 1 Do
+ Begin
+// beep;
+ Case Event.type_ Of
+ SDL_QUITEV: begin
+ Display.Fade := 0;
+ Display.NextScreenWithCheck := nil;
+ Display.CheckOK := True;
+ end;
+{ SDL_MOUSEBUTTONDOWN:
+ With Event.button Do
+ Begin
+ If State = SDL_BUTTON_LEFT Then
+ Begin
+ //
+ End;
+ End; // With}
+ SDL_KEYDOWN:
+ begin
+ //ScreenShot hack. If Print is pressed-> Make screenshot and Save to Screenshots Path
+ if (Event.key.keysym.sym = SDLK_SYSREQ) or (Event.key.keysym.sym = SDLK_PRINT) then
+ begin
+// ScreenPopupError.ShowPopup('How dare you press the <Print> key'); //show error message
+ Display.ScreenShot;
+ end
+ // popup hack... if there is a visible popup then let it handle input instead of underlying screen
+ // shoud be done in a way to be sure the topmost popup has preference (maybe error, then check)
+ else if (ScreenPopupError <> NIL) and (ScreenPopupError.Visible) then
+ done := not ScreenPopupError.ParseInput(Event.key.keysym.sym, Event.key.keysym.unicode, True)
+ else if (ScreenPopupCheck <> NIL) AND (ScreenPopupCheck.Visible) then
+ done := not ScreenPopupCheck.ParseInput(Event.key.keysym.sym, Event.key.keysym.unicode, True)
+ else if (ScreenPopupHelp <> NIL) AND (ScreenPopupHelp.Visible) then
+ done := not ScreenPopupHelp.ParseInput(Event.key.keysym.sym, Event.key.keysym.unicode, True)
+ // end of popup hack
+
+ else
+ begin
+ // check for Screen want to Exit
+ done := Not Display.ActualScreen^.ParseInput(Event.key.keysym.sym, Event.key.keysym.unicode, True);
+
+ //If Screen wants to Exit
+ if done then
+ begin
+ //If Question Option is enabled then Show Exit Popup
+ if (Ini.AskbeforeDel = 1) then
+ begin
+ Display.ActualScreen^.CheckFadeTo(NIL,'MSG_QUIT_USDX');
+ end
+ else //When asking for exit is disabled then simply exit
+ begin
+ Display.Fade := 0;
+ Display.NextScreenWithCheck := nil;
+ Display.CheckOK := True;
+ end;
+ end;
+
+ end; // if (Not Display.ActualScreen^.ParseInput(Event.key.keysym.scancode, True)) then
+ end;
+// SDL_JOYAXISMOTION:
+// begin
+// beep
+// end;
+ SDL_JOYBUTTONDOWN:
+ begin
+ beep
+ end;
+ End; // Case Event.type_
+ End; // While
+End; // CheckEvents
+
+function GetTimeForBeats(BPM, Beats: real): real;
+begin
+ Result := 60 / BPM * Beats;
+end;
+
+function GetBeats(BPM, msTime: real): real;
+begin
+ Result := BPM * msTime / 60;
+end;
+
+procedure GetMidBeatSub(BPMNum: integer; var Time: real; var CurBeat: real);
+var
+ NewTime: real;
+begin
+ if High(AktSong.BPM) = BPMNum then begin
+ // last BPM
+ CurBeat := AktSong.BPM[BPMNum].StartBeat + GetBeats(AktSong.BPM[BPMNum].BPM, Time);
+ Time := 0;
+ end else begin
+ // not last BPM
+ // count how much time is it for start of the new BPM and store it in NewTime
+ NewTime := GetTimeForBeats(AktSong.BPM[BPMNum].BPM, AktSong.BPM[BPMNum+1].StartBeat - AktSong.BPM[BPMNum].StartBeat);
+
+ // compare it to remaining time
+ if (Time - NewTime) > 0 then begin
+ // there is still remaining time
+ CurBeat := AktSong.BPM[BPMNum].StartBeat;
+ Time := Time - NewTime;
+ end else begin
+ // there is no remaining time
+ CurBeat := AktSong.BPM[BPMNum].StartBeat + GetBeats(AktSong.BPM[BPMNum].BPM, Time);
+ Time := 0;
+ end; // if
+ end; // if
+end;
+
+function GetMidBeat(Time: real): real;
+var
+ CurBeat: real;
+ CurBPM: integer;
+// TopBeat: real;
+// TempBeat: real;
+// TempTime: real;
+begin
+ Result := 0;
+ if Length(AktSong.BPM) = 1 then Result := Time * AktSong.BPM[0].BPM / 60;
+
+ (* 2 BPMs *)
+{ if Length(AktSong.BPM) > 1 then begin
+ (* new system *)
+ CurBeat := 0;
+ TopBeat := GetBeats(AktSong.BPM[0].BPM, Time);
+ if TopBeat > AktSong.BPM[1].StartBeat then begin
+ // analyze second BPM
+ Time := Time - GetTimeForBeats(AktSong.BPM[0].BPM, AktSong.BPM[1].StartBeat - CurBeat);
+ CurBeat := AktSong.BPM[1].StartBeat;
+ TopBeat := GetBeats(AktSong.BPM[1].BPM, Time);
+ Result := CurBeat + TopBeat;
+
+ end else begin
+ (* pierwszy przedzial *)
+ Result := TopBeat;
+ end;
+ end; // if}
+
+ (* more BPMs *)
+ if Length(AktSong.BPM) > 1 then begin
+
+ CurBeat := 0;
+ CurBPM := 0;
+ while (Time > 0) do begin
+ GetMidBeatSub(CurBPM, Time, CurBeat);
+ Inc(CurBPM);
+ end;
+
+ Result := CurBeat;
+ end; // if
+end;
+
+function GetTimeFromBeat(Beat: integer): real;
+var
+ CurBPM: integer;
+begin
+ Result := 0;
+ if Length(AktSong.BPM) = 1 then Result := AktSong.GAP / 1000 + Beat * 60 / AktSong.BPM[0].BPM;
+
+ (* more BPMs *)
+ if Length(AktSong.BPM) > 1 then begin
+ Result := AktSong.GAP / 1000;
+ CurBPM := 0;
+ while (CurBPM <= High(AktSong.BPM)) and (Beat > AktSong.BPM[CurBPM].StartBeat) do begin
+ if (CurBPM < High(AktSong.BPM)) and (Beat >= AktSong.BPM[CurBPM+1].StartBeat) then begin
+ // full range
+ Result := Result + (60 / AktSong.BPM[CurBPM].BPM) * (AktSong.BPM[CurBPM+1].StartBeat - AktSong.BPM[CurBPM].StartBeat);
+ end;
+
+ if (CurBPM = High(AktSong.BPM)) or (Beat < AktSong.BPM[CurBPM+1].StartBeat) then begin
+ // in the middle
+ Result := Result + (60 / AktSong.BPM[CurBPM].BPM) * (Beat - AktSong.BPM[CurBPM].StartBeat);
+ end;
+ Inc(CurBPM);
+ end;
+
+{ while (Time > 0) do begin
+ GetMidBeatSub(CurBPM, Time, CurBeat);
+ Inc(CurBPM);
+ end;}
+ end; // if}
+end;
+
+procedure Sing(Sender: TScreenSing);
+var
+ Pet: integer;
+ PetGr: integer;
+ CP: integer;
+ Done: real;
+ N: integer;
+begin
+ Czas.Teraz := Czas.Teraz + TimeSkip;
+
+ Czas.OldBeat := Czas.AktBeat;
+ Czas.MidBeat := GetMidBeat(Czas.Teraz - (AktSong.Gap{ + 90 I've forgotten for what it is}) / 1000); // new system with variable BPM in function
+ Czas.AktBeat := Floor(Czas.MidBeat);
+
+// Czas.OldHalf := Czas.AktHalf;
+// Czas.MidHalf := Czas.MidBeat + 0.5;
+// Czas.AktHalf := Floor(Czas.MidHalf);
+
+ Czas.OldBeatC := Czas.AktBeatC;
+ Czas.MidBeatC := GetMidBeat(Czas.Teraz - (AktSong.Gap) / 1000);
+ Czas.AktBeatC := Floor(Czas.MidBeatC);
+
+ Czas.OldBeatD := Czas.AktBeatD;
+ Czas.MidBeatD := -0.5+GetMidBeat(Czas.Teraz - (AktSong.Gap + 120 + 20) / 1000); // MidBeat with addition GAP
+ Czas.AktBeatD := Floor(Czas.MidBeatD);
+ Czas.FracBeatD := Frac(Czas.MidBeatD);
+
+ // sentences routines
+ for PetGr := 0 to 0 do begin;//High(Gracz) do begin
+ CP := PetGr;
+ // ustawianie starej czesci
+ Czas.OldCzesc := Czesci[CP].Akt;
+
+ // wybieranie aktualnej czesci
+ for Pet := 0 to Czesci[CP].High do
+ begin
+ if Czas.AktBeat >= Czesci[CP].Czesc[Pet].Start then
+ Czesci[CP].Akt := Pet;
+ end;
+
+ // czysczenie nut gracza, gdy to jest nowa plansza
+ // (optymizacja raz na halfbeat jest zla)
+ if Czesci[CP].Akt <> Czas.OldCzesc then NewSentence(Sender);
+
+ end; // for PetGr
+
+ // wykonuje operacje raz na beat
+ if (Czas.AktBeat >= 0) and (Czas.OldBeat <> Czas.AktBeat) then
+ NewBeat(Sender);
+
+ // make some operations on clicks
+ if {(Czas.AktBeatC >= 0) and }(Czas.OldBeatC <> Czas.AktBeatC) then
+ NewBeatC(Sender);
+
+ // make some operations when detecting new voice pitch
+ if (Czas.AktBeatD >= 0) and (Czas.OldBeatD <> Czas.AktBeatD) then
+ NewBeatD(Sender);
+
+ // wykonuje operacje w polowie beatu
+// if (Czas.AktHalf >= 1) and (Czas.OldHalf <> Czas.AktHalf) then
+// NewHalf;
+
+ // plynnie przesuwa text
+ Done := 1;
+ for N := 0 to Czesci[0].Czesc[Czesci[0].Akt].HighNut do
+ if (Czesci[0].Czesc[Czesci[0].Akt].Nuta[N].Start <= Czas.MidBeat)
+ and (Czesci[0].Czesc[Czesci[0].Akt].Nuta[N].Start + Czesci[0].Czesc[Czesci[0].Akt].Nuta[N].Dlugosc >= Czas.MidBeat) then
+ Done := (Czas.MidBeat - Czesci[0].Czesc[Czesci[0].Akt].Nuta[N].Start) / (Czesci[0].Czesc[Czesci[0].Akt].Nuta[N].Dlugosc);
+
+ N := Czesci[0].Czesc[Czesci[0].Akt].HighNut;
+
+ // wylacza ostatnia nute po przejsciu
+ if (Ini.LyricsEffect = 1) and (Done = 1) and
+ (Czas.MidBeat > Czesci[0].Czesc[Czesci[0].Akt].Nuta[N].Start + Czesci[0].Czesc[Czesci[0].Akt].Nuta[N].Dlugosc)
+ then Sender.LyricMain.Selected := -1;
+
+ if Done > 1 then Done := 1;
+ Sender.LyricMain.Done := Done;
+
+ // use Done with LCD
+{ with ScreenSing do begin
+ if LyricMain.Selected >= 0 then begin
+ LCD.MoveCursor(1, LyricMain.SelectedLetter + Round((LyricMain.SelectedLength-1) * Done));
+ LCD.ShowCursor;
+ end;
+ end;}
+
+
+end;
+
+procedure NewSentence(Sender: TScreenSing);
+var
+G: Integer;
+begin
+ // czyszczenie nut graczy
+ for G := 0 to High(Player) do begin
+ Player[G].IlNut := 0;
+ Player[G].HighNut := -1;
+ SetLength(Player[G].Nuta, 0);
+ end;
+
+ // wstawianie tekstow
+ with Sender do begin
+ LyricMain.AddCzesc(Czesci[0].Akt);
+ if Czesci[0].Akt < Czesci[0].High then
+ LyricSub.AddCzesc(Czesci[0].Akt+1)
+ else
+ LyricSub.Clear;
+ end;
+
+ Sender.UpdateLCD;
+
+ //On Sentence Change...
+ Sender.onSentenceChange(Czesci[0].Akt);
+end;
+
+procedure NewBeat(Sender: TScreenSing);
+var
+ Pet: integer;
+// TempBeat: integer;
+begin
+ // ustawia zaznaczenie tekstu
+// SingScreen.LyricMain.Selected := -1;
+ for Pet := 0 to Czesci[0].Czesc[Czesci[0].Akt].HighNut do
+ if (Czesci[0].Czesc[Czesci[0].Akt].Nuta[Pet].Start = Czas.AktBeat) then begin
+ // operates on currently beated note
+ Sender.LyricMain.Selected := Pet;
+
+// LCD.MoveCursor(1, ScreenSing.LyricMain.SelectedLetter);
+// LCD.ShowCursor;
+
+ LCD.MoveCursorBR(Sender.LyricMain.SelectedLetter);
+ LCD.ShowCursor;
+
+ end;
+end;
+
+procedure NewBeatC;
+var
+ Pet: integer;
+// LPT_1: integer;
+// LPT_2: integer;
+begin
+// LPT_1 := 1;
+// LPT_2 := 1;
+
+ // beat click
+ if (Ini.BeatClick = 1) and ((Czas.AktBeatC + Czesci[0].Resolution + Czesci[0].NotesGAP) mod Czesci[0].Resolution = 0) then
+ Music.PlayClick;
+
+ // debug system on LPT
+ if ((Czas.AktBeatC + Czesci[0].Resolution + Czesci[0].NotesGAP) mod Czesci[0].Resolution = 0) then begin
+ //LPT_1 := 0;
+// Light.LightOne(0, 150);
+
+ Light.LightOne(1, 200); // beat light
+ if ParamStr(1) = '-doublelights' then
+ Light.LightOne(0, 200); // beat light
+
+
+{ if ((Czas.AktBeatC + Czesci[0].Resolution + Czesci[0].NotesGAP) mod (Czesci[0].Resolution * 2) = 0) then
+ Light.LightOne(0, 150)
+ else
+ Light.LightOne(1, 150)}
+ end;
+
+ for Pet := 0 to Czesci[0].Czesc[Czesci[0].Akt].HighNut do
+ if (Czesci[0].Czesc[Czesci[0].Akt].Nuta[Pet].Start = Czas.AktBeatC) then begin
+ // click assist
+ if Ini.ClickAssist = 1 then
+ Music.PlayClick;
+
+ //LPT_2 := 0;
+ if ParamStr(1) <> '-doublelights' then
+ Light.LightOne(0, 150); //125
+
+
+ // drum machine
+(* TempBeat := Czas.AktBeat;// + 2;
+ if (TempBeat mod 8 = 0) then Music.PlayDrum;
+ if (TempBeat mod 8 = 4) then Music.PlayClap;
+// if (TempBeat mod 4 = 2) then Music.PlayHihat;
+ if (TempBeat mod 4 <> 0) then Music.PlayHihat;*)
+ end;
+
+ //PortWriteB($378, LPT_1 + LPT_2 * 2); // 0 zapala
+end;
+
+procedure NewBeatD(Sender: TScreenSing);
+begin
+ NewNote(Sender);
+end;
+
+//procedure NewHalf;
+//begin
+// NewNote;
+//end;
+
+procedure NewNote(Sender: TScreenSing);
+var
+ CP: integer; // current player
+ S: integer; // sentence
+ SMin: integer;
+ SMax: integer;
+ SDet: integer; // temporary: sentence of detected note
+ Pet: integer;
+ Mozna: boolean;
+ Nowa: boolean;
+ Range: integer;
+ NoteHit:boolean;
+begin
+// Log.LogStatus('Beat ' + IntToStr(Czas.AktBeat) + ' HalfBeat ' + IntToStr(Czas.AktHalf), 'NewBeat');
+// beep;
+
+ // analizuje dla obu graczy ten sam sygnal (Sound.OneSrcForBoth)
+ // albo juz lepiej nie
+ for CP := 0 to PlayersPlay-1 do begin
+
+ // analyze buffer
+ Sound[CP].AnalizujBufor;
+
+ // adds some noise
+// Czas.Ton := Czas.Ton + Round(Random(3)) - 1;
+
+ // 0.5.0: count min and max sentence range for checking (detection is delayed to the notes we see on the screen)
+ SMin := Czesci[0].Akt-1;
+ if SMin < 0 then SMin := 0;
+ SMax := Czesci[0].Akt;
+
+ // check if we can add new note
+ Mozna := false;
+ for S := SMin to SMax do
+ for Pet := 0 to Czesci[0].Czesc[S].HighNut do
+ if ((Czesci[0].Czesc[S].Nuta[Pet].Start <= Czas.AktBeatD)
+ and (Czesci[0].Czesc[S].Nuta[Pet].Start + Czesci[0].Czesc[S].Nuta[Pet].Dlugosc - 1 >= Czas.AktBeatD))
+ and (not Czesci[0].Czesc[S].Nuta[Pet].FreeStyle) // but don't allow when it's FreeStyle note
+ and (Czesci[0].Czesc[S].Nuta[Pet].Dlugosc > 0) // and make sure the note lenghts is at least 1
+ then begin
+ SDet := S;
+ Mozna := true;
+ Break;
+ end;
+
+ S := SDet;
+
+
+
+
+
+// Czas.SzczytJest := true;
+// Czas.Ton := 27;
+
+ // gdy moze, to dodaje nute
+ if (Sound[CP].SzczytJest) and (Mozna) then begin
+ // operowanie na ostatniej nucie
+ for Pet := 0 to Czesci[0].Czesc[S].HighNut do
+ if (Czesci[0].Czesc[S].Nuta[Pet].Start <= Czas.OldBeatD+1)
+ and (Czesci[0].Czesc[S].Nuta[Pet].Start +
+ Czesci[0].Czesc[S].Nuta[Pet].Dlugosc > Czas.OldBeatD+1) then begin
+ // to robi, tylko dla pary nut (oryginalnej i gracza)
+
+ // przesuwanie tonu w odpowiednia game
+ while (Sound[CP].Ton - Czesci[0].Czesc[S].Nuta[Pet].Ton > 6) do
+ Sound[CP].Ton := Sound[CP].Ton - 12;
+ while (Sound[CP].Ton - Czesci[0].Czesc[S].Nuta[Pet].Ton < -6) do
+ Sound[CP].Ton := Sound[CP].Ton + 12;
+
+ // Half size Notes Patch
+ NoteHit := false;
+
+ //if Ini.Difficulty = 0 then Range := 2;
+ //if Ini.Difficulty = 1 then Range := 1;
+ //if Ini.Difficulty = 2 then Range := 0;
+ Range := 2 - Ini.Difficulty;
+ if abs(Czesci[0].Czesc[S].Nuta[Pet].Ton - Sound[CP].Ton) <= Range then begin
+ Sound[CP].Ton := Czesci[0].Czesc[S].Nuta[Pet].Ton;
+
+
+ // Half size Notes Patch
+ NoteHit := true;
+
+
+ if (Ini.LineBonus = 0) then
+ begin
+ // add points without LineBonus
+ case Czesci[0].Czesc[S].Nuta[Pet].Wartosc of
+ 1: Player[CP].Score := Player[CP].Score + 10000 / Czesci[0].Wartosc *
+ Czesci[0].Czesc[S].Nuta[Pet].Wartosc;
+ 2: Player[CP].ScoreGolden := Player[CP].ScoreGolden + 10000 / Czesci[0].Wartosc *
+ Czesci[0].Czesc[S].Nuta[Pet].Wartosc;
+ end;
+ end
+ else
+ begin
+ // add points with Line Bonus
+ case Czesci[0].Czesc[S].Nuta[Pet].Wartosc of
+ 1: Player[CP].Score := Player[CP].Score + 9000 / Czesci[0].Wartosc *
+ Czesci[0].Czesc[S].Nuta[Pet].Wartosc;
+ 2: Player[CP].ScoreGolden := Player[CP].ScoreGolden + 9000 / Czesci[0].Wartosc *
+ Czesci[0].Czesc[S].Nuta[Pet].Wartosc;
+ end;
+ end;
+
+ Player[CP].ScoreI := Floor(Player[CP].Score / 10) * 10;
+ Player[CP].ScoreGoldenI := Floor(Player[CP].ScoreGolden / 10) * 10;
+
+ Player[CP].ScoreTotalI := Player[CP].ScoreI + Player[CP].ScoreGoldenI + Player[CP].ScoreLineI;
+ end;
+
+ end; // operowanie
+
+ // sprawdzanie czy to nowa nuta, czy przedluzenie
+ if S = SMax then begin
+ Nowa := true;
+ // jezeli ostatnia ma ten sam ton
+ if (Player[CP].IlNut > 0 ) and (Player[CP].Nuta[Player[CP].HighNut].Ton = Sound[CP].Ton)
+ and (Player[CP].Nuta[Player[CP].HighNut].Start + Player[CP].Nuta[Player[CP].HighNut].Dlugosc = Czas.AktBeatD)
+ then Nowa := false;
+ // jezeli jest jakas nowa nuta na sprawdzanym beacie
+ for Pet := 0 to Czesci[0].Czesc[S].HighNut do
+ if (Czesci[0].Czesc[S].Nuta[Pet].Start = Czas.AktBeatD) then
+ Nowa := true;
+
+ // dodawanie nowej nuty
+ if Nowa then begin
+ // nowa nuta
+ Player[CP].IlNut := Player[CP].IlNut + 1;
+ Player[CP].HighNut := Player[CP].HighNut + 1;
+ SetLength(Player[CP].Nuta, Player[CP].IlNut);
+ Player[CP].Nuta[Player[CP].HighNut].Start := Czas.AktBeatD;
+ Player[CP].Nuta[Player[CP].HighNut].Dlugosc := 1;
+ Player[CP].Nuta[Player[CP].HighNut].Ton := Sound[CP].Ton; // Ton || TonDokl
+ Player[CP].Nuta[Player[CP].HighNut].Detekt := Czas.MidBeat;
+
+
+ // Half Note Patch
+ Player[CP].Nuta[Player[CP].HighNut].Hit := NoteHit;
+
+
+ // Log.LogStatus('Nowa Nuta ' + IntToStr(Gracz.Nuta[Gracz.HighNut].Start), 'NewBeat');
+
+ end else begin
+ // przedluzenie nuty
+ Player[CP].Nuta[Player[CP].HighNut].Dlugosc := Player[CP].Nuta[Player[CP].HighNut].Dlugosc + 1;
+ end;
+
+
+ // check for perfect note and then lit the star (on Draw)
+ for Pet := 0 to Czesci[0].Czesc[S].HighNut do
+ if (Czesci[0].Czesc[S].Nuta[Pet].Start = Player[CP].Nuta[Player[CP].HighNut].Start)
+ and (Czesci[0].Czesc[S].Nuta[Pet].Dlugosc = Player[CP].Nuta[Player[CP].HighNut].Dlugosc)
+ and (Czesci[0].Czesc[S].Nuta[Pet].Ton = Player[CP].Nuta[Player[CP].HighNut].Ton) then begin
+ Player[CP].Nuta[Player[CP].HighNut].Perfect := true;
+ end;
+
+ end;// else beep; // if S = SMax
+
+ end; // if moze
+ end; // for CP
+// Log.LogStatus('EndBeat', 'NewBeat');
+
+//On Sentence End -> For LineBonus + SingBar
+if (sDet >= low(Czesci[0].Czesc)) AND (sDet <= high(Czesci[0].Czesc)) then
+if ((Czesci[0].Czesc[SDet].Nuta[Czesci[0].Czesc[SDet].HighNut].Start + Czesci[0].Czesc[SDet].Nuta[Czesci[0].Czesc[SDet].HighNut].Dlugosc - 1) = Czas.AktBeatD) then
+ Sender.onSentenceEnd(sDet);
+
+end;
+
+procedure ClearScores(PlayerNum: integer);
+begin
+ Player[PlayerNum].Score := 0;
+ Player[PlayerNum].ScoreI := 0;
+ Player[PlayerNum].ScoreLine := 0;
+ Player[PlayerNum].ScoreLineI := 0;
+ Player[PlayerNum].ScoreGolden := 0;
+ Player[PlayerNum].ScoreGoldenI := 0;
+ Player[PlayerNum].ScoreTotalI := 0;
+
+
+ //SingBar Mod
+ Player[PlayerNum].ScoreLast := 0;
+ Player[PlayerNum].ScorePercent := 50;// Sets to 50% when song starts
+ Player[PlayerNum].ScorePercentTarget := 50;// Sets to 50% when song starts
+ //end SingBar Mod
+
+ //PhrasenBonus - Line Bonus Mod
+ Player[PlayerNum].LineBonus_Visible := False; //Hide Line Bonus
+ Player[PlayerNum].LineBonus_Alpha := 0;
+ //Player[PlayerNum].LineBonus_TargetX := 70 + PlayerNum*500; //will be done by onShow
+ //Player[PlayerNum].LineBonus_TargetY := 30; //will be done by onShow
+ //PhrasenBonus - Line Bonus Mod End
+
+end;
+
+end.
+
diff --git a/Game/Code/Classes/UMusic.pas b/Game/Code/Classes/UMusic.pas
new file mode 100644
index 00000000..c4f80235
--- /dev/null
+++ b/Game/Code/Classes/UMusic.pas
@@ -0,0 +1,951 @@
+unit UMusic;
+
+interface
+
+uses Classes, MPlayer, Windows, Messages, SysUtils, Forms, ULog, USongs, Bass;//, DXSounds;
+
+procedure InitializeSound;
+
+type
+ TPos = record
+ line: integer;
+ note: integer;
+ end;
+
+ TSongMode = (smNormal, smParty, smChallenge, smMedley);
+
+ TSoundCard = record
+ Name: string;
+ Source: array of string;
+ end;
+
+ TFFTData = array [0..256] of Single;
+
+ TCustomSoundEntry = record
+ Filename: String;
+ Handle: hStream;
+ end;
+
+ TMusic = class
+ private
+// MediaPlayer: TMediaPlayer; // It will be replaced by another component;
+{ MediaPlayerStart: TMediaPlayer; // or maybe not if done this way ;)
+ MediaPlayerBack: TMediaPlayer;
+ MediaPlayerSwoosh: TMediaPlayer;
+ MediaPlayerChange: TMediaPlayer;
+ MediaPlayerOption: TMediaPlayer;
+ MediaPlayerClick: TMediaPlayer;
+ MediaPlayerDrum: TMediaPlayer;
+ MediaPlayerHihat: TMediaPlayer;
+ MediaPlayerClap: TMediaPlayer;
+ MediaPlayerShuffle: TMediaPlayer;}
+ BassStart: hStream; // Wait, I've replaced this with BASS
+ BassBack: hStream; // It has almost all features we need
+ BassSwoosh: hStream;
+ BassChange: hStream; // Almost? It aleady has them all :)
+ BassOption: hStream;
+ BassClick: hStream;
+ BassDrum: hStream;
+ BassHihat: hStream;
+ BassClap: hStream;
+ BassShuffle: hStream;
+ BassApplause: hStream;
+
+ //Custom Sounds
+ CustomSounds: array of TCustomSoundEntry;
+
+
+ Loaded: boolean;
+ Loop: boolean;
+// DXSound: TDXSound;
+// Player: TcmxMp3;
+ DSP_VocalRemover: HDSP;
+ public
+ Bass: hStream;
+
+// SoundCard: array of TSoundCard;
+ procedure InitializePlayback;
+ procedure InitializeRecord;
+ procedure SetVolume(Volume: integer);
+ procedure SetMusicVolume(Volume: integer);
+ procedure Fade(InitVolume, TargetVolume: Integer; FadeTime: real);
+ procedure FadeStop(FadeTime: real);
+ procedure SetLoop(Enabled: boolean);
+ function Open(Name: string): boolean; // true if succeed
+ procedure Rewind;
+ procedure MoveTo(Time: real);
+ procedure Play;
+ procedure Pause; //Pause Mod
+ procedure Stop;
+ procedure Close;
+ function Finished: boolean;
+ function Length: real;
+ function Position: real;
+ procedure PlayStart;
+ procedure PlayBack;
+ procedure PlaySwoosh;
+ procedure PlayChange;
+ procedure PlayOption;
+ procedure PlayClick;
+ procedure PlayDrum;
+ procedure PlayHihat;
+ procedure PlayClap;
+ procedure PlayShuffle;
+ procedure StopShuffle;
+ procedure PlayApplause;
+ procedure CaptureStart;
+ procedure CaptureStop;
+ procedure CaptureCard(RecordI, PlayerLeft, PlayerRight: byte);
+ procedure StopCard(Card: byte);
+ function LoadPlayerFromFile(var MediaPlayer: TMediaPlayer; Name: string): boolean;
+ function LoadSoundFromFile(var hStream: hStream; Name: string): boolean;
+
+ //Equalizer
+ function GetFFTData: TFFTData;
+
+ //Custom Sounds
+ function LoadCustomSound(const Filename: String): Cardinal;
+ procedure PlayCustomSound(const Index: Cardinal);
+
+ procedure EnableVocalRemover;
+ procedure DisableVocalRemover;
+ function VocalRemoverActivated(): boolean;
+
+end;
+
+const
+ RecordSystem = 1;
+
+function FindNote(beat: integer): TPos;
+
+type
+ TMuzyka = record
+ Path: string;
+ Start: integer; // start of song in ms
+// BPM: array of TBPM;
+// Gap: real;
+ IlNut: integer;
+ DlugoscNut: integer;
+// WartoscNut: integer;
+ end;
+
+ TCzesci = record //Lines
+ Akt: integer; // aktualna czesc utworu do rysowania
+ High: integer;
+ Ilosc: integer;
+ Resolution: integer;
+ NotesGAP: integer;
+ Wartosc: integer;
+ Czesc: array of record //Line
+ Start: integer;
+ StartNote: integer;
+ Lyric: string;
+ LyricWidth: real;
+ Koniec: integer; //Ende?
+ BaseNote: integer;
+ HighNut: integer;
+ IlNut: integer;
+ TotalNotes: integer;
+ Nuta: array of record //Note
+ Color: integer;
+ Start: integer;
+ Dlugosc: integer;
+ Ton: integer;
+ TonGamy: integer;
+ Tekst: string; //Silbe?
+ FreeStyle: boolean;
+ Wartosc: integer; // zwykla nuta x1, zlota nuta x2
+ IsMedley: boolean; //just for editor
+ IsStartPreview: boolean; //just for editor
+
+
+
+
+ end;
+ end;
+ end;
+
+ TCzas = record // wszystko, co dotyczy aktualnej klatki
+// BajtowTotal: integer;
+// BajtowTeraz: integer;
+// BajtowNaSek: integer;
+ OldBeat: integer; // poprzednio wykryty beat w utworze
+ AktBeat: integer; // aktualny beat w utworze
+ MidBeat: real; // dokladny AktBeat
+
+ // should not be used
+// OldHalf: integer; // poprzednio wykryta polowka
+// AktHalf: integer; // aktualna polowka w utworze
+// MidHalf: real; // dokladny AktHalf
+
+ // now we use this for super synchronization!
+ // only used when analyzing voice
+ OldBeatD: integer; // poprzednio wykryty beat w utworze
+ AktBeatD: integer; // aktualny beat w utworze
+ MidBeatD: real; // dokladny AktBeatD
+ FracBeatD: real; // fractional part of MidBeatD
+
+ // we use this for audiable clicks
+ OldBeatC: integer; // poprzednio wykryty beat w utworze
+ AktBeatC: integer; // aktualny beat w utworze
+ MidBeatC: real; // dokladny AktBeatC
+ FracBeatC: real; // fractional part of MidBeatC
+
+
+ OldCzesc: integer; // poprzednio wyswietlana czesc
+ // akt jest w czesci.akt
+
+ Teraz: real; // aktualny czas w utworze
+ Razem: real; // caly czas utworu
+// TerazSek: integer;
+ end;
+
+var
+ Form: TForm;
+ Music: TMusic;
+
+ // muzyka
+ Muzyka: TMuzyka;
+
+ // czesci z nutami;
+ Czesci: array of TCzesci;
+
+ // czas
+ Czas: TCzas;
+
+ fHWND: Thandle;
+
+const
+ ModeStr: array[TMPModes] of string = ('Not ready', 'Stopped', 'Playing', 'Recording', 'Seeking', 'Paused', 'Open');
+
+implementation
+uses UGraphic, URecord, UFiles, UIni, UMain, UThemes, UTime;
+
+//from http://www.un4seen.com/forum/?topic=5943.0;hl=sbvocalcut16
+procedure SBVocalCut16(handle: DWORD; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
+var
+ i, k: DWORD;
+ dmch: Smallint;
+ lch, rch: PSmallint;
+
+begin
+ i := 0;
+ lch := buffer;
+ rch := buffer;
+ Inc(rch);
+
+ while (i < length) do
+ begin
+ dmch := round((((0 - lch^) + (rch^)) div 2)*1.5);
+
+ lch^ := dmch;
+ rch^ := dmch;
+
+ Inc(lch, 2);
+ Inc(rch, 2);
+ Inc(i, SizeOf(SmallInt) * 2);
+ end;
+end;
+
+function FindNote(beat: integer): TPos;
+var
+ I, J: integer;
+ found: boolean;
+ min: integer;
+ diff: integer;
+begin
+ found := false;
+ for I := 0 to length(Czesci[0].Czesc) - 1 do
+ begin
+ for J := 0 to length(Czesci[0].Czesc[I].Nuta) - 1 do
+ begin
+ if (beat>=Czesci[0].Czesc[I].Nuta[J].Start) and
+ (beat<=Czesci[0].Czesc[I].Nuta[J].Start + Czesci[0].Czesc[I].Nuta[J].Dlugosc) then
+ begin
+ Result.line := I;
+ Result.note := J;
+ found:=true;
+ break;
+ end;
+ end;
+ end;
+
+ if found then //found exactly
+ exit;
+
+ min := high(integer);
+ //second try (approximating)
+ for I := 0 to length(Czesci[0].Czesc) - 1 do
+ begin
+ for J := 0 to length(Czesci[0].Czesc[I].Nuta) - 1 do
+ begin
+ diff := abs(Czesci[0].Czesc[I].Nuta[J].Start - beat);
+ if diff<min then
+ begin
+ Result.line := I;
+ Result.note := J;
+ min := diff;
+ end;
+ end;
+ end;
+end;
+
+procedure InitializeSound;
+begin
+ Log.LogStatus('Initializing Playback', 'InitializeSound'); Music.InitializePlayback;
+ Log.LogStatus('Initializing Record', 'InitializeSound'); Music.InitializeRecord;
+end;
+
+procedure TMusic.InitializePlayback;
+var
+ Pet: integer;
+ S: integer;
+begin
+ Log.BenchmarkStart(4);
+ Log.LogStatus('Initializing Playback Subsystem', 'Music Initialize');
+ Loaded := false;
+ Loop := false;
+ fHWND := AllocateHWND( nil);
+
+ if BASS_Init(1, 44100, 0, fHWND, nil) = false then
+ begin
+ Application.MessageBox ('Could not initialize BASS', 'Error');
+ Exit;
+ end;
+ DSP_VocalRemover := 0;
+ Log.BenchmarkEnd(4); Log.LogBenchmark('--> Bass Init', 4);
+
+ // config playing buffer
+ //BASS_SetConfig(BASS_CONFIG_UPDATEPERIOD, 0);
+ //BASS_SetConfig(BASS_CONFIG_BUFFER, 100);
+
+{ MediaPlayer := TMediaPlayer.Create( nil );
+ MediaPlayer.ParentWindow := fHWND;
+ MediaPlayer.Wait := true;}
+
+ Log.LogStatus('Loading Sounds', 'Music Initialize');
+
+{ LoadPlayerFromFile(MediaPlayerStart, SoundPath + 'Common Start.mp3');
+ LoadPlayerFromFile(MediaPlayerBack, SoundPath + 'Common Back.mp3');
+ LoadPlayerFromFile(MediaPlayerSwoosh, SoundPath + 'menu swoosh.mp3');
+ LoadPlayerFromFile(MediaPlayerChange, SoundPath + 'select music change music.mp3');
+ LoadPlayerFromFile(MediaPlayerOption, SoundPath + 'option change col.mp3');
+ LoadPlayerFromFile(MediaPlayerClick, SoundPath + 'rimshot022b.mp3');
+
+ LoadPlayerFromFile(MediaPlayerDrum, SoundPath + 'bassdrumhard076b.mp3');
+ LoadPlayerFromFile(MediaPlayerHihat, SoundPath + 'hihatclosed068b.mp3');
+ LoadPlayerFromFile(MediaPlayerClap, SoundPath + 'claps050b.mp3');
+
+ LoadPlayerFromFile(MediaPlayerShuffle, SoundPath + 'Shuffle.mp3');}
+
+ Log.BenchmarkStart(4);
+ LoadSoundFromFile(BassStart, SoundPath + 'Common Start.mp3');
+ LoadSoundFromFile(BassBack, SoundPath + 'Common Back.mp3');
+ LoadSoundFromFile(BassSwoosh, SoundPath + 'menu swoosh.mp3');
+ LoadSoundFromFile(BassChange, SoundPath + 'select music change music 50.mp3');
+ LoadSoundFromFile(BassOption, SoundPath + 'option change col.mp3');
+ LoadSoundFromFile(BassClick, SoundPath + 'rimshot022b.mp3');
+
+// LoadSoundFromFile(BassDrum, SoundPath + 'bassdrumhard076b.mp3');
+// LoadSoundFromFile(BassHihat, SoundPath + 'hihatclosed068b.mp3');
+// LoadSoundFromFile(BassClap, SoundPath + 'claps050b.mp3');
+
+// LoadSoundFromFile(BassShuffle, SoundPath + 'Shuffle.mp3');
+ LoadSoundFromFile(BassApplause, SoundPath + 'Applause.mp3');
+ Log.BenchmarkEnd(4); Log.LogBenchmark('--> Loading Sounds', 4);
+end;
+
+procedure TMusic.InitializeRecord;
+var
+ S: integer;
+ device: integer;
+ descr: string;
+ input: integer;
+ input2: integer;
+ flags: integer;
+ mic: array[0..15] of integer;
+ SC: integer; // soundcard
+ SCI: integer; // soundcard input
+begin
+ if RecordSystem = 1 then begin
+ SetLength(Sound, 6 {max players});//Ini.Players+1);
+ for S := 0 to High(Sound) do begin //Ini.Players do begin
+ Sound[S] := TSound.Create;
+ Sound[S].Num := S;
+ Sound[S].BufferNew := TMemoryStream.Create;
+ SetLength(Sound[S].BufferLong, 1);
+ Sound[S].BufferLong[0] := TMemoryStream.Create;
+ Sound[S].n := 4*1024;
+ end;
+
+
+ // check for recording devices;
+ {device := 0;
+ descr := BASS_RecordGetDeviceDescription(device);
+
+ SetLength(SoundCard, 0);
+ while (descr <> '') do begin
+ SC := High(SoundCard) + 1;
+ SetLength(SoundCard, SC+1);
+
+ Log.LogAnalyze('Device #'+IntToStr(device)+': '+ descr);
+ SoundCard[SC].Description := Descr;
+
+ // check for recording inputs
+ mic[device] := -1; // default to no change
+ input := 0;
+ BASS_RecordInit(device);
+ Log.LogAnalyze('Input #' + IntToStr(Input) + ': ' + BASS_RecordGetInputName(input));
+ flags := BASS_RecordGetInput(input);
+
+ SetLength(SoundCard[SC].Input, 0);
+ while (flags <> -1) do begin
+ SCI := High(SoundCard[SC].Input) + 1;
+ SetLength(SoundCard[SC].Input, SCI+1);
+
+ Log.LogAnalyze('Input #' + IntToStr(Input) + ': ' + BASS_RecordGetInputName(input));
+ SoundCard[SC].Input[SCI].Name := BASS_RecordGetInputName(Input);
+
+ if (flags and BASS_INPUT_TYPE_MASK) = BASS_INPUT_TYPE_MIC then begin
+ mic[device] := input; // auto set microphone
+ end;
+ Inc(Input);
+ flags := BASS_RecordGetInput(input);
+ end;
+
+ if mic[device] <> -1 then begin
+ Log.LogAnalyze('Found the mic at input ' + IntToStr(Mic[device]))
+ end else begin
+ Log.LogAnalyze('Mic not found');
+ mic[device] := 0; // setting to the first one (for kxproject)
+ end;
+ SoundCard[SC].InputSeleceted := Mic[Device];
+
+
+ BASS_RecordFree;
+
+ inc(Device);
+ descr := BASS_RecordGetDeviceDescription(Device);
+ end; // while}
+ end; // if
+end;
+
+procedure TMusic.SetVolume(Volume: integer);
+begin
+ //Old Sets Wave Volume
+ //BASS_SetVolume(Volume);
+ //New: Sets Volume only for this Application
+ BASS_SetConfig(BASS_CONFIG_GVOL_SAMPLE, Volume);
+ BASS_SetConfig(BASS_CONFIG_GVOL_STREAM, Volume);
+ BASS_SetConfig(BASS_CONFIG_GVOL_MUSIC, Volume);
+end;
+
+procedure TMusic.SetMusicVolume(Volume: Integer);
+begin
+ //Max Volume Prevention
+ if Volume > 100 then
+ Volume := 100;
+
+ //Set Volume
+ BASS_ChannelSetAttributes (Bass, -1, Volume, -101);
+end;
+
+procedure TMusic.Fade(InitVolume, TargetVolume: Integer; FadeTime: real);
+var
+ time: dword;
+begin
+ //Max Volume Prevention
+ if TargetVolume > 100 then
+ TargetVolume := 100
+ else if TargetVolume<0 then
+ TargetVolume := 0;
+
+ BASS_ChannelSetAttributes (Bass, -1, InitVolume, -101);
+ time := round(FadeTime*1000);
+ BASS_ChannelSlideAttributes (Bass, -1, TargetVolume, -101, time);
+end;
+
+procedure TMusic.FadeStop(FadeTime: real);
+var
+ time: dword;
+begin
+ time := round(FadeTime*1000);
+ BASS_ChannelSlideAttributes (Bass, -1, -2, -101, time); //fade out and stop
+end;
+
+procedure TMusic.SetLoop(Enabled: boolean);
+begin
+ Loop := Enabled;
+end;
+
+function TMusic.Open(Name: string): boolean;
+begin
+ Loaded := false;
+
+ if FileExists(Name) then begin
+{ MediaPlayer.FileName := Name;
+ MediaPlayer.Open;}
+
+ Bass := Bass_StreamCreateFile(false, pchar(Name), 0, 0, 0);
+ Loaded := true;
+ DSP_VocalRemover:=0;
+ //Set Max Volume
+ SetMusicVolume (100);
+ end;
+
+ Result := Loaded;
+
+// Player := TcmxMp3.Create(Name);
+end;
+
+procedure TMusic.Rewind;
+begin
+ if Loaded then begin
+// MediaPlayer.Position := 0;
+
+ end;
+end;
+
+procedure TMusic.MoveTo(Time: real);
+var
+ bytes: integer;
+begin
+// if Loaded then begin
+// MediaPlayer.StartPos := Round(Time);
+ bytes := BASS_ChannelSeconds2Bytes(Bass, Time);
+ BASS_ChannelSetPosition(Bass, bytes);
+// end;
+end;
+
+procedure TMusic.Play;
+begin
+ if Loaded then begin
+// MediaPlayer.Play;
+ if Loop then BASS_ChannelPlay(Bass, True); // start from beginning... actually bass itself does not loop, nor does this TMusic Class
+ BASS_ChannelPlay(Bass, False); // for setting position before playing
+ end;
+end;
+
+procedure TMusic.Pause; //Pause Mod
+begin
+ if Loaded then begin
+ BASS_ChannelPause(Bass); // Pauses Song
+ end;
+end;
+
+procedure TMusic.Stop;
+begin
+ Bass_ChannelStop(Bass);
+// Bass_StreamFree(Bass);
+// if ModeStr[MediaPlayer.Mode] = 'Playing' then begin
+// MediaPlayer.Stop;
+// end;
+end;
+
+procedure TMusic.Close;
+begin
+ Bass_StreamFree(Bass);
+ DSP_VocalRemover:=0;
+// Player.Free;
+// MediaPlayer.Close;
+end;
+
+function TMusic.Length: real;
+var
+ bytes: integer;
+begin
+ Result := 60;
+
+ bytes := BASS_ChannelGetLength( Bass );
+ Result := BASS_ChannelBytes2Seconds(Bass, bytes);
+
+{ if Assigned(MediaPlayer) then begin
+ if Loaded then Result := MediaPlayer.Length / 1000;
+ end;}
+// if Assigned(Player) then
+// Result := Player.LengthInSeconds;
+end;
+
+function TMusic.Position: real;
+var
+ bytes: integer;
+begin
+ Result := 0;//MediaPlayer.Position / 1000;
+ bytes := BASS_ChannelGetPosition(BASS);
+ Result := BASS_ChannelBytes2Seconds(BASS, bytes);
+end;
+
+function TMusic.Finished: boolean;
+begin
+ Result := false;
+// if ModeStr[MediaPlayer.Mode] = 'Stopped' then Result := true;
+ if BASS_ChannelIsActive(BASS) = BASS_ACTIVE_STOPPED then begin
+// beep;
+ Result := true;
+ end;
+end;
+
+{function myeffect( chan : integer; stream : Pointer; len : integer; udata : Pointer ): Pointer; cdecl;
+var
+ dane: pwordarray;
+ pet: integer;
+ Prev: smallint;
+ PrevNew: smallint;
+begin
+ dane := stream;
+ Prev := 0;
+ for pet := 0 to len div 2 -1 do begin
+ PrevNew := Dane[Pet];
+
+// Dane[pet] := Round(PrevNew*1/8 + Prev*7/8);
+
+ Prev := Dane[Pet];
+ end;
+end;}
+
+procedure TMusic.PlayStart;
+{var
+ Music: PMix_Chunk;}
+begin
+{ Mix_OpenAudio(44100, 16, 1, 16*1024);
+ Music := Mix_LoadWAV('D:\Rozne\UltraStar\Old\Boys - Hej Sokoly 30s.wav');
+ Mix_RegisterEffect(0, myeffect, nil, 0);
+ Mix_PlayChannel(0, Music, 0);}
+
+// MediaPlayerStart.Rewind;
+// MediaPlayerStart.Play;
+ BASS_ChannelPlay(BassStart, True);
+end;
+
+procedure TMusic.PlayBack;
+begin
+// MediaPlayerBack.Rewind;
+// MediaPlayerBack.Play;
+// if not
+ BASS_ChannelPlay(BassBack, True);// then
+// Application.MessageBox ('Error playing stream!', 'Error');
+end;
+
+procedure TMusic.PlaySwoosh;
+begin
+// MediaPlayerSwoosh.Rewind;
+// MediaPlayerSwoosh.Play;
+ BASS_ChannelPlay(BassSwoosh, True);
+end;
+
+procedure TMusic.PlayChange;
+begin
+// MediaPlayerChange.Rewind;
+// MediaPlayerChange.Play;
+ BASS_ChannelPlay(BassChange, True);
+end;
+
+procedure TMusic.PlayOption;
+begin
+// MediaPlayerOption.Rewind;
+// MediaPlayerOption.Play;
+ BASS_ChannelPlay(BassOption, True);
+end;
+
+procedure TMusic.PlayClick;
+begin
+// MediaPlayerClick.Rewind;
+// MediaPlayerClick.Play;
+ BASS_ChannelPlay(BassClick, True);
+end;
+
+procedure TMusic.PlayDrum;
+begin
+// MediaPlayerDrum.Rewind;
+// MediaPlayerDrum.Play;
+ BASS_ChannelPlay(BassDrum, True);
+end;
+
+procedure TMusic.PlayHihat;
+begin
+// MediaPlayerHihat.Rewind;
+// MediaPlayerHihat.Play;
+ BASS_ChannelPlay(BassHihat, True);
+end;
+
+procedure TMusic.PlayClap;
+begin
+// MediaPlayerClap.Rewind;
+// MediaPlayerClap.Play;
+ BASS_ChannelPlay(BassClap, True);
+end;
+
+procedure TMusic.PlayShuffle;
+begin
+// MediaPlayerShuffle.Rewind;
+// MediaPlayerShuffle.Play;
+ BASS_ChannelPlay(BassShuffle, True);
+end;
+
+procedure TMusic.StopShuffle;
+begin
+ BASS_ChannelStop(BassShuffle);
+end;
+
+procedure TMusic.PlayApplause;
+begin
+// MediaPlayerShuffle.Rewind;
+// MediaPlayerShuffle.Play;
+ BASS_ChannelPlay(BassApplause, True);
+end;
+
+procedure TMusic.CaptureStart;
+var
+ S: integer;
+ SC: integer;
+ P1: integer;
+ P2: integer;
+begin
+ for S := 0 to High(Sound) do
+ Sound[S].BufferLong[0].Clear;
+
+{ case PlayersPlay of
+ 1: begin
+ CaptureCard(0, 0, 1, 0);
+ end;
+ 2: begin
+ if Ini.TwoPlayerMode = 0 then begin
+ CaptureCard(0, 0, 1, 2);
+ end else begin
+ CaptureCard(0, 0, 1, 0);
+ CaptureCard(1, 1, 2, 0);
+ end;
+ end;
+ 3: begin
+ CaptureCard(0, 0, 1, 2);
+ CaptureCard(1, 1, 3, 0);
+ end;
+ end; // case}
+
+// CaptureCard(0, 0, 0, 0);
+// end;
+
+ {for SC := 0 to High(SoundCard) do begin
+ P1 := Ini.SoundCard[SC, 1];
+ P2 := Ini.SoundCard[SC, 2];
+ if P1 > PlayersPlay then P1 := 0;
+ if P2 > PlayersPlay then P2 := 0;
+ CaptureCard(SC, P1, P2);
+ end; }
+ // 0.5.2: new
+ for SC := 0 to High(Ini.CardList) do begin
+ P1 := Ini.CardList[SC].ChannelL;
+ P2 := Ini.CardList[SC].ChannelR;
+ if P1 > PlayersPlay then P1 := 0;
+ if P2 > PlayersPlay then P2 := 0;
+ if (P1 > 0) or (P2 > 0) then
+ CaptureCard(SC, P1, P2);
+ end;
+end;
+
+procedure TMusic.CaptureStop;
+var
+ SC: integer;
+ P1: integer;
+ P2: integer;
+begin
+{ if RecordSystem = 1 then begin
+ case PlayersPlay of
+ 1: begin
+ StopCard(0);
+ end;
+ 2: begin
+ if Ini.TwoPlayerMode = 0 then begin
+ StopCard(0);
+ end else begin
+ StopCard(0);
+ StopCard(1);
+ end;
+ end;
+ 3: begin
+ StopCard(0);
+ StopCard(1);
+ end;
+ end;
+ end;}
+
+ {for SC := 0 to High(SoundCard) do begin
+ StopCard(SC);
+ end; }
+
+ // 0.5.2
+ for SC := 0 to High(Ini.CardList) do begin
+ P1 := Ini.CardList[SC].ChannelL;
+ P2 := Ini.CardList[SC].ChannelR;
+ if P1 > PlayersPlay then P1 := 0;
+ if P2 > PlayersPlay then P2 := 0;
+ if (P1 > 0) or (P2 > 0) then StopCard(SC);
+ end;
+
+end;
+
+//procedure TMusic.CaptureCard(RecordI, SoundNum, PlayerLeft, PlayerRight: byte);
+procedure TMusic.CaptureCard(RecordI, PlayerLeft, PlayerRight: byte);
+var
+ Error: integer;
+ ErrorMsg: string;
+begin
+ if not BASS_RecordInit(RecordI) then begin
+ Error := BASS_ErrorGetCode;
+
+ ErrorMsg := IntToStr(Error);
+ if Error = BASS_ERROR_DX then ErrorMsg := 'No DX5';
+ if Error = BASS_ERROR_ALREADY then ErrorMsg := 'The device has already been initialized';
+ if Error = BASS_ERROR_DEVICE then ErrorMsg := 'The device number specified is invalid';
+ if Error = BASS_ERROR_DRIVER then ErrorMsg := 'There is no available device driver';
+
+ {Log.LogAnalyze('Error initializing record [' + IntToStr(RecordI) + ', '
+ + IntToStr(PlayerLeft) + ', '+ IntToStr(PlayerRight) + ']: '
+ + ErrorMsg);}
+ Log.LogError('Error initializing record [' + IntToStr(RecordI) + ', '
+ + IntToStr(PlayerLeft) + ', '+ IntToStr(PlayerRight) + ']: '
+ + ErrorMsg);
+ Log.LogError('Music -> CaptureCard: Error initializing record: ' + ErrorMsg);
+
+
+ end else begin
+
+ //SoundCard[RecordI].BassRecordStream := BASS_RecordStart(44100, 2, MakeLong(0, 20) , @GetMicrophone, PlayerLeft + PlayerRight*256);
+ Recording.SoundCard[RecordI].BassRecordStream := BASS_RecordStart(44100, 2, MakeLong(0, 20) , @GetMicrophone, PlayerLeft + PlayerRight*256);
+
+ {if SoundCard[RecordI].BassRecordStream = 0 then begin
+ Error := BASS_ErrorGetCode;
+
+ ErrorMsg := IntToStr(Error);
+ if Error = BASS_ERROR_INIT then ErrorMsg := 'Not successfully called';
+ if Error = BASS_ERROR_ALREADY then ErrorMsg := 'Recording is already in progress';
+ if Error = BASS_ERROR_NOTAVAIL then ErrorMsg := 'The recording device is not available';
+ if Error = BASS_ERROR_FORMAT then ErrorMsg := 'The specified format is not supported';
+ if Error = BASS_ERROR_MEM then ErrorMsg := 'There is insufficent memory';
+ if Error = BASS_ERROR_UNKNOWN then ErrorMsg := 'Unknown';
+
+ Log.LogError('Error creating record stream [' + IntToStr(RecordI) + ', '
+ + IntToStr(PlayerLeft) + ', '+ IntToStr(PlayerRight) + ']: '
+ + ErrorMsg);
+ end; }
+ end;
+end;
+
+procedure TMusic.StopCard(Card: byte);
+begin
+ BASS_RecordSetDevice(Card);
+ BASS_RecordFree;
+end;
+
+function TMusic.LoadPlayerFromFile(var MediaPlayer: TMediaPlayer; Name: string): boolean;
+begin
+ Log.LogStatus('Loading Sound: "' + Name + '"', 'LoadPlayerFromFile');
+ if FileExists(Name) then begin
+ try
+ MediaPlayer := TMediaPlayer.Create( nil );
+ except
+ Log.LogError('Failed to create MediaPlayer', 'LoadPlayerFromFile');
+ end;
+ try
+ MediaPlayer.ParentWindow := fHWND;
+ MediaPlayer.Wait := true;
+ MediaPlayer.FileName := Name;
+ MediaPlayer.DeviceType := dtAutoSelect;
+ MediaPlayer.Display := nil;
+ except
+ Log.LogError('Failed setting MediaPlayer: ' + MediaPlayer.ErrorMessage, 'LoadPlayerFromFile');
+ end;
+ try
+ MediaPlayer.Open;
+ except
+ Log.LogError('Failed to open using MediaPlayer', 'LoadPlayerFromFile');
+ end;
+ end else begin
+ Log.LogError('Sound not found: "' + Name + '"', 'LoadPlayerFromFile');
+ exit;
+ end;
+end;
+
+function TMusic.LoadSoundFromFile(var hStream: hStream; Name: string): boolean;
+var
+ L: Integer;
+begin
+ if FileExists(Name) then begin
+ Log.LogStatus('Loading Sound: "' + Name + '"', 'LoadPlayerFromFile');
+ try
+ hStream := BASS_StreamCreateFile(False, pchar(Name), 0, 0, 0);
+ //Add CustomSound
+ L := High(CustomSounds) + 1;
+ SetLength (CustomSounds, L + 1);
+ CustomSounds[L].Filename := Name;
+ CustomSounds[L].Handle := hStream;
+ except
+ Log.LogError('Failed to open using BASS', 'LoadPlayerFromFile');
+ end;
+ end else begin
+ Log.LogError('Sound not found: "' + Name + '"', 'LoadPlayerFromFile');
+ exit;
+ end;
+end;
+
+//Equalizer
+function TMusic.GetFFTData: TFFTData;
+var
+Data: TFFTData;
+begin
+ //Get Channel Data Mono and 256 Values
+ BASS_ChannelGetData(Bass, @Result, BASS_DATA_FFT512);
+ //Result := Data;
+end;
+
+function TMusic.LoadCustomSound(const Filename: String): Cardinal;
+var
+ S: hStream;
+ I: Integer;
+ F: String;
+begin
+ //Search for Sound in already loaded Sounds
+ F := UpperCase(SoundPath + FileName);
+ For I := 0 to High(CustomSounds) do
+ begin
+ if (UpperCase(CustomSounds[I].Filename) = F) then
+ begin
+ Result := I;
+ Exit;
+ end;
+ end;
+
+ if LoadSoundFromFile(S, SoundPath + Filename) then
+ Result := High(CustomSounds)
+ else
+ Result := 0;
+end;
+
+procedure TMusic.PlayCustomSound(const Index: Cardinal);
+begin
+if Index <= High(CustomSounds) then
+ BASS_ChannelPlay(CustomSounds[Index].Handle, True);
+end;
+
+procedure TMusic.EnableVocalRemover;
+begin
+ if DSP_VocalRemover=0 then
+ DSP_VocalRemover := Bass_ChannelSetDSP(Bass, @SBVocalCut16, 0, 0);
+
+end;
+
+procedure TMusic.DisableVocalRemover;
+begin
+ if DSP_VocalRemover<>0 then
+ begin
+ BASS_ChannelRemoveDSP(Bass, DSP_VocalRemover);
+ DSP_VocalRemover := 0;
+ end;
+end;
+
+function TMusic.VocalRemoverActivated(): boolean;
+begin
+ Result := (DSP_VocalRemover <> 0);
+end;
+
+end.
diff --git a/Game/Code/Classes/UParty.pas b/Game/Code/Classes/UParty.pas
new file mode 100644
index 00000000..2887f68c
--- /dev/null
+++ b/Game/Code/Classes/UParty.pas
@@ -0,0 +1,433 @@
+unit UParty;
+
+interface
+
+uses ModiSDK;
+
+type
+ TRoundInfo = record
+ Plugin: Word;
+ PluginNr: Integer;
+ Medley: boolean;
+ MedleySurprise: boolean;
+ Winner: Byte;
+ end;
+
+ TeamOrderEntry = record
+ Teamnum: Byte;
+ Score: Byte;
+ end;
+
+ TeamOrderArray = Array[0..5] of Byte;
+
+ TPartyPlugin = record
+ ID: byte;
+ TimesPlayed: byte;
+ Medley: boolean;
+ MedleySurprise: boolean;
+ Selected: boolean;
+ Name: string;
+ Desc: string;
+ end;
+
+ TParty_Session = class
+ private
+ function GetRandomPlayer(Team: Byte): Byte;
+ function GetRandomPlugin(var medley: boolean; var surprise: boolean; var nr: integer): byte;
+ function IsWinner(Player, Winner: Byte): boolean;
+ procedure GenScores;
+ public
+ Plugins: array of TPartyPlugin;
+ Teams: TTeamInfo;
+ Rounds: array of TRoundInfo;
+ CurRound: Byte;
+
+ constructor Create;
+
+ procedure StartNewParty(NumRounds: Byte);
+ procedure StartRound;
+ procedure EndRound;
+ function GetTeamOrder: TeamOrderArray;
+ function GetWinnerString(Round: Byte): String;
+ end;
+
+var
+ PartySession: TParty_Session;
+
+implementation
+
+uses UDLLManager, UGraphic, UMain, ULanguage, ULog;
+
+//----------
+//Constructor - Prepares the Class
+//----------
+constructor TParty_Session.Create;
+begin
+// - Nothing in here atm
+end;
+
+//----------
+// Returns a number of a random plugin (New Version)
+//----------
+function TParty_Session.GetRandomPlugin(var medley: boolean; var surprise: boolean; var nr: integer): byte;
+Type
+ TOrder = record
+ ID: integer;
+ medley: boolean;
+ surprise: boolean;
+ Nr: integer;
+ end;
+
+ function getTimesPlayed(order: TOrder): integer;
+ var
+ I: integer;
+ begin
+ for I := 0 to Length(Plugins) - 1 do
+ begin
+ if (order.ID = Plugins[I].ID) and (order.medley = Plugins[I].medley) then
+ begin
+ Result:=Plugins[I].TimesPlayed;
+ break;
+ end;
+ end;
+ end;
+
+var
+ I, J, K, num: Integer;
+ plugin_order: array of TOrder;
+ temp: TOrder;
+ min: integer;
+
+begin
+ min := high(min);
+ SetLength(plugin_order, Length(Plugins));
+ for I := 0 to Length(Plugins) - 1 do
+ begin
+ plugin_order[I].ID := Plugins[I].ID;
+ plugin_order[I].medley := Plugins[I].Medley;
+ plugin_order[I].surprise := Plugins[I].MedleySurprise;
+ plugin_order[I].Nr := I;
+ if Plugins[I].TimesPlayed < min then
+ min := Plugins[I].TimesPlayed;
+ end;
+
+ //sort ASC by TimesPlayed
+ for J := 0 to Length(Plugins) - 2 do
+ begin
+ for K := J+1 to Length(Plugins) - 1 do
+ begin
+ if getTimesPlayed(plugin_order[J]) > getTimesPlayed(plugin_order[K]) then
+ begin
+ temp := plugin_order[J];
+ plugin_order[J] := plugin_order[K];
+ plugin_order[K] := temp;
+ end;
+ end;
+ end;
+
+ //set filter
+ num := 0;
+ for I := 0 to Length(Plugins) - 1 do
+ begin
+ if Plugins[I].TimesPlayed <= min then
+ Inc(num);
+ end;
+
+ K := random(num);
+ for I := 0 to Length(Plugins) - 1 do
+ begin
+ if (plugin_order[K].ID = Plugins[I].ID) and
+ (plugin_order[K].medley = Plugins[I].medley) then
+ begin
+ Inc(Plugins[I].TimesPlayed);
+ break;
+ end;
+ end;
+ medley := plugin_order[K].medley;
+ nr := plugin_order[K].Nr;
+ surprise := plugin_order[K].surprise;
+ Result := plugin_order[K].ID;
+end;
+
+//----------
+//StartNewParty - Clears the Class and Prepares for new Party
+//----------
+procedure TParty_Session.StartNewParty(NumRounds: Byte);
+var
+ TeamMode: Boolean;
+ Len: Integer;
+ I, J: Integer;
+ NumMedleys: Integer;
+
+begin
+ //Set cur Round to Round 1
+ CurRound := 255;
+
+ //Set Rounds
+ NumMedleys := 0;
+ If (Length(Plugins) >= 1) then
+ begin
+ SetLength (Rounds, NumRounds);
+ For I := 0 to NumRounds-1 do
+ begin
+ PartySession.Rounds[I].Plugin := GetRandomPlugin(PartySession.Rounds[I].Medley,
+ PartySession.Rounds[I].MedleySurprise,
+ PartySession.Rounds[I].PluginNr);
+ PartySession.Rounds[I].Winner := 255;
+
+ if PartySession.Rounds[I].Medley then
+ inc(NumMedleys);
+ end;
+ end
+ else SetLength (Rounds, 0);
+
+ PlayersPlay := Teams.NumTeams;
+
+ //Get Teammode and Set Joker, also set TimesPlayed
+ TeamMode := True;
+ For I := 0 to Teams.NumTeams-1 do
+ begin
+ if Teams.Teaminfo[I].NumPlayers < 2 then
+ begin
+ TeamMode := False;
+ end;
+ //Set Player Attributes
+ For J := 0 to Teams.TeamInfo[I].NumPlayers-1 do
+ begin
+ Teams.TeamInfo[I].Playerinfo[J].TimesPlayed := 0;
+ end;
+ Teams.Teaminfo[I].Joker := Round(NumRounds*0.7)+NumMedleys;
+ Teams.Teaminfo[I].Score := 0;
+ end;
+end;
+
+//----------
+//GetRandomPlayer - Gives back a Random Player to Play next Round
+//----------
+function TParty_Session.GetRandomPlayer(Team: Byte): Byte;
+var
+ I, R: Integer;
+ lowestTP: Byte;
+ NumPwithLTP: Byte;
+begin
+ LowestTP := high(Byte);
+ NumPwithLTP := 0;
+ Result := 0;
+
+ //Search for Players that have not often played yet
+ For I := 0 to Teams.Teaminfo[Team].NumPlayers-1 do
+ begin
+ if (Teams.Teaminfo[Team].Playerinfo[I].TimesPlayed < lowestTP) then
+ begin
+ lowestTP := Teams.Teaminfo[Team].Playerinfo[I].TimesPlayed;
+ NumPwithLTP := 1;
+ end
+ else if (Teams.Teaminfo[Team].Playerinfo[I].TimesPlayed = lowestTP) then
+ begin
+ Inc(NumPwithLTP);
+ end;
+ end;
+
+ //Create Random No
+ R := Random(NumPwithLTP);
+
+ //Search for Random Player
+ For I := 0 to Teams.Teaminfo[Team].NumPlayers-1 do
+ begin
+ if Teams.Teaminfo[Team].Playerinfo[I].TimesPlayed = lowestTP then
+ begin
+ //Player Found
+ if (R = 0) then
+ begin
+ Result := I;
+ Break;
+ end;
+
+ Dec(R);
+ end;
+ end;
+end;
+
+//----------
+//StartNextRound - Prepares ScreenSingModi for Next Round And Load Plugin
+//----------
+procedure TParty_Session.StartRound;
+var
+ I: Integer;
+begin
+ if ((CurRound < high(Rounds)) OR (CurRound = high(CurRound))) then
+ begin
+ //Increase Current Round
+ Inc (CurRound);
+
+ Rounds[CurRound].Winner := 255;
+ DllMan.LoadPlugin(Rounds[CurRound].Plugin);
+
+ //Select Players
+ for I := 0 to Teams.NumTeams-1 do
+ Teams.Teaminfo[I].CurPlayer := GetRandomPlayer(I);
+
+ //Set ScreenSingModie Variables
+ ScreenSingModi.TeamInfo := Teams;
+
+ //Set
+ end;
+end;
+
+//----------
+//IsWinner - Returns True if the Players Bit is set in the Winner Byte
+//----------
+function TParty_Session.IsWinner(Player, Winner: Byte): boolean;
+var
+ Bit: Byte;
+begin
+ Case Player of
+ 0: Bit := 1;
+ 1: Bit := 2;
+ 2: Bit := 4;
+ 3: Bit := 8;
+ 4: Bit := 16;
+ 5: Bit := 32;
+ end;
+
+ Result := ((Winner AND Bit) = Bit);
+end;
+
+//----------
+//GenScores - Inc Scores for Cur. Round
+//----------
+procedure TParty_Session.GenScores;
+var
+ I: Byte;
+begin
+ for I := 0 to Teams.NumTeams-1 do
+ begin
+ if isWinner(I, Rounds[CurRound].Winner) then
+ Inc(Teams.Teaminfo[I].Score);
+ end;
+end;
+
+//----------
+//GetWinnerString - Get String with WinnerTeam Name, when there is more than one Winner than Connect with and or ,
+//----------
+function TParty_Session.GetWinnerString(Round: Byte): String;
+var
+ Winners: Array of String;
+ I: Integer;
+begin
+ Result := Language.Translate('PARTY_NOBODY');
+
+ if (Round > High(Rounds)) then
+ exit;
+
+ if (Rounds[Round].Winner = 0) then
+ begin
+ exit;
+ end;
+
+ if (Rounds[Round].Winner = 255) then
+ begin
+ Result := Language.Translate('PARTY_NOTPLAYEDYET');
+ exit;
+ end;
+
+ SetLength(Winners, 0);
+ for I := 0 to Teams.NumTeams-1 do
+ begin
+ if isWinner(I, Rounds[Round].Winner) then
+ begin
+ SetLength(Winners, Length(Winners) + 1);
+ Winners[high(Winners)] := Teams.TeamInfo[I].Name;
+ end;
+ end;
+ Result := Language.Implode(Winners);
+end;
+
+//----------
+//EndRound - Get Winner from ScreenSingModi and Save Data to RoundArray
+//----------
+procedure TParty_Session.EndRound;
+var
+ I, MaxScore: Integer;
+begin
+ //Copy Winner
+ if Rounds[CurRound].Medley then
+ begin
+ Rounds[CurRound].Winner := 0;
+ MaxScore := 0;
+ for I := 0 to ScreenSingModi.PlayerInfo.NumPlayers-1 do
+ begin
+ ScreenSingModi.PlayerInfo.Playerinfo[I].Percentage :=
+ ScreenSingModi.PlayerInfo.Playerinfo[I].Score div 9999;
+ if (ScreenSingModi.PlayerInfo.Playerinfo[I].Score > MaxScore) then
+ begin
+ MaxScore := ScreenSingModi.PlayerInfo.Playerinfo[I].Score;
+ Case I of
+ 0: Rounds[CurRound].Winner := 1;
+ 1: Rounds[CurRound].Winner := 2;
+ 2: Rounds[CurRound].Winner := 4;
+ 3: Rounds[CurRound].Winner := 8;
+ 4: Rounds[CurRound].Winner := 16;
+ 5: Rounds[CurRound].Winner := 32;
+ end;
+ end
+ else if (ScreenSingModi.PlayerInfo.Playerinfo[I].Score = MaxScore) AND
+ (ScreenSingModi.PlayerInfo.Playerinfo[I].Score <> 0) then
+ begin
+ Case I of
+ 0: Rounds[CurRound].Winner := Rounds[CurRound].Winner OR 1;
+ 1: Rounds[CurRound].Winner := Rounds[CurRound].Winner OR 2;
+ 2: Rounds[CurRound].Winner := Rounds[CurRound].Winner OR 4;
+ 3: Rounds[CurRound].Winner := Rounds[CurRound].Winner OR 8;
+ 4: Rounds[CurRound].Winner := Rounds[CurRound].Winner OR 16;
+ 5: Rounds[CurRound].Winner := Rounds[CurRound].Winner OR 32;
+ end;
+ end;
+ end;
+
+ //When nobody has Points -> Everybody loose
+ if (MaxScore = 0) then
+ Rounds[CurRound].Winner := 0;
+ end else
+ Rounds[CurRound].Winner := ScreenSingModi.Winner;
+ //Set Scores
+ GenScores;
+
+ //Increase TimesPlayed 4 all Players
+ For I := 0 to Teams.NumTeams-1 do
+ Inc(Teams.Teaminfo[I].Playerinfo[Teams.Teaminfo[I].CurPlayer].TimesPlayed);
+
+end;
+
+//----------
+//GetTeamOrder - Gives back the Placing of eacb Team [First Position of Array is Teamnum of first placed Team, ...]
+//----------
+function TParty_Session.GetTeamOrder: TeamOrderArray;
+var
+ I, J: Integer;
+ ATeams: array [0..5] of TeamOrderEntry;
+ TempTeam: TeamOrderEntry;
+begin
+ //Fill Team Array
+ For I := 0 to Teams.NumTeams-1 do
+ begin
+ ATeams[I].Teamnum := I;
+ ATeams[I].Score := Teams.Teaminfo[I].Score;
+ end;
+
+ //Sort Teams
+ for J := 0 to Teams.NumTeams-1 do
+ for I := 1 to Teams.NumTeams-1 do
+ if ATeams[I].Score > ATeams[I-1].Score then
+ begin
+ TempTeam := ATeams[I-1];
+ ATeams[I-1] := ATeams[I];
+ ATeams[I] := TempTeam;
+ end;
+
+ //Copy to Result
+ For I := 0 to Teams.NumTeams-1 do
+ Result[I] := ATeams[I].TeamNum;
+end;
+
+end.
diff --git a/Game/Code/Classes/UPartyM2.pas b/Game/Code/Classes/UPartyM2.pas
new file mode 100644
index 00000000..0b7dd3bd
--- /dev/null
+++ b/Game/Code/Classes/UPartyM2.pas
@@ -0,0 +1,693 @@
+unit UPartyM2;
+
+interface
+
+uses
+ ModiSDK, UDatabase;
+
+type
+ TRoundInfo = record
+ Winner: byte;
+ Plugin: word;
+ Medley: boolean;
+ MedleySurprise: boolean;
+ PluginNr: Integer;
+ Player1: byte;
+ Player2: byte;
+ ScoreP: Integer;
+ ScoreN: Integer;
+ end;
+
+ TPair = record
+ Player1: byte;
+ Player2: byte;
+ played: integer;
+ origin: integer;
+ end;
+
+ TSongsPlayed = record
+ cat: integer;
+ Played: array of integer;
+ end;
+
+ PlayerOrderArray = array[0..8] of byte;
+
+ TPartyPlugin = record
+ ID: byte;
+ TimesPlayed: byte;
+ Medley: boolean;
+ MedleySurprise: boolean;
+ Selected: boolean;
+ Name: string;
+ Desc: string;
+ end;
+
+ TPartySessionM2 = class
+ private
+ Pairs: array of TPair;
+ SongsPlayed: array of TSongsPlayed;
+ function GetRandomPlugin(var medley: boolean; var surprise: boolean; var nr: integer): byte;
+
+ public
+ Rounds: array of TRoundInfo;
+
+ Plugins: array of TPartyPlugin;
+
+ Handicap: THandicapResult;
+ HandicapMode: boolean;
+
+ NumRounds: byte;
+ CurRound: byte;
+ Players: TPlayersInfo;
+ Teams: TTeamInfo;
+ Order: PlayerOrderArray;
+ Option_Plugins: boolean;
+ constructor Create;
+
+ procedure GenScores;
+ procedure StartNewParty(NumPlayers: byte; nRounds: byte);
+ procedure StartRound;
+ procedure EndRound;
+ procedure BuildOrder;
+ procedure AddSongPlayed(cat: Integer; SongNr: integer);
+ procedure ResetSongsPlayed(cat: Integer);
+ function SongPlayed(cat: Integer; SongNr: integer): boolean;
+ function GetSongsPlayed(cat: Integer): integer;
+ function GetCatIndex(cat: Integer): Integer;
+ end;
+
+var
+ PartySessionM2: TPartySessionM2;
+
+implementation
+
+uses
+ UDLLManager,
+ UGraphic,
+ ULanguage,
+ UMain,
+ Math,
+ ULog;
+
+constructor TPartySessionM2.Create;
+begin
+ inherited;
+end;
+
+function TPartySessionM2.SongPlayed(cat: integer; SongNr: integer): boolean;
+var
+ i: integer;
+ played :boolean;
+ catIndex: integer;
+begin
+ played := false;
+ catIndex:=GetCatIndex(cat);
+ for i := 0 to Length(PartySessionM2.SongsPlayed[catIndex].Played) - 1 do
+ begin
+ if (SongNr=PartySessionM2.SongsPlayed[catIndex].Played[i]) then
+ begin
+ played:=true;
+ break;
+ end;
+ end;
+ Result:=played;
+end;
+
+function TPartySessionM2.GetSongsPlayed(cat: integer): Integer;
+var
+ CatIndex: integer;
+begin
+ CatIndex := GetCatIndex(cat);
+ Result := Length(PartySessionM2.SongsPlayed[CatIndex].Played);
+end;
+
+procedure TPartySessionM2.ResetSongsPlayed(cat: Integer);
+var
+ CatIndex: integer;
+begin
+ CatIndex := GetCatIndex(cat);
+ SetLength(SongsPlayed[CatIndex].Played, 0);
+end;
+
+
+procedure TPartySessionM2.AddSongPlayed(cat: integer; SongNr: integer);
+var
+ catIndex: integer;
+begin
+ catIndex:=GetCatIndex(cat);
+ SetLength(PartySessionM2.SongsPlayed[catIndex].Played, Length(PartySessionM2.SongsPlayed[catIndex].Played)+1);
+ PartySessionM2.SongsPlayed[catIndex].Played[Length(PartySessionM2.SongsPlayed[catIndex].Played)-1]:=SongNr;
+end;
+
+function TPartySessionM2.GetCatIndex(cat: Integer): Integer;
+var
+ i: integer;
+ found: boolean;
+begin
+ found:=false;
+ for i := 0 to length(SongsPlayed) - 1 do
+ begin
+ if SongsPlayed[i].cat = cat then
+ begin
+ Result:=i;
+ found:=true;
+ break;
+ end;
+ end;
+ if not found then
+ begin
+ SetLength(SongsPlayed, Length(SongsPlayed)+1);
+ SongsPlayed[Length(SongsPlayed)-1].cat:=cat;
+ Result:=Length(SongsPlayed)-1;
+ end;
+end;
+
+procedure TPartySessionM2.BuildOrder();
+var
+ I,J: integer;
+ cache: byte;
+begin
+ for I := 0 to Players.NumPlayer-2 do
+ begin
+ for J := I+1 to Players.NumPlayer - 1 do
+ begin
+ if (Players.Playerinfo[Order[I]].Points < Players.Playerinfo[Order[J]].Points) then
+ begin
+ cache:=Order[I];
+ Order[I]:=Order[J];
+ Order[J]:=cache;
+ end else if (Players.Playerinfo[Order[I]].Points = Players.Playerinfo[Order[J]].Points) and
+ ((Players.Playerinfo[Order[I]].ScoreP-Players.Playerinfo[Order[I]].ScoreN) <
+ (Players.Playerinfo[Order[J]].ScoreP - Players.Playerinfo[Order[J]].ScoreN)) then
+ begin
+ cache:=Order[I];
+ Order[I]:=Order[J];
+ Order[J]:=cache;
+ end;
+ end;
+ end;
+end;
+
+
+//----------
+//StartNewParty - Reset and prepares for new party
+//----------
+procedure TPartySessionM2.StartNewParty(NumPlayers: byte; nRounds: byte);
+type
+ TFields = record
+ x: byte;
+ y: byte;
+ end;
+
+ TPlayer = record
+ Player: byte;
+ played: integer;
+ end;
+
+ TRN = record
+ rounds: array of integer;
+ end;
+
+ //if the player has played the last 2 rounds
+ function HasPlayed(Pair: TPair; ar: array of TFields; r: integer; num: integer): boolean;
+ begin
+ //first round
+ if r<2 then
+ Result:=false
+
+ //exactly the same combination in last round
+ else if (ar[r-2].x=Pair.Player1) and (ar[r-2].y=Pair.Player2) then
+ Result:=true
+
+ //only two Players => there are no other combinations
+ else if num<3 then
+ Result:=false
+
+ //reversed combination before
+ else if (ar[r-2].x=Pair.Player2) and (ar[r-2].y=Pair.Player1) then
+ Result:=true
+
+ //it is the second round
+ else if r<3 then
+ Result:=false
+
+ //
+ else if
+ ((ar[r-2].x = Pair.Player1) and (ar[r-3].x = Pair.Player1)) or
+ ((ar[r-2].x = Pair.Player1) and (ar[r-3].y = Pair.Player1)) or
+ ((ar[r-2].y = Pair.Player1) and (ar[r-3].x = Pair.Player1)) or
+ ((ar[r-2].y = Pair.Player1) and (ar[r-3].y = Pair.Player1)) or
+ ((ar[r-2].x = Pair.Player2) and (ar[r-3].x = Pair.Player2)) or
+ ((ar[r-2].x = Pair.Player2) and (ar[r-3].y = Pair.Player2)) or
+ ((ar[r-2].y = Pair.Player2) and (ar[r-3].x = Pair.Player2)) or
+ ((ar[r-2].y = Pair.Player2) and (ar[r-3].y = Pair.Player2))then
+
+ Result:=true
+
+ else
+ Result:=false;
+ end;
+
+var
+ Player: array of TPlayer;
+ PlayerOrder: array of integer;
+ Len: integer;
+ I, J, K: integer;
+ arr: array of TFields;
+ temp_pairs: array of TPair;
+ season: integer;
+ num: integer;
+ max_played: integer;
+ max_flag: boolean;
+ must_sing: integer;
+
+ //debug
+ rn: array of TRN;
+
+begin
+ //Set current round to 1
+ CurRound := 255;
+ NumRounds:= nRounds;
+ for I := 0 to 8 do
+ begin
+ Order[I]:=I;
+ end;
+
+ //build all possible pairs
+ SetLength(Pairs, 0);
+ SetLength(Player, NumPlayers);
+ num:=0;
+
+ for I := 0 to NumPlayers - 1 do
+ begin
+ Player[I].Player:=I;
+ Player[I].played:=0;
+ end;
+
+ for I := 1 to NumPlayers - 1 do
+ begin
+ for J := I+1 to NumPlayers do
+ begin
+ SetLength(Pairs, Length(Pairs)+1);
+ Pairs[Length(Pairs)-1].Player1:=I-1;
+ Pairs[Length(Pairs)-1].Player2:=J-1;
+ Pairs[Length(Pairs)-1].played:=0;
+ Pairs[Length(Pairs)-1].origin:=num;
+ inc(num);
+ SetLength(Pairs, Length(Pairs)+1);
+ Pairs[Length(Pairs)-1].Player1:=J-1;
+ Pairs[Length(Pairs)-1].Player2:=I-1;
+ Pairs[Length(Pairs)-1].played:=0;
+ Pairs[Length(Pairs)-1].origin:=num;
+ inc(num);
+ end;
+ end;
+
+ //build the playlist
+ SetLength (arr, 0);
+ SetLength (arr, NumRounds);
+ Randomize;
+
+ for I := 0 to NumRounds - 1 do
+ begin
+ //filter pairs
+ season:=Floor((I)/(NumPlayers*NumPlayers-NumPlayers))+1; //complete season
+
+ SetLength(temp_pairs, 0);
+
+ max_flag := false;
+ max_played := 0;
+
+
+ for K := 0 to NumPlayers - 1 do
+ begin
+ if (max_played<Player[K].played) then
+ max_played := Player[K].played;
+ end;
+
+ J := 0;
+ for K := 0 to NumPlayers - 1 do
+ begin
+ if (max_played>Player[K].played) then
+ inc(J);
+ end;
+
+ must_sing := -1;
+ if J>1 then
+ max_flag := true
+ else if J=1 then
+ begin
+ for K := 0 to NumPlayers - 1 do
+ begin
+ if (max_played>Player[K].played) then
+ must_sing:=K;
+ end;
+ end;
+
+ for J := 0 to Length(Pairs) - 1 do
+ begin
+ if (not HasPlayed(Pairs[J], arr, I+1, NumPlayers)) and
+ (Pairs[J].played<season) then
+ begin
+ if (not max_flag and (must_sing=-1)) or
+ ((must_sing>=0) and (
+ (Pairs[J].Player1=must_sing) or
+ (Pairs[J].Player2=must_sing))) or
+ (max_flag and (
+ (Player[Pairs[J].Player1].played<max_played) and
+ (Player[Pairs[J].Player2].played<max_played))) then
+ begin
+ SetLength(temp_pairs, Length(temp_pairs)+1);
+ temp_pairs[Length(temp_pairs)-1]:=Pairs[J];
+ end;
+ end;
+ end;
+
+ //first fallback
+ if Length(temp_pairs)=0 then
+ begin
+ for J := 0 to Length(Pairs) - 1 do
+ begin
+ if (max_flag and (
+ (Player[Pairs[J].Player1].played<max_played) and
+ (Player[Pairs[J].Player2].played<max_played))) then
+ begin
+ SetLength(temp_pairs, Length(temp_pairs)+1);
+ temp_pairs[Length(temp_pairs)-1]:=Pairs[J];
+ end;
+ end;
+ end;
+
+ //second fallback
+ if Length(temp_pairs)=0 then
+ begin
+ for J := 0 to Length(Pairs) - 1 do
+ begin
+ if (not HasPlayed(Pairs[J], arr, I+1, NumPlayers)) and
+ (Pairs[J].played<season) then
+ begin
+ SetLength(temp_pairs, Length(temp_pairs)+1);
+ temp_pairs[Length(temp_pairs)-1]:=Pairs[J];
+ end;
+ end;
+ end;
+
+ //last fallback
+ if Length(temp_pairs)=0 then
+ begin
+ for J := 0 to Length(Pairs) - 1 do
+ begin
+ SetLength(temp_pairs, Length(temp_pairs)+1);
+ temp_pairs[Length(temp_pairs)-1]:=Pairs[J];
+ end;
+ end;
+
+ num:=Random(Length(temp_pairs));
+
+ inc(Pairs[temp_pairs[num].origin].played);
+ arr[I].x:=temp_pairs[num].Player1;
+ arr[I].y:=temp_pairs[num].Player2;
+
+ inc(Player[arr[I].x].played);
+ inc(Player[arr[I].y].played);
+ end;
+
+ //debug
+ SetLength(rn, NumRounds+1);
+ SetLength(rn[0].rounds, NumPlayers);
+ for I := 1 to NumRounds do
+ begin
+ SetLength(rn[I].rounds, NumPlayers);
+ for J := 0 to NumPlayers - 1 do
+ begin
+ if (arr[I-1].x = J) or (arr[I-1].y = J) then
+ rn[I].rounds[J] := rn[I-1].rounds[J] + 1
+ else
+ rn[I].rounds[J] := rn[I-1].rounds[J];
+ end;
+ end;
+
+ Players.NumPlayer := NumPlayers;
+
+ //Set player attributes
+ for I := 0 to NumPlayers-1 do
+ begin
+ Players.Playerinfo[I].Points := 0;
+ Players.Playerinfo[I].ScoreP:= 0;
+ Players.Playerinfo[I].ScoreN:= 0;
+ Players.Playerinfo[I].Wins:= 0;
+ Players.Playerinfo[I].Defeats:= 0;
+ Players.Playerinfo[I].Draws:= 0;
+ Players.Playerinfo[I].Joker:= 0;
+ end;
+
+ //Set rounds
+ if (Length(Plugins) >= 1) then
+ begin
+ for I := 0 to NumRounds - 1 do
+ begin
+ SetLength (Rounds, I+1);
+ PartySessionM2.Rounds[I].Plugin := GetRandomPlugin(PartySessionM2.Rounds[I].Medley,
+ PartySessionM2.Rounds[I].MedleySurprise,
+ PartySessionM2.Rounds[I].PluginNr);
+
+ PartySessionM2.Rounds[I].Player1:=arr[I].x;
+ PartySessionM2.Rounds[I].Player2:=arr[I].y;
+ PartySessionM2.Rounds[I].ScoreP:=0;
+ PartySessionM2.Rounds[I].ScoreN:=0;
+ end;
+ end
+ else
+ SetLength (Rounds, 0);
+
+ //Reset SongsPlayed-Array
+ SetLength (PartySessionM2.SongsPlayed, 0);
+end;
+
+//----------
+// Returns a number of a random plugin (New Version)
+//----------
+function TPartySessionM2.GetRandomPlugin(var medley: boolean; var surprise: boolean; var nr: integer): byte;
+Type
+ TOrder = record
+ ID: integer;
+ medley: boolean;
+ surprise: boolean;
+ Nr: integer;
+ end;
+
+ function getTimesPlayed(order: TOrder): integer;
+ var
+ I: integer;
+ begin
+ for I := 0 to Length(Plugins) - 1 do
+ begin
+ if (order.ID = Plugins[I].ID) and (order.medley = Plugins[I].medley) then
+ begin
+ Result:=Plugins[I].TimesPlayed;
+ break;
+ end;
+ end;
+ end;
+
+var
+ I, J, K, num: Integer;
+ plugin_order: array of TOrder;
+ temp: TOrder;
+ min: integer;
+
+begin
+ min := high(min);
+ SetLength(plugin_order, Length(Plugins));
+ for I := 0 to Length(Plugins) - 1 do
+ begin
+ plugin_order[I].ID := Plugins[I].ID;
+ plugin_order[I].medley := Plugins[I].Medley;
+ plugin_order[I].surprise := Plugins[I].MedleySurprise;
+ plugin_order[I].Nr := I;
+ if Plugins[I].TimesPlayed < min then
+ min := Plugins[I].TimesPlayed;
+ end;
+
+ //sort ASC by TimesPlayed
+ for J := 0 to Length(Plugins) - 2 do
+ begin
+ for K := J+1 to Length(Plugins) - 1 do
+ begin
+ if getTimesPlayed(plugin_order[J]) > getTimesPlayed(plugin_order[K]) then
+ begin
+ temp := plugin_order[J];
+ plugin_order[J] := plugin_order[K];
+ plugin_order[K] := temp;
+ end;
+ end;
+ end;
+
+ //set filter
+ num := 0;
+ for I := 0 to Length(Plugins) - 1 do
+ begin
+ if Plugins[I].TimesPlayed <= min then
+ Inc(num);
+ end;
+
+ K := random(num);
+ for I := 0 to Length(Plugins) - 1 do
+ begin
+ if (plugin_order[K].ID = Plugins[I].ID) and
+ (plugin_order[K].medley = Plugins[I].medley) then
+ begin
+ Inc(Plugins[I].TimesPlayed);
+ break;
+ end;
+ end;
+ medley := plugin_order[K].medley;
+ surprise := plugin_order[K].surprise;
+ nr := plugin_order[K].Nr;
+ Result := plugin_order[K].ID;
+end;
+
+{**
+ * Prepares ScreenSingModiM2 for next round and loads plugin
+ *}
+procedure TPartySessionM2.StartRound;
+begin
+ if ((CurRound < Length(Rounds)) or (CurRound = high(CurRound))) then
+ begin
+ // Increase Current Round but not beyond its limit
+ // CurRound is set to 255 to begin with!
+ // Ugly solution if you ask me.
+ if CurRound < Length(Rounds) then
+ Inc(CurRound)
+ else
+ CurRound := 0;
+ BuildOrder;
+
+ if CurRound< Length(Rounds) then
+ begin
+ Rounds[CurRound].Winner := 255;
+ DllMan.LoadPlugin(Rounds[CurRound].Plugin);
+
+ //Select Players
+ Teams.NumTeams:=2;
+
+ Teams.Teaminfo[0].Name := 'T1';
+ Teams.Teaminfo[0].Score:=0;
+ Teams.Teaminfo[0].Joker:=5;
+ Teams.Teaminfo[0].CurPlayer:=0;
+ Teams.Teaminfo[0].NumPlayers:=1;
+ Teams.Teaminfo[0].Playerinfo[0].Name:=Players.Playerinfo[Rounds[CurRound].Player1].Name;
+ Teams.Teaminfo[0].Playerinfo[0].TimesPlayed:=0;
+
+ Teams.Teaminfo[1].Name := 'T2';
+ Teams.Teaminfo[1].Score:=0;
+ Teams.Teaminfo[1].Joker:=0;
+ Teams.Teaminfo[1].CurPlayer:=0;
+ Teams.Teaminfo[1].NumPlayers:=1;
+ Teams.Teaminfo[1].Playerinfo[0].Name:=Players.Playerinfo[Rounds[CurRound].Player2].Name;
+ Teams.Teaminfo[1].Playerinfo[0].TimesPlayed:=0;
+
+ if HandicapMode then
+ Handicap := DataBase.GetHandicap(Players.Playerinfo[Rounds[CurRound].Player1].Name,
+ Players.Playerinfo[Rounds[CurRound].Player2].Name)
+ else
+ begin
+ Handicap.P1m := 1;
+ Handicap.P2m := 1;
+ end;
+
+ //Set ScreenSingModi Variables
+ ScreenSingModi.TeamInfo := Teams;
+ end;
+ end;
+
+end;
+
+//----------
+//EndRound - Get Winner from ScreenSingModi and Save Data to RoundArray
+//----------
+procedure TPartySessionM2.EndRound;
+begin
+ //Copy Winner
+ if Rounds[CurRound].Medley then
+ begin
+ if (PlaylistMedley.Stats[Length(PlaylistMedley.Stats)-1].Player[0].ScoreTotalI>
+ PlaylistMedley.Stats[Length(PlaylistMedley.Stats)-1].Player[1].ScoreTotalI) then
+ Rounds[CurRound].Winner := 1
+ else if (PlaylistMedley.Stats[Length(PlaylistMedley.Stats)-1].Player[0].ScoreTotalI<
+ PlaylistMedley.Stats[Length(PlaylistMedley.Stats)-1].Player[1].ScoreTotalI) then
+ Rounds[CurRound].Winner := 2
+ else
+ Rounds[CurRound].Winner := 0;
+
+ ScreenSingModi.PlayerInfo.Playerinfo[0].Score := PlaylistMedley.Stats[Length(PlaylistMedley.Stats)-1].Player[0].ScoreTotalI;
+ ScreenSingModi.PlayerInfo.Playerinfo[1].Score := PlaylistMedley.Stats[Length(PlaylistMedley.Stats)-1].Player[1].ScoreTotalI;
+
+ end else
+ Rounds[CurRound].Winner := ScreenSingModi.Winner;
+
+ //Set Scores
+ GenScores;
+
+ //Update Player Stats
+
+end;
+
+//----------
+//GenScores - increase scores for current round
+//----------
+procedure TPartySessionM2.GenScores;
+begin
+ //Filter "Hau den Lukas"
+ if (DLLMan.Plugins[Rounds[CurRound].Plugin].Name='PLUGIN_HAUDENLUKAS_NAME') then
+ begin
+ ScreenSingModi.PlayerInfo.Playerinfo[0].Score := ScreenSingModi.PlayerInfo.Playerinfo[0].Score*1000;
+ ScreenSingModi.PlayerInfo.Playerinfo[1].Score := ScreenSingModi.PlayerInfo.Playerinfo[1].Score*1000;
+ end;
+
+
+ //Copy Scores to Rounds
+ Rounds[CurRound].ScoreP:=round(ScreenSingModi.PlayerInfo.Playerinfo[0].Score*Handicap.P1m);
+ Rounds[CurRound].ScoreN:=round(ScreenSingModi.PlayerInfo.Playerinfo[1].Score*Handicap.P2m);
+
+ //Update PlayerStats
+ Players.Playerinfo[Rounds[CurRound].Player1].ScoreP := Rounds[CurRound].ScoreP +
+ Players.Playerinfo[Rounds[CurRound].Player1].ScoreP;
+ Players.Playerinfo[Rounds[CurRound].Player1].ScoreN := Rounds[CurRound].ScoreN +
+ Players.Playerinfo[Rounds[CurRound].Player1].ScoreN;
+
+ Players.Playerinfo[Rounds[CurRound].Player2].ScoreP := Rounds[CurRound].ScoreN +
+ Players.Playerinfo[Rounds[CurRound].Player2].ScoreP;
+ Players.Playerinfo[Rounds[CurRound].Player2].ScoreN := Rounds[CurRound].ScoreP +
+ Players.Playerinfo[Rounds[CurRound].Player2].ScoreN;
+
+ inc(Players.Playerinfo[Rounds[CurRound].Player1].NumPlayed);
+ inc(Players.Playerinfo[Rounds[CurRound].Player2].NumPlayed);
+
+ if (HandicapMode and (Rounds[CurRound].ScoreP>Rounds[CurRound].ScoreN)) or
+ (not HandicapMode and (Rounds[CurRound].Winner = 1)) then //Player1 is the winner
+ begin
+ inc(Players.Playerinfo[Rounds[CurRound].Player1].Wins);
+ inc(Players.Playerinfo[Rounds[CurRound].Player2].Defeats);
+
+ inc(Players.Playerinfo[Rounds[CurRound].Player1].Points);
+ inc(Players.Playerinfo[Rounds[CurRound].Player1].Points);
+ end else if (HandicapMode and (Rounds[CurRound].ScoreP<Rounds[CurRound].ScoreN)) or
+ (not HandicapMode and (Rounds[CurRound].Winner = 2)) then //Player2 is the winner
+ begin
+ inc(Players.Playerinfo[Rounds[CurRound].Player2].Wins);
+ inc(Players.Playerinfo[Rounds[CurRound].Player1].Defeats);
+
+ inc(Players.Playerinfo[Rounds[CurRound].Player2].Points);
+ inc(Players.Playerinfo[Rounds[CurRound].Player2].Points);
+ end else //Draw
+ begin
+ inc(Players.Playerinfo[Rounds[CurRound].Player1].Draws);
+ inc(Players.Playerinfo[Rounds[CurRound].Player2].Draws);
+
+ inc(Players.Playerinfo[Rounds[CurRound].Player1].Points);
+ inc(Players.Playerinfo[Rounds[CurRound].Player2].Points);
+ end;
+end;
+
+end.
diff --git a/Game/Code/Classes/UPlaylist.pas b/Game/Code/Classes/UPlaylist.pas
new file mode 100644
index 00000000..e3f68239
--- /dev/null
+++ b/Game/Code/Classes/UPlaylist.pas
@@ -0,0 +1,453 @@
+unit UPlaylist;
+
+interface
+
+type
+ TPlaylistItem = record
+ Artist: String;
+ Title: String;
+ SongID: Integer;
+ end;
+
+ APlaylistItem = array of TPlaylistItem;
+
+ TPlaylist = record
+ Name: String;
+ Filename: String;
+ Items: APlaylistItem;
+ end;
+
+ APlaylist = array of TPlaylist;
+
+ //----------
+ //TPlaylistManager - Class for Managing Playlists (Loading, Displaying, Saving)
+ //----------
+ TPlaylistManager = class
+ private
+
+ public
+ Mode: Byte; //Current Playlist Mode for SongScreen
+ CurPlayList: Cardinal;
+ CurItem: Cardinal;
+
+ Playlists: APlaylist;
+
+ constructor Create;
+ Procedure LoadPlayLists;
+ Function LoadPlayList(Index: Cardinal; Filename: String): Boolean;
+ Procedure SavePlayList(Index: Cardinal);
+
+ Procedure SetPlayList(Index: Cardinal);
+
+ Function AddPlaylist(Name: String): Cardinal;
+ Procedure DelPlaylist(const Index: Cardinal);
+
+ Procedure AddItem(const SongID: Cardinal; const iPlaylist: Integer = -1);
+ Procedure DelItem(const iItem: Cardinal; const iPlaylist: Integer = -1);
+
+ Procedure GetNames(var PLNames: array of String);
+ Function GetIndexbySongID(const SongID: Cardinal; const iPlaylist: Integer = -1): Integer;
+ end;
+
+ {Modes:
+ 0: Standard Mode
+ 1: Category Mode
+ 2: PlayList Mode}
+
+ var
+ PlayListMan: TPlaylistManager;
+
+
+implementation
+uses USongs, ULog, UFiles, UGraphic, UThemes, SysUtils;
+
+//----------
+//Create - Construct Class - Dummy for now
+//----------
+constructor TPlayListManager.Create;
+begin
+ LoadPlayLists;
+end;
+
+//----------
+//LoadPlayLists - Load list of Playlists from PlayList Folder
+//----------
+Procedure TPlayListManager.LoadPlayLists;
+var
+ SR: TSearchRec;
+ Len: Integer;
+begin
+ SetLength(Playlists, 0);
+
+ if FindFirst(PlayListPath + '*.upl', 0, SR) = 0 then
+ begin
+ repeat
+ Len := Length(Playlists);
+ SetLength(Playlists, Len +1);
+
+ if not LoadPlayList (Len, Sr.Name) then
+ SetLength(Playlists, Len);
+
+ until FindNext(SR) <> 0;
+ FindClose(SR);
+ end;
+end;
+
+//----------
+//LoadPlayList - Load a Playlist in the Array
+//----------
+Function TPlayListManager.LoadPlayList(Index: Cardinal; Filename: String): Boolean;
+ var
+ F: TextFile;
+ Line: String;
+ PosDelimiter: Integer;
+ SongID: Integer;
+ Len: Integer;
+
+ Function FindSong(Artist, Title: String): Integer;
+ var I: Integer;
+ begin
+ Result := -1;
+
+ For I := low(CatSongs.Song) to high(CatSongs.Song) do
+ begin
+ if (CatSongs.Song[I].Title = Title) AND (CatSongs.Song[I].Artist = Artist) then
+ begin
+ Result := I;
+ Break;
+ end;
+ end;
+ end;
+begin
+ if not FileExists(PlayListPath + Filename) then
+ begin
+ Log.LogError('Could not load Playlist: ' + Filename);
+ Result := False;
+ Exit;
+ end;
+ Result := True;
+
+ //Load File
+ AssignFile(F, PlayListPath + FileName);
+ Reset(F);
+
+ //Set Filename
+ PlayLists[Index].Filename := Filename;
+ PlayLists[Index].Name := '';
+
+ //Read Until End of File
+ While not Eof(F) do
+ begin
+ //Read Curent Line
+ Readln(F, Line);
+
+ if (Length(Line) > 0) then
+ begin
+ PosDelimiter := Pos(':', Line);
+ if (PosDelimiter <> 0) then
+ begin
+ //Comment or Name String
+ if (Line[1] = '#') then
+ begin
+ //Found Name Value
+ if (Uppercase(Trim(copy(Line, 2, PosDelimiter - 2))) = 'NAME') then
+ PlayLists[Index].Name := Trim(copy(Line, PosDelimiter + 1,Length(Line) - PosDelimiter))
+
+ end
+ //Song Entry
+ else
+ begin
+ SongID := FindSong(Trim(copy(Line, 1, PosDelimiter - 1)), Trim(copy(Line, PosDelimiter + 1, Length(Line) - PosDelimiter)));
+ if (SongID <> -1) then
+ begin
+ Len := Length(PlayLists[Index].Items);
+ SetLength(PlayLists[Index].Items, Len + 1);
+
+ PlayLists[Index].Items[Len].SongID := SongID;
+
+ PlayLists[Index].Items[Len].Artist := Trim(copy(Line, 1, PosDelimiter - 1));
+ PlayLists[Index].Items[Len].Title := Trim(copy(Line, PosDelimiter + 1, Length(Line) - PosDelimiter));
+ end
+ else Log.LogError('Could not find Song in Playlist: ' + PlayLists[Index].Filename + ', ' + Line);
+ end;
+ end;
+ end;
+ end;
+
+ //If no special name is given, use Filename
+ if PlayLists[Index].Name = '' then
+ begin
+ PlayLists[Index].Name := ChangeFileExt(FileName, '');
+ end;
+
+ //Finish (Close File)
+ CloseFile(F);
+end;
+
+//----------
+//SavePlayList - Saves the specified Playlist
+//----------
+Procedure TPlayListManager.SavePlayList(Index: Cardinal);
+var
+ F: TextFile;
+ I: Integer;
+begin
+ if (Not FileExists(PlaylistPath + Playlists[Index].Filename)) OR (Not FileisReadOnly(PlaylistPath + Playlists[Index].Filename)) then
+ begin
+
+ //open File for Rewriting
+ AssignFile(F, PlaylistPath + Playlists[Index].Filename);
+ try
+ try
+ Rewrite(F);
+
+ //Write Version (not nessecary but helpful)
+ WriteLn(F, '######################################');
+ WriteLn(F, '#Ultrastar Deluxe Playlist Format v1.0');
+ WriteLn(F, '#Playlist "' + Playlists[Index].Name + '" with ' + InttoStr(Length(Playlists[Index].Items)) + ' Songs.');
+ WriteLn(F, '######################################');
+
+ //Write Name Information
+ WriteLn(F, '#Name: ' + Playlists[Index].Name);
+
+ //Write Song Information
+ WriteLn(F, '#Songs:');
+
+ For I := 0 to high(Playlists[Index].Items) do
+ begin
+ WriteLn(F, Playlists[Index].Items[I].Artist + ' : ' + Playlists[Index].Items[I].Title);
+ end;
+ except
+ log.LogError('Could not write Playlistfile "' + Playlists[Index].Name + '"');
+ end;
+ finally
+ CloseFile(F);
+ end;
+ end;
+end;
+
+//----------
+//SetPlayList - Display a Playlist in CatSongs
+//----------
+Procedure TPlayListManager.SetPlayList(Index: Cardinal);
+var
+ I: Integer;
+begin
+ If (Index > High(PlayLists)) then
+ exit;
+
+ //Hide all Songs
+ For I := 0 to high(CatSongs.Song) do
+ CatSongs.Song[I].Visible := False;
+
+ //Show Songs in PL
+ For I := 0 to high(PlayLists[Index].Items) do
+ begin
+ CatSongs.Song[PlayLists[Index].Items[I].SongID].Visible := True;
+ end;
+
+ //Set CatSongsMode + Playlist Mode
+ CatSongs.CatNumShow := -3;
+ Mode := 2;
+
+ //Set CurPlaylist
+ CurPlaylist := Index;
+
+ //Show Cat in Topleft:
+ ScreenSong.ShowCatTLCustom(Format(Theme.Playlist.CatText,[Playlists[Index].Name]));
+
+ //Fix SongSelection
+ ScreenSong.Interaction := 0;
+ ScreenSong.SelectNext;
+ ScreenSong.FixSelected;
+
+ //Play correct Music
+ ScreenSong.ChangeMusic;
+end;
+
+//----------
+//AddPlaylist - Adds a Playlist and Returns the Index
+//----------
+Function TPlayListManager.AddPlaylist(Name: String): Cardinal;
+var I: Integer;
+begin
+ Result := Length(Playlists);
+ SetLength(Playlists, Result + 1);
+
+ Playlists[Result].Name := Name;
+
+ I := 1;
+
+ if (not FileExists(PlaylistPath + Name + '.upl')) then
+ Playlists[Result].Filename := Name + '.upl'
+ else
+ begin
+ repeat
+ Inc(I);
+ until not FileExists(PlaylistPath + Name + InttoStr(I) + '.upl');
+ Playlists[Result].Filename := Name + InttoStr(I) + '.upl';
+ end;
+
+ //Save new Playlist
+ SavePlayList(Result);
+end;
+
+//----------
+//DelPlaylist - Deletes a Playlist
+//----------
+Procedure TPlayListManager.DelPlaylist(const Index: Cardinal);
+var
+ I: Integer;
+ Filename: String;
+begin
+ If Index > High(Playlists) then
+ Exit;
+
+ Filename := PlaylistPath + Playlists[Index].Filename;
+
+ //If not FileExists or File is not Writeable then exit
+ If (Not FileExists(Filename)) OR (FileisReadOnly(Filename)) then
+ Exit;
+
+
+ //Delete Playlist from FileSystem
+ if Not DeleteFile(Filename) then
+ Exit;
+
+ //Delete Playlist from Array
+ //move all PLs to the Hole
+ For I := Index to High(Playlists)-1 do
+ PlayLists[I] := PlayLists[I+1];
+
+ //Delete last Playlist
+ SetLength (Playlists, High(Playlists));
+
+ //If Playlist is Displayed atm
+ //-> Display Songs
+ if (CatSongs.CatNumShow = -3) and (Index = CurPlaylist) then
+ begin
+ ScreenSong.UnLoadDetailedCover;
+ ScreenSong.HideCatTL;
+ CatSongs.SetFilter('', 0);
+ ScreenSong.Interaction := 0;
+ ScreenSong.FixSelected;
+ ScreenSong.ChangeMusic;
+ end;
+end;
+
+//----------
+//AddItem - Adds an Item to a specific Playlist
+//----------
+Procedure TPlayListManager.AddItem(const SongID: Cardinal; const iPlaylist: Integer);
+var
+ P: Cardinal;
+ Len: Cardinal;
+begin
+ if iPlaylist = -1 then
+ P := CurPlaylist
+ else if (iPlaylist >= 0) AND (iPlaylist <= high(Playlists)) then
+ P := iPlaylist
+ else
+ exit;
+
+ if (SongID <= High(CatSongs.Song)) AND (NOT CatSongs.Song[SongID].Main) then
+ begin
+ Len := Length(Playlists[P].Items);
+ SetLength(Playlists[P].Items, Len + 1);
+
+ Playlists[P].Items[Len].SongID := SongID;
+ Playlists[P].Items[Len].Title := CatSongs.Song[SongID].Title;
+ Playlists[P].Items[Len].Artist := CatSongs.Song[SongID].Artist;
+
+ //Save Changes
+ SavePlayList(P);
+
+ //Correct Display when Editing current Playlist
+ if (CatSongs.CatNumShow = -3) and (P = CurPlaylist) then
+ SetPlaylist(P);
+ end;
+end;
+
+//----------
+//DelItem - Deletes an Item from a specific Playlist
+//----------
+Procedure TPlayListManager.DelItem(const iItem: Cardinal; const iPlaylist: Integer);
+var
+ I: Integer;
+ P: Cardinal;
+begin
+ if iPlaylist = -1 then
+ P := CurPlaylist
+ else if (iPlaylist >= 0) AND (iPlaylist <= high(Playlists)) then
+ P := iPlaylist
+ else
+ exit;
+
+ if (iItem <= high(Playlists[P].Items)) then
+ begin
+ //Move all entrys behind deleted one to Front
+ For I := iItem to High(Playlists[P].Items) - 1 do
+ Playlists[P].Items[I] := Playlists[P].Items[I + 1];
+
+ //Delete Last Entry
+ SetLength(PlayLists[P].Items, Length(PlayLists[P].Items) - 1);
+
+ //Save Changes
+ SavePlayList(P);
+ end;
+
+ //Delete Playlist if Last Song is deleted
+ if (Length(PlayLists[P].Items) = 0) then
+ begin
+ DelPlaylist(P);
+ end
+ //Correct Display when Editing current Playlist
+ else if (CatSongs.CatNumShow = -3) and (P = CurPlaylist) then
+ SetPlaylist(P);
+end;
+
+//----------
+//GetNames - Writes Playlist Names in a Array
+//----------
+Procedure TPlayListManager.GetNames(var PLNames: array of String);
+var
+ I: Integer;
+ Len: Integer;
+begin
+ Len := High(Playlists);
+
+ if (Length(PLNames) <> Len + 1) then
+ exit;
+
+ For I := 0 to Len do
+ PLNames[I] := Playlists[I].Name;
+end;
+
+//----------
+//GetIndexbySongID - Returns Index in the specified Playlist of the given Song
+//----------
+Function TPlayListManager.GetIndexbySongID(const SongID: Cardinal; const iPlaylist: Integer): Integer;
+var
+ P: Integer;
+ I: Integer;
+begin
+ if iPlaylist = -1 then
+ P := CurPlaylist
+ else if (iPlaylist >= 0) AND (iPlaylist <= high(Playlists)) then
+ P := iPlaylist
+ else
+ exit;
+
+ Result := -1;
+
+ For I := 0 to high(Playlists[P].Items) do
+ begin
+ if (Playlists[P].Items[I].SongID = SongID) then
+ begin
+ Result := I;
+ Break;
+ end;
+ end;
+end;
+
+end.
diff --git a/Game/Code/Classes/UPliki.pas b/Game/Code/Classes/UPliki.pas
new file mode 100644
index 00000000..f7692990
--- /dev/null
+++ b/Game/Code/Classes/UPliki.pas
@@ -0,0 +1,833 @@
+unit UPliki;
+
+interface
+
+uses USongs, SysUtils, ULog, UMusic;
+
+procedure InitializePaths;
+function ReadHeader(var Song: TSong): boolean;
+function SkanujPlik(var Song: TSong): boolean;
+procedure CzyscNuty;
+function WczytajCzesci(Name: string): boolean;
+function SaveSong(Song: TSong; Czesc: TCzesci; Name: string; Relative: boolean): boolean;
+function SaveSongDebug(Song: TSong; Czesc: TCzesci; Name: string; Relative: boolean): boolean;
+
+var
+ GamePath: string;
+ SoundPath: string;
+ SongPath: string;
+ LogPath: string;
+ ThemePath: string;
+ ScreenshotsPath: string;
+ CoversPath: string;
+ LanguagesPath: string;
+ PluginPath: string;
+ PlayListPath: string;
+
+ Plik: TextFile; // all procedures in this unit operates on this file
+ PlikC: char;
+ Lineno: integer;
+
+ // variables available for all procedures
+ Base: array[0..1] of integer;
+ Rel: array[0..1] of integer;
+ Mult: integer;
+ MultBPM: integer;
+
+implementation
+uses TextGL, UIni, UMain, math;
+
+procedure InitializePaths;
+begin
+ GamePath := ExtractFilePath(ParamStr(0));
+ SoundPath := GamePath + 'Sounds\';
+ SongPath := GamePath + 'Songs\';
+ LogPath := GamePath;
+ ThemePath := GamePath + 'Themes\';
+ ScreenshotsPath := GamePath + 'Screenshots\';
+ CoversPath := GamePath + 'Covers\';
+ LanguagesPath := GamePath + 'Languages\';
+ //Modi Loader
+ PluginPath := GamePath + 'Plugins\';
+
+ PlaylistPath := GamePath + 'Playlists\';
+
+ DecimalSeparator := ',';
+end;
+
+function ReadHeader(var Song: TSong): boolean;
+var
+ TempC: char;
+ Tekst: string;
+ Done: integer;
+begin
+ // clear
+ Song.Title := '';
+ Song.Artist := '';
+ Song.Genre := 'Unknown';
+ Song.Edition := 'Unknown';
+ Song.Language := 'Unknown'; //Language Patch
+ Song.Mp3 := '';
+ Song.BPM := 0;
+ Song.GAP := 0;
+ Song.Start := 0;
+ Song.Finish := 0;
+ Song.Background := '';
+ Song.Video := '';
+ Song.VideoGAP := 0;
+ Song.NotesGAP := 0;
+ Song.Resolution := 4;
+
+ //Creator Patch
+ Song.Creator := '';
+
+ Done := 0;
+
+ //Editor Error Reporting Hack
+ LineNo := 0;
+ try
+
+ // read
+ Read(Plik, PlikC);
+ while (PlikC = '#') do begin
+ ReadLn(Plik, Tekst);
+
+ //Editor Error Reporting Hack
+ Inc (LineNo);
+
+ //Header Improvements Patch
+
+ if UpperCase(Copy(Tekst, 1, 6)) = 'TITLE:' then begin
+ Delete(Tekst, 1, 6);
+ Song.Title := Trim(Tekst);
+ Tekst := '';
+ Done := Done or 1;
+ end
+
+ else if UpperCase(Copy(Tekst, 1, 7)) = 'ARTIST:' then begin
+ Delete(Tekst, 1, 7);
+ Song.Artist := Trim(Tekst);
+ Tekst := '';
+ Done := Done or 2;
+ end
+
+ else if UpperCase(Copy(Tekst, 1, 4)) = 'MP3:' then begin
+ Delete(Tekst, 1, 4);
+ Song.Mp3 := Trim(Tekst);
+ Tekst := '';
+ Done := Done or 4;
+ end
+
+ else if UpperCase(Copy(Tekst, 1, 8)) = 'CREATOR:' then begin // this goes for edit
+ Delete(Tekst, 1, 8);
+ Song.Creator := Trim(Tekst);
+ Tekst := '';
+ end
+
+ else if UpperCase(Copy(Tekst, 1, 6)) = 'GENRE:' then begin // this goes for edit
+ Delete(Tekst, 1, 6);
+ Song.Genre := Trim(Tekst);
+ Tekst := '';
+ end
+
+ else if UpperCase(Copy(Tekst, 1, 8)) = 'EDITION:' then begin // this goes for edit
+ Delete(Tekst, 1, 8);
+ Song.Edition := Trim(Tekst);
+ Tekst := '';
+ end
+
+ else if UpperCase(Copy(Tekst, 1, 9)) = 'LANGUAGE:' then begin // this goes for edit
+ Delete(Tekst, 1, 9);
+ Song.Language := Trim(Tekst);
+ Tekst := '';
+ end
+
+ else if UpperCase(Copy(Tekst, 1, 6)) = 'COVER:' then begin
+ Delete(Tekst, 1, 6);
+ Song.Cover := Trim(Tekst);
+ Tekst := '';
+ end
+
+ else if UpperCase(Copy(Tekst, 1, 11)) = 'BACKGROUND:' then begin
+ Delete(Tekst, 1, 11);
+ Song.Background := Trim(Tekst);
+ Tekst := '';
+ end
+
+ else if UpperCase(Copy(Tekst, 1, 6)) = 'VIDEO:' then begin
+ Delete(Tekst, 1, 6);
+ Song.Video := Trim(Tekst);
+ Tekst := '';
+ end
+
+ else if UpperCase(Copy(Tekst, 1, 9)) = 'VIDEOGAP:' then begin
+ Delete(Tekst, 1, 9);
+
+ //Change . to , Mod by Whiteshark :P
+ if (Pos('.',Tekst) <> 0) then
+ begin
+ Tekst[Pos('.',Tekst)] := ',';
+ //Little Annonce for the User
+ Log.LogError('VideoGap Seperator wrong in SongHeader: ' + Song.FileName + ' [Corrected for this Session]');
+ end;
+
+ Song.VideoGAP := StrToFloat(Tekst);
+ Tekst := ''
+ end
+
+ else if UpperCase(Copy(Tekst, 1, 9)) = 'NOTESGAP:' then begin
+ Delete(Tekst, 1, 9);
+ Song.NotesGAP := StrToInt(Tekst);
+ Tekst := ''
+ end
+
+ else if UpperCase(Copy(Tekst, 1, 9)) = 'RELATIVE:' then begin
+ Delete(Tekst, 1, 9);
+ if LowerCase(Tekst) = 'yes' then Song.Relative := true;
+ end
+
+ else if UpperCase(Copy(Tekst, 1, 6)) = 'START:' then begin
+ Delete(Tekst, 1, 6);
+ Song.Start := StrToFloat(Tekst);
+// Muzyka.Start := StrToInt(Tekst);
+ end
+
+ else if UpperCase(Copy(Tekst, 1, 4)) = 'END:' then begin
+ Delete(Tekst, 1, 4);
+ Song.Finish := StrToInt(Tekst);
+ end
+
+ else if UpperCase(Copy(Tekst, 1, 11)) = 'RESOLUTION:' then begin
+ Delete(Tekst, 1, 11);
+ Song.Resolution := StrToInt(Tekst);
+ end
+
+ else if UpperCase(Copy(Tekst, 1, 4)) = 'BPM:' then begin
+ Delete(Tekst, 1, 4);
+
+// Muzyka.BPMOld := StrToFloat(Tekst) * Mult * MultBPM; // old system
+
+ (* new system with variable BPM *)
+// Muzyka.BPMOld := 50;
+
+ //Change . to , Mod by Whiteshark :P
+ if (Pos('.',Tekst) <> 0) then
+ begin
+ Tekst[Pos('.',Tekst)] := ',';
+ //Little Annonce for the User
+ Log.LogError('BPM Seperator wrong in SongHeader: ' + Song.FileName + ' [Corrected for this Session]');
+ end;
+
+ SetLength(Song.BPM, 1);
+ Song.BPM[0].StartBeat := 0;
+ Song.BPM[0].BPM := StrToFloat(Tekst) * Mult * MultBPM;
+ Tekst := '';
+ Done := Done or 8;
+ end
+
+ else if UpperCase(Copy(Tekst, 1, 4)) = 'GAP:' then begin
+ Delete(Tekst, 1, 4);
+ Song.GAP := StrToFloat(Tekst);
+ Tekst := '';
+// Muzyka.GAP := StrToFloat(Tekst);
+// Done := Done or 16;
+ end;
+
+ //Header Improvements Patch Ende
+
+ Read(Plik, PlikC);
+ end;
+
+ //Editor Error Reporting Hack
+ except //An Error happened<- bad english :P
+ Log.LogError('An Error occured reading Line ' + inttostr(LineNo) + ' from SongHeader: ' + Song.FileName);
+ Halt;
+ end;
+ //Editor Error Reporting Hack End
+
+ if Song.Background = '' then begin
+ Song.Background := Songs.FindSongFile(Song.Path, '*[BG].jpg');
+ end;
+
+ if (Done and 15) = 15 then Result := true
+ else Result := false;
+end;
+
+function SkanujPlik(var Song: TSong): boolean;
+var
+ Done: integer;
+ Tekst: string;
+ C: integer; // category
+ P: integer; // position
+begin
+// try
+ AssignFile(Plik, Song.Path + Song.FileName);
+ Reset(Plik);
+
+ Result := ReadHeader(Song);
+
+{ ReadLn(Plik, Tekst);
+ while (Copy(Tekst, 1, 1) = '#') do begin
+ if Copy(Tekst, 1, 10) = '#CATEGORY:' then begin
+ Delete(Tekst, 1, 10);
+
+ Trim(Tekst);
+ while (Length(Tekst) > 0) do begin
+ C := Length(Song.Category);
+ SetLength(Song.Category, C+1);
+
+ P := Pos(',', Tekst);
+ if P = 0 then P := Length(Tekst);
+ Song.Category[C] := Copy(Tekst, 1, P);
+
+ Delete(Tekst, 1, P);
+ Trim(Tekst);
+ end;
+
+ end;}
+
+
+end;
+
+procedure CzyscNuty;
+var
+ Pet: integer;
+begin
+ SetLength(Czesci, Length(Player));
+ SetLength(AktSong.BPM, 0);
+ for Pet := 0 to High(Player) do begin
+ SetLength(Czesci[Pet].Czesc, 1);
+ SetLength(Czesci[Pet].Czesc[0].Nuta, 0);
+ Czesci[Pet].Czesc[0].Lyric := '';
+ Czesci[Pet].Czesc[0].LyricWidth := 0;
+ Player[pet].Score := 0;
+ Player[pet].IlNut := 0;
+ Player[pet].HighNut := -1;
+ end;
+end;
+
+procedure DodajNute(NrCzesci: integer; TypeP: char; StartP, DurationP, NoteP: integer; LyricS: string);
+var
+ Space: boolean;
+begin
+ case Ini.Solmization of
+ 1: // european
+ begin
+ case (NoteP mod 12) of
+ 0..1: LyricS := ' do ';
+ 2..3: LyricS := ' re ';
+ 4: LyricS := ' mi ';
+ 5..6: LyricS := ' fa ';
+ 7..8: LyricS := ' sol ';
+ 9..10: LyricS := ' la ';
+ 11: LyricS := ' si ';
+ end;
+ end;
+ 2: // japanese
+ begin
+ case (NoteP mod 12) of
+ 0..1: LyricS := ' do ';
+ 2..3: LyricS := ' re ';
+ 4: LyricS := ' mi ';
+ 5..6: LyricS := ' fa ';
+ 7..8: LyricS := ' so ';
+ 9..10: LyricS := ' la ';
+ 11: LyricS := ' shi ';
+ end;
+ end;
+ 3: // american
+ begin
+ case (NoteP mod 12) of
+ 0..1: LyricS := ' do ';
+ 2..3: LyricS := ' re ';
+ 4: LyricS := ' mi ';
+ 5..6: LyricS := ' fa ';
+ 7..8: LyricS := ' sol ';
+ 9..10: LyricS := ' la ';
+ 11: LyricS := ' ti ';
+ end;
+ end;
+ end; // case
+
+// Log.LogStatus('Czesc: ' + IntToStr(Czesci[NrCzesci].High), 'DodajNute');
+// Log.LogStatus('Dodano: [' + IntToStr(NrCzesci) + '] ' + IntToStr(StartP) + ' '
+// + IntToStr(DurationP) + ' '+ IntToStr(NoteP) + ' ' + LyricS, 'DodajNute');
+
+{ Delete(LyricS, 1, 1);
+ Space := false;
+ if Copy(LyricS, Length(LyricS), 1) = ' ' then begin
+ Space := true;
+ Delete(LyricS, Length(LyricS), 1);
+ end;
+ if LyricS = 'a' then LyricS := chr($B1);
+ if LyricS = 'i' then LyricS := chr($B2);
+ if LyricS = 'u' then LyricS := chr($B3);
+ if LyricS = 'e' then LyricS := chr($B4);
+ if LyricS = 'o' then LyricS := chr($B5);
+
+ if LyricS = 'ka' then LyricS := chr($B6);
+ if LyricS = 'ki' then LyricS := chr($B7);
+ if LyricS = 'ku' then LyricS := chr($B8);
+ if LyricS = 'ke' then LyricS := chr($B9);
+ if LyricS = 'ko' then LyricS := chr($BA);
+
+ if LyricS = 'ga' then LyricS := chr($B6) + chr($DE);
+ if LyricS = 'gi' then LyricS := chr($B7) + chr($DE);
+ if LyricS = 'gu' then LyricS := chr($B8) + chr($DE);
+ if LyricS = 'ge' then LyricS := chr($B9) + chr($DE);
+ if LyricS = 'go' then LyricS := chr($BA) + chr($DE);
+
+ if LyricS = 'sa' then LyricS := chr($BB);
+ if LyricS = 'shi' then LyricS := chr($BC);
+ if LyricS = 'su' then LyricS := chr($BD);
+ if LyricS = 'se' then LyricS := chr($BE);
+ if LyricS = 'so' then LyricS := chr($BF);
+
+ if LyricS = 'za' then LyricS := chr($BB) + chr($DE);
+ if LyricS = 'ji' then LyricS := chr($BC) + chr($DE);
+ if LyricS = 'zu' then LyricS := chr($BD) + chr($DE);
+ if LyricS = 'ze' then LyricS := chr($BE) + chr($DE);
+ if LyricS = 'zo' then LyricS := chr($BF) + chr($DE);
+
+ if LyricS = 'ta' then LyricS := chr($C0);
+ if LyricS = 'chi' then LyricS := chr($C1);
+ if LyricS = 'tsu' then LyricS := chr($C2);
+ if LyricS = 'te' then LyricS := chr($C3);
+ if LyricS = 'to' then LyricS := chr($C4);
+
+ if LyricS = 'da' then LyricS := chr($C0) + chr($DE);
+// if LyricS = 'ji' then LyricS := chr($C1) + chr($DE);
+// if LyricS = 'zu' then LyricS := chr($C2) + chr($DE);
+ if LyricS = 'de' then LyricS := chr($C3) + chr($DE);
+ if LyricS = 'do' then LyricS := chr($C4) + chr($DE);
+
+ if LyricS = 'na' then LyricS := chr($C5);
+ if LyricS = 'ni' then LyricS := chr($C6);
+ if LyricS = 'nu' then LyricS := chr($C7);
+ if LyricS = 'ne' then LyricS := chr($C8);
+ if LyricS = 'no' then LyricS := chr($C9);
+
+ if LyricS = 'ha' then LyricS := chr($CA);
+ if LyricS = 'hi' then LyricS := chr($CB);
+ if LyricS = 'hu' then LyricS := chr($CC);
+ if LyricS = 'he' then LyricS := chr($CD);
+ if LyricS = 'ho' then LyricS := chr($CE);
+
+ if LyricS = 'ba' then LyricS := chr($CA) + chr($DE);
+ if LyricS = 'bi' then LyricS := chr($CB) + chr($DE);
+ if LyricS = 'bu' then LyricS := chr($CC) + chr($DE);
+ if LyricS = 'be' then LyricS := chr($CD) + chr($DE);
+ if LyricS = 'bo' then LyricS := chr($CE) + chr($DE);
+
+ if LyricS = 'pa' then LyricS := chr($CA) + chr($DF);
+ if LyricS = 'pi' then LyricS := chr($CB) + chr($DF);
+ if LyricS = 'pu' then LyricS := chr($CC) + chr($DF);
+ if LyricS = 'pe' then LyricS := chr($CD) + chr($DF);
+ if LyricS = 'po' then LyricS := chr($CE) + chr($DF);
+
+ if LyricS = 'ma' then LyricS := chr($CF);
+ if LyricS = 'mi' then LyricS := chr($D0);
+ if LyricS = 'mu' then LyricS := chr($D1);
+ if LyricS = 'me' then LyricS := chr($D2);
+ if LyricS = 'mo' then LyricS := chr($D3);
+
+ if LyricS = 'ya' then LyricS := chr($D4);
+ if LyricS = 'yu' then LyricS := chr($D5);
+ if LyricS = 'yo' then LyricS := chr($D6);
+
+ if LyricS = 'ra' then LyricS := chr($D7);
+ if LyricS = 'ri' then LyricS := chr($D8);
+ if LyricS = 'ru' then LyricS := chr($D9);
+ if LyricS = 're' then LyricS := chr($DA);
+ if LyricS = 'ro' then LyricS := chr($DB);
+
+ if LyricS = 'wa' then LyricS := chr($DC);
+ if LyricS = 'n' then LyricS := chr($DD);
+
+ LyricS := ' ' + LyricS;
+ if Space then LyricS := LyricS + ' ';}
+
+
+
+ with Czesci[NrCzesci].Czesc[Czesci[NrCzesci].High] do begin
+ SetLength(Nuta, Length(Nuta) + 1);
+ IlNut := IlNut + 1;
+ HighNut := HighNut + 1;
+ Muzyka.IlNut := Muzyka.IlNut + 1;
+
+ Nuta[HighNut].Start := StartP;
+ if IlNut = 1 then begin
+ StartNote := Nuta[HighNut].Start;
+ if Czesci[NrCzesci].Ilosc = 1 then
+ Start := -100;
+// Start := Nuta[HighNut].Start;
+ end;
+
+ Nuta[HighNut].Dlugosc := DurationP;
+ Muzyka.DlugoscNut := Muzyka.DlugoscNut + Nuta[HighNut].Dlugosc;
+
+ // back to the normal system with normal, golden and now freestyle notes
+ case TypeP of
+ 'F': Nuta[HighNut].Wartosc := 0;
+ ':': Nuta[HighNut].Wartosc := 1;
+ '*': Nuta[HighNut].Wartosc := 2;
+ end;
+ Czesci[NrCzesci].Wartosc := Czesci[NrCzesci].Wartosc + Nuta[HighNut].Dlugosc * Nuta[HighNut].Wartosc;
+
+ Nuta[HighNut].Ton := NoteP;
+ if Nuta[HighNut].Ton < Base[NrCzesci] then Base[NrCzesci] := Nuta[HighNut].Ton;
+ Nuta[HighNut].TonGamy := Nuta[HighNut].TonGamy mod 12;
+
+ Nuta[HighNut].Tekst := Copy(LyricS, 2, 100);
+ Lyric := Lyric + Nuta[HighNut].Tekst;
+
+ if TypeP = 'F' then
+ Nuta[HighNut].FreeStyle := true;
+
+ Koniec := Nuta[HighNut].Start + Nuta[HighNut].Dlugosc;
+ end; // with
+end;
+
+procedure NewSentence(NrCzesciP: integer; Param1, Param2: integer);
+var
+I: Integer;
+begin
+// Log.LogStatus('IlCzesci: ' + IntToStr(Czesci[NrCzesciP].Ilosc), 'NewSentece');
+// Log.LogStatus('Dane: ' + IntToStr(NrCzesciP) + ' ' + IntToStr(Param1) + ' ' + IntToStr(Param2) , 'NewSentece');
+
+ // stara czesc //Alter Satz //Update Old Part
+ Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].BaseNote := Base[NrCzesciP];
+ Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].LyricWidth := glTextWidth(PChar(Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].Lyric));
+
+ //Total Notes Patch
+ Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].TotalNotes := 0;
+ for I := low(Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].Nuta) to high(Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].Nuta) do
+ begin
+ Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].TotalNotes := Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].TotalNotes + Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].Nuta[I].Dlugosc * Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].Nuta[I].Wartosc;
+ end;
+ //Log.LogError('Total Notes(' + inttostr(Czesci[NrCzesciP].High) +'): ' + inttostr(Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].TotalNotes));
+ //Total Notes Patch End
+
+
+ // nowa czesc //Neuer Satz //Update New Part
+ SetLength(Czesci[NrCzesciP].Czesc, Czesci[NrCzesciP].Ilosc + 1);
+ Czesci[NrCzesciP].High := Czesci[NrCzesciP].High + 1;
+ Czesci[NrCzesciP].Ilosc := Czesci[NrCzesciP].Ilosc + 1;
+ Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].HighNut := -1;
+
+ if not AktSong.Relative then
+ Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].Start := Param1;
+
+ if AktSong.Relative then begin
+ Czesci[NrCzesciP].Czesc[Czesci[NrCzesciP].High].Start := Param1;
+ Rel[NrCzesciP] := Rel[NrCzesciP] + Param2;
+ end;
+
+ Base[NrCzesciP] := 100; // high number
+end;
+
+function WczytajCzesci(Name: string): boolean;
+var
+ TempC: char;
+ Tekst: string;
+ CP: integer; // Current Player (0 or 1)
+ Pet: integer;
+ Both: boolean;
+ Param1: integer;
+ Param2: integer;
+ Param3: integer;
+ ParamS: string;
+ I: Integer;
+begin
+ Result := false;
+
+ if not FileExists(Name) then begin
+ Log.LogError('File not found: "' + Name + '"', 'WczytajCzesci');
+ exit;
+ end;
+
+ try
+ MultBPM := 4; // 4 - mnoznik dla czasu nut
+ Mult := 1; // 4 - dokladnosc pomiaru nut
+ Base[0] := 100; // high number
+// Base[1] := 100; // high number
+ Czesci[0].Wartosc := 0;
+// Czesci[1].Wartosc := 0; // here was the error in 0.3.2
+ AktSong.Relative := false;
+
+ Rel[0] := 0;
+// Rel[1] := 0;
+ CP := 0;
+ Both := false;
+ if Length(Player) = 2 then Both := true;
+
+ FileMode := fmOpenRead;
+ AssignFile(Plik, Name);
+ Reset(Plik);
+
+ ReadHeader(AktSong);
+(* if AktSong.Title = 'Hubba Hubba Zoot Zoot' then begin
+ Mult := 2;
+ AktSong.BPM[0].BPM := AktSong.BPM[0].BPM * 2;
+ end;*)
+
+ SetLength(Czesci, 2);
+ for Pet := 0 to High(Czesci) do begin
+ SetLength(Czesci[Pet].Czesc, 1);
+ Czesci[Pet].High := 0;
+ Czesci[Pet].Ilosc := 1;
+ Czesci[Pet].Akt := 0;
+ Czesci[Pet].Resolution := AktSong.Resolution;
+ Czesci[Pet].NotesGAP := AktSong.NotesGAP;
+ Czesci[Pet].Czesc[0].IlNut := 0;
+ Czesci[Pet].Czesc[0].HighNut := -1;
+ end;
+
+// TempC := ':';
+ TempC := PlikC; // read from backup variable, don't use default ':' value
+
+ while (TempC <> 'E') do begin
+ Inc(LineNo);
+ if (TempC = ':') or (TempC = '*') or (TempC = 'F') then begin
+ // wczytuje nute
+ Read(Plik, Param1);
+ Read(Plik, Param2);
+ Read(Plik, Param3);
+ Read(Plik, ParamS);
+
+ // dodaje nute
+ if not Both then
+ // P1
+ DodajNute(0, TempC, (Param1+Rel[0]) * Mult, Param2 * Mult, Param3, ParamS)
+ else begin
+ // P1 + P2
+ DodajNute(0, TempC, (Param1+Rel[0]) * Mult, Param2 * Mult, Param3, ParamS);
+ DodajNute(1, TempC, (Param1+Rel[1]) * Mult, Param2 * Mult, Param3, ParamS);
+ end;
+ end; // if
+ if TempC = '-' then begin
+ // reads sentence
+ Read(Plik, Param1);
+ if AktSong.Relative then Read(Plik, Param2); // read one more data for relative system
+
+ // new sentence
+ if not Both then
+ // P1
+ NewSentence(0, (Param1 + Rel[0]) * Mult, Param2)
+ else begin
+ // P1 + P2
+ NewSentence(0, (Param1 + Rel[0]) * Mult, Param2);
+ NewSentence(1, (Param1 + Rel[1]) * Mult, Param2);
+ end;
+
+ end; // if
+
+ if TempC = 'B' then begin
+ SetLength(AktSong.BPM, Length(AktSong.BPM) + 1);
+ Read(Plik, AktSong.BPM[High(AktSong.BPM)].StartBeat);
+ AktSong.BPM[High(AktSong.BPM)].StartBeat := AktSong.BPM[High(AktSong.BPM)].StartBeat + Rel[0];
+
+ Read(Plik, Tekst);
+ AktSong.BPM[High(AktSong.BPM)].BPM := StrToFloat(Tekst);
+ AktSong.BPM[High(AktSong.BPM)].BPM := AktSong.BPM[High(AktSong.BPM)].BPM * Mult * MultBPM;
+ end;
+
+
+ if not Both then begin
+ Czesci[CP].Czesc[Czesci[CP].High].BaseNote := Base[CP];
+ Czesci[CP].Czesc[Czesci[CP].High].LyricWidth := glTextWidth(PChar(Czesci[CP].Czesc[Czesci[CP].High].Lyric));
+ //Total Notes Patch
+ Czesci[CP].Czesc[Czesci[CP].High].TotalNotes := 0;
+ for I := low(Czesci[CP].Czesc[Czesci[CP].High].Nuta) to high(Czesci[CP].Czesc[Czesci[CP].High].Nuta) do
+ begin
+ Czesci[CP].Czesc[Czesci[CP].High].TotalNotes := Czesci[CP].Czesc[Czesci[CP].High].TotalNotes + Czesci[CP].Czesc[Czesci[CP].High].Nuta[I].Dlugosc * Czesci[CP].Czesc[Czesci[CP].High].Nuta[I].Wartosc;
+ end;
+ //Total Notes Patch End
+ end else begin
+ for Pet := 0 to High(Czesci) do begin
+ Czesci[Pet].Czesc[Czesci[Pet].High].BaseNote := Base[Pet];
+ Czesci[Pet].Czesc[Czesci[Pet].High].LyricWidth := glTextWidth(PChar(Czesci[Pet].Czesc[Czesci[Pet].High].Lyric));
+ //Total Notes Patch
+ Czesci[Pet].Czesc[Czesci[Pet].High].TotalNotes := 0;
+ for I := low(Czesci[Pet].Czesc[Czesci[Pet].High].Nuta) to high(Czesci[Pet].Czesc[Czesci[Pet].High].Nuta) do
+ begin
+ Czesci[Pet].Czesc[Czesci[Pet].High].TotalNotes := Czesci[Pet].Czesc[Czesci[Pet].High].TotalNotes + Czesci[Pet].Czesc[Czesci[Pet].High].Nuta[I].Dlugosc * Czesci[Pet].Czesc[Czesci[Pet].High].Nuta[I].Wartosc;
+ end;
+ //Total Notes Patch End
+ end;
+ end;
+
+ Read(Plik, TempC);
+ end; // while}
+
+ CloseFile(Plik);
+ except
+ Log.LogError('Error Loading File: "' + Name + '" in Line ' + inttostr(LineNo));
+ exit;
+ end;
+
+ Result := true;
+end;
+
+function SaveSong(Song: TSong; Czesc: TCzesci; Name: string; Relative: boolean): boolean;
+var
+ C: integer;
+ N: integer;
+ S: string;
+ B: integer;
+ RelativeSubTime: integer;
+ NoteState: String;
+
+begin
+// Relative := true; // override (idea - use shift+S to save with relative)
+ AssignFile(Plik, Name);
+ Rewrite(Plik);
+
+ WriteLn(Plik, '#TITLE:' + Song.Title + '');
+ WriteLn(Plik, '#ARTIST:' + Song.Artist);
+
+ if Song.Creator <> '' then WriteLn(Plik, '#CREATOR:' + Song.Creator);
+ if Song.Edition <> 'Unknown' then WriteLn(Plik, '#EDITION:' + Song.Edition);
+ if Song.Genre <> 'Unknown' then WriteLn(Plik, '#GENRE:' + Song.Genre);
+ if Song.Language <> 'Unknown' then WriteLn(Plik, '#LANGUAGE:' + Song.Language);
+ if Song.Cover <> '' then WriteLn(Plik, '#COVER:' + Song.Cover);
+
+ WriteLn(Plik, '#MP3:' + Song.Mp3);
+
+ if Song.Background <> '' then WriteLn(Plik, '#BACKGROUND:' + Song.Background);
+ if Song.Video <> '' then WriteLn(Plik, '#VIDEO:' + Song.Video);
+ if Song.VideoGAP <> 0 then WriteLn(Plik, '#VIDEOGAP:' + FloatToStr(Song.VideoGAP));
+ if Song.Resolution <> 4 then WriteLn(Plik, '#RESOLUTION:' + IntToStr(Song.Resolution));
+ if Song.NotesGAP <> 0 then WriteLn(Plik, '#NOTESGAP:' + IntToStr(Song.NotesGAP));
+ if Song.Start <> 0 then WriteLn(Plik, '#START:' + FloatToStr(Song.Start));
+ if Song.Finish <> 0 then WriteLn(Plik, '#END:' + IntToStr(Song.Finish));
+ if Relative then WriteLn(Plik, '#RELATIVE:yes');
+
+ WriteLn(Plik, '#BPM:' + FloatToStr(Song.BPM[0].BPM / 4));
+ WriteLn(Plik, '#GAP:' + FloatToStr(Song.GAP));
+
+ RelativeSubTime := 0;
+ for B := 1 to High(AktSong.BPM) do
+ WriteLn(Plik, 'B ' + FloatToStr(AktSong.BPM[B].StartBeat) + ' ' + FloatToStr(AktSong.BPM[B].BPM/4));
+
+ for C := 0 to Czesc.High do begin
+ for N := 0 to Czesc.Czesc[C].HighNut do begin
+ with Czesc.Czesc[C].Nuta[N] do begin
+
+
+ //Golden + Freestyle Note Patch
+ case Czesc.Czesc[C].Nuta[N].Wartosc of
+ 0: NoteState := 'F ';
+ 1: NoteState := ': ';
+ 2: NoteState := '* ';
+ end; // case
+ S := NoteState + IntToStr(Start-RelativeSubTime) + ' ' + IntToStr(Dlugosc) + ' ' + IntToStr(Ton) + ' ' + Tekst;
+
+
+ WriteLn(Plik, S);
+ end; // with
+ end; // N
+
+ if C < Czesc.High then begin // don't write end of last sentence
+ if not Relative then
+ S := '- ' + IntToStr(Czesc.Czesc[C+1].Start)
+ else begin
+ S := '- ' + IntToStr(Czesc.Czesc[C+1].Start - RelativeSubTime) +
+ ' ' + IntToStr(Czesc.Czesc[C+1].Start - RelativeSubTime);
+ RelativeSubTime := Czesc.Czesc[C+1].Start;
+ end;
+ WriteLn(Plik, S);
+ end;
+
+ end; // C
+
+
+ WriteLn(Plik, 'E');
+ CloseFile(Plik);
+end;
+
+function SaveSongDebug(Song: TSong; Czesc: TCzesci; Name: string; Relative: boolean): boolean;
+var
+ C: integer;
+ N: integer;
+ S: string;
+ STon: integer;
+ SLen: integer;
+ NTot: integer;
+ PlikB: TextFile;
+ LastTime: integer;
+begin
+ AssignFile(Plik, Name);
+ Rewrite(Plik);
+
+ AssignFile(PlikB, 'C:\song db.asm');
+ Rewrite(PlikB);
+
+ NTot := 0;
+ LastTime := 0;
+
+ for C := 0 to Czesc.High do begin
+ WriteLn(Plik, '; ' + IntToStr(C));
+
+ for N := 0 to Czesc.Czesc[C].HighNut do begin
+ with Czesc.Czesc[C].Nuta[N] do begin
+
+ // timespace
+ if LastTime < Start then begin
+ STon := 0;
+ SLen := Round((Start - LastTime) * 16320 / 255 / 12);
+ WriteLn(PlikB, ' .dw ' + IntToStr(STon + SLen*256) + ' ; timespace (0, ' + IntToStr(SLen) + ')');
+
+ end;
+
+
+
+ // ton
+ STon := Round(98940/(2*261.62*Power(1.05946309436, Ton)));
+ S := ' ldi R18, ' + IntToStr(STon);
+ if STon > 255 then begin
+ beep;
+ S := '!!!!' + S;
+ end;
+ WriteLn(Plik, S);
+
+ // length
+ //ldi R19, 43
+ SLen := Round(Dlugosc * 16320 / STon / 12);
+ S := ' ldi R19, ' + IntToStr(SLen);
+ if SLen > 255 then begin
+ beep;
+ S := '!!!!' + S;
+ end;
+ WriteLn(Plik, S);
+
+ // function
+ S := ' rcall playtone';
+ WriteLn(Plik, S);
+
+ // song dw
+ WriteLn(PlikB, ' .dw ' + IntToStr(STon + SLen*256));
+
+
+ LastTime := Start + Dlugosc;
+ Inc(NTot);
+
+ end; // with
+ end; // N
+ WriteLn(Plik, '');
+ WriteLn(PlikB, '');
+ end; // C
+
+ WriteLn(Plik, '; nut ' + IntToStr(NTot));
+ WriteLn(Plik, '; bajtów ' + IntToStr(8*NTot));
+
+ WriteLn(PlikB, ' .dw 0');
+ WriteLn(PlikB, '; nut ' + IntToStr(NTot));
+ WriteLn(PlikB, '; bajtów ' + IntToStr(2*NTot));
+
+
+ CloseFile(Plik);
+ CloseFile(PlikB);
+end;
+
+end.
diff --git a/Game/Code/Classes/URecord.pas b/Game/Code/Classes/URecord.pas
new file mode 100644
index 00000000..2ec5439a
--- /dev/null
+++ b/Game/Code/Classes/URecord.pas
@@ -0,0 +1,371 @@
+unit URecord;
+
+interface
+uses Classes, Math, SysUtils, {DXSounds, Wave, }UMusic, UIni, BASS;
+
+type
+ TSound = class
+ BufferNew: TMemoryStream; // buffer for newest sample
+ BufferArray: array[1..4096] of smallint; // (Signal) newest 4096 samples
+ BufferLong: array of TMemoryStream; // full buffer
+
+ Num: integer;
+ n: integer; // length of Signal to analyze
+// Spectrum: array[1..8192] of single; // sound buffer from above as FFT
+// Spektogram: array[0..100] of TSpekt; // FFT(t)
+
+ // pitch detection
+ SzczytJest: boolean; // czy jest szczyt
+ Szczyt: integer; // pozycja szczytu na osi poziomej
+ TonDokl: real; // ton aktualnego szczytu
+ Ton: integer; // ton bez ulamka
+ TonGamy: integer; // ton w gamie. wartosci: 0-11
+ Skala: real; // skala FFT
+
+ // procedures
+ procedure ProcessNewBuffer;
+ procedure AnalizujBufor; // use to analyze sound from buffers to get new pitch
+ procedure AnalizujByAutocorrelation; // we call it to analyze sound by checking Autocorrelation
+ function AnalyzeAutocorrelationFreq(Freq: real): real; // use this to check one frequency by Autocorrelation
+ end;
+
+ TSoundCardInput = record
+ Name: string;
+ end;
+
+ TSoundCard = record
+ // here can be the soundcard information - whole database from which user will select recording source
+ Description: string;
+ Input: array of TSoundCardInput;
+ InputSeleceted: integer;
+
+ // bass record
+ BassRecordStream: hStream;
+ end;
+
+ TRecord = class
+ SoundCard: array of TSoundCard;
+ constructor Create;
+ end;
+
+ smallintarray = array [0..maxInt shr 1-1] of smallInt;
+ psmallintarray = ^smallintarray;
+
+ // procedures - bass record
+ function GetMicrophone(handle: HSTREAM; buffer: Pointer; len: DWORD; user: DWORD): boolean; stdcall;
+
+
+var
+ Sound: array of TSound;
+ SoundCard: array of TSoundCard;
+ Poz: integer;
+ Recording: TRecord;
+
+implementation
+uses UMain, ULog;
+
+procedure TSound.ProcessNewBuffer;
+var
+ S: integer;
+ L: integer;
+ A: integer;
+begin
+ // process BufferArray
+ S := 0;
+ L := BufferNew.Size div 2;
+ if L > n then begin
+ S := L - n;
+ L := n;
+ end;
+
+ // copy to array
+ for A := L+1 to n do
+ BufferArray[A-L] := BufferArray[A];
+
+ BufferNew.Seek(2*S, soBeginning);
+ BufferNew.ReadBuffer(BufferArray[1+n-L], 2*L);
+
+ // process BufferLong
+ if Ini.SavePlayback = 1 then begin
+ BufferNew.Seek(0, soBeginning);
+ BufferLong[0].CopyFrom(BufferNew, BufferNew.Size);
+ end;
+end;
+
+procedure TSound.AnalizujBufor;
+begin
+ AnalizujByAutocorrelation;
+end;
+
+procedure TSound.AnalizujByAutocorrelation;
+var
+ T: integer; // tone
+ F: real; // freq
+ Wages: array[0..35] of real; // wages
+ MaxT: integer; // max tone
+ MaxW: real; // max wage
+ V: real; // volume
+ MaxV: real; // max volume
+ S: integer; // Signal
+ Threshold: real; // threshold
+begin
+// Log.LogAnalyze('[Analyze by Autocorrelation]');
+ SzczytJest := false;
+
+ // find maximum volume of first 1024 words of signal
+ MaxV := 0;
+ for S := 1 to 1024 do begin // 0.5.2: fix. was from 0 to 1023
+// Log.LogDebug('1');
+// Log.LogDebug(IntTostr(S));
+ V := Abs(BufferArray[S]) / $10000;
+// Log.LogDebug('2');
+// Log.LogDebug(IntTostr(S) + ': ' + FloatToStr(V) + ', MaxV='+floattostr(maxv)+', buf='+inttostr(length(BufferArray)));
+ if V > MaxV then MaxV := V;
+// Log.LogDebug('3');
+// Log.LogDebug(IntTostr(S) + ': ' + FloatToStr(V) + ', MaxV='+floattostr(maxv)+', buf='+inttostr(length(BufferArray)));
+ end;
+
+
+ // prepare to analyze
+ MaxW := 0;
+
+ // analyze all 12 halftones
+ for T := 0 to 35 do begin // to 11, then 23, now 35 (for Whitney and my high voice)
+ F := 130.81*Power(1.05946309436, T)/2; // let's analyze below 130.81
+ Wages[T] := AnalyzeAutocorrelationFreq(F);
+
+ if Wages[T] > MaxW then begin // this frequency has better wage
+ MaxW := Wages[T];
+ MaxT := T;
+ end;
+ end; // for T
+
+ Threshold := 0.1;
+ case Ini.Threshold of
+ 0: Threshold := 0.05;
+ 1: Threshold := 0.1;
+ 2: Threshold := 0.15;
+ 3: Threshold := 0.2;
+ end;
+
+ //Log.LogDebug('Sound -> AnalyzeByAutocorrelation: MaxV='+floattostr(maxv)+', Threshold='+floattostr(threshold));
+ if MaxV >= Threshold then begin // found acceptable volume // 0.1
+ SzczytJest := true;
+ TonGamy := MaxT mod 12;
+ Ton := MaxT mod 12;
+ end;
+
+// Log.LogAnalyze('--> Weight: ')
+// Log.LogAnalyze('--> Selected: ' + BoolToStr(SzczytJest, true) +
+// ', TonGamy: ' + IntToStr(Ton) +
+// ', MaxV: ' + FloatToStr(MaxV));
+// Log.LogAnalyze('');
+
+
+end;
+
+function TSound.AnalyzeAutocorrelationFreq(Freq: real): real; // result medium difference
+var
+ Count: real;
+ Src: integer;
+ Dst: integer;
+ Move: integer;
+ Il: integer; // how many counts were done
+begin
+ // we use Signal as source
+ Count := 0;
+ Il := 0;
+ Src := 1;
+ Move := Round(44100/Freq);
+ Dst := Src + Move;
+
+ // ver 1 - sample 1 and compare n-times
+{ while (Src <= Move) do begin // process by moving Src by one
+ while (Dst < n) do begin // process up to n (4KB) of Signal
+ Count := Count + Abs(Signal[Src] - Signal[Dst]) / $10000;
+ Inc(Dst, Move);
+ Inc(Il);
+ end;
+
+ Inc(Src);
+ Dst := Src + Move;
+ end;}
+
+ // ver 2 - compare in vertical
+ while (Dst < n) do begin // process up to n (4KB) of Signal
+ Count := Count + Abs(BufferArray[Src] - BufferArray[Dst]) / $10000;
+ Inc(Src);
+ Inc(Dst);
+ Inc(Il);
+ end;
+
+ Result := 1 - Count / Il;
+end;
+
+function GetMicrophone(handle: HSTREAM; buffer: Pointer; len: DWORD; user: DWORD): boolean; stdcall;
+var
+ L: integer;
+ S: integer;
+ PB: pbytearray;
+ PW: pwordarray;
+ SI: smallintarray;
+ PSI: psmallintarray;
+ I: integer;
+ Skip: integer;
+ P1: integer;
+ P2: integer;
+ Boost: byte;
+begin
+// Log.LogDebug('Record -> GetMicrophone: len='+inttstr(len));
+
+ // set boost
+ case Ini.MicBoost of
+ 0: Boost := 1;
+ 1: Boost := 2;
+ 2: Boost := 4;
+ 3: Boost := 8;
+ end;
+
+ // boost buffer
+ L := Len div 2; // number of samples
+ PSI := Buffer;
+ for S := 0 to L-1 do begin
+ I := PSI^[S] * Boost;
+ if I > 32767 then I := 32767; // 0.5.0: limit
+ if I < -32768 then I := -32768; // 0.5.0: limit
+ PSI^[S] := I;
+ end;
+
+ // decode user
+ P1 := (user and 255) - 1;
+ P2 := (user div 256) - 1;
+
+// Log.LogDebug('Record -> GetMicrophone: P1='+inttostr(p1)+', P2='+inttostr(p2));
+
+ // 2 players USB mic, left channel
+ if P1 >= 0 then begin
+ L := Len div 4; // number of samples
+ PB := Buffer;
+// Log.LogDebug('Record -> GetMicrophone -> Sound[P1].BufferNew.Clear');
+ Sound[P1].BufferNew.Clear; // 0.5.2: problem on exiting
+ for S := 1 to L do begin
+ Sound[P1].BufferNew.Write(PB[(S-1)*4], 2);
+ end;
+ Sound[P1].ProcessNewBuffer;
+ end;
+
+ // 2 players USB mic, right channel
+// if Ini.Debug = 0 then Skip := 2
+// else Skip := 0;
+ Skip := 2;
+
+ if P2 >= 0 then begin
+ L := Len div 4; // number of samples
+ PB := Buffer;
+ Sound[P2].BufferNew.Clear;
+ for S := 1 to L do begin
+ Sound[P2].BufferNew.Write(PB[Skip + (S-1)*4], 2);
+ end;
+ Sound[P2].ProcessNewBuffer;
+ end;
+
+// Log.LogDebug('Record -> GetMicrophone -> Finish');
+
+ Result := true;
+end;
+
+constructor TRecord.Create;
+var
+ SC: integer; // soundcard
+ SCI: integer; // soundcard input
+ Descr: string;
+ InputName: string;
+ Flags: integer;
+ No: integer;
+ function isDuplicate(Desc: String): Boolean;
+ var
+ I: Integer;
+ begin
+ Result := False;
+ //Check for Soundcard with same Description
+ For I := 0 to SC-1 do
+ begin
+ if (SoundCard[I].Description = Desc) then
+ begin
+ Result := True;
+ Break;
+ end;
+ end;
+ end;
+
+// mic: array[0..15] of integer;
+begin
+ // checks for recording devices and puts them into array;
+ SetLength(SoundCard, 0);
+
+ SC := 0;
+ Descr := BASS_RecordGetDeviceDescription(SC);
+
+ while (Descr <> '') do begin
+
+ //If there is another SoundCard with the Same ID, Search an available Name
+ if (IsDuplicate(Descr)) then
+ begin
+ No:= 1; //Count of SoundCards with same Name
+ Repeat
+ Inc(No)
+ Until not IsDuplicate(Descr + ' (' + InttoStr(No) + ')');
+ //Set Description
+ Descr := Descr + ' (' + InttoStr(No) + ')';
+ end;
+
+ SetLength(SoundCard, SC+1);
+// Log.LogError('Device #' + IntToStr(SC+1) + ': ' + Descr);
+ SoundCard[SC].Description := Descr;
+
+ // check for recording inputs
+// mic[device] := -1; // default to no change
+ SCI := 0;
+ BASS_RecordInit(SC);
+ Flags := BASS_RecordGetInput(SCI);
+ InputName := BASS_RecordGetInputName(SCI);
+// Log.LogError('Input #' + IntToStr(SCI) + ' (' + IntToStr(Flags) + '): ' + InputName);
+
+ SetLength(SoundCard[SC].Input, 1);
+ SoundCard[SC].Input[SCI].Name := InputName;
+
+ // process each input
+ while (Flags <> -1) do begin
+ if SCI >= 1 then begin
+ SetLength(SoundCard[SC].Input, SCI+1);
+ InputName := BASS_RecordGetInputName(SCI);
+ SoundCard[SC].Input[SCI].Name := InputName;
+// Log.LogError('Input #' + IntToStr(SCI) + ' (' + IntToStr(Flags) + '): ' + InputName);
+ end;
+
+{ if (flags and BASS_INPUT_TYPE_MASK) = BASS_INPUT_TYPE_MIC then begin
+ mic[device] := input; // auto set microphone
+ end;}
+
+ Inc(SCI);
+ Flags := BASS_RecordGetInput(SCI);
+ end;
+
+{ if mic[device] <> -1 then begin
+ Log.LogAnalyze('Found the mic at input ' + IntToStr(Mic[device]))
+ end else begin
+ Log.LogAnalyze('Mic not found');
+ mic[device] := 0; // setting to the first one (for kxproject)
+ end;
+ SoundCard[SC].InputSeleceted := Mic[Device];}
+
+
+ BASS_RecordFree;
+
+ Inc(SC);
+ Descr := BASS_RecordGetDeviceDescription(SC);
+ end; // while
+end;
+end.
+
+
diff --git a/Game/Code/Classes/USkins.pas b/Game/Code/Classes/USkins.pas
new file mode 100644
index 00000000..547f4c2c
--- /dev/null
+++ b/Game/Code/Classes/USkins.pas
@@ -0,0 +1,162 @@
+unit USkins;
+
+interface
+
+type
+ TSkinTexture = record
+ Name: string;
+ FileName: string;
+ end;
+
+ TSkinEntry = record
+ Theme: string;
+ Name: string;
+ Path: string;
+ FileName: string;
+ Creator: string; // not used yet
+ end;
+
+ TSkin = class
+ Skin: array of TSkinEntry;
+ SkinTexture: array of TSkinTexture;
+ SkinPath: string;
+ Color: integer;
+ constructor Create;
+ procedure LoadList;
+ procedure ParseDir(Dir: string);
+ procedure LoadHeader(FileName: string);
+ procedure LoadSkin(Name: string);
+ function GetTextureFileName(TextureName: string): string;
+ function GetSkinNumber(Name: string): integer;
+ procedure onThemeChange;
+ end;
+
+var
+ Skin: TSkin;
+
+implementation
+
+uses IniFiles,
+ Classes,
+ SysUtils,
+ ULog,
+ UIni;
+
+constructor TSkin.Create;
+begin
+ LoadList;
+// LoadSkin('Lisek');
+// SkinColor := Color;
+end;
+
+procedure TSkin.LoadList;
+var
+ SR: TSearchRec;
+ SR2: TSearchRec;
+ SLen: integer;
+begin
+ if FindFirst('Skins\*', faDirectory, SR) = 0 then begin
+ repeat
+ if (SR.Name <> '.') and (SR.Name <> '..') then
+ ParseDir('Skins\' + SR.Name + '\');
+ until FindNext(SR) <> 0;
+ end; // if
+ FindClose(SR);
+end;
+
+procedure TSkin.ParseDir(Dir: string);
+var
+ SR: TSearchRec;
+ SLen: integer;
+begin
+ if FindFirst(Dir + '*.ini', faAnyFile, SR) = 0 then begin
+ repeat
+ if (SR.Name <> '.') and (SR.Name <> '..') then
+ LoadHeader(Dir + SR.Name);
+ //Log.LogError(SR.Name);
+ until FindNext(SR) <> 0;
+ end;
+end;
+
+procedure TSkin.LoadHeader(FileName: string);
+var
+ SkinIni: TMemIniFile;
+ S: integer;
+begin
+ SkinIni := TMemIniFile.Create(FileName);
+
+ S := Length(Skin);
+ SetLength(Skin, S+1);
+ Skin[S].Path := IncludeTrailingBackslash(ExtractFileDir(FileName));
+ Skin[S].FileName := ExtractFileName(FileName);
+ Skin[S].Theme := SkinIni.ReadString('Skin', 'Theme', '');
+ Skin[S].Name := SkinIni.ReadString('Skin', 'Name', '');
+ Skin[S].Creator := SkinIni.ReadString('Skin', 'Creator', '');
+
+ SkinIni.Free;
+end;
+
+procedure TSkin.LoadSkin(Name: string);
+var
+ SkinIni: TMemIniFile;
+ SL: TStringList;
+ T: integer;
+ S: integer;
+begin
+ S := GetSkinNumber(Name);
+ SkinPath := Skin[S].Path;
+
+ SkinIni := TMemIniFile.Create(SkinPath + Skin[S].FileName);
+
+ SL := TStringList.Create;
+ SkinIni.ReadSection('Textures', SL);
+
+ SetLength(SkinTexture, SL.Count);
+ for T := 0 to SL.Count-1 do begin
+ SkinTexture[T].Name := SL.Strings[T];
+ SkinTexture[T].FileName := SkinIni.ReadString('Textures', SL.Strings[T], '');
+ end;
+
+ SL.Free;
+ SkinIni.Free;
+end;
+
+function TSkin.GetTextureFileName(TextureName: string): string;
+var
+ T: integer;
+begin
+ Result := '';
+ for T := 0 to High(SkinTexture) do
+ if SkinTexture[T].Name = TextureName then Result := SkinPath + SkinTexture[T].FileName;
+
+{ Result := SkinPath + 'Bar.jpg';
+ if TextureName = 'Ball' then Result := SkinPath + 'Ball.bmp';
+ if Copy(TextureName, 1, 4) = 'Gray' then Result := SkinPath + 'Ball.bmp';
+ if Copy(TextureName, 1, 6) = 'NoteBG' then Result := SkinPath + 'Ball.bmp';}
+end;
+
+function TSkin.GetSkinNumber(Name: string): integer;
+var
+ S: integer;
+begin
+ Result := 0; // set default to the first available skin
+ for S := 0 to High(Skin) do
+ if Skin[S].Name = Name then Result := S;
+end;
+
+procedure TSkin.onThemeChange;
+var
+ S: integer;
+ Name: String;
+begin
+ Ini.SkinNo:=0;
+ SetLength(ISkin, 0);
+ Name := Uppercase(ITheme[Ini.Theme]);
+ for S := 0 to High(Skin) do
+ if Name = Uppercase(Skin[S].Theme) then begin
+ SetLength(ISkin, Length(ISkin)+1);
+ ISkin[High(ISkin)] := Skin[S].Name;
+ end;
+end;
+
+end.
diff --git a/Game/Code/Classes/USongs.pas b/Game/Code/Classes/USongs.pas
new file mode 100644
index 00000000..39aeba31
--- /dev/null
+++ b/Game/Code/Classes/USongs.pas
@@ -0,0 +1,794 @@
+unit USongs;
+
+interface
+uses SysUtils, ULog, UTexture, UCatCovers;
+
+const
+ SONG_LOAD_COMPLETE = true;
+ SONG_LOAD_NOTES = false;
+
+type
+ TMedleySource = ( msNone, msCalculated, msTag );
+
+ TMedley = record
+ Source: TMedleySource; //source of the information
+ StartBeat: integer; //start beat of medley
+ EndBeat: integer; //end beat of medley
+ FadeIn_time: real; //FadeIn-Time in seconds
+ FadeOut_time: real; //FadeOut-Time in seconds
+ end;
+
+ { used to hold header tags that are not supported by this version of
+ usdx (e.g. some tags from ultrastar 0.7.0) when songs are loaded in
+ songeditor. They will be written the end of the song header } //from usdx 1.1
+ TCustomHeaderTag = record
+ Tag: String;
+ Content: String;
+ end;
+
+ TBPM = record
+ BPM: real;
+ StartBeat: real;
+ end;
+
+ TScore = record
+ Name: string;
+ Score: integer;
+ Length: string;
+ Date: string;
+ end;
+
+ TSong = record
+ Path: string;
+ Folder: string; // for sorting by folder
+ FileName: string;
+
+ Medley: TMedley;
+ PreviewStart: real; //in seconds
+ CustomTags: array of TCustomHeaderTag; // from 1.1
+
+ // sorting methods
+ Category: array of string; // I think I won't need this
+ Genre: string;
+ Edition: string;
+ Language: string; // 0.5.0: new
+
+ Title: string;
+ Artist: string;
+
+ Text: string;
+ Creator: string;
+
+ Cover: string;
+ CoverTex: TTexture;
+ Mp3: string;
+ Background: string;
+ Video: string;
+ VideoGAP: real;
+ VideoLoaded: boolean; // 0.5.0: true if the video has been loaded
+ NotesGAP: integer;
+ Start: real; // in seconds
+ Finish: integer; // in miliseconds
+ Relative: boolean;
+ Resolution: integer;
+ BPM: array of TBPM;
+ GAP: real; // in miliseconds
+
+ Score: array[0..2] of array of TScore;
+
+ // these are used when sorting is enabled
+ Visible: boolean; // false if hidden, true if visible
+ Main: boolean; // false for songs, true for category buttons
+ OrderNum: integer; // has a number of category for category buttons and songs
+ OrderTyp: integer; // type of sorting for this button (0=name)
+ CatNumber: integer; // Count of Songs in Category for Cats and Number of Song in Category for Songs
+ end;
+
+ TSongs = class
+ private
+ BrowsePos: Cardinal; //Actual Pos in Song Array
+ public
+ Song: array of TSong; // array of songs
+ Selected: integer; // selected song index
+ procedure LoadSongList; // load all songs
+ procedure BrowseDir(Dir: string); // should return number of songs in the future
+ procedure Sort(Order: integer);
+ function FindSongFile(Dir, Mask: string): string;
+ end;
+
+ TCatSongs = class
+ Song: array of TSong; // array of categories with songs
+ Selected: integer; // selected song index
+ Order: integer; // order type (0=title)
+ CatNumShow: integer; // Category Number being seen
+ CatCount: integer; //Number of Categorys
+
+ procedure Refresh; // refreshes arrays by recreating them from Songs array
+// procedure Sort(Order: integer);
+ procedure ShowCategory(Index: integer); // expands all songs in category
+ procedure HideCategory(Index: integer); // hides all songs in category
+ procedure ClickCategoryButton(Index: integer); // uses ShowCategory and HideCategory when needed
+ procedure ShowCategoryList; //Hides all Songs And Show the List of all Categorys
+ function FindNextVisible(SearchFrom:integer): integer; //Find Next visible Song
+ function VisibleSongs: integer; // returns number of visible songs (for tabs)
+ function VisibleIndex(Index: integer): integer; // returns visible song index (skips invisible)
+
+ function SetFilter(FilterStr: String; const fType: Byte): Cardinal;
+ end;
+
+var
+ Songs: TSongs; // all songs
+ CatSongs: TCatSongs; // categorized songs
+ AktSong: TSong; // one song *unknown use)
+
+implementation
+
+uses UFiles, UIni, StrUtils, Umusic;
+
+procedure TSongs.LoadSongList;
+begin
+ Log.LogStatus('Initializing', 'LoadSongList');
+
+ // clear
+ Setlength(Song, 50);
+
+ BrowsePos := 0;
+ // browse directories
+ BrowseDir(SongPath);
+
+ //Set Correct SongArray Length
+ SetLength(Song, BrowsePos);
+// if Ini.Debug = 1 then BrowseDir('D:\Extract\Songs\');
+end;
+
+procedure TSongs.BrowseDir(Dir: string);
+var
+ SR: TSearchRec; // for parsing Songs Directory
+ SLen: integer;
+ res: boolean;
+begin
+ if FindFirst(Dir + '*', faDirectory, SR) = 0 then begin
+ repeat
+ if (SR.Name <> '.') and (SR.Name <> '..') then
+ BrowseDir(Dir + Sr.Name + '\');
+ until FindNext(SR) <> 0;
+ end; // if
+ FindClose(SR);
+
+// Log.LogStatus('Parsing directory: ' + Dir + SR.Name, 'LoadSongList');
+
+ if FindFirst(Dir + '*.txt', 0, SR) = 0 then begin
+// Log.LogStatus('Parsing file: ' + Dir + SR.Name + '\' + SRD.Name, 'LoadSongList');
+ repeat
+ //New Mod for better Memory Management
+
+ SLen := BrowsePos;
+ {//Old
+ SLen := Length(Song);
+ SetLength(Song, SLen + 1);//}
+
+ Song[SLen].Path := Dir;
+ Song[SLen].Folder := Copy(Dir, Length(SongPath)+1, 10000);
+ Song[SLen].Folder := Copy(Song[SLen].Folder, 1, Pos('\', Song[SLen].Folder)-1);
+ Song[SLen].FileName := SR.Name;
+
+ res := AnalyseFile(Song[SLen]); //TODO Hash?
+
+ if res and (Song[SLen].Medley.Source=msNone) then
+ begin
+ SetLength(Czesci, 1);
+ AktSong := Song[SLen];
+ res := LoadSong(Song[SLen].Path + Song[SLen].FileName, SONG_LOAD_NOTES); //TODO Hash?
+
+ if res then
+ begin
+ Song[SLen]:=AktSong;
+ FindRefrainStart(Song[SLen]);
+ end;
+ end;
+
+ if (not res) then Dec(BrowsePos)
+ else begin
+ // scanning complete, file is good
+ // if there is no cover then try to find it
+ if Song[SLen].Cover = '' then Song[SLen].Cover := FindSongFile(Dir, '*[CO].jpg');
+// if Song[SLen].Background = '' then begin
+// Song[SLen].Background := FindSongFile(Dir, '*[BG].jpg');
+// end; // no needed here}
+
+ // fix by adding path. no, don't fix it.
+// if Song[SLen].Cover <> '' then
+// Song[SLen].Cover := Song[SLen].Path + Song[SLen].Cover;
+ end;
+
+ //Change Length Only every 50 Entrys
+ Inc(BrowsePos);
+
+ if (BrowsePos mod 50 = 0) AND (BrowsePos <> 0) then
+ begin
+ SetLength(Song, Length(Song) + 50);
+ end;
+
+ until FindNext(SR) <> 0;
+ end; // if FindFirst
+ FindClose(SR);
+end;
+
+procedure TSongs.Sort(Order: integer);
+var
+ S: integer;
+ S2: integer;
+ TempSong: TSong;
+begin
+ case Order of
+ sEdition: // by edition
+ begin
+ for S2 := 0 to Length(Song)-1 do
+ for S := 1 to Length(Song)-1 do
+ if CompareText(Song[S].Edition, Song[S-1].Edition) < 0 then begin
+ // zamiana miejscami
+ TempSong := Song[S-1];
+ Song[S-1] := Song[S];
+ Song[S] := TempSong;
+ end;
+ end;
+ sGenre: // by genre
+ begin
+ for S2 := 0 to Length(Song)-1 do
+ for S := 1 to Length(Song)-1 do
+ if CompareText(Song[S].Genre, Song[S-1].Genre) < 0 then begin
+ // zamiana miejscami
+ TempSong := Song[S-1];
+ Song[S-1] := Song[S];
+ Song[S] := TempSong;
+ end;
+ end;
+ sTitle: // by title
+ begin
+ for S2 := 0 to Length(Song)-1 do
+ for S := 1 to Length(Song)-1 do
+ if CompareText(Song[S].Title, Song[S-1].Title) < 0 then begin
+ // zamiana miejscami
+ TempSong := Song[S-1];
+ Song[S-1] := Song[S];
+ Song[S] := TempSong;
+ end;
+
+ end;
+ sArtist: // by artist
+ begin
+ for S2 := 0 to Length(Song)-1 do
+ for S := 1 to Length(Song)-1 do
+ if CompareText(Song[S].Artist, Song[S-1].Artist) < 0 then begin
+ // zamiana miejscami
+ TempSong := Song[S-1];
+ Song[S-1] := Song[S];
+ Song[S] := TempSong;
+ end;
+ end;
+ sFolder: // by folder
+ begin
+ for S2 := 0 to Length(Song)-1 do
+ for S := 1 to Length(Song)-1 do
+ if CompareText(Song[S].Folder, Song[S-1].Folder) < 0 then begin
+ // zamiana miejscami
+ TempSong := Song[S-1];
+ Song[S-1] := Song[S];
+ Song[S] := TempSong;
+ end;
+ end;
+ sTitle2: // by title2
+ begin
+ for S2 := 0 to Length(Song)-1 do
+ for S := 1 to Length(Song)-1 do
+ if CompareText(Song[S].Title, Song[S-1].Title) < 0 then begin
+ // zamiana miejscami
+ TempSong := Song[S-1];
+ Song[S-1] := Song[S];
+ Song[S] := TempSong;
+ end;
+
+ end;
+ sArtist2: // by artist2
+ begin
+ for S2 := 0 to Length(Song)-1 do
+ for S := 1 to Length(Song)-1 do
+ if CompareText(Song[S].Artist, Song[S-1].Artist) < 0 then begin
+ // zamiana miejscami
+ TempSong := Song[S-1];
+ Song[S-1] := Song[S];
+ Song[S] := TempSong;
+ end;
+ end;
+ sLanguage: // by Language
+ begin
+ for S2 := 0 to Length(Song)-1 do
+ for S := 1 to Length(Song)-1 do
+ if CompareText(Song[S].Language, Song[S-1].Language) < 0 then begin
+ TempSong := Song[S-1];
+ Song[S-1] := Song[S];
+ Song[S] := TempSong;
+ end;
+ end;
+
+ end; // case
+end;
+
+function TSongs.FindSongFile(Dir, Mask: string): string;
+var
+ SR: TSearchRec; // for parsing song directory
+begin
+ Result := '';
+ if FindFirst(Dir + Mask, faDirectory, SR) = 0 then begin
+ Result := SR.Name;
+ end; // if
+ FindClose(SR);
+end;
+
+procedure TCatSongs.Refresh;
+var
+ S: integer; // temporary song index
+ CatLen: integer; // length of CatSongs.Song
+ Letter: char; // current letter for sorting using letter
+ SS: string; // current edition for sorting using edition, genre etc.
+ Order: integer; // number used for ordernum
+ Letter2: char; //
+ CatNumber:integer; // Number of Song in Category
+begin
+ CatNumShow := -1;
+// Songs.Sort(0); // by title
+
+case Ini.Sorting of
+ sEdition: begin
+ Songs.Sort(sArtist);
+ Songs.Sort(sEdition);
+ end;
+ sGenre: begin
+ Songs.Sort(sArtist);
+ Songs.Sort(sGenre);
+ end;
+ sLanguage: begin
+ Songs.Sort(sArtist);
+ Songs.Sort(sLanguage);
+ end;
+ sFolder: begin
+ Songs.Sort(sArtist);
+ Songs.Sort(sFolder);
+ end;
+ sTitle: Songs.Sort(sTitle);
+ sArtist: Songs.Sort(sArtist);
+ sTitle2: Songs.Sort(sTitle2); // by title2
+ sArtist2: Songs.Sort(sArtist2); // by artist2
+
+ end; // case
+
+
+ Letter := ' ';
+ SS := '';
+ Order := 0;
+ CatNumber := 0;
+
+ //Songs leeren
+ SetLength (Song, 0);
+
+ for S := Low(Songs.Song) to High(Songs.Song) do begin
+ if (Ini.Tabs = 1) then
+ if (Ini.Sorting = sEdition) and (CompareText(SS, Songs.Song[S].Edition) <> 0) then begin
+ // add Category Button
+ Inc(Order);
+ SS := Songs.Song[S].Edition;
+ CatLen := Length(CatSongs.Song);
+ SetLength(CatSongs.Song, CatLen+1);
+ CatSongs.Song[CatLen].Artist := '[' + SS + ']';
+ CatSongs.Song[CatLen].Main := true;
+ CatSongs.Song[CatLen].OrderTyp := 0;
+ CatSongs.Song[CatLen].OrderNum := Order;
+
+
+
+ // 0.4.3
+ // if SS = 'Singstar' then CatSongs.Song[CatLen].Cover := CoversPath + 'Singstar.jpg';
+ // if SS = 'Singstar Part 2' then CatSongs.Song[CatLen].Cover := CoversPath + 'Singstar.jpg';
+ // if SS = 'Singstar German' then CatSongs.Song[CatLen].Cover := CoversPath + 'Singstar.jpg';
+ // if SS = 'Singstar Spanish' then CatSongs.Song[CatLen].Cover := CoversPath + 'Singstar.jpg';
+ // if SS = 'Singstar Italian' then CatSongs.Song[CatLen].Cover := CoversPath + 'Singstar.jpg';
+ // if SS = 'Singstar French' then CatSongs.Song[CatLen].Cover := CoversPath + 'Singstar.jpg';
+ // if SS = 'Singstar Party' then CatSongs.Song[CatLen].Cover := CoversPath + 'Singstar Party.jpg';
+ // if SS = 'Singstar Popworld' then CatSongs.Song[CatLen].Cover := CoversPath + 'Singstar Popworld.jpg';
+ // if SS = 'Singstar 80s' then CatSongs.Song[CatLen].Cover := CoversPath + 'Singstar 80s.jpg';
+ // if SS = 'Singstar 80s Polish' then CatSongs.Song[CatLen].Cover := CoversPath + 'Singstar 80s.jpg';
+ // if SS = 'Singstar Rocks' then CatSongs.Song[CatLen].Cover := CoversPath + 'Singstar Rocks.jpg';
+ // if SS = 'Singstar Anthems' then CatSongs.Song[CatLen].Cover := CoversPath + 'Singstar Anthems.jpg';
+
+ {// cover-patch
+ if FileExists(CoversPath + SS + '.jpg') then CatSongs.Song[CatLen].Cover := CoversPath + SS + '.jpg'
+ else if FileExists(CoversPath + 'NoCover.jpg') then CatSongs.Song[CatLen].Cover := CoversPath + 'NoCover.jpg';//}
+
+ CatSongs.Song[CatLen].Cover := CatCovers.GetCover(Ini.Sorting, SS);
+
+ //CatNumber Patch
+ if (SS <> '') then
+ begin
+ if (CatLen - CatNumber - 1>=0) then
+ Song[CatLen - CatNumber - 1].CatNumber := CatNumber;//Set CatNumber of Categroy
+ CatNumber := 0;
+ end;
+
+ CatSongs.Song[CatLen].Visible := true;
+ end
+
+ else if (Ini.Sorting = sGenre) and (CompareText(SS, Songs.Song[S].Genre) <> 0) then begin
+ // add Genre Button
+ Inc(Order);
+ SS := Songs.Song[S].Genre;
+ CatLen := Length(CatSongs.Song);
+ SetLength(CatSongs.Song, CatLen+1);
+ CatSongs.Song[CatLen].Artist := SS;
+ CatSongs.Song[CatLen].Main := true;
+ CatSongs.Song[CatLen].OrderTyp := 0;
+ CatSongs.Song[CatLen].OrderNum := Order;
+
+ {// cover-patch
+ if FileExists(CoversPath + SS + '.jpg') then CatSongs.Song[CatLen].Cover := CoversPath + SS + '.jpg'
+ else if FileExists(CoversPath + 'NoCover.jpg') then CatSongs.Song[CatLen].Cover := CoversPath + 'NoCover.jpg';}
+ CatSongs.Song[CatLen].Cover := CatCovers.GetCover(Ini.Sorting, SS);
+
+ //CatNumber Patch
+ if (SS <> '') then
+ begin
+ if (CatLen - CatNumber - 1>=0) then
+ Song[CatLen - CatNumber - 1].CatNumber := CatNumber;//Set CatNumber of Categroy
+ CatNumber := 0;
+ end;
+
+ CatSongs.Song[CatLen].Visible := true;
+ end
+
+ else if (Ini.Sorting = sLanguage) and (CompareText(SS, Songs.Song[S].Language) <> 0) then begin
+ // add Language Button
+ Inc(Order);
+ SS := Songs.Song[S].Language;
+ CatLen := Length(CatSongs.Song);
+ SetLength(CatSongs.Song, CatLen+1);
+ CatSongs.Song[CatLen].Artist := SS;
+ CatSongs.Song[CatLen].Main := true;
+ CatSongs.Song[CatLen].OrderTyp := 0;
+ CatSongs.Song[CatLen].OrderNum := Order;
+
+ {// cover-patch
+ if FileExists(CoversPath + SS + '.jpg') then CatSongs.Song[CatLen].Cover := CoversPath + SS + '.jpg'
+ else if FileExists(CoversPath + 'NoCover.jpg') then CatSongs.Song[CatLen].Cover := CoversPath + 'NoCover.jpg';}
+ CatSongs.Song[CatLen].Cover := CatCovers.GetCover(Ini.Sorting, SS);
+
+ //CatNumber Patch
+ if (SS <> '') then
+ begin
+ if (CatLen - CatNumber - 1>=0) then
+ Song[CatLen - CatNumber - 1].CatNumber := CatNumber;//Set CatNumber of Categroy
+ CatNumber := 0;
+ end;
+
+ CatSongs.Song[CatLen].Visible := true;
+ end
+
+ else if (Ini.Sorting = sTitle) and (Length(Songs.Song[S].Title)>=1) and (Letter <> UpCase(Songs.Song[S].Title[1])) then begin
+ // add a letter Category Button
+ Inc(Order);
+ Letter := UpCase(Songs.Song[S].Title[1]);
+ CatLen := Length(CatSongs.Song);
+ SetLength(CatSongs.Song, CatLen+1);
+ CatSongs.Song[CatLen].Artist := '[' + Letter + ']';
+ CatSongs.Song[CatLen].Main := true;
+ CatSongs.Song[CatLen].OrderTyp := 0;
+// Order := ord(Letter);
+ CatSongs.Song[CatLen].OrderNum := Order;
+
+
+ {// cover-patch
+ if FileExists(CoversPath + 'Title' + Letter + '.jpg') then CatSongs.Song[CatLen].Cover := CoversPath + 'Title' + Letter + '.jpg'
+ else if FileExists(CoversPath + 'NoCover.jpg') then CatSongs.Song[CatLen].Cover := CoversPath + 'NoCover.jpg';}
+ CatSongs.Song[CatLen].Cover := CatCovers.GetCover(Ini.Sorting, Letter);
+
+ //CatNumber Patch
+ if (Letter <> ' ') then
+ begin
+ if (CatLen - CatNumber - 1>=0) then
+ Song[CatLen - CatNumber - 1].CatNumber := CatNumber;//Set CatNumber of Categroy
+ CatNumber := 0;
+ end;
+
+ CatSongs.Song[CatLen].Visible := true;
+ end
+
+ else if (Ini.Sorting = sArtist) and (Length(Songs.Song[S].Artist)>=1) and (Letter <> UpCase(Songs.Song[S].Artist[1])) then begin
+ // add a letter Category Button
+ Inc(Order);
+ Letter := UpCase(Songs.Song[S].Artist[1]);
+ CatLen := Length(CatSongs.Song);
+ SetLength(CatSongs.Song, CatLen+1);
+ CatSongs.Song[CatLen].Artist := '[' + Letter + ']';
+ CatSongs.Song[CatLen].Main := true;
+ CatSongs.Song[CatLen].OrderTyp := 0;
+// Order := ord(Letter);
+ CatSongs.Song[CatLen].OrderNum := Order;
+
+ {// cover-patch
+ if FileExists(CoversPath + 'Artist' + Letter + '.jpg') then CatSongs.Song[CatLen].Cover := CoversPath + 'Artist' + Letter + '.jpg'
+ else if FileExists(CoversPath + 'NoCover.jpg') then CatSongs.Song[CatLen].Cover := CoversPath + 'NoCover.jpg';}
+ CatSongs.Song[CatLen].Cover := CatCovers.GetCover(Ini.Sorting, Letter);
+
+ //CatNumber Patch
+ if (Letter <> ' ') then
+ begin
+ if (CatLen - CatNumber - 1>=0) then
+ Song[CatLen - CatNumber - 1].CatNumber := CatNumber;//Set CatNumber of Categroy
+ CatNumber := 0;
+ end;
+
+ CatSongs.Song[CatLen].Visible := true;
+ end
+
+ else if (Ini.Sorting = sFolder) and (CompareText(SS, Songs.Song[S].Folder) <> 0) then begin
+ // 0.5.0: add folder tab
+ Inc(Order);
+ SS := Songs.Song[S].Folder;
+ CatLen := Length(CatSongs.Song);
+ SetLength(CatSongs.Song, CatLen+1);
+ CatSongs.Song[CatLen].Artist := SS;
+ CatSongs.Song[CatLen].Main := true;
+ CatSongs.Song[CatLen].OrderTyp := 0;
+ CatSongs.Song[CatLen].OrderNum := Order;
+
+ {// cover-patch
+ if FileExists(CoversPath + SS + '.jpg') then CatSongs.Song[CatLen].Cover := CoversPath + SS + '.jpg'
+ else if FileExists(CoversPath + 'NoCover.jpg') then CatSongs.Song[CatLen].Cover := CoversPath + 'NoCover.jpg';}
+ CatSongs.Song[CatLen].Cover := CatCovers.GetCover(Ini.Sorting, SS);
+
+ //CatNumber Patch
+ if (SS <> '') then
+ begin
+ if (CatLen - CatNumber - 1>=0) then
+ Song[CatLen - CatNumber - 1].CatNumber := CatNumber;//Set CatNumber of Categroy
+ CatNumber := 0;
+ end;
+
+ CatSongs.Song[CatLen].Visible := true;
+ end
+
+ else if (Ini.Sorting = sTitle2) AND (Length(Songs.Song[S].Title)>=1) then begin
+ if (ord(Songs.Song[S].Title[1]) > 47) and (ord(Songs.Song[S].Title[1]) < 58) then Letter2 := '#' else Letter2 := UpCase(Songs.Song[S].Title[1]);
+ if (Letter <> Letter2) then begin
+ // add a letter Category Button
+ Inc(Order);
+ Letter := Letter2;
+ CatLen := Length(CatSongs.Song);
+ SetLength(CatSongs.Song, CatLen+1);
+ CatSongs.Song[CatLen].Artist := '[' + Letter + ']';
+ CatSongs.Song[CatLen].Main := true;
+ CatSongs.Song[CatLen].OrderTyp := 0;
+// Order := ord(Letter);
+ CatSongs.Song[CatLen].OrderNum := Order;
+
+ {// cover-patch
+ if FileExists(CoversPath + 'Title' + Letter + '.jpg') then CatSongs.Song[CatLen].Cover := CoversPath + 'Title' + Letter + '.jpg'
+ else if FileExists(CoversPath + 'NoCover.jpg') then CatSongs.Song[CatLen].Cover := CoversPath + 'NoCover.jpg';}
+ CatSongs.Song[CatLen].Cover := CatCovers.GetCover(Ini.Sorting, Letter);
+
+ //CatNumber Patch
+ if (Letter <> ' ') then
+ begin
+ if (CatLen - CatNumber - 1>=0) then
+ Song[CatLen - CatNumber - 1].CatNumber := CatNumber;//Set CatNumber of Categroy
+ CatNumber := 0;
+ end;
+
+ CatSongs.Song[CatLen].Visible := true;
+ end;
+ end
+
+ else if (Ini.Sorting = sArtist2) AND (Length(Songs.Song[S].Artist)>=1) then begin
+ if (ord(Songs.Song[S].Artist[1]) > 47) and (ord(Songs.Song[S].Artist[1]) < 58) then Letter2 := '#' else Letter2 := UpCase(Songs.Song[S].Artist[1]);
+ if (Letter <> Letter2) then begin
+ // add a letter Category Button
+ Inc(Order);
+ Letter := Letter2;
+ CatLen := Length(CatSongs.Song);
+ SetLength(CatSongs.Song, CatLen+1);
+ CatSongs.Song[CatLen].Artist := '[' + Letter + ']';
+ CatSongs.Song[CatLen].Main := true;
+ CatSongs.Song[CatLen].OrderTyp := 0;
+// Order := ord(Letter);
+ CatSongs.Song[CatLen].OrderNum := Order;
+
+ {// cover-patch
+ if FileExists(CoversPath + 'Artist' + Letter + '.jpg') then CatSongs.Song[CatLen].Cover := CoversPath + 'Artist' + Letter + '.jpg'
+ else if FileExists(CoversPath + 'NoCover.jpg') then CatSongs.Song[CatLen].Cover := CoversPath + 'NoCover.jpg';}
+ CatSongs.Song[CatLen].Cover := CatCovers.GetCover(Ini.Sorting, Letter);
+
+ //CatNumber Patch
+ if (Letter <> ' ') then
+ begin
+ if (CatLen - CatNumber - 1>=0) then
+ Song[CatLen - CatNumber - 1].CatNumber := CatNumber;//Set CatNumber of Categroy
+ CatNumber := 0;
+ end;
+
+ CatSongs.Song[CatLen].Visible := true;
+ end;
+ end;
+
+
+ CatLen := Length(CatSongs.Song);
+ SetLength(CatSongs.Song, CatLen+1);
+
+ Inc (CatNumber); //Increase Number in Cat
+
+ CatSongs.Song[CatLen] := Songs.Song[S];
+ CatSongs.Song[CatLen].OrderNum := Order; // assigns category
+ CatSongs.Song[CatLen].CatNumber := CatNumber;
+
+ if (Ini.Tabs = 0) then CatSongs.Song[CatLen].Visible := true
+ else if (Ini.Tabs = 1) then CatSongs.Song[CatLen].Visible := false;
+// if (Ini.Tabs = 1) and (Order = 1) then CatSongs.Song[CatLen].Visible := true; // open first tab
+//CatSongs.Song[CatLen].Visible := true;
+
+ end;
+//CatNumber Patch - Set CatNumber of Last Category
+if (ini.Tabs_at_startup = 1) And (high(Song) >=1) then
+ Song[CatLen - CatNumber].CatNumber := CatNumber;//Set CatNumber of Categroy
+//CatCount Patch
+CatCount := Order;
+end;
+
+procedure TCatSongs.ShowCategory(Index: integer);
+var
+ S: integer; // song
+begin
+ CatNumShow := Index;
+ for S := 0 to high(CatSongs.Song) do
+ begin
+ if (CatSongs.Song[S].OrderNum = Index) AND (Not CatSongs.Song[S].Main) then
+ CatSongs.Song[S].Visible := true
+ else
+ CatSongs.Song[S].Visible := false;
+ end;
+end;
+
+procedure TCatSongs.HideCategory(Index: integer); // hides all songs in category
+var
+ S: integer; // song
+begin
+ for S := 0 to high(CatSongs.Song) do begin
+ if not CatSongs.Song[S].Main then
+ CatSongs.Song[S].Visible := false // hides all at now
+ end;
+end;
+
+procedure TCatSongs.ClickCategoryButton(Index: integer);
+var
+ Num, S: integer;
+begin
+ Num := CatSongs.Song[Index].OrderNum;
+ if Num <> CatNumShow then
+ begin
+ ShowCategory(Num);
+ end
+ else begin
+ ShowCategoryList;
+ end;
+end;
+
+//Hide Categorys when in Category Hack
+procedure TCatSongs.ShowCategoryList;
+var
+ Num, S: integer;
+begin
+ //Hide All Songs Show All Cats
+ for S := 0 to high(CatSongs.Song) do begin
+ if CatSongs.Song[S].Main then
+ CatSongs.Song[S].Visible := true
+ else
+ CatSongs.Song[S].Visible := false
+ end;
+ CatSongs.Selected := CatNumShow; //Show last shown Category
+ CatNumShow := -1;
+end;
+//Hide Categorys when in Category Hack End
+
+//Wrong song selected when tabs on bug
+function TCatSongs.FindNextVisible(SearchFrom:integer): integer;//Find next Visible Song
+var
+ I: Integer;
+ begin
+ Result := -1;
+ I := SearchFrom + 1;
+ while not CatSongs.Song[I].Visible do
+ begin
+ Inc (I);
+ if (I>high(CatSongs.Song)) then
+ I := low(CatSongs.Song);
+ if (I = SearchFrom) then //Make One Round and no song found->quit
+ break;
+ end;
+ end;
+//Wrong song selected when tabs on bug End
+
+function TCatSongs.VisibleSongs: integer;
+var
+ S: integer; // song
+begin
+ Result := 0;
+ for S := 0 to high(CatSongs.Song) do
+ if CatSongs.Song[S].Visible = true then Inc(Result);
+end;
+
+function TCatSongs.VisibleIndex(Index: integer): integer;
+var
+ S: integer; // song
+begin
+ Result := 0;
+ for S := 0 to Index-1 do
+ if CatSongs.Song[S].Visible = true then Inc(Result);
+end;
+
+function TCatSongs.SetFilter(FilterStr: String; const fType: Byte): Cardinal;
+var
+ I, J: Integer;
+ cString: String;
+ SearchStr: Array of String;
+begin
+ {fType: 0: All
+ 1: Title
+ 2: Artist}
+ FilterStr := Trim(FilterStr);
+ if FilterStr<>'' then begin
+ Result := 0;
+ //Create Search Array
+ SetLength(SearchStr, 1);
+ I := Pos (' ', FilterStr);
+ While (I <> 0) do
+ begin
+ SetLength (SearchStr, Length(SearchStr) + 1);
+ cString := Copy(FilterStr, 1, I-1);
+ if (cString <> ' ') AND (cString <> '') then
+ SearchStr[High(SearchStr)-1] := cString;
+ Delete (FilterStr, 1, I);
+
+ I := Pos (' ', FilterStr);
+ end;
+ //Copy last Word
+ if (FilterStr <> ' ') AND (FilterStr <> '') then
+ SearchStr[High(SearchStr)] := FilterStr;
+
+ for I:=0 to High(Song) do begin
+ if not Song[i].Main then
+ begin
+ case fType of
+ 0: cString := Song[I].Artist + ' ' + Song[i].Title + ' ' + Song[i].Folder;
+ 1: cString := Song[I].Title;
+ 2: cString := Song[I].Artist;
+ end;
+ Song[i].Visible:=True;
+ //Look for every Searched Word
+ For J := 0 to High(SearchStr) do
+ begin
+ Song[i].Visible := Song[i].Visible AND AnsiContainsText(cString, SearchStr[J])
+ end;
+ if Song[i].Visible then
+ Inc(Result);
+ end
+ else
+ Song[i].Visible:=False;
+ end;
+ CatNumShow := -2;
+ end
+ else begin
+ for i:=0 to High(Song) do begin
+ Song[i].Visible:=(Ini.Tabs=1)=Song[i].Main;
+ CatNumShow := -1;
+ end;
+ Result := 0;
+ end;
+end;
+
+end.
diff --git a/Game/Code/Classes/UTexture.pas b/Game/Code/Classes/UTexture.pas
new file mode 100644
index 00000000..f5f47ed9
--- /dev/null
+++ b/Game/Code/Classes/UTexture.pas
@@ -0,0 +1,884 @@
+unit UTexture;
+
+// Plain (alpha = 1)
+// Transparent
+// Transparent Range
+// Font (white is drawn, black is transparent)
+// Font Outline (Font with darker outline)
+// Font Outline 2 (Font with darker outline)
+// Font Black (black is drawn, white is transparent)
+// Font Gray (gray is drawn, white is transparent)
+// Arrow (for arrows, white is white, gray has color, black is transparent);
+
+interface
+uses gl, glu, glext, Windows, Math, Classes, SysUtils, Graphics, JPEG, UThemes, PNGImage;
+
+procedure glGenTextures(n: GLsizei; var textures: GLuint); stdcall; external opengl32;
+//procedure glBindTexture(target: GLenum; texture: GLuint); stdcall; external opengl32;
+//function gluBuild2DMipmaps (target: GLenum; components, width, height: GLint;
+// format, atype: GLenum; data: Pointer): Integer; stdcall; external glu32;
+//procedure glCopyTexImage2D(target: GLenum; level: GLint; internalFormat: GLenum; x, y: GLint; width, height: GLsizei; border: GLint); stdcall; external opengl32;
+
+
+type
+ TTexture = record
+ TexNum: integer;
+ X: real;
+ Y: real;
+ Z: real; // new
+ W: real;
+ H: real;
+ ScaleW: real; // for dynamic scalling while leaving width constant
+ ScaleH: real; // for dynamic scalling while leaving height constant
+ Rot: real; // 0 - 2*pi
+ Int: real; // intensity
+ ColR: real;
+ ColG: real;
+ ColB: real;
+ TexW: real; // used?
+ TexH: real; // used?
+ TexX1: real;
+ TexY1: real;
+ TexX2: real;
+ TexY2: real;
+ Alpha: real;
+ Name: string; // 0.5.0: experimental for handling cache images. maybe it's useful for dynamic skins
+ end;
+
+ TTextureEntry = record
+ Name: string;
+ Typ: string;
+
+ // we use normal TTexture, it's easier to implement and if needed - we copy ready data
+ Texture: TTexture;
+ TextureCache: TTexture; // 0.5.0
+ end;
+
+ TTextureDatabase = record
+ Texture: array of TTextureEntry;
+ end;
+
+ TTextureUnit = class
+ Limit: integer;
+ CreateCacheMipmap: boolean;
+
+// function GetNumberFor
+ function GetTexture(Name, Typ: string): TTexture; overload;
+ function GetTexture(Name, Typ: string; FromCache: boolean): TTexture; overload;
+ function FindTexture(Name: string): integer;
+ function LoadTexture(FromRegistry: boolean; Nazwa, Format, Typ: PChar; Col: LongWord): TTexture; overload;
+ function LoadTexture(Nazwa, Format, Typ: PChar; Col: LongWord): TTexture; overload;
+ function LoadTexture(Nazwa: string): TTexture; overload;
+ function CreateTexture(var Data: array of byte; Name: string; W, H: word; Bits: byte): TTexture;
+ procedure UnloadTexture(Name: string; FromCache: boolean);
+ end;
+
+var
+ Texture: TTextureUnit;
+ TextureDatabase: TTextureDatabase;
+
+
+ // for print screens
+// PrintScreenTex: GLuint;
+// PrintScreenData: array[0..480-1, 0..640-1] of longword;
+ PrintScreenData: array[0..1024*768-1] of longword;
+
+// Tekstur: Gluint;
+ ActTex: GLuint;//integer;
+
+{ Tekstura: array[1..32] of TTekstura;
+ Mipmapping: boolean = true;}
+
+ TexOrygW: integer;
+ TexOrygH: integer;
+ TexNewW: integer;
+ TexNewH: integer;
+{ RLE: array[1..128*128] of byte;
+ RLE2: array[1..128*128] of byte;}
+
+ TexFitW: integer;
+ TexFitH: integer; // new for limit
+
+ TextureD8: array[1..1024*1024] of byte; // 1MB
+ TextureD16: array[1..1024*1024, 1..2] of byte; // luminance/alpha tex (2MB)
+ TextureD24: array[1..1024*1024, 1..3] of byte; // normal 24-bit tex (3MB)
+ TextureD242: array[1..512*512, 1..3] of byte; // normal 24-bit tex (0,75MB)
+ TextureD32: array[1..1024*1024, 1..4] of byte; // transparent 32-bit tex (4MB)
+ // total 40MB at 2048*2048
+ // total 10MB at 1024*1024
+
+{ Paleta: array[0..255, 1..4] of byte;
+ Len: integer;}
+ Mipmapping: Boolean;
+
+ CacheMipmap: array[0..256*256*3-1] of byte; // 3KB
+
+
+implementation
+uses ULog, DateUtils, UCovers;
+
+function TTextureUnit.GetTexture(Name, Typ: string): TTexture;
+begin
+ Result := GetTexture(Name, Typ, true);
+end;
+
+function TTextureUnit.GetTexture(Name, Typ: string; FromCache: boolean): TTexture;
+var
+ T: integer; // texture
+ C: integer; // cover
+ Data: array of byte;
+begin
+ // find texture entry
+ T := FindTexture(Name);
+
+ if T = -1 then begin
+ // create texture entry
+ T := Length(TextureDatabase.Texture);
+ SetLength(TextureDatabase.Texture, T+1);
+ TextureDatabase.Texture[T].Name := Name;
+ TextureDatabase.Texture[T].Typ := Typ;
+
+ // inform database that not textures has been loaded into memory
+ TextureDatabase.Texture[T].Texture.TexNum := -1;
+ TextureDatabase.Texture[T].TextureCache.TexNum := -1;
+ end;
+
+ // use preloaded texture
+ if (not FromCache) or (FromCache and not Covers.CoverExists(Name)) then begin
+ // use full texture
+ if TextureDatabase.Texture[T].Texture.TexNum = -1 then begin
+ // load texture
+ TextureDatabase.Texture[T].Texture := LoadTexture(false, pchar(Name), 'JPG', pchar(Typ), $0);
+ end;
+
+ // use texture
+ Result := TextureDatabase.Texture[T].Texture;
+
+ end;
+
+ if FromCache and Covers.CoverExists(Name) then begin
+ // use cache texture
+ C := Covers.CoverNumber(Name);
+
+ if TextureDatabase.Texture[T].TextureCache.TexNum = -1 then begin
+ // load texture
+ Covers.PrepareData(Name);
+{ Covers.Data[0] := 0;
+ Covers.Data[1] := 0;
+ Covers.Data[2] := 0;
+ Covers.Data[3] := 255;
+ Covers.Data[4] := 255;
+ Covers.Data[5] := 255;}
+ TextureDatabase.Texture[T].TextureCache := CreateTexture(Covers.Data, Name, Covers.Cover[C].W, Covers.Cover[C].H, 24);
+ end;
+
+ // use texture
+ Result := TextureDatabase.Texture[T].TextureCache;
+ end;
+end;
+
+function TTextureUnit.FindTexture(Name: string): integer;
+var
+ T: integer; // texture
+begin
+ Result := -1;
+ for T := 0 to high(TextureDatabase.Texture) do
+ if TextureDatabase.Texture[T].Name = Name then
+ Result := T;
+end;
+
+function TTextureUnit.LoadTexture(FromRegistry: boolean; Nazwa, Format, Typ: PChar; Col: LongWord): TTexture;
+var
+
+// a patch from Linnex, that solves the font problem in wine which causes chrashes
+ ChangeFormatBMP: TBitmap;
+// end of patch (11.11.07)
+
+
+ Res: TResourceStream;
+ TextureB: TBitmap;
+ TextureJ: TJPEGImage;
+ TexturePNG: TPNGObject;
+ TextureAlpha: array of byte;
+ AlphaPtr: PByte;
+ TransparentColor: TColor;
+ PixelColor: TColor;
+
+ Pet: integer;
+ Pet2: integer;
+ Pix: integer;
+ ColInt: real;
+ PPix: PByteArray;
+ TempA: integer;
+ Error: integer;
+ SkipX: integer;
+ myAlpha: Real;
+begin
+ Log.BenchmarkStart(4);
+ Mipmapping := true;
+
+ if FromRegistry then begin
+ try
+ Res := TResourceStream.Create(HInstance, Nazwa, Format);
+ except
+ beep;
+ Exit;
+ end;
+ end;
+
+ if FromRegistry or ((not FromRegistry) and FileExists(Nazwa)) then begin
+ TextureB := TBitmap.Create;
+
+ if Format = 'BMP' then begin
+ if FromRegistry then TextureB.LoadFromStream(Res)
+ else TextureB.LoadFromFile(Nazwa);
+ end
+
+ else if Format = 'JPG' then begin
+ TextureJ := TJPEGImage.Create;
+ if FromRegistry then TextureJ.LoadFromStream(Res)
+ else begin
+ if FileExists(Nazwa) then
+ TextureJ.LoadFromFile(Nazwa)
+ else
+ Exit;
+ end;
+ TextureB.Assign(TextureJ);
+ TextureJ.Free;
+ end
+
+ else if Format = 'PNG' then begin
+ TexturePNG := TPNGObject.Create;
+ if FromRegistry then TexturePNG.LoadFromStream(Res)
+ else begin
+ if FileExists(Nazwa) then
+ TexturePNG.LoadFromFile(Nazwa)
+ else
+ Exit;
+ end;
+ TextureB.Assign(TexturePNG);
+ // transparent png hack start (part 1 of 2)
+ if (Typ = 'Transparent') and (TexturePNG.TransparencyMode = ptmPartial) then
+ begin
+ setlength(TextureAlpha, TextureB.Width*TextureB.Height);
+ if (TexturePNG.Header.ColorType = COLOR_GRAYSCALEALPHA) or
+ (TexturePNG.Header.ColorType = COLOR_RGBALPHA) then
+ begin
+ // i would have preferred english variables here but i use Pet because i'm lazy
+ for Pet := 0 to TextureB.Height - 1 do
+ begin
+ AlphaPtr := PByte(TexturePNG.AlphaScanline[Pet]);
+ for Pet2 := 0 to TextureB.Width - 1 do
+ begin
+ TextureAlpha[Pet*TextureB.Width+Pet2]:= AlphaPtr^;
+ Inc(AlphaPtr);
+ end;
+ end;
+ end;
+ end else
+ setlength(TextureAlpha,0); // just no special transparency for unimplemented transparency types (ptmBit)
+ // transparent png hack end
+ TexturePNG.Free;
+ end;
+
+ if FromRegistry then Res.Free;
+
+ if (TextureB.Width > 1024) or (TextureB.Height > 1024) then begin // will be fixed in 0.5.1 and dynamically extended to 8192x8192 depending on the driver
+ Log.LogError('Image ' + Nazwa + ' is too big (' + IntToStr(TextureB.Width) + 'x' + IntToStr(TextureB.Height) + ')');
+ Result.TexNum := -1;
+ end else begin
+
+ glGenTextures(1, ActTex);
+ glBindTexture(GL_TEXTURE_2D, ActTex);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ if Typ = 'Plain' then begin
+ // wymiary
+ TexOrygW := TextureB.Width;
+ TexOrygH := TextureB.Height;
+ TexNewW := Round(Power(2, Ceil(Log2(TexOrygW))));
+ TexNewH := Round(Power(2, Ceil(Log2(TexOrygH))));
+
+ // kopiowanie
+ TextureB.PixelFormat := pf24bit;
+{ if (TextureB.PixelFormat = pf8bit) then begin
+ for Pet := 0 to TexOrygH-1 do begin
+ for Pet2 := 0 to TexOrygW-1 do begin
+ Pix := TextureB.Canvas.Pixels[Pet2, Pet];
+ TextureD24[Pet*TexNewW + Pet2+1, 1] := Pix;
+ TextureD24[Pet*TexNewW + Pet2+1, 2] := Pix div 256;
+ TextureD24[Pet*TexNewW + Pet2+1, 3] := Pix div (256*256);
+ end;
+ end;
+ end;}
+ if (TexOrygW <= Limit) and (TexOrygW <= Limit) then begin
+ if (TextureB.PixelFormat = pf24bit) then begin
+ for Pet := 0 to TexOrygH-1 do begin
+ PPix := TextureB.ScanLine[Pet];
+ for Pet2 := 0 to TexOrygW-1 do begin
+ TextureD24[Pet*TexNewW + Pet2+1, 1] := PPix[Pet2*3+2];
+ TextureD24[Pet*TexNewW + Pet2+1, 2] := PPix[Pet2*3+1];
+ TextureD24[Pet*TexNewW + Pet2+1, 3] := PPix[Pet2*3];
+ end;
+ end;
+ end;
+ end else begin
+ // limit
+ TexFitW := 4 * (TexOrygW div 4); // fix for bug in gluScaleImage
+ TexFitH := TexOrygH;
+ if (TextureB.PixelFormat = pf24bit) then begin
+ for Pet := 0 to TexOrygH-1 do begin
+ PPix := TextureB.ScanLine[Pet];
+ for Pet2 := 0 to TexOrygW-1 do begin
+ TextureD24[Pet*TexFitW + Pet2+1, 1] := PPix[Pet2*3+2];
+ TextureD24[Pet*TexFitW + Pet2+1, 2] := PPix[Pet2*3+1];
+ TextureD24[Pet*TexFitW + Pet2+1, 3] := PPix[Pet2*3];
+ end;
+ end;
+ end;
+ gluScaleImage(GL_RGB, TexFitW, TexFitH, GL_UNSIGNED_BYTE, @TextureD24,
+ Limit, Limit, GL_UNSIGNED_BYTE, @TextureD24); // takes some time
+
+ TexNewW := Limit;
+ TexNewH := Limit;
+ TexOrygW := Limit;
+ TexOrygH := Limit;
+ end;
+
+ // creating cache mipmap
+ if CreateCacheMipmap then begin
+ if (TexOrygW <> TexNewW) or (TexOrygH <> TexNewH) then begin
+ // texture only uses some of it's space. there's a need for resize to fit full size
+ // and get best quality
+ TexFitW := 4 * (TexOrygW div 4); // 0.5.0: fix for bug in gluScaleImage
+ SkipX := (TexOrygW div 2) mod 2; // 0.5.0: try to center image
+
+ TexFitH := TexOrygH;
+ for Pet := 0 to TexOrygH-1 do begin
+ PPix := TextureB.ScanLine[Pet];
+ for Pet2 := 0 to TexOrygW-1 do begin
+ TextureD242[Pet*TexFitW + Pet2+1, 1] := PPix[(Pet2+SkipX)*3+2];
+ TextureD242[Pet*TexFitW + Pet2+1, 2] := PPix[(Pet2+SkipX)*3+1];
+ TextureD242[Pet*TexFitW + Pet2+1, 3] := PPix[(Pet2+SkipX)*3];
+ end;
+ end;
+ gluScaleImage(GL_RGB, TexFitW, TexFitH, GL_UNSIGNED_BYTE, @TextureD242,
+ Covers.W, Covers.H, GL_UNSIGNED_BYTE, @CacheMipmap[0]); // takes some time
+
+ end else begin
+ // texture fits perfectly
+ gluScaleImage(GL_RGB, TexOrygW, TexOrygH, GL_UNSIGNED_BYTE, @TextureD24,
+ Covers.W, Covers.H, GL_UNSIGNED_BYTE, @CacheMipmap[0]); // takes some time
+ end;
+ end;
+
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, TexNewW, TexNewH, 0, GL_RGB, GL_UNSIGNED_BYTE, @TextureD24);
+ if Mipmapping then begin
+ Error := gluBuild2DMipmaps(GL_TEXTURE_2D, 3, TexNewW, TexNewH, GL_RGB, GL_UNSIGNED_BYTE, @TextureD24);
+ if Error > 0 then beep;
+ end
+ end;
+
+ if Typ = 'Transparent' then begin
+ // wymiary
+ TexOrygW := TextureB.Width;
+ TexOrygH := TextureB.Height;
+ TexNewW := Round(Power(2, Ceil(Log2(TexOrygW))));
+ TexNewH := Round(Power(2, Ceil(Log2(TexOrygH))));
+ TextureB.Width := TexNewW;
+ TextureB.Height := TexNewH;
+
+ // kopiowanie
+ for Pet := 0 to TexOrygH-1 do begin
+ for Pet2 := 0 to TexOrygW-1 do begin
+ Pix := TextureB.Canvas.Pixels[Pet2, Pet];
+ // ,- part of transparent png hack
+ if ((Pix = $fefefe) or (Pix = Col)) and (length(TextureAlpha)=0) then begin //Small fix, that caused artefacts to be drawn (#fe == dec254)
+ TextureD32[Pet*TexNewW + Pet2 + 1, 1] := 0;
+ TextureD32[Pet*TexNewW + Pet2 + 1, 2] := 0;
+ TextureD32[Pet*TexNewW + Pet2 + 1, 3] := 0;
+ TextureD32[Pet*TexNewW + Pet2 + 1, 4] := 0;
+ end else begin
+ TextureD32[Pet*TexNewW + Pet2+1, 1] := Pix;
+ TextureD32[Pet*TexNewW + Pet2+1, 2] := Pix div 256;
+ TextureD32[Pet*TexNewW + Pet2+1, 3] := Pix div (256*256);
+ // transparent png hack start (part 2 of 2)
+ if (Format = 'PNG') and (length(TextureAlpha) <> 0) then begin
+ myAlpha:=TextureAlpha[Pet*TexOrygW+Pet2];
+
+ // the following calculations tweak transparency so that it really looks transparent
+ myAlpha:=myAlpha-75;
+ if myAlpha < 0 then myAlpha:=0;
+ myAlpha:=myAlpha/180;
+ myAlpha:=myAlpha*myAlpha*myAlpha;
+ myAlpha:=myAlpha*255;
+
+ TextureD32[Pet*TexNewW+Pet2+1,4]:=floor(myAlpha);
+ end else
+ // transparent png hack end
+ TextureD32[Pet*TexNewW + Pet2+1, 4] := 255;
+ end;
+ end;
+ end;
+ glTexImage2D(GL_TEXTURE_2D, 0, 4, TexNewW, TexNewH, 0, GL_RGBA, GL_UNSIGNED_BYTE, @TextureD32);
+{ if Mipmapping then begin
+ Error := gluBuild2DMipmaps(GL_TEXTURE_2D, 4, TextureB.Width, TextureB.Height, GL_RGBA, GL_UNSIGNED_BYTE, @TextureD32);
+ if Error > 0 then beep;
+ end;}
+ end;
+
+ if Typ = 'Transparent Range' then begin
+ // wymiary
+ TexOrygW := TextureB.Width;
+ TexOrygH := TextureB.Height;
+ TexNewW := Round(Power(2, Ceil(Log2(TexOrygW))));
+ TexNewH := Round(Power(2, Ceil(Log2(TexOrygH))));
+ TextureB.Width := TexNewW;
+ TextureB.Height := TexNewH;
+ // kopiowanie
+ for Pet := 0 to TexOrygH-1 do begin
+ for Pet2 := 0 to TexOrygW-1 do begin
+ Pix := TextureB.Canvas.Pixels[Pet2, Pet];
+ TextureD32[Pet*TexNewW + Pet2+1, 1] := Pix;
+ TextureD32[Pet*TexNewW + Pet2+1, 2] := Pix div 256;
+ TextureD32[Pet*TexNewW + Pet2+1, 3] := Pix div (256*256);
+ TextureD32[Pet*TexNewW + Pet2+1, 4] := 256 - Pix div 256;
+ end;
+ end;
+ glTexImage2D(GL_TEXTURE_2D, 0, 4, TexNewW, TexNewH, 0, GL_RGBA, GL_UNSIGNED_BYTE, @TextureD32);
+{ if Mipmapping then begin
+ Error := gluBuild2DMipmaps(GL_TEXTURE_2D, 4, TextureB.Width, TextureB.Height, GL_RGBA, GL_UNSIGNED_BYTE, @TextureD32);
+ if Error > 0 then beep;
+ end;}
+ end;
+
+ if Typ = 'Font' then begin
+
+// a patch from Linnex, that solves the font problem in wine which causes chrashes
+ //TextureB.PixelFormat := pf24bit;
+ ChangeFormatBMP := TBitmap.Create();
+ ChangeFormatBMP.Assign(TextureB);
+ TextureB.PixelFormat := pf24bit;
+ TextureB.Width := ChangeFormatBMP.Width;
+ TextureB.Height := ChangeFormatBMP.Height;
+ TextureB.Canvas.Draw(0, 0, ChangeFormatBMP);
+ ChangeFormatBMP.Free;
+// end of patch (11.11.07)
+
+ for Pet := 0 to TextureB.Height-1 do begin
+ PPix := TextureB.ScanLine[Pet];
+ for Pet2 := 0 to TextureB.Width-1 do begin
+ Pix := PPix[Pet2 * 3];
+ TextureD16[Pet*TextureB.Width + Pet2 + 1, 1] := 255;
+ TextureD16[Pet*TextureB.Width + Pet2 + 1, 2] := Pix;
+ end;
+ end;
+ glTexImage2D(GL_TEXTURE_2D, 0, 2, TextureB.Width, TextureB.Height, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, @TextureD16);
+
+ if Mipmapping then glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ if Mipmapping then begin
+ Error := gluBuild2DMipmaps(GL_TEXTURE_2D, 2, TextureB.Width, TextureB.Height, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, @TextureD16);
+ if Error > 0 then beep;
+ end;
+ end;
+
+ if Typ = 'Font Outline' then begin
+ TextureB.PixelFormat := pf24bit;
+ for Pet := 0 to TextureB.Height-1 do begin
+ PPix := TextureB.ScanLine[Pet];
+ for Pet2 := 0 to TextureB.Width-1 do begin
+ Pix := PPix[Pet2 * 3];
+
+ Col := Pix;
+ if Col < 127 then Col := 127;
+
+ TempA := Pix;
+ if TempA >= 95 then TempA := 255;
+ if TempA >= 31 then TempA := 255;
+ if Pix < 95 then TempA := (Pix * 256) div 96;
+
+
+ TextureD16[Pet*TextureB.Width + Pet2 + 1, 1] := Col;
+ TextureD16[Pet*TextureB.Width + Pet2 + 1, 2] := TempA;
+ end;
+ end;
+ glTexImage2D(GL_TEXTURE_2D, 0, 2, TextureB.Width, TextureB.Height, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, @TextureD16);
+
+ if Mipmapping then glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ if Mipmapping then begin
+ Error := gluBuild2DMipmaps(GL_TEXTURE_2D, 2, TextureB.Width, TextureB.Height, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, @TextureD16);
+ if Error > 0 then beep;
+ end;
+ end;
+
+ if Typ = 'Font Outline 2' then begin
+ TextureB.PixelFormat := pf24bit;
+ for Pet := 0 to TextureB.Height-1 do begin
+ PPix := TextureB.ScanLine[Pet];
+ for Pet2 := 0 to TextureB.Width-1 do begin
+ Pix := PPix[Pet2 * 3];
+
+ Col := Pix;
+ if Col < 31 then Col := 31;
+
+ TempA := Pix;
+ if TempA >= 31 then TempA := 255;
+ if Pix < 31 then TempA := Pix * (256 div 32);
+
+ TextureD16[Pet*TextureB.Width + Pet2 + 1, 1] := Col;
+ TextureD16[Pet*TextureB.Width + Pet2 + 1, 2] := TempA;
+ end;
+ end;
+ glTexImage2D(GL_TEXTURE_2D, 0, 2, TextureB.Width, TextureB.Height, 0, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, @TextureD16);
+
+ if Mipmapping then glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ if Mipmapping then begin
+ Error := gluBuild2DMipmaps(GL_TEXTURE_2D, 2, TextureB.Width, TextureB.Height, GL_LUMINANCE_ALPHA, GL_UNSIGNED_BYTE, @TextureD16);
+ if Error > 0 then beep;
+ end;
+ end;
+
+ if Typ = 'Font Black' then begin
+ // normalnie 0,125s bez niczego 0,015s - 0,030s z pix 0,125s
+ // wymiary
+ TextureB.PixelFormat := pf24bit;
+ TexOrygW := TextureB.Width;
+ TexOrygH := TextureB.Height;
+ TexNewW := Round(Power(2, Ceil(Log2(TexOrygW))));
+ TexNewH := Round(Power(2, Ceil(Log2(TexOrygH))));
+ TextureB.Width := TexNewW;
+ TextureB.Height := TexNewH;
+ // kopiowanie
+ for Pet := 0 to TextureB.Height-1 do begin
+ PPix := TextureB.ScanLine[Pet];
+ for Pet2 := 0 to TextureB.Width-1 do begin
+ Pix := PPix[Pet2*3];
+ TextureD32[Pet*TextureB.Width + Pet2 + 1, 1] := 255;
+ TextureD32[Pet*TextureB.Width + Pet2 + 1, 2] := 255;
+ TextureD32[Pet*TextureB.Width + Pet2 + 1, 3] := 255;
+ TextureD32[Pet*TextureB.Width + Pet2 + 1, 4] := 255 - (Pix mod 256);
+ end;
+ end;
+ glTexImage2D(GL_TEXTURE_2D, 0, 4, TextureB.Width, TextureB.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, @TextureD32);
+ end;
+
+ if Typ = 'Alpha Black Colored' then begin
+ TextureB.PixelFormat := pf24bit;
+ TexOrygW := TextureB.Width;
+ TexOrygH := TextureB.Height;
+ TexNewW := Round(Power(2, Ceil(Log2(TexOrygW))));
+ TexNewH := Round(Power(2, Ceil(Log2(TexOrygH))));
+ TextureB.Width := TexNewW;
+ TextureB.Height := TexNewH;
+ // kopiowanie
+ for Pet := 0 to TextureB.Height-1 do begin
+ PPix := TextureB.ScanLine[Pet];
+ for Pet2 := 0 to TextureB.Width-1 do begin
+ Pix := PPix[Pet2*3];
+ TextureD32[Pet*TextureB.Width + Pet2 + 1, 1] := (Col div $10000) and $FF;
+ TextureD32[Pet*TextureB.Width + Pet2 + 1, 2] := (Col div $100) and $FF;
+ TextureD32[Pet*TextureB.Width + Pet2 + 1, 3] := Col and $FF;
+ TextureD32[Pet*TextureB.Width + Pet2 + 1, 4] := 255 - (Pix mod 256);
+ end;
+ end;
+ glTexImage2D(GL_TEXTURE_2D, 0, 4, TextureB.Width, TextureB.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, @TextureD32);
+ end;
+
+ if Typ = 'Font Gray' then begin
+ // wymiary
+ TexOrygW := TextureB.Width;
+ TexOrygH := TextureB.Height;
+ TexNewW := Round(Power(2, Ceil(Log2(TexOrygW))));
+ TexNewH := Round(Power(2, Ceil(Log2(TexOrygH))));
+ TextureB.Width := TexNewW;
+ TextureB.Height := TexNewH;
+ // kopiowanie
+ for Pet := 0 to TextureB.Height-1 do begin
+ for Pet2 := 0 to TextureB.Width-1 do begin
+ Pix := TextureB.Canvas.Pixels[Pet2, Pet];
+ TextureD32[Pet*TextureB.Width + Pet2 + 1, 1] := 127;
+ TextureD32[Pet*TextureB.Width + Pet2 + 1, 2] := 127;
+ TextureD32[Pet*TextureB.Width + Pet2 + 1, 3] := 127;
+ TextureD32[Pet*TextureB.Width + Pet2 + 1, 4] := 255 - (Pix mod 256);
+ end;
+ end;
+ glTexImage2D(GL_TEXTURE_2D, 0, 4, TextureB.Width, TextureB.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, @TextureD32);
+{ if Mipmapping then begin
+ Error := gluBuild2DMipmaps(GL_TEXTURE_2D, 4, TextureB.Width, TextureB.Height, GL_RGBA, GL_UNSIGNED_BYTE, @TextureD32);
+ if Error > 0 then beep;
+ end;}
+ end;
+
+ if Typ = 'Arrow' then begin
+ TextureB.PixelFormat := pf24bit;
+ for Pet := 0 to TextureB.Height-1 do begin
+ PPix := TextureB.ScanLine[Pet];
+ for Pet2 := 0 to TextureB.Width-1 do begin
+ Pix := PPix[Pet2 * 3];
+
+ // transparency
+ if Pix >= 127 then TempA := 255;
+ if Pix < 127 then TempA := Pix * 2;
+
+ // ColInt = color intensity
+ if Pix < 127 then ColInt := 1;
+ if Pix >= 127 then ColInt := 2 - Pix / 128;
+ //0.75, 0.6, 0.25
+
+ TextureD32[Pet*TextureB.Width + Pet2 + 1, 1] := Round(ColInt * 0.75 * 255 + (1 - ColInt) * 255);
+ TextureD32[Pet*TextureB.Width + Pet2 + 1, 2] := Round(ColInt * 0.6 * 255 + (1 - ColInt) * 255);
+ TextureD32[Pet*TextureB.Width + Pet2 + 1, 3] := Round(ColInt * 0.25 * 255 + (1 - ColInt) * 255);
+ TextureD32[Pet*TextureB.Width + Pet2 + 1, 4] := TempA;
+ end;
+ end;
+ glTexImage2D(GL_TEXTURE_2D, 0, 4, TextureB.Width, TextureB.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, @TextureD32);
+
+ if Mipmapping then glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR_MIPMAP_LINEAR);
+ if Mipmapping then begin
+ Error := gluBuild2DMipmaps(GL_TEXTURE_2D, 4, TextureB.Width, TextureB.Height, GL_RGBA, GL_UNSIGNED_BYTE, @TextureD32);
+ if Error > 0 then beep;
+ end;
+ end;
+
+ if Typ = 'Note Plain' then begin
+ for Pet := 0 to TextureB.Height-1 do begin
+ PPix := TextureB.ScanLine[Pet];
+ for Pet2 := 0 to TextureB.Width-1 do begin
+
+
+
+ // Skin Patch
+ // 0-191= Fade Black to Col, 192= Col, 193-254 Fade Col to White, 255= White
+ case PPix[Pet2*3] of
+ 0..191: Pix := $10000 * ((((Col div $10000) and $FF) * PPix[Pet2*3]) div $Bf) + $100 * ((((Col div $100) and $FF) * PPix[Pet2*3]) div $Bf) + (((Col and $FF) * PPix[Pet2*3]) div $Bf);
+ 192: Pix := Col;
+ 193..254: Pix := Col + ($10000 * ((($FF - ((Col div $10000) and $FF)) * ((PPix[Pet2*3] - $C0) * 4) ) div $FF) + $100 * ((($FF - ((Col div $100) and $FF)) * ((PPix[Pet2*3] - $C0) * 4)) div $FF) + ((($FF - (Col and $FF)) * ((PPix[Pet2*3] - $C0) * 4)) div $FF));
+ 255: Pix := $FFFFFF;
+ end;
+// 0.5.0. Original
+// case PPix[Pet2*3] of
+// 128: Pix := $10000 * ((Col div $10000) div 2) + $100 * (((Col div $100) and $FF) div 2) + (Col and $FF) div 2;
+// 192: Pix := Col;
+// 255: Pix := $FFFFFF;
+// end;
+
+
+
+
+
+ TextureD24[Pet*TextureB.Width + Pet2 + 1, 1] := Pix div $10000;
+ TextureD24[Pet*TextureB.Width + Pet2 + 1, 2] := (Pix div $100) and $FF;
+ TextureD24[Pet*TextureB.Width + Pet2 + 1, 3] := Pix and $FF;
+ end;
+ end;
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, TextureB.Width, TextureB.Height, 0, GL_RGB, GL_UNSIGNED_BYTE, @TextureD24);
+ end;
+
+ if Typ = 'Note Transparent' then begin
+ for Pet := 0 to TextureB.Height-1 do begin
+ PPix := TextureB.ScanLine[Pet];
+ for Pet2 := 0 to TextureB.Width-1 do begin
+ TempA := 255;
+
+
+
+ //Skin Patch
+ // 0= Transparent, 1-191= Fade Black to Col, 192= Col, 193-254 Fade Col to White, 255= White
+ case PPix[Pet2*3] of
+ 0: TempA := 0;
+ 1..191: Pix := $10000 * ((((Col div $10000) and $FF) * PPix[Pet2*3]) div $Bf) + $100 * ((((Col div $100) and $FF) * PPix[Pet2*3]) div $Bf) + (((Col and $FF) * PPix[Pet2*3]) div $Bf);
+ 192: Pix := Col;
+ 193..254: Pix := Col + ($10000 * ((($FF - ((Col div $10000) and $FF)) * ((PPix[Pet2*3] - $C0) * 4) ) div $FF) + $100 * ((($FF - ((Col div $100) and $FF)) * ((PPix[Pet2*3] - $C0) * 4)) div $FF) + ((($FF - (Col and $FF)) * ((PPix[Pet2*3] - $C0) * 4)) div $FF));
+ 255: Pix := $FFFFFF;
+ end;
+// 0.5.0 Original
+// case PPix[Pet2*3] of
+// 0: TempA := 0;
+// 128: Pix := $10000 * ((Col div $10000) div 2) + $100 * (((Col div $100) and $FF) div 2) + (Col and $FF) div 2;
+// 192: Pix := Col;
+// 255: Pix := $FFFFFF;
+// end;
+
+
+
+
+ TextureD32[Pet*TextureB.Width + Pet2 + 1, 1] := Pix div $10000;
+ TextureD32[Pet*TextureB.Width + Pet2 + 1, 2] := (Pix div $100) and $FF;
+ TextureD32[Pet*TextureB.Width + Pet2 + 1, 3] := Pix and $FF;
+ TextureD32[Pet*TextureB.Width + Pet2 + 1, 4] := TempA;
+ end;
+ end;
+ glTexImage2D(GL_TEXTURE_2D, 0, 4, TextureB.Width, TextureB.Height, 0, GL_RGBA, GL_UNSIGNED_BYTE, @TextureD32);
+ end;
+
+
+
+
+ TextureB.Free;
+// Inc(ActTex);
+{ Tekst.Tekstura := ActTex;
+ Tekst.W := TexOrygW;
+ Tekst.H := TexOrygH;
+ Tekst.X2 := TexOrygW/TexNewW;
+ Tekst.Y2 := TexOrygH/TexNewH;}
+ Result.X := 0;
+ Result.Y := 0;
+ Result.W := 0;
+ Result.H := 0;
+ Result.ScaleW := 1;
+ Result.ScaleH := 1;
+ Result.Rot := 0;
+ Result.TexNum := ActTex;
+ Result.TexW := TexOrygW / TexNewW;
+ Result.TexH := TexOrygH / TexNewH;
+
+ Result.Int := 1;
+ Result.ColR := 1;
+ Result.ColG := 1;
+ Result.ColB := 1;
+ Result.Alpha := 1;
+
+ // 0.4.2 new test - default use whole texure, taking TexW and TexH as const and changing these
+ Result.TexX1 := 0;
+ Result.TexY1 := 0;
+ Result.TexX2 := 1;
+ Result.TexY2 := 1;
+
+ // 0.5.0
+ Result.Name := Nazwa;
+
+ end;
+
+ Log.BenchmarkEnd(4);
+ if Log.BenchmarkTimeLength[4] >= 1 then
+ Log.LogBenchmark('**********> Texture Load Time Warning - ' + Format + '/' + Nazwa + '/' + Typ, 4);
+
+ end; // logerror
+end;
+
+{procedure ResizeTexture(s: pbytearray; d: pbytearray);
+var
+ Pet: integer;
+ Pet2: integer;
+begin
+ for Pet := 0 to TexNewH*4-1 do
+ for Pet2 := 0 to TexNewW-1 do
+ d[Pet*TexNewW + Pet2] := 0;
+
+ for Pet := 0 to TexOrygH-1 do begin
+ for Pet2 := 0 to TexOrygW-1 do begin
+ d[(Pet*TexNewW + Pet2)*4] := Paleta[s[Pet*TexOrygW + Pet2], 1];
+ d[(Pet*TexNewW + Pet2)*4+1] := Paleta[s[Pet*TexOrygW + Pet2], 2];
+ d[(Pet*TexNewW + Pet2)*4+2] := Paleta[s[Pet*TexOrygW + Pet2], 3];
+ d[(Pet*TexNewW + Pet2)*4+3] := Paleta[s[Pet*TexOrygW + Pet2], 4];
+ end;
+ end;
+end;}
+
+{procedure SetTexture(p: pointer);
+begin
+ glGenTextures(1, Tekstur);
+ glBindTexture(GL_TEXTURE_2D, Tekstur);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP);
+ glTexImage2D(GL_TEXTURE_2D, 0, 4, TexNewW, TexNewH, 0, GL_RGBA, GL_UNSIGNED_BYTE, p);
+end;}
+
+function TTextureUnit.LoadTexture(Nazwa, Format, Typ: PChar; Col: LongWord): TTexture;
+begin
+ Result := LoadTexture(false, Nazwa, Format, Typ, Col);
+// Result := LoadTexture(SkinReg, Nazwa, Format, Typ, Col); // default to SkinReg
+
+end;
+
+function TTextureUnit.LoadTexture(Nazwa: string): TTexture;
+begin
+ Result := LoadTexture(false, pchar(Nazwa), 'JPG', 'Plain', 0);
+end;
+
+function TTextureUnit.CreateTexture(var Data: array of byte; Name: string; W, H: word; Bits: byte): TTexture;
+var
+ Pet: integer;
+ Pet2: integer;
+ Pix: integer;
+ ColInt: real;
+ PPix: PByteArray;
+ TempA: integer;
+ Error: integer;
+begin
+ Mipmapping := false;
+
+ glGenTextures(1, ActTex); // ActText = new texture number
+ glBindTexture(GL_TEXTURE_2D, ActTex);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
+
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, W, H, 0, GL_RGB, GL_UNSIGNED_BYTE, @Data[0]);
+ if Mipmapping then begin
+ Error := gluBuild2DMipmaps(GL_TEXTURE_2D, 3, W, H, GL_RGB, GL_UNSIGNED_BYTE, @Data[0]);
+ if Error > 0 then beep;
+ end;
+
+
+// Inc(ActTex);
+{ Tekst.Tekstura := ActTex;
+ Tekst.W := TexOrygW;
+ Tekst.H := TexOrygH;
+ Tekst.X2 := TexOrygW/TexNewW;
+ Tekst.Y2 := TexOrygH/TexNewH;}
+ Result.X := 0;
+ Result.Y := 0;
+ Result.W := 0;
+ Result.H := 0;
+ Result.ScaleW := 1;
+ Result.ScaleH := 1;
+ Result.Rot := 0;
+ Result.TexNum := ActTex;
+ Result.TexW := 1;
+ Result.TexH := 1;
+
+ Result.Int := 1;
+ Result.ColR := 1;
+ Result.ColG := 1;
+ Result.ColB := 1;
+ Result.Alpha := 1;
+
+ // 0.4.2 new test - default use whole texure, taking TexW and TexH as const and changing these
+ Result.TexX1 := 0;
+ Result.TexY1 := 0;
+ Result.TexX2 := 1;
+ Result.TexY2 := 1;
+
+ // 0.5.0
+ Result.Name := Name;
+end;
+
+procedure TTextureUnit.UnloadTexture(Name: string; FromCache: boolean);
+var
+ T: integer;
+ TexNum: GLuint;
+begin
+ T := FindTexture(Name);
+
+ if not FromCache then begin
+ TexNum := TextureDatabase.Texture[T].Texture.TexNum;
+ if TexNum >= 0 then begin
+ glDeleteTextures(1, @TexNum);
+ TextureDatabase.Texture[T].Texture.TexNum := -1;
+// Log.LogError('Unload texture no '+IntToStr(TexNum));
+ end;
+ end else begin
+ TexNum := TextureDatabase.Texture[T].TextureCache.TexNum;
+ if TexNum >= 0 then begin
+ glDeleteTextures(1, @TexNum);
+ TextureDatabase.Texture[T].TextureCache.TexNum := -1;
+// Log.LogError('Unload texture cache no '+IntToStr(TexNum));
+ end;
+ end;
+end;
+
+end. \ No newline at end of file
diff --git a/Game/Code/Classes/UThemes.pas b/Game/Code/Classes/UThemes.pas
new file mode 100644
index 00000000..c83e70c5
--- /dev/null
+++ b/Game/Code/Classes/UThemes.pas
@@ -0,0 +1,2611 @@
+unit UThemes;
+
+interface
+
+uses
+IniFiles, SysUtils, Classes;
+
+type
+ TRGB = record
+ R: single;
+ G: single;
+ B: single;
+ end;
+
+ {TSkin = record
+ GrayLeft: string;
+ GrayMid: string;
+ GrayRight: string;
+
+ NoteBGLeft: string;
+ NoteBGMid: string;
+ NoteBGRight: string;
+
+ NoteStar: string;
+
+ Ball: string;
+
+
+
+ //SingBar Mod
+ SingBarBack: string;
+ SingBarBar: string;
+ SingBarFront: string;
+ //end Singbar Mod
+
+ //PhrasenBonus - Line Bonus Mod
+ SingLineBonusBack: string;
+ //PhrasenBonus - Line Bonus Mod
+
+
+
+ WelcomeBG: string;
+
+ Background: string;
+ ScoreBG: string;
+ MainStart: string;
+ MainEditor: string;
+ MainOptions: string;
+ MainExit: string;
+ MainBar: string;
+ Cursor: string;
+
+ SongFade: string;
+ SongCover: string;
+ SongSelection: string;
+
+ SelectSong: string;
+ Button: string;
+ Bar: string;
+ P: string;
+ Arrow: string;
+ Arrow2: string;
+ ButtonF: string;
+ Star: string;
+ Line: string;
+
+// ThemePath: string;
+ SkinReg: boolean;
+ SkinName: string;
+ SkinPath: string;
+ SkinColor: integer;
+ end;}
+
+ TThemeBackground = record
+ Tex: string;
+ end;
+
+ TThemeStatic = record
+ X: integer;
+ Y: integer;
+ Z: real;
+ W: integer;
+ H: integer;
+ Color: string;
+ ColR: real;
+ ColG: real;
+ ColB: real;
+ Tex: string;
+ Typ: string;
+ TexX1: real;
+ TexY1: real;
+ TexX2: real;
+ TexY2: real;
+ //Reflection Mod
+ Reflection: boolean;
+ Reflectionspacing: Real;
+ end;
+ AThemeStatic = array of TThemeStatic;
+
+ TThemeText = record
+ X: integer;
+ Y: integer;
+ W: integer;
+ Color: string;
+ ColR: real;
+ ColG: real;
+ ColB: real;
+ Font: integer;
+ Size: integer;
+ Align: integer;
+ Text: string;
+ end;
+ AThemeText = array of TThemeText;
+
+ TThemeButton = record
+ Text: AThemeText;
+ X: integer;
+ Y: integer;
+ Z: Real;
+ W: integer;
+ H: integer;
+ Color: string;
+ ColR: real;
+ ColG: real;
+ ColB: real;
+ Int: real;
+ DColor: string;
+ DColR: real;
+ DColG: real;
+ DColB: real;
+ DInt: real;
+ Tex: string;
+ Typ: string;
+
+ Visible: Boolean;
+
+ //Reflection Mod
+ Reflection: boolean;
+ Reflectionspacing: Real;
+ //Fade Mod
+ SelectH: integer;
+ SelectW: integer;
+ Fade: boolean;
+ FadeText: boolean;
+ DeSelectReflectionspacing : Real;
+ FadeTex: string;
+ FadeTexPos: integer;
+
+ //Button Collection Mod
+ Parent: Byte; //Number of the Button Collection this Button is assigned to. IF 0: No Assignement
+ end;
+
+ //Button Collection Mod
+ TThemeButtonCollection = record
+ Style: TThemeButton;
+ ChildCount: Byte; //No of assigned Childs
+ FirstChild: Byte; //No of Child on whose Interaction Position the Button should be
+ end;
+
+ AThemeButtonCollection = array of TThemeButtonCollection;
+ PAThemeButtonCollection = ^AThemeButtonCollection;
+
+ TThemeSelect = record
+ Tex: string;
+ TexSBG: string;
+ X: integer;
+ Y: integer;
+ W: integer;
+ H: integer;
+ Text: string;
+ ColR, ColG, ColB, Int: real;
+ DColR, DColG, DColB, DInt: real;
+ TColR, TColG, TColB, TInt: real;
+ TDColR, TDColG, TDColB, TDInt: real;
+ SBGColR, SBGColG, SBGColB, SBGInt: real;
+ SBGDColR, SBGDColG, SBGDColB, SBGDInt: real;
+ STColR, STColG, STColB, STInt: real;
+ STDColR, STDColG, STDColB, STDInt: real;
+ SkipX: integer;
+ end;
+
+ TThemeSelectSlide = record
+ Tex: string;
+ TexSBG: string;
+ X: integer;
+ Y: integer;
+ W: integer;
+ H: integer;
+ Z: real;
+
+ TextSize: integer;
+
+ //SBGW Mod
+ SBGW: integer;
+
+ Text: string;
+ ColR, ColG, ColB, Int: real;
+ DColR, DColG, DColB, DInt: real;
+ TColR, TColG, TColB, TInt: real;
+ TDColR, TDColG, TDColB, TDInt: real;
+ SBGColR, SBGColG, SBGColB, SBGInt: real;
+ SBGDColR, SBGDColG, SBGDColB, SBGDInt: real;
+ STColR, STColG, STColB, STInt: real;
+ STDColR, STDColG, STDColB, STDInt: real;
+ SkipX: integer;
+ end;
+
+ PThemeBasic = ^TThemeBasic;
+ TThemeBasic = class
+ Background: TThemeBackground;
+ Text: AThemeText;
+ Static: AThemeStatic;
+
+ //Button Collection Mod
+ ButtonCollection: AThemeButtonCollection;
+ end;
+
+ TThemeLoading = class(TThemeBasic)
+ StaticAnimation: TThemeStatic;
+ TextLoading: TThemeText;
+ end;
+
+ TThemeMain = class(TThemeBasic)
+ ButtonSolo: TThemeButton;
+ ButtonMulti: TThemeButton;
+ ButtonMultiM2: TThemeButton; //for M2-MOD
+ ButtonStat: TThemeButton;
+ ButtonEditor: TThemeButton;
+ ButtonOptions: TThemeButton;
+ ButtonExit: TThemeButton;
+
+ TextDescription: TThemeText;
+ TextDescriptionLong: TThemeText;
+ Description: array[0..6] of string;
+ DescriptionLong: array[0..6] of string;
+ end;
+
+ TThemeName = class(TThemeBasic)
+ ButtonPlayer: array[1..6] of TThemeButton;
+ end;
+
+ TThemeLevel = class(TThemeBasic)
+ ButtonEasy: TThemeButton;
+ ButtonMedium: TThemeButton;
+ ButtonHard: TThemeButton;
+ end;
+
+ TThemeSong = class(TThemeBasic)
+ TextArtist: TThemeText;
+ TextTitle: TThemeText;
+ TextNumber: TThemeText;
+
+ TextPlugin: TThemeText;
+ TextP1: TThemeText;
+ TextP2: TThemeText;
+
+ TextMedley: array[1..4] of TThemeText;
+
+ //Video Icon Mod
+ VideoIcon: TThemeStatic;
+
+ //Medley Icons
+ MedleyIcon: TThemeStatic;
+ CalculatedMedleyIcon: TThemeStatic;
+
+ //Show Cat in TopLeft Mod
+ TextCat: TThemeText;
+ StaticCat: TThemeStatic;
+
+ //Cover Mod
+ Cover: record
+ Reflections: Boolean;
+ X: Integer;
+ Y: Integer;
+ Z: Integer;
+ W: Integer;
+ H: Integer;
+ Style: Integer;
+ end;
+
+ //Equalizer Mod
+ Equalizer: record
+ Visible: Boolean;
+ Direction: Boolean;
+ Alpha: real;
+ X: Integer;
+ Y: Integer;
+ Z: Real;
+ W: Integer;
+ H: Integer;
+ Space: Integer;
+ Bands: Integer;
+ Length: Integer;
+ ColR, ColG, ColB: Real;
+ end;
+
+
+ //Party and Non Party specific Statics and Texts
+ StaticParty: AThemeStatic;
+ TextParty: AThemeText;
+
+ StaticM2Party: AThemeStatic;
+ TextM2Party: AThemeText;
+
+ StaticNonParty: AThemeStatic;
+ TextNonParty: AThemeText;
+
+ //Party Mode
+ StaticTeam1Joker1: TThemeStatic;
+ StaticTeam1Joker2: TThemeStatic;
+ StaticTeam1Joker3: TThemeStatic;
+ StaticTeam1Joker4: TThemeStatic;
+ StaticTeam1Joker5: TThemeStatic;
+ StaticTeam2Joker1: TThemeStatic;
+ StaticTeam2Joker2: TThemeStatic;
+ StaticTeam2Joker3: TThemeStatic;
+ StaticTeam2Joker4: TThemeStatic;
+ StaticTeam2Joker5: TThemeStatic;
+ StaticTeam3Joker1: TThemeStatic;
+ StaticTeam3Joker2: TThemeStatic;
+ StaticTeam3Joker3: TThemeStatic;
+ StaticTeam3Joker4: TThemeStatic;
+ StaticTeam3Joker5: TThemeStatic;
+
+ SongTextPartyTeam1NumJoker: TThemeText;
+ SongTextPartyTeam2NumJoker: TThemeText;
+ SongTextPartyTeam3NumJoker: TThemeText;
+
+ end;
+
+ TThemeSing = class(TThemeBasic)
+ //Show actual SongName for Medley-Mode
+ StaticSongName : TThemeStatic;
+ TextSongName : TThemeText;
+
+ //TimeBar mod
+ StaticTimeProgress: TThemeStatic;
+ TextTimeText : TThemeText;
+ //eoa TimeBar mod
+
+ StaticP1: TThemeStatic;
+ TextP1: TThemeText;
+ StaticP1ScoreBG: TThemeStatic; //Static for ScoreBG
+ TextP1Score: TThemeText;
+
+ //moveable singbar mod
+ StaticP1SingBar: TThemeStatic;
+ StaticP1ThreePSingBar: TThemeStatic;
+ StaticP1TwoPSingBar: TThemeStatic;
+ StaticP2RSingBar: TThemeStatic;
+ StaticP2MSingBar: TThemeStatic;
+ StaticP3SingBar: TThemeStatic;
+ //eoa moveable singbar
+
+ //added for ps3 skin
+ //game in 2/4 player modi
+ StaticP1TwoP: TThemeStatic;
+ StaticP1TwoPScoreBG: TThemeStatic; //Static for ScoreBG
+ TextP1TwoP: TThemeText;
+ TextP1TwoPScore: TThemeText;
+ //game in 3/6 player modi
+ StaticP1ThreeP: TThemeStatic;
+ StaticP1ThreePScoreBG: TThemeStatic; //Static for ScoreBG
+ TextP1ThreeP: TThemeText;
+ TextP1ThreePScore: TThemeText;
+ //eoa
+
+ StaticP2R: TThemeStatic;
+ StaticP2RScoreBG: TThemeStatic; //Static for ScoreBG
+ TextP2R: TThemeText;
+ TextP2RScore: TThemeText;
+
+ StaticP2M: TThemeStatic;
+ StaticP2MScoreBG: TThemeStatic; //Static for ScoreBG
+ TextP2M: TThemeText;
+ TextP2MScore: TThemeText;
+
+ StaticP3R: TThemeStatic;
+ StaticP3RScoreBG: TThemeStatic; //Static for ScoreBG
+ TextP3R: TThemeText;
+ TextP3RScore: TThemeText;
+
+ //Linebonus Translations
+ LineBonusText: Array [0..8] of String;
+
+ VideoAspectText: TThemeText;
+ VideoAspectStatic: TThemeStatic;
+ end;
+
+ TThemeScore = class(TThemeBasic)
+ TextArtist: TThemeText;
+ TextTitle: TThemeText;
+
+ TextArtistTitle: TThemeText;
+
+ StaticMedleyNav: TThemeStatic;
+ TextMedleyNav: TThemeText;
+
+ PlayerStatic: array[1..6] of AThemeStatic;
+ PlayerTexts: array[1..6] of AThemeText;
+
+ TextName: array[1..6] of TThemeText;
+ TextScore: array[1..6] of TThemeText;
+
+ TextNotes: array[1..6] of TThemeText;
+ TextNotesScore: array[1..6] of TThemeText;
+ TextLineBonus: array[1..6] of TThemeText;
+ TextLineBonusScore: array[1..6] of TThemeText;
+ TextGoldenNotes: array[1..6] of TThemeText;
+ TextGoldenNotesScore: array[1..6] of TThemeText;
+ TextTotal: array[1..6] of TThemeText;
+ TextTotalScore: array[1..6] of TThemeText;
+
+ StaticBoxLightest: array[1..6] of TThemeStatic;
+ StaticBoxLight: array[1..6] of TThemeStatic;
+ StaticBoxDark: array[1..6] of TThemeStatic;
+
+ StaticBackLevel: array[1..6] of TThemeStatic;
+ StaticBackLevelRound: array[1..6] of TThemeStatic;
+ StaticLevel: array[1..6] of TThemeStatic;
+ StaticLevelRound: array[1..6] of TThemeStatic;
+
+// Description: array[0..5] of string;}
+ end;
+
+ TThemeTop = class(TThemeBasic)
+ TextLevel: TThemeText;
+ TextArtistTitle: TThemeText;
+
+ StaticNumber: AThemeStatic;
+ TextNumber: AThemeText;
+ TextName: AThemeText;
+ TextScore: AThemeText;
+ TextDate: AThemeText;
+ end;
+
+ TThemeOptions = class(TThemeBasic)
+ ButtonGame: TThemeButton;
+ ButtonGraphics: TThemeButton;
+ ButtonSound: TThemeButton;
+ ButtonLyrics: TThemeButton;
+ ButtonThemes: TThemeButton;
+ ButtonRecord: TThemeButton;
+ ButtonAdvanced: TThemeButton;
+ ButtonExit: TThemeButton;
+
+ TextDescription: TThemeText;
+ Description: array[0..7] of string;
+ end;
+
+ TThemeOptionsGame = class(TThemeBasic)
+ SelectPlayers: TThemeSelect;
+ SelectDifficulty: TThemeSelect;
+ SelectLanguage: TThemeSelectSlide;
+ SelectTabs: TThemeSelect;
+ SelectSorting: TThemeSelectSlide;
+ SelectDebug: TThemeSelect;
+ ButtonExit: TThemeButton;
+ end;
+
+ TThemeOptionsGraphics = class(TThemeBasic)
+ SelectFullscreen: TThemeSelect;
+ SelectSlideResolution: TThemeSelectSlide;
+ SelectDepth: TThemeSelect;
+ SelectOscilloscope: TThemeSelect;
+ SelectLineBonus: TThemeSelect;
+ SelectMovieSize: TThemeSelect;
+ SelectMoviePreview: TThemeSelect;
+ ButtonExit: TThemeButton;
+ end;
+
+ TThemeOptionsSound = class(TThemeBasic)
+ SelectMicBoost: TThemeSelect;
+ SelectClickAssist: TThemeSelect;
+ SelectBeatClick: TThemeSelect;
+ SelectThreshold: TThemeSelect;
+ //Song Preview
+ SelectSlidePreviewVolume: TThemeSelectSlide;
+ SelectSlidePreviewFading: TThemeSelectSlide;
+ ButtonExit: TThemeButton;
+ end;
+
+ TThemeOptionsLyrics = class(TThemeBasic)
+ SelectLyricsFont: TThemeSelect;
+ SelectLyricsEffect: TThemeSelect;
+ SelectSolmization: TThemeSelect;
+ ButtonExit: TThemeButton;
+ end;
+
+ TThemeOptionsThemes = class(TThemeBasic)
+ SelectTheme: TThemeSelectSlide;
+ SelectSkin: TThemeSelectSlide;
+ SelectColor: TThemeSelectSlide;
+ ButtonExit: TThemeButton;
+ end;
+
+ TThemeOptionsRecord = class(TThemeBasic)
+ SelectSlideCard: TThemeSelectSlide;
+ SelectSlideInput: TThemeSelectSlide;
+ SelectSlideChannelL: TThemeSelectSlide;
+ SelectSlideChannelR: TThemeSelectSlide;
+ ButtonExit: TThemeButton;
+ end;
+
+ TThemeOptionsAdvanced = class(TThemeBasic)
+ SelectLoadAnimation: TThemeSelect;
+ SelectEffectSing: TThemeSelect;
+ SelectScreenFade: TThemeSelect;
+ SelectLineBonus: TThemeSelect;
+ SelectAskbeforeDel: TThemeSelect;
+ SelectOnSongClick: TThemeSelectSlide;
+ SelectPartyPopup: TThemeSelect;
+ ButtonExit: TThemeButton;
+ end;
+
+ //Error- and Check-Popup
+ TThemeError = class(TThemeBasic)
+ Button1: TThemeButton;
+ TextError: TThemeText;
+ end;
+
+ TThemeCheck = class(TThemeBasic)
+ Button1: TThemeButton;
+ Button2: TThemeButton;
+ TextCheck: TThemeText;
+ end;
+
+ //Help- Popup
+ TThemeHelp = class(TThemeBasic)
+ Button1: TThemeButton;
+ end;
+
+
+ //ScreenSong Menue
+ TThemeSongMenu = class(TThemeBasic)
+ Button1: TThemeButton;
+ Button2: TThemeButton;
+ Button3: TThemeButton;
+ Button4: TThemeButton;
+
+ SelectSlide3: TThemeSelectSlide;
+
+ TextMenu: TThemeText;
+ end;
+
+ TThemeSongJumpTo = class(TThemeBasic)
+ ButtonSearchText: TThemeButton;
+ SelectSlideType: TThemeSelectSlide;
+ TextFound: TThemeText;
+
+ //Translated Texts
+ Songsfound: String;
+ NoSongsfound: String;
+ CatText: String;
+ IType: array [0..2] of String;
+ end;
+
+ //Party Screens
+ TThemePartyNewRound = class(TThemeBasic)
+ TextRound1: TThemeText;
+ TextRound2: TThemeText;
+ TextRound3: TThemeText;
+ TextRound4: TThemeText;
+ TextRound5: TThemeText;
+ TextRound6: TThemeText;
+ TextRound7: TThemeText;
+ TextWinner1: TThemeText;
+ TextWinner2: TThemeText;
+ TextWinner3: TThemeText;
+ TextWinner4: TThemeText;
+ TextWinner5: TThemeText;
+ TextWinner6: TThemeText;
+ TextWinner7: TThemeText;
+ TextNextRound: TThemeText;
+ TextNextRoundNo: TThemeText;
+ TextNextPlayer1: TThemeText;
+ TextNextPlayer2: TThemeText;
+ TextNextPlayer3: TThemeText;
+
+ StaticRound1: TThemeStatic;
+ StaticRound2: TThemeStatic;
+ StaticRound3: TThemeStatic;
+ StaticRound4: TThemeStatic;
+ StaticRound5: TThemeStatic;
+ StaticRound6: TThemeStatic;
+ StaticRound7: TThemeStatic;
+
+ TextScoreTeam1: TThemeText;
+ TextScoreTeam2: TThemeText;
+ TextScoreTeam3: TThemeText;
+ TextNameTeam1: TThemeText;
+ TextNameTeam2: TThemeText;
+ TextNameTeam3: TThemeText;
+ TextTeam1Players: TThemeText;
+ TextTeam2Players: TThemeText;
+ TextTeam3Players: TThemeText;
+
+ StaticTeam1: TThemeStatic;
+ StaticTeam2: TThemeStatic;
+ StaticTeam3: TThemeStatic;
+ StaticNextPlayer1: TThemeStatic;
+ StaticNextPlayer2: TThemeStatic;
+ StaticNextPlayer3: TThemeStatic;
+ end;
+
+ //PartyNewRoundM2
+ TThemePartyNewRoundM2 = class(TThemeBasic)
+ TextRound: array [1..9] of TThemeText;
+ TextWinner: array [1..9] of TThemeText;
+
+ TextNextRound: TThemeText;
+ TextNextRoundNo: TThemeText;
+ TextNextPlayer1: TThemeText;
+ TextNextPlayer2: TThemeText;
+ TextHandicap: TThemeText;
+
+ StaticRound: array [1..9] of TThemeStatic;
+ StaticTable: array [1..9] of TThemeStatic;
+
+ TextScoreTeam1: TThemeText;
+ TextScoreTeam2: TThemeText;
+
+ StaticNextPlayer1: TThemeStatic;
+ StaticNextPlayer2: TThemeStatic;
+ StaticHandicap: TThemeStatic;
+
+ TextTableName: array[1..9, 1..7] of TThemeText;
+ end;
+
+ TThemePartyScore = class(TThemeBasic)
+ TextScoreTeam1: TThemeText;
+ TextScoreTeam2: TThemeText;
+ TextScoreTeam3: TThemeText;
+ TextNameTeam1: TThemeText;
+ TextNameTeam2: TThemeText;
+ TextNameTeam3: TThemeText;
+ StaticTeam1: TThemeStatic;
+ StaticTeam1BG: TThemeStatic;
+ StaticTeam1Deco: TThemeStatic;
+ StaticTeam2: TThemeStatic;
+ StaticTeam2BG: TThemeStatic;
+ StaticTeam2Deco: TThemeStatic;
+ StaticTeam3: TThemeStatic;
+ StaticTeam3BG: TThemeStatic;
+ StaticTeam3Deco: TThemeStatic;
+
+ DecoTextures: record
+ ChangeTextures: Boolean;
+
+ FirstTexture: String;
+ FirstTyp: String;
+ FirstColor: String;
+
+ SecondTexture: String;
+ SecondTyp: String;
+ SecondColor: String;
+
+ ThirdTexture: String;
+ ThirdTyp: String;
+ ThirdColor: String;
+ end;
+
+
+ TextWinner: TThemeText;
+ end;
+
+ TThemePartyWin = class(TThemeBasic)
+ TextScoreTeam1: TThemeText;
+ TextScoreTeam2: TThemeText;
+ TextScoreTeam3: TThemeText;
+ TextNameTeam1: TThemeText;
+ TextNameTeam2: TThemeText;
+ TextNameTeam3: TThemeText;
+ StaticTeam1: TThemeStatic;
+ StaticTeam1BG: TThemeStatic;
+ StaticTeam1Deco: TThemeStatic;
+ StaticTeam2: TThemeStatic;
+ StaticTeam2BG: TThemeStatic;
+ StaticTeam2Deco: TThemeStatic;
+ StaticTeam3: TThemeStatic;
+ StaticTeam3BG: TThemeStatic;
+ StaticTeam3Deco: TThemeStatic;
+
+ TextWinner: TThemeText;
+ end;
+
+ TThemePartyOptions = class(TThemeBasic)
+ SelectLevel: TThemeSelectSlide;
+ SelectPlayList: TThemeSelectSlide;
+ SelectPlayList2: TThemeSelectSlide;
+ SelectRounds: TThemeSelectSlide;
+ SelectTeams: TThemeSelectSlide;
+ SelectPlayers1: TThemeSelectSlide;
+ SelectPlayers2: TThemeSelectSlide;
+ SelectPlayers3: TThemeSelectSlide;
+
+ {ButtonNext: TThemeButton;
+ ButtonPrev: TThemeButton;}
+ end;
+
+ TThemePartyOptionsM2 = class(TThemeBasic)
+ SelectLevel: TThemeSelectSlide;
+ SelectPlayList: TThemeSelectSlide;
+ SelectPlayList2: TThemeSelectSlide;
+ SelectRounds: TThemeSelectSlide;
+ SelectPlayers1: TThemeSelectSlide;
+ SelectOptionPlugin: TThemeSelectSlide;
+ SelectOptionHandicap: TThemeSelectSlide;
+ end;
+
+ TThemePartyPlayer = class(TThemeBasic)
+ Team1Name: TThemeButton;
+ Player1Name: TThemeButton;
+ Player2Name: TThemeButton;
+ Player3Name: TThemeButton;
+ Player4Name: TThemeButton;
+
+ Team2Name: TThemeButton;
+ Player5Name: TThemeButton;
+ Player6Name: TThemeButton;
+ Player7Name: TThemeButton;
+ Player8Name: TThemeButton;
+
+ Team3Name: TThemeButton;
+ Player9Name: TThemeButton;
+ Player10Name: TThemeButton;
+ Player11Name: TThemeButton;
+ Player12Name: TThemeButton;
+
+ {ButtonNext: TThemeButton;
+ ButtonPrev: TThemeButton;}
+ end;
+
+ TThemePartyPlayerM2 = class(TThemeBasic)
+ Player1Name: TThemeButton;
+ Player2Name: TThemeButton;
+ Player3Name: TThemeButton;
+ Player4Name: TThemeButton;
+ Player5Name: TThemeButton;
+ Player6Name: TThemeButton;
+ Player7Name: TThemeButton;
+ Player8Name: TThemeButton;
+ Player9Name: TThemeButton;
+ end;
+
+ //Stats Screens
+ TThemeStatMain = class(TThemeBasic)
+ ButtonScores: TThemeButton;
+ ButtonSingers: TThemeButton;
+ ButtonSongs: TThemeButton;
+ ButtonBands: TThemeButton;
+ ButtonExit: TThemeButton;
+
+ TextOverview: TThemeText;
+ end;
+
+ TThemeStatDetail = class(TThemeBasic)
+ ButtonNext: TThemeButton;
+ ButtonPrev: TThemeButton;
+ ButtonReverse: TThemeButton;
+ ButtonExit: TThemeButton;
+
+ TextDescription: TThemeText;
+ TextPage: TThemeText;
+ TextList: AThemeText;
+
+ Description: array[0..3] of string;
+ DescriptionR: array[0..3] of string;
+ FormatStr: array[0..3] of string;
+ PageStr: String;
+ end;
+
+ //Playlist Translations
+ TThemePlaylist = record
+ CatText: string;
+ end;
+
+ TTheme = class
+ private
+ {$IFDEF THEMESAVE}
+ ThemeIni: TIniFile;
+ {$ELSE}
+ ThemeIni: TMemIniFile;
+ {$ENDIF}
+
+ LastThemeBasic: TThemeBasic;
+ procedure create_theme_objects();
+ public
+
+ Loading: TThemeLoading;
+ Main: TThemeMain;
+ Name: TThemeName;
+ Level: TThemeLevel;
+ Song: TThemeSong;
+ Sing: TThemeSing;
+ Score: TThemeScore;
+ Top: TThemeTop;
+ Options: TThemeOptions;
+ OptionsGame: TThemeOptionsGame;
+ OptionsGraphics: TThemeOptionsGraphics;
+ OptionsSound: TThemeOptionsSound;
+ OptionsLyrics: TThemeOptionsLyrics;
+ OptionsThemes: TThemeOptionsThemes;
+ OptionsRecord: TThemeOptionsRecord;
+ OptionsAdvanced: TThemeOptionsAdvanced;
+ //error and check popup
+ ErrorPopup: TThemeError;
+ CheckPopup: TThemeCheck;
+ //help popup
+ HelpPopup: TThemeHelp;
+ //ScreenSong extensions
+ SongMenu: TThemeSongMenu;
+ SongJumpto: TThemeSongJumpTo;
+ //Party Screens:
+ PartyNewRound: TThemePartyNewRound;
+ PartyScore: TThemePartyScore;
+ PartyWin: TThemePartyWin;
+ PartyOptions: TThemePartyOptions;
+ PartyPlayer: TThemePartyPlayer;
+
+ //Party M2 Screens
+ PartyOptionsM2: TThemePartyOptionsM2;
+ PartyPlayerM2: TThemePartyPlayerM2;
+ PartyNewRoundM2: TThemePartyNewRoundM2;
+
+ //Stats Screens:
+ StatMain: TThemeStatMain;
+ StatDetail: TThemeStatDetail;
+
+ Playlist: TThemePlaylist;
+
+ ILevel: array[0..2] of String;
+
+ constructor Create(FileName: string); overload; // Initialize theme system
+ constructor Create(FileName: string; Color: integer); overload; // Initialize theme system with color
+ function LoadTheme(FileName: string; sColor: integer): boolean; // Load some theme settings from file
+
+ procedure LoadColors;
+
+ procedure ThemeLoadBasic(Theme: TThemeBasic; Name: string);
+ procedure ThemeLoadBackground(var ThemeBackground: TThemeBackground; Name: string);
+ procedure ThemeLoadText(var ThemeText: TThemeText; Name: string);
+ procedure ThemeLoadTexts(var ThemeText: AThemeText; Name: string);
+ procedure ThemeLoadStatic(var ThemeStatic: TThemeStatic; Name: string);
+ procedure ThemeLoadStatics(var ThemeStatic: AThemeStatic; Name: string);
+ procedure ThemeLoadButton(var ThemeButton: TThemeButton; Name: string; const Collections: PAThemeButtonCollection = nil);
+ procedure ThemeLoadButtonCollection(var Collection: TThemeButtonCollection; Name: string);
+ procedure ThemeLoadButtonCollections(var Collections: AThemeButtonCollection; Name: string);
+ procedure ThemeLoadSelect(var ThemeSelect: TThemeSelect; Name: string);
+ procedure ThemeLoadSelectSlide(var ThemeSelectS: TThemeSelectSlide; Name: string);
+
+ procedure ThemeSave(FileName: string);
+ procedure ThemeSaveBasic(Theme: TThemeBasic; Name: string);
+ procedure ThemeSaveBackground(ThemeBackground: TThemeBackground; Name: string);
+ procedure ThemeSaveStatic(ThemeStatic: TThemeStatic; Name: string);
+ procedure ThemeSaveStatics(ThemeStatic: AThemeStatic; Name: string);
+ procedure ThemeSaveText(ThemeText: TThemeText; Name: string);
+ procedure ThemeSaveTexts(ThemeText: AThemeText; Name: string);
+ procedure ThemeSaveButton(ThemeButton: TThemeButton; Name: string);
+
+ end;
+
+ TColor = record
+ Name: string;
+ RGB: TRGB;
+ end;
+
+function ColorExists(Name: string): integer;
+procedure LoadColor(var R, G, B: real; ColorName: string);
+function GetSystemColor(Color: integer): TRGB;
+function ColorSqrt(RGB: TRGB): TRGB;
+
+var
+ //Skin: TSkin;
+ Theme: TTheme;
+ Color: array of TColor;
+
+implementation
+
+uses
+{{$IFDEF TRANSLATE}
+ ULanguage,
+{{$ENDIF}
+USkins, UIni, Dialogs;
+
+constructor TTheme.Create(FileName: string);
+begin
+ Create(FileName, 0);
+end;
+
+constructor TTheme.Create(FileName: string; Color: integer);
+begin
+(*
+ Loading := TThemeLoading.Create;
+ Main := TThemeMain.Create;
+ Name := TThemeName.Create;
+ Level := TThemeLevel.Create;
+ Song := TThemeSong.Create;
+ Sing := TThemeSing.Create;
+ Score := TThemeScore.Create;
+ Top := TThemeTop.Create;
+ Options := TThemeOptions.Create;
+ OptionsGame := TThemeOptionsGame.Create;
+ OptionsGraphics := TThemeOptionsGraphics.Create;
+ OptionsSound := TThemeOptionsSound.Create;
+ OptionsLyrics := TThemeOptionsLyrics.Create;
+ OptionsThemes := TThemeOptionsThemes.Create;
+ OptionsRecord := TThemeOptionsRecord.Create;
+ OptionsAdvanced := TThemeOptionsAdvanced.Create;
+
+ ErrorPopup := TThemeError.Create;
+ CheckPopup := TThemeCheck.Create;
+
+ SongMenu := TThemeSongMenu.Create;
+ SongJumpto := TThemeSongJumpto.Create;
+ //Party Screens
+ PartyNewRound := TThemePartyNewRound.Create;
+ PartyWin := TThemePartyWin.Create;
+ PartyScore := TThemePartyScore.Create;
+ PartyOptions := TThemePartyOptions.Create;
+ PartyPlayer := TThemePartyPlayer.Create;
+
+ //Stats Screens:
+ StatMain := TThemeStatMain.Create;
+ StatDetail := TThemeStatDetail.Create;
+*)
+
+ LoadTheme(FileName, Color);
+
+
+ {Skin.GrayLeft := 'Left Gray.bmp';
+ Skin.GrayMid := 'Mid Gray.bmp';
+ Skin.GrayRight := 'Right Gray.bmp';
+
+ Skin.NoteBGLeft := 'Note BG Left.bmp';
+ Skin.NoteBGMid := 'Note BG Mid.bmp';
+ Skin.NoteBGRight := 'Note BG Right.bmp';
+
+ Skin.NoteStar := 'Note Star.jpg';
+
+
+
+ //SingBar Mod
+ Skin.SingBarBack := 'Sing Bar Back.jpg';
+ Skin.SingBarBar := 'Sing Bar Bar.jpg';
+ Skin.SingBarFront := 'Sing Bar Front.jpg';
+ //end Singbar Mod
+
+ //PhrasenBonus - Line Bonus Mod
+ Skin.SingLineBonusBack := 'Line Bonus PopUp.jpg';
+
+
+
+
+{ Skin.WelcomeBG := SkinPath + 'Welcome BG.jpg';
+// Skin.Background := SkinPath + 'Background.jpg';
+ Skin.ScoreBG := SkinPath + 'Score BG.jpg';
+// Skin.GameStart := SkinPath + 'Game Start.jpg';
+// Skin.Editor := SkinPath + 'Editor.jpg';
+// Skin.Options := SkinPath + 'Options.jpg';
+// Skin.Exit := SkinPath + 'Exit.jpg';
+
+ Skin.MainStart := SkinPath + 'Main Solo.jpg';
+ Skin.MainEditor := SkinPath + 'Main Multi.jpg';
+ Skin.MainOptions := SkinPath + 'Main Options.jpg';
+ Skin.MainExit := SkinPath + 'Main Exit.jpg';
+ Skin.MainBar := SkinPath + 'Main Bar.jpg';
+ Skin.Cursor := SkinPath + 'Main Cursor.jpg';
+
+ Skin.SongFade := SkinPath + 'Song Fade.jpg';}{
+ Skin.SongCover := 'Song Cover.jpg';
+ {Skin.SongSelection := SkinPath + 'Song Selection.jpg';
+
+ Skin.SelectSong := SkinPath + 'Select Song.jpg';}{
+// Skin.Button := SkinPath + 'MusicWheelItem song.jpg';
+ Skin.Bar := 'Bar.jpg';
+{ Skin.P := SkinPath + 'P.jpg';
+ Skin.Arrow := SkinPath + 'Arrow.jpg';
+ Skin.Arrow2 := SkinPath + 'Arrow 2.jpg';}{
+ Skin.ButtonF := 'Button.jpg';
+ Skin.Ball := 'Ball3.bmp';
+{ Skin.Star := SkinPath + 'Star.bmp';
+ Skin.Line := SkinPath + 'Line.jpg';}
+end;
+
+
+function TTheme.LoadTheme(FileName: string; sColor: integer): boolean;
+var
+ I, J: integer;
+ Path: string;
+begin
+ create_theme_objects();
+
+ Result := false;
+ if FileExists(FileName) then begin
+ Result := true;
+
+ {$IFDEF THEMESAVE}
+ ThemeIni := TIniFile.Create(FileName);
+ {$ELSE}
+ ThemeIni := TMemIniFile.Create(FileName);
+ {$ENDIF}
+
+ if ThemeIni.ReadString('Theme', 'Name', '') <> '' then
+ begin
+
+ {Skin.SkinName := ThemeIni.ReadString('Theme', 'Name', 'Singstar');
+ Skin.SkinPath := 'Skins\' + Skin.SkinName + '\';
+ Skin.SkinReg := false; }
+ Skin.Color := sColor;
+
+ Skin.LoadSkin(ISkin[Ini.SkinNo]);
+
+ LoadColors;
+
+// ThemeIni.Free;
+// ThemeIni := TIniFile.Create('Themes\Singstar\Main.ini');
+
+ // Loading
+ ThemeLoadBasic(Loading, 'Loading');
+ ThemeLoadText(Loading.TextLoading, 'LoadingTextLoading');
+ ThemeLoadStatic(Loading.StaticAnimation, 'LoadingStaticAnimation');
+
+ // Main
+ ThemeLoadBasic(Main, 'Main');
+
+ ThemeLoadText(Main.TextDescription, 'MainTextDescription');
+ ThemeLoadText(Main.TextDescriptionLong, 'MainTextDescriptionLong');
+ ThemeLoadButton(Main.ButtonSolo, 'MainButtonSolo');
+ ThemeLoadButton(Main.ButtonMulti, 'MainButtonMulti');
+ ThemeLoadButton(Main.ButtonMultiM2, 'MainButtonMultiM2'); // for M2-MOD
+ ThemeLoadButton(Main.ButtonStat, 'MainButtonStats');
+ ThemeLoadButton(Main.ButtonEditor, 'MainButtonEditor');
+ ThemeLoadButton(Main.ButtonOptions, 'MainButtonOptions');
+ ThemeLoadButton(Main.ButtonExit, 'MainButtonExit');
+
+ //Main Desc Text Translation Start
+
+ {{$IFDEF TRANSLATE}
+ Main.Description[0] := Language.Translate('SING_SING');
+ Main.DescriptionLong[0] := Language.Translate('SING_SING_DESC');
+ Main.Description[1] := Language.Translate('SING_MULTI');
+ Main.DescriptionLong[1] := Language.Translate('SING_MULTI_DESC');
+ Main.Description[2] := Language.Translate('SING_MULTI_M2');
+ Main.DescriptionLong[2] := Language.Translate('SING_MULTI_M2_DESC');
+ Main.Description[3] := Language.Translate('SING_STATS');
+ Main.DescriptionLong[3] := Language.Translate('SING_STATS_DESC');
+ Main.Description[4] := Language.Translate('SING_EDITOR');
+ Main.DescriptionLong[4] := Language.Translate('SING_EDITOR_DESC');
+ Main.Description[5] := Language.Translate('SING_GAME_OPTIONS');
+ Main.DescriptionLong[5] := Language.Translate('SING_GAME_OPTIONS_DESC');
+ Main.Description[6] := Language.Translate('SING_EXIT');
+ Main.DescriptionLong[6] := Language.Translate('SING_EXIT_DESC');
+ {{$ENDIF}
+
+ //Main Desc Text Translation End
+
+ Main.TextDescription.Text := Main.Description[0];
+ Main.TextDescriptionLong.Text := Main.DescriptionLong[0];
+
+ // Name
+ ThemeLoadBasic(Name, 'Name');
+
+ for I := 1 to 6 do
+ ThemeLoadButton(Name.ButtonPlayer[I], 'NameButtonPlayer'+IntToStr(I));
+
+ // Level
+ ThemeLoadBasic(Level, 'Level');
+
+ ThemeLoadButton(Level.ButtonEasy, 'LevelButtonEasy');
+ ThemeLoadButton(Level.ButtonMedium, 'LevelButtonMedium');
+ ThemeLoadButton(Level.ButtonHard, 'LevelButtonHard');
+
+
+ // Song
+ ThemeLoadBasic(Song, 'Song');
+
+ ThemeLoadText(Song.TextArtist, 'SongTextArtist');
+ ThemeLoadText(Song.TextTitle, 'SongTextTitle');
+ ThemeLoadText(Song.TextNumber, 'SongTextNumber');
+
+ ThemeLoadText(Song.TextPlugin, 'SongTextPlugin');
+ ThemeLoadText(Song.TextP1, 'SongTextM2P1');
+ ThemeLoadText(Song.TextP2, 'SongTextM2P2');
+
+ for I := 1 to 4 do
+ ThemeLoadText(Song.TextMedley[I], 'SongTextMedley' + IntToStr(I));
+
+ //Video Icon Mod
+ ThemeLoadStatic(Song.VideoIcon, 'SongVideoIcon');
+
+ //Medley Icons
+ ThemeLoadStatic(Song.MedleyIcon, 'SongMedleyIcon');
+ ThemeLoadStatic(Song.CalculatedMedleyIcon, 'SongCalculatedMedleyIcon');
+
+ //Show Cat in TopLeft Mod
+ ThemeLoadStatic(Song.StaticCat, 'SongStaticCat');
+ ThemeLoadText(Song.TextCat, 'SongTextCat');
+
+ //Load Cover Pos and Size from Theme Mod
+ Song.Cover.X := ThemeIni.ReadInteger('SongCover', 'X', 300);
+ Song.Cover.Y := ThemeIni.ReadInteger('SongCover', 'Y', 190);
+ Song.Cover.W := ThemeIni.ReadInteger('SongCover', 'W', 300);
+ Song.Cover.H := ThemeIni.ReadInteger('SongCover', 'H', 200);
+ Song.Cover.Style := ThemeIni.ReadInteger('SongCover', 'Style', 4);
+ Song.Cover.Reflections := (ThemeIni.ReadInteger('SongCover', 'Reflections', 0) = 1);
+ //Load Cover Pos and Size from Theme Mod End
+
+ //Load Equalizer Pos and Size from Theme Mod
+ Song.Equalizer.Visible := (ThemeIni.ReadInteger('SongEqualizer', 'Visible', 0) = 1);
+ Song.Equalizer.Direction := (ThemeIni.ReadInteger('SongEqualizer', 'Direction', 0) = 1);
+ Song.Equalizer.Alpha := ThemeIni.ReadInteger('SongEqualizer', 'Alpha', 1);
+ Song.Equalizer.Space := ThemeIni.ReadInteger('SongEqualizer', 'Space', 1);
+ Song.Equalizer.X := ThemeIni.ReadInteger('SongEqualizer', 'X', 0);
+ Song.Equalizer.Y := ThemeIni.ReadInteger('SongEqualizer', 'Y', 0);
+ Song.Equalizer.Z := ThemeIni.ReadInteger('SongEqualizer', 'Z', 1);
+ Song.Equalizer.W := ThemeIni.ReadInteger('SongEqualizer', 'PieceW', 8);
+ Song.Equalizer.H := ThemeIni.ReadInteger('SongEqualizer', 'PieceH', 8);
+ Song.Equalizer.Bands := ThemeIni.ReadInteger('SongEqualizer', 'Bands', 5);
+ Song.Equalizer.Length := ThemeIni.ReadInteger('SongEqualizer', 'Length', 12);
+
+ //Color
+ I := ColorExists(ThemeIni.ReadString('SongEqualizer', 'Color', 'Black'));
+ if I >= 0 then begin
+ Song.Equalizer.ColR := Color[I].RGB.R;
+ Song.Equalizer.ColG := Color[I].RGB.G;
+ Song.Equalizer.ColB := Color[I].RGB.B;
+ end
+ else begin
+ Song.Equalizer.ColR := 0;
+ Song.Equalizer.ColG := 0;
+ Song.Equalizer.ColB := 0;
+ end;
+ //Load Equalizer Pos and Size from Theme Mod End
+
+ //Party and Non Party specific Statics and Texts
+ ThemeLoadStatics (Song.StaticParty, 'SongStaticParty');
+ ThemeLoadTexts (Song.TextParty, 'SongTextParty');
+
+ ThemeLoadStatics (Song.StaticNonParty, 'SongStaticNonParty');
+ ThemeLoadTexts (Song.TextNonParty, 'SongTextNonParty');
+
+ ThemeLoadStatics (Song.StaticM2Party, 'SongStaticM2Party');
+ ThemeLoadTexts (Song.TextM2Party, 'SongTextM2Party');
+
+ //Party Mode
+ ThemeLoadStatic(Song.StaticTeam1Joker1, 'SongStaticTeam1Joker1');
+ ThemeLoadStatic(Song.StaticTeam1Joker2, 'SongStaticTeam1Joker2');
+ ThemeLoadStatic(Song.StaticTeam1Joker3, 'SongStaticTeam1Joker3');
+ ThemeLoadStatic(Song.StaticTeam1Joker4, 'SongStaticTeam1Joker4');
+ ThemeLoadStatic(Song.StaticTeam1Joker5, 'SongStaticTeam1Joker5');
+
+ ThemeLoadStatic(Song.StaticTeam2Joker1, 'SongStaticTeam2Joker1');
+ ThemeLoadStatic(Song.StaticTeam2Joker2, 'SongStaticTeam2Joker2');
+ ThemeLoadStatic(Song.StaticTeam2Joker3, 'SongStaticTeam2Joker3');
+ ThemeLoadStatic(Song.StaticTeam2Joker4, 'SongStaticTeam2Joker4');
+ ThemeLoadStatic(Song.StaticTeam2Joker5, 'SongStaticTeam2Joker5');
+
+ ThemeLoadStatic(Song.StaticTeam3Joker1, 'SongStaticTeam3Joker1');
+ ThemeLoadStatic(Song.StaticTeam3Joker2, 'SongStaticTeam3Joker2');
+ ThemeLoadStatic(Song.StaticTeam3Joker3, 'SongStaticTeam3Joker3');
+ ThemeLoadStatic(Song.StaticTeam3Joker4, 'SongStaticTeam3Joker4');
+ ThemeLoadStatic(Song.StaticTeam3Joker5, 'SongStaticTeam3Joker5');
+
+ ThemeLoadText(Song.SongTextPartyTeam1NumJoker, 'SongTextPartyTeam1NumJoker');
+ ThemeLoadText(Song.SongTextPartyTeam2NumJoker, 'SongTextPartyTeam2NumJoker');
+ ThemeLoadText(Song.SongTextPartyTeam3NumJoker, 'SongTextPartyTeam3NumJoker');
+
+ // Sing
+ ThemeLoadBasic(Sing, 'Sing');
+
+ //Song name for Medley
+ ThemeLoadStatic(Sing.StaticSongName, 'SingSongNameStatic');
+ ThemeLoadText(Sing.TextSongName, 'SingSongNameText');
+
+ //TimeBar mod
+ ThemeLoadStatic(Sing.StaticTimeProgress, 'SingTimeProgress');
+ ThemeLoadText(Sing.TextTimeText, 'SingTimeText');
+ //eoa TimeBar mod
+
+ //moveable singbar mod
+ ThemeLoadStatic(Sing.StaticP1SingBar, 'SingP1SingBar');
+ ThemeLoadStatic(Sing.StaticP1TwoPSingBar, 'SingP1TwoPSingBar');
+ ThemeLoadStatic(Sing.StaticP1ThreePSingBar, 'SingP1ThreePSingBar');
+ ThemeLoadStatic(Sing.StaticP2RSingBar, 'SingP2RSingBar');
+ ThemeLoadStatic(Sing.StaticP2MSingBar, 'SingP2MSingBar');
+ ThemeLoadStatic(Sing.StaticP3SingBar, 'SingP3SingBar');
+ //eoa moveable singbar
+
+ ThemeLoadStatic(Sing.StaticP1, 'SingP1Static');
+ ThemeLoadText(Sing.TextP1, 'SingP1Text');
+ ThemeLoadStatic(Sing.StaticP1ScoreBG, 'SingP1Static2');
+ ThemeLoadText(Sing.TextP1Score, 'SingP1TextScore');
+ //Added for ps3 skin
+ //This one is shown in 2/4P mode
+ //if it exists, otherwise the one Player equivaltents are used
+ if (ThemeIni.SectionExists('SingP1TwoPTextScore')) then
+ begin
+ ThemeLoadStatic(Sing.StaticP1TwoP, 'SingP1TwoPStatic');
+ ThemeLoadText(Sing.TextP1TwoP, 'SingP1TwoPText');
+ ThemeLoadStatic(Sing.StaticP1TwoPScoreBG, 'SingP1TwoPStatic2');
+ ThemeLoadText(Sing.TextP1TwoPScore, 'SingP1TwoPTextScore');
+ end
+ else
+ begin
+ Sing.StaticP1TwoP := Sing.StaticP1;
+ Sing.TextP1TwoP := Sing.TextP1;
+ Sing.StaticP1TwoPScoreBG := Sing.StaticP1ScoreBG;
+ Sing.TextP1TwoPScore := Sing.TextP1Score;
+ end;
+
+ //This one is shown in 3/6P mode
+ //if it exists, otherwise the one Player equivaltents are used
+ if (ThemeIni.SectionExists('SingP1TwoPTextScore')) then
+ begin
+ ThemeLoadStatic(Sing.StaticP1ThreeP, 'SingP1ThreePStatic');
+ ThemeLoadText(Sing.TextP1ThreeP, 'SingP1ThreePText');
+ ThemeLoadStatic(Sing.StaticP1ThreePScoreBG, 'SingP1ThreePStatic2');
+ ThemeLoadText(Sing.TextP1ThreePScore, 'SingP1ThreePTextScore');
+ end
+ else
+ begin
+ Sing.StaticP1ThreeP := Sing.StaticP1;
+ Sing.TextP1ThreeP := Sing.TextP1;
+ Sing.StaticP1ThreePScoreBG := Sing.StaticP1ScoreBG;
+ Sing.TextP1ThreePScore := Sing.TextP1Score;
+ end;
+ //eoa
+ ThemeLoadStatic(Sing.StaticP2R, 'SingP2RStatic');
+ ThemeLoadText(Sing.TextP2R, 'SingP2RText');
+ ThemeLoadStatic(Sing.StaticP2RScoreBG, 'SingP2RStatic2');
+ ThemeLoadText(Sing.TextP2RScore, 'SingP2RTextScore');
+
+ ThemeLoadStatic(Sing.StaticP2M, 'SingP2MStatic');
+ ThemeLoadText(Sing.TextP2M, 'SingP2MText');
+ ThemeLoadStatic(Sing.StaticP2MScoreBG, 'SingP2MStatic2');
+ ThemeLoadText(Sing.TextP2MScore, 'SingP2MTextScore');
+
+ ThemeLoadStatic(Sing.StaticP3R, 'SingP3RStatic');
+ ThemeLoadText(Sing.TextP3R, 'SingP3RText');
+ ThemeLoadStatic(Sing.StaticP3RScoreBG, 'SingP3RStatic2');
+ ThemeLoadText(Sing.TextP3RScore, 'SingP3RTextScore');
+
+ //Line Bonus Texts
+ Sing.LineBonusText[0] := Language.Translate('POPUP_AWFUL');
+ Sing.LineBonusText[1] := Sing.LineBonusText[0];
+ Sing.LineBonusText[2] := Language.Translate('POPUP_POOR');
+ Sing.LineBonusText[3] := Language.Translate('POPUP_BAD');
+ Sing.LineBonusText[4] := Language.Translate('POPUP_NOTBAD');
+ Sing.LineBonusText[5] := Language.Translate('POPUP_GOOD');
+ Sing.LineBonusText[6] := Language.Translate('POPUP_GREAT');
+ Sing.LineBonusText[7] := Language.Translate('POPUP_AWESOME');
+ Sing.LineBonusText[8] := Language.Translate('POPUP_PERFECT');
+
+ //VideoAspect
+ ThemeLoadStatic(Sing.VideoAspectStatic, 'VideoAspectStatic');
+ ThemeLoadText(Sing.VideoAspectText, 'VideoAspectText');
+
+
+ // Score
+ ThemeLoadBasic(Score, 'Score');
+
+ ThemeLoadText(Score.TextArtist, 'ScoreTextArtist');
+ ThemeLoadText(Score.TextTitle, 'ScoreTextTitle');
+ ThemeLoadText(Score.TextArtistTitle, 'ScoreTextArtistTitle');
+
+ ThemeLoadStatic(Score.StaticMedleyNav, 'ScoreMedleyNavStatic');
+ ThemeLoadText(Score.TextMedleyNav, 'ScoreMedleyNavText');
+
+ for I := 1 to 6 do begin
+ ThemeLoadStatics(Score.PlayerStatic[I], 'ScorePlayer' + IntToStr(I) + 'Static');
+ ThemeLoadTexts(Score.PlayerTexts[I], 'ScorePlayer' + IntToStr(I) + 'Text');
+
+ ThemeLoadText(Score.TextName[I], 'ScoreTextName' + IntToStr(I));
+ ThemeLoadText(Score.TextScore[I], 'ScoreTextScore' + IntToStr(I));
+ ThemeLoadText(Score.TextNotes[I], 'ScoreTextNotes' + IntToStr(I));
+ ThemeLoadText(Score.TextNotesScore[I], 'ScoreTextNotesScore' + IntToStr(I));
+ ThemeLoadText(Score.TextLineBonus[I], 'ScoreTextLineBonus' + IntToStr(I));
+ ThemeLoadText(Score.TextLineBonusScore[I], 'ScoreTextLineBonusScore' + IntToStr(I));
+ ThemeLoadText(Score.TextGoldenNotes[I], 'ScoreTextGoldenNotes' + IntToStr(I));
+ ThemeLoadText(Score.TextGoldenNotesScore[I], 'ScoreTextGoldenNotesScore' + IntToStr(I));
+ ThemeLoadText(Score.TextTotal[I], 'ScoreTextTotal' + IntToStr(I));
+ ThemeLoadText(Score.TextTotalScore[I], 'ScoreTextTotalScore' + IntToStr(I));
+
+ ThemeLoadStatic(Score.StaticBoxLightest[I], 'ScoreStaticBoxLightest' + IntToStr(I));
+ ThemeLoadStatic(Score.StaticBoxLight[I], 'ScoreStaticBoxLight' + IntToStr(I));
+ ThemeLoadStatic(Score.StaticBoxDark[I], 'ScoreStaticBoxDark' + IntToStr(I));
+
+ ThemeLoadStatic(Score.StaticBackLevel[I], 'ScoreStaticBackLevel' + IntToStr(I));
+ ThemeLoadStatic(Score.StaticBackLevelRound[I], 'ScoreStaticBackLevelRound' + IntToStr(I));
+ ThemeLoadStatic(Score.StaticLevel[I], 'ScoreStaticLevel' + IntToStr(I));
+ ThemeLoadStatic(Score.StaticLevelRound[I], 'ScoreStaticLevelRound' + IntToStr(I));
+ end;
+
+ // Top
+ ThemeLoadBasic(Top, 'Top');
+
+ ThemeLoadText(Top.TextLevel, 'TopTextLevel');
+ ThemeLoadText(Top.TextArtistTitle, 'TopTextArtistTitle');
+ ThemeLoadStatics(Top.StaticNumber, 'TopStaticNumber');
+ ThemeLoadTexts(Top.TextNumber, 'TopTextNumber');
+ ThemeLoadTexts(Top.TextName, 'TopTextName');
+ ThemeLoadTexts(Top.TextScore, 'TopTextScore');
+ ThemeLoadTexts(Top.TextDate, 'TopTextDate');
+
+ // Options
+ ThemeLoadBasic(Options, 'Options');
+
+ ThemeLoadButton(Options.ButtonGame, 'OptionsButtonGame');
+ ThemeLoadButton(Options.ButtonGraphics, 'OptionsButtonGraphics');
+ ThemeLoadButton(Options.ButtonSound, 'OptionsButtonSound');
+ ThemeLoadButton(Options.ButtonLyrics, 'OptionsButtonLyrics');
+ ThemeLoadButton(Options.ButtonThemes, 'OptionsButtonThemes');
+ ThemeLoadButton(Options.ButtonRecord, 'OptionsButtonRecord');
+ ThemeLoadButton(Options.ButtonAdvanced, 'OptionsButtonAdvanced');
+ ThemeLoadButton(Options.ButtonExit, 'OptionsButtonExit');
+
+ {{$IFDEF TRANSLATE}
+ Options.Description[0] := Language.Translate('SING_OPTIONS_GAME');
+ Options.Description[1] := Language.Translate('SING_OPTIONS_GRAPHICS');
+ Options.Description[2] := Language.Translate('SING_OPTIONS_SOUND');
+ Options.Description[3] := Language.Translate('SING_OPTIONS_LYRICS');
+ Options.Description[4] := Language.Translate('SING_OPTIONS_THEMES');
+ Options.Description[5] := Language.Translate('SING_OPTIONS_RECORD');
+ Options.Description[6] := Language.Translate('SING_OPTIONS_ADVANCED');
+ Options.Description[7] := Language.Translate('SING_OPTIONS_EXIT');
+ {{$ENDIF}
+
+ ThemeLoadText(Options.TextDescription, 'OptionsTextDescription');
+ Options.TextDescription.Text := Options.Description[0];
+
+ // Options Game
+ ThemeLoadBasic(OptionsGame, 'OptionsGame');
+
+ ThemeLoadSelect(OptionsGame.SelectPlayers, 'OptionsGameSelectPlayers');
+ ThemeLoadSelect(OptionsGame.SelectDifficulty, 'OptionsGameSelectDifficulty');
+ ThemeLoadSelectSlide(OptionsGame.SelectLanguage, 'OptionsGameSelectSlideLanguage');
+ ThemeLoadSelect(OptionsGame.SelectTabs, 'OptionsGameSelectTabs');
+ ThemeLoadSelectSlide(OptionsGame.SelectSorting, 'OptionsGameSelectSlideSorting');
+ ThemeLoadSelect(OptionsGame.SelectDebug, 'OptionsGameSelectDebug');
+ ThemeLoadButton(OptionsGame.ButtonExit, 'OptionsGameButtonExit');
+
+ // Options Graphics
+ ThemeLoadBasic(OptionsGraphics, 'OptionsGraphics');
+
+ ThemeLoadSelect(OptionsGraphics.SelectFullscreen, 'OptionsGraphicsSelectFullscreen');
+ ThemeLoadSelectSlide(OptionsGraphics.SelectSlideResolution, 'OptionsGraphicsSelectSlideResolution');
+ ThemeLoadSelect(OptionsGraphics.SelectDepth, 'OptionsGraphicsSelectDepth');
+ ThemeLoadSelect(OptionsGraphics.SelectOscilloscope, 'OptionsGraphicsSelectOscilloscope');
+ ThemeLoadSelect(OptionsGraphics.SelectLineBonus, 'OptionsGraphicsSelectLineBonus');
+ ThemeLoadSelect(OptionsGraphics.SelectMovieSize, 'OptionsGraphicsSelectMovieSize');
+ ThemeLoadSelect(OptionsGraphics.SelectMoviePreview, 'OptionsGraphicsSelectMoviePreview');
+ ThemeLoadButton(OptionsGraphics.ButtonExit, 'OptionsGraphicsButtonExit');
+
+ // Options Sound
+ ThemeLoadBasic(OptionsSound, 'OptionsSound');
+
+ ThemeLoadSelect(OptionsSound.SelectMicBoost, 'OptionsSoundSelectMicBoost');
+ ThemeLoadSelect(OptionsSound.SelectClickAssist, 'OptionsSoundSelectClickAssist');
+ ThemeLoadSelect(OptionsSound.SelectBeatClick, 'OptionsSoundSelectBeatClick');
+ ThemeLoadSelect(OptionsSound.SelectThreshold, 'OptionsSoundSelectThreshold');
+ //Song Preview
+ ThemeLoadSelectSlide(OptionsSound.SelectSlidePreviewVolume, 'OptionsSoundSelectSlidePreviewVolume');
+ ThemeLoadSelectSlide(OptionsSound.SelectSlidePreviewFading, 'OptionsSoundSelectSlidePreviewFading');
+
+ ThemeLoadButton(OptionsSound.ButtonExit, 'OptionsSoundButtonExit');
+
+ // Options Lyrics
+ ThemeLoadBasic(OptionsLyrics, 'OptionsLyrics');
+
+ ThemeLoadSelect(OptionsLyrics.SelectLyricsFont, 'OptionsLyricsSelectLyricsFont');
+ ThemeLoadSelect(OptionsLyrics.SelectLyricsEffect, 'OptionsLyricsSelectLyricsEffect');
+ ThemeLoadSelect(OptionsLyrics.SelectSolmization, 'OptionsLyricsSelectSolmization');
+ ThemeLoadButton(OptionsLyrics.ButtonExit, 'OptionsLyricsButtonExit');
+
+ // Options Themes
+ ThemeLoadBasic(OptionsThemes, 'OptionsThemes');
+
+ ThemeLoadSelectSlide(OptionsThemes.SelectTheme, 'OptionsThemesSelectTheme');
+ ThemeLoadSelectSlide(OptionsThemes.SelectSkin, 'OptionsThemesSelectSkin');
+ ThemeLoadSelectSlide(OptionsThemes.SelectColor, 'OptionsThemesSelectColor');
+ ThemeLoadButton(OptionsThemes.ButtonExit, 'OptionsThemesButtonExit');
+
+ // Options Record
+ ThemeLoadBasic(OptionsRecord, 'OptionsRecord');
+
+ ThemeLoadSelectSlide(OptionsRecord.SelectSlideCard, 'OptionsRecordSelectSlideCard');
+ ThemeLoadSelectSlide(OptionsRecord.SelectSlideInput, 'OptionsRecordSelectSlideInput');
+ ThemeLoadSelectSlide(OptionsRecord.SelectSlideChannelL, 'OptionsRecordSelectSlideChannelL');
+ ThemeLoadSelectSlide(OptionsRecord.SelectSlideChannelR, 'OptionsRecordSelectSlideChannelR');
+ ThemeLoadButton(OptionsRecord.ButtonExit, 'OptionsRecordButtonExit');
+
+ //Options Advanced
+ ThemeLoadBasic(OptionsAdvanced, 'OptionsAdvanced');
+
+ ThemeLoadSelect (OptionsAdvanced.SelectLoadAnimation, 'OptionsAdvancedSelectLoadAnimation');
+ ThemeLoadSelect (OptionsAdvanced.SelectScreenFade, 'OptionsAdvancedSelectScreenFade');
+ ThemeLoadSelect (OptionsAdvanced.SelectEffectSing, 'OptionsAdvancedSelectEffectSing');
+ ThemeLoadSelect (OptionsAdvanced.SelectLineBonus, 'OptionsAdvancedSelectLineBonus');
+ ThemeLoadSelectSlide (OptionsAdvanced.SelectOnSongClick, 'OptionsAdvancedSelectSlideOnSongClick');
+ ThemeLoadSelect (OptionsAdvanced.SelectAskbeforeDel, 'OptionsAdvancedSelectAskbeforeDel');
+ ThemeLoadSelect (OptionsAdvanced.SelectPartyPopup, 'OptionsAdvancedSelectPartyPopup');
+ ThemeLoadButton (OptionsAdvanced.ButtonExit, 'OptionsAdvancedButtonExit');
+
+ //error and check popup
+ ThemeLoadBasic (ErrorPopup, 'ErrorPopup');
+ ThemeLoadButton(ErrorPopup.Button1, 'ErrorPopupButton1');
+ ThemeLoadText (ErrorPopup.TextError,'ErrorPopupText');
+ ThemeLoadBasic (CheckPopup, 'CheckPopup');
+ ThemeLoadButton(CheckPopup.Button1, 'CheckPopupButton1');
+ ThemeLoadButton(CheckPopup.Button2, 'CheckPopupButton2');
+ ThemeLoadText(CheckPopup.TextCheck , 'CheckPopupText');
+
+ //help popup
+ ThemeLoadBasic (HelpPopup, 'HelpPopup');
+ ThemeLoadButton(HelpPopup.Button1, 'HelpPopupButton1');
+
+ //Song Menu
+ ThemeLoadBasic (SongMenu, 'SongMenu');
+ ThemeLoadButton(SongMenu.Button1, 'SongMenuButton1');
+ ThemeLoadButton(SongMenu.Button2, 'SongMenuButton2');
+ ThemeLoadButton(SongMenu.Button3, 'SongMenuButton3');
+ ThemeLoadButton(SongMenu.Button4, 'SongMenuButton4');
+ ThemeLoadSelectSlide(SongMenu.SelectSlide3, 'SongMenuSelectSlide3');
+
+ ThemeLoadText(SongMenu.TextMenu, 'SongMenuTextMenu');
+
+ //Song Jumpto
+ ThemeLoadBasic (SongJumpto, 'SongJumpto');
+ ThemeLoadButton(SongJumpto.ButtonSearchText, 'SongJumptoButtonSearchText');
+ ThemeLoadSelectSlide(SongJumpto.SelectSlideType, 'SongJumptoSelectSlideType');
+ ThemeLoadText(SongJumpto.TextFound, 'SongJumptoTextFound');
+ //Translations
+ SongJumpto.IType[0] := Language.Translate('SONG_JUMPTO_TYPE1');
+ SongJumpto.IType[1] := Language.Translate('SONG_JUMPTO_TYPE2');
+ SongJumpto.IType[2] := Language.Translate('SONG_JUMPTO_TYPE3');
+ SongJumpto.SongsFound := Language.Translate('SONG_JUMPTO_SONGSFOUND');
+ SongJumpto.NoSongsFound := Language.Translate('SONG_JUMPTO_NOSONGSFOUND');
+ SongJumpto.CatText := Language.Translate('SONG_JUMPTO_CATTEXT');
+
+ //Party Screens:
+ //Party NewRound
+ ThemeLoadBasic(PartyNewRound, 'PartyNewRound');
+
+ ThemeLoadText (PartyNewRound.TextRound1, 'PartyNewRoundTextRound1');
+ ThemeLoadText (PartyNewRound.TextRound2, 'PartyNewRoundTextRound2');
+ ThemeLoadText (PartyNewRound.TextRound3, 'PartyNewRoundTextRound3');
+ ThemeLoadText (PartyNewRound.TextRound4, 'PartyNewRoundTextRound4');
+ ThemeLoadText (PartyNewRound.TextRound5, 'PartyNewRoundTextRound5');
+ ThemeLoadText (PartyNewRound.TextRound6, 'PartyNewRoundTextRound6');
+ ThemeLoadText (PartyNewRound.TextRound7, 'PartyNewRoundTextRound7');
+ ThemeLoadText (PartyNewRound.TextWinner1, 'PartyNewRoundTextWinner1');
+ ThemeLoadText (PartyNewRound.TextWinner2, 'PartyNewRoundTextWinner2');
+ ThemeLoadText (PartyNewRound.TextWinner3, 'PartyNewRoundTextWinner3');
+ ThemeLoadText (PartyNewRound.TextWinner4, 'PartyNewRoundTextWinner4');
+ ThemeLoadText (PartyNewRound.TextWinner5, 'PartyNewRoundTextWinner5');
+ ThemeLoadText (PartyNewRound.TextWinner6, 'PartyNewRoundTextWinner6');
+ ThemeLoadText (PartyNewRound.TextWinner7, 'PartyNewRoundTextWinner7');
+ ThemeLoadText (PartyNewRound.TextNextRound, 'PartyNewRoundTextNextRound');
+ ThemeLoadText (PartyNewRound.TextNextRoundNo, 'PartyNewRoundTextNextRoundNo');
+ ThemeLoadText (PartyNewRound.TextNextPlayer1, 'PartyNewRoundTextNextPlayer1');
+ ThemeLoadText (PartyNewRound.TextNextPlayer2, 'PartyNewRoundTextNextPlayer2');
+ ThemeLoadText (PartyNewRound.TextNextPlayer3, 'PartyNewRoundTextNextPlayer3');
+
+ ThemeLoadStatic (PartyNewRound.StaticRound1, 'PartyNewRoundStaticRound1');
+ ThemeLoadStatic (PartyNewRound.StaticRound2, 'PartyNewRoundStaticRound2');
+ ThemeLoadStatic (PartyNewRound.StaticRound3, 'PartyNewRoundStaticRound3');
+ ThemeLoadStatic (PartyNewRound.StaticRound4, 'PartyNewRoundStaticRound4');
+ ThemeLoadStatic (PartyNewRound.StaticRound5, 'PartyNewRoundStaticRound5');
+ ThemeLoadStatic (PartyNewRound.StaticRound6, 'PartyNewRoundStaticRound6');
+ ThemeLoadStatic (PartyNewRound.StaticRound7, 'PartyNewRoundStaticRound7');
+
+ ThemeLoadText (PartyNewRound.TextScoreTeam1, 'PartyNewRoundTextScoreTeam1');
+ ThemeLoadText (PartyNewRound.TextScoreTeam2, 'PartyNewRoundTextScoreTeam2');
+ ThemeLoadText (PartyNewRound.TextScoreTeam3, 'PartyNewRoundTextScoreTeam3');
+ ThemeLoadText (PartyNewRound.TextNameTeam1, 'PartyNewRoundTextNameTeam1');
+ ThemeLoadText (PartyNewRound.TextNameTeam2, 'PartyNewRoundTextNameTeam2');
+ ThemeLoadText (PartyNewRound.TextNameTeam3, 'PartyNewRoundTextNameTeam3');
+
+ ThemeLoadText (PartyNewRound.TextTeam1Players, 'PartyNewRoundTextTeam1Players');
+ ThemeLoadText (PartyNewRound.TextTeam2Players, 'PartyNewRoundTextTeam2Players');
+ ThemeLoadText (PartyNewRound.TextTeam3Players, 'PartyNewRoundTextTeam3Players');
+
+ ThemeLoadStatic (PartyNewRound.StaticTeam1, 'PartyNewRoundStaticTeam1');
+ ThemeLoadStatic (PartyNewRound.StaticTeam2, 'PartyNewRoundStaticTeam2');
+ ThemeLoadStatic (PartyNewRound.StaticTeam3, 'PartyNewRoundStaticTeam3');
+ ThemeLoadStatic (PartyNewRound.StaticNextPlayer1, 'PartyNewRoundStaticNextPlayer1');
+ ThemeLoadStatic (PartyNewRound.StaticNextPlayer2, 'PartyNewRoundStaticNextPlayer2');
+ ThemeLoadStatic (PartyNewRound.StaticNextPlayer3, 'PartyNewRoundStaticNextPlayer3');
+
+ //Party NewRound M2
+ ThemeLoadBasic(PartyNewRoundM2, 'PartyNewRoundM2');
+
+ for I := 1 to 9 do
+ begin
+ ThemeLoadText (PartyNewRoundM2.TextRound[I], 'PartyNewRoundM2TextRound'+IntToStr(I));
+ ThemeLoadText (PartyNewRoundM2.TextWinner[I], 'PartyNewRoundM2TextWinner'+IntToStr(I));
+ ThemeLoadStatic (PartyNewRoundM2.StaticRound[I], 'PartyNewRoundM2StaticRound'+IntToStr(I));
+ ThemeLoadStatic (PartyNewRoundM2.StaticTable[I], 'PartyNewRoundM2StaticTable'+IntToStr(I));
+ end;
+
+ ThemeLoadText (PartyNewRoundM2.TextNextRound, 'PartyNewRoundM2TextNextRound');
+ ThemeLoadText (PartyNewRoundM2.TextNextPlayer1, 'PartyNewRoundM2TextNextPlayer1');
+ ThemeLoadText (PartyNewRoundM2.TextNextPlayer2, 'PartyNewRoundM2TextNextPlayer2');
+ ThemeLoadText (PartyNewRoundM2.TextHandicap, 'PartyNewRoundM2TextHandicap');
+
+ {ThemeLoadText (PartyNewRoundM2.TextScoreTeam1, 'PartyNewRoundTextScoreTeam1');
+ ThemeLoadText (PartyNewRoundM2.TextScoreTeam2, 'PartyNewRoundTextScoreTeam2');
+ ThemeLoadText (PartyNewRoundM2.TextNameTeam1, 'PartyNewRoundTextNameTeam1');
+ ThemeLoadText (PartyNewRoundM2.TextNameTeam2, 'PartyNewRoundTextNameTeam2');}
+
+ //ThemeLoadStatic (PartyNewRoundM2.StaticTeam1, 'PartyNewRoundM2StaticTeam1');
+ //ThemeLoadStatic (PartyNewRoundM2.StaticTeam2, 'PartyNewRoundM2StaticTeam2');
+
+
+ ThemeLoadStatic (PartyNewRoundM2.StaticNextPlayer1, 'PartyNewRoundM2StaticNextPlayer1');
+ ThemeLoadStatic (PartyNewRoundM2.StaticNextPlayer2, 'PartyNewRoundM2StaticNextPlayer2');
+ ThemeLoadStatic (PartyNewRoundM2.StaticHandicap, 'PartyNewRoundM2StaticHandicap');
+
+ for I := 1 to 7 do
+ begin
+ for J := 1 to 9 do
+ begin
+ ThemeLoadText (PartyNewRoundM2.TextTableName[J,I], 'PartyNewRoundM2TextTableName' +
+ IntToStr(J) + IntToStr(I));
+ end;
+ end;
+
+
+ //Party Score
+ ThemeLoadBasic(PartyScore, 'PartyScore');
+
+ ThemeLoadText (PartyScore.TextScoreTeam1, 'PartyScoreTextScoreTeam1');
+ ThemeLoadText (PartyScore.TextScoreTeam2, 'PartyScoreTextScoreTeam2');
+ ThemeLoadText (PartyScore.TextScoreTeam3, 'PartyScoreTextScoreTeam3');
+ ThemeLoadText (PartyScore.TextNameTeam1, 'PartyScoreTextNameTeam1');
+ ThemeLoadText (PartyScore.TextNameTeam2, 'PartyScoreTextNameTeam2');
+ ThemeLoadText (PartyScore.TextNameTeam3, 'PartyScoreTextNameTeam3');
+
+ ThemeLoadStatic (PartyScore.StaticTeam1, 'PartyScoreStaticTeam1');
+ ThemeLoadStatic (PartyScore.StaticTeam1BG, 'PartyScoreStaticTeam1BG');
+ ThemeLoadStatic (PartyScore.StaticTeam1Deco, 'PartyScoreStaticTeam1Deco');
+ ThemeLoadStatic (PartyScore.StaticTeam2, 'PartyScoreStaticTeam2');
+ ThemeLoadStatic (PartyScore.StaticTeam2BG, 'PartyScoreStaticTeam2BG');
+ ThemeLoadStatic (PartyScore.StaticTeam2Deco, 'PartyScoreStaticTeam2Deco');
+ ThemeLoadStatic (PartyScore.StaticTeam3, 'PartyScoreStaticTeam3');
+ ThemeLoadStatic (PartyScore.StaticTeam3BG, 'PartyScoreStaticTeam3BG');
+ ThemeLoadStatic (PartyScore.StaticTeam3Deco, 'PartyScoreStaticTeam3Deco');
+
+ //Load Party Score DecoTextures Object
+ PartyScore.DecoTextures.ChangeTextures := (ThemeIni.ReadInteger('PartyScoreDecoTextures', 'ChangeTextures', 0) = 1);
+
+ PartyScore.DecoTextures.FirstTexture := ThemeIni.ReadString('PartyScoreDecoTextures', 'FirstTexture', '');
+ PartyScore.DecoTextures.FirstTyp := ThemeIni.ReadString('PartyScoreDecoTextures', 'FirstTyp', 'Note Black');
+ PartyScore.DecoTextures.FirstColor := ThemeIni.ReadString('PartyScoreDecoTextures', 'FirstColor', 'Black');
+
+ PartyScore.DecoTextures.SecondTexture := ThemeIni.ReadString('PartyScoreDecoTextures', 'SecondTexture', '');
+ PartyScore.DecoTextures.SecondTyp := ThemeIni.ReadString('PartyScoreDecoTextures', 'SecondTyp', 'Note Black');
+ PartyScore.DecoTextures.SecondColor := ThemeIni.ReadString('PartyScoreDecoTextures', 'SecondColor', 'Black');
+
+ PartyScore.DecoTextures.ThirdTexture := ThemeIni.ReadString('PartyScoreDecoTextures', 'ThirdTexture', '');
+ PartyScore.DecoTextures.ThirdTyp := ThemeIni.ReadString('PartyScoreDecoTextures', 'ThirdTyp', 'Note Black');
+ PartyScore.DecoTextures.ThirdColor := ThemeIni.ReadString('PartyScoreDecoTextures', 'ThirdColor', 'Black');
+
+ ThemeLoadText (PartyScore.TextWinner, 'PartyScoreTextWinner');
+
+ //Party Win
+ ThemeLoadBasic(PartyWin, 'PartyWin');
+
+ ThemeLoadText (PartyWin.TextScoreTeam1, 'PartyWinTextScoreTeam1');
+ ThemeLoadText (PartyWin.TextScoreTeam2, 'PartyWinTextScoreTeam2');
+ ThemeLoadText (PartyWin.TextScoreTeam3, 'PartyWinTextScoreTeam3');
+ ThemeLoadText (PartyWin.TextNameTeam1, 'PartyWinTextNameTeam1');
+ ThemeLoadText (PartyWin.TextNameTeam2, 'PartyWinTextNameTeam2');
+ ThemeLoadText (PartyWin.TextNameTeam3, 'PartyWinTextNameTeam3');
+
+ ThemeLoadStatic (PartyWin.StaticTeam1, 'PartyWinStaticTeam1');
+ ThemeLoadStatic (PartyWin.StaticTeam1BG, 'PartyWinStaticTeam1BG');
+ ThemeLoadStatic (PartyWin.StaticTeam1Deco, 'PartyWinStaticTeam1Deco');
+ ThemeLoadStatic (PartyWin.StaticTeam2, 'PartyWinStaticTeam2');
+ ThemeLoadStatic (PartyWin.StaticTeam2BG, 'PartyWinStaticTeam2BG');
+ ThemeLoadStatic (PartyWin.StaticTeam2Deco, 'PartyWinStaticTeam2Deco');
+ ThemeLoadStatic (PartyWin.StaticTeam3, 'PartyWinStaticTeam3');
+ ThemeLoadStatic (PartyWin.StaticTeam3BG, 'PartyWinStaticTeam3BG');
+ ThemeLoadStatic (PartyWin.StaticTeam3Deco, 'PartyWinStaticTeam3Deco');
+
+ ThemeLoadText (PartyWin.TextWinner, 'PartyWinTextWinner');
+
+ //Party Options
+ ThemeLoadBasic(PartyOptions, 'PartyOptions');
+ ThemeLoadSelectSlide(PartyOptions.SelectLevel, 'PartyOptionsSelectLevel');
+ ThemeLoadSelectSlide(PartyOptions.SelectPlayList, 'PartyOptionsSelectPlayList');
+ ThemeLoadSelectSlide(PartyOptions.SelectPlayList2, 'PartyOptionsSelectPlayList2');
+ ThemeLoadSelectSlide(PartyOptions.SelectRounds, 'PartyOptionsSelectRounds');
+ ThemeLoadSelectSlide(PartyOptions.SelectTeams, 'PartyOptionsSelectTeams');
+ ThemeLoadSelectSlide(PartyOptions.SelectPlayers1, 'PartyOptionsSelectPlayers1');
+ ThemeLoadSelectSlide(PartyOptions.SelectPlayers2, 'PartyOptionsSelectPlayers2');
+ ThemeLoadSelectSlide(PartyOptions.SelectPlayers3, 'PartyOptionsSelectPlayers3');
+
+ //Party Options M2
+ ThemeLoadBasic(PartyOptionsM2, 'PartyOptionsM2');
+ ThemeLoadSelectSlide(PartyOptionsM2.SelectLevel, 'PartyOptionsM2SelectLevel');
+ ThemeLoadSelectSlide(PartyOptionsM2.SelectPlayList, 'PartyOptionsM2SelectPlayList');
+ ThemeLoadSelectSlide(PartyOptionsM2.SelectPlayList2, 'PartyOptionsM2SelectPlayList2');
+ ThemeLoadSelectSlide(PartyOptionsM2.SelectPlayers1, 'PartyOptionsM2SelectPlayers');
+ ThemeLoadSelectSlide(PartyOptionsM2.SelectRounds, 'PartyOptionsM2SelectRounds');
+ ThemeLoadSelectSlide(PartyOptionsM2.SelectOptionPlugin, 'PartyOptionsM2SelectOptionPlugin');
+ ThemeLoadSelectSlide(PartyOptionsM2.SelectOptionHandicap, 'PartyOptionsM2SelectOptionHandicap');
+
+ //Party Player
+ ThemeLoadBasic(PartyPlayer, 'PartyPlayer');
+ ThemeLoadButton(PartyPlayer.Team1Name, 'PartyPlayerTeam1Name');
+ ThemeLoadButton(PartyPlayer.Player1Name, 'PartyPlayerPlayer1Name');
+ ThemeLoadButton(PartyPlayer.Player2Name, 'PartyPlayerPlayer2Name');
+ ThemeLoadButton(PartyPlayer.Player3Name, 'PartyPlayerPlayer3Name');
+ ThemeLoadButton(PartyPlayer.Player4Name, 'PartyPlayerPlayer4Name');
+
+ ThemeLoadButton(PartyPlayer.Team2Name, 'PartyPlayerTeam2Name');
+ ThemeLoadButton(PartyPlayer.Player5Name, 'PartyPlayerPlayer5Name');
+ ThemeLoadButton(PartyPlayer.Player6Name, 'PartyPlayerPlayer6Name');
+ ThemeLoadButton(PartyPlayer.Player7Name, 'PartyPlayerPlayer7Name');
+ ThemeLoadButton(PartyPlayer.Player8Name, 'PartyPlayerPlayer8Name');
+
+ ThemeLoadButton(PartyPlayer.Team3Name, 'PartyPlayerTeam3Name');
+ ThemeLoadButton(PartyPlayer.Player9Name, 'PartyPlayerPlayer9Name');
+ ThemeLoadButton(PartyPlayer.Player10Name, 'PartyPlayerPlayer10Name');
+ ThemeLoadButton(PartyPlayer.Player11Name, 'PartyPlayerPlayer11Name');
+ ThemeLoadButton(PartyPlayer.Player12Name, 'PartyPlayerPlayer12Name');
+
+ //Party Player M2
+ ThemeLoadBasic(PartyPlayerM2, 'PartyPlayerM2');
+
+ ThemeLoadButton(PartyPlayerM2.Player1Name, 'PartyPlayerM2Player1Name');
+ ThemeLoadButton(PartyPlayerM2.Player2Name, 'PartyPlayerM2Player2Name');
+ ThemeLoadButton(PartyPlayerM2.Player3Name, 'PartyPlayerM2Player3Name');
+ ThemeLoadButton(PartyPlayerM2.Player4Name, 'PartyPlayerM2Player4Name');
+ ThemeLoadButton(PartyPlayerM2.Player5Name, 'PartyPlayerM2Player5Name');
+ ThemeLoadButton(PartyPlayerM2.Player6Name, 'PartyPlayerM2Player6Name');
+ ThemeLoadButton(PartyPlayerM2.Player7Name, 'PartyPlayerM2Player7Name');
+ ThemeLoadButton(PartyPlayerM2.Player8Name, 'PartyPlayerM2Player8Name');
+ ThemeLoadButton(PartyPlayerM2.Player9Name, 'PartyPlayerM2Player9Name');
+
+ {ThemeLoadButton(ButtonNext, 'PartyPlayerButtonNext');
+ ThemeLoadButton(ButtonPrev, 'PartyPlayerButtonPrev');}
+
+ ThemeLoadBasic(StatMain, 'StatMain');
+
+ ThemeLoadButton(StatMain.ButtonScores, 'StatMainButtonScores');
+ ThemeLoadButton(StatMain.ButtonSingers, 'StatMainButtonSingers');
+ ThemeLoadButton(StatMain.ButtonSongs, 'StatMainButtonSongs');
+ ThemeLoadButton(StatMain.ButtonBands, 'StatMainButtonBands');
+ ThemeLoadButton(StatMain.ButtonExit, 'StatMainButtonExit');
+
+ ThemeLoadText (StatMain.TextOverview, 'StatMainTextOverview');
+
+
+ ThemeLoadBasic(StatDetail, 'StatDetail');
+
+ ThemeLoadButton(StatDetail.ButtonNext, 'StatDetailButtonNext');
+ ThemeLoadButton(StatDetail.ButtonPrev, 'StatDetailButtonPrev');
+ ThemeLoadButton(StatDetail.ButtonReverse, 'StatDetailButtonReverse');
+ ThemeLoadButton(StatDetail.ButtonExit, 'StatDetailButtonExit');
+
+ ThemeLoadText (StatDetail.TextDescription, 'StatDetailTextDescription');
+ ThemeLoadText (StatDetail.TextPage, 'StatDetailTextPage');
+ ThemeLoadTexts(StatDetail.TextList, 'StatDetailTextList');
+
+ //Translate Texts
+ StatDetail.Description[0] := Language.Translate('STAT_DESC_SCORES');
+ StatDetail.Description[1] := Language.Translate('STAT_DESC_SINGERS');
+ StatDetail.Description[2] := Language.Translate('STAT_DESC_SONGS');
+ StatDetail.Description[3] := Language.Translate('STAT_DESC_BANDS');
+
+ StatDetail.DescriptionR[0] := Language.Translate('STAT_DESC_SCORES_REVERSED');
+ StatDetail.DescriptionR[1] := Language.Translate('STAT_DESC_SINGERS_REVERSED');
+ StatDetail.DescriptionR[2] := Language.Translate('STAT_DESC_SONGS_REVERSED');
+ StatDetail.DescriptionR[3] := Language.Translate('STAT_DESC_BANDS_REVERSED');
+
+ StatDetail.FormatStr[0] := Language.Translate('STAT_FORMAT_SCORES');
+ StatDetail.FormatStr[1] := Language.Translate('STAT_FORMAT_SINGERS');
+ StatDetail.FormatStr[2] := Language.Translate('STAT_FORMAT_SONGS');
+ StatDetail.FormatStr[3] := Language.Translate('STAT_FORMAT_BANDS');
+
+ StatDetail.PageStr := Language.Translate('STAT_PAGE');
+
+ //Playlist Translations
+ Playlist.CatText := Language.Translate('PLAYLIST_CATTEXT');
+
+ //Level Translations
+ //Fill ILevel
+ ILevel[0] := Language.Translate('SING_EASY');
+ ILevel[1] := Language.Translate('SING_MEDIUM');
+ ILevel[2] := Language.Translate('SING_HARD');
+ end;
+
+ ThemeIni.Free;
+ end;
+end;
+
+procedure TTheme.ThemeLoadBasic(Theme: TThemeBasic; Name: string);
+begin
+ ThemeLoadBackground(Theme.Background, Name);
+ ThemeLoadTexts(Theme.Text, Name + 'Text');
+ ThemeLoadStatics(Theme.Static, Name + 'Static');
+ ThemeLoadButtonCollections(Theme.ButtonCollection, Name + 'ButtonCollection');
+
+ LastThemeBasic := Theme;
+end;
+
+procedure TTheme.ThemeLoadBackground(var ThemeBackground: TThemeBackground; Name: string);
+begin
+ ThemeBackground.Tex := ThemeIni.ReadString(Name + 'Background', 'Tex', '');
+end;
+
+procedure TTheme.ThemeLoadText(var ThemeText: TThemeText; Name: string);
+var
+ C: integer;
+begin
+ DecimalSeparator := '.';
+ ThemeText.X := ThemeIni.ReadInteger(Name, 'X', 0);
+ ThemeText.Y := ThemeIni.ReadInteger(Name, 'Y', 0);
+ ThemeText.W := ThemeIni.ReadInteger(Name, 'W', 0);
+
+ ThemeText.ColR := ThemeIni.ReadFloat(Name, 'ColR', 0);
+ ThemeText.ColG := ThemeIni.ReadFloat(Name, 'ColG', 0);
+ ThemeText.ColB := ThemeIni.ReadFloat(Name, 'ColB', 0);
+
+ ThemeText.Font := ThemeIni.ReadInteger(Name, 'Font', 0);
+ ThemeText.Size := ThemeIni.ReadInteger(Name, 'Size', 0);
+ ThemeText.Align := ThemeIni.ReadInteger(Name, 'Align', 0);
+
+ {{$IFDEF TRANSLATE}
+ ThemeText.Text := Language.Translate(ThemeIni.ReadString(Name, 'Text', ''));
+ {{$ELSE}{
+ ThemeText.Text := ThemeIni.ReadString(Name, 'Text', '');
+ {$ENDIF}
+
+ ThemeText.Color := ThemeIni.ReadString(Name, 'Color', '');
+
+ C := ColorExists(ThemeText.Color);
+ if C >= 0 then begin
+ ThemeText.ColR := Color[C].RGB.R;
+ ThemeText.ColG := Color[C].RGB.G;
+ ThemeText.ColB := Color[C].RGB.B;
+ end;
+
+ DecimalSeparator := ',';
+end;
+
+procedure TTheme.ThemeLoadTexts(var ThemeText: AThemeText; Name: string);
+var
+ T: integer;
+begin
+ T := 1;
+ while ThemeIni.SectionExists(Name + IntToStr(T)) do begin
+ SetLength(ThemeText, T);
+ ThemeLoadText(ThemeText[T-1], Name + IntToStr(T));
+ Inc(T);
+ end;
+end;
+
+procedure TTheme.ThemeLoadStatic(var ThemeStatic: TThemeStatic; Name: string);
+var
+ C: integer;
+begin
+ DecimalSeparator := '.';
+
+ ThemeStatic.Tex := ThemeIni.ReadString(Name, 'Tex', '');
+
+ ThemeStatic.X := ThemeIni.ReadInteger(Name, 'X', 0);
+ ThemeStatic.Y := ThemeIni.ReadInteger(Name, 'Y', 0);
+ ThemeStatic.Z := ThemeIni.ReadFloat(Name, 'Z', 0);
+ ThemeStatic.W := ThemeIni.ReadInteger(Name, 'W', 0);
+ ThemeStatic.H := ThemeIni.ReadInteger(Name, 'H', 0);
+
+ ThemeStatic.Typ := ThemeIni.ReadString(Name, 'Type', '');
+ ThemeStatic.Color := ThemeIni.ReadString(Name, 'Color', '');
+
+ C := ColorExists(ThemeStatic.Color);
+ if C >= 0 then begin
+ ThemeStatic.ColR := Color[C].RGB.R;
+ ThemeStatic.ColG := Color[C].RGB.G;
+ ThemeStatic.ColB := Color[C].RGB.B;
+ end;
+
+ ThemeStatic.TexX1 := ThemeIni.ReadFloat(Name, 'TexX1', 0);
+ ThemeStatic.TexY1 := ThemeIni.ReadFloat(Name, 'TexY1', 0);
+ ThemeStatic.TexX2 := ThemeIni.ReadFloat(Name, 'TexX2', 1);
+ ThemeStatic.TexY2 := ThemeIni.ReadFloat(Name, 'TexY2', 1);
+
+ //Reflection Mod
+ ThemeStatic.Reflection := (ThemeIni.ReadInteger(Name, 'Reflection', 0) = 1);
+ ThemeStatic.ReflectionSpacing := ThemeIni.ReadFloat(Name, 'ReflectionSpacing', 15);
+
+ DecimalSeparator := ',';
+end;
+
+procedure TTheme.ThemeLoadStatics(var ThemeStatic: AThemeStatic; Name: string);
+var
+ S: integer;
+begin
+ S := 1;
+ while ThemeIni.SectionExists(Name + IntToStr(S)) do begin
+ SetLength(ThemeStatic, S);
+ ThemeLoadStatic(ThemeStatic[S-1], Name + IntToStr(S));
+ Inc(S);
+ end;
+end;
+
+//Button Collection Mod
+procedure TTheme.ThemeLoadButtonCollection(var Collection: TThemeButtonCollection; Name: string);
+var T: Integer;
+begin
+ //Load Collection Style
+ ThemeLoadButton(Collection.Style, Name);
+
+ //Load Other Attributes
+ T := ThemeIni.ReadInteger (Name, 'FirstChild', 0);
+ if (T > 0) And (T < 256) then
+ Collection.FirstChild := T
+ else
+ Collection.FirstChild := 0;
+end;
+
+procedure TTheme.ThemeLoadButtonCollections(var Collections: AThemeButtonCollection; Name: string);
+var
+ I: integer;
+begin
+ I := 1;
+ while ThemeIni.SectionExists(Name + IntToStr(I)) do begin
+ SetLength(Collections, I);
+ ThemeLoadButtonCollection(Collections[I-1], Name + IntToStr(I));
+ Inc(I);
+ end;
+end;
+//End Button Collection Mod
+
+procedure TTheme.ThemeLoadButton(var ThemeButton: TThemeButton; Name: string; const Collections: PAThemeButtonCollection);
+var
+ C: integer;
+ TLen: integer;
+ T: integer;
+ Collections2: PAThemeButtonCollection;
+begin
+ if not ThemeIni.SectionExists(Name) then
+ begin
+ ThemeButton.Visible := False;
+ exit;
+ end;
+ DecimalSeparator := '.';
+ ThemeButton.Tex := ThemeIni.ReadString(Name, 'Tex', '');
+ ThemeButton.X := ThemeIni.ReadInteger (Name, 'X', 0);
+ ThemeButton.Y := ThemeIni.ReadInteger (Name, 'Y', 0);
+ ThemeButton.Z := ThemeIni.ReadFloat (Name, 'Z', 0);
+ ThemeButton.W := ThemeIni.ReadInteger (Name, 'W', 0);
+ ThemeButton.H := ThemeIni.ReadInteger (Name, 'H', 0);
+
+ ThemeButton.Typ := ThemeIni.ReadString(Name, 'Type', '');
+
+ //Reflection Mod
+ ThemeButton.Reflection := (ThemeIni.ReadInteger(Name, 'Reflection', 0) = 1);
+ ThemeButton.ReflectionSpacing := ThemeIni.ReadFloat(Name, 'ReflectionSpacing', 15);
+
+ ThemeButton.ColR := ThemeIni.ReadFloat(Name, 'ColR', 1);
+ ThemeButton.ColG := ThemeIni.ReadFloat(Name, 'ColG', 1);
+ ThemeButton.ColB := ThemeIni.ReadFloat(Name, 'ColB', 1);
+ ThemeButton.Int := ThemeIni.ReadFloat(Name, 'Int', 1);
+ ThemeButton.DColR := ThemeIni.ReadFloat(Name, 'DColR', 1);
+ ThemeButton.DColG := ThemeIni.ReadFloat(Name, 'DColG', 1);
+ ThemeButton.DColB := ThemeIni.ReadFloat(Name, 'DColB', 1);
+ ThemeButton.DInt := ThemeIni.ReadFloat(Name, 'DInt', 1);
+
+ ThemeButton.Color := ThemeIni.ReadString(Name, 'Color', '');
+ C := ColorExists(ThemeButton.Color);
+ if C >= 0 then begin
+ ThemeButton.ColR := Color[C].RGB.R;
+ ThemeButton.ColG := Color[C].RGB.G;
+ ThemeButton.ColB := Color[C].RGB.B;
+ end;
+
+ ThemeButton.DColor := ThemeIni.ReadString(Name, 'DColor', '');
+ C := ColorExists(ThemeButton.DColor);
+ if C >= 0 then begin
+ ThemeButton.DColR := Color[C].RGB.R;
+ ThemeButton.DColG := Color[C].RGB.G;
+ ThemeButton.DColB := Color[C].RGB.B;
+ end;
+
+ ThemeButton.Visible := (ThemeIni.ReadInteger(Name, 'Visible', 1) = 1);
+
+ //Fade Mod
+ ThemeButton.SelectH := ThemeIni.ReadInteger (Name, 'SelectH', ThemeButton.H);
+ ThemeButton.SelectW := ThemeIni.ReadInteger (Name, 'SelectW', ThemeButton.W);
+
+ ThemeButton.DeSelectReflectionspacing := ThemeIni.ReadFloat(Name, 'DeSelectReflectionSpacing', ThemeButton.Reflectionspacing);
+
+ ThemeButton.Fade := (ThemeIni.ReadInteger(Name, 'Fade', 0) = 1);
+ ThemeButton.FadeText := (ThemeIni.ReadInteger(Name, 'FadeText', 0) = 1);
+
+
+ ThemeButton.FadeTex := ThemeIni.ReadString(Name, 'FadeTex', '');
+ ThemeButton.FadeTexPos:= ThemeIni.ReadInteger(Name, 'FadeTexPos', 0);
+ if (ThemeButton.FadeTexPos > 4) Or (ThemeButton.FadeTexPos < 0) then
+ ThemeButton.FadeTexPos := 0;
+
+ //Button Collection Mod
+ T := ThemeIni.ReadInteger(Name, 'Parent', 0);
+
+ //Set Collections to Last Basic Collections if no valid Value
+ if (Collections = nil) then
+ Collections2 := @LastThemeBasic.ButtonCollection
+ else
+ Collections2 := Collections;
+ //Test for valid Value
+ if (Collections2 <> nil) AND (T > 0) AND (T <= Length(Collections2^)) then
+ begin
+ Inc(Collections2^[T-1].ChildCount);
+ ThemeButton.Parent := T;
+ end
+ else
+ ThemeButton.Parent := 0;
+
+ //Read ButtonTexts
+ TLen := ThemeIni.ReadInteger(Name, 'Texts', 0);
+ SetLength(ThemeButton.Text, TLen);
+ for T := 1 to TLen do
+ ThemeLoadText(ThemeButton.Text[T-1], Name + 'Text' + IntToStr(T));
+
+ DecimalSeparator := ',';
+end;
+
+procedure TTheme.ThemeLoadSelect(var ThemeSelect: TThemeSelect; Name: string);
+var
+ C: integer;
+begin
+ DecimalSeparator := '.';
+
+ {{$IFDEF TRANSLATE}
+ ThemeSelect.Text := Language.Translate(ThemeIni.ReadString(Name, 'Text', ''));
+ {{$ELSE}{
+ ThemeSelect.Text := ThemeIni.ReadString(Name, 'Text', '');
+ {$ENDIF}
+
+ ThemeSelect.Tex := {Skin.SkinPath + }ThemeIni.ReadString(Name, 'Tex', '');
+ ThemeSelect.TexSBG := {Skin.SkinPath + }ThemeIni.ReadString(Name, 'TexSBG', '');
+
+ ThemeSelect.X := ThemeIni.ReadInteger(Name, 'X', 0);
+ ThemeSelect.Y := ThemeIni.ReadInteger(Name, 'Y', 0);
+ ThemeSelect.W := ThemeIni.ReadInteger(Name, 'W', 0);
+ ThemeSelect.H := ThemeIni.ReadInteger(Name, 'H', 0);
+ ThemeSelect.SkipX := ThemeIni.ReadInteger(Name, 'SkipX', 0);
+
+
+ LoadColor(ThemeSelect.ColR, ThemeSelect.ColG, ThemeSelect.ColB, ThemeIni.ReadString(Name, 'Color', ''));
+ ThemeSelect.Int := ThemeIni.ReadFloat(Name, 'Int', 1);
+ LoadColor(ThemeSelect.DColR, ThemeSelect.DColG, ThemeSelect.DColB, ThemeIni.ReadString(Name, 'DColor', ''));
+ ThemeSelect.DInt := ThemeIni.ReadFloat(Name, 'DInt', 1);
+
+ LoadColor(ThemeSelect.TColR, ThemeSelect.TColG, ThemeSelect.TColB, ThemeIni.ReadString(Name, 'TColor', ''));
+ ThemeSelect.TInt := ThemeIni.ReadFloat(Name, 'TInt', 1);
+ LoadColor(ThemeSelect.TDColR, ThemeSelect.TDColG, ThemeSelect.TDColB, ThemeIni.ReadString(Name, 'TDColor', ''));
+ ThemeSelect.TDInt := ThemeIni.ReadFloat(Name, 'TDInt', 1);
+
+ LoadColor(ThemeSelect.SBGColR, ThemeSelect.SBGColG, ThemeSelect.SBGColB, ThemeIni.ReadString(Name, 'SBGColor', ''));
+ ThemeSelect.SBGInt := ThemeIni.ReadFloat(Name, 'SBGInt', 1);
+ LoadColor(ThemeSelect.SBGDColR, ThemeSelect.SBGDColG, ThemeSelect.SBGDColB, ThemeIni.ReadString(Name, 'SBGDColor', ''));
+ ThemeSelect.SBGDInt := ThemeIni.ReadFloat(Name, 'SBGDInt', 1);
+
+ LoadColor(ThemeSelect.STColR, ThemeSelect.STColG, ThemeSelect.STColB, ThemeIni.ReadString(Name, 'STColor', ''));
+ ThemeSelect.STInt := ThemeIni.ReadFloat(Name, 'STInt', 1);
+ LoadColor(ThemeSelect.STDColR, ThemeSelect.STDColG, ThemeSelect.STDColB, ThemeIni.ReadString(Name, 'STDColor', ''));
+ ThemeSelect.STDInt := ThemeIni.ReadFloat(Name, 'STDInt', 1);
+
+
+ DecimalSeparator := ',';
+end;
+
+procedure TTheme.ThemeLoadSelectSlide(var ThemeSelectS: TThemeSelectSlide; Name: string);
+var
+ C: integer;
+begin
+ DecimalSeparator := '.';
+
+ {{$IFDEF TRANSLATE}
+ ThemeSelectS.Text := Language.Translate(ThemeIni.ReadString(Name, 'Text', ''));
+ {{$ELSE}{
+ ThemeSelectS.Text := ThemeIni.ReadString(Name, 'Text', '');
+ {$ENDIF}
+
+ ThemeSelectS.Tex := {Skin.SkinPath + }ThemeIni.ReadString(Name, 'Tex', '');
+ ThemeSelectS.TexSBG := {Skin.SkinPath + }ThemeIni.ReadString(Name, 'TexSBG', '');
+
+ ThemeSelectS.X := ThemeIni.ReadInteger(Name, 'X', 0);
+ ThemeSelectS.Y := ThemeIni.ReadInteger(Name, 'Y', 0);
+ ThemeSelectS.W := ThemeIni.ReadInteger(Name, 'W', 0);
+ ThemeSelectS.H := ThemeIni.ReadInteger(Name, 'H', 0);
+
+ ThemeSelectS.Z := ThemeIni.ReadFloat(Name, 'Z', 0);
+
+ ThemeSelectS.TextSize := ThemeIni.ReadInteger(Name, 'TextSize', 10);
+
+ ThemeSelectS.SkipX := ThemeIni.ReadInteger(Name, 'SkipX', 0);
+
+ ThemeSelectS.SBGW := ThemeIni.ReadInteger(Name, 'SBGW', 450);
+
+ LoadColor(ThemeSelectS.ColR, ThemeSelectS.ColG, ThemeSelectS.ColB, ThemeIni.ReadString(Name, 'Color', ''));
+ ThemeSelectS.Int := ThemeIni.ReadFloat(Name, 'Int', 1);
+ LoadColor(ThemeSelectS.DColR, ThemeSelectS.DColG, ThemeSelectS.DColB, ThemeIni.ReadString(Name, 'DColor', ''));
+ ThemeSelectS.DInt := ThemeIni.ReadFloat(Name, 'DInt', 1);
+
+ LoadColor(ThemeSelectS.TColR, ThemeSelectS.TColG, ThemeSelectS.TColB, ThemeIni.ReadString(Name, 'TColor', ''));
+ ThemeSelectS.TInt := ThemeIni.ReadFloat(Name, 'TInt', 1);
+ LoadColor(ThemeSelectS.TDColR, ThemeSelectS.TDColG, ThemeSelectS.TDColB, ThemeIni.ReadString(Name, 'TDColor', ''));
+ ThemeSelectS.TDInt := ThemeIni.ReadFloat(Name, 'TDInt', 1);
+
+ LoadColor(ThemeSelectS.SBGColR, ThemeSelectS.SBGColG, ThemeSelectS.SBGColB, ThemeIni.ReadString(Name, 'SBGColor', ''));
+ ThemeSelectS.SBGInt := ThemeIni.ReadFloat(Name, 'SBGInt', 1);
+ LoadColor(ThemeSelectS.SBGDColR, ThemeSelectS.SBGDColG, ThemeSelectS.SBGDColB, ThemeIni.ReadString(Name, 'SBGDColor', ''));
+ ThemeSelectS.SBGDInt := ThemeIni.ReadFloat(Name, 'SBGDInt', 1);
+
+ LoadColor(ThemeSelectS.STColR, ThemeSelectS.STColG, ThemeSelectS.STColB, ThemeIni.ReadString(Name, 'STColor', ''));
+ ThemeSelectS.STInt := ThemeIni.ReadFloat(Name, 'STInt', 1);
+ LoadColor(ThemeSelectS.STDColR, ThemeSelectS.STDColG, ThemeSelectS.STDColB, ThemeIni.ReadString(Name, 'STDColor', ''));
+ ThemeSelectS.STDInt := ThemeIni.ReadFloat(Name, 'STDInt', 1);
+
+
+ DecimalSeparator := ',';
+end;
+
+procedure TTheme.LoadColors;
+var
+ SL: TStringList;
+ C: integer;
+ S: string;
+ Col: integer;
+ RGB: TRGB;
+begin
+ SL := TStringList.Create;
+ ThemeIni.ReadSection('Colors', SL);
+
+ // normal colors
+ SetLength(Color, SL.Count);
+ for C := 0 to SL.Count-1 do begin
+ Color[C].Name := SL.Strings[C];
+
+ S := ThemeIni.ReadString('Colors', SL.Strings[C], '');
+
+ Color[C].RGB.R := StrToInt(Copy(S, 1, Pos(' ' , S)-1))/255;
+ Delete(S, 1, Pos(' ', S));
+
+ Color[C].RGB.G := StrToInt(Copy(S, 1, Pos(' ' , S)-1))/255;
+ Delete(S, 1, Pos(' ', S));
+
+ Color[C].RGB.B := StrToInt(S)/255;
+ end;
+
+ // skin color
+ SetLength(Color, SL.Count + 3);
+ C := SL.Count;
+ Color[C].Name := 'ColorDark';
+ Color[C].RGB := GetSystemColor(Skin.Color); //Ini.Color);
+
+ C := C+1;
+ Color[C].Name := 'ColorLight';
+ Color[C].RGB := ColorSqrt(Color[C-1].RGB);
+
+ C := C+1;
+ Color[C].Name := 'ColorLightest';
+ Color[C].RGB := ColorSqrt(Color[C-1].RGB);
+
+ // players colors
+ SetLength(Color, Length(Color)+18);
+
+ // P1
+ C := C+1;
+ Color[C].Name := 'P1Dark';
+ Color[C].RGB := GetSystemColor(0); // 0 - blue
+
+ C := C+1;
+ Color[C].Name := 'P1Light';
+ Color[C].RGB := ColorSqrt(Color[C-1].RGB);
+
+ C := C+1;
+ Color[C].Name := 'P1Lightest';
+ Color[C].RGB := ColorSqrt(Color[C-1].RGB);
+
+ // P2
+ C := C+1;
+ Color[C].Name := 'P2Dark';
+ Color[C].RGB := GetSystemColor(3); // 3 - red
+
+ C := C+1;
+ Color[C].Name := 'P2Light';
+ Color[C].RGB := ColorSqrt(Color[C-1].RGB);
+
+ C := C+1;
+ Color[C].Name := 'P2Lightest';
+ Color[C].RGB := ColorSqrt(Color[C-1].RGB);
+
+ // P3
+ C := C+1;
+ Color[C].Name := 'P3Dark';
+ Color[C].RGB := GetSystemColor(1); // 1 - green
+
+ C := C+1;
+ Color[C].Name := 'P3Light';
+ Color[C].RGB := ColorSqrt(Color[C-1].RGB);
+
+ C := C+1;
+ Color[C].Name := 'P3Lightest';
+ Color[C].RGB := ColorSqrt(Color[C-1].RGB);
+
+ // P4
+ C := C+1;
+ Color[C].Name := 'P4Dark';
+ Color[C].RGB := GetSystemColor(4); // 4 - brown
+
+ C := C+1;
+ Color[C].Name := 'P4Light';
+ Color[C].RGB := ColorSqrt(Color[C-1].RGB);
+
+ C := C+1;
+ Color[C].Name := 'P4Lightest';
+ Color[C].RGB := ColorSqrt(Color[C-1].RGB);
+
+ // P5
+ C := C+1;
+ Color[C].Name := 'P5Dark';
+ Color[C].RGB := GetSystemColor(5); // 5 - yellow
+
+ C := C+1;
+ Color[C].Name := 'P5Light';
+ Color[C].RGB := ColorSqrt(Color[C-1].RGB);
+
+ C := C+1;
+ Color[C].Name := 'P5Lightest';
+ Color[C].RGB := ColorSqrt(Color[C-1].RGB);
+
+ // P6
+ C := C+1;
+ Color[C].Name := 'P6Dark';
+ Color[C].RGB := GetSystemColor(6); // 6 - violet
+
+ C := C+1;
+ Color[C].Name := 'P6Light';
+ Color[C].RGB := ColorSqrt(Color[C-1].RGB);
+
+ C := C+1;
+ Color[C].Name := 'P6Lightest';
+ Color[C].RGB := ColorSqrt(Color[C-1].RGB);
+
+
+ SL.Free;
+end;
+
+function ColorExists(Name: string): integer;
+var
+ C: integer;
+begin
+ Result := -1;
+ for C := 0 to High(Color) do
+ if Color[C].Name = Name then Result := C;
+end;
+
+procedure LoadColor(var R, G, B: real; ColorName: string);
+var
+ C: integer;
+begin
+ C := ColorExists(ColorName);
+ if C >= 0 then begin
+ R := Color[C].RGB.R;
+ G := Color[C].RGB.G;
+ B := Color[C].RGB.B;
+ end;
+end;
+
+function GetSystemColor(Color: integer): TRGB;
+begin
+ case Color of
+ 0: begin
+ // blue
+ Result.R := 71/255;
+ Result.G := 175/255;
+ Result.B := 247/255;
+ end;
+ 1: begin
+ // green
+ Result.R := 63/255;
+ Result.G := 191/255;
+ Result.B := 63/255;
+ end;
+ 2: begin
+ // pink
+ Result.R := 255/255;
+{ Result.G := 63/255;
+ Result.B := 192/255;}
+ Result.G := 175/255;
+ Result.B := 247/255;
+ end;
+ 3: begin
+ // red
+ Result.R := 247/255;
+ Result.G := 71/255;
+ Result.B := 71/255;
+ end;
+ //'Violet', 'Orange', 'Yellow', 'Brown', 'Black'
+ //New Theme-Color Patch
+ 4: begin
+ // violet
+ Result.R := 230/255;
+ Result.G := 63/255;
+ Result.B := 230/255;
+ end;
+ 5: begin
+ // orange
+ Result.R := 255/255;
+ Result.G := 144/255;
+ Result.B := 0;
+ end;
+ 6: begin
+ // yellow
+ Result.R := 230/255;
+ Result.G := 230/255;
+ Result.B := 95/255;
+ end;
+ 7: begin
+ // brown
+ Result.R := 192/255;
+ Result.G := 127/255;
+ Result.B := 31/255;
+ end;
+ 8: begin
+ // black
+ Result.R := 0;
+ Result.G := 0;
+ Result.B := 0;
+ end;
+ //New Theme-Color Patch End
+
+ end;
+
+ // pink
+// Col := clRed;
+// Color[C].ColR := (32 + Col and $FF) / (255 + 32);
+// Color[C].ColG := (32 + Col div 256 and $FF) / (255 + 32);
+// Color[C].ColB := (32 + Col div (256*256) and $FF) / (255 + 32);
+
+ // purple
+// Color[C].ColR := 220/255;
+// Color[C].ColG := 95/255;
+// Color[C].ColB := 220/255;}
+
+end;
+
+function ColorSqrt(RGB: TRGB): TRGB;
+begin
+ Result.R := sqrt(RGB.R);
+ Result.G := sqrt(RGB.G);
+ Result.B := sqrt(RGB.B);
+end;
+
+procedure TTheme.ThemeSave(FileName: string);
+var
+ I: integer;
+begin
+ {$IFDEF THEMESAVE}
+ ThemeIni := TIniFile.Create(FileName);
+ {$ELSE}
+ ThemeIni := TMemIniFile.Create(FileName);
+ {$ENDIF}
+
+ ThemeSaveBasic(Loading, 'Loading');
+
+ ThemeSaveBasic(Main, 'Main');
+ ThemeSaveText(Main.TextDescription, 'MainTextDescription');
+ ThemeSaveText(Main.TextDescriptionLong, 'MainTextDescriptionLong');
+ ThemeSaveButton(Main.ButtonSolo, 'MainButtonSolo');
+ ThemeSaveButton(Main.ButtonEditor, 'MainButtonEditor');
+ ThemeSaveButton(Main.ButtonOptions, 'MainButtonOptions');
+ ThemeSaveButton(Main.ButtonExit, 'MainButtonExit');
+
+ ThemeSaveBasic(Name, 'Name');
+ for I := 1 to 6 do
+ ThemeSaveButton(Name.ButtonPlayer[I], 'NameButtonPlayer' + IntToStr(I));
+
+ ThemeSaveBasic(Level, 'Level');
+ ThemeSaveButton(Level.ButtonEasy, 'LevelButtonEasy');
+ ThemeSaveButton(Level.ButtonMedium, 'LevelButtonMedium');
+ ThemeSaveButton(Level.ButtonHard, 'LevelButtonHard');
+
+ ThemeSaveBasic(Song, 'Song');
+ ThemeSaveText(Song.TextArtist, 'SongTextArtist');
+ ThemeSaveText(Song.TextTitle, 'SongTextTitle');
+ ThemeSaveText(Song.TextNumber, 'SongTextNumber');
+
+ //Show CAt in Top Left Mod
+ ThemeSaveText(Song.TextCat, 'SongTextCat');
+ ThemeSaveStatic(Song.StaticCat, 'SongStaticCat');
+
+ ThemeSaveBasic(Sing, 'Sing');
+
+ //TimeBar mod
+ ThemeSaveStatic(Sing.StaticTimeProgress, 'SingTimeProgress');
+ ThemeSaveText(Sing.TextTimeText, 'SingTimeText');
+ //eoa TimeBar mod
+
+ ThemeSaveStatic(Sing.StaticP1, 'SingP1Static');
+ ThemeSaveText(Sing.TextP1, 'SingP1Text');
+ ThemeSaveStatic(Sing.StaticP1ScoreBG, 'SingP1Static2');
+ ThemeSaveText(Sing.TextP1Score, 'SingP1TextScore');
+
+ //moveable singbar mod
+ ThemeSaveStatic(Sing.StaticP1SingBar, 'SingP1SingBar');
+ ThemeSaveStatic(Sing.StaticP1TwoPSingBar, 'SingP1TwoPSingBar');
+ ThemeSaveStatic(Sing.StaticP1ThreePSingBar, 'SingP1ThreePSingBar');
+ ThemeSaveStatic(Sing.StaticP2RSingBar, 'SingP2RSingBar');
+ ThemeSaveStatic(Sing.StaticP2MSingBar, 'SingP2MSingBar');
+ ThemeSaveStatic(Sing.StaticP3SingBar, 'SingP3SingBar');
+ //eoa moveable singbar
+
+ //Added for ps3 skin
+ //This one is shown in 2/4P mode
+ ThemeSaveStatic(Sing.StaticP1TwoP, 'SingP1TwoPStatic');
+ ThemeSaveText(Sing.TextP1TwoP, 'SingP1TwoPText');
+ ThemeSaveStatic(Sing.StaticP1TwoPScoreBG, 'SingP1TwoPStatic2');
+ ThemeSaveText(Sing.TextP1TwoPScore, 'SingP1TwoPTextScore');
+
+ //This one is shown in 3/6P mode
+ ThemeSaveStatic(Sing.StaticP1ThreeP, 'SingP1ThreePStatic');
+ ThemeSaveText(Sing.TextP1ThreeP, 'SingP1ThreePText');
+ ThemeSaveStatic(Sing.StaticP1ThreePScoreBG, 'SingP1ThreePStatic2');
+ ThemeSaveText(Sing.TextP1ThreePScore, 'SingP1ThreePTextScore');
+ //eoa
+
+ ThemeSaveStatic(Sing.StaticP2R, 'SingP2RStatic');
+ ThemeSaveText(Sing.TextP2R, 'SingP2RText');
+ ThemeSaveStatic(Sing.StaticP2RScoreBG, 'SingP2RStatic2');
+ ThemeSaveText(Sing.TextP2RScore, 'SingP2RTextScore');
+
+ ThemeSaveStatic(Sing.StaticP2M, 'SingP2MStatic');
+ ThemeSaveText(Sing.TextP2M, 'SingP2MText');
+ ThemeSaveStatic(Sing.StaticP2MScoreBG, 'SingP2MStatic2');
+ ThemeSaveText(Sing.TextP2MScore, 'SingP2MTextScore');
+
+ ThemeSaveStatic(Sing.StaticP3R, 'SingP3RStatic');
+ ThemeSaveText(Sing.TextP3R, 'SingP3RText');
+ ThemeSaveStatic(Sing.StaticP3RScoreBG, 'SingP3RStatic2');
+ ThemeSaveText(Sing.TextP3RScore, 'SingP3RTextScore');
+
+ ThemeSaveBasic(Score, 'Score');
+ ThemeSaveText(Score.TextArtist, 'ScoreTextArtist');
+ ThemeSaveText(Score.TextTitle, 'ScoreTextTitle');
+
+ for I := 1 to 6 do begin
+ ThemeSaveStatics(Score.PlayerStatic[I], 'ScorePlayer' + IntToStr(I) + 'Static');
+
+ ThemeSaveText(Score.TextName[I], 'ScoreTextName' + IntToStr(I));
+ ThemeSaveText(Score.TextScore[I], 'ScoreTextScore' + IntToStr(I));
+ ThemeSaveText(Score.TextNotes[I], 'ScoreTextNotes' + IntToStr(I));
+ ThemeSaveText(Score.TextNotesScore[I], 'ScoreTextNotesScore' + IntToStr(I));
+ ThemeSaveText(Score.TextLineBonus[I], 'ScoreTextLineBonus' + IntToStr(I));
+ ThemeSaveText(Score.TextLineBonusScore[I], 'ScoreTextLineBonusScore' + IntToStr(I));
+ ThemeSaveText(Score.TextGoldenNotes[I], 'ScoreTextGoldenNotes' + IntToStr(I));
+ ThemeSaveText(Score.TextGoldenNotesScore[I], 'ScoreTextGoldenNotesScore' + IntToStr(I));
+ ThemeSaveText(Score.TextTotal[I], 'ScoreTextTotal' + IntToStr(I));
+ ThemeSaveText(Score.TextTotalScore[I], 'ScoreTextTotalScore' + IntToStr(I));
+
+ ThemeSaveStatic(Score.StaticBackLevel[I], 'ScoreStaticBackLevel' + IntToStr(I));
+ ThemeSaveStatic(Score.StaticBackLevelRound[I], 'ScoreStaticBackLevelRound' + IntToStr(I));
+ ThemeSaveStatic(Score.StaticLevel[I], 'ScoreStaticLevel' + IntToStr(I));
+ ThemeSaveStatic(Score.StaticLevelRound[I], 'ScoreStaticLevelRound' + IntToStr(I));
+ end;
+
+ ThemeSaveBasic(Top, 'Top');
+ ThemeSaveText(Top.TextLevel, 'TopTextLevel');
+ ThemeSaveText(Top.TextArtistTitle, 'TopTextArtistTitle');
+ ThemeSaveStatics(Top.StaticNumber, 'TopStaticNumber');
+ ThemeSaveTexts(Top.TextNumber, 'TopTextNumber');
+ ThemeSaveTexts(Top.TextName, 'TopTextName');
+ ThemeSaveTexts(Top.TextScore, 'TopTextScore');
+
+
+ ThemeIni.Free;
+end;
+
+procedure TTheme.ThemeSaveBasic(Theme: TThemeBasic; Name: string);
+begin
+ ThemeIni.WriteInteger(Name, 'Texts', Length(Theme.Text));
+
+ ThemeSaveBackground(Theme.Background, Name + 'Background');
+ ThemeSaveStatics(Theme.Static, Name + 'Static');
+ ThemeSaveTexts(Theme.Text, Name + 'Text');
+end;
+
+procedure TTheme.ThemeSaveBackground(ThemeBackground: TThemeBackground; Name: string);
+begin
+ if ThemeBackground.Tex <> '' then
+ ThemeIni.WriteString(Name, 'Tex', ThemeBackground.Tex)
+ else begin
+ ThemeIni.EraseSection(Name);
+ end;
+end;
+
+procedure TTheme.ThemeSaveStatic(ThemeStatic: TThemeStatic; Name: string);
+begin
+ DecimalSeparator := '.';
+ ThemeIni.WriteInteger(Name, 'X', ThemeStatic.X);
+ ThemeIni.WriteInteger(Name, 'Y', ThemeStatic.Y);
+ ThemeIni.WriteInteger(Name, 'W', ThemeStatic.W);
+ ThemeIni.WriteInteger(Name, 'H', ThemeStatic.H);
+
+ ThemeIni.WriteString(Name, 'Tex', ThemeStatic.Tex);
+ ThemeIni.WriteString(Name, 'Type', ThemeStatic.Typ);
+ ThemeIni.WriteString(Name, 'Color', ThemeStatic.Color);
+
+ ThemeIni.WriteFloat(Name, 'TexX1', ThemeStatic.TexX1);
+ ThemeIni.WriteFloat(Name, 'TexY1', ThemeStatic.TexY1);
+ ThemeIni.WriteFloat(Name, 'TexX2', ThemeStatic.TexX2);
+ ThemeIni.WriteFloat(Name, 'TexY2', ThemeStatic.TexY2);
+
+ DecimalSeparator := ',';
+end;
+
+procedure TTheme.ThemeSaveStatics(ThemeStatic: AThemeStatic; Name: string);
+var
+ S: integer;
+begin
+ for S := 0 to Length(ThemeStatic)-1 do
+ ThemeSaveStatic(ThemeStatic[S], Name + {'Static' +} IntToStr(S+1));
+
+ ThemeIni.EraseSection(Name + {'Static' + }IntToStr(S+1));
+end;
+
+procedure TTheme.ThemeSaveText(ThemeText: TThemeText; Name: string);
+begin
+ DecimalSeparator := '.';
+ ThemeIni.WriteInteger(Name, 'X', ThemeText.X);
+ ThemeIni.WriteInteger(Name, 'Y', ThemeText.Y);
+
+ ThemeIni.WriteInteger(Name, 'Font', ThemeText.Font);
+ ThemeIni.WriteInteger(Name, 'Size', ThemeText.Size);
+ ThemeIni.WriteInteger(Name, 'Align', ThemeText.Align);
+
+ ThemeIni.WriteString(Name, 'Text', ThemeText.Text);
+ ThemeIni.WriteString(Name, 'Color', ThemeText.Color);
+
+ DecimalSeparator := ',';
+end;
+
+procedure TTheme.ThemeSaveTexts(ThemeText: AThemeText; Name: string);
+var
+ T: integer;
+begin
+ for T := 0 to Length(ThemeText)-1 do
+ ThemeSaveText(ThemeText[T], Name + {'Text' + }IntToStr(T+1));
+
+ ThemeIni.EraseSection(Name + {'Text' + }IntToStr(T+1));
+end;
+
+procedure TTheme.ThemeSaveButton(ThemeButton: TThemeButton; Name: string);
+var
+ T: integer;
+begin
+ DecimalSeparator := '.';
+ ThemeIni.WriteString(Name, 'Tex', ThemeButton.Tex);
+ ThemeIni.WriteInteger(Name, 'X', ThemeButton.X);
+ ThemeIni.WriteInteger(Name, 'Y', ThemeButton.Y);
+ ThemeIni.WriteInteger(Name, 'W', ThemeButton.W);
+ ThemeIni.WriteInteger(Name, 'H', ThemeButton.H);
+
+ ThemeIni.WriteString(Name, 'Type', ThemeButton.Typ);
+ ThemeIni.WriteInteger(Name, 'Texts', Length(ThemeButton.Text));
+
+ ThemeIni.WriteString(Name, 'Color', ThemeButton.Color);
+
+{ ThemeButton.ColR := ThemeIni.ReadFloat(Name, 'ColR', 1);
+ ThemeButton.ColG := ThemeIni.ReadFloat(Name, 'ColG', 1);
+ ThemeButton.ColB := ThemeIni.ReadFloat(Name, 'ColB', 1);
+ ThemeButton.Int := ThemeIni.ReadFloat(Name, 'Int', 1);
+ ThemeButton.DColR := ThemeIni.ReadFloat(Name, 'DColR', 1);
+ ThemeButton.DColG := ThemeIni.ReadFloat(Name, 'DColG', 1);
+ ThemeButton.DColB := ThemeIni.ReadFloat(Name, 'DColB', 1);
+ ThemeButton.DInt := ThemeIni.ReadFloat(Name, 'DInt', 1);}
+
+{ C := ColorExists(ThemeIni.ReadString(Name, 'Color', ''));
+ if C >= 0 then begin
+ ThemeButton.ColR := Color[C].RGB.R;
+ ThemeButton.ColG := Color[C].RGB.G;
+ ThemeButton.ColB := Color[C].RGB.B;
+ end;
+
+ C := ColorExists(ThemeIni.ReadString(Name, 'DColor', ''));
+ if C >= 0 then begin
+ ThemeButton.DColR := Color[C].RGB.R;
+ ThemeButton.DColG := Color[C].RGB.G;
+ ThemeButton.DColB := Color[C].RGB.B;
+ end;}
+
+ for T := 0 to High(ThemeButton.Text) do
+ ThemeSaveText(ThemeButton.Text[T], Name + 'Text' + IntToStr(T+1));
+
+ DecimalSeparator := ',';
+end;
+
+procedure TTheme.create_theme_objects();
+begin
+ freeandnil( Loading );
+ Loading := TThemeLoading.Create;
+
+ freeandnil( Main );
+ Main := TThemeMain.Create;
+
+ freeandnil( Name );
+ Name := TThemeName.Create;
+
+ freeandnil( Level );
+ Level := TThemeLevel.Create;
+
+ freeandnil( Song );
+ Song := TThemeSong.Create;
+
+ freeandnil( Sing );
+ Sing := TThemeSing.Create;
+
+ freeandnil( Score );
+ Score := TThemeScore.Create;
+
+ freeandnil( Top );
+ Top := TThemeTop.Create;
+
+ freeandnil( Options );
+ Options := TThemeOptions.Create;
+
+ freeandnil( OptionsGame );
+ OptionsGame := TThemeOptionsGame.Create;
+
+ freeandnil( OptionsGraphics );
+ OptionsGraphics := TThemeOptionsGraphics.Create;
+
+ freeandnil( OptionsSound );
+ OptionsSound := TThemeOptionsSound.Create;
+
+ freeandnil( OptionsLyrics );
+ OptionsLyrics := TThemeOptionsLyrics.Create;
+
+ freeandnil( OptionsThemes );
+ OptionsThemes := TThemeOptionsThemes.Create;
+
+ freeandnil( OptionsRecord );
+ OptionsRecord := TThemeOptionsRecord.Create;
+
+ freeandnil( OptionsAdvanced );
+ OptionsAdvanced := TThemeOptionsAdvanced.Create;
+
+ freeandnil( ErrorPopup );
+ ErrorPopup := TThemeError.Create;
+
+ freeandnil( CheckPopup );
+ CheckPopup := TThemeCheck.Create;
+
+ freeandnil( HelpPopup );
+ HelpPopup := TThemeHelp.Create;
+
+ freeandnil( SongMenu );
+ SongMenu := TThemeSongMenu.Create;
+
+ freeandnil( SongJumpto );
+ SongJumpto := TThemeSongJumpto.Create;
+
+ //Party Screens
+ freeandnil( PartyNewRound );
+ PartyNewRound := TThemePartyNewRound.Create;
+
+ freeandnil( PartyWin );
+ PartyWin := TThemePartyWin.Create;
+
+ freeandnil( PartyScore );
+ PartyScore := TThemePartyScore.Create;
+
+ freeandnil( PartyOptions );
+ PartyOptions := TThemePartyOptions.Create;
+
+ freeandnil( PartyPlayer );
+ PartyPlayer := TThemePartyPlayer.Create;
+
+ //Party M2 Screens
+ freeandnil( PartyNewRoundM2 );
+ PartyNewRoundM2 := TThemePartyNewRoundM2.Create;
+
+ //freeandnil( PartyWin );
+ //PartyWin := TThemePartyWin.Create;
+
+ //freeandnil( PartyScore );
+ //PartyScore := TThemePartyScore.Create;
+
+ freeandnil( PartyOptionsM2 );
+ PartyOptionsM2 := TThemePartyOptionsM2.Create;
+
+ freeandnil( PartyPlayerM2 );
+ PartyPlayerM2 := TThemePartyPlayerM2.Create;
+
+ //Stats Screens:
+ freeandnil( StatMain );
+ StatMain := TThemeStatMain.Create;
+
+ freeandnil( StatDetail );
+ StatDetail := TThemeStatDetail.Create;
+
+ end;
+
+end.
diff --git a/Game/Code/Classes/UTime.pas b/Game/Code/Classes/UTime.pas
new file mode 100644
index 00000000..29e972ae
--- /dev/null
+++ b/Game/Code/Classes/UTime.pas
@@ -0,0 +1,81 @@
+unit UTime;
+
+interface
+
+type
+ TTime = class
+ constructor Create;
+ function GetTime: real;
+ end;
+
+procedure CountSkipTimeSet;
+procedure CountSkipTime;
+procedure CountMidTime;
+procedure TimeSleep(ms: real);
+
+var
+ USTime: TTime;
+
+ TimeFreq: int64;
+ TimeNew: int64;
+ TimeOld: int64;
+ TimeSkip: real;
+ TimeMid: real;
+ TimeMidTemp: int64;
+
+implementation
+
+uses Windows;
+
+constructor TTime.Create;
+begin
+ CountSkipTimeSet;
+end;
+
+procedure CountSkipTimeSet;
+begin
+ QueryPerformanceFrequency(TimeFreq);
+ QueryPerformanceCounter(TimeNew);
+end;
+
+procedure CountSkipTime;
+begin
+ TimeOld := TimeNew;
+ QueryPerformanceCounter(TimeNew);
+ TimeSkip := (TimeNew-TimeOld)/TimeFreq;
+end;
+
+procedure CountMidTime;
+begin
+ QueryPerformanceCounter(TimeMidTemp);
+ TimeMid := (TimeMidTemp-TimeNew)/TimeFreq;
+end;
+
+procedure TimeSleep(ms: real);
+var
+ TimeStart: int64;
+ TimeHalf: int64;
+ Time: real;
+ Stop: boolean;
+begin
+ QueryPerformanceCounter(TimeStart);
+
+ Stop := false;
+ while (not Stop) do begin
+ QueryPerformanceCounter(TimeHalf);
+ Time := 1000 * (TimeHalf-TimeStart)/TimeFreq;
+ if Time > ms then Stop := true;
+ end;
+
+end;
+
+function TTime.GetTime: real;
+var
+ TimeTemp: int64;
+begin
+ QueryPerformanceCounter(TimeTemp);
+ Result := TimeTemp/TimeFreq;
+end;
+
+
+end.
diff --git a/Game/Code/Classes/UVideo.pas b/Game/Code/Classes/UVideo.pas
new file mode 100644
index 00000000..94c58060
--- /dev/null
+++ b/Game/Code/Classes/UVideo.pas
@@ -0,0 +1,737 @@
+{############################################################################
+# FFmpeg support for UltraStar deluxe #
+# now uses acinerella #
+# #
+# Created by b1indy, modified by brunzel #
+# based on 'An ffmpeg and SDL Tutorial' (http://www.dranger.com/ffmpeg/) #
+# and acinerella demo (http://sourceforge.net/projects/acinerella/) #
+#############################################################################}
+
+//{$define Info}
+
+
+unit UVideo;
+
+interface
+
+{$IFDEF FPC}
+ {$MODE DELPHI}
+{$ENDIF}
+
+
+uses SDL,
+ Classes, //for TFilestream
+ UGraphicClasses,
+ textgl,
+ acinerella,
+ math,
+ gl,
+ glu,
+ SysUtils,
+ {$ifdef DebugDisplay}
+ {$ifdef win32}
+ dialogs,
+ {$endif}
+ {$ENDIF}
+ UIni;
+
+type
+ TRectCoords = record //from 1.1
+ Left, Right: double;
+ Upper, Lower: double;
+ windowed: boolean;
+ end;
+
+ TAspectCorrection = (acoStretch, acoCrop, acoLetterBox); //from 1.1
+
+procedure Init;
+procedure acOpenFile(FileName: pAnsiChar);
+procedure acClose;
+procedure acGetFrame(Time: Extended);
+function acSearch(Time: Extended): integer;
+procedure acDrawGL(Screen: integer);
+procedure acDrawGLi(Screen: integer; Window: TRectCoords; Blend: real);
+procedure acTogglePause;
+procedure acSkip(Gap: Single; Start: Single);
+procedure acSkip2(Gap: Single; Start: Single);
+procedure ToggleAspectCorrection;
+procedure GetVideoRect(var ScreenRect, TexRect: TRectCoords; Window: TRectCoords);
+procedure SetAspectCorrection(aspect: TAspectCorrection);
+procedure ResetAspectCorrection;
+
+var
+ VideoOpened, VideoPaused: Boolean;
+ VideoTex: glUint;
+ TexData: array of Byte;
+ VideoStreamIndex: Integer;
+ //myBuffer: pByte;
+ TexX, TexY, dataX, dataY: Cardinal;
+ VideoTimeBase, VideoTime, LastFrameTime, TimeDifference, NegativeSkipTime: Extended;
+ ScaledVideoWidth, ScaledVideoHeight: Real;
+ VideoAspect: Real;
+ VideoSkipTime: Single;
+ ActualH, ActualW: Integer;
+
+ inst: PAc_instance;
+ pack: PAc_package;
+ info: TAc_stream_info;
+ videodecoder: PAc_decoder;
+
+ fAspect: real; //**< width/height ratio (from 1.1)
+ fAspectCorrection: TAspectCorrection; //from 1.1
+
+ fs: TFileStream;
+ fName: string;
+
+
+ timediff: PChar; //for debug
+ timediff_str: string; //for debug
+ mtime: PChar; //for debug
+ mtime_str: string; //for debug
+
+implementation
+
+uses
+ UGraphic, ULog;
+
+function read_proc(sender: Pointer; buf: PByte; size: integer): integer; cdecl;
+begin
+ result := fs.Read(buf^, size);
+end;
+
+function seek_proc(sender: Pointer; pos: int64; whence: integer): int64; cdecl;
+begin
+ if whence in [0, 1, 2] then
+ result := fs.Seek(pos, TSeekOrigin(whence))
+ else
+ result := -1;
+end;
+
+procedure Init;
+begin
+ videodecoder := nil;
+
+ VideoOpened:=False;
+ VideoPaused:=False;
+ fName := '';
+
+ glGenTextures(1, PglUint(@VideoTex));
+ SetLength(TexData,0);
+
+ fAspectCorrection := TAspectCorrection(Ini.AspectCorrect);
+end;
+
+procedure acOpenFile(FileName: pAnsiChar);
+var
+ I: integer;
+ rTimeBase: Extended;
+begin
+
+ VideoPaused := False;
+ VideoTimeBase := 0;
+ rTimeBase:=0;
+ VideoTime := 0;
+ LastFrameTime := 0;
+ TimeDifference := 0;
+
+ acClose;
+
+ if not FileExists(FileName) then
+ Exit; //TODO: error.log
+
+ fs := TFileStream.Create(FileName, fmOpenRead);
+ fs.Position := 0;
+
+ inst := ac_init();
+ videodecoder := nil;
+ ac_open(inst, nil, nil, @read_proc, @seek_proc, nil);
+
+ if not inst^.opened then
+ begin
+ fs.Free;
+ Exit; //TODO: error.log
+ end;
+
+ //find VideoStreamIndex
+ VideoStreamIndex:=-1;
+ for I := 0 to inst^.stream_count - 1 do
+ begin
+ ac_get_stream_info(inst, I, @info);
+ case info.stream_type of
+ AC_STREAM_TYPE_VIDEO:
+ begin
+
+ if videodecoder = nil then
+ begin
+ VideoStreamIndex:=I;
+ inst^.output_format := AC_OUTPUT_RGB24;
+ videodecoder := ac_create_decoder(inst, I);
+ end;
+ end;
+ end;
+ end;
+
+ if(VideoStreamIndex < 0) then
+ begin
+ if videodecoder <> nil then
+ ac_free_decoder(videodecoder);
+ ac_close(inst);
+ ac_free(inst);
+ fs.Free;
+ Exit;
+ end;
+
+ VideoOpened:=True;
+ fName := FileName;
+
+ TexX := videodecoder^.stream_info.additional_info.video_info.frame_width;
+ TexY := videodecoder^.stream_info.additional_info.video_info.frame_height;
+ dataX := Round(Power(2, Ceil(Log2(TexX))));
+ dataY := Round(Power(2, Ceil(Log2(TexY))));
+ SetLength(TexData,TexX*TexY*3);
+
+ // calculate some information for video display
+ VideoAspect:=videodecoder^.stream_info.additional_info.video_info.pixel_aspect;
+ if (VideoAspect = 0) then
+ VideoAspect:=TexX/TexY
+ else
+ VideoAspect:=VideoAspect*TexX/TexY;
+
+ fAspect := VideoAspect;
+
+ VideoTimeBase:=info.additional_info.video_info.frames_per_second;
+
+ //from 1.1
+ glBindTexture(GL_TEXTURE_2D, VideoTex);
+ glTexEnvi(GL_TEXTURE_2D, GL_TEXTURE_ENV_MODE, GL_REPLACE);
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, dataX, dataY, 0,
+ GL_RGB, GL_UNSIGNED_BYTE, nil);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+end;
+
+procedure acClose;
+begin
+ if VideoOpened then begin
+
+ if videodecoder <> nil then
+ ac_free_decoder(videodecoder);
+ videodecoder:=nil;
+ ac_close(inst);
+ ac_free(inst);
+ inst := nil;
+ fs.Free;
+ fs:=nil;
+ SetLength(TexData,0);
+ VideoOpened:=False;
+ fName := '';
+ end;
+end;
+
+procedure acTogglePause;
+begin
+ if VideoPaused then VideoPaused:=False
+ else VideoPaused:=True;
+end;
+
+procedure acSkip2(Gap: Single; Start: Single);
+var
+ seek_target: uint64;
+begin
+ VideoSkiptime:=Gap;
+ NegativeSkipTime:=Start+Gap;
+ if Start+Gap > 0 then
+ begin
+ VideoTime:=Start+Gap;
+ //ac_seek(videodecoder, 0, Floor((Start+Gap)*1000));
+ ac_seek(videodecoder, -1, Floor((Start+Gap)*1000));
+ //acSearch(Gap+Start);
+ {if (ac_seek(videodecoder, -1, Floor((Start+Gap)*1000))=0) then
+ if (ac_seek(videodecoder, 0, Floor((Start+Gap)*1000))=0) then
+ begin
+ ac_seek(videodecoder, 0, 0);
+ VideoTime:=0;
+ //acSearch(Gap+Start);
+
+ end; }
+ end else
+ begin
+ ac_seek(videodecoder, 0, 0);
+ VideoTime:=0;
+ end;
+end;
+
+procedure acSkip(Gap: Single; Start: Single);
+var
+ seek_target: uint64;
+begin
+ VideoSkiptime:=Gap;
+ NegativeSkipTime:=Start+Gap;
+ if Start+Gap > 0 then
+ begin
+ VideoTime:=0;
+ ac_seek(videodecoder, -1, Floor((Start+Gap)*1000));
+ if (acSearch(Gap+Start)=0) then
+ begin
+ ac_seek(videodecoder, 0, 0);
+ VideoTime:=0;
+ acSearch(Gap+Start);
+ end;
+ end else
+ begin
+ ac_seek(videodecoder, 0, 0);
+ VideoTime:=0;
+ end;
+end;
+
+function acSearch(Time: Extended): integer;
+var
+ FrameFinished: Integer;
+ errnum: Integer;
+ FrameDataPtr: PByteArray;
+ myTime: Extended;
+ DropFrame: Boolean;
+
+begin
+ Result := 0;
+ if not VideoOpened then Exit;
+ if (NegativeSkipTime < 0)and(Time+NegativeSkipTime>=0) then
+ NegativeSkipTime:=0;
+
+ myTime:=Time+VideoSkipTime;
+ TimeDifference:=myTime-VideoTime;
+ if Ini.Debug = 1 then
+ begin
+ timediff_str:= 't-diff: ' + FormatFloat('#0.00', TimeDifference);
+ timediff := Addr(timediff_str[1]);
+ mtime_str:= 'mytime: ' + FormatFloat('#0.00', myTime);
+ mtime := Addr(mtime_str[1]);
+ end;
+ DropFrame:=False;
+
+ if (VideoTime <> 0) and (TimeDifference <= VideoTimeBase) then begin
+ if Ini.Debug = 1 then
+ begin
+ // frame delay debug display
+ GoldenRec.Spawn(200,65,1,16,0,-1,ColoredStar,$00ff00);
+ end;
+ Exit;// we don't need a new frame now
+ end;
+
+ if TimeDifference >= 2*VideoTimeBase then
+ begin // skip frames
+ if Ini.Debug = 1 then
+ begin
+ //frame drop debug display
+ GoldenRec.Spawn(200,105,1,16,0,-1,ColoredStar,$ff0000);
+ end;
+
+ DropFrame:=True;
+ end;
+
+ pack := ac_read_package(inst);
+ FrameFinished:=0;
+ // read packets until we have a finished frame (or there are no more packets)
+ while ({(FrameFinished=0) or }(VideoTime < Time-VideoTimeBase)) and (pack <> nil) do
+ begin
+ // if we got a packet from the video stream, then decode it
+ if (videodecoder^.stream_index = pack^.stream_index) then
+ begin
+ FrameFinished := ac_decode_package(pack, videodecoder);
+ VideoTime := videodecoder^.timecode;
+ ac_free_package(pack);
+ if ((VideoTime < Time-VideoTimeBase) {or (FrameFinished=0)}) then
+ pack := ac_read_package(inst);
+ end else
+ begin
+ ac_free_package(pack);
+ pack := ac_read_package(inst);
+ //TimeDifference:=myTime-VideoTime;
+ end;
+ end;
+ if (pack<>nil) then
+ ac_free_package(pack);
+
+ // if we did not get an new frame, there's nothing more to do
+ if Framefinished=0 then
+ begin
+// GoldenRec.Spawn(220,15,1,16,0,-1,ColoredStar,$0000ff);
+ Exit;
+ end;
+
+ errnum:=1; //TODO!!
+ if errnum >=0 then begin
+ FrameDataPtr:=Pointer(videodecoder^.buffer);
+ Result := 1;
+ glBindTexture(GL_TEXTURE_2D, VideoTex);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, TexX, TexY, GL_RGB, GL_UNSIGNED_BYTE, @FrameDataPtr[0]);
+ //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ if Ini.Debug = 1 then
+ begin
+ //frame decode debug display
+ GoldenRec.Spawn(200,85,1,16,0,-1,ColoredStar,$ffff00);
+ end;
+
+ end;
+end;
+
+procedure acGetFrame(Time: Extended);
+var
+ FrameFinished: Integer;
+ errnum, x, y: Integer;
+ FrameDataPtr: PByteArray;
+ linesize: integer;
+ myTime: Extended;
+ DropFrame: Boolean;
+ droppedFrames: Integer;
+ I, J: Integer;
+const
+ FRAMEDROPCOUNT=3;
+begin
+ if not VideoOpened then Exit;
+ if VideoPaused then Exit;
+ if (NegativeSkipTime < 0)and(Time+NegativeSkipTime>=0) then NegativeSkipTime:=0;
+
+ myTime:=Time+VideoSkipTime;
+ TimeDifference:=myTime-VideoTime;
+ if Ini.Debug = 1 then
+ begin
+ timediff_str:= 't-diff: ' + FormatFloat('#0.00', TimeDifference);
+ timediff := Addr(timediff_str[1]);
+ mtime_str:= 'mytime: ' + FormatFloat('#0.00', myTime);
+ mtime := Addr(mtime_str[1]);
+ end;
+ DropFrame:=False;
+
+ if (VideoTime <> 0) and (TimeDifference <= VideoTimeBase) then begin
+ if Ini.Debug = 1 then
+ begin
+ // frame delay debug display
+ GoldenRec.Spawn(200,65,1,16,0,-1,ColoredStar,$00ff00);
+ end;
+ Exit;// we don't need a new frame now
+ end;
+
+ if TimeDifference >= (FRAMEDROPCOUNT-1)*VideoTimeBase then begin // skip frames
+ if Ini.Debug = 1 then
+ begin
+ //frame drop debug display
+ GoldenRec.Spawn(200,105,1,16,0,-1,ColoredStar,$ff0000);
+ end;
+
+ DropFrame:=True;
+ end;
+
+ pack := ac_read_package(inst);
+ FrameFinished:=0;
+ // read packets until we have a finished frame (or there are no more packets)
+ while (FrameFinished=0) and (pack <> nil) do
+ begin
+ // if we got a packet from the video stream, then decode it
+ if (videodecoder^.stream_index = pack^.stream_index) then
+ begin
+ FrameFinished := ac_decode_package(pack, videodecoder);
+ ac_free_package(pack);
+ if (FrameFinished=0) then
+ pack := ac_read_package(inst);
+ end else
+ begin
+ ac_free_package(pack);
+ pack := ac_read_package(inst);
+ end;
+ end;
+
+
+ if DropFrame then
+ begin
+ //acSearch(Time);
+ for droppedFrames:=1 to FRAMEDROPCOUNT do
+ begin
+ pack := ac_read_package(inst);
+ FrameFinished:=0;
+ // read packets until we have a finished frame (or there are no more packets)
+ while (FrameFinished=0) and (pack <> nil) do
+ begin
+ // if we got a packet from the video stream, then decode it
+ if (videodecoder^.stream_index = pack^.stream_index) then
+ begin
+ FrameFinished := ac_decode_package(pack, videodecoder);
+ ac_free_package(pack);
+ if (FrameFinished=0) then
+ pack := ac_read_package(inst);
+ end else
+ begin
+ ac_free_package(pack);
+ pack := ac_read_package(inst);
+ end;
+ end;
+ end;
+ end;
+
+ // if we did not get an new frame, there's nothing more to do
+ if Framefinished=0 then
+ begin
+// GoldenRec.Spawn(220,15,1,16,0,-1,ColoredStar,$0000ff);
+ acClose;
+ Exit;
+ end;
+
+ errnum:=1; //TODO!!
+ if errnum >=0 then begin
+ FrameDataPtr:=Pointer(videodecoder^.buffer);
+
+ glBindTexture(GL_TEXTURE_2D, VideoTex);
+ glTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, TexX, TexY, GL_RGB, GL_UNSIGNED_BYTE, @FrameDataPtr[0]);
+ //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ //glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+
+ VideoTime := videodecoder^.timecode;
+
+ if Ini.Debug = 1 then
+ begin
+ //frame decode debug display
+ GoldenRec.Spawn(200,85,1,16,0,-1,ColoredStar,$ffff00);
+ end;
+
+ end;
+end;
+
+procedure ToggleAspectCorrection();
+begin
+ case fAspectCorrection of
+ acoCrop : fAspectCorrection := acoStretch;
+ acoStretch : fAspectCorrection := acoLetterBox;
+ acoLetterBox : fAspectCorrection := acoCrop;
+ end;
+ //Ini.AspectCorrect := integer(fAspectCorrection);
+ //Ini.Save;
+end;
+
+procedure SetAspectCorrection(aspect: TAspectCorrection);
+begin
+ fAspectCorrection := aspect;
+end;
+
+procedure ResetAspectCorrection;
+begin
+ case Ini.AspectCorrect of
+ integer(acoCrop) : fAspectCorrection := acoCrop;
+ integer(acoStretch) : fAspectCorrection := acoStretch;
+ integer(acoLetterBox) : fAspectCorrection := acoLetterBox;
+ end;
+end;
+
+procedure GetVideoRect(var ScreenRect, TexRect: TRectCoords; Window: TRectCoords);
+var
+ ScreenAspect: double; // aspect of screen resolution
+ ScaledVideoWidth, ScaledVideoHeight: double;
+ rW, rH: double;
+begin
+ // Three aspects to take into account:
+ // 1. Screen/display resolution (e.g. 1920x1080 -> 16:9)
+ // 2. Render aspect (fixed to 800x600 -> 4:3)
+ // 3. Movie aspect (video frame aspect stored in fAspect)
+ if (Window.windowed) then
+ begin
+ rW := Window.Right-Window.Left;
+ rH := Window.Lower-Window.Upper;
+ ScreenAspect := rW/rH;
+ end else
+ begin
+ rW := RenderW;
+ rH := RenderH;
+ ScreenAspect := (ScreenW/Screens) / ScreenH;
+ end;
+
+ case fAspectCorrection of
+ acoStretch: begin
+ ScaledVideoWidth := rW;
+ ScaledVideoHeight := rH;
+ end;
+ acoCrop: begin
+ if (ScreenAspect >= fAspect) then
+ begin
+ ScaledVideoWidth := rW;
+ ScaledVideoHeight := rH * ScreenAspect/fAspect;
+ end
+ else
+ begin
+ ScaledVideoHeight := rH;
+ ScaledVideoWidth := rW * fAspect/ScreenAspect;
+ end;
+ end;
+ acoLetterBox: begin
+ if (ScreenAspect <= fAspect) then
+ begin
+ ScaledVideoWidth := rW;
+ ScaledVideoHeight := rH * ScreenAspect/fAspect;
+ end
+ else
+ begin
+ ScaledVideoHeight := rH;
+ ScaledVideoWidth := rW * fAspect/ScreenAspect;
+ end;
+ end
+ else
+ raise Exception.Create('Unhandled aspect correction!');
+ end;
+
+ ScreenRect.Left := (rW - ScaledVideoWidth) / 2 + Window.Left;
+ ScreenRect.Right := ScreenRect.Left + ScaledVideoWidth;
+ ScreenRect.Upper := (rH - ScaledVideoHeight) / 2 + Window.Upper;
+ ScreenRect.Lower := ScreenRect.Upper + ScaledVideoHeight;
+
+ // texture contains right/lower (power-of-2) padding.
+ // Determine the texture coords of the video frame.
+ TexRect.Left := 0;
+ TexRect.Right := TexX / dataX;
+ TexRect.Upper := 0;
+ TexRect.Lower := TexY / dataY;
+end;
+
+procedure acDrawGL(Screen: integer);
+var
+ Window: TRectCoords;
+begin
+ Window.Left := 0;
+ Window.Right := RenderW;
+ Window.Upper := 0;
+ Window.Lower := RenderH;
+ Window.windowed := false;
+ acDrawGLi(Screen, Window, 1);
+end;
+
+procedure acDrawGLi(Screen: integer; Window: TRectCoords; Blend: real);
+var
+ text: string;
+ test: PChar;
+ ScreenRect, TexRect: TRectCoords;
+begin
+ // have a nice black background to draw on (even if there were errors opening the vid)
+ if (Screen=1) and not Window.windowed then begin
+ glClearColor(0,0,0,0);
+ glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
+ end;
+ // exit if there's nothing to draw
+ if not VideoOpened then Exit;
+ // if we're still inside negative skip, then exit
+ //if (NegativeSkipTime < 0) then Exit;
+
+ GetVideoRect(ScreenRect, TexRect, Window);
+
+ glEnable(GL_BLEND);
+
+ glScissor(round((Window.Left)*(ScreenW/Screens)/RenderW+(ScreenW/Screens)*(Screen-1)),
+ round((RenderH-Window.Lower)*ScreenH/RenderH),
+ round((Window.Right-Window.Left)*(ScreenW/Screens)/RenderW),
+ round((Window.Lower-Window.Upper)*ScreenH/RenderH));
+ glEnable(GL_SCISSOR_TEST);
+
+
+ glEnable(GL_TEXTURE_2D);
+ glColor4f(1, 1, 1, Blend);
+ glBindTexture(GL_TEXTURE_2D, VideoTex);
+ glbegin(gl_quads);
+ // upper-left coord
+ glTexCoord2f(TexRect.Left, TexRect.Upper);
+ glVertex2f(ScreenRect.Left, ScreenRect.Upper);
+ // lower-left coord
+ glTexCoord2f(TexRect.Left, TexRect.Lower);
+ glVertex2f(ScreenRect.Left, ScreenRect.Lower);
+ // lower-right coord
+ glTexCoord2f(TexRect.Right, TexRect.Lower);
+ glVertex2f(ScreenRect.Right, ScreenRect.Lower);
+ // upper-right coord
+ glTexCoord2f(TexRect.Right, TexRect.Upper);
+ glVertex2f(ScreenRect.Right, ScreenRect.Upper);
+
+ glEnd;
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_SCISSOR_TEST);
+ glDisable(GL_BLEND);
+
+ if (Ini.MovieSize < 1) then //HalfSize BG
+ begin
+ // draw fading bars over top and bottom of background/video
+ glEnable(GL_BLEND);
+ glBegin(GL_QUADS);
+ (* black top *)
+ glColor4f(0,0,0,1);
+ glVertex2f(0, 0);
+ glVertex2f(800,0);
+ glVertex2f(800,110);
+ glVertex2f(0,110);
+ (* top gradient *)
+ glVertex2f(0, 110);
+ glVertex2f(800,110);
+ glColor4f(0,0,0,0);
+ glVertex2f(800,130);
+ glVertex2f(0,130);
+
+ (* bottom gradient *)
+ glColor4f(0,0,0,0);
+ glVertex2f(0, 600-130);
+ glVertex2f(800,600-130);
+ glColor4f(0,0,0,1);
+ glVertex2f(800,600-110);
+ glVertex2f(0,600-110);
+ (* black bottom *)
+ glVertex2f(0, 600-110);
+ glVertex2f(800,600-110);
+ glVertex2f(800,600);
+ glVertex2f(0,600);
+
+ glEnd;
+ glDisable(GL_BLEND);
+ end;
+
+// info-stuff
+
+{$ifdef Info}
+ if VideoSkipTime+videodecoder^.timecode+VideoTimeBase < 0 then begin
+ glColor4f(0.7, 1, 0.3, 1);
+ SetFontStyle (1);
+ SetFontItalic(False);
+ SetFontSize(9);
+ SetFontPos (300, 0);
+ glPrint('Delay due to negative VideoGap');
+ glColor4f(1, 1, 1, 1);
+ end;
+{$endif}
+
+ if Ini.Debug = 1 then
+ begin
+ glColor4f(0, 0, 0, 0.2);
+ glbegin(gl_quads);
+ glVertex2f(0, 50);
+ glVertex2f(0, 140);
+ glVertex2f(250, 140);
+ glVertex2f(250, 50);
+ glEnd;
+
+ glColor4f(1,1,1,1);
+ SetFontStyle (1);
+ SetFontItalic(False);
+ SetFontSize(9);
+ SetFontPos (5, 50);
+ text:= 'vtime: ' + FormatFloat('#0.00', VideoTime);
+ test := Addr(text[1]);
+ glPrint(test);
+ SetFontPos (5, 70);
+ //text:= 'vtime: ' + FormatFloat('#0.00', videodecoder^.timecode);
+ //test := Addr(text[1]);
+ glPrint(timediff);
+ SetFontPos (5, 90);
+ glPrint(mtime);
+ SetFontPos (5, 110);
+ case fAspectCorrection of
+ acoCrop : glPrint('Crop');
+ acoStretch : glPrint('Stretch');
+ acoLetterBox : glPrint('LetterBox');
+ end;
+ end;
+end;
+
+end.
diff --git a/Game/Code/Menu/UDisplay.pas b/Game/Code/Menu/UDisplay.pas
new file mode 100644
index 00000000..430cf442
--- /dev/null
+++ b/Game/Code/Menu/UDisplay.pas
@@ -0,0 +1,460 @@
+unit UDisplay;
+
+interface
+
+uses Windows, SDL, UMenu, gl, glu, SysUtils;
+
+type
+ TDisplay = class
+ ActualScreen: PMenu;
+ NextScreen: PMenu;
+
+ //fade-to-black-hack
+ BlackScreen: Boolean;
+ //popup hack
+ NextScreenWithCheck: Pmenu;
+ CheckOK: Boolean;
+
+ h_DC: HDC;
+ h_RC: HGLRC;
+
+ Fade: Real;
+ // fade-mod
+ doFade: Boolean;
+ canFade: Boolean;
+ DoneOnShow: Boolean;
+ myFade: integer;
+ lastTime: Cardinal;
+ pTexData : Pointer;
+ pTex : array[1..2] of glUInt;
+ // end
+
+ //FPS Counter
+ FPSCounter: Cardinal;
+ LastFPS: Cardinal;
+ NextFPSSwap:Cardinal;
+
+ //For Debug OSD
+ OSD_LastError: String;
+
+ function Draw: Boolean;
+ procedure PrintScreen;
+ constructor Create;
+ // fade mod
+ destructor Destroy;
+ // end
+ procedure ScreenShot;
+
+ procedure DrawDebugInformation;
+ end;
+
+var
+ Display: TDisplay;
+
+implementation
+
+uses UGraphic, UTime, Graphics, Jpeg, UFiles, UTexture, UIni, TextGL, UCommandLine;
+
+constructor TDisplay.Create;
+var i: integer;
+begin
+ inherited Create;
+
+ //popup hack
+ CheckOK:=False;
+ NextScreen:=NIL;
+ NextScreenWithCheck:=NIL;
+ BlackScreen:=False;
+
+ // fade mod
+ myfade:=0;
+ DoneOnShow := false;
+
+ if Ini.ScreenFade=1 then
+ doFade:=True
+ else
+ doFade:=False;
+
+ canFade:=True;
+ // generate texture for fading between screens
+ GetMem(pTexData, 512*512*3);
+ if pTexData <> NIL then
+ for i:= 1 to 2 do
+ begin
+ glGenTextures(1, pTex[i]);
+ if glGetError <> GL_NO_ERROR then canFade := False;
+ glBindTexture(GL_TEXTURE_2D, pTex[i]);
+ if glGetError <> GL_NO_ERROR then canFade := False;
+ glTexImage2D(GL_TEXTURE_2D, 0, 3, 512, 512, 0, GL_RGB, GL_UNSIGNED_BYTE, pTexData);
+ if glGetError <> GL_NO_ERROR then canFade := False;
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+ if glGetError <> GL_NO_ERROR then canFade := False;
+ glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
+ if glGetError <> GL_NO_ERROR then canFade := False;
+ end
+ else
+ begin
+ canFade:=False;
+ end;
+ FreeMem(pTexData);
+ // end
+
+ //Set LastError for OSD to No Error
+ OSD_LastError := 'No Errors';
+end;
+
+// fade mod
+destructor TDisplay.Destroy;
+begin
+ if canFade then
+ glDeleteTextures(1,@pTex);
+ inherited Destroy;
+end;
+// end
+
+function TDisplay.Draw: Boolean;
+var
+ S: integer;
+ Col: Real;
+ // fade mod
+ myFade2: Real;
+ currentTime: Cardinal;
+ glError: glEnum;
+ glErrorStr: String;
+ // end
+begin
+ Result := True;
+
+ Col := 1;
+ {if (ParamStr(1) = '-black') or (ParamStr(1) = '-fsblack') then
+ Col := 0; }
+
+ glClearColor(Col, Col, Col , 0);
+ glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
+
+ for S := 1 to Screens do begin
+ ScreenAct := S;
+
+// if Screens = 1 then ScreenX := 0;
+// if (Screens = 2) and (S = 1) then ScreenX := -1;
+// if (Screens = 2) and (S = 2) then ScreenX := 1;
+ ScreenX := 0;
+
+ if S = 2 then TimeSkip := 0;
+
+ glViewPort((S-1) * ScreenW div Screens, 0, ScreenW div Screens, ScreenH);
+
+ //popup hack
+ // check was successful... move on
+ if CheckOK then
+ if assigned (NextScreenWithCheck)then
+ begin
+ NextScreen:=NextScreenWithCheck;
+ NextScreenWithCheck := NIL;
+ CheckOk:=False;
+ end
+ else
+ BlackScreen:=True; // end of game - fade to black before exit
+ //end popup hack
+
+// ActualScreen.SetAnimationProgress(1);
+ if (not assigned (NextScreen)) and (not BlackScreen) then begin
+ ActualScreen.Draw;
+ //popup mod
+ if ScreenPopupError <> NIL then
+ if ScreenPopupError.Visible then
+ ScreenPopupError.Draw
+ else
+ if ScreenPopupCheck <> NIL then
+ if ScreenPopupCheck.Visible then
+ ScreenPopupCheck.Draw
+ else
+ if ScreenPopupHelp <> NIL then
+ if ScreenPopupHelp.Visible then
+ ScreenPopupHelp.Draw;
+ //popup end
+ // fade mod
+ myfade:=0;
+ if (Ini.ScreenFade=1) and canFade then
+ doFade:=True
+ else if Ini.ScreenFade=0 then
+ doFade:=False;
+ // end
+ end
+ else
+ begin
+ // check if we had an initialization error (canfade=false, dofade=true)
+ if doFade and not canFade then begin
+ doFade:=False; //disable fading
+ ScreenPopupError.ShowPopup('Error initializing\nfade texture\n\nfading\ndisabled'); //show error message
+ end;
+
+ if doFade and canFade then
+ begin
+ // fade mod
+ //Create Fading texture if we're just starting
+ if myfade = 0 then
+ begin
+ glViewPort(0, 0, 512, 512);
+ ActualScreen.Draw;
+ glGetError();
+ glBindTexture(GL_TEXTURE_2D, pTex[S]);
+ glCopyTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, 0, 0, 512, 512, 0);
+ glError:=glGetError;
+ if glError <> GL_NO_ERROR then
+ begin
+ canFade := False;
+ case glError of
+ GL_INVALID_ENUM: glErrorStr:='INVALID_ENUM';
+ GL_INVALID_VALUE: glErrorStr:='INVALID_VALUE';
+ GL_INVALID_OPERATION: glErrorStr:='INVALID_OPERATION';
+ GL_STACK_OVERFLOW: glErrorStr:='STACK_OVERFLOW';
+ GL_STACK_UNDERFLOW: glErrorStr:='STACK_UNDERFLOW';
+ GL_OUT_OF_MEMORY: glErrorStr:='OUT_OF_MEMORY';
+ else glErrorStr:='unknown error';
+ end;
+ ScreenPopupError.ShowPopup('Error copying\nfade texture\n('+glErrorStr+')\nfading\ndisabled'); //show error message
+ end;
+ glViewPort((S-1) * ScreenW div Screens, 0, ScreenW div Screens, ScreenH);
+
+ lastTime:=GetTickCount;
+ if (S=2) or (Screens = 1) then
+ myfade:=myfade+1;
+ end; // end texture creation in first fading step
+
+ // blackscreen-hack
+ if (not BlackScreen) AND (S = 1) and not DoneOnShow then
+ begin
+ NextScreen.onShow;
+ DoneOnShow := true;
+ end;
+
+ //do some time-based fading
+ currentTime:=GetTickCount;
+ if (currentTime > lastTime+30) and (S=1) then
+ begin
+ myfade:=myfade+4;
+ lastTime:=currentTime;
+ end;
+
+// LastFade := Fade; // whatever
+// Fade := Fade -0.999; // start fading out
+
+
+// ActualScreen.ShowFinish := false; // no purpose?
+
+// ActualScreen.SetAnimationProgress(Fade-1); // nop?
+
+ // blackscreen-hack
+ if not BlackScreen then
+ NextScreen.Draw // draw next screen
+ else begin
+ glClearColor(0, 0, 0 , 0);
+ glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
+ end;
+
+ // and draw old screen over it... slowly fading out
+ myfade2:=(myfade*myfade)/10000;
+ glBindTexture(GL_TEXTURE_2D, pTex[S]);
+ glColor4f(1, 1, 1, (1000-myfade*myfade)/1000); // strange calculation - alpha gets negative... but looks good this way
+ glEnable(GL_TEXTURE_2D);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glBegin(GL_QUADS);
+ glTexCoord2f(0+myfade2,0+myfade2);glVertex2f(0, 600);
+ glTexCoord2f(0+myfade2,1-myfade2);glVertex2f(0, 0);
+ glTexCoord2f(1-myfade2,1-myfade2);glVertex2f(800, 0);
+ glTexCoord2f(1-myfade2,0+myfade2);glVertex2f(800, 600);
+ glEnd;
+ glDisable(GL_BLEND);
+ glDisable(GL_TEXTURE_2D);
+ end
+ else
+ // blackscreen hack
+ if (not BlackScreen) AND (S = 1) then
+ NextScreen.OnShow;
+
+
+ if ((myfade > 40) or (not doFade) or (not canFade)) And (S = 1) then begin // fade out complete...
+ //if not DoneOnShow then
+ // ScreenPopupError.ShowPopup('Wheres OnShow ?'); //show error message
+ DoneOnShow := false;
+ myFade:=0;
+ ActualScreen.onHide;
+ ActualScreen.ShowFinish:=False;
+ ActualScreen:=NextScreen;
+ NextScreen := nil;
+ if not blackscreen then
+ begin
+ ActualScreen.onShowFinish;
+ ActualScreen.ShowFinish := true;
+ end
+ else
+ begin
+ Result:=False;
+ Break;
+ end;
+ // end of fade mod
+ end;
+ end; // if
+
+ //Draw OSD only on first Screen if Debug Mode is enabled
+ if ((Ini.Debug = 1) OR (Params.Debug)) AND (S=1) then
+ DrawDebugInformation;
+
+ end; // for S
+// SwapBuffers(h_DC);
+end;
+
+{function TDisplay.Fade(FadeIn : Boolean; Steps : UInt8): UInt8;
+begin
+ Self.FadeIn := FadeIn;
+ FadeStep := (SizeOf(FadeStep) * $FF) div Steps;
+ ActualStep := $FF;
+ Result := $FF div FadeStep;
+end;}
+
+procedure TDisplay.PrintScreen;
+var
+ Bitmap: TBitmap;
+ Jpeg: TJpegImage;
+ X, Y: integer;
+ Num: integer;
+ FileName: string;
+begin
+ for Num := 1 to 9999 do begin
+ FileName := IntToStr(Num);
+ while Length(FileName) < 4 do FileName := '0' + FileName;
+ FileName := ScreenshotsPath + 'screenshot' + FileName + '.jpg';
+ if not FileExists(FileName) then break
+ end;
+
+ glReadPixels(0, 0, ScreenW, ScreenH, GL_BGRA_EXT, GL_UNSIGNED_BYTE, @PrintScreenData[0]);
+ Bitmap := TBitmap.Create;
+ Bitmap.Width := ScreenW;
+ Bitmap.Height := ScreenH;
+
+ for Y := 0 to ScreenH-1 do
+ for X := 0 to ScreenW-1 do
+ Bitmap.Canvas.Pixels[X, Y] := PrintScreenData[(ScreenH-1-Y) * ScreenW + X] and $00FFFFFF;
+
+ Jpeg := TJpegImage.Create;
+ Jpeg.Assign(Bitmap);
+ Bitmap.Free;
+ Jpeg.CompressionQuality := 95;//90;
+ Jpeg.SaveToFile(FileName);
+ Jpeg.Free;
+end;
+
+procedure TDisplay.ScreenShot;
+ var F : file;
+ FileInfo: BITMAPINFOHEADER;
+ FileHeader : BITMAPFILEHEADER;
+ pPicData:Pointer;
+ FileName: String;
+ Num: Integer;
+begin
+ //bilddatei Suchen
+ for Num := 1 to 9999 do begin
+ FileName := IntToStr(Num);
+ while Length(FileName) < 4 do FileName := '0' + FileName;
+ FileName := ScreenshotsPath + FileName + '.BMP';
+ if not FileExists(FileName) then break
+ end;
+
+ //Speicher für die Speicherung der Header-Informationen vorbereiten
+ ZeroMemory(@FileHeader, SizeOf(BITMAPFILEHEADER));
+ ZeroMemory(@FileInfo, SizeOf(BITMAPINFOHEADER));
+
+ //Initialisieren der Daten des Headers
+ FileHeader.bfType := 19778; //$4D42 = 'BM'
+ FileHeader.bfOffBits := SizeOf(BITMAPINFOHEADER)+SizeOf(BITMAPFILEHEADER);
+
+ //Schreiben der Bitmap-Informationen
+ FileInfo.biSize := SizeOf(BITMAPINFOHEADER);
+ FileInfo.biWidth := ScreenW;
+ FileInfo.biHeight := ScreenH;
+ FileInfo.biPlanes := 1;
+ FileInfo.biBitCount := 32;
+ FileInfo.biSizeImage := FileInfo.biWidth*FileInfo.biHeight*(FileInfo.biBitCount div 8);
+
+ //Größenangabe auch in den Header übernehmen
+ FileHeader.bfSize := FileHeader.bfOffBits + FileInfo.biSizeImage;
+
+ //Speicher für die Bilddaten reservieren
+ GetMem(pPicData, FileInfo.biSizeImage);
+ try
+ //Bilddaten von OpenGL anfordern (siehe oben)
+ glReadPixels(0, 0, ScreenW, ScreenH, GL_BGRA_EXT, GL_UNSIGNED_BYTE, pPicData);
+
+ //Und den ganzen Müll in die Datei schieben ;-)
+ //Moderne Leute nehmen dafür auch Streams ...
+ AssignFile(f, Filename);
+ Rewrite( f,1 );
+ try
+ BlockWrite(F, FileHeader, SizeOf(BITMAPFILEHEADER));
+ BlockWrite(F, FileInfo, SizeOf(BITMAPINFOHEADER));
+ BlockWrite(F, pPicData^, FileInfo.biSizeImage );
+ finally
+ CloseFile(f);
+ end;
+ finally
+ //Und den angeforderten Speicher wieder freigeben ...
+ FreeMem(pPicData, FileInfo.biSizeImage);
+ end;
+end;
+
+//------------
+// DrawDebugInformation - Procedure draw FPS and some other Informations on Screen
+//------------
+procedure TDisplay.DrawDebugInformation;
+var Ticks: Cardinal;
+begin
+ //Some White Background for information
+ glEnable(GL_BLEND);
+ glDisable(GL_TEXTURE_2D);
+ glColor4f(1, 1, 1, 0.5);
+ glBegin(GL_QUADS);
+ glVertex2f(690, 44);
+ glVertex2f(690, 0);
+ glVertex2f(800, 0);
+ glVertex2f(800, 44);
+ glEnd;
+ glDisable(GL_BLEND);
+
+ //Set Font Specs
+ SetFontStyle(0);
+ SetFontSize(7);
+ SetFontItalic(False);
+ glColor4f(0, 0, 0, 1);
+
+ //Calculate FPS
+ Ticks := GetTickCount;
+ if (Ticks >= NextFPSSwap) then
+ begin
+ LastFPS := FPSCounter * 4;
+ FPSCounter := 0;
+ NextFPSSwap := Ticks + 250;
+ end;
+
+ Inc(FPSCounter);
+
+ //Draw Text
+
+ //FPS
+ SetFontPos(695, 0);
+ glPrint (PChar('FPS: ' + InttoStr(LastFPS)));
+
+ //RSpeed
+ SetFontPos(695, 13);
+ glPrint (PChar('RSpeed: ' + InttoStr(Round(1000 * TimeMid))));
+
+ //LastError
+ SetFontPos(695, 26);
+ glColor4f(1, 0, 0, 1);
+ glPrint (PChar(OSD_LastError));
+
+ glColor4f(1, 1, 1, 1);
+end;
+
+end.
diff --git a/Game/Code/Menu/UDrawTexture.pas b/Game/Code/Menu/UDrawTexture.pas
new file mode 100644
index 00000000..5509b29c
--- /dev/null
+++ b/Game/Code/Menu/UDrawTexture.pas
@@ -0,0 +1,101 @@
+unit UDrawTexture;
+
+interface
+uses UTexture;
+
+procedure DrawLine(X1, Y1, X2, Y2, ColR, ColG, ColB: real);
+procedure DrawQuad(X, Y, W, H, ColR, ColG, ColB: real);
+procedure DrawTexture(Texture: TTexture);
+
+implementation
+uses gl;
+
+procedure DrawLine(X1, Y1, X2, Y2, ColR, ColG, ColB: real);
+begin
+ glColor3f(ColR, ColG, ColB);
+ glBegin(GL_LINES);
+ glVertex2f(x1, y1);
+ glVertex2f(x2, y2);
+ glEnd;
+end;
+
+procedure DrawQuad(X, Y, W, H, ColR, ColG, ColB: real);
+begin
+ glColor3f(ColR, ColG, ColB);
+ glBegin(GL_QUADS);
+ glVertex2f(x, y);
+ glVertex2f(x, y+h);
+ glVertex2f(x+w, y+h);
+ glVertex2f(x+w, y);
+ glEnd;
+end;
+
+procedure DrawTexture(Texture: TTexture);
+var
+ x1, x2, x3, x4: real;
+ y1, y2, y3, y4: real;
+ xt1, xt2, xt3, xt4: real;
+ yt1, yt2, yt3, yt4: real;
+begin
+ with Texture do begin
+ // rysuje paski gracza
+ glColor4f(ColR * Int, ColG * Int, ColB * Int, Alpha);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glDepthRange(0, 10);
+ glDepthFunc(GL_LEQUAL);
+// glDepthFunc(GL_GEQUAL);
+ glEnable(GL_DEPTH_TEST);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+// glBlendFunc(GL_SRC_COLOR, GL_ZERO);
+ glBindTexture(GL_TEXTURE_2D, TexNum);
+
+ x1 := x;
+ x2 := x;
+ x3 := x+w*scaleW;
+ x4 := x+w*scaleW;
+ y1 := y;
+ y2 := y+h*scaleH;
+ y3 := y+h*scaleH;
+ y4 := y;
+ if Rot <> 0 then begin
+ xt1 := x1 - (x + w/2);
+ xt2 := x2 - (x + w/2);
+ xt3 := x3 - (x + w/2);
+ xt4 := x4 - (x + w/2);
+ yt1 := y1 - (y + h/2);
+ yt2 := y2 - (y + h/2);
+ yt3 := y3 - (y + h/2);
+ yt4 := y4 - (y + h/2);
+
+ x1 := (x + w/2) + xt1 * cos(Rot) - yt1 * sin(Rot);
+ x2 := (x + w/2) + xt2 * cos(Rot) - yt2 * sin(Rot);
+ x3 := (x + w/2) + xt3 * cos(Rot) - yt3 * sin(Rot);
+ x4 := (x + w/2) + xt4 * cos(Rot) - yt4 * sin(Rot);
+
+ y1 := (y + h/2) + yt1 * cos(Rot) + xt1 * sin(Rot);
+ y2 := (y + h/2) + yt2 * cos(Rot) + xt2 * sin(Rot);
+ y3 := (y + h/2) + yt3 * cos(Rot) + xt3 * sin(Rot);
+ y4 := (y + h/2) + yt4 * cos(Rot) + xt4 * sin(Rot);
+
+ end;
+
+{ glBegin(GL_QUADS);
+ glTexCoord2f(0, 0); glVertex3f(x1, y1, z);
+ glTexCoord2f(0, TexH); glVertex3f(x2, y2, z);
+ glTexCoord2f(TexW, TexH); glVertex3f(x3, y3, z);
+ glTexCoord2f(TexW, 0); glVertex3f(x4, y4, z);
+ glEnd;}
+
+ glBegin(GL_QUADS);
+ glTexCoord2f(TexX1*TexW, TexY1*TexH); glVertex3f(x1, y1, z);
+ glTexCoord2f(TexX1*TexW, TexY2*TexH); glVertex3f(x2, y2, z);
+ glTexCoord2f(TexX2*TexW, TexY2*TexH); glVertex3f(x3, y3, z);
+ glTexCoord2f(TexX2*TexW, TexY1*TexH); glVertex3f(x4, y4, z);
+ glEnd;
+ end;
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_TEXTURE_2D);
+end;
+
+end.
diff --git a/Game/Code/Menu/UMenu.pas b/Game/Code/Menu/UMenu.pas
new file mode 100644
index 00000000..ca91a65c
--- /dev/null
+++ b/Game/Code/Menu/UMenu.pas
@@ -0,0 +1,1448 @@
+unit UMenu;
+
+interface
+
+uses gl, SysUtils, UTexture, UMenuStatic, UMenuText, UMenuButton, UMenuSelect, UMenuSelectSlide,
+ UMenuInteract, UThemes, UMenuButtonCollection;
+
+type
+{ Int16 = SmallInt;}
+
+ PMenu = ^TMenu;
+ TMenu = class
+ protected
+ ButtonPos: Integer;
+
+ Interactions: array of TInteract;
+ SelInteraction: integer;
+ Button: array of TButton;
+ Selects: array of TSelect;
+ SelectsS: array of TSelectSlide;
+ ButtonCollection: Array of TButtonCollection;
+ BackImg: TTexture;
+ BackW: integer;
+ BackH: integer;
+ public
+ Text: array of TText;
+ Static: array of TStatic;
+ mX: integer; // mouse X
+ mY: integer; // mouse Y
+
+ Fade: integer; // fade type
+ ShowFinish: boolean; // true if there is no fade
+
+
+ destructor Destroy; override;
+ constructor Create; overload; virtual;
+ //constructor Create(Back: string); overload; virtual; // Back is a JPG resource name for background
+ //constructor Create(Back: string; W, H: integer); overload; virtual; // W and H are the number of overlaps
+
+ // interaction
+ procedure AddInteraction(Typ, Num: integer);
+ procedure SetInteraction(Num: integer);
+ property Interaction: integer read SelInteraction write SetInteraction;
+
+ //Procedure Load BG, Texts, Statics and Button Collections from ThemeBasic
+ procedure LoadFromTheme(const ThemeBasic: TThemeBasic);
+
+ procedure PrepareButtonCollections(const Collections: AThemeButtonCollection);
+ procedure AddButtonCollection(const ThemeCollection: TThemeButtonCollection; Const Num: Byte);
+
+ // background
+ procedure AddBackground(Name: string);
+
+ // static
+ function AddStatic(ThemeStatic: TThemeStatic): integer; overload;
+ function AddStatic(X, Y, W, H: real; Name: string): integer; overload;
+ function AddStatic(X, Y, W, H: real; Name, Format, Typ: string): integer; overload;
+ function AddStatic(X, Y, W, H: real; ColR, ColG, ColB: real; Name, Format, Typ: string): integer; overload;
+ function AddStatic(X, Y, W, H, Z: real; ColR, ColG, ColB: real; Name, Format, Typ: string): integer; overload;
+ function AddStatic(X, Y, W, H: real; ColR, ColG, ColB: real; Name, Format, Typ: string; Color: integer): integer; overload;
+ function AddStatic(X, Y, W, H, Z: real; ColR, ColG, ColB: real; Name, Format, Typ: string; Color: integer): integer; overload;
+ function AddStatic(X, Y, W, H, Z: real; ColR, ColG, ColB: real; TexX1, TexY1, TexX2, TexY2: real; Name, Format, Typ: string; Color: integer; Reflection: Boolean; ReflectionSpacing: Real): integer; overload;
+
+ // text
+ function AddText(ThemeText: TThemeText): integer; overload;
+ function AddText(X, Y: real; Tekst: string): integer; overload;
+ function AddText(X, Y: real; Style: integer; Size, ColR, ColG, ColB: real; Tekst: string): integer; overload;
+ function AddText(X, Y, W: real; Style: integer; Size, ColR, ColG, ColB: real; Align: integer; Tekst: string): integer; overload;
+
+ // button
+ Procedure SetButtonLength(Length: Cardinal); //Function that Set Length of Button Array in one Step instead of register new Memory for every Button
+ function AddButton(ThemeButton: TThemeButton): integer; overload;
+ function AddButton(X, Y, W, H: real; Name: String): integer; overload;
+ function AddButton(X, Y, W, H: real; Name, Format, Typ: String; Reflection: Boolean): integer; overload;
+ function AddButton(X, Y, W, H, ColR, ColG, ColB, Int, DColR, DColG, DColB, DInt: real; Name, Format, Typ: String; Reflection: Boolean; ReflectionSpacing, DeSelectReflectionSpacing: Real): integer; overload;
+ procedure ClearButtons;
+ procedure AddButtonText(AddX, AddY: real; AddText: string); overload;
+ procedure AddButtonText(AddX, AddY: real; ColR, ColG, ColB: real; AddText: string); overload;
+ procedure AddButtonText(AddX, AddY: real; ColR, ColG, ColB: real; Font: integer; Size: integer; Align: integer; AddText: string); overload;
+ procedure AddButtonText(CustomButton: TButton; AddX, AddY: real; ColR, ColG, ColB: real; Font: integer; Size: integer; Align: integer; AddText: string); overload;
+
+ // select
+ function AddSelect(ThemeSelect: TThemeSelect; var Data: integer; Values: array of string): integer; overload;
+ function AddSelect(X, Y, W, H, SkipX, ColR, ColG, ColB, Int, DColR, DColG, DColB, DInt,
+ TColR, TColG, TColB, TInt, TDColR, TDColG, TDColB, TDInt,
+ SBGColR, SBGColG, SBGColB, SBGInt, SBGDColR, SBGDColG, SBGDColB, SBGDInt,
+ STColR, STColG, STColB, STInt, STDColR, STDColG, STDColB, STDInt: real;
+ Name, Typ: String; SBGName, SBGTyp: String;
+ Caption: string; var Data: integer): integer; overload;
+ procedure AddSelectOption(AddX, AddY: real; AddText: string); overload;
+ procedure AddSelectOption(SelectNo: Cardinal; AddX, AddY: real; AddText: string); overload;
+ procedure UpdateSelectOptions(ThemeSelect: TThemeSelect; SelectNum: integer; Values: array of string; var Data: integer);
+
+ // select slide
+ function AddSelectSlide(ThemeSelectS: TThemeSelectSlide; var Data: integer; Values: array of string): integer; overload;
+ function AddSelectSlide(X, Y, W, H, SkipX, SBGW, ColR, ColG, ColB, Int, DColR, DColG, DColB, DInt,
+ TColR, TColG, TColB, TInt, TDColR, TDColG, TDColB, TDInt,
+ SBGColR, SBGColG, SBGColB, SBGInt, SBGDColR, SBGDColG, SBGDColB, SBGDInt,
+ STColR, STColG, STColB, STInt, STDColR, STDColG, STDColB, STDInt: real;
+ Name, Typ: String; SBGName, SBGTyp: String;
+ Caption: string; var Data: integer): integer; overload;
+ procedure AddSelectSlideOption(AddText: string); overload;
+ procedure AddSelectSlideOption(SelectNo: Cardinal; AddText: string); overload;
+ procedure UpdateSelectSlideOptions(ThemeSelectSlide: TThemeSelectSlide; SelectNum: integer; Values: array of string; var Data: integer);
+
+
+// function AddWidget(X, Y : UInt16; WidgetSrc : PSDL_Surface): Int16;
+// procedure ClearWidgets(MinNumber : Int16);
+ procedure FadeTo(Screen: PMenu);
+ //popup hack
+ procedure CheckFadeTo(Screen: PMenu; msg: String);
+
+ function DrawBG: boolean; virtual;
+ function DrawFG: boolean; virtual;
+ function Draw: boolean; virtual;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown : Boolean): Boolean; virtual;
+ function ParseMouse(Typ: integer; X: integer; Y: integer): Boolean; virtual; abstract;
+ function InRegion(X1, Y1, X2, Y2, X, Y: real): Boolean;
+ function InStaticRegion(StaticNr: integer; X, Y: integer): Boolean;
+ procedure onShow; virtual;
+ procedure onShowFinish; virtual;
+ procedure onHide; virtual;
+
+ procedure SetAnimationProgress(Progress: real); virtual;
+
+ function IsSelectable(Int: Cardinal): Boolean;
+
+ procedure InteractNext; virtual;
+ procedure InteractCustom(CustomSwitch: integer); virtual;
+ procedure InteractPrev; virtual;
+ procedure InteractInc; virtual;
+ procedure InteractDec; virtual;
+
+ procedure AddBox(X, Y, W, H: real);
+ end;
+
+const
+ pmMove = 1;
+ pmClick = 2;
+ pmUnClick = 3;
+
+ iButton = 0; // interaction type
+ iSelect = 1;
+ iText = 2;
+ iSelectS = 3;
+ iBCollectionChild = 5;
+
+// fBlack = 0; // fade type
+// fWhite = 1;
+
+implementation
+
+uses UMain, UDrawTexture, UGraphic, UDisplay, UCovers, USkins, Dialogs;
+
+destructor TMenu.Destroy;
+begin
+ inherited;
+end;
+
+constructor TMenu.Create;
+begin
+ Fade := 0;//fWhite;
+
+ SetLength(Static, 0);
+ SetLength(Button, 0);
+
+ BackImg.TexNum := -1;
+
+ //Set ButtonPos to Autoset Length
+ ButtonPos := -1;
+end;
+{
+constructor TMenu.Create(Back: String);
+begin
+ inherited Create;
+
+ if Back <> '' then begin
+// BackImg := Texture.LoadTexture(true, PChar(Back), 'JPG', 'Plain', 0);
+ BackImg := Texture.LoadTexture(PChar(Back), 'JPG', 'Plain', 0); // new theme system
+ BackImg.W := 800;//640;
+ BackImg.H := 600;//480;
+ BackW := 1;
+ BackH := 1;
+ end else
+ BackImg.TexNum := -1;
+
+ //Set ButtonPos to Autoset Length
+ ButtonPos := -1;
+end;
+
+constructor TMenu.Create(Back: string; W, H: integer);
+begin
+ Create(Back);
+ BackImg.W := BackImg.W / W;
+ BackImg.H := BackImg.H / H;
+ BackW := W;
+ BackH := H;
+end; }
+
+procedure TMenu.AddInteraction(Typ, Num: integer);
+var
+ IntNum: integer;
+begin
+ IntNum := Length(Interactions);
+ SetLength(Interactions, IntNum+1);
+ Interactions[IntNum].Typ := Typ;
+ Interactions[IntNum].Num := Num;
+ Interaction := 0;
+end;
+
+procedure TMenu.SetInteraction(Num: integer);
+var
+ OldNum, OldTyp: integer;
+ NewNum, NewTyp: integer;
+begin
+ // set inactive
+ OldNum := Interactions[Interaction].Num;
+ OldTyp := Interactions[Interaction].Typ;
+
+ NewNum := Interactions[Num].Num;
+ NewTyp := Interactions[Num].Typ;
+
+ case OldTyp of
+ iButton: Button[OldNum].Selected := False;
+ iSelect: Selects[OldNum].Selected := False;
+ iText: Text[OldNum].Selected := False;
+ iSelectS: SelectsS[OldNum].Selected := False;
+ //Button Collection Mod
+ iBCollectionChild:
+ begin
+ Button[OldNum].Selected := False;
+
+ //Deselect Collection if Next Button is Not from Collection
+ if (NewTyp <> iButton) Or (Button[NewNum].Parent <> Button[OldNum].Parent) then
+ ButtonCollection[Button[OldNum].Parent-1].Selected := False;
+ end;
+ end;
+
+ // set active
+ SelInteraction := Num;
+ case NewTyp of
+ iButton: Button[NewNum].Selected := True;
+ iSelect: Selects[NewNum].Selected := True;
+ iText: Text[NewNum].Selected := True;
+ iSelectS: SelectsS[NewNum].Selected := True;
+
+ //Button Collection Mod
+ iBCollectionChild:
+ begin
+ Button[NewNum].Selected := True;
+ ButtonCollection[Button[NewNum].Parent-1].Selected := True;
+ end;
+ end;
+end;
+
+//----------------------
+//LoadFromTheme - Load BG, Texts, Statics and
+//Button Collections from ThemeBasic
+//----------------------
+procedure TMenu.LoadFromTheme(const ThemeBasic: TThemeBasic);
+var
+ I: Integer;
+begin
+ //Add Button Collections (Set Button CollectionsLength)
+ //Button Collections are Created when the first ChildButton is Created
+ PrepareButtonCollections(ThemeBasic.ButtonCollection);
+
+
+ //Add Background
+ AddBackground(ThemeBasic.Background.Tex);
+
+ //Add Statics and Texts
+ for I := 0 to High(ThemeBasic.Static) do
+ AddStatic(ThemeBasic.Static[I]);
+
+ for I := 0 to High(ThemeBasic.Text) do
+ AddText(ThemeBasic.Text[I]);
+end;
+
+procedure TMenu.AddBackground(Name: string);
+begin
+ if Name <> '' then begin
+// BackImg := Texture.LoadTexture(false, PChar(Skin.SkinPath + FileName), 'JPG', 'Plain', 0); // new theme system
+ BackImg := Texture.GetTexture(Skin.GetTextureFileName(Name), 'Plain');
+ BackImg.W := 800;
+ BackImg.H := 600;
+ BackW := 1;
+ BackH := 1;
+ end;
+end;
+
+//----------------------
+//PrepareButtonCollections:
+//Add Button Collections (Set Button CollectionsLength)
+//----------------------
+procedure TMenu.PrepareButtonCollections(const Collections: AThemeButtonCollection);
+var
+ I: Integer;
+begin
+ SetLength(ButtonCollection, Length(Collections));
+ For I := 0 to High(ButtonCollection) do
+ AddButtonCollection(Collections[I], I);
+end;
+
+//----------------------
+//AddButtonCollection:
+//Create a Button Collection;
+//----------------------
+procedure TMenu.AddButtonCollection(const ThemeCollection: TThemeButtonCollection; Const Num: Byte);
+var
+ BT, BTLen: Integer;
+begin
+ if (Num > High(ButtonCollection)) then
+ exit;
+
+ ButtonCollection[Num] := TButtonCollection.Create(Texture.GetTexture(Skin.GetTextureFileName(ThemeCollection.Style.Tex), ThemeCollection.Style.Typ, true)); // use cache texture
+
+ //Set Parent menu
+ ButtonCollection[Num].ScreenButton := @Self.Button;
+
+ //Set Attributes
+ ButtonCollection[Num].FirstChild := ThemeCollection.FirstChild;
+ ButtonCollection[Num].CountChilds := ThemeCollection.ChildCount;
+ ButtonCollection[Num].Parent := Num + 1;
+
+ //Set Style
+ ButtonCollection[Num].X := ThemeCollection.Style.X;
+ ButtonCollection[Num].Y := ThemeCollection.Style.Y;
+ ButtonCollection[Num].W := ThemeCollection.Style.W;
+ ButtonCollection[Num].H := ThemeCollection.Style.H;
+ ButtonCollection[Num].SelectColR := ThemeCollection.Style.ColR;
+ ButtonCollection[Num].SelectColG := ThemeCollection.Style.ColG;
+ ButtonCollection[Num].SelectColB := ThemeCollection.Style.ColB;
+ ButtonCollection[Num].SelectInt := ThemeCollection.Style.Int;
+ ButtonCollection[Num].DeselectColR := ThemeCollection.Style.DColR;
+ ButtonCollection[Num].DeselectColG := ThemeCollection.Style.DColG;
+ ButtonCollection[Num].DeselectColB := ThemeCollection.Style.DColB;
+ ButtonCollection[Num].DeselectInt := ThemeCollection.Style.DInt;
+ ButtonCollection[Num].Texture.TexX1 := 0;
+ ButtonCollection[Num].Texture.TexY1 := 0;
+ ButtonCollection[Num].Texture.TexX2 := 1;
+ ButtonCollection[Num].Texture.TexY2 := 1;
+ ButtonCollection[Num].SetSelect(false);
+
+ ButtonCollection[Num].Reflection := ThemeCollection.Style.Reflection;
+ ButtonCollection[Num].Reflectionspacing := ThemeCollection.Style.ReflectionSpacing;
+ ButtonCollection[Num].DeSelectReflectionspacing := ThemeCollection.Style.DeSelectReflectionSpacing;
+
+ ButtonCollection[Num].Z := ThemeCollection.Style.Z;
+
+ //Some Things from ButtonFading
+ ButtonCollection[Num].SelectH := ThemeCollection.Style.SelectH;
+ ButtonCollection[Num].SelectW := ThemeCollection.Style.SelectW;
+
+ ButtonCollection[Num].Fade := ThemeCollection.Style.Fade;
+ ButtonCollection[Num].FadeText := ThemeCollection.Style.FadeText;
+ ButtonCollection[Num].FadeTex := Texture.GetTexture(Skin.GetTextureFileName(ThemeCollection.Style.FadeTex), ThemeCollection.Style.Typ, true);
+ ButtonCollection[Num].FadeTexPos := ThemeCollection.Style.FadeTexPos;
+
+
+ BTLen := Length(ThemeCollection.Style.Text);
+ for BT := 0 to BTLen-1 do begin
+ AddButtonText(ButtonCollection[Num], ThemeCollection.Style.Text[BT].X, ThemeCollection.Style.Text[BT].Y,
+ ThemeCollection.Style.Text[BT].ColR, ThemeCollection.Style.Text[BT].ColG, ThemeCollection.Style.Text[BT].ColB,
+ ThemeCollection.Style.Text[BT].Font, ThemeCollection.Style.Text[BT].Size, ThemeCollection.Style.Text[BT].Align,
+ ThemeCollection.Style.Text[BT].Text);
+ end;
+end;
+
+function TMenu.AddStatic(ThemeStatic: TThemeStatic): integer;
+begin
+ Result := AddStatic(ThemeStatic.X, ThemeStatic.Y, ThemeStatic.W, ThemeStatic.H, ThemeStatic.Z,
+ ThemeStatic.ColR, ThemeStatic.ColG, ThemeStatic.ColB,
+ ThemeStatic.TexX1, ThemeStatic.TexY1, ThemeStatic.TexX2, ThemeStatic.TexY2,
+ {<0.5.1: Skin.SkinPath + ThemeStatic.Tex, 0.5.1:} Skin.GetTextureFileName(ThemeStatic.Tex),
+ 'JPG', ThemeStatic.Typ, $FFFFFF, ThemeStatic.Reflection, ThemeStatic.Reflectionspacing);
+ //'Font Black');
+end;
+
+function TMenu.AddStatic(X, Y, W, H: real; Name: string): integer;
+begin
+ Result := AddStatic(X, Y, W, H, Name, 'JPG', 'Plain');
+end;
+
+function TMenu.AddStatic(X, Y, W, H: real; ColR, ColG, ColB: real; Name, Format, Typ: string): integer;
+var
+ StatNum: integer;
+begin
+ Result := AddStatic(X, Y, W, H, ColR, ColG, ColB, Name, Format, Typ, $FFFFFF);
+end;
+
+function TMenu.AddStatic(X, Y, W, H, Z: real; ColR, ColG, ColB: real; Name, Format, Typ: string): integer;
+var
+ StatNum: integer;
+begin
+ Result := AddStatic(X, Y, W, H, Z, ColR, ColG, ColB, Name, Format, Typ, $FFFFFF);
+end;
+
+function TMenu.AddStatic(X, Y, W, H: real; Name, Format, Typ: string): integer;
+var
+ StatNum: integer;
+begin
+ // adds static
+ StatNum := Length(Static);
+ SetLength(Static, StatNum + 1);
+// Static[StatNum] := TStatic.Create(Texture.LoadTexture(PChar(Name), PChar(Format), PChar(Typ), $FF00FF)); // $FFFFFF
+// Static[StatNum] := TStatic.Create(Texture.LoadTexture(Skin.SkinReg, PChar(Name), PChar(Format), PChar(Typ), $FF00FF)); // new skin system
+ Static[StatNum] := TStatic.Create(Texture.LoadTexture(PChar(Name), PChar(Format), PChar(Typ), $FF00FF)); // new skin
+
+ // configures static
+ Static[StatNum].Texture.X := X;
+ Static[StatNum].Texture.Y := Y;
+ Static[StatNum].Texture.W := W;
+ Static[StatNum].Texture.H := H;
+ Static[StatNum].Visible := true;
+ Result := StatNum;
+end;
+
+function TMenu.AddStatic(X, Y, W, H: real; ColR, ColG, ColB: real; Name, Format, Typ: string; Color: integer): integer;
+var
+ StatNum: integer;
+begin
+ Result := AddStatic(X, Y, W, H, 0, ColR, ColG, ColB, Name, Format, Typ, Color);
+end;
+
+function TMenu.AddStatic(X, Y, W, H, Z: real; ColR, ColG, ColB: real; Name, Format, Typ: string; Color: integer): integer;
+begin
+ Result := AddStatic(X, Y, W, H, Z, ColR, ColG, ColB, 0, 0, 1, 1, Name, Format, Typ, Color, False, 0);
+//
+end;
+
+function TMenu.AddStatic(X, Y, W, H, Z: real; ColR, ColG, ColB: real; TexX1, TexY1, TexX2, TexY2: real; Name, Format, Typ: string; Color: integer; Reflection: Boolean; ReflectionSpacing: Real): integer;
+var
+ StatNum: integer;
+begin
+ // adds static
+ StatNum := Length(Static);
+ SetLength(Static, StatNum + 1);
+// Static[StatNum] := TStatic.Create(Texture.LoadTexture(PChar(Name), PChar(Format), PChar(Typ), Color));
+// Static[StatNum] := TStatic.Create(Texture.LoadTexture(Skin.SkinReg, PChar(Name), PChar(Format), PChar(Typ), Color)); // new skin system
+Static[StatNum] := TStatic.Create(Texture.LoadTexture(PChar(Name), PChar(Format), PChar(Typ), Color)); // new skin
+// Static[StatNum] := TStatic.Create(Texture.GetTexture(Name, Typ));
+
+ // configures static
+ Static[StatNum].Texture.X := X;
+ Static[StatNum].Texture.Y := Y;
+ Static[StatNum].Texture.W := W;
+ Static[StatNum].Texture.H := H;
+ Static[StatNum].Texture.Z := Z;
+ Static[StatNum].Texture.ColR := ColR;
+ Static[StatNum].Texture.ColG := ColG;
+ Static[StatNum].Texture.ColB := ColB;
+ Static[StatNum].Texture.TexX1 := TexX1;
+ Static[StatNum].Texture.TexY1 := TexY1;
+ Static[StatNum].Texture.TexX2 := TexX2;
+ Static[StatNum].Texture.TexY2 := TexY2;
+ Static[StatNum].Texture.Alpha := 1;
+ Static[StatNum].Visible := true;
+
+ //ReflectionMod
+ Static[StatNum].Reflection := Reflection;
+ Static[StatNum].ReflectionSpacing := ReflectionSpacing;
+
+ Result := StatNum;
+end;
+
+function TMenu.AddText(ThemeText: TThemeText): integer;
+begin
+ Result := AddText(ThemeText.X, ThemeText.Y, ThemeText.W, ThemeText.Font, ThemeText.Size,
+ ThemeText.ColR, ThemeText.ColG, ThemeText.ColB, ThemeText.Align, ThemeText.Text);
+end;
+
+function TMenu.AddText(X, Y: real; Tekst: string): integer;
+var
+ TextNum: integer;
+begin
+ // adds text
+ TextNum := Length(Text);
+ SetLength(Text, TextNum + 1);
+ Text[TextNum] := TText.Create(X, Y, Tekst);
+ Result := TextNum;
+end;
+
+function TMenu.AddText(X, Y: real; Style: integer; Size, ColR, ColG, ColB: real; Tekst: string): integer;
+begin
+ Result := AddText(X, Y, 0, Style, Size, ColR, ColG, ColB, 0, Tekst);
+end;
+
+function TMenu.AddText(X, Y, W: real; Style: integer; Size, ColR, ColG, ColB: real; Align: integer; Tekst: string): integer;
+var
+ TextNum: integer;
+begin
+ // adds text
+ TextNum := Length(Text);
+ SetLength(Text, TextNum + 1);
+ Text[TextNum] := TText.Create(X, Y, W, Style, Size, ColR, ColG, ColB, Align, Tekst);
+ Result := TextNum;
+end;
+
+//Function that Set Length of Button Array in one Step instead of register new Memory for every Button
+Procedure TMenu.SetButtonLength(Length: Cardinal);
+begin
+ if (ButtonPos = -1) AND (Length > 0) then
+ begin
+ //Set Length of Button
+ SetLength(Button, Length);
+
+ //Set ButtonPos to start with 0
+ ButtonPos := 0;
+ end;
+end;
+
+
+// Method to add a button in our TMenu. It returns the assigned ButtonNumber
+function TMenu.AddButton(ThemeButton: TThemeButton): integer;
+var
+ BT: integer;
+ BTLen: integer;
+ temp: integer;
+begin
+{ Result := AddButton(ThemeButton.X, ThemeButton.Y, ThemeButton.W, ThemeButton.H,
+ ThemeButton.ColR, ThemeButton.ColG, ThemeButton.ColB, ThemeButton.Int,
+ ThemeButton.DColR, ThemeButton.DColG, ThemeButton.DColB, ThemeButton.DInt,
+ ThemeButton.Tex, 'JPG', 'Font Black');}
+
+ Result := AddButton(ThemeButton.X, ThemeButton.Y, ThemeButton.W, ThemeButton.H,
+ ThemeButton.ColR, ThemeButton.ColG, ThemeButton.ColB, ThemeButton.Int,
+ ThemeButton.DColR, ThemeButton.DColG, ThemeButton.DColB, ThemeButton.DInt,
+ Skin.GetTextureFileName(ThemeButton.Tex), 'JPG', ThemeButton.Typ, ThemeButton.Reflection, ThemeButton.Reflectionspacing, ThemeButton.DeSelectReflectionspacing);
+
+ Button[Result].Z := ThemeButton.Z;
+
+ //Button Visibility
+ Button[Result].Visible := ThemeButton.Visible;
+
+ //Some Things from ButtonFading
+ Button[Result].SelectH := ThemeButton.SelectH;
+ Button[Result].SelectW := ThemeButton.SelectW;
+
+ Button[Result].Fade := ThemeButton.Fade;
+ Button[Result].FadeText := ThemeButton.FadeText;
+ Button[Result].FadeTex := Texture.GetTexture(Skin.GetTextureFileName(ThemeButton.FadeTex), ThemeButton.Typ, true);
+ Button[Result].FadeTexPos := ThemeButton.FadeTexPos;
+
+
+ BTLen := Length(ThemeButton.Text);
+ for BT := 0 to BTLen-1 do begin
+ AddButtonText(ThemeButton.Text[BT].X, ThemeButton.Text[BT].Y,
+ ThemeButton.Text[BT].ColR, ThemeButton.Text[BT].ColG, ThemeButton.Text[BT].ColB,
+ ThemeButton.Text[BT].Font, ThemeButton.Text[BT].Size, ThemeButton.Text[BT].Align,
+ ThemeButton.Text[BT].Text);
+ end;
+
+ //BAutton Collection Mod
+ if (ThemeButton.Parent <> 0) then
+ begin
+ //If Collection Exists then Change Interaction to Child Button
+ if (@ButtonCollection[ThemeButton.Parent-1] <> nil) then
+ begin
+ Interactions[High(Interactions)].Typ := iBCollectionChild;
+ Button[Result].Visible := False;
+
+ for BT := 0 to BTLen-1 do
+ Button[Result].Text[BT].Alpha := 0;
+
+ Button[Result].Parent := ThemeButton.Parent;
+ if (ButtonCollection[ThemeButton.Parent-1].Fade) then
+ Button[Result].Texture.Alpha := 0;
+ end;
+ end;
+end;
+
+function TMenu.AddButton(X, Y, W, H: real; Name: String): integer;
+begin
+ Result := AddButton(X, Y, W, H, Name, 'JPG', 'Plain', False);
+end;
+
+function TMenu.AddButton(X, Y, W, H: real; Name, Format, Typ: String; Reflection: Boolean): integer;
+begin
+ Result := AddButton(X, Y, W, H, 1, 1, 1, 1, 1, 1, 1, 0.5, Name, 'JPG', 'Plain', Reflection, 15, 15);
+end;
+
+function TMenu.AddButton(X, Y, W, H, ColR, ColG, ColB, Int, DColR, DColG, DColB, DInt: real; Name, Format, Typ: String; Reflection: Boolean; ReflectionSpacing, DeSelectReflectionSpacing: Real): integer;
+begin
+ // adds button
+ //SetLength is used once to reduce Memory usement
+ if (ButtonPos <> -1) then
+ begin
+ Result := ButtonPos;
+ Inc(ButtonPos)
+ end
+ else //Old Method -> Reserve new Memory for every Button
+ begin
+ Result := Length(Button);
+ SetLength(Button, Result + 1);
+ end;
+// Button[Result] := TButton.Create(Texture.GetTexture(Name, Typ));
+
+ // check here for cache
+// Texture.GetTexture(Name, Typ, false); // preloads textures and creates cahce mipmap when needed
+// if Covers.CoverExists(Name) then
+ Button[Result] := TButton.Create(Texture.GetTexture(Name, Typ, true)); // use cache texture
+// else
+// Button[Result] := TButton.Create(Texture.GetTexture(Name, Typ, false)); // don't use cache texture}
+
+ // configures button
+ Button[Result].X := X;
+ Button[Result].Y := Y;
+ Button[Result].W := W;
+ Button[Result].H := H;
+ Button[Result].SelectColR := ColR;
+ Button[Result].SelectColG := ColG;
+ Button[Result].SelectColB := ColB;
+ Button[Result].SelectInt := Int;
+ Button[Result].DeselectColR := DColR;
+ Button[Result].DeselectColG := DColG;
+ Button[Result].DeselectColB := DColB;
+ Button[Result].DeselectInt := DInt;
+ Button[Result].Texture.TexX1 := 0;
+ Button[Result].Texture.TexY1 := 0;
+ Button[Result].Texture.TexX2 := 1;
+ Button[Result].Texture.TexY2 := 1;
+ Button[Result].SetSelect(false);
+
+ Button[Result].Reflection := Reflection;
+ Button[Result].Reflectionspacing := ReflectionSpacing;
+ Button[Result].DeSelectReflectionspacing := DeSelectReflectionSpacing;
+
+ //Button Collection Mod
+ Button[Result].Parent := 0;
+
+
+ // adds interaction
+ AddInteraction(iButton, Result);
+ Interaction := 0;
+end;
+
+procedure TMenu.ClearButtons;
+begin
+ Setlength(Button, 0);
+end;
+
+// Method to draw our TMenu and all his child buttons
+function TMenu.DrawBG: boolean;
+var
+ PetX: integer;
+ PetY: integer;
+begin
+// glClearColor(1, 1, 1, 1);
+// glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
+
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity;
+ glOrtho(0, RenderW, RenderH, 0, -1, 100);
+ glMatrixMode(GL_MODELVIEW);
+
+ BackImg.ColR := 1;
+ BackImg.ColG := 1;
+ BackImg.ColB := 1;
+ BackImg.TexX1 := 0;
+ BackImg.TexY1 := 0;
+ BackImg.TexX2 := 1;
+ BackImg.TexY2 := 1;
+ if (BackImg.TexNum <> -1) then begin
+ // draw texture with overlapping
+ for PetY := 1 to BackH do
+ for PetX := 1 to BackW do begin
+ BackImg.X := (PetX-1)/BackW * 800; //640
+ BackImg.Y := (PetY-1)/BackH * 600; //480
+ DrawTexture(BackImg);
+ end; // for PetX
+ end; // if
+end;
+
+function TMenu.DrawFG: boolean;
+var
+ J: Integer;
+begin
+ // We don't forget about newly implemented static for nice skin ...
+ for J := 0 to Length(Static) - 1 do
+ Static[J].Draw;
+
+ // ... and slightly implemented menutext unit
+ for J := 0 to Length(Text) - 1 do
+ Text[J].Draw;
+
+ // Draw all ButtonCollections
+ For J := 0 to High(ButtonCollection) do
+ ButtonCollection[J].Draw;
+
+ // Second, we draw all of our buttons
+ for J := 0 to Length(Button) - 1 do
+ Button[J].Draw;
+
+ // Third, we draw all of our selects
+ for J := 0 to Length(Selects) - 1 do
+ Selects[J].Draw(1);
+
+ for J := 0 to Length(SelectsS) - 1 do
+ SelectsS[J].Draw;
+
+ // Third, we draw all our widgets
+// for J := 0 to Length(WidgetsSrc) - 1 do
+// SDL_BlitSurface(WidgetsSrc[J], nil, ParentBackBuf, WidgetsRect[J]);
+ Result := True;
+end;
+
+function TMenu.Draw: boolean;
+begin
+ DrawBG;
+ DrawFG;
+ Result := True;
+end;
+
+{function TMenu.GetNextScreen(): PMenu;
+begin
+ Result := NextScreen;
+end;}
+
+{function TMenu.AddWidget(X, Y : UInt16; WidgetSrc : PSDL_Surface): Int16;
+var
+ WidgetNum : Int16;
+
+begin
+ If (Assigned(WidgetSrc)) Then
+ begin
+ WidgetNum := Length(WidgetsSrc);
+
+ SetLength(WidgetsSrc, WidgetNum + 1);
+ SetLength(WidgetsRect, WidgetNum + 1);
+
+ WidgetsSrc[WidgetNum] := WidgetSrc;
+ WidgetsRect[WidgetNum] := new(PSDL_Rect);
+ WidgetsRect[WidgetNum]^.x := X;
+ WidgetsRect[WidgetNum]^.y := Y;
+ WidgetsRect[WidgetNum]^.w := WidgetSrc^.w;
+ WidgetsRect[WidgetNum]^.h := WidgetSrc^.h;
+
+ Result := WidgetNum;
+ end
+ else
+ Result := -1;
+end;}
+
+{procedure TMenu.ClearWidgets(MinNumber : Int16);
+var
+ J : Int16;
+begin
+ For J := MinNumber to (Length(WidgetsSrc) - 1) do
+ begin
+ SDL_FreeSurface(WidgetsSrc[J]);
+ dispose(WidgetsRect[J]);
+ end;
+
+ SetLength(WidgetsSrc, MinNumber);
+ SetLength(WidgetsRect, MinNumber);
+end;}
+
+function TMenu.IsSelectable(Int: Cardinal): Boolean;
+begin
+ Result := True;
+ Case Interactions[Int].Typ of
+ //Button
+ iButton: Result := Button[Interactions[Int].Num].Visible and Button[Interactions[Int].Num].Selectable;
+ //Select
+ iSelect: Result := True;
+ //Select Slide
+ iSelectS: Result := SelectsS[Interactions[Int].Num].Visible;
+
+ //ButtonCollection Child
+ iBCollectionChild:
+ Result := (ButtonCollection[Button[Interactions[Int].Num].Parent - 1].FirstChild - 1 = Int) AND ((Interactions[Interaction].Typ <> iBCollectionChild) OR (Button[Interactions[Interaction].Num].Parent <> Button[Interactions[Int].Num].Parent));
+ end;
+end;
+
+procedure TMenu.InteractNext;
+var
+ Int: Integer;
+begin
+ Int := Interaction;
+
+ // change interaction as long as it's needed
+ repeat
+ Int := (Int + 1) Mod Length(Interactions);
+
+ //If no Interaction is Selectable Simply Select Next
+ if (Int = Interaction) then
+ begin
+ Int := (Int + 1) Mod Length(Interactions);
+ Break;
+ end;
+ Until IsSelectable(Int);
+
+ //Set Interaction
+ Interaction := Int;
+end;
+
+
+procedure TMenu.InteractPrev;
+var
+ Int: Integer;
+begin
+ Int := Interaction;
+
+ // change interaction as long as it's needed
+ repeat
+ Int := Int - 1;
+ if Int = -1 then Int := High(Interactions);
+
+ //If no Interaction is Selectable Simply Select Next
+ if (Int = Interaction) then
+ begin
+ Int := SelInteraction - 1;
+ if Int = -1 then Int := High(Interactions);
+ Break;
+ end;
+ Until IsSelectable(Int);
+
+ //Set Interaction
+ Interaction := Int
+end;
+
+
+procedure TMenu.InteractCustom(CustomSwitch: integer);
+var
+ Num: integer;
+ Typ: integer;
+ Again: boolean;
+begin
+ //Code Commented atm, because it needs to be Rewritten
+ //it doesn't work with Button Collections
+ {then begin
+ CustomSwitch:= CustomSwitch*(-1);
+ Again := true;
+ // change interaction as long as it's needed
+ while (Again = true) do begin
+ Num := SelInteraction - CustomSwitch;
+ if Num = -1 then Num := High(Interactions);
+ Interaction := Num;
+ Again := false; // reset, default to accept changing interaction
+
+ // checking newly interacted element
+ Num := Interactions[Interaction].Num;
+ Typ := Interactions[Interaction].Typ;
+ case Typ of
+ iButton:
+ begin
+ if Button[Num].Selectable = false then Again := True;
+ end;
+ end; // case
+ end; // while
+ end
+ else if num>0 then begin
+ Again := true;
+ // change interaction as long as it's needed
+ while (Again = true) do begin
+ Num := (Interaction + CustomSwitch) Mod Length(Interactions);
+ Interaction := Num;
+ Again := false; // reset, default to accept changing interaction
+
+
+ // checking newly interacted element
+ Num := Interactions[Interaction].Num;
+ Typ := Interactions[Interaction].Typ;
+ case Typ of
+ iButton:
+ begin
+ if Button[Num].Selectable = false then Again := True;
+ end;
+ end; // case
+ end; // while
+ end }
+end;
+
+
+procedure TMenu.FadeTo(Screen: PMenu);
+begin
+ Display.Fade := 0;
+ Display.NextScreen := Screen;
+end;
+
+//popup hack
+procedure TMenu.CheckFadeTo(Screen: PMenu; msg: String);
+begin
+ Display.Fade := 0;
+ Display.NextScreenWithCheck := Screen;
+ Display.CheckOK:=False;
+ ScreenPopupCheck.ShowPopup(msg);
+end;
+
+procedure TMenu.AddButtonText(AddX, AddY: real; AddText: string);
+begin
+ AddButtonText(AddX, AddY, 1, 1, 1, AddText);
+end;
+
+procedure TMenu.AddButtonText(AddX, AddY: real; ColR, ColG, ColB: real; AddText: string);
+var
+ Il: integer;
+begin
+ with Button[High(Button)] do begin
+ Il := Length(Text);
+ SetLength(Text, Il+1);
+ Text[Il] := TText.Create(X + AddX, Y + AddY, AddText);
+ Text[Il].ColR := ColR;
+ Text[Il].ColG := ColG;
+ Text[Il].ColB := ColB;
+ Text[Il].Int := 1;//0.5;
+ end;
+end;
+
+procedure TMenu.AddButtonText(AddX, AddY: real; ColR, ColG, ColB: real; Font: integer; Size: integer; Align: integer; AddText: string);
+var
+ Il: integer;
+begin
+ with Button[High(Button)] do begin
+ Il := Length(Text);
+ SetLength(Text, Il+1);
+ Text[Il] := TText.Create(X + AddX, Y + AddY, AddText);
+ Text[Il].ColR := ColR;
+ Text[Il].ColG := ColG;
+ Text[Il].ColB := ColB;
+ Text[Il].Int := 1;//0.5;
+ Text[Il].Style := Font;
+ Text[Il].Size := Size;
+ Text[Il].Align := Align;
+ end;
+end;
+
+procedure TMenu.AddButtonText(CustomButton: TButton; AddX, AddY: real; ColR, ColG, ColB: real; Font: integer; Size: integer; Align: integer; AddText: string);
+var
+ Il: integer;
+begin
+ with CustomButton do begin
+ Il := Length(Text);
+ SetLength(Text, Il+1);
+ Text[Il] := TText.Create(X + AddX, Y + AddY, AddText);
+ Text[Il].ColR := ColR;
+ Text[Il].ColG := ColG;
+ Text[Il].ColB := ColB;
+ Text[Il].Int := 1;//0.5;
+ Text[Il].Style := Font;
+ Text[Il].Size := Size;
+ Text[Il].Align := Align;
+ end;
+end;
+
+function TMenu.AddSelect(ThemeSelect: TThemeSelect; var Data: integer; Values: array of string): integer;
+var
+ SO: integer;
+begin
+ Result := AddSelect(ThemeSelect.X, ThemeSelect.Y, ThemeSelect.W, ThemeSelect.H, ThemeSelect.SkipX,
+ ThemeSelect.ColR, ThemeSelect.ColG, ThemeSelect.ColB, ThemeSelect.Int,
+ ThemeSelect.DColR, ThemeSelect.DColG, ThemeSelect.DColB, ThemeSelect.DInt,
+ ThemeSelect.TColR, ThemeSelect.TColG, ThemeSelect.TColB, ThemeSelect.TInt,
+ ThemeSelect.TDColR, ThemeSelect.TDColG, ThemeSelect.TDColB, ThemeSelect.TDInt,
+ ThemeSelect.SBGColR, ThemeSelect.SBGColG, ThemeSelect.SBGColB, ThemeSelect.SBGInt,
+ ThemeSelect.SBGDColR, ThemeSelect.SBGDColG, ThemeSelect.SBGDColB, ThemeSelect.SBGDInt,
+ ThemeSelect.STColR, ThemeSelect.STColG, ThemeSelect.STColB, ThemeSelect.STInt,
+ ThemeSelect.STDColR, ThemeSelect.STDColG, ThemeSelect.STDColB, ThemeSelect.STDInt,
+ Skin.GetTextureFileName(ThemeSelect.Tex), 'Font Black',
+ Skin.GetTextureFileName(ThemeSelect.TexSBG), 'Font Black',
+ ThemeSelect.Text, Data);
+ for SO := 0 to High(Values) do
+ AddSelectOption(ThemeSelect.X + ThemeSelect.W + ThemeSelect.SkipX + SO * 100 + 20, ThemeSelect.Y + 20, Values[SO]);
+end;
+
+function TMenu.AddSelect(X, Y, W, H, SkipX, ColR, ColG, ColB, Int, DColR, DColG, DColB, DInt,
+ TColR, TColG, TColB, TInt, TDColR, TDColG, TDColB, TDInt,
+ SBGColR, SBGColG, SBGColB, SBGInt, SBGDColR, SBGDColG, SBGDColB, SBGDInt,
+ STColR, STColG, STColB, STInt, STDColR, STDColG, STDColB, STDInt: real;
+ Name, Typ: String; SBGName, SBGTyp: String;
+ Caption: string; var Data: integer): integer;
+var
+ S: integer;
+begin
+ S := Length(Selects);
+ SetLength(Selects, S + 1);
+ Selects[S] := TSelect.Create;
+
+ Selects[S].Texture := Texture.GetTexture(Name, Typ);
+ Selects[S].X := X;
+ Selects[S].Y := Y;
+ Selects[S].W := W;
+ Selects[S].H := H;
+ Selects[S].ColR := ColR;
+ Selects[S].ColG := ColG;
+ Selects[S].ColB := ColB;
+ Selects[S].Int := Int;
+ Selects[S].DColR := DColR;
+ Selects[S].DColG := DColG;
+ Selects[S].DColB := DColB;
+ Selects[S].DInt := DInt;
+
+ Selects[S].TextureSBG := Texture.GetTexture(SBGName, SBGTyp);
+ Selects[S].TextureSBG.X := X + W + SkipX;
+ Selects[S].TextureSBG.Y := Y;
+ Selects[S].TextureSBG.W := 450;
+ Selects[S].TextureSBG.H := H;
+ Selects[S].SBGColR := SBGColR;
+ Selects[S].SBGColG := SBGColG;
+ Selects[S].SBGColB := SBGColB;
+ Selects[S].SBGInt := SBGInt;
+ Selects[S].SBGDColR := SBGDColR;
+ Selects[S].SBGDColG := SBGDColG;
+ Selects[S].SBGDColB := SBGDColB;
+ Selects[S].SBGDInt := SBGDInt;
+
+ Selects[S].Text.X := X + 20;
+ Selects[S].Text.Y := Y + 20;
+ Selects[S].Text.Text := Caption;
+ Selects[S].Text.Size := 10;
+ Selects[S].Text.Visible := true;
+ Selects[S].TColR := TColR;
+ Selects[S].TColG := TColG;
+ Selects[S].TColB := TColB;
+ Selects[S].TInt := TInt;
+ Selects[S].TDColR := TDColR;
+ Selects[S].TDColG := TDColG;
+ Selects[S].TDColB := TDColB;
+ Selects[S].TDInt := TDInt;
+
+ Selects[S].STColR := STColR;
+ Selects[S].STColG := STColG;
+ Selects[S].STColB := STColB;
+ Selects[S].STInt := STInt;
+ Selects[S].STDColR := STDColR;
+ Selects[S].STDColG := STDColG;
+ Selects[S].STDColB := STDColB;
+ Selects[S].STDInt := STDInt;
+
+ // new
+ Selects[S].Texture.TexX1 := 0;
+ Selects[S].Texture.TexY1 := 0;
+ Selects[S].Texture.TexX2 := 1;
+ Selects[S].Texture.TexY2 := 1;
+ Selects[S].TextureSBG.TexX1 := 0;
+ Selects[S].TextureSBG.TexY1 := 0;
+ Selects[S].TextureSBG.TexX2 := 1;
+ Selects[S].TextureSBG.TexY2 := 1;
+
+ // Sets Data to copy the value of selectops to global value;
+ Selects[S].PData := @Data;
+
+ // Sets default value of selectopt from Data;
+ Selects[S].SelectedOption := Data;
+
+ // Disables default selection
+ Selects[S].SetSelect(false);
+
+ // adds interaction
+ AddInteraction(iSelect, S);
+end;
+
+procedure TMenu.AddSelectOption(AddX, AddY: real; AddText: string);
+begin
+ AddSelectOption (High(Selects), AddX, AddY, AddText);
+end;
+
+procedure TMenu.AddSelectOption(SelectNo: Cardinal; AddX, AddY: real; AddText: string);
+var
+ SO: integer;
+begin
+ SO := Length(Selects[SelectNo].TextOpt);
+ SetLength(Selects[SelectNo].TextOpt, SO + 1);
+
+ Selects[SelectNo].TextOpt[SO] := TText.Create;
+
+ Selects[SelectNo].TextOpt[SO].X := AddX;
+ Selects[SelectNo].TextOpt[SO].Y := AddY;
+ Selects[SelectNo].TextOpt[SO].Text := AddText;
+ Selects[SelectNo].TextOpt[SO].Size := 10;
+ Selects[SelectNo].TextOpt[SO].ColR := Selects[SelectNo].STDColR;
+ Selects[SelectNo].TextOpt[SO].ColG := Selects[SelectNo].STDColG;
+ Selects[SelectNo].TextOpt[SO].ColB := Selects[SelectNo].STDColB;
+ Selects[SelectNo].TextOpt[SO].Int := Selects[SelectNo].STDInt;
+ Selects[SelectNo].TextOpt[SO].Visible := true;
+
+ if SO = Selects[SelectNo].PData^ then Selects[SelectNo].SelectedOption := SO;
+end;
+
+procedure TMenu.UpdateSelectOptions(ThemeSelect: TThemeSelect; SelectNum: integer; Values: array of string; var Data: integer);
+var
+ SO: integer;
+begin
+ SetLength(Selects[SelectNum].TextOpt, 0);
+ for SO := 0 to High(Values) do
+ AddSelectOption(SelectNum, ThemeSelect.X + ThemeSelect.W + ThemeSelect.SkipX + SO * 100 + 20, ThemeSelect.Y + 20, Values[SO]);
+end;
+
+function TMenu.AddSelectSlide(ThemeSelectS: TThemeSelectSlide; var Data: integer; Values: array of string): integer;
+var
+ SO: integer;
+begin
+ Result := AddSelectSlide(ThemeSelectS.X, ThemeSelectS.Y, ThemeSelectS.W, ThemeSelectS.H, ThemeSelectS.SkipX, ThemeSelectS.SBGW,
+ ThemeSelectS.ColR, ThemeSelectS.ColG, ThemeSelectS.ColB, ThemeSelectS.Int,
+ ThemeSelectS.DColR, ThemeSelectS.DColG, ThemeSelectS.DColB, ThemeSelectS.DInt,
+ ThemeSelectS.TColR, ThemeSelectS.TColG, ThemeSelectS.TColB, ThemeSelectS.TInt,
+ ThemeSelectS.TDColR, ThemeSelectS.TDColG, ThemeSelectS.TDColB, ThemeSelectS.TDInt,
+ ThemeSelectS.SBGColR, ThemeSelectS.SBGColG, ThemeSelectS.SBGColB, ThemeSelectS.SBGInt,
+ ThemeSelectS.SBGDColR, ThemeSelectS.SBGDColG, ThemeSelectS.SBGDColB, ThemeSelectS.SBGDInt,
+ ThemeSelectS.STColR, ThemeSelectS.STColG, ThemeSelectS.STColB, ThemeSelectS.STInt,
+ ThemeSelectS.STDColR, ThemeSelectS.STDColG, ThemeSelectS.STDColB, ThemeSelectS.STDInt,
+ Skin.GetTextureFileName(ThemeSelectS.Tex), 'Font Black',
+ Skin.GetTextureFileName(ThemeSelectS.TexSBG), 'Font Black',
+ ThemeSelectS.Text, Data);
+ for SO := 0 to High(Values) do
+ AddSelectSlideOption(Values[SO]);
+
+ SelectsS[High(SelectsS)].Text.Size := ThemeSelectS.TextSize;
+
+ SelectsS[High(SelectsS)].Texture.Z := ThemeSelectS.Z;
+ SelectsS[High(SelectsS)].TextureSBG.Z := ThemeSelectS.Z;
+
+ //Generate Lines
+ SelectsS[High(SelectsS)].GenLines;
+
+ SelectsS[High(SelectsS)].SelectedOption := SelectsS[High(SelectsS)].SelectOptInt; // refresh
+end;
+
+function TMenu.AddSelectSlide(X, Y, W, H, SkipX, SBGW, ColR, ColG, ColB, Int, DColR, DColG, DColB, DInt,
+ TColR, TColG, TColB, TInt, TDColR, TDColG, TDColB, TDInt,
+ SBGColR, SBGColG, SBGColB, SBGInt, SBGDColR, SBGDColG, SBGDColB, SBGDInt,
+ STColR, STColG, STColB, STInt, STDColR, STDColG, STDColB, STDInt: real;
+ Name, Typ: String; SBGName, SBGTyp: String;
+ Caption: string; var Data: integer): integer;
+var
+ S: integer;
+ I: integer;
+begin
+ S := Length(SelectsS);
+ SetLength(SelectsS, S + 1);
+ SelectsS[S] := TSelectSlide.Create;
+
+ SelectsS[S].Texture := Texture.GetTexture(Name, Typ);
+ SelectsS[S].X := X;
+ SelectsS[S].Y := Y;
+ SelectsS[S].W := W;
+ SelectsS[S].H := H;
+
+ SelectsS[S].ColR := ColR;
+ SelectsS[S].ColG := ColG;
+ SelectsS[S].ColB := ColB;
+ SelectsS[S].Int := Int;
+ SelectsS[S].DColR := DColR;
+ SelectsS[S].DColG := DColG;
+ SelectsS[S].DColB := DColB;
+ SelectsS[S].DInt := DInt;
+
+ SelectsS[S].TextureSBG := Texture.GetTexture(SBGName, SBGTyp);
+ SelectsS[S].TextureSBG.X := X + W + SkipX;
+ SelectsS[S].TextureSBG.Y := Y;
+ //SelectsS[S].TextureSBG.W := 450;
+ SelectsS[S].SBGW := SBGW;
+ SelectsS[S].TextureSBG.H := H;
+ SelectsS[S].SBGColR := SBGColR;
+ SelectsS[S].SBGColG := SBGColG;
+ SelectsS[S].SBGColB := SBGColB;
+ SelectsS[S].SBGInt := SBGInt;
+ SelectsS[S].SBGDColR := SBGDColR;
+ SelectsS[S].SBGDColG := SBGDColG;
+ SelectsS[S].SBGDColB := SBGDColB;
+ SelectsS[S].SBGDInt := SBGDInt;
+
+ SelectsS[S].Text.X := X + 20;
+ SelectsS[S].Text.Y := Y + (SelectsS[S].TextureSBG.H / 2) - 15;
+ SelectsS[S].Text.Text := Caption;
+ SelectsS[S].Text.Size := 10;
+ SelectsS[S].Text.Visible := true;
+ SelectsS[S].TColR := TColR;
+ SelectsS[S].TColG := TColG;
+ SelectsS[S].TColB := TColB;
+ SelectsS[S].TInt := TInt;
+ SelectsS[S].TDColR := TDColR;
+ SelectsS[S].TDColG := TDColG;
+ SelectsS[S].TDColB := TDColB;
+ SelectsS[S].TDInt := TDInt;
+
+ SelectsS[S].STColR := STColR;
+ SelectsS[S].STColG := STColG;
+ SelectsS[S].STColB := STColB;
+ SelectsS[S].STInt := STInt;
+ SelectsS[S].STDColR := STDColR;
+ SelectsS[S].STDColG := STDColG;
+ SelectsS[S].STDColB := STDColB;
+ SelectsS[S].STDInt := STDInt;
+
+ // new
+ SelectsS[S].Texture.TexX1 := 0;
+ SelectsS[S].Texture.TexY1 := 0;
+ SelectsS[S].Texture.TexX2 := 1;
+ SelectsS[S].Texture.TexY2 := 1;
+ SelectsS[S].TextureSBG.TexX1 := 0;
+ SelectsS[S].TextureSBG.TexY1 := 0;
+ SelectsS[S].TextureSBG.TexX2 := 1;
+ SelectsS[S].TextureSBG.TexY2 := 1;
+
+ // Sets Data to copy the value of selectops to global value;
+ SelectsS[S].PData := @Data;
+ // Configures Select options
+ {//SelectsS[S].TextOpt[0].Text := IntToStr(I+1);
+ SelectsS[S].TextOpt[0].Size := 10;
+ SelectsS[S].TextOpt[0].Align := 1;
+
+ SelectsS[S].TextOpt[0].ColR := SelectsS[S].STDColR;
+ SelectsS[S].TextOpt[0].ColG := SelectsS[S].STDColG;
+ SelectsS[S].TextOpt[0].ColB := SelectsS[S].STDColB;
+ SelectsS[S].TextOpt[0].Int := SelectsS[S].STDInt;
+ SelectsS[S].TextOpt[0].Visible := true; }
+
+ // Sets default value of selectopt from Data;
+ SelectsS[S].SelectedOption := Data;
+
+ // Disables default selection
+ SelectsS[S].SetSelect(false);
+
+ {// Configures 3 select options
+ for I := 0 to 2 do begin
+ SelectsS[S].TextOpt[I].X := SelectsS[S].TextureSBG.X + 20 + (50 + 20) + (150 - 20) * I;
+ SelectsS[S].TextOpt[I].Y := SelectsS[S].TextureSBG.Y + 20;
+ SelectsS[S].TextOpt[I].Text := IntToStr(I+1);
+ SelectsS[S].TextOpt[I].Size := 10;
+ SelectsS[S].TextOpt[I].Align := 1;
+
+
+ SelectsS[S].TextOpt[I].ColR := SelectsS[S].STDColR;
+ SelectsS[S].TextOpt[I].ColG := SelectsS[S].STDColG;
+ SelectsS[S].TextOpt[I].ColB := SelectsS[S].STDColB;
+ SelectsS[S].TextOpt[I].Int := SelectsS[S].STDInt;
+ SelectsS[S].TextOpt[I].Visible := true;
+ end;}
+
+
+ // adds interaction
+ AddInteraction(iSelectS, S);
+ Result := S;
+end;
+
+procedure TMenu.AddSelectSlideOption(AddText: string);
+begin
+ AddSelectSlideOption(High(SelectsS), AddText);
+end;
+
+procedure TMenu.AddSelectSlideOption(SelectNo: Cardinal; AddText: string);
+var
+ SO: integer;
+begin
+ SO := Length(SelectsS[SelectNo].TextOptT);
+
+ SetLength(SelectsS[SelectNo].TextOptT, SO + 1);
+ SelectsS[SelectNo].TextOptT[SO] := AddText;
+
+ //SelectsS[S].SelectedOption := SelectsS[S].SelectOptInt; // refresh
+
+ //if SO = Selects[S].PData^ then Selects[S].SelectedOption := SO;
+end;
+
+procedure TMenu.UpdateSelectSlideOptions(ThemeSelectSlide: TThemeSelectSlide; SelectNum: integer; Values: array of string; var Data: integer);
+var
+ SO: integer;
+begin
+ SetLength(SelectsS[SelectNum].TextOptT, 0);
+ for SO := 0 to High(Values) do
+ AddSelectSlideOption(SelectNum, Values[SO]);
+
+ SelectsS[SelectNum].GenLines;
+
+// SelectsS[SelectNum].SelectedOption := SelectsS[SelectNum].SelectOptInt; // refresh
+// SelectS[SelectNum].SetSelectOpt(Data);
+// SelectS[SelectNum].SelectedOption := 0;//Data;
+
+// Log.LogError(IntToStr(High(SelectsS[SelectNum].TextOptT)));
+// if 0 <= High(SelectsS[SelectNum].TextOptT) then
+
+ SelectsS[SelectNum].PData := @Data;
+ SelectsS[SelectNum].SelectedOption := Data;
+end;
+
+function TMenu.InRegion(X1, Y1, X2, Y2, X, Y: real): Boolean;
+begin
+ Result := false;
+ X1 := X1 * RenderW/640;
+ X2 := X2 * RenderW/640;
+ Y1 := Y1 * RenderH/480;
+ Y2 := Y2 * RenderH/480;
+ if (X >= X1) and (X <= X2) and (Y >= Y1) and (Y <= Y2) then
+ Result := true;
+end;
+
+function TMenu.InStaticRegion(StaticNr: integer; X, Y: integer): Boolean;
+begin
+ Result := InRegion(Static[StaticNr].Texture.X,
+ Static[StaticNr].Texture.Y,
+ Static[StaticNr].Texture.X + Static[StaticNr].Texture.W - 1,
+ Static[StaticNr].Texture.Y + Static[StaticNr].Texture.H - 1,
+ X, Y);
+end;
+
+procedure TMenu.InteractInc;
+var
+ Num: integer;
+ Value: integer;
+begin
+ case Interactions[Interaction].Typ of
+ iSelect: begin
+ Num := Interactions[Interaction].Num;
+ Value := Selects[Num].SelectedOption;
+ Value := (Value + 1) Mod (Length(Selects[Num].TextOpt));
+ Selects[Num].SelectedOption := Value;
+ end;
+ iSelectS: begin
+ Num := Interactions[Interaction].Num;
+ Value := SelectsS[Num].SelectedOption;
+// Value := (Value + 1) Mod (Length(SelectsS[Num].TextOptT));
+
+ // limit
+ Value := Value + 1;
+ if Value <= High(SelectsS[Num].TextOptT) then
+ SelectsS[Num].SelectedOption := Value;
+ end;
+ //Button Collection Mod
+ iBCollectionChild:
+ begin
+
+ //Select Next Button in Collection
+ For Num := 1 to High(Button) do
+ begin
+ Value := (Interaction + Num) Mod Length(Button);
+ if Value = 0 then
+ begin
+ InteractNext;
+ Break;
+ end;
+ if (Button[Value].Parent = Button[Interaction].Parent) then
+ begin
+ Interaction := Value;
+ Break;
+ end;
+ end;
+ end;
+ //interact Next if there is Nothing to Change
+ else InteractNext;
+ end;
+end;
+
+procedure TMenu.InteractDec;
+var
+ Num: integer;
+ Value: integer;
+begin
+ case Interactions[Interaction].Typ of
+ iSelect: begin
+ Num := Interactions[Interaction].Num;
+ Value := Selects[Num].SelectedOption;
+ Value := Value - 1;
+ if Value = -1 then
+ Value := High(Selects[Num].TextOpt);
+ Selects[Num].SelectedOption := Value;
+ end;
+ iSelectS: begin
+ Num := Interactions[Interaction].Num;
+ Value := SelectsS[Num].SelectedOption;
+ Value := Value - 1;
+// if Value = -1 then
+// Value := High(SelectsS[Num].TextOptT);
+
+ if Value >= 0 then
+ SelectsS[Num].SelectedOption := Value;
+ end;
+ //Button Collection Mod
+ iBCollectionChild:
+ begin
+ //Select Prev Button in Collection
+ For Num := High(Button) downto 1 do
+ begin
+ Value := (Interaction + Num) Mod Length(Button);
+ if Value = High(Button) then
+ begin
+ InteractPrev;
+ Break;
+ end;
+ if (Button[Value].Parent = Button[Interaction].Parent) then
+ begin
+ Interaction := Value;
+ Break;
+ end;
+ end;
+ end;
+ //interact Prev if there is Nothing to Change
+ else
+ begin
+ InteractPrev;
+ //If ButtonCollection with more than 1 Entry then Select Last Entry
+ if (Button[Interactions[Interaction].Num].Parent <> 0) AND (ButtonCollection[Button[Interactions[Interaction].Num].Parent-1].CountChilds > 1) then
+ begin
+ //Select Last Child
+ For Num := High(Button) downto 1 do
+ begin
+ Value := (Interaction + Num) Mod Length(Button);
+ if (Button[Value].Parent = Button[Interaction].Parent) then
+ begin
+ Interaction := Value;
+ Break;
+ end;
+ end;
+ end;
+ end;
+ end;
+end;
+
+procedure TMenu.AddBox(X, Y, W, H: real);
+begin
+ AddStatic(X, Y, W, H, 0, 0, 0, Skin.GetTextureFileName('Bar'), 'JPG', 'Font Black');
+ AddStatic(X+2, Y+2, W-4, H-4, 1, 1, 1, Skin.GetTextureFileName('Bar'), 'JPG', 'Font Black');
+end;
+
+procedure TMenu.onShow;
+begin
+// nothing
+// beep;
+end;
+
+procedure TMenu.onShowFinish;
+begin
+// nothing
+// beep;
+end;
+
+procedure TMenu.onHide;
+begin
+// nothing
+// beep;
+end;
+
+function TMenu.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+// nothing
+// Beep;
+ Result := true;
+end;
+
+procedure TMenu.SetAnimationProgress(Progress: real);
+begin
+// nothing
+//beep;
+end;
+
+end.
+
diff --git a/Game/Code/Menu/UMenuButton.pas b/Game/Code/Menu/UMenuButton.pas
new file mode 100644
index 00000000..03085478
--- /dev/null
+++ b/Game/Code/Menu/UMenuButton.pas
@@ -0,0 +1,488 @@
+unit UMenuButton;
+
+interface
+uses TextGL, UTexture, gl, UMenuText;
+
+type
+ CButton = class of TButton;
+ TButton = class
+ protected
+ SelectBool: Boolean;
+
+ FadeProgress: Real;
+ FadeLastTick: Cardinal;
+
+ DeSelectW: Real;
+ DeSelectH: Real;
+ PosX: Real;
+ PosY: Real;
+
+ constructor Create(); overload;
+
+ public
+ Text: Array of TText;
+ Texture: TTexture; // Button Screen position and size
+ Texture2: TTexture; // second texture only used for fading full resolution covers
+
+ FadeTex: TTexture; //Texture for beautiful fading
+ FadeTexPos: byte; //Pos of the FadeTexture (0: Top, 1: Left, 2: Bottom, 3: Right)
+// Texture2Blend: real; // blending factor for second texture (0=invisible, 1=visible)
+ // now uses alpha
+
+ DeselectType: integer; // not used yet
+ Visible: boolean;
+ //Reflection Mod
+ Reflection: boolean;
+ Reflectionspacing: Real;
+ DeSelectReflectionspacing: Real;
+
+ //Fade Mod
+ Fade: Boolean;
+ FadeText: Boolean;
+
+ Selectable: boolean;
+
+ //No of the Parent Collection, 0 if in no Collection
+ Parent: Byte;
+
+ SelectColR: real;
+ SelectColG: real;
+ SelectColB: real;
+ SelectInt: real;
+ SelectTInt: real;
+ //Fade Mod
+ SelectW: real;
+ SelectH: real;
+
+ DeselectColR: real;
+ DeselectColG: real;
+ DeselectColB: real;
+ DeselectInt: real;
+ DeselectTInt: real;
+
+ procedure SetY(Value: real);
+ procedure SetX(Value: real);
+ procedure SetW(Value: real);
+ procedure SetH(Value: real);
+
+ procedure SetSelect(Value: Boolean); virtual;
+ property X: real read PosX write SetX;
+ property Y: real read PosY write SetY;
+ property Z: real read Texture.z write Texture.z;
+ property W: real read DeSelectW write SetW;
+ property H: real read DeSelectH write SetH;
+ property Selected: Boolean read SelectBool write SetSelect;
+
+ procedure Draw; virtual;
+
+ constructor Create(Textura: TTexture); overload;
+ destructor Destroy; override;
+ end;
+
+implementation
+uses UDrawTexture, SysUtils, windows;
+
+procedure TButton.SetX(Value: real);
+var
+ dx: real;
+ T: integer; // text
+begin
+ {dY := Value - Texture.y;
+
+ Texture.X := Value;
+
+ for T := 0 to High(Text) do
+ Text[T].X := Text[T].X + dY;}
+
+ PosX := Value;
+ if (FadeTex.TexNum = -1) then
+ Texture.X := Value;
+
+end;
+
+procedure TButton.SetY(Value: real);
+var
+ dY: real;
+ T: integer; // text
+begin
+ {dY := Value - PosY;
+
+
+ for T := 0 to High(Text) do
+ Text[T].Y := Text[T].Y + dY;}
+
+ PosY := Value;
+ if (FadeTex.TexNum = -1) then
+ Texture.y := Value;
+end;
+
+procedure TButton.SetW(Value: real);
+begin
+ if SelectW = DeSelectW then
+ SelectW := Value;
+
+ DeSelectW := Value;
+
+ if Not Fade then
+ begin
+ if SelectBool then
+ Texture.W := SelectW
+ else
+ Texture.W := DeSelectW;
+ end;
+end;
+
+procedure TButton.SetH(Value: real);
+begin
+ if SelectH = DeSelectH then
+ SelectH := Value;
+
+ DeSelectH := Value;
+
+ if Not Fade then
+ begin
+ if SelectBool then
+ Texture.H := SelectH
+ else
+ Texture.H := DeSelectH;
+ end;
+end;
+
+procedure TButton.SetSelect(Value : Boolean);
+var
+ T: integer;
+begin
+ SelectBool := Value;
+ if (Value) then begin
+ Texture.ColR := SelectColR;
+ Texture.ColG := SelectColG;
+ Texture.ColB := SelectColB;
+ Texture.Int := SelectInt;
+
+ Texture2.ColR := SelectColR;
+ Texture2.ColG := SelectColG;
+ Texture2.ColB := SelectColB;
+ Texture2.Int := SelectInt;
+
+ for T := 0 to High(Text) do
+ Text[T].Int := SelectTInt;
+
+ //Fade Mod
+ if Fade then
+ begin
+ if (FadeProgress <= 0) then
+ FadeProgress := 0.125;
+ end
+ else
+ begin
+ Texture.W := SelectW;
+ Texture.H := SelectH;
+ end;
+ end else begin
+ Texture.ColR := DeselectColR;
+ Texture.ColG := DeselectColG;
+ Texture.ColB := DeselectColB;
+ Texture.Int := DeselectInt;
+
+ Texture2.ColR := DeselectColR;
+ Texture2.ColG := DeselectColG;
+ Texture2.ColB := DeselectColB;
+ Texture2.Int := DeselectInt;
+
+ for T := 0 to High(Text) do
+ Text[T].Int := DeselectTInt;
+
+ //Fade Mod
+ if Fade then
+ begin
+ if (FadeProgress >= 1) then
+ FadeProgress := 0.875;
+ end
+ else
+ begin
+ Texture.W := DeSelectW;
+ Texture.H := DeSelectH;
+ end;
+ end;
+end;
+
+constructor TButton.Create();
+begin
+ inherited Create;
+ // We initialize all to 0, nil or false
+ Visible := true;
+ SelectBool := false;
+ DeselectType := 0;
+ Selectable := true;
+ //Reflection Mod
+ Reflection := true;
+
+ // Default
+// SelectInt := 1;
+// DeselectInt := 0.5;
+
+{ SelectColR := 0.5;
+ SelectColG := 0.75;
+ SelectColB := 0;
+ SelectInt := 1;
+ SelectTInt := 1;
+
+ DeselectColR := 1;
+ DeselectColG := 1;
+ DeselectColB := 1;
+ DeselectInt := 0.5;
+ DeselectTInt := 1;}
+
+ SelectColR := 1;
+ SelectColG := 1;
+ SelectColB := 1;
+ SelectInt := 1;
+ SelectTInt := 1;
+
+ DeselectColR := 1;
+ DeselectColG := 1;
+ DeselectColB := 1;
+ DeselectInt := 0.5;
+ DeselectTInt := 1;
+
+ FadeTex.TexNum := -1;
+
+ FadeProgress := 0;
+ Fade := False;
+ FadeText := False;
+ SelectW := DeSelectW;
+ SelectH := DeSelectH;
+
+ PosX := 0;
+ PosY := 0;
+
+ Parent := 0;
+end;
+
+// ***** Public methods ****** //
+
+procedure TButton.Draw;
+var
+ T: integer;
+ Tick: Cardinal;
+ Spacing: Real;
+begin
+ if Visible then begin
+ //Fade Mod
+ if Fade then
+ begin
+ if (FadeProgress < 1) and (FadeProgress > 0) then
+ begin
+ Tick := GetTickCount div 16;
+ if (Tick <> FadeLastTick) then
+ begin
+ FadeLastTick := Tick;
+ if SelectBool then
+ FadeProgress := FadeProgress + 0.125
+ else
+ FadeProgress := FadeProgress - 0.125;
+
+ if (FadeText) then
+ begin
+ For T := 0 to high(Text) do
+ begin
+ Text[T].MoveX := (SelectW - DeSelectW) * FadeProgress;
+ Text[T].MoveY := (SelectH - DeSelectH) * FadeProgress;
+ end;
+ end;
+ end;
+ end;
+ //Method without Fade Texture
+ if (FadeTex.TexNum = -1) then
+ begin
+ Texture.W := DeSelectW + (SelectW - DeSelectW) * FadeProgress;
+ Texture.H := DeSelectH + (SelectH - DeSelectH) * FadeProgress;
+ end
+ else //method with Fade Texture
+ begin
+ Texture.W := DeSelectW;
+ Texture.H := DeSelectH;
+
+ FadeTex.ColR := Texture.ColR;
+ FadeTex.ColG := Texture.ColG;
+ FadeTex.ColB := Texture.ColB;
+ FadeTex.Int := Texture.Int;
+
+ FadeTex.Z := Texture.Z;
+
+ FadeTex.Alpha := Texture.Alpha;
+ FadeTex.TexX1 := 0;
+ FadeTex.TexX2 := 1;
+ FadeTex.TexY1 := 0;
+ FadeTex.TexY2 := 1;
+
+ Case FadeTexPos of
+ 0: //FadeTex on Top
+ begin
+ //Standard Texture
+ Texture.X := PosX;
+ Texture.Y := PosY + (SelectH - DeSelectH) * FadeProgress;
+ //Fade Tex
+ FadeTex.X := PosX;
+ FadeTex.Y := PosY;
+ FadeTex.W := Texture.W;
+ FadeTex.H := (SelectH - DeSelectH) * FadeProgress;
+ FadeTex.ScaleW := Texture.ScaleW;
+ //Some Hack that Fixes a little Space between both Textures
+ FadeTex.TexY2 := 0.9;
+ end;
+ 1: //FadeTex on Left
+ begin
+ //Standard Texture
+ Texture.X := PosX + (SelectW - DeSelectW) * FadeProgress;
+ Texture.Y := PosY;
+ //Fade Tex
+ FadeTex.X := PosX;
+ FadeTex.Y := PosY;
+ FadeTex.H := Texture.H;
+ FadeTex.W := (SelectW - DeSelectW) * FadeProgress;
+ FadeTex.ScaleH := Texture.ScaleH;
+ //Some Hack that Fixes a little Space between both Textures
+ FadeTex.TexX2 := 0.9;
+ end;
+ 2: //FadeTex on Bottom
+ begin
+ //Standard Texture
+ Texture.X := PosX;
+ Texture.Y := PosY;
+ //Fade Tex
+ FadeTex.X := PosX;
+ FadeTex.Y := PosY + (SelectH - DeSelectH) * FadeProgress;;
+ FadeTex.W := Texture.W;
+ FadeTex.H := (SelectH - DeSelectH) * FadeProgress;
+ FadeTex.ScaleW := Texture.ScaleW;
+ //Some Hack that Fixes a little Space between both Textures
+ FadeTex.TexY1 := 0.1;
+ end;
+ 3: //FadeTex on Right
+ begin
+ //Standard Texture
+ Texture.X := PosX;
+ Texture.Y := PosY;
+ //Fade Tex
+ FadeTex.X := PosX + (SelectW - DeSelectW) * FadeProgress;
+ FadeTex.Y := PosY;
+ FadeTex.H := Texture.H;
+ FadeTex.W := (SelectW - DeSelectW) * FadeProgress;
+ FadeTex.ScaleH := Texture.ScaleH;
+ //Some Hack that Fixes a little Space between both Textures
+ FadeTex.TexX1 := 0.1;
+ end;
+ end;
+ end;
+ end
+ else if (FadeText) then
+ begin
+ Text[T].MoveX := (SelectW - DeSelectW);
+ Text[T].MoveY := (SelectH - DeSelectH);
+ end;
+
+ DrawTexture(Texture);
+
+ //Draw FadeTex
+ if (FadeTex.TexNum <> -1) then
+ DrawTexture(FadeTex);
+
+ if Texture2.Alpha > 0 then begin
+ Texture2.ScaleW := Texture.ScaleW;
+ Texture2.ScaleH := Texture.ScaleH;
+
+ Texture2.X := Texture.X;
+ Texture2.Y := Texture.Y;
+ Texture2.W := Texture.W;
+ Texture2.H := Texture.H;
+
+ Texture2.ColR := Texture.ColR;
+ Texture2.ColG := Texture.ColG;
+ Texture2.ColB := Texture.ColB;
+ Texture2.Int := Texture.Int;
+
+ Texture2.Z := Texture.Z;
+
+ DrawTexture(Texture2);
+ end;
+
+ //Reflection Mod
+ if (Reflection) then // Draw Reflections
+ begin
+ if (FadeProgress <> 0) AND (FadeProgress <> 1) then
+ begin
+ Spacing := DeSelectReflectionspacing - (DeSelectReflectionspacing - Reflectionspacing) * FadeProgress;
+ end
+ else if SelectBool then
+ Spacing := Reflectionspacing
+ else
+ Spacing := DeSelectReflectionspacing;
+
+ with Texture do
+ begin
+ //Bind Tex and GL Attributes
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+
+ glDepthRange(0, 10);
+ glDepthFunc(GL_LEQUAL);
+ glEnable(GL_DEPTH_TEST);
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glBindTexture(GL_TEXTURE_2D, TexNum);
+
+ //Draw
+ glBegin(GL_QUADS);//Top Left
+ glColor4f(ColR * Int, ColG * Int, ColB * Int, Alpha-0.3);
+ glTexCoord2f(TexX1*TexW, TexY2*TexH);
+ glVertex3f(x, y+h*scaleH+ Spacing, z);
+
+ //Bottom Left
+ glColor4f(ColR * Int, ColG * Int, ColB * Int, 0);
+ glTexCoord2f(TexX1*TexW, TexY1+TexH*0.5);
+ glVertex3f(x, y+h*scaleH + h*scaleH/2 + Spacing, z);
+
+
+ //Bottom Right
+ glColor4f(ColR * Int, ColG * Int, ColB * Int, 0);
+ glTexCoord2f(TexX2*TexW, TexY1+TexH*0.5);
+ glVertex3f(x+w*scaleW, y+h*scaleH + h*scaleH/2 + Spacing, z);
+
+ //Top Right
+ glColor4f(ColR * Int, ColG * Int, ColB * Int, Alpha-0.3);
+ glTexCoord2f(TexX2*TexW, TexY2*TexH);
+ glVertex3f(x+w*scaleW, y+h*scaleH + Spacing, z);
+ glEnd;
+
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_BLEND);
+ end;
+ end;
+
+ for T := 0 to High(Text) do begin
+ Text[T].Draw;
+ end;
+ end;
+end;
+
+// ***** ****** //
+
+destructor TButton.Destroy;
+begin
+ inherited;
+end;
+
+constructor TButton.Create(Textura: TTexture);
+begin
+ Create();
+ Texture := Textura;
+ Texture.ColR := 0;
+ Texture.ColG := 0.5;
+ Texture.ColB := 0;
+ Texture.Int := 1;
+end;
+
+
+end.
diff --git a/Game/Code/Menu/UMenuButtonCollection.pas b/Game/Code/Menu/UMenuButtonCollection.pas
new file mode 100644
index 00000000..5c9045a7
--- /dev/null
+++ b/Game/Code/Menu/UMenuButtonCollection.pas
@@ -0,0 +1,68 @@
+unit UMenuButtonCollection;
+
+interface
+uses UMenuButton;
+
+type
+ //----------------
+ //TButtonCollection
+ //No Extra Attributes or Functions ATM
+ //----------------
+ AButton = Array of TButton;
+ PAButton = ^AButton;
+ TButtonCollection = class(TButton)
+ //num of the First Button, that can be Selected
+ FirstChild: Byte;
+ CountChilds: Byte;
+
+ ScreenButton: PAButton;
+
+ procedure SetSelect(Value : Boolean); override;
+ procedure Draw; override;
+ end;
+
+implementation
+
+procedure TButtonCollection.SetSelect(Value : Boolean);
+var I: Integer;
+begin
+ inherited;
+
+ //Set Visible for Every Button that is a Child of this ButtonCollection
+ if (Not Fade) then
+ For I := 0 to High(ScreenButton^) do
+ if (ScreenButton^[I].Parent = Parent) then
+ ScreenButton^[I].Visible := Value;
+end;
+
+procedure TButtonCollection.Draw;
+var I, J: Integer;
+begin
+ inherited;
+ //If fading is activated, Fade Child Buttons
+ if (Fade) then
+ begin
+ For I := 0 to High(ScreenButton^) do
+ if (ScreenButton^[I].Parent = Parent) then
+ begin
+ if (FadeProgress < 0.5) then
+ begin
+ ScreenButton^[I].Visible := SelectBool;
+
+ For J := 0 to High(ScreenButton^[I].Text) do
+ ScreenButton^[I].Text[J].Visible := SelectBool;
+ end
+ else
+ begin
+ ScreenButton^[I].Texture.Alpha := (FadeProgress-0.666)*3;
+
+ For J := 0 to High(ScreenButton^[I].Text) do
+ ScreenButton^[I].Text[J].Alpha := (FadeProgress-0.666)*3;
+ end;
+ end;
+ end;
+end;
+
+
+
+end.
diff --git a/Game/Code/Menu/UMenuInteract.pas b/Game/Code/Menu/UMenuInteract.pas
new file mode 100644
index 00000000..43249e3e
--- /dev/null
+++ b/Game/Code/Menu/UMenuInteract.pas
@@ -0,0 +1,14 @@
+unit UMenuInteract;
+
+interface
+
+type
+ TInteract = record // for moving thru menu
+ Typ: integer; // 0 - button, 1 - select, 2 - Text, 3 - Select SLide, 5 - ButtonCollection Child
+ Num: integer; // number of this item in proper list like buttons, selects
+ end;
+
+implementation
+
+end.
+ \ No newline at end of file
diff --git a/Game/Code/Menu/UMenuSelect.pas b/Game/Code/Menu/UMenuSelect.pas
new file mode 100644
index 00000000..2362ff4f
--- /dev/null
+++ b/Game/Code/Menu/UMenuSelect.pas
@@ -0,0 +1,198 @@
+unit UMenuSelect;
+
+interface
+uses TextGL, UTexture, gl, UMenuText;
+
+type
+ PSelect = ^TSelect;
+ TSelect = class
+ private
+ SelectBool: boolean;
+ public
+ // objects
+ Text: TText; // Main Text
+ TextOpt: array of TText; // Options Text
+ Texture: TTexture; // Select Texture
+ TextureSBG: TTexture; // Background Selections Texture
+ TextureS: array of TTexture; // Selections Texture
+ SelectOptInt: integer;
+ PData: ^integer;
+
+ // for selection and deselection
+ // main static
+ ColR: real;
+ ColG: real;
+ ColB: real;
+ Int: real;
+ DColR: real;
+ DColG: real;
+ DColB: real;
+ DInt: real;
+
+ // main text
+ TColR: real;
+ TColG: real;
+ TColB: real;
+ TInt: real;
+ TDColR: real;
+ TDColG: real;
+ TDColB: real;
+ TDInt: real;
+
+ // selection background static
+ SBGColR: real;
+ SBGColG: real;
+ SBGColB: real;
+ SBGInt: real;
+ SBGDColR: real;
+ SBGDColG: real;
+ SBGDColB: real;
+ SBGDInt: real;
+
+ // selection statics
+ SColR: real;
+ SColG: real;
+ SColB: real;
+ SInt: real;
+ SDColR: real;
+ SDColG: real;
+ SDColB: real;
+ SDInt: real;
+
+ // selection text
+ STColR: real;
+ STColG: real;
+ STColB: real;
+ STInt: real;
+ STDColR: real;
+ STDColG: real;
+ STDColB: real;
+ STDInt: real;
+
+ // position and size
+ property X: real read Texture.x write Texture.x;
+ property Y: real read Texture.y write Texture.y;
+ property W: real read Texture.w write Texture.w;
+ property H: real read Texture.h write Texture.h;
+// property X2: real read Texture2.x write Texture2.x;
+// property Y2: real read Texture2.y write Texture2.y;
+// property W2: real read Texture2.w write Texture2.w;
+// property H2: real read Texture2.h write Texture2.h;
+
+ // procedures
+ procedure SetSelect(Value: boolean);
+ property Selected: Boolean read SelectBool write SetSelect;
+ procedure SetSelectOpt(Value: integer);
+ property SelectedOption: integer read SelectOptInt write SetSelectOpt;
+ procedure Draw(ButtonAlpha: real);
+ constructor Create;
+ end;
+
+implementation
+uses UDrawTexture;
+
+// ------------ Select
+constructor TSelect.Create;
+begin
+ inherited Create;
+ Text := TText.Create;
+end;
+
+procedure TSelect.SetSelect(Value: boolean);
+var
+ SO: integer;
+begin // default 1, 0.4
+ SelectBool := Value;
+ if Value then begin
+ Texture.ColR := ColR;
+ Texture.ColG := ColG;
+ Texture.ColB := ColB;
+ Texture.Int := Int;
+
+ Text.ColR := TColR;
+ Text.ColG := TColG;
+ Text.ColB := TColB;
+ Text.Int := TInt;
+
+ TextureSBG.ColR := SBGColR;
+ TextureSBG.ColG := SBGColG;
+ TextureSBG.ColB := SBGColB;
+ TextureSBG.Int := SBGInt;
+
+{ for SO := 0 to High(TextOpt) do begin
+ if SelectOptInt = SO then begin
+ TextOpt[SO].ColR := STColR;
+ TextOpt[SO].ColG := STColG;
+ TextOpt[SO].ColB := STColB;
+ TextOpt[SO].Int := STInt;
+ end else begin
+ TextOpt[SO].ColR := STDColR;
+ TextOpt[SO].ColG := STDColG;
+ TextOpt[SO].ColB := STDColB;
+ TextOpt[SO].Int := STDInt;
+ end;
+ end;}
+
+ end else begin
+ Texture.ColR := DColR;
+ Texture.ColG := DColG;
+ Texture.ColB := DColB;
+ Texture.Int := DInt;
+
+ Text.ColR := TDColR;
+ Text.ColG := TDColG;
+ Text.ColB := TDColB;
+ Text.Int := TDInt;
+
+ TextureSBG.ColR := SBGDColR;
+ TextureSBG.ColG := SBGDColG;
+ TextureSBG.ColB := SBGDColB;
+ TextureSBG.Int := SBGDInt;
+
+{ for SO := 0 to High(TextOpt) do begin
+ TextOpt[SO].ColR := STDColR;
+ TextOpt[SO].ColG := STDColG;
+ TextOpt[SO].ColB := STDColB;
+ TextOpt[SO].Int := STDInt;
+ end;}
+ end;
+end;
+
+procedure TSelect.SetSelectOpt(Value: integer);
+var
+ SO: integer;
+begin
+ SelectOptInt := Value;
+ PData^ := Value;
+// SetSelect(true); // reset all colors
+
+ for SO := 0 to High(TextOpt) do begin
+ if SelectOptInt = SO then begin
+ TextOpt[SO].ColR := STColR;
+ TextOpt[SO].ColG := STColG;
+ TextOpt[SO].ColB := STColB;
+ TextOpt[SO].Int := STInt;
+ end else begin
+ TextOpt[SO].ColR := STDColR;
+ TextOpt[SO].ColG := STDColG;
+ TextOpt[SO].ColB := STDColB;
+ TextOpt[SO].Int := STDInt;
+ end;
+ end;
+end;
+
+procedure TSelect.Draw(ButtonAlpha: real);
+var
+ SO: integer;
+begin
+ DrawTexture(Texture);
+ DrawTexture(TextureSBG);
+
+ Text.Draw;
+
+ for SO := 0 to High(TextOpt) do begin
+ TextOpt[SO].Draw;
+ end;
+end;
+
+end.
diff --git a/Game/Code/Menu/UMenuSelectSlide.pas b/Game/Code/Menu/UMenuSelectSlide.pas
new file mode 100644
index 00000000..b5d68aff
--- /dev/null
+++ b/Game/Code/Menu/UMenuSelectSlide.pas
@@ -0,0 +1,345 @@
+unit UMenuSelectSlide;
+
+interface
+uses TextGL, UTexture, gl, UMenuText;
+
+type
+ PSelectSlide = ^TSelectSlide;
+ TSelectSlide = class
+ private
+ SelectBool: boolean;
+ public
+ // objects
+ Text: TText; // Main text describing option
+ TextOpt: array of TText; // 3 texts in the position of possible options
+ TextOptT: array of string; // array of names for possible options
+
+ Texture: TTexture; // Select Texture
+ TextureSBG: TTexture; // Background Selections Texture
+// TextureS: array of TTexture; // Selections Texture (not used)
+
+// TextureArrowL: TTexture; // Texture for left arrow (not used yet)
+// TextureArrowR: TTexture; // Texture for right arrow (not used yet)
+
+ SelectOptInt: integer;
+ PData: ^integer;
+
+ //For automatically Setting LineCount
+ Lines: Byte;
+
+ //Visibility
+ Visible: Boolean;
+
+ // for selection and deselection
+ // main static
+ ColR: real;
+ ColG: real;
+ ColB: real;
+ Int: real;
+ DColR: real;
+ DColG: real;
+ DColB: real;
+ DInt: real;
+
+ // main text
+ TColR: real;
+ TColG: real;
+ TColB: real;
+ TInt: real;
+ TDColR: real;
+ TDColG: real;
+ TDColB: real;
+ TDInt: real;
+
+ // selection background static
+ SBGColR: real;
+ SBGColG: real;
+ SBGColB: real;
+ SBGInt: real;
+ SBGDColR: real;
+ SBGDColG: real;
+ SBGDColB: real;
+ SBGDInt: real;
+
+ // selection text
+ STColR: real;
+ STColG: real;
+ STColB: real;
+ STInt: real;
+ STDColR: real;
+ STDColG: real;
+ STDColB: real;
+ STDInt: real;
+
+ // position and size
+ property X: real read Texture.x write Texture.x;
+ property Y: real read Texture.y write Texture.y;
+ property W: real read Texture.w write Texture.w;
+ property H: real read Texture.h write Texture.h;
+// property X2: real read Texture2.x write Texture2.x;
+// property Y2: real read Texture2.y write Texture2.y;
+// property W2: real read Texture2.w write Texture2.w;
+// property H2: real read Texture2.h write Texture2.h;
+
+ property SBGW: real read TextureSBG.w write TextureSBG.w;
+
+ // procedures
+ procedure SetSelect(Value: boolean);
+ property Selected: Boolean read SelectBool write SetSelect;
+ procedure SetSelectOpt(Value: integer);
+ property SelectedOption: integer read SelectOptInt write SetSelectOpt;
+ procedure Draw;
+ constructor Create;
+
+ //Automatically Generate Lines (Texts)
+ procedure genLines;
+ end;
+
+implementation
+uses UDrawTexture, math, ULog, SysUtils;
+
+// ------------ Select
+constructor TSelectSlide.Create;
+begin
+ inherited Create;
+ Text := TText.Create;
+ SetLength(TextOpt, 1);
+ TextOpt[0] := TText.Create;
+
+ //Set Standard Width for Selections Background
+ SBGW := 450;
+
+ Visible := True;
+ {SetLength(TextOpt, 3);
+ TextOpt[0] := TText.Create;
+ TextOpt[1] := TText.Create;
+ TextOpt[2] := TText.Create;}
+end;
+
+procedure TSelectSlide.SetSelect(Value: boolean);
+var
+ SO: integer;
+ I: integer;
+begin
+ SelectBool := Value;
+ if Value then begin
+ Texture.ColR := ColR;
+ Texture.ColG := ColG;
+ Texture.ColB := ColB;
+ Texture.Int := Int;
+
+ Text.ColR := TColR;
+ Text.ColG := TColG;
+ Text.ColB := TColB;
+ Text.Int := TInt;
+
+ TextureSBG.ColR := SBGColR;
+ TextureSBG.ColG := SBGColG;
+ TextureSBG.ColB := SBGColB;
+ TextureSBG.Int := SBGInt;
+
+{ for I := 0 to High(TextOpt) do begin
+ TextOpt[I].ColR := STColR;
+ TextOpt[I].ColG := STColG;
+ TextOpt[I].ColB := STColB;
+ TextOpt[I].Int := STInt;
+ end;}
+
+ end else begin
+ Texture.ColR := DColR;
+ Texture.ColG := DColG;
+ Texture.ColB := DColB;
+ Texture.Int := DInt;
+
+ Text.ColR := TDColR;
+ Text.ColG := TDColG;
+ Text.ColB := TDColB;
+ Text.Int := TDInt;
+
+ TextureSBG.ColR := SBGDColR;
+ TextureSBG.ColG := SBGDColG;
+ TextureSBG.ColB := SBGDColB;
+ TextureSBG.Int := SBGDInt;
+
+{ for I := 0 to High(TextOpt) do begin
+ TextOpt[I].ColR := STDColR;
+ TextOpt[I].ColG := STDColG;
+ TextOpt[I].ColB := STDColB;
+ TextOpt[I].Int := STDInt;
+ end;}
+ end;
+end;
+
+procedure TSelectSlide.SetSelectOpt(Value: integer);
+var
+ SO: integer;
+ Sel: integer;
+ HalfL: integer;
+ HalfR: integer;
+
+procedure DoSelection(Sel: Cardinal);
+ var I: Integer;
+ begin
+ for I := low(TextOpt) to high(TextOpt) do
+ begin
+ TextOpt[I].ColR := STDColR;
+ TextOpt[I].ColG := STDColG;
+ TextOpt[I].ColB := STDColB;
+ TextOpt[I].Int := STDInt;
+ end;
+ if (Sel <= high(TextOpt)) then
+ begin
+ TextOpt[Sel].ColR := STColR;
+ TextOpt[Sel].ColG := STColG;
+ TextOpt[Sel].ColB := STColB;
+ TextOpt[Sel].Int := STInt;
+ end;
+ end;
+begin
+ SelectOptInt := Value;
+ PData^ := Value;
+// SetSelect(true); // reset all colors
+
+ if (Length(TextOpt)>0) AND (Length(TextOptT)>0) then
+ begin
+
+ if (Value <= 0) then
+ begin //First Option Selected
+ Value := 0;
+
+ for SO := low (TextOpt) to high(TextOpt) do
+ begin
+ TextOpt[SO].Text := TextOptT[SO];
+ end;
+
+ DoSelection(0);
+ end
+ else if (Value >= high(TextOptT)) then
+ begin //Last Option Selected
+ Value := high(TextOptT);
+
+ for SO := high(TextOpt) downto low (TextOpt) do
+ begin
+ TextOpt[SO].Text := TextOptT[high(TextOptT)-(Lines-SO-1)];
+ end;
+ DoSelection(Lines-1);
+ end
+ else
+ begin
+ HalfL := Ceil((Lines-1)/2);
+ HalfR := Lines-1-HalfL;
+
+ if (Value <= HalfL) then
+ begin //Selected Option is near to the left side
+ {HalfL := Value;
+ HalfR := Lines-1-HalfL;}
+ //Change Texts
+ for SO := low (TextOpt) to high(TextOpt) do
+ begin
+ TextOpt[SO].Text := TextOptT[SO];
+ end;
+
+ DoSelection(Value);
+ end
+ else if (Value > High(TextOptT)-HalfR) then
+ begin //Selected is too near to the right border
+ HalfR := high(TextOptT) - Value;
+ HalfL := Lines-1-HalfR;
+ //Change Texts
+ for SO := high(TextOpt) downto low (TextOpt) do
+ begin
+ TextOpt[SO].Text := TextOptT[high(TextOptT)-(Lines-SO-1)];
+ end;
+
+ DoSelection (HalfL);
+ end
+ else
+ begin
+ //Change Texts
+ for SO := low (TextOpt) to high(TextOpt) do
+ begin
+ TextOpt[SO].Text := TextOptT[Value - HalfL + SO];
+ end;
+
+ DoSelection(HalfL);
+ end;
+
+ end;
+
+ end;
+
+end;
+
+procedure TSelectSlide.Draw;
+var
+ SO: integer;
+begin
+ if Visible then
+ begin
+ DrawTexture(Texture);
+ DrawTexture(TextureSBG);
+
+ Text.Draw;
+
+ for SO := low(TextOpt) to high(TextOpt) do
+ TextOpt[SO].Draw;
+ end;
+end;
+
+procedure TSelectSlide.GenLines;
+var
+maxlength: Real;
+I: Integer;
+begin
+ SetFontStyle(0{Text.Style});
+ SetFontSize(Text.Size);
+ maxlength := 0;
+
+ for I := low(TextOptT) to high (TextOptT) do
+ begin
+ if (glTextWidth(PChar(TextOptT[I])) > maxlength) then
+ maxlength := glTextWidth(PChar(TextOptT[I]));
+ end;
+
+ Lines := floor((TextureSBG.W-40) / (maxlength+7));
+ if (Lines > Length(TextOptT)) then
+ Lines := Length(TextOptT);
+
+ if (Lines <= 0) then
+ Lines := 1;
+
+ //Free old Space used by Texts
+ For I := low(TextOpt) to high(TextOpt) do
+ TextOpt[I].Free;
+
+ setLength (TextOpt, Lines);
+
+ for I := low(TextOpt) to high(TextOpt) do
+ begin
+ TextOpt[I] := TText.Create;
+ TextOpt[I].Size := Text.Size;
+ //TextOpt[I].Align := 1;
+ TextOpt[I].Align := 0;
+ TextOpt[I].Visible := True;
+
+ TextOpt[I].ColR := STDColR;
+ TextOpt[I].ColG := STDColG;
+ TextOpt[I].ColB := STDColB;
+ TextOpt[I].Int := STDInt;
+
+ //Generate Positions
+ //TextOpt[I].X := TextureSBG.X + 20 + (TextureSBG.W / Lines) * (I + 0.5);
+ if (I <> High(TextOpt)) OR (High(TextOpt) = 0) OR (Length(TextOptT) = Lines) then
+ TextOpt[I].X := TextureSBG.X + 20 + (TextureSBG.W / Lines) * I
+ else
+ TextOpt[I].X := TextureSBG.X + TextureSBG.W - maxlength;
+
+ TextOpt[I].Y := TextureSBG.Y + (TextureSBG.H / 2) - 1.5 * Text.Size{20};
+
+ //Better Look with 2 Options
+ if (Lines=2) AND (Length(TextOptT)= 2) then
+ TextOpt[I].X := TextureSBG.X + 20 + (TextureSBG.W -40 - glTextWidth(PChar(TextOptT[1]))) * I;
+ end;
+end;
+
+end.
diff --git a/Game/Code/Menu/UMenuStatic.pas b/Game/Code/Menu/UMenuStatic.pas
new file mode 100644
index 00000000..758869e6
--- /dev/null
+++ b/Game/Code/Menu/UMenuStatic.pas
@@ -0,0 +1,84 @@
+unit UMenuStatic;
+
+interface
+uses UTexture, gl;
+
+type
+ TStatic = class
+ public
+ Texture: TTexture; // Button Screen position and size
+ Visible: boolean;
+
+ //Reflection Mod
+ Reflection: boolean;
+ Reflectionspacing: Real;
+
+ procedure Draw;
+ constructor Create(Textura: TTexture); overload;
+ end;
+
+implementation
+uses UDrawTexture;
+
+procedure TStatic.Draw;
+var
+ Pet: integer;
+begin
+ if Visible then
+ begin
+ DrawTexture(Texture);
+
+ //Reflection Mod
+ if (Reflection) then // Draw Reflections
+ begin
+ with Texture do
+ begin
+ //Bind Tex and GL Attributes
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+
+ glDepthRange(0, 10);
+ glDepthFunc(GL_LEQUAL);
+ glEnable(GL_DEPTH_TEST);
+
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glBindTexture(GL_TEXTURE_2D, TexNum);
+
+ //Draw
+ glBegin(GL_QUADS);//Top Left
+ glColor4f(ColR * Int, ColG * Int, ColB * Int, Alpha-0.3);
+ glTexCoord2f(TexX1*TexW, TexY2*TexH);
+ glVertex3f(x, y+h*scaleH+ Reflectionspacing, z);
+
+ //Bottom Left
+ glColor4f(ColR * Int, ColG * Int, ColB * Int, 0);
+ glTexCoord2f(TexX1*TexW, 0.5*TexH+TexY1);
+ glVertex3f(x, y+h*scaleH + h*scaleH/2 + Reflectionspacing, z);
+
+
+ //Bottom Right
+ glColor4f(ColR * Int, ColG * Int, ColB * Int, 0);
+ glTexCoord2f(TexX2*TexW, 0.5*TexH+TexY1);
+ glVertex3f(x+w*scaleW, y+h*scaleH + h*scaleH/2 + Reflectionspacing, z);
+
+ //Top Right
+ glColor4f(ColR * Int, ColG * Int, ColB * Int, Alpha-0.3);
+ glTexCoord2f(TexX2*TexW, TexY2*TexH);
+ glVertex3f(x+w*scaleW, y+h*scaleH + Reflectionspacing, z);
+ glEnd;
+
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_DEPTH_TEST);
+ glDisable(GL_BLEND);
+ end;
+ end;
+ end;
+end;
+
+constructor TStatic.Create(Textura: TTexture);
+begin
+ inherited Create;
+ Texture := Textura;
+end;
+
+end.
diff --git a/Game/Code/Menu/UMenuText.pas b/Game/Code/Menu/UMenuText.pas
new file mode 100644
index 00000000..315a7302
--- /dev/null
+++ b/Game/Code/Menu/UMenuText.pas
@@ -0,0 +1,324 @@
+unit UMenuText;
+
+interface
+uses TextGL, UTexture, gl, SysUtils;
+
+type
+ TText = class
+ private
+ SelectBool: boolean;
+ TextString: String;
+ TextTiles: Array of String;
+
+ STicks: Cardinal;
+ SelectBlink: Boolean;
+ public
+ X: real;
+ Y: real;
+ MoveX: real; //Some Modifier for X - Position that don't Affect the Real Y
+ MoveY: real; //Some Modifier for Y - Position that don't Affect the Real Y
+ W: real; // if text is wider than W then it is breaked
+// H: real;
+ Size: real;
+ ColR: real;
+ ColG: real;
+ ColB: real;
+ Alpha: real;
+ Int: real;
+ Style: integer;
+ Visible: boolean;
+ Align: integer; // 0 = left, 1 = center, 2 = right
+
+ procedure SetSelect(Value: Boolean);
+ property Selected: Boolean read SelectBool write SetSelect;
+
+ procedure SetText(Value: String);
+ property Text: String read TextString write SetText;
+
+ procedure DeleteLastL; //Procedure to Delete Last Letter
+
+ procedure Draw;
+ constructor Create; overload;
+ constructor Create(X, Y: real; Tekst: string); overload;
+ constructor Create(ParX, ParY, ParW: real; ParStyle: integer; ParSize, ParColR, ParColG, ParColB: real; ParAlign: integer; ParTekst: string); overload;
+ end;
+
+implementation
+uses UGraphic, StrUtils, Windows;
+
+procedure TText.SetSelect(Value: Boolean);
+begin
+ SelectBool := Value;
+
+ //Set Cursor Visible
+ SelectBlink := True;
+ STicks := GettickCount div 550;
+end;
+
+procedure TText.SetText(Value: String);
+var
+ NextPos: Cardinal; //NextPos of a Space etc.
+ LastPos: Cardinal; //LastPos "
+ LastBreak: Cardinal; //Last Break
+ isBreak: Boolean; //True if the Break is not Caused because the Text is out of the area
+ FirstWord: Word; //Is First Word after Break?
+ Len: Word; //Length of the Tiles Array
+ Function Smallest(const A, B: Cardinal):Cardinal;
+ begin
+ if (A < B) then
+ Result := A
+ else
+ Result := B;
+ end;
+
+ Function GetNextPos: Boolean;
+ var
+ T1, T2, T3: Cardinal;
+ begin
+ LastPos := NextPos;
+
+ //Next Space (If Width is given)
+ if (W > 0) then
+ T1 := PosEx(' ', Value, LastPos + 1)
+ else T1 := Length(Value);
+
+ {//Next -
+ T2 := PosEx('-', Value, LastPos + 1);}
+
+ //Next Break
+ T3 := PosEx('\n', Value, LastPos + 1);
+
+ if T1 = 0 then
+ T1 := Length(Value);
+ {if T2 = 0 then
+ T2 := Length(Value); }
+ if T3 = 0 then
+ T3 := Length(Value);
+
+ //Get Nearest Pos
+ NextPos := Smallest(T1, T3{Smallest(T2, T3)});
+
+ if (LastPos = Length(Value)) then
+ NextPos := 0;
+
+ isBreak := (NextPos = T3) AND (NextPos <> Length(Value));
+ Result := (NextPos <> 0);
+ end;
+ procedure AddBreak(const From, bTo: Cardinal);
+ begin
+ if (isBreak) OR (bTo - From >= 1) then
+ begin
+ Inc(Len);
+ SetLength (TextTiles, Len);
+ TextTiles[Len-1] := Trim(Copy(Value, From, bTo - From));
+
+ if isBreak then
+ LastBreak := bTo + 2
+ else
+ LastBreak := bTo + 1;
+ FirstWord := 0;
+ end;
+ end;
+begin
+ //Set TExtstring
+ TextString := Value;
+
+ //Set Cursor Visible
+ SelectBlink := True;
+ STicks := GettickCount div 550;
+
+ //Exit if there is no Need to Create Tiles
+ If (W <= 0) and (Pos('\n', Value) = 0) then
+ begin
+ SetLength (TextTiles, 1);
+ TextTiles[0] := Value;
+ Exit;
+ end;
+
+ //Create Tiles
+ //Reset Text Array
+ SetLength (TextTiles, 0);
+ Len := 0;
+
+ //Reset Counter Vars
+ LastPos := 1;
+ NextPos := 1;
+ LastBreak := 1;
+ FirstWord := 1;
+
+
+ if (W > 0) then
+ begin
+ //Set Font Propertys
+ SetFontStyle(Style);
+ SetFontSize(Size);
+ end;
+
+ //go Through Text
+ While (GetNextPos) do
+ begin
+ //Break in Text
+ if isBreak then
+ begin
+ //Look for Break before the Break
+ if (glTextWidth(PChar(Copy(Value, LastBreak, NextPos - LastBreak + 1))) > W) AND (NextPos-LastPos > 1) then
+ begin
+ isBreak := False;
+ //Not the First word after Break, so we don't have to break within a word
+ if (FirstWord > 1) then
+ begin
+ //Add Break before actual Position, because there the Text fits the Area
+ AddBreak(LastBreak, LastPos);
+ end
+ else //First Word after Break Break within the Word
+ begin
+ //ToDo
+ //AddBreak(LastBreak, LastBreak + 155);
+ end;
+ end;
+
+ isBreak := True;
+ //Add Break from Text
+ AddBreak(LastBreak, NextPos);
+ end
+ //Text comes out of the Text Area -> CreateBreak
+ else if (glTextWidth(PChar(Copy(Value, LastBreak, NextPos - LastBreak + 1))) > W) then
+ begin
+ //Not the First word after Break, so we don't have to break within a word
+ if (FirstWord > 1) then
+ begin
+ //Add Break before actual Position, because there the Text fits the Area
+ AddBreak(LastBreak, LastPos);
+ end
+ else //First Word after Break -> Break within the Word
+ begin
+ //ToDo
+ //AddBreak(LastBreak, LastBreak + 155);
+ end;
+ end;
+ //end;
+ Inc(FirstWord)
+ end;
+ //Add Ending
+ AddBreak(LastBreak, Length(Value)+1);
+end;
+
+Procedure TText.DeleteLastL;
+var
+ S: String;
+ L: Integer;
+begin
+ S := TextString;
+ L := Length(S);
+ if (L > 0) then
+ SetLength(S, L-1);
+
+ SetText(S);
+end;
+
+procedure TText.Draw;
+var
+ X2, Y2: real;
+ Text2: string;
+ I: Integer;
+begin
+ if Visible then begin
+ SetFontStyle(Style);
+ SetFontSize(Size);
+ SetFontItalic(False);
+ glColor4f(ColR*Int, ColG*Int, ColB*Int, Alpha);
+
+ //If Selected Set Blink...
+ if SelectBool then
+ begin
+ I := Gettickcount div 550;
+ if I <> STicks then
+ begin //Change Visability
+ STicks := I;
+ SelectBlink := Not SelectBlink;
+ end;
+ end;
+
+ {if (False) then //No Width set Draw as one Long String
+ begin
+ if not (SelectBool AND SelectBlink) then
+ Text2 := Text
+ else
+ Text2 := Text + '|';
+
+ case Align of
+ 0: X2 := X;
+ 1: X2 := X - glTextWidth(pchar(Text2))/2;
+ 2: X2 := X - glTextWidth(pchar(Text2));
+ end;
+
+ SetFontPos(X2, Y);
+ glPrint(PChar(Text2));
+ SetFontStyle(0); // reset to default
+ end
+ else
+ begin}
+ //Now Use allways:
+ //Draw Text as Many Strings
+ Y2 := Y + MoveY;
+ for I := 0 to high(TextTiles) do
+ begin
+ if (not (SelectBool AND SelectBlink)) OR (I <> high(TextTiles)) then
+ Text2 := TextTiles[I]
+ else
+ Text2 := TextTiles[I] + '|';
+
+ case Align of
+ 0: X2 := X + MoveX;
+ 1: X2 := X + MoveX - glTextWidth(pchar(Text2))/2;
+ 2: X2 := X + MoveX - glTextWidth(pchar(Text2));
+ end;
+
+ SetFontPos(X2, Y2);
+ glPrint(PChar(Text2));
+
+ {if Size >= 10 then
+ Y2 := Y2 + Size * 2.8
+ else}
+ if (Style = 1) then
+ Y2 := Y2 + Size * 2.8
+ else
+ Y2 := Y2 + Size * 2.15;
+ end;
+ SetFontStyle(0); // reset to default
+
+ //end;
+ end;
+end;
+
+constructor TText.Create;
+begin
+ Create(0, 0, '');
+end;
+
+constructor TText.Create(X, Y: real; Tekst: string);
+begin
+ Create(X, Y, 0, 0, 10, 0, 0, 0, 0, Tekst);
+end;
+
+constructor TText.Create(ParX, ParY, ParW: real; ParStyle: integer; ParSize, ParColR, ParColG, ParColB: real; ParAlign: integer; ParTekst: string);
+begin
+ inherited Create;
+ Alpha := 1;
+ X := ParX;
+ Y := ParY;
+ W := ParW;
+ Style := ParStyle;
+ Size := ParSize;
+ Text := ParTekst;
+ ColR := ParColR;
+ ColG := ParColG;
+ ColB := ParColB;
+ Int := 1;
+ Align := ParAlign;
+ SelectBool := false;
+ Visible := true;
+end;
+
+
+end.
diff --git a/Game/Code/SMpeg/USmpeg.pas b/Game/Code/SMpeg/USmpeg.pas
new file mode 100644
index 00000000..ed7e194a
--- /dev/null
+++ b/Game/Code/SMpeg/USmpeg.pas
@@ -0,0 +1,307 @@
+unit USmpeg;
+
+interface
+uses SDL,
+ smpeg,
+ gl,
+ glu,
+ glext,
+ SysUtils,
+ UIni;
+
+procedure OpenSmpeg(FileName: string);
+procedure SkipSmpeg(Time: single);
+procedure PlaySmpeg;
+procedure PauseSmpeg; //PauseMod
+procedure UpdateSmpeg;
+procedure CloseSmpeg;
+function glmovie_init(Width : GLuint; Height : GLuint ) : GLenum;
+procedure glmpeg_update(surface: PSDL_Surface; x: Sint32; y: Sint32; w: Uint32; h: Uint32); cdecl;
+procedure DrawSmpeg(frame: PGLubyte);
+procedure glmovie_resize( width : GLuint; height : GLuint );
+procedure glmovie_quit;
+
+var
+ mpeg: PSMPEG;
+ mpeg_info: TSMPEG_Info;
+ surface: PSDL_Surface;
+
+type
+ { Some data is redundant at this stage. }
+ PGLMovieTexture = ^TGLMovieTexture;
+ TGLMovieTexture = record
+ id : GLuint; (* OpenGL texture id. *)
+ poly_width : GLuint; (* Quad width for tile. *)
+ poly_height : GLuint; (* Quad height for tile. *)
+ movie_width : GLuint; (* Width of movie inside tile. *)
+ movie_height : GLuint; (* Height of movie inside tile. *)
+ skip_rows : GLuint; (* Number of rows of movie to skip *)
+ skip_pixels : GLuint; (* Number of columns of movie to skip *)
+ row : GLuint; (* Row number of tile in scheme. *)
+ col : GLuint; (* Column number of tile in scheme. *)
+ end;
+
+type
+ TGLuintArray = array of GLuint;
+ PGLuintArray = ^TGLuintArray;
+ TGLMovieTextureArray = array of TGLMovieTexture;
+ PGLMovieTextureArray = ^TGLMovieTextureArray;
+
+var
+ (* Our evil maximum texture size. Boo 3Dfxnot *)
+ texture_size : GLuint = 1024;//512;
+ texture_ids : GLuint;
+ textures: TGLMovieTexture;
+ tiled_width : GLuint = 0;
+ tiled_height : GLuint = 0;
+ movie_width : GLuint = 0;
+ movie_height : GLuint = 0;
+
+implementation
+
+procedure OpenSmpeg(FileName: string);
+begin
+ mpeg := SMPEG_new(PChar(FileName), @mpeg_info, 0); // audio
+ if ( mpeg = nil ) then begin
+ SDL_Quit;
+ Exit;
+ end;
+
+// SMPEG_setvolume(mpeg, 50);
+ SMPEG_enableaudio(mpeg, 0);
+
+ (* Everything needs to be in RGB for GL, but needs to be 32-bit for SMPEG. *)
+ surface := SDL_AllocSurface( SDL_SWSURFACE,
+ mpeg_info.width,
+ mpeg_info.height,
+ 32,
+ $000000FF,
+ $0000FF00,
+ $00FF0000,
+ $FF000000 );
+
+ if ( surface = nil ) then begin
+ SDL_Quit;
+ Exit;
+ end;
+
+ (* *Initialize* with mpeg size. *)
+ if (glmovie_init( mpeg_info.width, mpeg_info.height ) <> GL_NO_ERROR ) then begin
+ SDL_Quit;
+ Exit;
+ end;
+
+ SMPEG_setdisplay(mpeg, surface, nil, @glmpeg_update);
+end;
+
+procedure SkipSmpeg(Time: single);
+begin
+ SMPEG_skip(mpeg, Time);
+end;
+
+procedure PlaySmpeg;
+begin
+ SMPEG_play(mpeg);
+end;
+
+//Pause Mod
+procedure PauseSmpeg;
+begin
+ SMPEG_pause(mpeg);
+end;
+
+procedure UpdateSmpeg;
+begin
+// glmpeg_update(surface,0,0,0,0);
+ DrawSmpeg( PGLubyte( surface.pixels ) );
+end;
+
+procedure CloseSmpeg;
+begin
+ SMPEG_delete(mpeg);
+ //Fixing the Memory Lag in earlyer Versions (X-Mas Mod, all Official Versions)
+ glmovie_quit;
+end;
+
+function glmovie_init( Width : GLuint; Height : GLuint ) : GLenum;
+type
+ PGLubyteArray = ^TGLubyteArray;
+ TGLubyteArray = array of GLubyte;
+var
+ (* Initial black texels. *)
+ pixels : TGLubyteArray;
+ (* Absolute offsets from within tiled frame. *)
+ //offset_x: GLuint;
+ //offset_y: GLuint;
+ skip_rows : GLuint;
+ skip_pixels : GLuint;
+ i, j, current : GLuint;
+begin
+ skip_rows := 0;
+ current := 0;
+ (* Save original movie dimensions. *)
+ movie_width := width;
+ movie_height := height;
+
+ (* Get the power of 2 dimensions. *)
+ tiled_width := 1024{512};
+ tiled_height := 1024{512};
+
+ texture_size := 1024{512};
+
+ (* Time for fun with data type = record *)
+ glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_DITHER);
+
+ glGenTextures(1, @texture_ids);
+
+ current := 0;
+ (* Setup texture. *)
+ textures.id := texture_ids;
+ textures.poly_width := texture_size;
+ textures.poly_height := texture_size;
+ textures.movie_width := movie_width - 2;
+ textures.movie_height := movie_height - 2;
+ textures.row := i;
+ textures.col := j;
+ textures.skip_pixels := skip_pixels;
+ textures.skip_rows := skip_rows;
+
+ SetLength( pixels, textures.poly_width * textures.poly_height * 4 );
+ if ( pixels = nil ) then
+ begin
+ glDeleteTextures(1, @texture_ids);
+ result := GL_OUT_OF_MEMORY;
+ exit;
+ end;
+ //FillChar( pixels^, textures[ current ].poly_width * textures[ current ].poly_height * 4, 0 );
+
+ (* Do all of our useful binding. *)
+ glBindTexture(GL_TEXTURE_2D, texture_ids);
+// glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+ (* Specify our 256x256 black texture. *)
+ glTexImage2D( GL_TEXTURE_2D,
+ 0,
+ GL_RGB,
+ 1024{512},//textures.poly_width,
+ 1024{512},//textures.poly_height,
+ 0,
+ GL_RGBA,
+ GL_UNSIGNED_BYTE,
+ @pixels[0] );
+ SetLength( pixels, 0 );
+
+
+ (* Simple state setup at the end. *)
+ result := glGetError( );
+end;
+
+procedure glmpeg_update( surface : PSDL_Surface; x : Sint32; y : Sint32; w : Uint32;
+ h : Uint32 ); cdecl;
+var
+ error : GLenum;
+begin
+ glClear( GL_COLOR_BUFFER_BIT );
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity;
+ DrawSmpeg( PGLubyte( surface.pixels ) );
+ error := glGetError( );
+ if ( error <> GL_NO_ERROR ) then Exit;
+ SDL_GL_SwapBuffers;
+end;
+
+procedure DrawSmpeg(frame: PGLubyte);
+var
+ Shift: GLdouble;
+ CropT: real;
+ CropB: real;
+ TexT: real;
+ TexB: real;
+ TexL: real;
+ TexR: real;
+ Wide: boolean;
+begin
+ (* full screen mpeg *)
+{ CropT := 0;
+ CropB := 600;
+ TexT := 0;
+ TexB := 1;
+ TexL := 0;
+ TexW := 1;}
+
+ // set movie texture crop
+ Wide := false;
+ if (textures.movie_width = 720-2) and (textures.movie_height = 344-2) then begin
+ TexT := 0;
+ TexB := 342/1024;
+ Wide := true;
+ end;
+ if textures.movie_height = 304-2 then begin
+ TexT := 0;
+ TexB := 304/1024;
+ Wide := true;
+ end;
+ if textures.movie_height = 152-2 then begin
+ TexT := 0;
+ TexB := 152/1024;
+ Wide := true;
+ end;
+
+ CropT := 110; // (110/800 = 13,75% max crop)
+ CropB := 490; // (110/800 = 13,75% max crop)
+
+ if (textures.movie_height <> 304-2) and (textures.movie_height <> 152-2) and (textures.movie_height <> 344-2) then begin
+ TexT := 110 / 600 * (textures.movie_height / 1024{512});
+ TexB := 490 / 600 * (textures.movie_height / 1024{512});
+
+ if Ini.MovieSize >= 1 then begin
+ // full screen size
+ CropT := 0;
+ CropB := 600;
+ TexT := 0;
+ TexB := textures.movie_height / 1024{512};
+ end;
+ end;
+
+ TexL := {10}0/600 * (textures.movie_width / 1024{512});
+ TexR := {590}600/600 * (textures.movie_width / 1024{512});
+
+ glEnable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+ glColor3f(1, 1, 1);
+ glBindTexture( GL_TEXTURE_2D, texture_ids );
+// glPixelStorei( GL_UNPACK_ROW_LENGTH, movie_width );
+ glPixelStorei( GL_UNPACK_SKIP_ROWS, 0);
+ glPixelStorei( GL_UNPACK_SKIP_PIXELS, 0);
+ glTexSubImage2D( GL_TEXTURE_2D, 0, 0, (* offset_x *) 0, (* offset_y *) textures.movie_width + 2, textures.movie_height + 2, GL_RGBA, GL_UNSIGNED_BYTE, frame );
+
+ // draw
+ glBegin( GL_QUADS );
+ glTexCoord2f(TexL, TexT); glVertex2f(0, CropT);
+ glTexCoord2f(TexL, TexB); glVertex2f(0, CropB);
+ glTexCoord2f(TexR, TexB); glVertex2f(800, CropB);
+ glTexCoord2f(TexR, TexT); glVertex2f(800, CropT);
+ glEnd;
+ glDisable(GL_TEXTURE_2D);
+end;
+
+procedure glmovie_resize( width : GLuint; height : GLuint );
+begin
+ glViewport(0, 0, width, height);
+ glMatrixMode(GL_PROJECTION);
+ glLoadIdentity;
+ gluOrtho2D(0, 800, 600, 0);
+end;
+
+procedure glmovie_quit;
+begin
+ glDeleteTextures(1, @texture_ids);
+ SDL_FreeSurface(surface);
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenCredits.pas b/Game/Code/Screens/UScreenCredits.pas
new file mode 100644
index 00000000..96eb1642
--- /dev/null
+++ b/Game/Code/Screens/UScreenCredits.pas
@@ -0,0 +1,1110 @@
+unit UScreenCredits;
+
+interface
+
+uses
+ UMenu, SDL, UDisplay, UTexture, gl, UMusic, UFiles, SysUtils, UThemes, ULCD, ULight, UGraphicClasses;
+
+type
+ TCreditsStages=(InitialDelay,Intro,MainPart,Outro);
+
+ TScreenCredits = class(TMenu)
+ public
+
+ Credits_X: Real;
+ Credits_Time: Cardinal;
+ Credits_Alpha: Cardinal;
+ CTime: Cardinal;
+ CTime_hold: Cardinal;
+ ESC_Alpha: Integer;
+
+ credits_entry_tex: TTexture;
+ credits_entry_dx_tex: TTexture;
+ credits_bg_tex: TTexture;
+ credits_bg_ovl: TTexture;
+// credits_bg_logo: TTexture;
+ credits_bg_scrollbox_left: TTexture;
+ credits_blindy: TTexture;
+ credits_canni: TTexture;
+ credits_ggkfc: TTexture;
+ credits_jaybinks: TTexture;
+ credits_linnex: TTexture;
+ credits_mog: TTexture;
+ credits_omgdutch: TTexture;
+ credits_skillmaster: TTexture;
+ credits_whiteshark: TTexture;
+ intro_layer01: TTexture;
+ intro_layer02: TTexture;
+ intro_layer03: TTexture;
+ intro_layer04: TTexture;
+ intro_layer05: TTexture;
+ intro_layer06: TTexture;
+ intro_layer07: TTexture;
+ intro_layer08: TTexture;
+ intro_layer09: TTexture;
+ outro_bg: TTexture;
+ outro_esc: TTexture;
+ outro_exd: TTexture;
+
+ deluxe_slidein: cardinal;
+
+ CurrentScrollText: String;
+ NextScrollUpdate: Real;
+ EndofLastScrollingPart: Cardinal;
+ CurrentScrollStart, CurrentScrollEnd: Integer;
+
+ CRDTS_Stage: TCreditsStages;
+
+ Fadeout: boolean;
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ function Draw: boolean; override;
+ procedure onShow; override;
+ procedure onHide; override;
+ procedure DrawCredits;
+ procedure Draw_FunkyText;
+ end;
+
+const
+ Funky_Text: AnsiString = // |
+ 'A small step in version number, a huge step for the community - USDX works with any video format now. Thanks and greetings fly out to Mota '+
+ '(we miss you!), Skar (additional skins), Atlassian.com, Zanadoo.com and WhirlWind-Records.com. Massive thanks to the translators: Jonaspaulo, '+
+ 'Jacobo, Bres, W0nderboy, Dadone - and our betatesters: Theril, Tyris, Murmeltier and Lemon. Greetings to Tronic from NuubSing (you guys rule!) and Corvus5.';
+ Timings: array[0..21] of Cardinal=(
+ 20, // 0 Delay vor Start
+
+ 149, // 1 Ende erster Intro Zoom
+ 155, // 2 Start 2. Action im Intro
+ 170, // 3 Ende Separation im Intro
+ 271, // 4 Anfang Zoomout im Intro
+ 0, // 5 unused
+ 261, // 6 Start fade-to-white im Intro
+
+ 271, // 7 Start Main Part
+ 280, // 8 Start On-Beat-Sternchen Main Part
+
+ 396, // 9 Start blindy
+ 666, // 10 Start canni
+ 936, // 11 Start ggkfc
+ 1206, // 12 Start jaybinks
+ 1476, // 13 Start linnex
+ 1746, // 14 Start mog
+ 2016, // 15 Start omgdutch
+ 2286, // 16 Start SkillMaster
+ 2556, // 17 Start WhiteShark
+ 2826, // 18 Ende Whiteshark
+ 3096, // 19 Start FadeOut Mainscreen
+ 3366, // 20 Ende Credits Tune
+ 60); // 21 start flare im intro
+
+implementation
+
+uses Dialogs,Windows, UGraphic, UMain, UIni, USongs, Textgl, opengl, ULanguage, Math;
+
+function TScreenCredits.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ FadeTo(@ScreenMain);
+ Music.PlayBack;
+ end;
+{ SDLK_SPACE:
+ begin
+ setlength(CTime_hold,length(CTime_hold)+1);
+ CTime_hold[high(CTime_hold)]:=CTime;
+ end;
+}
+ end;//esac
+ end; //fi
+end;
+
+constructor TScreenCredits.Create;
+begin
+ inherited Create;
+ credits_bg_tex := Texture.LoadTexture(true, 'CRDTS_BG', 'PNG', 'Plain', 0);
+ credits_bg_ovl := Texture.LoadTexture(true, 'CRDTS_OVL', 'PNG', 'Transparent', 0);
+
+ credits_blindy := Texture.LoadTexture(true, 'CRDTS_blindy', 'PNG', 'Font Black', 0);
+ credits_canni := Texture.LoadTexture(true, 'CRDTS_canni', 'PNG', 'Font Black', 0);
+ credits_ggkfc := Texture.LoadTexture(true, 'CRDTS_ggkfc', 'PNG', 'Font Black', 0);
+ credits_jaybinks := Texture.LoadTexture(true, 'CRDTS_jaybinks', 'PNG', 'Font Black', 0);
+ credits_linnex := Texture.LoadTexture(true, 'CRDTS_linnex', 'PNG', 'Font Black', 0);
+ credits_mog := Texture.LoadTexture(true, 'CRDTS_mog', 'PNG', 'Font Black', 0);
+ credits_omgdutch := Texture.LoadTexture(true, 'CRDTS_omgdutch', 'PNG', 'Font Black', 0);
+ credits_skillmaster := Texture.LoadTexture(true, 'CRDTS_skillmaster','PNG', 'Font Black', 0);
+ credits_whiteshark := Texture.LoadTexture(true, 'CRDTS_whiteshark', 'PNG', 'Font Black', 0);
+
+ intro_layer01 := Texture.LoadTexture(true, 'INTRO_L01', 'PNG', 'Transparent', 0);
+ intro_layer02 := Texture.LoadTexture(true, 'INTRO_L02', 'PNG', 'Transparent', 0);
+ intro_layer03 := Texture.LoadTexture(true, 'INTRO_L03', 'PNG', 'Transparent', 0);
+ intro_layer04 := Texture.LoadTexture(true, 'INTRO_L04', 'PNG', 'Transparent', 0);
+ intro_layer05 := Texture.LoadTexture(true, 'INTRO_L05', 'PNG', 'Transparent', 0);
+ intro_layer06 := Texture.LoadTexture(true, 'INTRO_L06', 'PNG', 'Transparent', 0);
+ intro_layer07 := Texture.LoadTexture(true, 'INTRO_L07', 'PNG', 'Transparent', 0);
+ intro_layer08 := Texture.LoadTexture(true, 'INTRO_L08', 'PNG', 'Transparent', 0);
+ intro_layer09 := Texture.LoadTexture(true, 'INTRO_L09', 'PNG', 'Transparent', 0);
+
+ outro_bg := Texture.LoadTexture(true, 'OUTRO_BG', 'PNG', 'Plain', 0);
+ outro_esc := Texture.LoadTexture(true, 'OUTRO_ESC', 'PNG', 'Transparent', 0);
+ outro_exd := Texture.LoadTexture(true, 'OUTRO_EXD', 'PNG', 'Plain', 0);
+
+ CRDTS_Stage:=InitialDelay;
+end;
+
+function TScreenCredits.Draw: boolean;
+begin
+ DrawCredits;
+end;
+
+procedure TScreenCredits.onShow;
+begin
+ CRDTS_Stage:=InitialDelay;
+ Credits_X := 580;
+ deluxe_slidein := 0;
+ Credits_Alpha := 0;
+ Music.Open(soundpath + 'wome-credits-tune.mp3'); //danke kleinster liebster weeeetüüüüü!!
+ Music.SetVolume(100); //Whiteshark, you hear me now? :P
+ CTime:=0;
+// setlength(CTime_hold,0);
+end;
+
+procedure TScreenCredits.onHide;
+begin
+ Music.Stop;
+end;
+
+Procedure TScreenCredits.Draw_FunkyText;
+var
+ S,I, Len: Integer;
+ X,Y,A: Real;
+ visibleText: PChar;
+begin
+ SetFontSize(10);
+ //Init ScrollingText
+ if (CTime = Timings[7]) then
+ begin
+ //Set Position of Text
+ Credits_X := 600;
+ CurrentScrollStart:=1;
+ CurrentScrollEnd:=1;
+ end;
+
+ if (CTime > Timings[7]) and (CurrentScrollStart < length(Funky_Text)) then
+ begin
+ X:=0;
+ visibleText:=pchar(Copy(Funky_Text, CurrentScrollStart, CurrentScrollEnd));
+ for S := 0 to length(visibleText)-1 do begin
+ Y:=abs(sin((Credits_X+X)*0.93{*(((Credits_X+X))/1200)}/100*pi));
+ SetFontPos(Credits_X+X,538-Y*(Credits_X+X)*(Credits_X+X)*(Credits_X+X)/1000000);
+ if (Credits_X+X < 15) then A:=0;
+ if (Credits_X+X >=15) then A:=Credits_X+X-15;
+ if Credits_X+X > 32 then A:=17;
+ glColor4f( 230/255-40/255+Y*(Credits_X+X)/900, 200/255-30/255+Y*(Credits_X+X)/1000, 155/255-20/255+Y*(Credits_X+X)/1100, A/17);
+ glPrintLetter(visibleText[S]);
+ X := X + Fonts[ActFont].Width[Ord(visibleText[S])] * Fonts[ActFont].Tex.H / 30 * Fonts[ActFont].AspectW;
+ end;
+ if (Credits_X<0) and (CurrentScrollStart < length(Funky_Text)) then begin
+ Credits_X:=Credits_X + Fonts[ActFont].Width[Ord(Funky_Text[CurrentScrollStart])] * Fonts[ActFont].Tex.H / 30 * Fonts[ActFont].AspectW;
+ inc(CurrentScrollStart);
+ end;
+ visibleText:=pchar(Copy(Funky_Text, CurrentScrollStart, CurrentScrollEnd));
+ if (Credits_X+glTextWidth(visibleText) < 600) and (CurrentScrollEnd < length(Funky_Text)) then begin
+ inc(CurrentScrollEnd);
+ end;
+ end;
+{ // timing hack
+ X:=5;
+ SetFontStyle (2);
+ SetFontItalic(False);
+ SetFontSize(9);
+ glColor4f(1, 1, 1, 1);
+ for S:=0 to high(CTime_hold) do begin
+ visibleText:=pchar(inttostr(CTime_hold[S]));
+ SetFontPos (500, X);
+ glPrint (Addr(visibleText[0]));
+ X:=X+20;
+ end;}
+end;
+
+procedure Start3D;
+begin
+ glMatrixMode(GL_PROJECTION);
+ glPushMatrix;
+ glLoadIdentity;
+ glFrustum(-0.3*4/3,0.3*4/3,-0.3,0.3,1,1000);
+ glMatrixMode(GL_MODELVIEW);
+ glLoadIdentity;
+end;
+procedure End3D;
+begin
+ glMatrixMode(GL_PROJECTION);
+ glPopMatrix;
+ glMatrixMode(GL_MODELVIEW);
+end;
+
+procedure TScreenCredits.DrawCredits;
+var
+ T,I: Cardinal;
+ X: Real;
+ Ver: PChar;
+ RuntimeStr: AnsiString;
+ Data: TFFTData;
+ j,k,l:cardinal;
+ f,g,h: Real;
+ STime:cardinal;
+ Delay:cardinal;
+
+ myPixel: longword;
+ myColor: Cardinal;
+ myScale: Real;
+ myAngle: Real;
+const myLogoCoords: Array[0..27,0..1] of Cardinal = ((39,32),(84,32),(100,16),(125,24),
+ (154,31),(156,58),(168,32),(203,36),
+ (258,34),(251,50),(274,93),(294,84),
+ (232,54),(278,62),(319,34),(336,92),
+ (347,23),(374,32),(377,58),(361,83),
+ (385,91),(405,91),(429,35),(423,51),
+ (450,32),(485,34),(444,91),(486,93));
+
+begin
+//dis does teh muiwk y0r
+Data := Music.GetFFTData;
+
+
+
+ T := GetTickCount div 33;
+ if T <> Credits_Time then
+ begin
+ Credits_Time := T;
+ inc(CTime);
+ inc(CTime_hold);
+ Credits_X := Credits_X-2;
+ if (CRDTS_Stage=InitialDelay) and (CTime=Timings[0]) then
+ begin
+// CTime:=Timings[20];
+// CRDTS_Stage:=Outro;
+
+ CRDTS_Stage:=Intro;
+ CTime:=0;
+ Music.Play;
+
+ end;
+ if (CRDTS_Stage=Intro) and (CTime=Timings[7]) then
+ begin
+ CRDTS_Stage:=MainPart;
+ end;
+ if (CRDTS_Stage=MainPart) and (CTime=Timings[20]) then
+ begin
+ CRDTS_Stage:=Outro;
+ end;
+ end;
+
+ //draw background
+ if CRDTS_Stage=InitialDelay then
+ begin
+ glClearColor(0,0,0,0);
+ glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
+ end
+ else
+ if CRDTS_Stage=Intro then
+ begin
+ Start3D;
+ glPushMatrix;
+
+ glClearColor(0,0,0,0);
+ glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
+
+ glEnable(GL_TEXTURE_2D);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+
+ if CTime < Timings[1] then begin
+ myScale:= 0.5+0.5*(Timings[1]-CTime)/(Timings[1]); // slowly move layers together
+ myAngle:=cos((CTime)*pi/((Timings[1])*2)); // and make logo face towards camera
+ end else begin // this is the part when the logo stands still
+ myScale:=0.5;
+ myAngle:=0;
+ end;
+ if CTime > Timings[2] then begin
+ myScale:= 0.5+0.5*(CTime-Timings[2])/(Timings[3]-Timings[2]); // get some space between layers
+ myAngle:=0;
+ end;
+// if CTime > Timings[3] then myScale:=1; // keep the space between layers
+ glTranslatef(0,0,-5+0.5*myScale);
+ if CTime > Timings[3] then myScale:=1; // keep the space between layers
+ if CTime > Timings[3] then begin // make logo rotate left and grow
+// myScale:=(CTime-Timings[4])/(Timings[7]-Timings[4]);
+ glRotatef(20*sqr(CTime-Timings[3])/sqr((Timings[7]-Timings[3])/2),0,0,1);
+ glScalef(1+sqr(CTime-Timings[3])/(32*(Timings[7]-Timings[3])),1+sqr(CTime-Timings[3])/(32*(Timings[7]-Timings[3])),1);
+ end;
+ if CTime < Timings[2] then
+ glRotatef(30*myAngle,0.5*myScale+myScale,1+myScale,0);
+// glScalef(0.5,0.5,0.5);
+ glScalef(4/3,-1,1);
+ glColor4f(1, 1, 1, 1);
+
+ glBindTexture(GL_TEXTURE_2D, intro_layer01.TexNum);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex3f(-1, -1, -0.4 * myScale);
+ glTexCoord2f(0,1);glVertex3f(-1, 1, -0.4 * myScale);
+ glTexCoord2f(1,1); glVertex3f(1, 1, -0.4 * myScale);
+ glTexCoord2f(1,0);glVertex3f(1, -1, -0.4 * myScale);
+ glEnd;
+ glBindTexture(GL_TEXTURE_2D, intro_layer02.TexNum);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex3f(-1, -1, -0.3 * myScale);
+ glTexCoord2f(0,1);glVertex3f(-1, 1, -0.3 * myScale);
+ glTexCoord2f(1,1); glVertex3f(1, 1, -0.3 * myScale);
+ glTexCoord2f(1,0);glVertex3f(1, -1, -0.3 * myScale);
+ glEnd;
+ glBindTexture(GL_TEXTURE_2D, intro_layer03.TexNum);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex3f(-1, -1, -0.2 * myScale);
+ glTexCoord2f(0,1);glVertex3f(-1, 1, -0.2 * myScale);
+ glTexCoord2f(1,1); glVertex3f(1, 1, -0.2 * myScale);
+ glTexCoord2f(1,0);glVertex3f(1, -1, -0.2 * myScale);
+ glEnd;
+ glBindTexture(GL_TEXTURE_2D, intro_layer04.TexNum);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex3f(-1, -1, -0.1 * myScale);
+ glTexCoord2f(0,1);glVertex3f(-1, 1, -0.1 * myScale);
+ glTexCoord2f(1,1); glVertex3f(1, 1, -0.1 * myScale);
+ glTexCoord2f(1,0);glVertex3f(1, -1, -0.1 * myScale);
+ glEnd;
+ glBindTexture(GL_TEXTURE_2D, intro_layer05.TexNum);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex3f(-1, -1, 0 * myScale);
+ glTexCoord2f(0,1);glVertex3f(-1, 1, 0 * myScale);
+ glTexCoord2f(1,1); glVertex3f(1, 1, 0 * myScale);
+ glTexCoord2f(1,0);glVertex3f(1, -1, 0 * myScale);
+ glEnd;
+ glBindTexture(GL_TEXTURE_2D, intro_layer06.TexNum);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex3f(-1, -1, 0.1 * myScale);
+ glTexCoord2f(0,1);glVertex3f(-1, 1, 0.1 * myScale);
+ glTexCoord2f(1,1); glVertex3f(1, 1, 0.1 * myScale);
+ glTexCoord2f(1,0);glVertex3f(1, -1, 0.1 * myScale);
+ glEnd;
+ glBindTexture(GL_TEXTURE_2D, intro_layer07.TexNum);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex3f(-1, -1, 0.2 * myScale);
+ glTexCoord2f(0,1);glVertex3f(-1, 1, 0.2 * myScale);
+ glTexCoord2f(1,1); glVertex3f(1, 1, 0.2 * myScale);
+ glTexCoord2f(1,0);glVertex3f(1, -1, 0.2 * myScale);
+ glEnd;
+ glBindTexture(GL_TEXTURE_2D, intro_layer08.TexNum);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex3f(-1, -1, 0.3 * myScale);
+ glTexCoord2f(0,1);glVertex3f(-1, 1, 0.3 * myScale);
+ glTexCoord2f(1,1); glVertex3f(1, 1, 0.3 * myScale);
+ glTexCoord2f(1,0);glVertex3f(1, -1, 0.3 * myScale);
+ glEnd;
+ glBindTexture(GL_TEXTURE_2D, intro_layer09.TexNum);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex3f(-1, -1, 0.22 * myScale);
+ glTexCoord2f(0,1);glVertex3f(-1, 1, 0.22 * myScale);
+ glTexCoord2f(1,1); glVertex3f(1, 1, 0.22 * myScale);
+ glTexCoord2f(1,0);glVertex3f(1, -1, 0.22 * myScale);
+ glEnd;
+ gldisable(gl_texture_2d);
+ glDisable(GL_BLEND);
+
+ glPopMatrix;
+ End3D;
+
+ // do some sparkling effects
+ if (CTime < Timings[1]) and (CTime > Timings[21]) then
+ begin
+ for k:=1 to 3 do begin
+ l:=410+floor((CTime-Timings[21])/(Timings[1]-Timings[21])*(536-410))+RandomRange(-5,5);
+ j:=floor((Timings[1]-CTime)/22)+RandomRange(285,301);
+ GoldenRec.Spawn(l, j, 1, 16, 0, -1, Flare, 0);
+ end;
+ end;
+
+ // fade to white at end
+ if Ctime > Timings[6] then
+ begin
+ glColor4f(1,1,1,sqr(Ctime-Timings[6])*(Ctime-Timings[6])/sqr(Timings[7]-Timings[6]));
+ glEnable(GL_BLEND);
+ glBegin(GL_QUADS);
+ glVertex2f(0,0);
+ glVertex2f(0,600);
+ glVertex2f(800,600);
+ glVertex2f(800,0);
+ glEnd;
+ glDisable(GL_BLEND);
+ end;
+
+ end;
+ if (CRDTS_Stage=MainPart) then
+ // main credits screen background, scroller, logo and girl
+ begin
+
+ glEnable(GL_TEXTURE_2D);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+
+ glColor4f(1, 1, 1, 1);
+ glBindTexture(GL_TEXTURE_2D, credits_bg_tex.TexNum);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex2f(0, 0);
+ glTexCoord2f(0,600/1024);glVertex2f(0, 600);
+ glTexCoord2f(800/1024,600/1024); glVertex2f(800, 600);
+ glTexCoord2f(800/1024,0);glVertex2f(800, 0);
+ glEnd;
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+
+ // draw scroller
+ Draw_FunkyText;
+
+//#########################################################################
+// draw credits names
+
+// blindy (von links oben reindrehen, nach rechts unten rausdrehen)
+ STime:=Timings[9]-10;
+ Delay:=Timings[10]-Timings[9];
+ if CTime > STime then
+ begin
+ k:=0;
+ ESC_Alpha:=20;
+ for j:=0 to 40 do
+ if Data[j]>=Data[k] then k:=j;
+ if Data[k]>0.25 then ESC_Alpha:=5 else inc(ESC_Alpha);
+ if ESC_Alpha >20 then ESC_Alpha:=20;
+ if ((CTime-STime)<20) then ESC_Alpha:=20;
+ k:=CTime-STime;
+ if CTime <=STime+10 then j:=CTime-STime else j:=10;
+ if (CTime >=STime+Delay-10) then if (CTime <=STime+Delay) then j:=(STime+Delay)-CTime else j:=0;
+ glColor4f(1, 1, 1, ESC_Alpha/20*j/10);
+
+ if (CTime >= STime+10) and (CTime<=STime+12) then begin
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ end;
+
+ glPushMatrix;
+ gltranslatef(0,329,0);
+ if CTime <= STime+10 then begin glrotatef((CTime-STime)*9+270,0,0,1);end;
+ gltranslatef(223,0,0);
+ if CTime >=STime+Delay-10 then if CTime <=STime+Delay then begin
+ gltranslatef(223,0,0);
+ glrotatef((CTime-(STime+Delay-10))*-9,0,0,1);
+ gltranslatef(-223,0,0);
+ end;
+ glBindTexture(GL_TEXTURE_2D, credits_blindy.TexNum);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glEnable(GL_TEXTURE_2D);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex2f(-163, -129);
+ glTexCoord2f(0,1);glVertex2f(-163, 129);
+ glTexCoord2f(1,1); glVertex2f(163, 129);
+ glTexCoord2f(1,0);glVertex2f(163, -129);
+ glEnd;
+ gldisable(gl_texture_2d);
+ gldisable(GL_BLEND);
+ glPopMatrix;
+ end;
+
+// canni (zoom von 0 auf volle grösse und drehung, zoom auf doppelte grösse und nach rechts oben schieben)
+ STime:=Timings[10]-10;
+ Delay:=Timings[11]-Timings[10]+5;
+ if CTime > STime then
+ begin
+ k:=0;
+ ESC_Alpha:=20;
+ for j:=0 to 40 do
+ if Data[j]>=Data[k] then k:=j;
+ if Data[k]>0.25 then ESC_Alpha:=5 else inc(ESC_Alpha);
+ if ESC_Alpha >20 then ESC_Alpha:=20;
+ if ((CTime-STime)<20) then ESC_Alpha:=20;
+ k:=CTime-STime;
+ if CTime <=STime+10 then j:=CTime-STime else j:=10;
+ if (CTime >=STime+Delay-10) then if (CTime <=STime+Delay) then j:=(STime+Delay)-CTime else j:=0;
+ glColor4f(1, 1, 1, ESC_Alpha/20*j/10);
+
+ if (CTime >= STime+20) and (CTime<=STime+22) then begin
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ end;
+
+ glPushMatrix;
+ gltranslatef(223,329,0);
+ if CTime <= STime+20 then begin
+ j:=CTime-Stime;
+ glscalef(j*j/400,j*j/400,j*j/400);
+ glrotatef(j*18.0,0,0,1);
+ end;
+ if CTime >=STime+Delay-10 then if CTime <=STime+Delay then begin
+ j:=CTime-(STime+Delay-10);
+ f:=j*10.0;
+ gltranslatef(f*3,-f,0);
+ glscalef(1+j/10,1+j/10,1+j/10);
+ glrotatef(j*9.0,0,0,1);
+ end;
+ glBindTexture(GL_TEXTURE_2D, credits_canni.TexNum);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glEnable(GL_TEXTURE_2D);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex2f(-163, -129);
+ glTexCoord2f(0,1);glVertex2f(-163, 129);
+ glTexCoord2f(1,1); glVertex2f(163, 129);
+ glTexCoord2f(1,0);glVertex2f(163, -129);
+ glEnd;
+ gldisable(gl_texture_2d);
+ gldisable(GL_BLEND);
+ glPopMatrix;
+ end;
+
+// ggkfc (von links reinschieben, nach rechts oben rausschieben)
+ STime:=Timings[11]-10;
+ Delay:=Timings[12]-Timings[11]+5;
+ if CTime > STime then
+ begin
+ k:=0;
+ ESC_Alpha:=20;
+ for j:=0 to 40 do
+ if Data[j]>=Data[k] then k:=j;
+ if Data[k]>0.25 then ESC_Alpha:=5 else inc(ESC_Alpha);
+ if ESC_Alpha >20 then ESC_Alpha:=20;
+ if ((CTime-STime)<20) then ESC_Alpha:=20;
+ k:=CTime-STime;
+ if CTime <=STime+10 then j:=CTime-STime else j:=10;
+ if (CTime >=STime+Delay-10) then if (CTime <=STime+Delay) then j:=(STime+Delay)-CTime else j:=0;
+ glColor4f(1, 1, 1, ESC_Alpha/20*j/10);
+
+ if (CTime >= STime+10) and (CTime<=STime+12) then begin
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ end;
+
+ glPushMatrix;
+ gltranslatef(223,329,0);
+ if CTime <= STime+10 then begin
+ gltranslatef(((CTime-STime)*21.0)-210,0,0);
+ end;
+ if CTime >=STime+Delay-10 then if CTime <=STime+Delay then begin
+ j:=(CTime-(STime+Delay-10))*21;
+ gltranslatef(j,-j/2,0);
+ end;
+ glBindTexture(GL_TEXTURE_2D, credits_ggkfc.TexNum);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glEnable(GL_TEXTURE_2D);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex2f(-163, -129);
+ glTexCoord2f(0,1);glVertex2f(-163, 129);
+ glTexCoord2f(1,1); glVertex2f(163, 129);
+ glTexCoord2f(1,0);glVertex2f(163, -129);
+ glEnd;
+ gldisable(gl_texture_2d);
+ gldisable(GL_BLEND);
+ glPopMatrix;
+ end;
+
+// jaybinks (von unten reinklappen, nach rechts oben rausklappen)
+ STime:=Timings[12]-10;
+ Delay:=Timings[13]-Timings[12];
+ if CTime > STime then
+ begin
+ k:=0;
+ ESC_Alpha:=20;
+ for j:=0 to 40 do
+ if Data[j]>=Data[k] then k:=j;
+ if Data[k]>0.25 then ESC_Alpha:=5 else inc(ESC_Alpha);
+ if ESC_Alpha >20 then ESC_Alpha:=20;
+ if ((CTime-STime)<20) then ESC_Alpha:=20;
+ k:=CTime-STime;
+ if CTime <=STime+10 then j:=CTime-STime else j:=10;
+ if (CTime >=STime+Delay-10) then if (CTime <=STime+Delay) then j:=(STime+Delay)-CTime else j:=0;
+ glColor4f(1, 1, 1, ESC_Alpha/20*j/10);
+
+ if (CTime >= STime+10) and (CTime<=STime+12) then begin
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ end;
+
+ glPushMatrix;
+ gltranslatef(223,329,0);
+ if CTime <= STime+10 then
+ f:=258.0-25.8*(CTime-STime)
+ else
+ f:=0;
+
+ if CTime >=STime+Delay-10 then if CTime <=STime+Delay then begin
+ j:=CTime-(STime+Delay-10);
+ g:=32.6*j;
+ end else
+ g:=0;
+ glBindTexture(GL_TEXTURE_2D, credits_jaybinks.TexNum);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glEnable(GL_TEXTURE_2D);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex2f(-163+g-f*1.5, -129+f*1.5-g/2);
+ glTexCoord2f(0,1);glVertex2f(-163+g*1.5, 129-(g*1.5*258/326));
+ glTexCoord2f(1,1); glVertex2f(163+g, 129+g/4);
+ glTexCoord2f(1,0);glVertex2f(163+f*1.5+g/4, -129+f*1.5-g/4);
+ glEnd;
+ gldisable(gl_texture_2d);
+ gldisable(GL_BLEND);
+ glPopMatrix;
+ end;
+
+// linnex (just scrolls from left to right, no twinkling stars, no on-beat flashing)
+ STime:=Timings[13]-10;
+ Delay:=Timings[14]-Timings[13]+10;
+ if CTime > STime then
+ begin
+ k:=0;
+ ESC_Alpha:=20;
+ for j:=0 to 40 do
+ if Data[j]>=Data[k] then k:=j;
+ if Data[k]>0.25 then ESC_Alpha:=5 else inc(ESC_Alpha);
+ if ESC_Alpha >20 then ESC_Alpha:=20;
+ if ((CTime-STime)<20) then ESC_Alpha:=20;
+ k:=CTime-STime;
+ if CTime <=STime+10 then j:=CTime-STime else j:=10;
+ if (CTime >=STime+Delay-10) then if (CTime <=STime+Delay) then j:=(STime+Delay)-CTime else j:=0;
+ glColor4f(1, 1, 1, ESC_Alpha/20*j/10);
+
+ if (CTime >= STime+10) and (CTime<=STime+12) then begin
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ end;
+
+
+ glPushMatrix;
+ gltranslatef(223,329,0);
+ if CTime <= STime+10 then begin
+ gltranslatef(223,0,0);
+ glrotatef((10-(CTime-STime))*9,0,0,1);
+ gltranslatef(-223,0,0);
+ end;
+ if CTime >=STime+Delay-10 then if CTime <=STime+Delay then begin
+ j:=CTime-(STime+Delay-10);
+ f:=j*10.0;
+ gltranslatef(-f*2,-f,0);
+ glscalef(1-j/10,1-j/10,1-j/10);
+ glrotatef(-j*9.0,0,0,1);
+ end;
+ glBindTexture(GL_TEXTURE_2D, credits_linnex.TexNum);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glEnable(GL_TEXTURE_2D);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex2f(-163, -129);
+ glTexCoord2f(0,1);glVertex2f(-163, 129);
+ glTexCoord2f(1,1); glVertex2f(163, 129);
+ glTexCoord2f(1,0);glVertex2f(163, -129);
+ glEnd;
+ gldisable(gl_texture_2d);
+ gldisable(GL_BLEND);
+ glPopMatrix;
+ end;
+
+// Mog (von links reinklappen, nach rechts unten rausklappen)
+ STime:=Timings[14]-10;
+ Delay:=Timings[15]-Timings[14]+5;
+ if CTime > STime then
+ begin
+ k:=0;
+ ESC_Alpha:=20;
+ for j:=0 to 40 do
+ if Data[j]>=Data[k] then k:=j;
+ if Data[k]>0.25 then ESC_Alpha:=5 else inc(ESC_Alpha);
+ if ESC_Alpha >20 then ESC_Alpha:=20;
+ if ((CTime-STime)<20) then ESC_Alpha:=20;
+ k:=CTime-STime;
+ if CTime <=STime+10 then j:=CTime-STime else j:=10;
+ if (CTime >=STime+Delay-10) then if (CTime <=STime+Delay) then j:=(STime+Delay)-CTime else j:=0;
+ glColor4f(1, 1, 1, ESC_Alpha/20*j/10);
+
+ if (CTime >= STime+10) and (CTime<=STime+12) then begin
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ end;
+
+ glPushMatrix;
+ gltranslatef(223,329,0);
+ if CTime <= STime+10 then
+ f:=326.0-32.6*(CTime-STime)
+ else
+ f:=0;
+
+ if CTime >=STime+Delay-10 then if CTime <=STime+Delay then begin
+ j:=CTime-(STime+Delay-10);
+ g:=32.6*j;
+ end else
+ g:=0;
+ glBindTexture(GL_TEXTURE_2D, credits_mog.TexNum);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glEnable(GL_TEXTURE_2D);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex2f(-163+g*1.5, -129+g*1.5);
+ glTexCoord2f(0,1);glVertex2f(-163+g*1.2, 129+g);
+ glTexCoord2f(1,1); glVertex2f(163-f+g/2, 129+f*1.5+g/4);
+ glTexCoord2f(1,0);glVertex2f(163-f+g*1.5, -129-f*1.5);
+ glEnd;
+ gldisable(gl_texture_2d);
+ gldisable(GL_BLEND);
+ glPopMatrix;
+ end;
+
+// omgdutch (von rechts oben reindrehen, nach links unten rausschieben und verkleinern und dabei drehen)
+ STime:=Timings[15]-10;
+ Delay:=Timings[16]-Timings[15]+5;
+ if CTime > STime then
+ begin
+ k:=0;
+ ESC_Alpha:=20;
+ for j:=0 to 40 do
+ if Data[j]>=Data[k] then k:=j;
+ if Data[k]>0.25 then ESC_Alpha:=5 else inc(ESC_Alpha);
+ if ESC_Alpha >20 then ESC_Alpha:=20;
+ if ((CTime-STime)<20) then ESC_Alpha:=20;
+ k:=CTime-STime;
+ if CTime <=STime+10 then j:=CTime-STime else j:=10;
+ if (CTime >=STime+Delay-10) then if (CTime <=STime+Delay) then j:=(STime+Delay)-CTime else j:=0;
+ glColor4f(1, 1, 1, ESC_Alpha/20*j/10);
+
+ if (CTime >= STime+10) and (CTime<=STime+12) then begin
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ end;
+
+ glPushMatrix;
+ gltranslatef(223,329,0);
+ if CTime <= STime+10 then begin
+ gltranslatef(223,0,0);
+ glrotatef((10-(CTime-STime))*9,0,0,1);
+ gltranslatef(-223,0,0);
+ end;
+ if CTime >=STime+Delay-10 then if CTime <=STime+Delay then begin
+ j:=CTime-(STime+Delay-10);
+ f:=j*10.0;
+ gltranslatef(-f*2,-f,0);
+ glscalef(1-j/10,1-j/10,1-j/10);
+ glrotatef(-j*9.0,0,0,1);
+ end;
+ glBindTexture(GL_TEXTURE_2D, credits_omgdutch.TexNum);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glEnable(GL_TEXTURE_2D);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex2f(-163, -129);
+ glTexCoord2f(0,1);glVertex2f(-163, 129);
+ glTexCoord2f(1,1); glVertex2f(163, 129);
+ glTexCoord2f(1,0);glVertex2f(163, -129);
+ glEnd;
+ gldisable(gl_texture_2d);
+ gldisable(GL_BLEND);
+ glPopMatrix;
+ end;
+
+// Skillmaster (von rechts unten reinschieben, nach rechts oben rausdrehen)
+ STime:=Timings[16]-10;
+ Delay:=Timings[17]-Timings[16]+5;
+ if CTime > STime then
+ begin
+ k:=0;
+ ESC_Alpha:=20;
+ for j:=0 to 40 do
+ if Data[j]>=Data[k] then k:=j;
+ if Data[k]>0.25 then ESC_Alpha:=5 else inc(ESC_Alpha);
+ if ESC_Alpha >20 then ESC_Alpha:=20;
+ if ((CTime-STime)<20) then ESC_Alpha:=20;
+ k:=CTime-STime;
+ if CTime <=STime+10 then j:=CTime-STime else j:=10;
+ if (CTime >=STime+Delay-10) then if (CTime <=STime+Delay) then j:=(STime+Delay)-CTime else j:=0;
+ glColor4f(1, 1, 1, ESC_Alpha/20*j/10);
+
+ if (CTime >= STime+10) and (CTime<=STime+12) then begin
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ end;
+
+ glPushMatrix;
+ gltranslatef(223,329,0);
+ if CTime <= STime+10 then begin
+ j:=STime+10-CTime;
+ f:=j*10.0;
+ gltranslatef(+f*2,+f/2,0);
+ end;
+ if CTime >=STime+Delay-10 then if CTime <=STime+Delay then begin
+ j:=CTime-(STime+Delay-10);
+ f:=j*10.0;
+ gltranslatef(0,-223,0);
+ glrotatef(j*-9,0,0,1);
+ gltranslatef(0,223,0);
+ glrotatef(j*9,0,0,1);
+ end;
+ glBindTexture(GL_TEXTURE_2D, credits_skillmaster.TexNum);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glEnable(GL_TEXTURE_2D);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex2f(-163, -129);
+ glTexCoord2f(0,1);glVertex2f(-163, 129);
+ glTexCoord2f(1,1); glVertex2f(163, 129);
+ glTexCoord2f(1,0);glVertex2f(163, -129);
+ glEnd;
+ gldisable(gl_texture_2d);
+ gldisable(GL_BLEND);
+ glPopMatrix;
+ end;
+
+// WhiteShark (von links unten reinklappen, nach rechts oben rausklappen)
+ STime:=Timings[17]-10;
+ Delay:=Timings[18]-Timings[17];
+ if CTime > STime then
+ begin
+ k:=0;
+ ESC_Alpha:=20;
+ for j:=0 to 40 do
+ if Data[j]>=Data[k] then k:=j;
+ if Data[k]>0.25 then ESC_Alpha:=5 else inc(ESC_Alpha);
+ if ESC_Alpha >20 then ESC_Alpha:=20;
+ if ((CTime-STime)<20) then ESC_Alpha:=20;
+ k:=CTime-STime;
+ if CTime <=STime+10 then j:=CTime-STime else j:=10;
+ if (CTime >=STime+Delay-10) then if (CTime <=STime+Delay) then j:=(STime+Delay)-CTime else j:=0;
+ glColor4f(1, 1, 1, ESC_Alpha/20*j/10);
+
+ if (CTime >= STime+10) and (CTime<=STime+12) then begin
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 0);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 1);
+ GoldenRec.Spawn(RandomRange(65,390), RandomRange(200,460), 1, 16, 0, -1, PerfectLineTwinkle, 5);
+ end;
+
+ glPushMatrix;
+ gltranslatef(223,329,0);
+ if CTime <= STime+10 then
+ f:=326.0-32.6*(CTime-STime)
+ else
+ f:=0;
+
+ if CTime >=STime+Delay-10 then if CTime <=STime+Delay then begin
+ j:=CTime-(STime+Delay-10);
+ g:=32.6*j;
+ end else
+ g:=0;
+ glBindTexture(GL_TEXTURE_2D, credits_whiteshark.TexNum);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glEnable(GL_TEXTURE_2D);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex2f(-163-f+g, -129+f/4-g/2);
+ glTexCoord2f(0,1);glVertex2f(-163-f/4+g, 129+g/2+f/4);
+ glTexCoord2f(1,1); glVertex2f(163-f*1.2+g/4, 129+f/2-g/4);
+ glTexCoord2f(1,0);glVertex2f(163-f*1.5+g/4, -129+f*1.5+g/4);
+ glEnd;
+ gldisable(gl_texture_2d);
+ gldisable(GL_BLEND);
+ glPopMatrix;
+ end;
+
+
+// ####################################################################
+// do some twinkle stuff (kinda on beat)
+ if (CTime>Timings[8]) and (CTime < Timings[19]) then begin
+ k:=0;
+ for j:=0 to 40 do
+ if Data[j]>=Data[k] then k:=j;
+ if Data[k]>0.2 then begin
+ l:=RandomRange(6,16);
+ j:=RandomRange(0,27);
+ GoldenRec.Spawn(myLogoCoords[j,0], myLogoCoords[j,1], 16-l, l, 0, -1, PerfectNote, 0);
+ end;
+ end;
+
+//#################################################
+// draw the rest of the main screen (girl and logo
+ glEnable(GL_TEXTURE_2D);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+ glColor4f(1, 1, 1, 1);
+ glBindTexture(GL_TEXTURE_2D, credits_bg_ovl.TexNum);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex2f(800-393, 0);
+ glTexCoord2f(0,600/1024);glVertex2f(800-393, 600);
+ glTexCoord2f(393/512,600/1024); glVertex2f(800, 600);
+ glTexCoord2f(393/512,0);glVertex2f(800, 0);
+ glEnd;
+{ glBindTexture(GL_TEXTURE_2D, credits_bg_logo.TexNum);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex2f(0, 0);
+ glTexCoord2f(0,112/128);glVertex2f(0, 112);
+ glTexCoord2f(497/512,112/128); glVertex2f(497, 112);
+ glTexCoord2f(497/512,0);glVertex2f(497, 0);
+ glEnd;
+}
+ gldisable(gl_texture_2d);
+ glDisable(GL_BLEND);
+
+ // fade out at end of main part
+ if Ctime > Timings[19] then
+ begin
+ glColor4f(0,0,0,(Ctime-Timings[19])/(Timings[20]-Timings[19]));
+ glEnable(GL_BLEND);
+ glBegin(GL_QUADS);
+ glVertex2f(0,0);
+ glVertex2f(0,600);
+ glVertex2f(800,600);
+ glVertex2f(800,0);
+ glEnd;
+ glDisable(GL_BLEND);
+ end;
+ end
+ else
+ if (CRDTS_Stage=Outro) then
+ begin
+ if CTime=Timings[20] then begin
+ CTime_hold:=0;
+ Music.Stop;
+ Music.Open(soundpath + 'credits-outro-tune.mp3');
+ Music.Play;
+ Music.SetVolume(20);
+ Music.SetLoop(True);
+ end;
+ if CTime_hold > 231 then begin
+ Music.Play;
+ Ctime_hold:=0;
+ end;
+ glClearColor(0,0,0,0);
+ glClear(GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT);
+
+ // do something useful
+ // outro background
+ glEnable(GL_TEXTURE_2D);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+ glEnable(GL_BLEND);
+
+ glColor4f(1, 1, 1, 1);
+ glBindTexture(GL_TEXTURE_2D, outro_bg.TexNum);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex2f(0, 0);
+ glTexCoord2f(0,600/1024);glVertex2f(0, 600);
+ glTexCoord2f(800/1024,600/1024); glVertex2f(800, 600);
+ glTexCoord2f(800/1024,0);glVertex2f(800, 0);
+ glEnd;
+
+ //outro overlays
+ glColor4f(1, 1, 1, (1+sin(CTime/15))/3+1/3);
+ glBindTexture(GL_TEXTURE_2D, outro_esc.TexNum);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex2f(0, 0);
+ glTexCoord2f(0,223/256);glVertex2f(0, 223);
+ glTexCoord2f(487/512,223/256); glVertex2f(487, 223);
+ glTexCoord2f(487/512,0);glVertex2f(487, 0);
+ glEnd;
+
+ ESC_Alpha:=20;
+ if (RandomRange(0,20) > 18) and (ESC_Alpha=20) then
+ ESC_Alpha:=0
+ else inc(ESC_Alpha);
+ if ESC_Alpha > 20 then ESC_Alpha:=20;
+ glColor4f(1, 1, 1, ESC_Alpha/20);
+ glBindTexture(GL_TEXTURE_2D, outro_exd.TexNum);
+ glbegin(gl_quads);
+ glTexCoord2f(0,0);glVertex2f(800-310, 600-247);
+ glTexCoord2f(0,247/256);glVertex2f(800-310, 600);
+ glTexCoord2f(310/512,247/256); glVertex2f(800, 600);
+ glTexCoord2f(310/512,0);glVertex2f(800, 600-247);
+ glEnd;
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+
+ // outro scrollers?
+ // ...
+ end;
+
+{ // draw credits runtime counter
+ SetFontStyle (2);
+ SetFontItalic(False);
+ SetFontSize(9);
+ SetFontPos (5, 5);
+ glColor4f(1, 1, 1, 1);
+// RuntimeStr:='CTime: '+inttostr(floor(CTime/30.320663991914489602156136106092))+'.'+inttostr(floor(CTime/3.0320663991914489602156136106092)-floor(CTime/30.320663991914489602156136106092)*10);
+ RuntimeStr:='CTime: '+inttostr(CTime);
+ glPrint (Addr(RuntimeStr[1]));
+}
+ // make the stars shine
+ GoldenRec.Draw;
+
+ //timing hack
+// Draw_FunkyText;
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenEdit.pas b/Game/Code/Screens/UScreenEdit.pas
new file mode 100644
index 00000000..b78df989
--- /dev/null
+++ b/Game/Code/Screens/UScreenEdit.pas
@@ -0,0 +1,109 @@
+unit UScreenEdit;
+
+interface
+
+uses UMenu, SDL, UThemes;
+
+type
+ TScreenEdit = class(TMenu)
+ public
+{ Tex_Background: TTexture;
+ FadeOut: boolean;
+ Path: string;
+ FileName: string;}
+ constructor Create; override;
+ procedure onShow; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+{ function Draw: boolean; override;
+ procedure Finish;}
+ end;
+
+implementation
+
+uses UGraphic, UMusic, USkins;
+
+function TScreenEdit.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ Music.PlayBack;
+ FadeTo(@ScreenMain);
+// Result := false;
+ end;
+ SDLK_RETURN:
+ begin
+ if Interaction = 0 then begin
+ Music.PlayStart;
+ FadeTo(@ScreenEditConvert);
+ end;
+// if Interaction = 1 then begin
+// Music.PlayStart;
+// FadeTo(@ScreenEditHeader);
+// end;
+
+ if Interaction = 1 then begin
+ Music.PlayBack;
+ FadeTo(@ScreenMain);
+ end;
+ end;
+
+ SDLK_DOWN:
+ begin
+ InteractNext;
+ end;
+ SDLK_UP:
+ begin
+ InteractPrev;
+ end;
+ end;
+ end;
+end;
+
+constructor TScreenEdit.Create;
+begin
+ inherited Create;
+ AddButton(400-200, 100 + 0*70, 400, 40, Skin.GetTextureFileName('ButtonF'));
+ AddButtonText(10, 5, 0, 0, 0, 'Convert Midi to Txt');
+// Button[High(Button)].Text[0].Size := 11;
+
+// AddButton(400-200, 100 + 1*60, 400, 40, 'ButtonF');
+// AddButtonText(10, 5, 0, 0, 0, 'Edit Headers');
+
+// AddButton(400-200, 100 + 2*60, 400, 40, 'ButtonF');
+// AddButtonText(10, 5, 0, 0, 0, 'Set GAP');
+
+ AddButton(400-200, 100 + 3*60, 400, 40, Skin.GetTextureFileName('ButtonF'));
+ AddButtonText(10, 5, 0, 0, 0, 'Exit');
+
+end;
+
+procedure TScreenEdit.onShow;
+begin
+// Interaction := 0;
+end;
+
+(*function TScreenEdit.Draw: boolean;
+var
+ Min: integer;
+ Sec: integer;
+ Tekst: string;
+ Pet: integer;
+ AktBeat: integer;
+begin
+end;
+
+procedure TScreenEdit.Finish;
+begin
+//
+end;*)
+
+end.
diff --git a/Game/Code/Screens/UScreenEditConvert.pas b/Game/Code/Screens/UScreenEditConvert.pas
new file mode 100644
index 00000000..d19d95e3
--- /dev/null
+++ b/Game/Code/Screens/UScreenEditConvert.pas
@@ -0,0 +1,531 @@
+unit UScreenEditConvert;
+
+interface
+
+uses UMenu, SDL, MidiFile, MidiOut, ULog, USongs, UMusic, UThemes;
+
+type
+ TNote = record
+ Event: integer;
+ EventType: integer;
+ Channel: integer;
+ Start: real;
+ Len: real;
+ Data1: integer;
+ Data2: integer;
+ Str: string;
+ end;
+
+ TTrack = record
+ Note: array of TNote;
+ Name: string;
+ Hear: boolean;
+ Status: byte; // 0 - none, 1 - notes, 2 - lyrics, 3 - notes + lyrics
+ end;
+
+ TNuta = record
+ Start: integer;
+ Len: integer;
+ Tone: integer;
+ Lyric: string;
+ NewSentence: boolean;
+ end;
+
+ TArrayTrack = array of TTrack;
+
+ TScreenEditConvert = class(TMenu)
+ public
+ ATrack: TArrayTrack; // actual track
+// Track: TArrayTrack;
+ Channel: TArrayTrack;
+ ColR: array[0..100] of real;
+ ColG: array[0..100] of real;
+ ColB: array[0..100] of real;
+ Len: real;
+ Sel: integer;
+ Selected: boolean;
+// FileName: string;
+ MidiFile: TMidiFile;
+ MidiTrack: TMidiTrack;
+ MidiEvent: pMidiEvent;
+ MidiOut: TMidiOutput;
+ Song: TSong;
+ Czesc: TCzesci;
+ BPM: real;
+ Ticks: real;
+ Nuta: array of TNuta;
+
+ procedure AddLyric(Start: integer; Tekst: string);
+ procedure Extract;
+
+ procedure MidiFile1MidiEvent(event: PMidiEvent);
+ function SelectedNumber: integer;
+ constructor Create; override;
+ procedure onShow; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ function Draw: boolean; override;
+ procedure onHide; override;
+ end;
+
+implementation
+uses UGraphic, SysUtils, UDrawTexture, TextGL, UFiles, UMain, UIni, gl, USkins;
+
+function TScreenEditConvert.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+var
+ T: integer;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE:
+ begin
+ MidiFile.StopPlaying;
+ Music.PlayBack;
+ FadeTo(@ScreenEdit);
+ end;
+
+ SDLK_RETURN:
+ begin
+ if Interaction = 0 then begin
+ Music.PlayStart;
+ ScreenOpen.BackScreen := @ScreenEditConvert;
+ FadeTo(@ScreenOpen);
+ end;
+
+ if Interaction = 1 then begin
+ Selected := false;
+ MidiFile.OnMidiEvent := MidiFile1MidiEvent;
+// MidiFile.GoToTime(MidiFile.GetTrackLength div 2);
+ MidiFile.StartPlaying;
+ end;
+
+ if Interaction = 2 then begin
+ Selected := true;
+ MidiFile.OnMidiEvent := nil;
+ {for T := 0 to High(ATrack) do begin
+ if ATrack[T].Hear then begin
+ MidiTrack := MidiFile.GetTrack(T);
+ MidiTrack.OnMidiEvent := MidiFile1MidiEvent;
+ end;
+ end;
+ MidiFile.StartPlaying;//}
+ end;
+
+ if Interaction = 3 then begin
+ if SelectedNumber > 0 then begin
+ Extract;
+ SaveSong(Song, Czesc, ChangeFileExt(FileName, '.txt'), false);
+ end;
+ end;
+
+ end;
+
+ SDLK_SPACE:
+ begin
+// ATrack[Sel].Hear := not ATrack[Sel].Hear;
+ ATrack[Sel].Status := (ATrack[Sel].Status + 1) mod 4;
+
+{ if Selected then begin
+ MidiTrack := MidiFile.GetTrack(Sel);
+ if Track[Sel].Hear then
+ MidiTrack.OnMidiEvent := MidiFile1MidiEvent
+ else
+ MidiTrack.OnMidiEvent := nil;
+ end;}
+ end;
+
+ SDLK_RIGHT:
+ begin
+ InteractNext;
+ end;
+
+ SDLK_LEFT:
+ begin
+ InteractPrev;
+ end;
+
+ SDLK_DOWN:
+ begin
+ Inc(Sel);
+ if Sel > High(ATrack) then Sel := 0;
+ end;
+ SDLK_UP:
+ begin
+ Dec(Sel);
+ if Sel < 0 then Sel := High(ATrack);
+ end;
+ end;
+ end;
+end;
+
+procedure TScreenEditConvert.AddLyric(Start: integer; Tekst: string);
+var
+ N: integer;
+begin
+ for N := 0 to High(Nuta) do begin
+ if Nuta[N].Start = Start then begin
+ // check for new sentece
+ if Copy(Tekst, 1, 1) = '\' then Delete(Tekst, 1, 1);
+ if Copy(Tekst, 1, 1) = '/' then begin
+ Delete(Tekst, 1, 1);
+ Nuta[N].NewSentence := true;
+ end;
+
+ // overwrite lyric od append
+ if Nuta[N].Lyric = '-' then
+ Nuta[N].Lyric := Tekst
+ else
+ Nuta[N].Lyric := Nuta[N].Lyric + Tekst;
+ end;
+ end;
+end;
+
+procedure TScreenEditConvert.Extract;
+var
+ T: integer;
+ C: integer;
+ N: integer;
+ Nu: integer;
+ NutaTemp: TNuta;
+ Move: integer;
+ Max, Min: integer;
+begin
+ // song info
+ Song.Title := '';
+ Song.Artist := '';
+ Song.Mp3 := '';
+ Song.Resolution := 4;
+ SetLength(Song.BPM, 1);
+ Song.BPM[0].BPM := BPM*4;
+
+ SetLength(Nuta, 0);
+
+ // extract notes
+ for T := 0 to High(ATrack) do begin
+// if ATrack[T].Hear then begin
+ if ((ATrack[T].Status div 1) and 1) = 1 then begin
+ for N := 0 to High(ATrack[T].Note) do begin
+ if (ATrack[T].Note[N].EventType = 9) and (ATrack[T].Note[N].Data2 > 0) then begin
+ Nu := Length(Nuta);
+ SetLength(Nuta, Nu + 1);
+ Nuta[Nu].Start := Round(ATrack[T].Note[N].Start / Ticks);
+ Nuta[Nu].Len := Round(ATrack[T].Note[N].Len / Ticks);
+ Nuta[Nu].Tone := ATrack[T].Note[N].Data1 - 12*5;
+ Nuta[Nu].Lyric := '-';
+ end;
+ end;
+ end;
+ end;
+
+ // extract lyrics
+ for T := 0 to High(ATrack) do begin
+// if ATrack[T].Hear then begin
+ if ((ATrack[T].Status div 2) and 1) = 1 then begin
+ for N := 0 to High(ATrack[T].Note) do begin
+ if (ATrack[T].Note[N].EventType = 15) then begin
+// Log.LogStatus('<' + Track[T].Note[N].Str + '>', 'MIDI');
+ AddLyric(Round(ATrack[T].Note[N].Start / Ticks), ATrack[T].Note[N].Str);
+ end;
+ end;
+ end;
+ end;
+
+ // sort notes
+ for N := 0 to High(Nuta) do
+ for Nu := 0 to High(Nuta)-1 do
+ if Nuta[Nu].Start > Nuta[Nu+1].Start then begin
+ NutaTemp := Nuta[Nu];
+ Nuta[Nu] := Nuta[Nu+1];
+ Nuta[Nu+1] := NutaTemp;
+ end;
+
+ // move to 0 at beginning
+ Move := Nuta[0].Start;
+ for N := 0 to High(Nuta) do
+ Nuta[N].Start := Nuta[N].Start - Move;
+
+ // copy notes
+ SetLength(Czesc.Czesc, 1);
+ Czesc.Ilosc := 1;
+ Czesc.High := 0;
+
+ C := 0;
+ N := 0;
+ Czesc.Czesc[C].IlNut := 0;
+ Czesc.Czesc[C].HighNut := -1;
+
+ for Nu := 0 to High(Nuta) do begin
+ if Nuta[Nu].NewSentence then begin // nowa linijka
+ SetLength(Czesc.Czesc, Length(Czesc.Czesc)+1);
+ Czesc.Ilosc := Czesc.Ilosc + 1;
+ Czesc.High := Czesc.High + 1;
+ C := C + 1;
+ N := 0;
+ SetLength(Czesc.Czesc[C].Nuta, 0);
+ Czesc.Czesc[C].IlNut := 0;
+ Czesc.Czesc[C].HighNut := -1;
+
+ //Calculate Start of the Last Sentence
+ if (C > 0) and (Nu > 0) then
+ begin
+ Max := Nuta[Nu].Start;
+ Min := Nuta[Nu-1].Start + Nuta[Nu-1].Len;
+
+ case (Max - Min) of
+ 0: Czesc.Czesc[C].Start := Max;
+ 1: Czesc.Czesc[C].Start := Max;
+ 2: Czesc.Czesc[C].Start := Max - 1;
+ 3: Czesc.Czesc[C].Start := Max - 2;
+ else
+ if ((Max - Min) > 4) then
+ Czesc.Czesc[C].Start := Min + 2
+ else
+ Czesc.Czesc[C].Start := Max;
+
+ end; // case
+
+ end;
+ end;
+
+ // tworzy miejsce na nowa nute
+ SetLength(Czesc.Czesc[C].Nuta, Length(Czesc.Czesc[C].Nuta)+1);
+ Czesc.Czesc[C].IlNut := Czesc.Czesc[C].IlNut + 1;
+ Czesc.Czesc[C].HighNut := Czesc.Czesc[C].HighNut + 1;
+
+ // dopisuje
+ Czesc.Czesc[C].Nuta[N].Start := Nuta[Nu].Start;
+ Czesc.Czesc[C].Nuta[N].Dlugosc := Nuta[Nu].Len;
+ Czesc.Czesc[C].Nuta[N].Ton := Nuta[Nu].Tone;
+ Czesc.Czesc[C].Nuta[N].Tekst := Nuta[Nu].Lyric;
+ //All Notes are Freestyle when Converted Fix:
+ Czesc.Czesc[C].Nuta[N].Wartosc := 1;
+ Inc(N);
+ end;
+end;
+
+function TScreenEditConvert.SelectedNumber: integer;
+var
+ T: integer; // track
+begin
+ Result := 0;
+ for T := 0 to High(ATrack) do
+// if ATrack[T].Hear then Inc(Result);
+ if ((ATrack[T].Status div 1) and 1) = 1 then Inc(Result);
+end;
+
+procedure TScreenEditConvert.MidiFile1MidiEvent(event: PMidiEvent);
+begin
+// Log.LogStatus(IntToStr(event.event), 'MIDI');
+ MidiOut.PutShort(event.event, event.data1, event.data2);
+end;
+
+constructor TScreenEditConvert.Create;
+var
+ P: integer;
+begin
+ inherited Create;
+ AddButton(40, 20, 100, 40, Skin.GetTextureFileName('ButtonF'));
+ AddButtonText(15, 5, 0, 0, 0, 'Open');
+// Button[High(Button)].Text[0].Size := 11;
+
+ AddButton(160, 20, 100, 40, Skin.GetTextureFileName('ButtonF'));
+ AddButtonText(25, 5, 0, 0, 0, 'Play');
+
+ AddButton(280, 20, 200, 40, Skin.GetTextureFileName('ButtonF'));
+ AddButtonText(25, 5, 0, 0, 0, 'Play Selected');
+
+ AddButton(500, 20, 100, 40, Skin.GetTextureFileName('ButtonF'));
+ AddButtonText(20, 5, 0, 0, 0, 'Save');
+
+
+{ MidiOut := TMidiOutput.Create(nil);
+// MidiOut.Close;
+// MidiOut.DeviceID := 0;
+ if Ini.Debug = 1 then
+ MidiOut.ProductName := 'Microsoft GS Wavetable SW Synth'; // for my kxproject without midi table
+ Log.LogStatus(MidiOut.ProductName, 'MIDI');
+ MidiOut.Open;
+// MidiOut.SetVolume(100, 100); // temporary}
+
+ FileName := GamePath + 'file.mid';
+ MidiFile := TMidiFile.Create(nil);
+
+ for P := 0 to 100 do begin
+ ColR[P] := Random(10)/10;
+ ColG[P] := Random(10)/10;
+ ColB[P] := Random(10)/10;
+ end;
+
+end;
+
+procedure TScreenEditConvert.onShow;
+var
+ T: integer; // track
+ N: integer; // note
+ C: integer; // channel
+ CN: integer; // channel note
+begin
+ MidiOut := TMidiOutput.Create(nil);
+ if Ini.Debug = 1 then
+ MidiOut.ProductName := 'Microsoft GS Wavetable SW Synth'; // for my kxproject without midi table
+ Log.LogStatus(MidiOut.ProductName, 'MIDI');
+ MidiOut.Open;
+
+
+ if FileExists(FileName) then begin
+ MidiFile.Filename := FileName;
+ MidiFile.ReadFile;
+
+
+ Len := 0;
+ Sel := 0;
+ BPM := MidiFile.Bpm;
+ Ticks := MidiFile.TicksPerQuarter / 4;
+
+{ for T := 0 to MidiFile.NumberOfTracks-1 do begin
+ SetLength(Track, Length(Track)+1);
+ MidiTrack := MidiFile.GetTrack(T);
+ MidiTrack.OnMidiEvent := MidiFile1MidiEvent;
+ Track[T].Name := MidiTrack.getName;
+
+ for N := 0 to MidiTrack.getEventCount-1 do begin
+ SetLength(Track[T].Note, Length(Track[T].Note)+1);
+ MidiEvent := MidiTrack.GetEvent(N);
+ Track[T].Note[N].Start := MidiEvent.time;
+ Track[T].Note[N].Len := MidiEvent.len;
+ Track[T].Note[N].Event := MidiEvent.event;
+ Track[T].Note[N].EventType := MidiEvent.event div 16;
+ Track[T].Note[N].Channel := MidiEvent.event and 15;
+ Track[T].Note[N].Data1 := MidiEvent.data1;
+ Track[T].Note[N].Data2 := MidiEvent.data2;
+ Track[T].Note[N].Str := MidiEvent.str;
+
+ if Track[T].Note[N].Start + Track[T].Note[N].Len > Len then
+ Len := Track[T].Note[N].Start + Track[T].Note[N].Len;
+ end;
+ end;}
+
+
+ SetLength(Channel, 16);
+ for T := 0 to 15 do
+ begin
+ Channel[T].Name := IntToStr(T+1);
+ SetLength(Channel[T].Note, 0);
+ Channel[T].Status := 0;
+ end;
+
+ for T := 0 to MidiFile.NumberOfTracks-1 do begin
+ MidiTrack := MidiFile.GetTrack(T);
+ MidiTrack.OnMidiEvent := MidiFile1MidiEvent;
+
+ for N := 0 to MidiTrack.getEventCount-1 do begin
+ MidiEvent := MidiTrack.GetEvent(N);
+ C := MidiEvent.event and 15;
+
+ CN := Length(Channel[C].Note);
+ SetLength(Channel[C].Note, CN+1);
+
+ Channel[C].Note[CN].Start := MidiEvent.time;
+ Channel[C].Note[CN].Len := MidiEvent.len;
+ Channel[C].Note[CN].Event := MidiEvent.event;
+ Channel[C].Note[CN].EventType := MidiEvent.event div 16;
+ Channel[C].Note[CN].Channel := MidiEvent.event and 15;
+ Channel[C].Note[CN].Data1 := MidiEvent.data1;
+ Channel[C].Note[CN].Data2 := MidiEvent.data2;
+ Channel[C].Note[CN].Str := MidiEvent.str;
+
+ if Channel[C].Note[CN].Start + Channel[C].Note[CN].Len > Len then
+ Len := Channel[C].Note[CN].Start + Channel[C].Note[CN].Len;
+ end;
+ end;
+ ATrack := Channel;
+
+ end;
+
+ Interaction := 0;
+end;
+
+function TScreenEditConvert.Draw: boolean;
+var
+ Pet: integer;
+ Pet2: integer;
+ Bottom: real;
+ X: real;
+ Y: real;
+ H: real;
+ YSkip: real;
+begin
+ // draw static menu
+ inherited Draw;
+
+ Y := 100;
+
+ H := Length(ATrack)*40;
+ if H > 480 then H := 480;
+ Bottom := Y + H;
+
+ YSkip := H / Length(ATrack);
+
+ // select
+ DrawQuad(10, Y+Sel*YSkip, 780, YSkip, 0.8, 0.8, 0.8);
+
+ // selected - now me use Status System
+ for Pet := 0 to High(ATrack) do
+ if ATrack[Pet].Hear then
+ DrawQuad(10, Y+Pet*YSkip, 50, YSkip, 0.8, 0.3, 0.3);
+ glColor3f(0, 0, 0);
+ for Pet := 0 to High(ATrack) do begin
+ if ((ATrack[Pet].Status div 1) and 1) = 1 then begin
+ SetFontPos(25, Y + Pet*YSkip + 10);
+ SetFontSize(5);
+ glPrint('N');
+ end;
+ if ((ATrack[Pet].Status div 2) and 1) = 1 then begin
+ SetFontPos(40, Y + Pet*YSkip + 10);
+ SetFontSize(5);
+ glPrint('L');
+ end;
+ end;
+
+ DrawLine(10, Y, 10, Bottom, 0, 0, 0);
+ DrawLine(60, Y, 60, Bottom, 0, 0, 0);
+ DrawLine(790, Y, 790, Bottom, 0, 0, 0);
+
+ for Pet := 0 to Length(ATrack) do
+ DrawLine(10, Y+Pet*YSkip, 790, Y+Pet*YSkip, 0, 0, 0);
+
+ for Pet := 0 to High(ATrack) do begin
+ SetFontPos(11, Y + 10 + Pet*YSkip);
+ SetFontSize(5);
+ glPrint(pchar(ATrack[Pet].Name));
+ end;
+
+ for Pet := 0 to High(ATrack) do
+ for Pet2 := 0 to High(ATrack[Pet].Note) do begin
+ if ATrack[Pet].Note[Pet2].EventType = 9 then
+ DrawQuad(60 + ATrack[Pet].Note[Pet2].Start/Len * 725, Y + (Pet+1)*YSkip - ATrack[Pet].Note[Pet2].Data1*35/127, 3, 3, ColR[Pet], ColG[Pet], ColB[Pet]);
+ if ATrack[Pet].Note[Pet2].EventType = 15 then
+ DrawLine(60 + ATrack[Pet].Note[Pet2].Start/Len * 725, Y + 0.75 * YSkip + Pet*YSkip, 60 + ATrack[Pet].Note[Pet2].Start/Len * 725, Y + YSkip + Pet*YSkip, ColR[Pet], ColG[Pet], ColB[Pet]);
+ end;
+
+ // playing line
+ X := 60+MidiFile.GetCurrentTime/MidiFile.GetTrackLength*730;
+ DrawLine(X, Y, X, Bottom, 0.3, 0.3, 0.3);
+
+
+end;
+
+procedure TScreenEditConvert.onHide;
+begin
+ MidiOut.Close;
+ MidiOut.Free;
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenEditHeader.pas b/Game/Code/Screens/UScreenEditHeader.pas
new file mode 100644
index 00000000..35d7840f
--- /dev/null
+++ b/Game/Code/Screens/UScreenEditHeader.pas
@@ -0,0 +1,366 @@
+unit UScreenEditHeader;
+
+interface
+
+uses UMenu, SDL, USongs, UThemes;
+
+type
+ TScreenEditHeader = class(TMenu)
+ public
+ AktSong: TSong;
+ TextTitle: integer;
+ TextArtist: integer;
+ TextMp3: integer;
+ TextBackground: integer;
+ TextVideo: integer;
+ TextVideoGAP: integer;
+ TextRelative: integer;
+ TextResolution: integer;
+ TextNotesGAP: integer;
+ TextStart: integer;
+ TextGAP: integer;
+ TextBPM: integer;
+ StaticTitle: integer;
+ StaticArtist: integer;
+ StaticMp3: integer;
+ StaticBackground: integer;
+ StaticVideo: integer;
+ StaticVideoGAP: integer;
+ StaticRelative: integer;
+ StaticResolution: integer;
+ StaticNotesGAP: integer;
+ StaticStart: integer;
+ StaticGAP: integer;
+ StaticBPM: integer;
+ Sel: array[0..11] of boolean;
+ procedure SetRoundButtons;
+
+ constructor Create; override;
+ procedure onShow; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+{ function Draw: boolean; override;
+ procedure Finish;}
+ end;
+
+implementation
+
+uses UGraphic, UMusic, SysUtils, UFiles, USkins;
+
+function TScreenEditHeader.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+var
+ T: integer;
+begin
+ Result := true;
+ If (PressedDown) Then begin // Key Down
+ case PressedKey of
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+ SDLK_ESCAPE :
+ begin
+// Music.PlayBack;
+// FadeTo(@MainScreen);
+ Result := false;
+ end;
+
+ SDLK_RETURN:
+ begin
+ if Interaction = 1 then begin
+// Save;
+ end;
+ end;
+
+ SDLK_RIGHT:
+ begin
+ case Interaction of
+ 0..0: InteractNext;
+ 1: Interaction := 0;
+ end;
+ end;
+
+ SDLK_LEFT:
+ begin
+ case Interaction of
+ 0: Interaction := 1;
+ 1..1: InteractPrev;
+ end;
+ end;
+
+ SDLK_DOWN:
+ begin
+ case Interaction of
+ 0..1: Interaction := 2;
+ 2..12: InteractNext;
+ 13: Interaction := 0;
+ end;
+ end;
+
+ SDLK_UP:
+ begin
+ case Interaction of
+ 0..1: Interaction := 13;
+ 2: Interaction := 0;
+ 3..13: InteractPrev;
+ end;
+ end;
+
+ SDLK_BACKSPACE:
+ begin
+ T := Interaction - 2 + TextTitle;
+ if (Interaction >= 2) and (Interaction <= 13) and (Length(Text[T].Text) >= 1) then begin
+ Text[T].DeleteLastL;
+ SetRoundButtons;
+ end;
+ end;
+
+ end;
+ case ScanCode of
+ 32..255:
+ begin
+ if (Interaction >= 2) and (Interaction <= 13) then begin
+ Text[Interaction - 2 + TextTitle].Text :=
+ Text[Interaction - 2 + TextTitle].Text + chr(ScanCode);
+ SetRoundButtons;
+ end;
+ end;
+ end;
+ end;
+end;
+
+constructor TScreenEditHeader.Create;
+begin
+ inherited Create;
+
+ AddButton(40, 20, 100, 40, Skin.GetTextureFileName('ButtonF'));
+ AddButtonText(15, 5, 'Open');
+
+ AddButton(160, 20, 100, 40, Skin.GetTextureFileName('ButtonF'));
+ AddButtonText(20, 5, 'Save');
+
+ AddBox(80, 60, 640, 550);
+
+ AddText(160, 110 + 0*30, 0, 10, 0, 0, 0, 'Title:');
+ AddText(160, 110 + 1*30, 0, 10, 0, 0, 0, 'Artist:');
+ AddText(160, 110 + 2*30, 0, 10, 0, 0, 0, 'MP3:');
+
+ AddText(160, 110 + 4*30, 0, 10, 0, 0, 0, 'Background:');
+ AddText(160, 110 + 5*30, 0, 10, 0, 0, 0, 'Video:');
+ AddText(160, 110 + 6*30, 0, 10, 0, 0, 0, 'VideoGAP:');
+
+ AddText(160, 110 + 8*30, 0, 10, 0, 0, 0, 'Relative:');
+ AddText(160, 110 + 9*30, 0, 10, 0, 0, 0, 'Resolution:');
+ AddText(160, 110 + 10*30, 0, 10, 0, 0, 0, 'NotesGAP:');
+
+ AddText(160, 110 + 12*30, 0, 10, 0, 0, 0, 'Start:');
+ AddText(160, 110 + 13*30, 0, 10, 0, 0, 0, 'GAP:');
+ AddText(160, 110 + 14*30, 0, 10, 0, 0, 0, 'BPM:');
+
+ TextTitle := AddText(340, 110 + 0*30, 0, 10, 0, 0, 0, '');
+ TextArtist := AddText(340, 110 + 1*30, 0, 10, 0, 0, 0, '');
+ TextMp3 := AddText(340, 110 + 2*30, 0, 10, 0, 0, 0, '');
+
+ TextBackground := AddText(340, 110 + 4*30, 0, 10, 0, 0, 0, '');
+ TextVideo := AddText(340, 110 + 5*30, 0, 10, 0, 0, 0, '');
+ TextVideoGAP := AddText(340, 110 + 6*30, 0, 10, 0, 0, 0, '');
+
+ TextRelative := AddText(340, 110 + 8*30, 0, 10, 0, 0, 0, '');
+ TextResolution := AddText(340, 110 + 9*30, 0, 10, 0, 0, 0, '');
+ TextNotesGAP := AddText(340, 110 + 10*30, 0, 10, 0, 0, 0, '');
+
+ TextStart := AddText(340, 110 + 12*30, 0, 10, 0, 0, 0, '');
+ TextGAP := AddText(340, 110 + 13*30, 0, 10, 0, 0, 0, '');
+ TextBPM := AddText(340, 110 + 14*30, 0, 10, 0, 0, 0, '');
+
+ StaticTitle := AddStatic(130, 115 + 0*30, 20, 20, 1, 1, 1, 'RoundButton', 'BMP', 'Transparent', $FF00FF);
+ StaticArtist := AddStatic(130, 115 + 1*30, 20, 20, 1, 1, 1, 'RoundButton', 'BMP', 'Transparent', $FF00FF);
+ StaticMp3 := AddStatic(130, 115 + 2*30, 20, 20, 1, 1, 1, 'RoundButton', 'BMP', 'Transparent', $FF00FF);
+ StaticBackground := AddStatic(130, 115 + 4*30, 20, 20, 1, 1, 1, 'RoundButton', 'BMP', 'Transparent', $FF00FF);
+ StaticVideo := AddStatic(130, 115 + 5*30, 20, 20, 1, 1, 1, 'RoundButton', 'BMP', 'Transparent', $FF00FF);
+ StaticVideoGAP := AddStatic(130, 115 + 6*30, 20, 20, 1, 1, 1, 'RoundButton', 'BMP', 'Transparent', $FF00FF);
+ StaticRelative := AddStatic(130, 115 + 8*30, 20, 20, 1, 1, 1, 'RoundButton', 'BMP', 'Transparent', $FF00FF);
+ StaticResolution := AddStatic(130, 115 + 9*30, 20, 20, 1, 1, 1, 'RoundButton', 'BMP', 'Transparent', $FF00FF);
+ StaticNotesGAP := AddStatic(130, 115 + 10*30, 20, 20, 1, 1, 1, 'RoundButton', 'BMP', 'Transparent', $FF00FF);
+ StaticStart := AddStatic(130, 115 + 12*30, 20, 20, 1, 1, 1, 'RoundButton', 'BMP', 'Transparent', $FF00FF);
+ StaticGAP := AddStatic(130, 115 + 13*30, 20, 20, 1, 1, 1, 'RoundButton', 'BMP', 'Transparent', $FF00FF);
+ StaticBPM := AddStatic(130, 115 + 14*30, 20, 20, 1, 1, 1, 'RoundButton', 'BMP', 'Transparent', $FF00FF);
+
+ AddInteraction(iText, TextTitle);
+ AddInteraction(iText, TextArtist);
+ AddInteraction(iText, TextMp3);
+ AddInteraction(iText, TextBackground);
+ AddInteraction(iText, TextVideo);
+ AddInteraction(iText, TextVideoGAP);
+ AddInteraction(iText, TextRelative);
+ AddInteraction(iText, TextResolution);
+ AddInteraction(iText, TextNotesGAP);
+ AddInteraction(iText, TextStart);
+ AddInteraction(iText, TextGAP);
+ AddInteraction(iText, TextBPM);
+end;
+
+procedure TScreenEditHeader.onShow;
+begin
+{ if FileExists(FileName) then begin // load file
+ AktSong.FileName := FileName;
+ SkanujPlik(AktSong);
+
+ SetLength(TrueBoolStrs, 1);
+ TrueBoolStrs[0] := 'yes';
+ SetLength(FalseBoolStrs, 1);
+ FalseBoolStrs[0] := 'no';
+
+ Text[TextTitle].Text := AktSong.Title;
+ Text[TextArtist].Text := AktSong.Artist;
+ Text[TextMP3].Text := AktSong.Mp3;
+ Text[TextBackground].Text := AktSong.Background;
+ Text[TextVideo].Text := AktSong.Video;
+ Text[TextVideoGAP].Text := FloatToStr(AktSong.VideoGAP);
+ Text[TextRelative].Text := BoolToStr(AktSong.Relative, true);
+ Text[TextResolution].Text := IntToStr(AktSong.Resolution);
+ Text[TextNotesGAP].Text := IntToStr(AktSong.NotesGAP);
+ Text[TextStart].Text := FloatToStr(AktSong.Start);
+ Text[TextGAP].Text := FloatToStr(AktSong.GAP);
+ Text[TextBPM].Text := FloatToStr(AktSong.BPM[0].BPM);
+ SetRoundButtons;
+ end;}
+
+ Interaction := 0;
+end;
+
+(*function TScreenEdit.Draw: boolean;
+var
+ Min: integer;
+ Sec: integer;
+ Tekst: string;
+ Pet: integer;
+ AktBeat: integer;
+begin
+{ glClearColor(1,1,1,1);
+
+ // control music
+ if PlaySentence then begin
+ // stop the music
+ if (Music.Position > PlayStopTime) then begin
+ Music.Stop;
+ PlaySentence := false;
+ end;
+
+ // click
+ if (Click) and (PlaySentence) then begin
+ AktBeat := Floor(AktSong.BPM[0].BPM * (Music.Position - AktSong.GAP / 1000) / 60);
+ Text[TextDebug].Text := IntToStr(AktBeat);
+ if AktBeat <> LastClick then begin
+ for Pet := 0 to Czesci[0].Czesc[Czesci[0].Akt].HighNut do
+ if (Czesci[0].Czesc[Czesci[0].Akt].Nuta[Pet].Start = AktBeat) then begin
+ Music.PlayClick;
+ LastClick := AktBeat;
+ end;
+ end;
+ end; // click
+ end; // if PlaySentence
+
+ Text[TextSentence].Text := IntToStr(Czesci[0].Akt + 1) + ' / ' + IntToStr(Czesci[0].Ilosc);
+ Text[TextNote].Text := IntToStr(AktNuta + 1) + ' / ' + IntToStr(Czesci[0].Czesc[Czesci[0].Akt].IlNut);
+
+ // Song info
+ Text[TextBPM].Text := FloatToStr(AktSong.BPM[0].BPM / 4);
+ Text[TextGAP].Text := FloatToStr(AktSong.GAP);
+
+ // Note info
+ Text[TextNStart].Text := IntToStr(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Start);
+ Text[TextNDlugosc].Text := IntToStr(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Dlugosc);
+ Text[TextNTon].Text := IntToStr(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Ton);
+ Text[TextNText].Text := Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Tekst;
+
+ // draw static menu
+ inherited Draw;
+
+ // draw notes
+ SingDrawNoteLines(20, 300, 780, 15);
+ SingDrawBeatDelimeters(40, 300, 760, 0);
+ SingDrawCzesc(40, 405, 760, 0);
+
+ // draw text
+ Lyric.Draw;}
+
+end;*)
+
+procedure TScreenEditHeader.SetRoundButtons;
+begin
+ if Length(Text[TextTitle].Text) > 0 then Static[StaticTitle].Visible := true
+ else Static[StaticTitle].Visible := false;
+
+ if Length(Text[TextArtist].Text) > 0 then Static[StaticArtist].Visible := true
+ else Static[StaticArtist].Visible := false;
+
+ if Length(Text[TextMp3].Text) > 0 then Static[StaticMp3].Visible := true
+ else Static[StaticMp3].Visible := false;
+
+ if Length(Text[TextBackground].Text) > 0 then Static[StaticBackground].Visible := true
+ else Static[StaticBackground].Visible := false;
+
+ if Length(Text[TextVideo].Text) > 0 then Static[StaticVideo].Visible := true
+ else Static[StaticVideo].Visible := false;
+
+ try
+ StrToFloat(Text[TextVideoGAP].Text);
+ if StrToFloat(Text[TextVideoGAP].Text)<> 0 then Static[StaticVideoGAP].Visible := true
+ else Static[StaticVideoGAP].Visible := false;
+ except
+ Static[StaticVideoGAP].Visible := false;
+ end;
+
+ if LowerCase(Text[TextRelative].Text) = 'yes' then Static[StaticRelative].Visible := true
+ else Static[StaticRelative].Visible := false;
+
+ try
+ StrToInt(Text[TextResolution].Text);
+ if (StrToInt(Text[TextResolution].Text) <> 0) and (StrToInt(Text[TextResolution].Text) >= 1)
+ then Static[StaticResolution].Visible := true
+ else Static[StaticResolution].Visible := false;
+ except
+ Static[StaticResolution].Visible := false;
+ end;
+
+ try
+ StrToInt(Text[TextNotesGAP].Text);
+ Static[StaticNotesGAP].Visible := true;
+ except
+ Static[StaticNotesGAP].Visible := false;
+ end;
+
+ // start
+ try
+ StrToFloat(Text[TextStart].Text);
+ if (StrToFloat(Text[TextStart].Text) > 0) then Static[StaticStart].Visible := true
+ else Static[StaticStart].Visible := false;
+ except
+ Static[StaticStart].Visible := false;
+ end;
+
+ // GAP
+ try
+ StrToFloat(Text[TextGAP].Text);
+ Static[StaticGAP].Visible := true;
+ except
+ Static[StaticGAP].Visible := false;
+ end;
+
+ // BPM
+ try
+ StrToFloat(Text[TextBPM].Text);
+ if (StrToFloat(Text[TextBPM].Text) > 0) then Static[StaticBPM].Visible := true
+ else Static[StaticBPM].Visible := false;
+ except
+ Static[StaticBPM].Visible := false;
+ end;
+
+end;
+
+(*procedure TScreenEdit.Finish;
+begin
+//
+end;*)
+
+end.
diff --git a/Game/Code/Screens/UScreenEditSub.pas b/Game/Code/Screens/UScreenEditSub.pas
new file mode 100644
index 00000000..3b132810
--- /dev/null
+++ b/Game/Code/Screens/UScreenEditSub.pas
@@ -0,0 +1,1854 @@
+unit UScreenEditSub;
+
+interface
+
+uses UMenu, UMusic, SDL, SysUtils, UFiles, UTime, USongs, UIni, ULog, USmpeg, UTexture, UMenuText,
+ ULyrics, Math, gl, UThemes, MidiOut, UHelp;
+
+type
+ TMedleyNotes = record
+ start: TPos;
+ end_: TPos;
+ Preview: TPos;
+ isStart: boolean; //start beat is declared
+ isEnd: boolean; //end beat is declared
+ end;
+
+ TScreenEditSub = class(TMenu)
+ const
+ ID='ID_001'; //for help system
+
+ private
+ //Variable is True if no SOng is loaded
+ Error: Boolean;
+ MP3Volume: Integer;
+
+ TextNote: integer;
+ TextSentence: integer;
+ TextTitle: integer;
+ TextArtist: integer;
+ TextMp3: integer;
+ TextBPM: integer;
+ TextGAP: integer;
+ TextDebug: integer;
+ TextNStart: integer;
+ TextNDlugosc: integer;
+ TextNTon: integer;
+ TextNText: integer;
+ AktNuta: integer;
+ PlaySentence: boolean;
+ PlaySentenceMidi: boolean;
+ PlayStopTime: real;
+ LastClick: integer;
+ Click: boolean;
+ CopySrc: integer;
+
+ MidiOut: TMidiOutput;
+ MidiStart: real;
+ MidiStop: real;
+ MidiTime: real;
+ MidiPos: real;
+ MidiLastNote: integer;
+
+
+ TextEditMode: boolean;
+ MedleyNotes: TMedleyNotes;
+
+ editText: string; //backup of current text in text-edit-mode
+ noteStart: integer; //Start note when playing sentence
+ LineChanged: boolean;
+
+ procedure NewBeat;
+ procedure CzesciDivide;
+ procedure CzesciMultiply;
+ procedure LyricsCapitalize;
+ procedure LyricsCorrectSpaces;
+ procedure FixTimings;
+ procedure DivideSentence;
+ procedure JoinSentence;
+ procedure DivideNote;
+ procedure DeleteNote;
+ procedure TransposeNote(Transpose: integer);
+ procedure ChangeWholeTone(Tone: integer);
+ procedure MoveAllToEnd(Move: integer);
+ procedure MoveTextToRight;
+ procedure MarkSrc;
+ procedure PasteText;
+ procedure CopySentence(Src, Dst: integer);
+ procedure CopySentences(Src, Dst, Num: integer);
+ //Note Name Mod
+ function GetNoteName(Note: Integer): String;
+ function GetMedleyLength: real; //returns if availible the length of the medley in seconds, else 0
+ public
+ Tex_Background: TTexture;
+ FadeOut: boolean;
+ Path: string;
+ FileName: string;
+ SongIndex: integer; //SongIndex from CatSongs.Song
+ constructor Create; override;
+ procedure onShow; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ function ParseInputEditText(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+ function Draw: boolean; override;
+ procedure onHide; override;
+ end;
+
+implementation
+uses UGraphic, UDraw, UMain, USkins, ULanguage;
+
+// Method for input parsing. If False is returned, GetNextWindow
+// should be checked to know the next window to load;
+function TScreenEditSub.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+var
+ SDL_ModState: Word;
+ R: real;
+ SResult: boolean;
+begin
+ Result := true;
+
+ Text[TextDebug].Text := '';
+
+ if TextEditMode then begin
+ Result := ParseInputEditText(PressedKey, ScanCode, PressedDown);
+ end else begin
+
+ SDL_ModState := SDL_GetModState and (KMOD_LSHIFT + KMOD_RSHIFT
+ + KMOD_LCTRL + KMOD_RCTRL + KMOD_LALT + KMOD_RALT {+ KMOD_CAPS});
+
+ If (PressedDown) then begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_ESCAPE:
+ begin
+ FadeTo(@ScreenSong);
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+
+ SDLK_BACKQUOTE:
+ begin
+ // Increase Note Length (same as Alt + Right)
+ Inc(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Dlugosc);
+ if AktNuta = Czesci[0].Czesc[Czesci[0].Akt].HighNut then
+ Inc(Czesci[0].Czesc[Czesci[0].Akt].Koniec);
+ end;
+
+ SDLK_EQUALS:
+ begin
+ // Increase BPM
+ if SDL_ModState = 0 then
+ AktSong.BPM[0].BPM := Round((AktSong.BPM[0].BPM * 5) + 1) / 5; // (1/20)
+ if SDL_ModState = KMOD_LSHIFT then
+ AktSong.BPM[0].BPM := AktSong.BPM[0].BPM + 4; // (1/1)
+ if SDL_ModState = KMOD_LCTRL then
+ AktSong.BPM[0].BPM := Round((AktSong.BPM[0].BPM * 25) + 1) / 25; // (1/100)
+ end;
+
+ SDLK_MINUS:
+ begin
+ // Decrease BPM
+ if SDL_ModState = 0 then
+ AktSong.BPM[0].BPM := Round((AktSong.BPM[0].BPM * 5) - 1) / 5;
+ if SDL_ModState = KMOD_LSHIFT then
+ AktSong.BPM[0].BPM := AktSong.BPM[0].BPM - 4;
+ if SDL_ModState = KMOD_LCTRL then
+ AktSong.BPM[0].BPM := Round((AktSong.BPM[0].BPM * 25) - 1) / 25;
+ end;
+
+ SDLK_0:
+ begin
+ // Increase GAP
+ if SDL_ModState = 0 then
+ AktSong.GAP := AktSong.GAP + 10;
+ if SDL_ModState = KMOD_LSHIFT then
+ AktSong.GAP := AktSong.GAP + 1000;
+ end;
+
+ SDLK_9:
+ begin
+ // Decrease GAP
+ if SDL_ModState = 0 then
+ AktSong.GAP := AktSong.GAP - 10;
+ if SDL_ModState = KMOD_LSHIFT then
+ AktSong.GAP := AktSong.GAP - 1000;
+ end;
+
+ SDLK_KP_PLUS:
+ begin
+ // Increase tone of all notes
+ if SDL_ModState = 0 then
+ ChangeWholeTone(1);
+ if SDL_ModState = KMOD_LSHIFT then
+ ChangeWholeTone(12);
+ end;
+
+ SDLK_KP_MINUS:
+ begin
+ // Decrease tone of all notes
+ if SDL_ModState = 0 then
+ ChangeWholeTone(-1);
+ if SDL_ModState = KMOD_LSHIFT then
+ ChangeWholeTone(-12);
+ end;
+
+ SDLK_SLASH:
+ begin
+ if SDL_ModState = 0 then begin
+ // Insert start of sentece
+ if AktNuta > 0 then
+ DivideSentence;
+ end;
+
+ if SDL_ModState = KMOD_LSHIFT then begin
+ // Join next sentence with current
+ if Czesci[0].Akt < Czesci[0].High then
+ JoinSentence;
+ end;
+
+ if SDL_ModState = KMOD_LCTRL then begin
+ // divide note
+ DivideNote;
+ end;
+
+ end;
+
+
+ SDLK_S:
+ begin
+ //Medley MOD:
+ if (MedleyNotes.isStart and MedleyNotes.isEnd) and
+ (MedleyNotes.start.line < MedleyNotes.end_.line) then
+ begin
+ AktSong.Medley.Source := msTag;
+ AktSong.Medley.StartBeat:=Czesci[0].Czesc[MedleyNotes.start.line].Nuta[MedleyNotes.start.note].Start;
+ AktSong.Medley.EndBeat:=Czesci[0].Czesc[MedleyNotes.end_.line].Nuta[MedleyNotes.end_.note].Start +
+ Czesci[0].Czesc[MedleyNotes.end_.line].Nuta[MedleyNotes.end_.note].Dlugosc;
+ AktSong.Medley.FadeIn_time := DEFAULT_FADE_IN_TIME;
+ AktSong.Medley.FadeOut_time := DEFAULT_FADE_OUT_TIME;
+ end else begin
+ AktSong.Medley.Source := msNone;
+ AktSong.Medley.StartBeat:=0;
+ AktSong.Medley.EndBeat:=0;
+ end;
+
+ // Save Song
+ if SDL_ModState = KMOD_LSHIFT then
+ begin
+ if (AktSong.Medley.Source = msTag) then
+ begin
+ ScreenPopupError.ShowPopup(Language.Translate('Medley and Relative is not supported!'));
+ Exit;
+ end;
+
+ SResult := SaveSong(AktSong, Czesci[0], Path + FileName, true); //save with relative
+ end else
+ SResult := SaveSong(AktSong, Czesci[0], Path + FileName, false);
+
+ if SResult then
+ begin
+ Text[TextDebug].Text := Language.Translate('INFO_FILE_SAVED');
+ CatSongs.Song[SongIndex] := AktSong;
+ end else
+ begin
+ ScreenPopupError.ShowPopup(Language.Translate('ERROR_SAVE_FILE_FAILED'));
+ end;
+
+ Exit;
+ end;
+
+ // set Medley tags
+ SDLK_A:
+ begin
+ if AktSong.Relative then
+ begin
+ ScreenPopupError.ShowPopup(Language.Translate('Medley and Relative is not supported!'));
+ Exit;
+ end;
+
+ if SDL_ModState = KMOD_LSHIFT then //Medley End Note
+ begin
+ if MedleyNotes.isEnd then
+ begin
+ if (Czesci[0].Akt=MedleyNotes.end_.line) and (AktNuta=MedleyNotes.end_.note) then
+ begin
+ MedleyNotes.isEnd := false;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].IsMedley := false;
+ end else
+ begin
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].IsMedley := true;
+ Czesci[0].Czesc[MedleyNotes.end_.line].Nuta[MedleyNotes.end_.note].IsMedley := false;
+ MedleyNotes.end_.line := Czesci[0].Akt;
+ MedleyNotes.end_.note := AktNuta;
+ end;
+ end else
+ begin
+ MedleyNotes.isEnd := true;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].IsMedley := true;
+ MedleyNotes.end_.line := Czesci[0].Akt;
+ MedleyNotes.end_.note := AktNuta;
+ end;
+ end else
+ begin //Medley Start Note
+ if MedleyNotes.isStart then
+ begin
+ if (Czesci[0].Akt=MedleyNotes.start.line) and (AktNuta=MedleyNotes.start.note) then
+ begin
+ MedleyNotes.isStart := false;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].IsMedley := false;
+ end else
+ begin
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].IsMedley := true;
+ Czesci[0].Czesc[MedleyNotes.start.line].Nuta[MedleyNotes.start.note].IsMedley := false;
+ MedleyNotes.start.line := Czesci[0].Akt;
+ MedleyNotes.start.note := AktNuta;
+ end;
+ end else
+ begin
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].IsMedley := true;
+ MedleyNotes.isStart := true;
+ MedleyNotes.start.line := Czesci[0].Akt;
+ MedleyNotes.start.note := AktNuta;
+ end;
+ end;
+
+ //show length of medley
+ Text[TextDebug].Text := FormatFloat('MedleyLength: #0.00s', GetMedleyLength);
+ Exit;
+ end;
+
+ // jump to Medley tags
+ SDLK_J:
+ begin
+ if AktSong.Relative then
+ begin
+ ScreenPopupError.ShowPopup(Language.Translate('Medley and Relative is not supported!'));
+ Exit;
+ end;
+
+ if (SDL_ModState = KMOD_LSHIFT) and MedleyNotes.IsEnd then //Medley End Note
+ begin
+ MidiOut.PutShort($81, Czesci[0].Czesc[Czesci[0].Akt].Nuta[MidiLastNote].Ton + 60, 127);
+ PlaySentenceMidi := false;
+
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 0;
+ Czesci[0].Akt := MedleyNotes.end_.line;
+ AktNuta := MedleyNotes.end_.note;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 2;
+
+ Lyric.AddCzesc(Czesci[0].Akt);
+ Lyric.Selected := AktNuta;
+ Music.Stop;
+ PlaySentence := false;
+ end else if MedleyNotes.IsStart then
+ begin
+ MidiOut.PutShort($81, Czesci[0].Czesc[Czesci[0].Akt].Nuta[MidiLastNote].Ton + 60, 127);
+ PlaySentenceMidi := false;
+
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 0;
+ Czesci[0].Akt := MedleyNotes.start.line;
+ AktNuta := MedleyNotes.start.note;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 2;
+
+ Lyric.AddCzesc(Czesci[0].Akt);
+ Lyric.Selected := AktNuta;
+ Music.Stop;
+ PlaySentence := false
+ end;
+
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ PlaySentenceMidi := false;
+ Music.Stop;
+ LineChanged:=false;
+ R := GetTimeFromBeat(Czesci[0].Czesc[MedleyNotes.start.line].Nuta[MedleyNotes.start.note].Start);
+ if R <= Music.Length then begin
+ Music.MoveTo(R);
+ PlayStopTime := GetTimeFromBeat(
+ Czesci[0].Czesc[MedleyNotes.end_.line].Nuta[MedleyNotes.end_.note].Start +
+ Czesci[0].Czesc[MedleyNotes.end_.line].Nuta[MedleyNotes.end_.note].Dlugosc);
+ PlaySentence := true;
+ Music.Play;
+ LastClick := -100;
+ end;
+ end;
+
+ //show length of medley
+ Text[TextDebug].Text := FormatFloat('MedleyLength: #0.00s', GetMedleyLength);
+ Exit;
+ end;
+
+ SDLK_K: //Preview Start
+ begin
+ if (SDL_ModState = KMOD_LSHIFT) then //jump to...
+ begin
+ MidiOut.PutShort($81, Czesci[0].Czesc[Czesci[0].Akt].Nuta[MidiLastNote].Ton + 60, 127);
+ PlaySentenceMidi := false;
+
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 0;
+ Czesci[0].Akt := MedleyNotes.Preview.line;
+ AktNuta := MedleyNotes.Preview.note;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 2;
+
+ Lyric.AddCzesc(Czesci[0].Akt);
+ Lyric.Selected := AktNuta;
+ Music.Stop;
+ PlaySentence := false
+ end else
+ begin
+ if (Czesci[0].Akt = MedleyNotes.Preview.line) and (AktNuta = MedleyNotes.Preview.note) then //reset ?
+ begin
+
+ end else //set
+ begin
+ Czesci[0].Czesc[MedleyNotes.Preview.line].Nuta[MedleyNotes.Preview.note].IsStartPreview := false;
+ MedleyNotes.Preview.line := Czesci[0].Akt;
+ MedleyNotes.Preview.note := AktNuta;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].IsStartPreview := true;
+ AktSong.PreviewStart := GetTimeFromBeat(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].start);
+ end;
+ end;
+ end;
+
+
+ SDLK_D:
+ begin
+ // Divide lengths by 2
+ CzesciDivide;
+ end;
+
+ SDLK_M:
+ begin
+ // Multiply lengths by 2
+ CzesciMultiply;
+ end;
+
+ SDLK_C:
+ begin
+ // Capitalize letter at the beginning of line
+ if SDL_ModState = 0 then
+ LyricsCapitalize;
+
+ // Correct spaces
+ if SDL_ModState = KMOD_LSHIFT then
+ LyricsCorrectSpaces;
+
+ // Copy sentence
+ if SDL_ModState = KMOD_LCTRL then
+ MarkSrc;
+ end;
+
+ SDLK_R: //reload
+ begin
+ onHide;
+ onShow;
+ end;
+
+ SDLK_V:
+ begin
+ // Paste text
+ if SDL_ModState = KMOD_LCTRL then begin
+ if Czesci[0].Czesc[Czesci[0].Akt].IlNut >= Czesci[0].Czesc[CopySrc].IlNut then
+ PasteText
+ else
+ beep;
+ end;
+
+ if SDL_ModState = KMOD_LCTRL + KMOD_LSHIFT then begin
+ CopySentence(CopySrc, Czesci[0].Akt);
+ end;
+ end;
+
+ SDLK_4:
+ begin
+ if SDL_ModState = KMOD_LCTRL + KMOD_LSHIFT then begin
+ CopySentence(CopySrc, Czesci[0].Akt);
+ CopySentence(CopySrc+1, Czesci[0].Akt+1);
+ CopySentence(CopySrc+2, Czesci[0].Akt+2);
+ CopySentence(CopySrc+3, Czesci[0].Akt+3);
+ end;
+
+ if SDL_ModState = KMOD_LCTRL + KMOD_LSHIFT + KMOD_LALT then begin
+ CopySentences(CopySrc, Czesci[0].Akt, 4);
+ end;
+ end;
+ SDLK_5:
+ begin
+ if SDL_ModState = KMOD_LCTRL + KMOD_LSHIFT then begin
+ CopySentence(CopySrc, Czesci[0].Akt);
+ CopySentence(CopySrc+1, Czesci[0].Akt+1);
+ CopySentence(CopySrc+2, Czesci[0].Akt+2);
+ CopySentence(CopySrc+3, Czesci[0].Akt+3);
+ CopySentence(CopySrc+4, Czesci[0].Akt+4);
+ end;
+
+ if SDL_ModState = KMOD_LCTRL + KMOD_LSHIFT + KMOD_LALT then begin
+ CopySentences(CopySrc, Czesci[0].Akt, 5);
+ end;
+ end;
+
+ SDLK_T:
+ begin
+ // Fixes timings between sentences
+ FixTimings;
+ end;
+
+ SDLK_F4:
+ begin
+ // Enter Text Edit Mode
+ editText := Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Tekst;
+ TextEditMode := true;
+ end;
+
+ SDLK_P:
+ begin
+ if SDL_ModState = 0 then begin
+ // Play Sentence
+ MidiOut.PutShort($81, Czesci[0].Czesc[Czesci[0].Akt].Nuta[MidiLastNote].Ton + 60, 127);
+ PlaySentenceMidi := false;
+ Click := true;
+ Music.Stop;
+ R := GetTimeFromBeat(Czesci[0].Czesc[Czesci[0].Akt].StartNote);
+ if R <= Music.Length then begin
+ Music.MoveTo(R);
+ PlayStopTime := GetTimeFromBeat(Czesci[0].Czesc[Czesci[0].Akt].Koniec);
+ PlaySentence := true;
+ Music.Play;
+ LastClick := -100;
+ end;
+ end;
+
+ if SDL_ModState = KMOD_LSHIFT then begin
+ PlaySentenceMidi := true;
+ MidiTime := USTime.GetTime;
+ Music.Stop;
+ PlaySentence := false;
+ MidiStart := GetTimeFromBeat(Czesci[0].Czesc[Czesci[0].Akt].StartNote);
+ MidiStop := GetTimeFromBeat(Czesci[0].Czesc[Czesci[0].Akt].Koniec);
+
+ LastClick := -100;
+ end;
+
+ if SDL_ModState = KMOD_LSHIFT or KMOD_LCTRL then begin
+ PlaySentenceMidi := true;
+ MidiTime := USTime.GetTime;
+ MidiStart := GetTimeFromBeat(Czesci[0].Czesc[Czesci[0].Akt].StartNote);
+ MidiStop := GetTimeFromBeat(Czesci[0].Czesc[Czesci[0].Akt].Koniec);
+ LastClick := -100;
+
+ PlaySentence := true;
+ Click := true;
+ Music.Stop;
+ Music.MoveTo(GetTimeFromBeat(Czesci[0].Czesc[Czesci[0].Akt].StartNote)+0{-0.10});
+ PlayStopTime := GetTimeFromBeat(Czesci[0].Czesc[Czesci[0].Akt].Koniec)+0;
+ Music.Play;
+ LastClick := -100;
+ end;
+
+ //new: play hole file + LALT
+ if SDL_ModState = KMOD_LALT then begin
+ // Play Sentence
+ MidiOut.PutShort($81, Czesci[0].Czesc[Czesci[0].Akt].Nuta[MidiLastNote].Ton + 60, 127);
+ PlaySentenceMidi := false;
+ Click := true;
+ Music.Stop;
+ R := GetTimeFromBeat(Czesci[0].Czesc[Czesci[0].Akt].StartNote);
+ if R <= Music.Length then begin
+ Music.MoveTo(R);
+ PlayStopTime := Music.Length;
+ PlaySentence := true;
+ Music.Play;
+ LastClick := -100;
+ end;
+ end;
+
+ if SDL_ModState = KMOD_LSHIFT or KMOD_LALT then begin
+ PlaySentenceMidi := true;
+ Music.Stop;
+ PlaySentence := false;
+ MidiTime := USTime.GetTime;
+ MidiStart := GetTimeFromBeat(Czesci[0].Czesc[Czesci[0].Akt].StartNote);
+ MidiStop := Music.Length;
+
+ LastClick := -100;
+ end;
+
+ if SDL_ModState = KMOD_LSHIFT or KMOD_LCTRL or KMOD_LALT then begin
+ PlaySentenceMidi := true;
+ MidiTime := USTime.GetTime;
+ MidiStart := GetTimeFromBeat(Czesci[0].Czesc[Czesci[0].Akt].StartNote);
+ MidiStop := Music.Length;
+ LastClick := -100;
+
+ PlaySentence := true;
+ Click := true;
+ Music.Stop;
+ Music.MoveTo(GetTimeFromBeat(Czesci[0].Czesc[Czesci[0].Akt].StartNote)+0{-0.10});
+ PlayStopTime := Music.Length;
+ Music.Play;
+ LastClick := -100;
+ end;
+
+ if PlaySentenceMidi or PlaySentence then
+ begin
+ noteStart := AktNuta;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 0;
+ AktNuta := 0;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 2;
+ Lyric.Selected := AktNuta;
+ LineChanged:=false;
+ end;
+
+ end;
+
+ SDLK_SPACE:
+ begin
+ //Thx to f1fth_freed0m for his One Note Midi Playback
+ if SDL_ModState = KMOD_LSHIFT then begin //Play One Notes Midi [Shift + Space]
+ PlaySentenceMidi := true;
+ Music.Stop;
+ PlaySentence := false;
+ MidiTime := USTime.GetTime;
+ MidiStart := GetTimeFromBeat(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Start);
+ MidiStop := GetTimeFromBeat(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Dlugosc);
+ LastClick := -100;
+ end
+
+ else if SDL_ModState = KMOD_LSHIFT or KMOD_LCTRL then begin
+ //Play One Notes Midi + MP3 [CTRL + Shift + Space]
+ PlaySentenceMidi := true;
+ MidiTime := USTime.GetTime;
+ MidiStart := GetTimeFromBeat(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Start);
+ MidiStop := GetTimeFromBeat(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Dlugosc);
+ LastClick := -100;
+
+ PlaySentence := true;
+ Click := true;
+ Music.Stop;
+ Music.MoveTo(GetTimeFromBeat(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Start));
+ PlayStopTime := (GetTimeFromBeat(
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Start +
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Dlugosc));
+ Music.Play;
+ LastClick := -100;
+ end
+
+ Else
+ begin
+ // Play One Notes MP3 [Space]
+ MidiOut.PutShort($81, Czesci[0].Czesc[Czesci[0].Akt].Nuta[MidiLastNote].Ton + 60, 127);
+ PlaySentenceMidi := false; // stop midi
+ PlaySentence := true;
+ Click := false;
+ Music.Stop;
+
+ Music.MoveTo(GetTimeFromBeat(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Start));
+ PlayStopTime := (GetTimeFromBeat(
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Start +
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Dlugosc));
+ Music.Play;
+ LastClick := -100;
+ end;
+
+
+ if PlaySentence or PlaySentenceMidi then
+ begin
+ noteStart := AktNuta;
+ LineChanged:=false;
+ end;
+ end;
+ SDLK_RETURN:
+ begin
+ end;
+
+ SDLK_LCTRL:
+ begin
+ end;
+
+ SDLK_DELETE:
+ begin
+ if SDL_ModState = KMOD_LCTRL then begin
+ // moves text to right in current sentence
+ DeleteNote;
+ end;
+ end;
+
+ SDLK_PERIOD:
+ begin
+ // moves text to right in current sentence
+ MoveTextToRight;
+ end;
+
+ SDLK_RIGHT:
+ begin
+ // right
+ if SDL_ModState = 0 then begin
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 0;
+ Inc(AktNuta);
+ if AktNuta = Czesci[0].Czesc[Czesci[0].Akt].IlNut then AktNuta := 0;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 2;
+ Lyric.Selected := AktNuta;
+ end;
+
+ // ctrl + right
+ if SDL_ModState = KMOD_LCTRL then begin
+ if Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Dlugosc > 1 then begin
+ Dec(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Dlugosc);
+ Inc(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Start);
+ if AktNuta = 0 then begin
+ Inc(Czesci[0].Czesc[Czesci[0].Akt].Start);
+ Inc(Czesci[0].Czesc[Czesci[0].Akt].StartNote);
+ end;
+ FixTimings;
+ end;
+ end;
+
+ // shift + right
+ if SDL_ModState = KMOD_LSHIFT then begin
+ Inc(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Start);
+ if AktNuta = 0 then begin
+ Inc(Czesci[0].Czesc[Czesci[0].Akt].Start);
+ Inc(Czesci[0].Czesc[Czesci[0].Akt].StartNote);
+ end;
+ if AktNuta = Czesci[0].Czesc[Czesci[0].Akt].HighNut then
+ Inc(Czesci[0].Czesc[Czesci[0].Akt].Koniec);
+ FixTimings;
+ end;
+
+ // alt + right
+ if SDL_ModState = KMOD_LALT then begin
+ Inc(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Dlugosc);
+ if AktNuta = Czesci[0].Czesc[Czesci[0].Akt].HighNut then
+ Inc(Czesci[0].Czesc[Czesci[0].Akt].Koniec);
+ FixTimings;
+ end;
+
+ // alt + ctrl + shift + right = move all from cursor to right
+ if SDL_ModState = KMOD_LALT + KMOD_LCTRL + KMOD_LSHIFT then begin
+ MoveAllToEnd(1);
+ FixTimings;
+ end;
+
+ MidiOut.PutShort($81, Czesci[0].Czesc[Czesci[0].Akt].Nuta[MidiLastNote].Ton + 60, 127);
+ PlaySentenceMidi := false;
+ Music.Stop;
+ LineChanged:=false;
+ PlaySentence := false;
+ end;
+
+ SDLK_LEFT:
+ begin
+ // left
+ if SDL_ModState = 0 then begin
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 0;
+ Dec(AktNuta);
+ if AktNuta = -1 then AktNuta := Czesci[0].Czesc[Czesci[0].Akt].HighNut;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 2;
+ Lyric.Selected := AktNuta;
+ end;
+
+ // ctrl + left
+ if SDL_ModState = KMOD_LCTRL then begin
+ Dec(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Start);
+ Inc(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Dlugosc);
+ if AktNuta = 0 then begin
+ Dec(Czesci[0].Czesc[Czesci[0].Akt].Start);
+ Dec(Czesci[0].Czesc[Czesci[0].Akt].StartNote);
+ end;
+ FixTimings;
+ end;
+
+ // shift + left
+ if SDL_ModState = KMOD_LSHIFT then begin
+ Dec(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Start);
+
+ // resizing sentences
+ if AktNuta = 0 then begin
+ Dec(Czesci[0].Czesc[Czesci[0].Akt].Start);
+ Dec(Czesci[0].Czesc[Czesci[0].Akt].StartNote);
+ end;
+
+ if AktNuta = Czesci[0].Czesc[Czesci[0].Akt].HighNut then
+ Dec(Czesci[0].Czesc[Czesci[0].Akt].Koniec);
+ FixTimings;
+ end;
+
+ // alt + left
+ if SDL_ModState = KMOD_LALT then begin
+ if Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Dlugosc > 1 then begin
+ Dec(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Dlugosc);
+ if AktNuta = Czesci[0].Czesc[Czesci[0].Akt].HighNut then
+ Dec(Czesci[0].Czesc[Czesci[0].Akt].Koniec);
+ end;
+ FixTimings;
+ end;
+
+ // alt + ctrl + shift + right = move all from cursor to left
+ if SDL_ModState = KMOD_LALT + KMOD_LCTRL + KMOD_LSHIFT then begin
+ MoveAllToEnd(-1);
+ FixTimings;
+ end;
+
+ MidiOut.PutShort($81, Czesci[0].Czesc[Czesci[0].Akt].Nuta[MidiLastNote].Ton + 60, 127);
+ PlaySentenceMidi := false;
+ Music.Stop;
+ LineChanged:=false;
+ PlaySentence := false;
+ end;
+
+ SDLK_DOWN:
+ begin
+ // skip to next sentence
+ if SDL_ModState = 0 then begin
+ MidiOut.PutShort($81, Czesci[0].Czesc[Czesci[0].Akt].Nuta[MidiLastNote].Ton + 60, 127);
+ PlaySentenceMidi := false;
+
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 0;
+ Inc(Czesci[0].Akt);
+ AktNuta := 0;
+ if Czesci[0].Akt > Czesci[0].High then
+ Czesci[0].Akt := 0;
+
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 2;
+
+ Lyric.AddCzesc(Czesci[0].Akt);
+ Lyric.Selected := 0;
+ Music.Stop;
+ PlaySentence := false;
+ end;
+
+ // decrease tone
+ if SDL_ModState = KMOD_LCTRL then begin
+ TransposeNote(-1);
+ end;
+
+ end;
+
+ SDLK_UP:
+ begin
+ // skip to previous sentence
+ if SDL_ModState = 0 then begin
+ MidiOut.PutShort($81, Czesci[0].Czesc[Czesci[0].Akt].Nuta[MidiLastNote].Ton + 60, 127);
+ PlaySentenceMidi := false;
+
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 0;
+ Dec(Czesci[0].Akt);
+ AktNuta := 0;
+ if Czesci[0].Akt = -1 then
+ Czesci[0].Akt := Czesci[0].High;
+
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 2;
+
+ Lyric.AddCzesc(Czesci[0].Akt);
+ Lyric.Selected := 0;
+ Music.Stop;
+ PlaySentence := false;
+ end;
+
+ // increase tone
+ if SDL_ModState = KMOD_LCTRL then begin
+ TransposeNote(1);
+ end;
+ end;
+
+ // Golden Note Patch
+ SDLK_G:
+ begin
+ case Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Wartosc of
+ 0, 1: Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Wartosc := 2;
+ 2: Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Wartosc := 1;
+ end; // case
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Freestyle := False;
+ end;
+
+ // Freestyle Note Patch
+ SDLK_F:
+ begin
+ case Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Wartosc of
+ 0:
+ begin;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Wartosc := 1;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Freestyle := False;
+ end;
+ 1,2:
+ begin;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Wartosc := 0;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Freestyle := True;
+ end;
+ end; // case
+
+ end;
+
+ //MP3-Volume Up
+ SDLK_PAGEUP:
+ begin
+ if (MP3Volume<100) then
+ MP3Volume := MP3Volume+5;
+ Music.SetVolume(MP3Volume);
+ Text[TextDebug].Text := 'MP3 Volume: ' + IntToStr(MP3Volume) + '%';
+ end;
+
+ //MP3-Volume Down
+ SDLK_PAGEDOWN:
+ begin
+ if (MP3Volume>0) then
+ MP3Volume := MP3Volume-5;
+ Music.SetVolume(MP3Volume);
+ Text[TextDebug].Text := 'MP3 Volume: ' + IntToStr(MP3Volume) + '%';
+ end;
+
+ end;
+ end;
+ end; // if
+end;
+
+function TScreenEditSub.ParseInputEditText(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+var
+ SDL_ModState: Word;
+begin
+ // used when in Text Edit Mode
+ Result := true;
+
+ SDL_ModState := SDL_GetModState and (KMOD_LSHIFT + KMOD_RSHIFT
+ + KMOD_LCTRL + KMOD_RCTRL + KMOD_LALT + KMOD_RALT {+ KMOD_CAPS});
+
+ if Ini.Debug=1 then
+ Text[TextDebug].Text := 'PressedKey: ' + IntToStr(PressedKey) + ' ScanCode: ' + IntToStr(ScanCode);
+
+ // check normal keys
+ if not (ScanCode in [0..31, 127..159]) then //=isPrintable
+ begin
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Tekst :=
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Tekst + chr(ScanCode);
+
+ Lyric.ChangeCurText(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Tekst);
+ Lyric.AddCzesc(Czesci[0].Akt);
+ Exit;
+ end;
+
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_ESCAPE:
+ begin
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Tekst := editText;
+ Lyric.AddCzesc(Czesci[0].Akt);
+ TextEditMode := false;
+ end;
+ SDLK_F4, SDLK_RETURN:
+ begin
+ // Exit Text Edit Mode
+ TextEditMode := false;
+ end;
+
+ SDLK_BACKSPACE:
+ begin
+ Delete(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Tekst,
+ Length(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Tekst), 1);
+
+ Lyric.ChangeCurText(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Tekst);
+ Lyric.AddCzesc(Czesci[0].Akt);
+ end;
+ SDLK_RIGHT:
+ begin
+ // right
+ if SDL_ModState = 0 then begin
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 0;
+ Inc(AktNuta);
+ if AktNuta = Czesci[0].Czesc[Czesci[0].Akt].IlNut then AktNuta := 0;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 2;
+ Lyric.Selected := AktNuta;
+ editText := Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Tekst;
+ end;
+ end;
+ SDLK_LEFT:
+ begin
+ // left
+ if SDL_ModState = 0 then begin
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 0;
+ Dec(AktNuta);
+ if AktNuta = -1 then AktNuta := Czesci[0].Czesc[Czesci[0].Akt].HighNut;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 2;
+ Lyric.Selected := AktNuta;
+ editText := Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Tekst;
+ end;
+ end;
+ end;
+ end;
+end;
+
+procedure TScreenEditSub.NewBeat;
+begin
+ // click
+{ for Pet := 0 to Czesci[0].Czesc[Czesci[0].Akt].HighNut do
+ if (Czesci[0].Czesc[Czesci[0].Akt].Nuta[Pet].Start = Czas.AktBeat) then begin
+ // old}
+// Music.PlayClick;
+end;
+
+procedure TScreenEditSub.CzesciDivide;
+var
+ C: integer;
+ N: integer;
+begin
+ AktSong.BPM[0].BPM := AktSong.BPM[0].BPM / 2;
+ for C := 0 to Czesci[0].High do begin
+ Czesci[0].Czesc[C].Start := Czesci[0].Czesc[C].Start div 2;
+ Czesci[0].Czesc[C].StartNote := Czesci[0].Czesc[C].StartNote div 2;
+ Czesci[0].Czesc[C].Koniec := Czesci[0].Czesc[C].Koniec div 2;
+ for N := 0 to Czesci[0].Czesc[C].HighNut do begin
+ Czesci[0].Czesc[C].Nuta[N].Start := Czesci[0].Czesc[C].Nuta[N].Start div 2;
+ Czesci[0].Czesc[C].Nuta[N].Dlugosc := Round(Czesci[0].Czesc[C].Nuta[N].Dlugosc / 2);
+ end; // N
+ end; // C
+end;
+
+procedure TScreenEditSub.CzesciMultiply;
+var
+ C: integer;
+ N: integer;
+begin
+ AktSong.BPM[0].BPM := AktSong.BPM[0].BPM * 2;
+ for C := 0 to Czesci[0].High do begin
+ Czesci[0].Czesc[C].Start := Czesci[0].Czesc[C].Start * 2;
+ Czesci[0].Czesc[C].StartNote := Czesci[0].Czesc[C].StartNote * 2;
+ Czesci[0].Czesc[C].Koniec := Czesci[0].Czesc[C].Koniec * 2;
+ for N := 0 to Czesci[0].Czesc[C].HighNut do begin
+ Czesci[0].Czesc[C].Nuta[N].Start := Czesci[0].Czesc[C].Nuta[N].Start * 2;
+ Czesci[0].Czesc[C].Nuta[N].Dlugosc := Czesci[0].Czesc[C].Nuta[N].Dlugosc * 2;
+ end; // N
+ end; // C
+end;
+
+procedure TScreenEditSub.LyricsCapitalize;
+var
+ C: integer;
+ N: integer; // temporary
+ S: string;
+begin
+ // temporary
+{ for C := 0 to Czesci[0].High do
+ for N := 0 to Czesci[0].Czesc[C].HighNut do
+ Czesci[0].Czesc[C].Nuta[N].Tekst := AnsiLowerCase(Czesci[0].Czesc[C].Nuta[N].Tekst);}
+
+ for C := 0 to Czesci[0].High do begin
+ S := AnsiUpperCase(Copy(Czesci[0].Czesc[C].Nuta[0].Tekst, 1, 1));
+ S := S + Copy(Czesci[0].Czesc[C].Nuta[0].Tekst, 2, Length(Czesci[0].Czesc[C].Nuta[0].Tekst)-1);
+ Czesci[0].Czesc[C].Nuta[0].Tekst := S;
+ end; // C
+ Lyric.AddCzesc(Czesci[0].Akt);
+end;
+
+procedure TScreenEditSub.LyricsCorrectSpaces;
+var
+ C: integer;
+ N: integer;
+begin
+ for C := 0 to Czesci[0].High do begin
+ // correct starting spaces in the first word
+ while Copy(Czesci[0].Czesc[C].Nuta[0].Tekst, 1, 1) = ' ' do
+ Czesci[0].Czesc[C].Nuta[0].Tekst := Copy(Czesci[0].Czesc[C].Nuta[0].Tekst, 2, 100);
+
+ // move spaces on the start to the end of the previous note
+ for N := 1 to Czesci[0].Czesc[C].HighNut do begin
+ while (Copy(Czesci[0].Czesc[C].Nuta[N].Tekst, 1, 1) = ' ') do begin
+ Czesci[0].Czesc[C].Nuta[N].Tekst := Copy(Czesci[0].Czesc[C].Nuta[N].Tekst, 2, 100);
+ Czesci[0].Czesc[C].Nuta[N-1].Tekst := Czesci[0].Czesc[C].Nuta[N-1].Tekst + ' ';
+ end;
+ end; // N
+
+ // correct '-' to '- '
+ for N := 0 to Czesci[0].Czesc[C].HighNut do begin
+ if Czesci[0].Czesc[C].Nuta[N].Tekst = '-' then
+ Czesci[0].Czesc[C].Nuta[N].Tekst := '- ';
+ end; // N
+
+ // add space to the previous note when the current word is '- '
+ for N := 1 to Czesci[0].Czesc[C].HighNut do begin
+ if Czesci[0].Czesc[C].Nuta[N].Tekst = '- ' then
+ Czesci[0].Czesc[C].Nuta[N-1].Tekst := Czesci[0].Czesc[C].Nuta[N-1].Tekst + ' ';
+ end; // N
+
+ // correct too many spaces at the end of note
+ for N := 0 to Czesci[0].Czesc[C].HighNut do begin
+ while Copy(Czesci[0].Czesc[C].Nuta[N].Tekst, Length(Czesci[0].Czesc[C].Nuta[N].Tekst)-1, 2) = ' ' do
+ Czesci[0].Czesc[C].Nuta[N].Tekst := Copy(Czesci[0].Czesc[C].Nuta[N].Tekst, 1, Length(Czesci[0].Czesc[C].Nuta[N].Tekst)-1);
+ end; // N
+
+ // and correct if there is no space at the end of sentence
+ N := Czesci[0].Czesc[C].HighNut;
+ if Copy(Czesci[0].Czesc[C].Nuta[N].Tekst, Length(Czesci[0].Czesc[C].Nuta[N].Tekst), 1) <> ' ' then
+ Czesci[0].Czesc[C].Nuta[N].Tekst := Czesci[0].Czesc[C].Nuta[N].Tekst + ' ';
+
+ end; // C
+ Lyric.AddCzesc(Czesci[0].Akt);
+end;
+
+procedure TScreenEditSub.FixTimings;
+var
+ C: integer;
+ S: integer;
+ Min: integer;
+ Max: integer;
+begin
+ for C := 1 to Czesci[0].High do begin
+ with Czesci[0].Czesc[C-1] do begin
+ Min := Nuta[HighNut].Start + Nuta[HighNut].Dlugosc;
+ Max := Czesci[0].Czesc[C].StartNote;
+ case (Max - Min) of
+ 0: S := Max;
+ 1: S := Max;
+ 2: S := Max - 1;
+ 3: S := Max - 2;
+ else
+ S := Min + 2;
+
+ end; // case
+
+ Czesci[0].Czesc[C].Start := S;
+ end; // with
+ end; // for
+end;
+
+procedure TScreenEditSub.DivideSentence;
+var
+ C: integer;
+ CStart: integer;
+ CNew: integer;
+ CLen: integer;
+ N: integer;
+ NStart: integer;
+ NHigh: integer;
+ NNewL: integer;
+begin
+ // increase sentence length by 1
+ CLen := Length(Czesci[0].Czesc);
+ SetLength(Czesci[0].Czesc, CLen + 1);
+ Inc(Czesci[0].Ilosc);
+ Inc(Czesci[0].High);
+
+ // move needed sentences to one forward. newly has the copy of divided sentence
+ CStart := Czesci[0].Akt;
+ for C := CLen-1 downto CStart do
+ Czesci[0].Czesc[C+1] := Czesci[0].Czesc[C];
+
+ // clear and set new sentence
+ CNew := CStart + 1;
+ NStart := AktNuta;
+ Czesci[0].Czesc[CNew].Start := Czesci[0].Czesc[CStart].Nuta[NStart].Start;
+ Czesci[0].Czesc[CNew].StartNote := Czesci[0].Czesc[CStart].Nuta[NStart].Start;
+ Czesci[0].Czesc[CNew].Lyric := '';
+ Czesci[0].Czesc[CNew].LyricWidth := 0;
+ Czesci[0].Czesc[CNew].Koniec := 0;
+ Czesci[0].Czesc[CNew].BaseNote := 0; // 0.5.0: we modify it later in this procedure
+ Czesci[0].Czesc[CNew].IlNut := 0;
+ Czesci[0].Czesc[CNew].HighNut := -1;
+ SetLength(Czesci[0].Czesc[CNew].Nuta, 0);
+
+ // move right notes to new sentences
+ NHigh := Czesci[0].Czesc[CStart].HighNut;
+ for N := NStart to NHigh do begin
+ NNewL := Czesci[0].Czesc[CNew].IlNut;
+ SetLength(Czesci[0].Czesc[CNew].Nuta, NNewL + 1);
+ Czesci[0].Czesc[CNew].Nuta[NNewL] := Czesci[0].Czesc[CStart].Nuta[N];
+
+ // increase sentence counters
+ Inc(Czesci[0].Czesc[CNew].IlNut);
+ Inc(Czesci[0].Czesc[CNew].HighNut);
+ Czesci[0].Czesc[CNew].Koniec := Czesci[0].Czesc[CNew].Nuta[NNewL].Start +
+ Czesci[0].Czesc[CNew].Nuta[NNewL].Dlugosc;
+ end;
+
+ // clear old notes and set sentence counters
+ Czesci[0].Czesc[CStart].HighNut := NStart - 1;
+ Czesci[0].Czesc[CStart].IlNut := Czesci[0].Czesc[CStart].HighNut + 1;
+ Czesci[0].Czesc[CStart].Koniec := Czesci[0].Czesc[CStart].Nuta[NStart-1].Start +
+ Czesci[0].Czesc[CStart].Nuta[NStart-1].Dlugosc;
+ SetLength(Czesci[0].Czesc[CStart].Nuta, Czesci[0].Czesc[CStart].IlNut);
+
+ // 0.5.0: modify BaseNote
+ Czesci[0].Czesc[CNew].BaseNote := 120;
+ for N := 0 to Czesci[0].Czesc[CNew].IlNut do
+ if Czesci[0].Czesc[CNew].Nuta[N].Ton < Czesci[0].Czesc[CNew].BaseNote then
+ Czesci[0].Czesc[CNew].BaseNote := Czesci[0].Czesc[CNew].Nuta[N].Ton;
+
+ Czesci[0].Akt := Czesci[0].Akt + 1;
+ AktNuta := 0;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 2;
+ Lyric.AddCzesc(Czesci[0].Akt);
+
+end;
+
+procedure TScreenEditSub.JoinSentence;
+var
+ C: integer;
+ N: integer;
+ NStart: integer;
+ NDst: integer;
+begin
+ C := Czesci[0].Akt;
+
+ // set new sentence
+ NStart := Czesci[0].Czesc[C].IlNut;
+ Czesci[0].Czesc[C].IlNut := Czesci[0].Czesc[C].IlNut + Czesci[0].Czesc[C+1].IlNut;
+ Czesci[0].Czesc[C].HighNut := Czesci[0].Czesc[C].HighNut + Czesci[0].Czesc[C+1].IlNut;
+ SetLength(Czesci[0].Czesc[C].Nuta, Czesci[0].Czesc[C].IlNut);
+
+ // move right notes to new sentences
+ for N := 0 to Czesci[0].Czesc[C+1].HighNut do begin
+ NDst := NStart + N;
+ Czesci[0].Czesc[C].Nuta[NDst] := Czesci[0].Czesc[C+1].Nuta[N];
+ end;
+
+ // increase sentence counters
+ NDst := Czesci[0].Czesc[C].HighNut;
+ Czesci[0].Czesc[C].Koniec := Czesci[0].Czesc[C].Nuta[NDst].Start +
+ Czesci[0].Czesc[C].Nuta[NDst].Dlugosc;
+
+ // move needed sentences to one backward.
+ for C := Czesci[0].Akt + 1 to Czesci[0].High - 1 do
+ Czesci[0].Czesc[C] := Czesci[0].Czesc[C+1];
+
+ // increase sentence length by 1
+ SetLength(Czesci[0].Czesc, Length(Czesci[0].Czesc) - 1);
+ Dec(Czesci[0].Ilosc);
+ Dec(Czesci[0].High);
+ Lyric.AddCzesc(Czesci[0].Akt);
+end;
+
+procedure TScreenEditSub.DivideNote;
+var
+ C: integer;
+ N: integer;
+ NLen: integer;
+begin
+ C := Czesci[0].Akt;
+
+ NLen := Czesci[0].Czesc[C].IlNut + 1;
+ SetLength(Czesci[0].Czesc[C].Nuta, NLen);
+ Inc(Czesci[0].Czesc[C].HighNut);
+ Inc(Czesci[0].Czesc[C].IlNut);
+
+ // we copy all notes including selected one
+ for N := Czesci[0].Czesc[C].HighNut downto AktNuta+1 do begin
+ Czesci[0].Czesc[C].Nuta[N] := Czesci[0].Czesc[C].Nuta[N-1];
+ end;
+
+ // me slightly modify new note
+ Czesci[0].Czesc[C].Nuta[AktNuta].Dlugosc := 1;
+ Inc(Czesci[0].Czesc[C].Nuta[AktNuta+1].Start);
+ Dec(Czesci[0].Czesc[C].Nuta[AktNuta+1].Dlugosc);
+ Czesci[0].Czesc[C].Nuta[AktNuta+1].Tekst := '- ';
+ Czesci[0].Czesc[C].Nuta[AktNuta+1].Color := 2;
+ Lyric.AddCzesc(Czesci[0].Akt);
+end;
+
+procedure TScreenEditSub.DeleteNote;
+var
+ C: integer;
+ N: integer;
+ NLen: integer;
+begin
+ C := Czesci[0].Akt;
+
+ //Do Not delete Last Note
+ if (Czesci[0].High > 0) OR (Czesci[0].Czesc[C].HighNut > 0) then
+ begin
+
+ // we copy all notes from the next to the selected one
+ for N := AktNuta+1 to Czesci[0].Czesc[C].HighNut do begin
+ Czesci[0].Czesc[C].Nuta[N-1] := Czesci[0].Czesc[C].Nuta[N];
+ end;
+
+ NLen := Czesci[0].Czesc[C].IlNut - 1;
+
+ if (NLen > 0) then
+ begin
+ SetLength(Czesci[0].Czesc[C].Nuta, NLen);
+ Dec(Czesci[0].Czesc[C].HighNut);
+ Dec(Czesci[0].Czesc[C].IlNut);
+
+
+ // me slightly modify new note
+ if AktNuta > Czesci[0].Czesc[C].HighNut then Dec(AktNuta);
+ Czesci[0].Czesc[C].Nuta[AktNuta].Color := 2;
+ end
+ //Last Note of current Sentence Deleted - > Delete Sentence
+ else
+ begin
+ //Move all Sentences after the current to the Left
+ for N := C+1 to Czesci[0].High do
+ Czesci[0].Czesc[N-1] := Czesci[0].Czesc[N];
+
+ //Delete Last Sentence
+ SetLength(Czesci[0].Czesc, Czesci[0].High);
+ Czesci[0].High := High(Czesci[0].Czesc);
+ Czesci[0].Ilosc := Length(Czesci[0].Czesc);
+
+ AktNuta := 0;
+ if (C > 0) then
+ Czesci[0].Akt := C - 1
+ else
+ Czesci[0].Akt := 0;
+
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 2;
+ end;
+ end;
+ Lyric.AddCzesc(Czesci[0].Akt);
+end;
+
+procedure TScreenEditSub.TransposeNote(Transpose: integer);
+begin
+ Inc(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Ton, Transpose);
+end;
+
+procedure TScreenEditSub.ChangeWholeTone(Tone: integer);
+var
+ C: integer;
+ N: integer;
+begin
+ for C := 0 to Czesci[0].High do begin
+ Czesci[0].Czesc[C].BaseNote := Czesci[0].Czesc[C].BaseNote + Tone;
+ for N := 0 to Czesci[0].Czesc[C].HighNut do
+ Czesci[0].Czesc[C].Nuta[N].Ton := Czesci[0].Czesc[C].Nuta[N].Ton + Tone;
+ end;
+end;
+
+procedure TScreenEditSub.MoveAllToEnd(Move: integer);
+var
+ C: integer;
+ N: integer;
+ NStart: integer;
+begin
+ for C := Czesci[0].Akt to Czesci[0].High do begin
+ NStart := 0;
+ if C = Czesci[0].Akt then NStart := AktNuta;
+ for N := NStart to Czesci[0].Czesc[C].HighNut do begin
+ Inc(Czesci[0].Czesc[C].Nuta[N].Start, Move); // move note start
+
+ if N = 0 then begin // fix beginning
+ Inc(Czesci[0].Czesc[C].Start, Move);
+ Inc(Czesci[0].Czesc[C].StartNote, Move);
+ end;
+
+ if N = Czesci[0].Czesc[C].HighNut then // fix ending
+ Inc(Czesci[0].Czesc[C].Koniec, Move);
+
+ end; // for
+ end; // for
+ Lyric.AddCzesc(Czesci[0].Akt);
+end;
+
+procedure TScreenEditSub.MoveTextToRight;
+var
+ C: integer;
+ N: integer;
+ NHigh: integer;
+begin
+{ C := Czesci[0].Akt;
+
+ for N := Czesci[0].Czesc[C].HighNut downto 1 do begin
+ Czesci[0].Czesc[C].Nuta[N].Tekst := Czesci[0].Czesc[C].Nuta[N-1].Tekst;
+ end; // for
+
+ Czesci[0].Czesc[C].Nuta[0].Tekst := '- ';}
+
+ C := Czesci[0].Akt;
+ NHigh := Czesci[0].Czesc[C].HighNut;
+
+ // last word
+ Czesci[0].Czesc[C].Nuta[NHigh].Tekst := Czesci[0].Czesc[C].Nuta[NHigh-1].Tekst + Czesci[0].Czesc[C].Nuta[NHigh].Tekst;
+
+ // other words
+ for N := NHigh - 1 downto AktNuta + 1 do begin
+ Czesci[0].Czesc[C].Nuta[N].Tekst := Czesci[0].Czesc[C].Nuta[N-1].Tekst;
+ end; // for
+ Czesci[0].Czesc[C].Nuta[AktNuta].Tekst := '- ';
+ Lyric.AddCzesc(Czesci[0].Akt);
+end;
+
+procedure TScreenEditSub.MarkSrc;
+begin
+ CopySrc := Czesci[0].Akt;
+end;
+
+procedure TScreenEditSub.PasteText;
+var
+ C: integer;
+ N: integer;
+begin
+ C := Czesci[0].Akt;
+
+ for N := 0 to Czesci[0].Czesc[CopySrc].HighNut do
+ Czesci[0].Czesc[C].Nuta[N].Tekst := Czesci[0].Czesc[CopySrc].Nuta[N].Tekst;
+ Lyric.AddCzesc(Czesci[0].Akt);
+end;
+
+procedure TScreenEditSub.CopySentence(Src, Dst: integer);
+var
+ N: integer;
+ Time1: integer;
+ Time2: integer;
+ TD: integer;
+begin
+ Time1 := Czesci[0].Czesc[Src].Nuta[0].Start;
+ Time2 := Czesci[0].Czesc[Dst].Nuta[0].Start;
+ TD := Time2-Time1;
+
+ SetLength(Czesci[0].Czesc[Dst].Nuta, Czesci[0].Czesc[Src].IlNut);
+ Czesci[0].Czesc[Dst].IlNut := Czesci[0].Czesc[Src].IlNut;
+ Czesci[0].Czesc[Dst].HighNut := Czesci[0].Czesc[Src].HighNut;
+ for N := 0 to Czesci[0].Czesc[Src].HighNut do begin
+ Czesci[0].Czesc[Dst].Nuta[N].Tekst := Czesci[0].Czesc[Src].Nuta[N].Tekst;
+ Czesci[0].Czesc[Dst].Nuta[N].Dlugosc := Czesci[0].Czesc[Src].Nuta[N].Dlugosc;
+ Czesci[0].Czesc[Dst].Nuta[N].Ton := Czesci[0].Czesc[Src].Nuta[N].Ton;
+ Czesci[0].Czesc[Dst].Nuta[N].Start := Czesci[0].Czesc[Src].Nuta[N].Start + TD;
+ end;
+ N := Czesci[0].Czesc[Src].HighNut;
+ Czesci[0].Czesc[Dst].Koniec := Czesci[0].Czesc[Dst].Nuta[N].Start + Czesci[0].Czesc[Dst].Nuta[N].Dlugosc;
+end;
+
+procedure TScreenEditSub.CopySentences(Src, Dst, Num: integer);
+var
+ C: integer;
+begin
+ // create place for new sentences
+ SetLength(Czesci[0].Czesc, Czesci[0].Ilosc + Num - 1);
+
+ // moves sentences next to the destination
+ for C := Czesci[0].High downto Dst + 1 do begin
+ Czesci[0].Czesc[C + Num - 1] := Czesci[0].Czesc[C];
+ end;
+
+ // prepares new sentences: sets sentence start and create first note
+ for C := 1 to Num-1 do begin
+ Czesci[0].Czesc[Dst + C].Start := Czesci[0].Czesc[Dst + C - 1].StartNote +
+ (Czesci[0].Czesc[Src + C].StartNote - Czesci[0].Czesc[Src + C - 1].StartNote);
+ SetLength(Czesci[0].Czesc[Dst + C].Nuta, 1);
+ Czesci[0].Czesc[Dst + C].IlNut := 1;
+ Czesci[0].Czesc[Dst + C].HighNut := 0;
+ Czesci[0].Czesc[Dst + C].Nuta[0].Start := Czesci[0].Czesc[Dst + C].Start;
+ Czesci[0].Czesc[Dst + C].Nuta[0].Dlugosc := 1;
+ Czesci[0].Czesc[Dst + C].StartNote := Czesci[0].Czesc[Dst + C].Start;
+ Czesci[0].Czesc[Dst + C].Koniec := Czesci[0].Czesc[Dst + C].Start + 1;
+ end;
+
+ // increase counters
+ Czesci[0].Ilosc := Czesci[0].Ilosc + Num - 1;
+ Czesci[0].High := Czesci[0].High + Num - 1;
+
+ for C := 0 to Num-1 do
+ CopySentence(Src + C, Dst + C);
+end;
+
+
+constructor TScreenEditSub.Create;
+begin
+ inherited Create;
+ SetLength(Player, 1);
+
+ //Theme:
+ //bg
+ AddStatic(0, 0, 800, 600, 0.3, 0.5, 0.6, Skin.GetTextureFileName('ButtonFade'), 'JPG', 'Font Black');
+
+ // Line
+ AddStatic(20, 5, 200, 40, 0.95, 0.95, 0.95, Skin.GetTextureFileName('ButtonFade'), 'JPG', 'Font Black');
+ AddText(40, 14, 1, 8, 0, 0, 0, 'Line:');
+ TextSentence := AddText(110, 14, 1, 8, 0, 0, 0, '0 / 0');
+
+ // Note
+ AddStatic(260, 5, 200, 40, 0.95, 0.95, 0.95, Skin.GetTextureFileName('ButtonFade'), 'JPG', 'Font Black');
+ AddText(282, 14, 1, 8, 0, 0, 0, 'Note:');
+ TextNote := AddText(360, 14, 1, 8, 0, 0, 0, '0 / 0');
+
+ // some borders
+ AddStatic(18, 53, 764, 240, 0, 0, 0, Skin.GetTextureFileName('ButtonFade'), 'JPG', 'Font Black');
+ AddStatic(20, 55, 760, 236, 0.95, 0.95, 0.95, Skin.GetTextureFileName('ButtonFade'), 'JPG', 'Font Black');
+
+ AddStatic(18, 303, 764, 139, 0, 0, 0, Skin.GetTextureFileName('ButtonFade'), 'JPG', 'Font Black');
+ AddStatic(20, 305, 760, 135, 0.95, 0.95, 0.95, Skin.GetTextureFileName('ButtonFade'), 'JPG', 'Font Black');
+
+ AddStatic(18, 498, 764, 44, 0, 0, 0, Skin.GetTextureFileName('ButtonFade'), 'JPG', 'Font Black');
+ AddStatic(20, 500, 760, 40, 0.95, 0.95, 0.95, Skin.GetTextureFileName('ButtonFade'), 'JPG', 'Font Black');
+
+
+ AddText(30, 65, 0, 8, 0, 0, 0, 'Title:');
+ AddText(30, 90, 0, 8, 0, 0, 0, 'Artist:');
+ AddText(30, 115, 0, 8, 0, 0, 0, 'Mp3:');
+ AddText(30, 140, 0, 8, 0, 0, 0, 'BPM:');
+ AddText(30, 165, 0, 8, 0, 0, 0, 'GAP:');
+
+ TextTitle := AddText(180, 65, 0, 8, 0, 0, 0, 'a');
+ TextArtist := AddText(180, 90, 0, 8, 0, 0, 0, 'b');
+ TextMp3 := AddText(180, 115, 0, 8, 0, 0, 0, 'c');
+ TextBPM := AddText(180, 140, 0, 8, 0, 0, 0, 'd');
+ TextGAP := AddText(180, 165, 0, 8, 0, 0, 0, 'e');
+
+{ AddInteraction(2, TextTitle);
+ AddInteraction(2, TextArtist);
+ AddInteraction(2, TextMp3);
+ AddInteraction(2, TextBPM);
+ AddInteraction(2, TextGAP);}
+
+ // note info
+ AddText(30, 190, 0, 8, 0, 0, 0, 'Start:');
+ AddText(30, 215, 0, 8, 0, 0, 0, 'Duration:');
+ AddText(30, 240, 0, 8, 0, 0, 0, 'Tone:');
+ AddText(30, 265, 0, 8, 0, 0, 0, 'Text:');
+
+ TextNStart := AddText(180, 190, 0, 8, 0, 0, 0, 'a');
+ TextNDlugosc := AddText(180, 215, 0, 8, 0, 0, 0, 'b');
+ TextNTon := AddText(180, 240, 0, 8, 0, 0, 0, 'c');
+ TextNText := AddText(180, 265, 0, 8, 0, 0, 0, 'd');
+
+ // debug
+ TextDebug := AddText(30, 550, 0, 9, 0, 0, 0, '');
+end;
+
+procedure TScreenEditSub.onShow;
+begin
+ Log.LogStatus('Initializing', 'TEditScreen.onShow');
+
+ try
+ ResetSingTemp;
+ AktSong := CatSongs.Song[SongIndex];
+ Error := not LoadSong(Path + FileName, SONG_LOAD_COMPLETE);
+ if not Error then
+ FindRefrainStart(AktSong);
+ except
+ Error := True;
+ end;
+
+ if Error then
+ begin
+ //Error Loading Song -> Go back to Song Screen and Show some Error Message
+ FadeTo(@ScreenSong);
+ ScreenPopupError.ShowPopup (Language.Translate('ERROR_CORRUPT_SONG'));
+ Exit;
+ end
+ else begin
+ MidiOut := TMidiOutput.Create(nil);
+ MidiOut.Open;
+
+ //Set Volume
+ MP3Volume := 50;
+ Music.SetVolume(MP3Volume);
+
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenEditSub)');
+
+ Text[TextTitle].Text := AktSong.Title;
+ Text[TextArtist].Text := AktSong.Artist;
+ Text[TextMp3].Text := AktSong.Mp3;
+
+ Czesci[0].Akt := 0;
+ AktNuta := 0;
+ noteStart := 0; //when playing sentence
+ Czesci[0].Czesc[0].Nuta[0].Color := 2;
+
+ if AktSong.Medley.Source <> msNone then
+ begin
+ MedleyNotes.isStart := true;
+ MedleyNotes.isEnd := true;
+ MedleyNotes.start := FindNote(AktSong.Medley.StartBeat);
+ MedleyNotes.end_ := FindNote(AktSong.Medley.EndBeat);
+ Czesci[0].Czesc[MedleyNotes.start.line].Nuta[MedleyNotes.start.note].IsMedley := true;
+ Czesci[0].Czesc[MedleyNotes.end_.line].Nuta[MedleyNotes.end_.note].IsMedley := true;
+ end;
+
+ //set Preview Start
+ MedleyNotes.Preview := FindNote(round(GetMidBeat(AktSong.PreviewStart-AktSong.Gap/1000)));
+ Czesci[0].Czesc[MedleyNotes.Preview.line].Nuta[MedleyNotes.Preview.note].IsStartPreview := true;
+ AktSong.PreviewStart := GetTimeFromBeat(Czesci[0].Czesc[MedleyNotes.Preview.line].Nuta[MedleyNotes.Preview.note].start);
+
+ Music.Open(Path + AktSong.Mp3);
+ //Set Down Music Volume for Better hearability of Midi Sounds
+ //Music.SetVolume(40);
+
+ Lyric.Clear;
+ Lyric.X := 400;
+ Lyric.Y := 500;
+ Lyric.Align := 1;
+ Lyric.Size := 14;
+ Lyric.ColR := 0;
+ Lyric.ColG := 0;
+ Lyric.ColB := 0;
+ Lyric.ColSR := Skin_FontHighlightR;
+ Lyric.ColSG := Skin_FontHighlightG;
+ Lyric.ColSB := Skin_FontHighlightB;
+ Lyric.Style := 0;
+ Lyric.AddCzesc(0);
+ Lyric.Selected := 0;
+
+ NotesH := 7;
+ NotesW := 4;
+
+ end;
+
+// Interaction := 0;
+ TextEditMode := false;
+end;
+
+function TScreenEditSub.Draw: boolean;
+var
+ Min: integer;
+ Sec: integer;
+ Tekst: string;
+ Pet: integer;
+ AktBeat: integer;
+ PlayClick: boolean;
+ line, note: integer;
+ end_: boolean;
+begin
+ glClearColor(1,1,1,1);
+
+ PlayClick := false;
+ if PlaySentenceMidi or PlaySentence then
+ begin
+ MidiPos := USTime.GetTime - MidiTime + MidiStart;
+ // click
+ if PlaySentence then
+ begin
+ AktBeat := Floor(GetMidBeat(Music.Position - AktSong.GAP / 1000));
+ if Music.Position>PlayStopTime then
+ end_ := true
+ else
+ end_ := false;
+ end else
+ begin
+ AktBeat := Floor(GetMidBeat(MidiPos - AktSong.GAP / 1000));
+ if MidiPos>MidiStop then
+ end_ := true
+ else
+ end_ := false;
+ end;
+
+ if AktBeat <> LastClick then
+ begin
+ for line := 0 to Length(Czesci[0].Czesc) - 1 do
+ begin
+ for note := 0 to Length(Czesci[0].Czesc[line].Nuta) - 1 do
+ begin
+ //line change
+ if (Czesci[0].Czesc[line].Start = AktBeat) and (line <> Czesci[0].Akt) and not end_ then
+ begin
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 0;
+ AktNuta := 0;
+ Inc(Czesci[0].Akt);
+ if Czesci[0].Akt > Length(Czesci[0].Czesc)-1 then //useful?
+ Czesci[0].Akt := 0;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 1;
+ Lyric.AddCzesc(Czesci[0].Akt);
+ Lyric.Selected := AktNuta;
+ LineChanged := true;
+ end;
+
+ if (Czesci[0].Czesc[line].Nuta[note].Start = AktBeat) then
+ begin
+ LastClick := AktBeat;
+ PlayClick := true;
+ end;
+ end;
+ end;
+ end;
+ end else
+ LineChanged := false;
+
+ // midi music
+ if PlaySentenceMidi then begin
+
+ // stop the music
+ if end_ then begin
+ MidiOut.PutShort($81, Czesci[0].Czesc[Czesci[0].Akt].Nuta[MidiLastNote].Ton + 60, 127);
+ PlaySentenceMidi := false;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 0;
+ AktNuta := noteStart;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 2;
+ Lyric.Selected := AktNuta;
+ end;
+
+ // click
+ Text[TextDebug].Text := IntToStr(AktBeat);
+
+ if PlayClick then
+ begin
+ for Pet := 0 to Czesci[0].Czesc[Czesci[0].Akt].HighNut do
+ if (Czesci[0].Czesc[Czesci[0].Akt].Nuta[Pet].Start = AktBeat) then
+ begin
+ if Pet > 0 then
+ MidiOut.PutShort($81, Czesci[0].Czesc[Czesci[0].Akt].Nuta[Pet-1].Ton + 60, 127);
+ MidiOut.PutShort($91, Czesci[0].Czesc[Czesci[0].Akt].Nuta[Pet].Ton + 60, 127);
+ MidiLastNote := Pet;
+ end;
+ end;
+ end; // if PlaySentenceMidi
+
+ // mp3 music
+ if PlaySentence then
+ begin
+ // stop the music
+ if end_ then begin
+ Music.Stop;
+ PlaySentence := false;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 0;
+ AktNuta := noteStart;
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 2;
+ Lyric.Selected := AktNuta;
+ end;
+
+ if (Click) and (PlaySentence) then
+ begin
+ Text[TextDebug].Text := IntToStr(AktBeat);
+ if PlayClick then
+ Music.PlayClick;
+ end; // click
+ end;
+
+ // move "cursor"
+ if (PlaySentence or PlaySentenceMidi) then
+ begin
+ for line := 0 to Length(Czesci[0].Czesc) - 1 do
+ begin
+ for note := 0 to Length(Czesci[0].Czesc[line].Nuta) - 1 do
+ begin
+ //note change
+ if (Czesci[0].Czesc[line].Nuta[note].Start = AktBeat) and
+ ((note <> AktNuta) or LineChanged) then
+ begin
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 0;
+ if not LineChanged then
+ Inc(AktNuta)
+ else
+ LineChanged := false;
+
+ Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Color := 2;
+ Lyric.AddCzesc(Czesci[0].Akt);
+ Lyric.Selected := AktNuta;
+ end;
+ end;
+ end;
+ end;
+
+ Text[TextSentence].Text := IntToStr(Czesci[0].Akt + 1) + ' / ' + IntToStr(Czesci[0].Ilosc);
+ Text[TextNote].Text := IntToStr(AktNuta + 1) + ' / ' + IntToStr(Czesci[0].Czesc[Czesci[0].Akt].IlNut);
+
+ // Song info
+ Text[TextBPM].Text := FloatToStr(AktSong.BPM[0].BPM / 4);
+ Text[TextGAP].Text := FloatToStr(AktSong.GAP);
+
+ //Error reading Variables when no Song is loaded
+ if not Error then
+ begin
+ // Note info
+ Text[TextNStart].Text := IntToStr(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Start);
+ Text[TextNDlugosc].Text := IntToStr(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Dlugosc);
+ Text[TextNTon].Text := IntToStr(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Ton) + ' ( ' + GetNoteName(Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Ton) + ' )';
+ Text[TextNText].Text := Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Tekst;
+
+ //F and G and Medley Mod:
+ if Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].FreeStyle then
+ Text[TextNTon].Text := Text[TextNTon].Text + ' *F*'
+ else if Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].Wartosc = 2 then
+ Text[TextNTon].Text := Text[TextNTon].Text + ' *G*';
+
+ if MedleyNotes.isStart and (Czesci[0].Akt = MedleyNotes.start.line)
+ and (AktNuta = MedleyNotes.start.note) then
+ Text[TextNTon].Text := Text[TextNTon].Text + ' MedleyStart';
+ if MedleyNotes.isEnd and (Czesci[0].Akt = MedleyNotes.end_.line) and
+ (AktNuta = MedleyNotes.end_.note) then
+ Text[TextNTon].Text := Text[TextNTon].Text + ' MedleyEnd';
+
+ //preview mod
+ if Czesci[0].Czesc[Czesci[0].Akt].Nuta[AktNuta].IsStartPreview then
+ Text[TextNTon].Text := Text[TextNTon].Text + ' [PreviewStart]';
+ end;
+
+ // Text Edit Mode
+ if TextEditMode then
+ Text[TextNText].Text := Text[TextNText].Text + '|';
+
+ // draw static menu
+ inherited Draw;
+
+ // draw notes
+ SingDrawNoteLines(20, 305, 780, 15);
+ //Error Drawing when no Song is loaded
+ if not Error then
+ begin
+ SingDrawBeatDelimeters(40, 305, 760, 0);
+ EditDrawCzesc(40, 410, 760, 0, 15);
+ end;
+
+ // draw text
+ Lyric.Draw;
+
+end;
+
+procedure TScreenEditSub.onHide;
+begin
+ MidiOut.Close;
+ MidiOut.Free;
+ //Music.SetVolume(100);
+end;
+
+function TScreenEditSub.GetNoteName(Note: Integer): String;
+var N1, N2: Integer;
+begin
+ if (Note > 0) then
+ begin
+ N1 := Note mod 12;
+ N2 := Note div 12;
+ end
+ else
+ begin
+ N1 := (Note + (-Trunc(Note/12)+1)*12) mod 12;
+ N2 := -1;
+ end;
+
+
+
+ case N1 of
+ 0: Result := 'c';
+ 1: Result := 'c#';
+ 2: Result := 'd';
+ 3: Result := 'd#';
+ 4: Result := 'e';
+ 5: Result := 'f';
+ 6: Result := 'f#';
+ 7: Result := 'g';
+ 8: Result := 'g#';
+ 9: Result := 'a';
+ 10: Result := 'b';
+ 11: Result := 'h';
+ end;
+
+ case N2 of
+ 0: Result := UpperCase(Result); //Normal Uppercase Note, 1: Normal lowercase Note
+ 2: Result := Result + ''''; //One Striped
+ 3: Result := Result + ''''''; //Two Striped
+ 4: Result := Result + ''''''''; //etc.
+ 5: Result := Result + '''''''''';
+ 6: Result := Result + '''''''''''';
+ 7: Result := Result + '''''''''''''';
+ end;
+end;
+
+function TScreenEditSub.GetMedleyLength: real;
+begin
+ if MedleyNotes.isStart and MedleyNotes.isEnd then
+ begin
+ Result := GetTimeFromBeat(
+ Czesci[0].Czesc[MedleyNotes.end_.line].Nuta[MedleyNotes.end_.note].Start +
+ Czesci[0].Czesc[MedleyNotes.end_.line].Nuta[MedleyNotes.end_.note].Dlugosc) -
+ GetTimeFromBeat(Czesci[0].Czesc[MedleyNotes.start.line].Nuta[MedleyNotes.start.note].Start);
+ end else
+ Result := 0;
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenLevel.pas b/Game/Code/Screens/UScreenLevel.pas
new file mode 100644
index 00000000..31b5046d
--- /dev/null
+++ b/Game/Code/Screens/UScreenLevel.pas
@@ -0,0 +1,104 @@
+unit UScreenLevel;
+
+interface
+
+uses
+ UMenu, SDL, UDisplay, UMusic, UFiles, SysUtils, UThemes, UHelp;
+
+type
+ TScreenLevel = class(TMenu)
+ const
+ ID='ID_002'; //for help system
+
+ public
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ procedure SetAnimationProgress(Progress: real); override;
+ end;
+
+implementation
+
+uses UGraphic, UMain, UIni, UTexture, ULog;
+
+function TScreenLevel.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+var
+ SDL_ModState: Word;
+begin
+ Result := true;
+ SDL_ModState := SDL_GetModState and (KMOD_LSHIFT + KMOD_RSHIFT
+ + KMOD_LCTRL + KMOD_RCTRL + KMOD_LALT + KMOD_RALT {+ KMOD_CAPS});
+
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ Music.PlayBack;
+ FadeTo(@ScreenName);
+ end;
+
+ SDLK_RETURN:
+ begin
+ Ini.Difficulty := Interaction;
+ Ini.SaveLevel;
+ Music.PlayStart;
+ //Set Standard Mode
+ ScreenSong.Mode := smNormal;
+ FadeTo(@ScreenSong);
+ end;
+
+ // Up and Down could be done at the same time,
+ // but I don't want to declare variables inside
+ // functions like this one, called so many times
+ SDLK_DOWN: InteractNext;
+ SDLK_UP: InteractPrev;
+ SDLK_RIGHT: InteractNext;
+ SDLK_LEFT: InteractPrev;
+ end;
+ end;
+end;
+
+constructor TScreenLevel.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ LoadFromTheme(Theme.Level);
+
+ AddButton(Theme.Level.ButtonEasy);
+ AddButton(Theme.Level.ButtonMedium);
+ AddButton(Theme.Level.ButtonHard);
+
+ Interaction := 0;
+end;
+
+procedure TScreenLevel.onShow;
+begin
+ Interaction := Ini.Difficulty;
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenLevel)');
+// LCD.WriteText(1, ' Choose mode: ');
+// UpdateLCD;
+end;
+
+procedure TScreenLevel.SetAnimationProgress(Progress: real);
+begin
+ Button[0].Texture.ScaleW := Progress;
+ Button[1].Texture.ScaleW := Progress;
+ Button[2].Texture.ScaleW := Progress;
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenLoading.pas b/Game/Code/Screens/UScreenLoading.pas
new file mode 100644
index 00000000..82dfdab2
--- /dev/null
+++ b/Game/Code/Screens/UScreenLoading.pas
@@ -0,0 +1,46 @@
+unit UScreenLoading;
+
+interface
+
+uses
+ UMenu, SDL, SysUtils, UThemes, gl;
+
+type
+ TScreenLoading = class(TMenu)
+ public
+ Fadeout: boolean;
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ function GetBGTexNum: GLUInt;
+ procedure onShow; override;
+ end;
+
+implementation
+
+uses UGraphic, UTime;
+
+function TScreenLoading.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+end;
+
+constructor TScreenLoading.Create;
+begin
+ inherited Create;
+
+ LoadFromTheme(Theme.Loading);
+
+ Fadeout := false;
+end;
+
+procedure TScreenLoading.onShow;
+begin
+// nothing
+end;
+
+function TScreenLoading.GetBGTexNum: GLUInt;
+begin
+ Result := Self.BackImg.TexNum;
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenMain.pas b/Game/Code/Screens/UScreenMain.pas
new file mode 100644
index 00000000..b2b4c497
--- /dev/null
+++ b/Game/Code/Screens/UScreenMain.pas
@@ -0,0 +1,329 @@
+unit UScreenMain;
+
+interface
+
+uses
+ UMenu, SDL, UDisplay, UMusic, UFiles, SysUtils, UThemes, ULCD, ULight, UHelp;
+
+type
+ TScreenMain = class(TMenu)
+ const
+ ID='ID_003'; //for help system
+
+ public
+ TextDescription: integer;
+ TextDescriptionLong: integer;
+
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ procedure InteractNext; override;
+ procedure InteractPrev; override;
+ procedure InteractInc; override;
+ procedure InteractDec; override;
+ procedure UpdateLCD;
+ procedure SetAnimationProgress(Progress: real); override;
+ //function Draw: boolean; override;
+ end;
+
+implementation
+
+uses Windows, UPlaylist, UGraphic, UMain, UIni, UTexture, USongs, Textgl, opengl, ULanguage, UParty, UDLLManager, UScreenCredits, USkins, ULog;
+
+
+function TScreenMain.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+var
+I: Integer;
+SDL_ModState: Word;
+begin
+ Result := true;
+
+ SDL_ModState := SDL_GetModState and (KMOD_LSHIFT + KMOD_RSHIFT
+ + KMOD_LCTRL + KMOD_RCTRL + KMOD_LALT + KMOD_RALT);
+
+ //Deactivate Credits when Key is pressed
+// if Credits_Visible then
+// begin
+// Credits_Visible := False;
+// exit;
+// end;
+
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ Result := False;
+ end;
+
+ SDLK_C:
+ begin
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ //If CreditsScreen is not Created -> Then Create
+ If (ScreenCredits = nil) then
+ begin
+ try
+ //Display White Loading Text
+ SetFontStyle(2); //Font: Outlined1
+ SetFontSize(12);
+ SetFontItalic(False);
+ SetFontPos (400 - glTextWidth ('Loading Credits ...')/2, 250); //Position
+ glColor4f(1,1,1,1);
+ glPrint('Loading Credits ...');
+ SwapBuffers;
+
+ ScreenCredits := TScreenCredits.Create;
+ except
+ Log.LogError ('Couldn''t Create Credits Screen');
+ end;
+ end;
+
+ If (ScreenCredits <> nil) then
+ begin
+ Music.PlayStart;
+ FadeTo(@ScreenCredits);
+ end;
+ end;
+ end;
+ SDLK_M:
+ begin
+ if SDL_ModState = KMOD_LSHIFT then
+ begin
+ if (Length(Songs.Song) >= 1) then
+ begin
+ if (Length(DLLMan.Plugins)>=1) then
+ begin
+ Music.PlayStart;
+ FadeTo(@ScreenPartyOptionsM2);
+ end
+ else //show error message, No Plugins Loaded
+ ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_PLUGINS'));
+ end
+ else //show error message, No Songs Loaded
+ ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_SONGS'));
+ end else
+ begin
+ if (Length(Songs.Song) >= 1) then
+ begin
+ if (Length(DLLMan.Plugins)>=1) then
+ begin
+ Music.PlayStart;
+ FadeTo(@ScreenPartyOptions);
+ end
+ else //show error message, No Plugins Loaded
+ ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_PLUGINS'));
+ end
+ else //show error message, No Songs Loaded
+ ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_SONGS'));
+ end;
+ end;
+
+ SDLK_S:
+ begin
+ Music.PlayStart;
+ FadeTo(@ScreenStatMain);
+ end;
+
+ SDLK_E:
+ begin
+ Music.PlayStart;
+ FadeTo(@ScreenEdit);
+ end;
+
+ SDLK_RETURN:
+ begin
+ //Solo
+ if (Interaction = 0) then
+ begin
+ if (Length(Songs.Song) >= 1) then
+ begin
+ Music.PlayStart;
+ if (Ini.Players >= 0) and (Ini.Players <= 3) then PlayersPlay := Ini.Players + 1;
+ if (Ini.Players = 4) then PlayersPlay := 6;
+
+ ScreenName.Goto_SingScreen := False;
+ FadeTo(@ScreenName);
+ end
+ else //show error message
+ ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_SONGS'));
+ end;
+
+ //Multi
+ if Interaction = 1 then begin
+ if (Length(Songs.Song) >= 1) then
+ begin
+ if (Length(DLLMan.Plugins)>=1) then
+ begin
+ Music.PlayStart;
+ FadeTo(@ScreenPartyOptions);
+ end
+ else //show error message, No Plugins Loaded
+ ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_PLUGINS'));
+ end
+ else //show error message, No Songs Loaded
+ ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_SONGS'));
+ end;
+
+ //Muilti M2
+ if Interaction = 2 then begin
+ if (Length(Songs.Song) >= 1) then
+ begin
+ if (Length(DLLMan.Plugins)>=1) then
+ begin
+ Music.PlayStart;
+ FadeTo(@ScreenPartyOptionsM2);
+ end
+ else //show error message, No Plugins Loaded
+ ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_PLUGINS'));
+ end
+ else //show error message, No Songs Loaded
+ ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_SONGS'));
+ end;
+
+ //Stats
+ if Interaction = 3 then begin
+ Music.PlayStart;
+ FadeTo(@ScreenStatMain);
+ end;
+
+ //Editor
+ if Interaction = 4 then begin
+ Music.PlayStart;
+ FadeTo(@ScreenEdit);
+ end;
+
+ //Options
+ if Interaction = 5 then begin
+ Music.PlayStart;
+ FadeTo(@ScreenOptions);
+ end;
+
+ //Exit
+ if Interaction = 6 then begin
+ Result := false;
+ end;
+ end;
+ // Up and Down could be done at the same time,
+ // but I don't want to declare variables inside
+ // functions like this one, called so many times
+ SDLK_DOWN: InteractInc;
+ SDLK_UP: InteractDec;
+ SDLK_RIGHT: InteractNext;
+ SDLK_LEFT: InteractPrev;
+ end;
+ end
+ else // Key Up
+ case PressedKey of
+ SDLK_RETURN :
+ begin
+ end;
+ end;
+end;
+
+constructor TScreenMain.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ //----------------
+ //Attention ^^:
+ //New Creation Order needed because of LoadFromTheme
+ //and Button Collections.
+ //At First Custom Texts and Statics
+ //Then LoadFromTheme
+ //after LoadFromTheme the Buttons and Selects
+ //----------------
+
+
+ TextDescription := AddText(Theme.Main.TextDescription);
+ TextDescriptionLong := AddText(Theme.Main.TextDescriptionLong);
+
+ LoadFromTheme(Theme.Main);
+
+ AddButton(Theme.Main.ButtonSolo);
+ AddButton(Theme.Main.ButtonMulti);
+ AddButton(Theme.Main.ButtonMultiM2);
+ AddButton(Theme.Main.ButtonStat);
+ AddButton(Theme.Main.ButtonEditor);
+ AddButton(Theme.Main.ButtonOptions);
+ AddButton(Theme.Main.ButtonExit);
+
+ Interaction := 0;
+end;
+
+procedure TScreenMain.onShow;
+begin
+ LCD.WriteText(1, ' Choose mode: ');
+ UpdateLCD;
+ ScreenSong.Mode := smNormal;
+ ScreenSong.SongIndex := -1;
+ PlaylistMan.Mode := 0;
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenMain)');
+end;
+
+procedure TScreenMain.InteractNext;
+begin
+ inherited InteractNext;
+ Text[TextDescription].Text := Theme.Main.Description[Interaction];
+ Text[TextDescriptionLong].Text := Theme.Main.DescriptionLong[Interaction];
+ UpdateLCD;
+ Light.LightOne(1, 200);
+end;
+
+procedure TScreenMain.InteractPrev;
+begin
+ inherited InteractPrev;
+ Text[TextDescription].Text := Theme.Main.Description[Interaction];
+ Text[TextDescriptionLong].Text := Theme.Main.DescriptionLong[Interaction];
+ UpdateLCD;
+ Light.LightOne(0, 200);
+end;
+
+procedure TScreenMain.InteractDec;
+begin
+ inherited InteractDec;
+ Text[TextDescription].Text := Theme.Main.Description[Interaction];
+ Text[TextDescriptionLong].Text := Theme.Main.DescriptionLong[Interaction];
+ UpdateLCD;
+ Light.LightOne(0, 200);
+end;
+
+procedure TScreenMain.InteractInc;
+begin
+ inherited InteractInc;
+ Text[TextDescription].Text := Theme.Main.Description[Interaction];
+ Text[TextDescriptionLong].Text := Theme.Main.DescriptionLong[Interaction];
+ UpdateLCD;
+ Light.LightOne(1, 200);
+end;
+
+procedure TScreenMain.UpdateLCD;
+begin
+ case Interaction of
+ 0: LCD.WriteText(2, ' sing ');
+ 1: LCD.WriteText(2, ' multi ');
+ 2: LCD.WriteText(2, ' options ');
+ 3: LCD.WriteText(2, ' exit ');
+ end
+end;
+
+procedure TScreenMain.SetAnimationProgress(Progress: real);
+begin
+ Static[0].Texture.ScaleW := Progress;
+ Static[0].Texture.ScaleH := Progress;
+end;
+end.
diff --git a/Game/Code/Screens/UScreenName.pas b/Game/Code/Screens/UScreenName.pas
new file mode 100644
index 00000000..d754899b
--- /dev/null
+++ b/Game/Code/Screens/UScreenName.pas
@@ -0,0 +1,243 @@
+unit UScreenName;
+
+interface
+
+uses
+ UMenu, SDL, UDisplay, UMusic, UFiles, SysUtils, UThemes;
+
+type
+ TScreenName = class(TMenu)
+ const
+ ID='ID_004'; //for help system
+
+ public
+ Goto_SingScreen: Boolean; //If True then next Screen in SingScreen
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ procedure SetAnimationProgress(Progress: real); override;
+ end;
+
+implementation
+
+uses UGraphic, UMain, UIni, UTexture, UHelp, ULog;
+
+function TScreenName.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+var
+ I: integer;
+SDL_ModState: Word;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+
+ SDL_ModState := SDL_GetModState and (KMOD_LSHIFT + KMOD_RSHIFT
+ + KMOD_LCTRL + KMOD_RCTRL + KMOD_LALT + KMOD_RALT);
+
+ case PressedKey of
+ SDLK_0..SDLK_9, SDLK_A..SDLK_Z, SDLK_SPACE, SDLK_MINUS, SDLK_EXCLAIM, SDLK_COMMA, SDLK_SLASH, SDLK_ASTERISK, SDLK_QUESTION, SDLK_QUOTE, SDLK_QUOTEDBL:
+ begin
+ Button[Interaction].Text[0].Text := Button[Interaction].Text[0].Text + chr(ScanCode);
+ end;
+
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ // Templates for Names Mod
+ SDLK_F1:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[0] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[0];
+ end;
+ SDLK_F2:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[1] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[1];
+ end;
+ SDLK_F3:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[2] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[2];
+ end;
+ SDLK_F4:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[3] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[3];
+ end;
+ SDLK_F5:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[4] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[4];
+ end;
+ SDLK_F6:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[5] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[5];
+ end;
+ SDLK_F7:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[6] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[6];
+ end;
+ SDLK_F8:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[7] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[7];
+ end;
+ SDLK_F9:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[8] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[8];
+ end;
+ SDLK_F10:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[9] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[9];
+ end;
+ SDLK_F11:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[10] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[10];
+ end;
+ SDLK_F12:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[11] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[11];
+ end;
+
+
+ SDLK_BACKSPACE:
+ begin
+ Button[Interaction].Text[0].DeleteLastL;
+ end;
+
+ SDLK_ESCAPE:
+ begin
+ Ini.SaveNames;
+ Music.PlayBack;
+ if GoTo_SingScreen then
+ FadeTo(@ScreenSong)
+ else
+ FadeTo(@ScreenMain);
+ end;
+
+ SDLK_RETURN:
+ begin
+ for I := 1 to 6 do
+ Ini.Name[I-1] := Button[I-1].Text[0].Text;
+ Ini.SaveNames;
+ Music.PlayStart;
+
+ if GoTo_SingScreen then
+ FadeTo(@ScreenSing)
+ else
+ FadeTo(@ScreenLevel);
+
+ GoTo_SingScreen := False;
+ end;
+
+ // Up and Down could be done at the same time,
+ // but I don't want to declare variables inside
+ // functions like this one, called so many times
+ SDLK_DOWN: InteractNext;
+ SDLK_UP: InteractPrev;
+ SDLK_RIGHT: InteractNext;
+ SDLK_LEFT: InteractPrev;
+ end;
+ end;
+end;
+
+constructor TScreenName.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ LoadFromTheme(Theme.Name);
+
+
+ for I := 1 to 6 do
+ AddButton(Theme.Name.ButtonPlayer[I]);
+
+ Interaction := 0;
+end;
+
+procedure TScreenName.onShow;
+var
+ I: integer;
+begin
+ for I := 1 to 6 do
+ Button[I-1].Text[0].Text := Ini.Name[I-1];
+
+ for I := 1 to PlayersPlay do begin
+ Button[I-1].Visible := true;
+ Button[I-1].Selectable := true;
+ end;
+
+ for I := PlayersPlay+1 to 6 do begin
+ Button[I-1].Visible := false;
+ Button[I-1].Selectable := false;
+ end;
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenName)');
+end;
+
+procedure TScreenName.SetAnimationProgress(Progress: real);
+var
+ I: integer;
+begin
+ for I := 1 to 6 do
+ Button[I-1].Texture.ScaleW := Progress;
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenOpen.pas b/Game/Code/Screens/UScreenOpen.pas
new file mode 100644
index 00000000..6b80354c
--- /dev/null
+++ b/Game/Code/Screens/UScreenOpen.pas
@@ -0,0 +1,165 @@
+unit UScreenOpen;
+
+interface
+
+uses UMenu, UMusic, SDL, SysUtils, UFiles, UTime, USongs, UIni, ULog, USmpeg, UTexture, UMenuText,
+ ULyrics, Math, gl, UThemes;
+
+type
+ TScreenOpen = class(TMenu)
+ private
+ TextF: array[0..1] of integer;
+ TextN: integer;
+ public
+ Tex_Background: TTexture;
+ FadeOut: boolean;
+ Path: string;
+ BackScreen: pointer;
+ procedure AddBox(X, Y, W, H: real);
+ constructor Create; override;
+ procedure onShow; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+// function Draw: boolean; override;
+// procedure Finish;
+ end;
+
+implementation
+uses UGraphic, UDraw, UMain, USkins;
+
+function TScreenOpen.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ if (PressedDown) then begin // Key Down
+ case ScanCode of
+ ord('a')..ord('z'), ord('A')..ord('Z'), ord('0')..ord('9'), 32, ord('-'), ord('.'), ord(':'), ord('\'):
+ begin
+ if Interaction = 0 then begin
+ Text[TextN].Text := Text[TextN].Text + chr(ScanCode);
+ end;
+ end;
+ end;
+
+ case PressedKey of
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+ 8: // del
+ begin
+ if Interaction = 0 then
+ begin
+ Text[TextN].DeleteLastL;
+ end;
+ end;
+
+ SDLK_ESCAPE :
+ begin
+ //Empty Filename and go to last Screen
+ FileName := '';
+ Music.PlayBack;
+ FadeTo(BackScreen);
+ end;
+
+ SDLK_RETURN:
+ begin
+ if (Interaction = 2) then begin
+ //Update Filename and go to last Screen
+ FileName := Text[TextN].Text;
+ Music.PlayBack;
+ FadeTo(BackScreen);
+ end
+ else if (Interaction = 1) then
+ begin
+ //Empty Filename and go to last Screen
+ FileName := '';
+ Music.PlayBack;
+ FadeTo(BackScreen);
+ end;
+ end;
+
+ SDLK_LEFT:
+ begin
+ InteractPrev;
+ end;
+
+ SDLK_RIGHT:
+ begin
+ InteractNext;
+ end;
+
+ SDLK_DOWN:
+ begin
+ end;
+
+ SDLK_UP:
+ begin
+ end;
+ end;
+ end;
+end;
+
+procedure TScreenOpen.AddBox(X, Y, W, H: real);
+begin
+ AddStatic(X, Y, W, H, 0, 0, 0, Skin.GetTextureFileName('Bar'), 'JPG', 'Font Black');
+ AddStatic(X+2, Y+2, W-4, H-4, 1, 1, 1, Skin.GetTextureFileName('Bar'), 'JPG', 'Font Black');
+end;
+
+constructor TScreenOpen.Create;
+begin
+ inherited Create;
+
+ // linijka
+{ AddStatic(20, 10, 80, 30, 0, 0, 0, 'Bar', 'JPG', 'Font Black');
+ AddText(35, 17, 1, 6, 1, 1, 1, 'Linijka');
+ TextSentence := AddText(120, 14, 1, 8, 0, 0, 0, '0 / 0');}
+
+ // file list
+// AddBox(400, 100, 350, 450);
+
+// TextF[0] := AddText(430, 155, 0, 8, 0, 0, 0, 'a');
+// TextF[1] := AddText(430, 180, 0, 8, 0, 0, 0, 'a');
+
+ // file name
+ AddBox(20, 540, 500, 40);
+ TextN := AddText(50, 548, 0, 8, 0, 0, 0, FileName);
+ AddInteraction(iText, TextN);
+
+ // buttons
+ {AddButton(540, 540, 100, 40, Skin.SkinPath + Skin.ButtonF);
+ AddButtonText(10, 5, 0, 0, 0, 'Cancel');
+
+ AddButton(670, 540, 100, 40, Skin.SkinPath + Skin.ButtonF);
+ AddButtonText(30, 5, 0, 0, 0, 'OK');}
+ // buttons
+ AddButton(540, 540, 100, 40, Skin.GetTextureFileName('ButtonF'));
+ AddButtonText(10, 5, 0, 0, 0, 'Cancel');
+
+ AddButton(670, 540, 100, 40, Skin.GetTextureFileName('ButtonF'));
+ AddButtonText(30, 5, 0, 0, 0, 'OK');
+
+
+end;
+
+procedure TScreenOpen.onShow;
+begin
+ Interaction := 0;
+end;
+
+(*function TScreenEditSub.Draw: boolean;
+var
+ Min: integer;
+ Sec: integer;
+ Tekst: string;
+ Pet: integer;
+ AktBeat: integer;
+begin
+
+end;
+
+procedure TScreenEditSub.Finish;
+begin
+//
+end;*)
+
+end.
+
diff --git a/Game/Code/Screens/UScreenOptions.pas b/Game/Code/Screens/UScreenOptions.pas
new file mode 100644
index 00000000..9e0f922b
--- /dev/null
+++ b/Game/Code/Screens/UScreenOptions.pas
@@ -0,0 +1,176 @@
+unit UScreenOptions;
+
+interface
+
+uses
+ UMenu, SDL, SysUtils, UDisplay, UMusic, UFiles, UIni, UThemes;
+
+type
+ TScreenOptions = class(TMenu)
+ const
+ ID='ID_006'; //for help system
+
+ public
+ TextDescription: integer;
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ procedure InteractNext; override;
+ procedure InteractPrev; override;
+ procedure SetAnimationProgress(Progress: real); override;
+ end;
+
+implementation
+
+uses UGraphic, UHelp, ULog;
+
+function TScreenOptions.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE:
+ begin
+ Ini.Save;
+ Music.PlayBack;
+ FadeTo(@ScreenMain);
+ end;
+ SDLK_RETURN:
+ begin
+ if SelInteraction = 0 then begin
+ Music.PlayStart;
+ FadeTo(@ScreenOptionsGame);
+ end;
+
+ if SelInteraction = 1 then begin
+ Music.PlayStart;
+ FadeTo(@ScreenOptionsGraphics);
+ end;
+
+ if SelInteraction = 2 then begin
+ Music.PlayStart;
+ FadeTo(@ScreenOptionsSound);
+ end;
+
+ if SelInteraction = 3 then begin
+ Music.PlayStart;
+ FadeTo(@ScreenOptionsLyrics);
+ end;
+
+ if SelInteraction = 4 then begin
+ Music.PlayStart;
+ FadeTo(@ScreenOptionsThemes);
+ end;
+
+ if SelInteraction = 5 then begin
+ Music.PlayStart;
+ FadeTo(@ScreenOptionsRecord);
+ end;
+
+ if SelInteraction = 6 then begin
+ Music.PlayStart;
+ FadeTo(@ScreenOptionsAdvanced);
+ end;
+
+ if SelInteraction = 7 then begin
+ Ini.Save;
+ Music.PlayBack;
+ FadeTo(@ScreenMain);
+ end;
+ end;
+ SDLK_DOWN: InteractInc;
+ SDLK_UP: InteractDec;
+ SDLK_RIGHT: InteractNext;
+ SDLK_LEFT: InteractPrev;
+ end;
+ end;
+end;
+
+constructor TScreenOptions.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ TextDescription := AddText(Theme.Options.TextDescription);
+
+ LoadFromTheme(Theme.Options);
+
+ AddButton(Theme.Options.ButtonGame);
+ if (Length(Button[0].Text)=0) then
+ AddButtonText(14, 20, Theme.Options.Description[0]);
+
+ AddButton(Theme.Options.ButtonGraphics);
+ if (Length(Button[1].Text)=0) then
+ AddButtonText(14, 20, Theme.Options.Description[1]);
+
+ AddButton(Theme.Options.ButtonSound);
+ if (Length(Button[2].Text)=0) then
+ AddButtonText(14, 20, Theme.Options.Description[2]);
+
+ AddButton(Theme.Options.ButtonLyrics);
+ if (Length(Button[3].Text)=0) then
+ AddButtonText(14, 20, Theme.Options.Description[3]);
+
+ AddButton(Theme.Options.ButtonThemes);
+ if (Length(Button[4].Text)=0) then
+ AddButtonText(14, 20, Theme.Options.Description[4]);
+
+ AddButton(Theme.Options.ButtonRecord);
+ if (Length(Button[5].Text)=0) then
+ AddButtonText(14, 20, Theme.Options.Description[5]);
+
+ AddButton(Theme.Options.ButtonAdvanced);
+ if (Length(Button[6].Text)=0) then
+ AddButtonText(14, 20, Theme.Options.Description[6]);
+
+ AddButton(Theme.Options.ButtonExit);
+ if (Length(Button[7].Text)=0) then
+ AddButtonText(14, 20, Theme.Options.Description[7]);
+
+ Interaction := 0;
+end;
+
+procedure TScreenOptions.onShow;
+begin
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenOptions)');
+end;
+
+procedure TScreenOptions.InteractNext;
+begin
+ inherited InteractNext;
+ Text[TextDescription].Text := Theme.Options.Description[Interaction];
+end;
+
+procedure TScreenOptions.InteractPrev;
+begin
+ inherited InteractPrev;
+ Text[TextDescription].Text := Theme.Options.Description[Interaction];
+end;
+
+
+procedure TScreenOptions.SetAnimationProgress(Progress: real);
+begin
+ Button[0].Texture.ScaleW := Progress;
+ Button[1].Texture.ScaleW := Progress;
+ Button[2].Texture.ScaleW := Progress;
+ Button[3].Texture.ScaleW := Progress;
+ Button[4].Texture.ScaleW := Progress;
+ Button[5].Texture.ScaleW := Progress;
+ Button[6].Texture.ScaleW := Progress;
+ Button[7].Texture.ScaleW := Progress;
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenOptionsAdvanced.pas b/Game/Code/Screens/UScreenOptionsAdvanced.pas
new file mode 100644
index 00000000..730f333f
--- /dev/null
+++ b/Game/Code/Screens/UScreenOptionsAdvanced.pas
@@ -0,0 +1,112 @@
+unit UScreenOptionsAdvanced;
+
+interface
+
+uses
+ UMenu, SDL, UDisplay, UMusic, UFiles, UIni, UThemes;
+
+type
+ TScreenOptionsAdvanced = class(TMenu)
+ const
+ ID='ID_007'; //for help system
+
+ public
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ end;
+
+implementation
+
+uses UGraphic, UHelp, ULog;
+
+function TScreenOptionsAdvanced.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ Ini.Save;
+ Music.PlayBack;
+ FadeTo(@ScreenOptions);
+ end;
+ SDLK_RETURN:
+ begin
+ //SelectLoadAnimation Hidden because it is useless atm
+ //if SelInteraction = 7 then begin
+ if SelInteraction = 6 then begin
+ Ini.Save;
+ Music.PlayBack;
+ FadeTo(@ScreenOptions);
+ end;
+ end;
+ SDLK_DOWN:
+ InteractNext;
+ SDLK_UP :
+ InteractPrev;
+ SDLK_RIGHT:
+ begin
+ //SelectLoadAnimation Hidden because it is useless atm
+ //if (SelInteraction >= 0) and (SelInteraction <= 6) then begin
+ if (SelInteraction >= 0) and (SelInteraction <= 5) then begin
+ Music.PlayOption;
+ InteractInc;
+ end;
+ end;
+ SDLK_LEFT:
+ begin
+ //SelectLoadAnimation Hidden because it is useless atm
+ //if (SelInteraction >= 0) and (SelInteraction <= 6) then begin
+ if (SelInteraction >= 0) and (SelInteraction <= 5) then begin
+ Music.PlayOption;
+ InteractDec;
+ end;
+ end;
+ end;
+ end;
+end;
+
+constructor TScreenOptionsAdvanced.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ LoadFromTheme(Theme.OptionsAdvanced);
+
+ //SelectLoadAnimation Hidden because it is useless atm
+ //AddSelect(Theme.OptionsAdvanced.SelectLoadAnimation, Ini.LoadAnimation, ILoadAnimation);
+ AddSelect(Theme.OptionsAdvanced.SelectScreenFade, Ini.ScreenFade, IScreenFade);
+ AddSelect(Theme.OptionsAdvanced.SelectEffectSing, Ini.EffectSing, IEffectSing);
+ AddSelect(Theme.OptionsAdvanced.SelectLineBonus, Ini.LineBonus, ILineBonus);
+ AddSelectSlide(Theme.OptionsAdvanced.SelectOnSongClick, Ini.OnSongClick, IOnSongClick);
+ AddSelect(Theme.OptionsAdvanced.SelectAskbeforeDel, Ini.AskbeforeDel, IAskbeforeDel);
+ AddSelect(Theme.OptionsAdvanced.SelectPartyPopup, Ini.PartyPopup, IPartyPopup);
+
+ AddButton(Theme.OptionsAdvanced.ButtonExit);
+ if (Length(Button[0].Text)=0) then
+ AddButtonText(14, 20, Theme.Options.Description[7]);
+
+ Interaction := 0;
+end;
+
+procedure TScreenOptionsAdvanced.onShow;
+begin
+ Interaction := 0;
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenOptionsAdvanced)');
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenOptionsGame.pas b/Game/Code/Screens/UScreenOptionsGame.pas
new file mode 100644
index 00000000..29c36330
--- /dev/null
+++ b/Game/Code/Screens/UScreenOptionsGame.pas
@@ -0,0 +1,117 @@
+unit UScreenOptionsGame;
+
+interface
+
+uses
+ UMenu, SDL, UDisplay, UMusic, UFiles, UIni, UThemes, USongs;
+
+type
+ TScreenOptionsGame = class(TMenu)
+ const
+ ID='ID_008'; //for help system
+
+ public
+ old_Tabs, old_Sorting: integer;
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ procedure RefreshSongs;
+ end;
+
+implementation
+
+uses UGraphic, UHelp, ULog;
+
+function TScreenOptionsGame.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ Music.PlayBack;
+ RefreshSongs;
+ FadeTo(@ScreenOptions);
+ end;
+ SDLK_RETURN:
+ begin
+ if SelInteraction = 6 then begin
+ Music.PlayBack;
+ RefreshSongs;
+ FadeTo(@ScreenOptions);
+ end;
+ end;
+ SDLK_DOWN:
+ InteractNext;
+ SDLK_UP :
+ InteractPrev;
+ SDLK_RIGHT:
+ begin
+ if (SelInteraction >= 0) and (SelInteraction <= 5) then begin
+ Music.PlayOption;
+ InteractInc;
+ end;
+ end;
+ SDLK_LEFT:
+ begin
+ if (SelInteraction >= 0) and (SelInteraction <= 5) then begin
+ Music.PlayOption;
+ InteractDec;
+ end;
+ end;
+ end;
+ end;
+end;
+
+constructor TScreenOptionsGame.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ LoadFromTheme(Theme.OptionsGame);
+
+ //Refresh Songs Patch
+ old_Sorting := Ini.Sorting;
+ old_Tabs := Ini.Tabs;
+
+ AddSelect(Theme.OptionsGame.SelectPlayers, Ini.Players, IPlayers);
+ AddSelect(Theme.OptionsGame.SelectDifficulty, Ini.Difficulty, IDifficulty);
+ AddSelectSlide(Theme.OptionsGame.SelectLanguage, Ini.Language, ILanguage);
+ AddSelect(Theme.OptionsGame.SelectTabs, Ini.Tabs, ITabs);
+ AddSelectSlide(Theme.OptionsGame.SelectSorting, Ini.Sorting, ISorting);
+ AddSelect(Theme.OptionsGame.SelectDebug, Ini.Debug, IDebug);
+
+
+ AddButton(Theme.OptionsGame.ButtonExit);
+ if (Length(Button[0].Text)=0) then
+ AddButtonText(14, 20, Theme.Options.Description[7]);
+
+end;
+
+//Refresh Songs Patch
+procedure TScreenOptionsGame.RefreshSongs;
+begin
+if (ini.Sorting <> old_Sorting) or (ini.Tabs <> old_Tabs) then
+ ScreenSong.Refresh;
+end;
+
+procedure TScreenOptionsGame.onShow;
+begin
+// Interaction := 0;
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenOptionsGame)');
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenOptionsGraphics.pas b/Game/Code/Screens/UScreenOptionsGraphics.pas
new file mode 100644
index 00000000..999fb054
--- /dev/null
+++ b/Game/Code/Screens/UScreenOptionsGraphics.pas
@@ -0,0 +1,107 @@
+unit UScreenOptionsGraphics;
+
+interface
+
+uses
+ UMenu, SDL, UDisplay, UMusic, UFiles, UIni, UThemes;
+
+type
+ TScreenOptionsGraphics = class(TMenu)
+ const
+ ID='ID_009'; //for help system
+
+ public
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ end;
+
+implementation
+
+uses UGraphic, UMain, UHelp, ULog;
+
+function TScreenOptionsGraphics.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE:
+ begin
+ Ini.Save;
+ Music.PlayBack;
+ FadeTo(@ScreenOptions);
+ end;
+ SDLK_RETURN:
+ begin
+{ if SelInteraction <= 1 then begin
+ Restart := true;
+ end;}
+ if SelInteraction = 6 then begin
+ Ini.Save;
+ Music.PlayBack;
+ FadeTo(@ScreenOptions);
+ end;
+ end;
+ SDLK_DOWN:
+ InteractNext;
+ SDLK_UP :
+ InteractPrev;
+ SDLK_RIGHT:
+ begin
+ if (SelInteraction >= 0) and (SelInteraction <= 5) then begin
+ Music.PlayOption;
+ InteractInc;
+ end;
+ end;
+ SDLK_LEFT:
+ begin
+ if (SelInteraction >= 0) and (SelInteraction <= 5) then begin
+ Music.PlayOption;
+ InteractDec;
+ end;
+ end;
+ end;
+ end;
+end;
+
+constructor TScreenOptionsGraphics.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ LoadFromTheme(Theme.OptionsGraphics);
+
+ AddSelectSlide(Theme.OptionsGraphics.SelectSlideResolution, Ini.Resolution, IResolution);
+ AddSelect(Theme.OptionsGraphics.SelectFullscreen, Ini.Fullscreen, IFullscreen);
+ AddSelect(Theme.OptionsGraphics.SelectDepth, Ini.Depth, IDepth);
+ AddSelect(Theme.OptionsGraphics.SelectOscilloscope, Ini.Oscilloscope, IOscilloscope);
+ AddSelect(Theme.OptionsGraphics.SelectMovieSize, Ini.MovieSize, IMovieSize);
+ AddSelect(Theme.OptionsGraphics.SelectMoviePreview, Ini.MoviePreview, IMoviePreview);
+
+
+ AddButton(Theme.OptionsGraphics.ButtonExit);
+ if (Length(Button[0].Text)=0) then
+ AddButtonText(14, 20, Theme.Options.Description[7]);
+
+end;
+
+procedure TScreenOptionsGraphics.onShow;
+begin
+ Interaction := 0;
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenOptionsGraphics)');
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenOptionsLyrics.pas b/Game/Code/Screens/UScreenOptionsLyrics.pas
new file mode 100644
index 00000000..4d6cdf2d
--- /dev/null
+++ b/Game/Code/Screens/UScreenOptionsLyrics.pas
@@ -0,0 +1,101 @@
+unit UScreenOptionsLyrics;
+
+interface
+
+uses
+ UMenu, SDL, UDisplay, UMusic, UFiles, UIni, UThemes;
+
+type
+ TScreenOptionsLyrics = class(TMenu)
+ const
+ ID='ID_010'; //for help system
+
+ public
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ end;
+
+implementation
+
+uses UGraphic, UHelp, ULog;
+
+function TScreenOptionsLyrics.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ Ini.Save;
+ Music.PlayBack;
+ FadeTo(@ScreenOptions);
+ end;
+ SDLK_RETURN:
+ begin
+ if SelInteraction = 3 then begin
+ Ini.Save;
+ Music.PlayBack;
+ FadeTo(@ScreenOptions);
+ end;
+ end;
+ SDLK_DOWN:
+ InteractNext;
+ SDLK_UP :
+ InteractPrev;
+ SDLK_RIGHT:
+ begin
+ if (SelInteraction >= 0) and (SelInteraction <= 2) then begin
+ Music.PlayOption;
+ InteractInc;
+ end;
+ end;
+ SDLK_LEFT:
+ begin
+ if (SelInteraction >= 0) and (SelInteraction <= 2) then begin
+ Music.PlayOption;
+ InteractDec;
+ end;
+ end;
+ end;
+ end;
+end;
+
+constructor TScreenOptionsLyrics.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ LoadFromTheme(Theme.OptionsLyrics);
+
+ AddSelect(Theme.OptionsLyrics.SelectLyricsFont, Ini.LyricsFont, ILyricsFont);
+ AddSelect(Theme.OptionsLyrics.SelectLyricsEffect, Ini.LyricsEffect, ILyricsEffect);
+ AddSelect(Theme.OptionsLyrics.SelectSolmization, Ini.Solmization, ISolmization);
+
+
+ AddButton(Theme.OptionsLyrics.ButtonExit);
+ if (Length(Button[0].Text)=0) then
+ AddButtonText(14, 20, Theme.Options.Description[7]);
+
+end;
+
+procedure TScreenOptionsLyrics.onShow;
+begin
+ Interaction := 0;
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenOptionsLyrics)');
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenOptionsRecord.pas b/Game/Code/Screens/UScreenOptionsRecord.pas
new file mode 100644
index 00000000..9f75f78a
--- /dev/null
+++ b/Game/Code/Screens/UScreenOptionsRecord.pas
@@ -0,0 +1,142 @@
+unit UScreenOptionsRecord;
+
+interface
+
+uses
+ UMenu, SDL, UDisplay, UMusic, UFiles, UIni, UThemes;
+
+type
+ TScreenOptionsRecord = class(TMenu)
+ const
+ ID='ID_011'; //for help system
+
+ private
+ SelectSlideInput: integer;
+ SelectSlideChannelL: integer;
+ SelectSlideChannelR: integer;
+ public
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ procedure UpdateCard;
+ end;
+
+implementation
+
+uses SysUtils, UGraphic, URecord, UHelp, ULog;
+
+function TScreenOptionsRecord.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE:
+ begin
+ Ini.Save;
+ Music.PlayBack;
+ FadeTo(@ScreenOptions);
+ end;
+ SDLK_RETURN:
+ begin
+ if SelInteraction = 4 then begin
+ Ini.Save;
+ Music.PlayBack;
+ FadeTo(@ScreenOptions);
+ end;
+ end;
+ SDLK_DOWN:
+ InteractNext;
+ SDLK_UP :
+ InteractPrev;
+ SDLK_RIGHT:
+ begin
+ if (SelInteraction >= 0) and (SelInteraction <= 3) then begin
+ Music.PlayOption;
+ InteractInc;
+ end;
+ if SelInteraction = 0 then UpdateCard;
+ end;
+ SDLK_LEFT:
+ begin
+ if (SelInteraction >= 0) and (SelInteraction <= 3) then begin
+ Music.PlayOption;
+ InteractDec;
+ end;
+ if SelInteraction = 0 then UpdateCard;
+ end;
+ end;
+ end;
+end;
+
+constructor TScreenOptionsRecord.Create;
+var
+ I: integer;
+ SC: integer;
+ SCI: integer;
+begin
+ inherited Create;
+
+ LoadFromTheme(Theme.OptionsRecord);
+
+ SetLength(ICard, Length(Recording.SoundCard));
+ for SC := 0 to High(Recording.SoundCard) do
+ ICard[SC] := Recording.SoundCard[SC].Description;
+// end;
+
+// if Length(Recording.SoundCard[Ini.Card].Input) > 0 then begin
+ SetLength(IInput, Length(Recording.SoundCard[Ini.Card].Input));
+ for SCI := 0 to High(Recording.SoundCard[Ini.Card].Input) do
+ IInput[SCI] := Recording.SoundCard[Ini.Card].Input[SCI].Name;
+// end;
+
+
+ AddSelectSlide(Theme.OptionsRecord.SelectSlideCard, Ini.Card, ICard);
+ SelectSlideInput := AddSelectSlide(Theme.OptionsRecord.SelectSlideInput, Ini.CardList[0].Input, IInput);
+ SelectSlideChannelL := AddSelectSlide(Theme.OptionsRecord.SelectSlideChannelL, Ini.CardList[0].ChannelL, IChannel);
+ SelectSlideChannelR := AddSelectSlide(Theme.OptionsRecord.SelectSlideChannelR, Ini.CardList[0].ChannelR, IChannel);
+
+ AddButton(Theme.OptionsRecord.ButtonExit);
+ if (Length(Button[0].Text)=0) then
+ AddButtonText(14, 20, Theme.Options.Description[7]);
+
+ Interaction := 0;
+end;
+
+procedure TScreenOptionsRecord.onShow;
+begin
+ Interaction := 0;
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenOptionsRecord)');
+end;
+
+procedure TScreenOptionsRecord.UpdateCard;
+var
+ SC: integer;
+ SCI: integer;
+begin
+ SC := Ini.Card;
+// if SC = 1 then beep;
+
+ SetLength(IInput, Length(Recording.SoundCard[SC].Input));
+ for SCI := 0 to High(Recording.SoundCard[SC].Input) do begin
+ IInput[SCI] := Recording.SoundCard[SC].Input[SCI].Name;
+// Log.LogError(IInput[SCI]);
+ end;
+
+ UpdateSelectSlideOptions(Theme.OptionsRecord.SelectSlideInput, SelectSlideInput, IInput, Ini.CardList[SC].Input);
+ UpdateSelectSlideOptions(Theme.OptionsRecord.SelectSlideChannelL, SelectSlideChannelL, IChannel, Ini.CardList[SC].ChannelL);
+ UpdateSelectSlideOptions(Theme.OptionsRecord.SelectSlideChannelR, SelectSlideChannelR, IChannel, Ini.CardList[SC].ChannelR);
+end;
+
+end. \ No newline at end of file
diff --git a/Game/Code/Screens/UScreenOptionsSound.pas b/Game/Code/Screens/UScreenOptionsSound.pas
new file mode 100644
index 00000000..dc465e0f
--- /dev/null
+++ b/Game/Code/Screens/UScreenOptionsSound.pas
@@ -0,0 +1,107 @@
+unit UScreenOptionsSound;
+
+interface
+
+uses
+ UMenu, SDL, UDisplay, UMusic, UFiles, UIni, UThemes;
+
+type
+ TScreenOptionsSound = class(TMenu)
+ const
+ ID='ID_012'; //for help system
+
+ public
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ end;
+
+implementation
+
+uses UGraphic, UHelp, ULog;
+
+function TScreenOptionsSound.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ Ini.Save;
+ Music.PlayBack;
+ FadeTo(@ScreenOptions);
+ end;
+ SDLK_RETURN:
+ begin
+ if SelInteraction = 6 then begin
+ Ini.Save;
+ Music.PlayBack;
+ FadeTo(@ScreenOptions);
+ end;
+ end;
+ SDLK_DOWN:
+ InteractNext;
+ SDLK_UP :
+ InteractPrev;
+ SDLK_RIGHT:
+ begin
+ if (SelInteraction >= 0) and (SelInteraction <= 5) then begin
+ Music.PlayOption;
+ InteractInc;
+ end;
+ end;
+ SDLK_LEFT:
+ begin
+ if (SelInteraction >= 0) and (SelInteraction <= 5) then begin
+ Music.PlayOption;
+ InteractDec;
+ end;
+ end;
+ end;
+ end;
+end;
+
+constructor TScreenOptionsSound.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ LoadFromTheme(Theme.OptionsSound);
+
+ AddSelect(Theme.OptionsSound.SelectMicBoost, Ini.MicBoost, IMicBoost);
+ AddSelect(Theme.OptionsSound.SelectClickAssist, Ini.ClickAssist, IClickAssist);
+ AddSelect(Theme.OptionsSound.SelectBeatClick, Ini.BeatClick, IBeatClick);
+ AddSelect(Theme.OptionsSound.SelectThreshold, Ini.Threshold, IThreshold);
+
+ //Song Preview
+ AddSelectSlide(Theme.OptionsSound.SelectSlidePreviewVolume, Ini.PreviewVolume, IPreviewVolume);
+ AddSelectSlide
+ (Theme.OptionsSound.SelectSlidePreviewFading, Ini.PreviewFading, IPreviewFading);
+
+ AddButton(Theme.OptionsSound.ButtonExit);
+ if (Length(Button[0].Text)=0) then
+ AddButtonText(14, 20, Theme.Options.Description[7]);
+
+ Interaction := 0;
+end;
+
+procedure TScreenOptionsSound.onShow;
+begin
+ Interaction := 0;
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenOptionsSound)');
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenOptionsThemes.pas b/Game/Code/Screens/UScreenOptionsThemes.pas
new file mode 100644
index 00000000..ce156446
--- /dev/null
+++ b/Game/Code/Screens/UScreenOptionsThemes.pas
@@ -0,0 +1,166 @@
+unit UScreenOptionsThemes;
+
+interface
+
+uses
+ UMenu, SDL, UDisplay, UMusic, UFiles, UIni, UThemes;
+
+type
+ TScreenOptionsThemes = class(TMenu)
+ const
+ ID='ID_013'; //for help system
+
+ private
+ procedure ReloadTheme;
+ public
+ SkinSelect: Integer;
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ procedure InteractInc; override;
+ procedure InteractDec; override;
+ end;
+
+implementation
+
+uses UGraphic, USkins, UHelp, ULog;
+
+function TScreenOptionsThemes.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ Ini.Save;
+
+ // Reload all screens, after Theme changed
+ // Todo : JB - Check if theme was actually changed
+ UGraphic.UnLoadScreens();
+ UGraphic.LoadScreens( false );
+
+ Music.PlayBack;
+ FadeTo(@ScreenOptions);
+ end;
+ SDLK_RETURN:
+ begin
+ if SelInteraction = 3 then
+ begin
+ Ini.Save;
+
+ // Reload all screens, after Theme changed
+ // Todo : JB - Check if theme was actually changed
+ UGraphic.UnLoadScreens();
+ UGraphic.LoadScreens( false );
+
+ Music.PlayBack;
+ FadeTo(@ScreenOptions);
+ end;
+ end;
+ SDLK_DOWN:
+ InteractNext;
+ SDLK_UP :
+ InteractPrev;
+ SDLK_RIGHT:
+ begin
+ if (SelInteraction >= 0) and (SelInteraction <= 2) then
+ begin
+ Music.PlayOption;
+ InteractInc;
+ end;
+ end;
+ SDLK_LEFT:
+ begin
+ if (SelInteraction >= 0) and (SelInteraction <= 2) then
+ begin
+ Music.PlayOption;
+ InteractDec;
+ end;
+ end;
+ end;
+ end;
+end;
+
+procedure TScreenOptionsThemes.InteractInc;
+begin
+ inherited InteractInc;
+ //Update Skins
+ if (SelInteraction = 0) then
+ begin
+ Skin.OnThemeChange;
+ UpdateSelectSlideOptions (Theme.OptionsThemes.SelectSkin, SkinSelect, ISkin, Ini.SkinNo);
+ end;
+
+ ReloadTheme();
+end;
+
+procedure TScreenOptionsThemes.InteractDec;
+begin
+ inherited InteractDec;
+ //Update Skins
+ if (SelInteraction = 0) then
+ begin
+ Skin.OnThemeChange;
+ UpdateSelectSlideOptions (Theme.OptionsThemes.SelectSkin, SkinSelect, ISkin, Ini.SkinNo);
+ end;
+
+ ReloadTheme();
+end;
+
+constructor TScreenOptionsThemes.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+
+ LoadFromTheme(Theme.OptionsThemes);
+
+ AddSelectSlide(Theme.OptionsThemes.SelectTheme, Ini.Theme, ITheme);
+
+ SkinSelect := AddSelectSlide(Theme.OptionsThemes.SelectSkin, Ini.SkinNo, ISkin);
+
+ AddSelectSlide(Theme.OptionsThemes.SelectColor, Ini.Color, IColor);
+
+ AddButton(Theme.OptionsThemes.ButtonExit);
+ if (Length(Button[0].Text)=0) then
+ AddButtonText(14, 20, Theme.Options.Description[7]);
+end;
+
+procedure TScreenOptionsThemes.onShow;
+begin
+ Interaction := 0;
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenOptionsThemes)');
+end;
+
+procedure TScreenOptionsThemes.ReloadTheme;
+begin
+ Theme.LoadTheme('Themes\' + ITheme[Ini.Theme] + '.ini', Ini.Color);
+
+ ScreenOptionsThemes := TScreenOptionsThemes.create();
+ ScreenOptionsThemes.onshow;
+ Display.ActualScreen := @ScreenOptionsThemes;
+
+ ScreenOptionsThemes.Interaction := self.Interaction;
+ ScreenOptionsThemes.Draw;
+
+
+ Display.Draw;
+ SwapBuffers;
+
+ freeandnil( self );
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenPartyNewRound.pas b/Game/Code/Screens/UScreenPartyNewRound.pas
new file mode 100644
index 00000000..45e3be8d
--- /dev/null
+++ b/Game/Code/Screens/UScreenPartyNewRound.pas
@@ -0,0 +1,376 @@
+unit UScreenPartyNewRound;
+
+interface
+
+uses
+ UMenu, SDL, UDisplay, UMusic, UFiles, SysUtils, UThemes;
+
+type
+ TScreenPartyNewRound = class(TMenu)
+ const
+ ID='ID_014'; //for help system
+
+ private
+ ScreenRound: Integer;
+ procedure Update;
+ public
+ //Texts:
+ TextRound: array [1..7] of Cardinal;
+ TextWinner: array [1..7] of Cardinal;
+
+ TextNextRound: Cardinal;
+ TextNextRoundNo: Cardinal;
+ TextNextPlayer1: Cardinal;
+ TextNextPlayer2: Cardinal;
+ TextNextPlayer3: Cardinal;
+
+ //Statics
+ StaticRound: array [1..7] of Cardinal;
+
+ //Scores
+ TextScoreTeam1: Cardinal;
+ TextScoreTeam2: Cardinal;
+ TextScoreTeam3: Cardinal;
+ TextNameTeam1: Cardinal;
+ TextNameTeam2: Cardinal;
+ TextNameTeam3: Cardinal;
+
+ TextTeam1Players: Cardinal;
+ TextTeam2Players: Cardinal;
+ TextTeam3Players: Cardinal;
+
+ StaticTeam1: Cardinal;
+ StaticTeam2: Cardinal;
+ StaticTeam3: Cardinal;
+ StaticNextPlayer1: Cardinal;
+ StaticNextPlayer2: Cardinal;
+ StaticNextPlayer3: Cardinal;
+
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ procedure SetAnimationProgress(Progress: real); override;
+ end;
+
+implementation
+
+uses UGraphic, UMain, UIni, UTexture, UParty, UDLLManager, ULanguage, UHelp, ULog;
+
+function TScreenPartyNewRound.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ Music.PlayBack;
+ CheckFadeTo(@ScreenMain,'MSG_END_PARTY');
+ end;
+
+ SDLK_RETURN:
+ begin
+ Music.PlayStart;
+ if DLLMan.Selected.LoadSong then
+ begin
+ //Select PartyMode ScreenSong
+ ScreenSong.Mode := smParty;
+ FadeTo(@ScreenSong);
+ end
+ else
+ begin
+ FadeTo(@ScreenSingModi);
+ end;
+ end;
+
+ SDLK_UP:
+ begin
+ if ScreenRound>=1 then
+ dec(ScreenRound);
+ Update;
+ end;
+
+ SDLK_DOWN:
+ begin
+ if ScreenRound<=(Length(PartySession.Rounds)-7) then
+ inc(ScreenRound);
+ Update;
+ end;
+ end;
+ end;
+end;
+
+constructor TScreenPartyNewRound.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ TextRound[1] := AddText (Theme.PartyNewRound.TextRound1);
+ TextRound[2] := AddText (Theme.PartyNewRound.TextRound2);
+ TextRound[3] := AddText (Theme.PartyNewRound.TextRound3);
+ TextRound[4] := AddText (Theme.PartyNewRound.TextRound4);
+ TextRound[5] := AddText (Theme.PartyNewRound.TextRound5);
+ TextRound[6] := AddText (Theme.PartyNewRound.TextRound6);
+ TextRound[7] := AddText (Theme.PartyNewRound.TextRound7);
+
+ TextWinner[1] := AddText (Theme.PartyNewRound.TextWinner1);
+ TextWinner[2] := AddText (Theme.PartyNewRound.TextWinner2);
+ TextWinner[3] := AddText (Theme.PartyNewRound.TextWinner3);
+ TextWinner[4] := AddText (Theme.PartyNewRound.TextWinner4);
+ TextWinner[5] := AddText (Theme.PartyNewRound.TextWinner5);
+ TextWinner[6] := AddText (Theme.PartyNewRound.TextWinner6);
+ TextWinner[7] := AddText (Theme.PartyNewRound.TextWinner7);
+
+ TextNextRound := AddText (Theme.PartyNewRound.TextNextRound);
+ TextNextRoundNo := AddText (Theme.PartyNewRound.TextNextRoundNo);
+ TextNextPlayer1 := AddText (Theme.PartyNewRound.TextNextPlayer1);
+ TextNextPlayer2 := AddText (Theme.PartyNewRound.TextNextPlayer2);
+ TextNextPlayer3 := AddText (Theme.PartyNewRound.TextNextPlayer3);
+
+ StaticRound[1] := AddStatic (Theme.PartyNewRound.StaticRound1);
+ StaticRound[2] := AddStatic (Theme.PartyNewRound.StaticRound2);
+ StaticRound[3] := AddStatic (Theme.PartyNewRound.StaticRound3);
+ StaticRound[4] := AddStatic (Theme.PartyNewRound.StaticRound4);
+ StaticRound[5] := AddStatic (Theme.PartyNewRound.StaticRound5);
+ StaticRound[6] := AddStatic (Theme.PartyNewRound.StaticRound6);
+ StaticRound[7] := AddStatic (Theme.PartyNewRound.StaticRound7);
+
+ //Scores
+ TextScoreTeam1 := AddText (Theme.PartyNewRound.TextScoreTeam1);
+ TextScoreTeam2 := AddText (Theme.PartyNewRound.TextScoreTeam2);
+ TextScoreTeam3 := AddText (Theme.PartyNewRound.TextScoreTeam3);
+ TextNameTeam1 := AddText (Theme.PartyNewRound.TextNameTeam1);
+ TextNameTeam2 := AddText (Theme.PartyNewRound.TextNameTeam2);
+ TextNameTeam3 := AddText (Theme.PartyNewRound.TextNameTeam3);
+
+ //Players
+ TextTeam1Players := AddText (Theme.PartyNewRound.TextTeam1Players);
+ TextTeam2Players := AddText (Theme.PartyNewRound.TextTeam2Players);
+ TextTeam3Players := AddText (Theme.PartyNewRound.TextTeam3Players);
+
+ StaticTeam1 := AddStatic (Theme.PartyNewRound.StaticTeam1);
+ StaticTeam2 := AddStatic (Theme.PartyNewRound.StaticTeam2);
+ StaticTeam3 := AddStatic (Theme.PartyNewRound.StaticTeam3);
+ StaticNextPlayer1 := AddStatic (Theme.PartyNewRound.StaticNextPlayer1);
+ StaticNextPlayer2 := AddStatic (Theme.PartyNewRound.StaticNextPlayer2);
+ StaticNextPlayer3 := AddStatic (Theme.PartyNewRound.StaticNextPlayer3);
+
+ LoadFromTheme(Theme.PartyNewRound);
+end;
+
+procedure TScreenPartyNewRound.onShow;
+var
+ I: Integer;
+ function GetTeamPlayers(const Num: Byte): String;
+ var
+ Players: Array of String;
+ J: Byte;
+ begin
+ if (Num-1 >= PartySession.Teams.NumTeams) then
+ exit;
+
+ //Create Players Array
+ SetLength(Players, PartySession.Teams.TeamInfo[Num-1].NumPlayers);
+ For J := 0 to PartySession.Teams.TeamInfo[Num-1].NumPlayers-1 do
+ Players[J] := String(PartySession.Teams.TeamInfo[Num-1].PlayerInfo[J].Name);
+
+ //Implode and Return
+ Result := Language.Implode(Players);
+ end;
+begin
+ PartySession.StartRound;
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenPartyNewRound)');
+
+ ScreenRound:=PartySession.CurRound-2;
+ if ScreenRound<0 then
+ begin
+ ScreenRound:=PartySession.CurRound-1;
+ if ScreenRound<0 then
+ ScreenRound:=0;
+ end;
+ Update;
+
+ //Display Scores
+ if (PartySession.Teams.NumTeams >= 1) then
+ begin
+ Text[TextScoreTeam1].Text := InttoStr(PartySession.Teams.TeamInfo[0].Score);
+ Text[TextNameTeam1].Text := String(PartySession.Teams.TeamInfo[0].Name);
+ Text[TextTeam1Players].Text := GetTeamPlayers(1);
+
+ Text[TextScoreTeam1].Visible := True;
+ Text[TextNameTeam1].Visible := True;
+ Text[TextTeam1Players].Visible := True;
+ Static[StaticTeam1].Visible := True;
+ Static[StaticNextPlayer1].Visible := True;
+ end
+ else
+ begin
+ Text[TextScoreTeam1].Visible := False;
+ Text[TextNameTeam1].Visible := False;
+ Text[TextTeam1Players].Visible := False;
+ Static[StaticTeam1].Visible := False;
+ Static[StaticNextPlayer1].Visible := False;
+ end;
+
+ if (PartySession.Teams.NumTeams >= 2) then
+ begin
+ Text[TextScoreTeam2].Text := InttoStr(PartySession.Teams.TeamInfo[1].Score);
+ Text[TextNameTeam2].Text := String(PartySession.Teams.TeamInfo[1].Name);
+ Text[TextTeam2Players].Text := GetTeamPlayers(2);
+
+ Text[TextScoreTeam2].Visible := True;
+ Text[TextNameTeam2].Visible := True;
+ Text[TextTeam2Players].Visible := True;
+ Static[StaticTeam2].Visible := True;
+ Static[StaticNextPlayer2].Visible := True;
+ end
+ else
+ begin
+ Text[TextScoreTeam2].Visible := False;
+ Text[TextNameTeam2].Visible := False;
+ Text[TextTeam2Players].Visible := False;
+ Static[StaticTeam2].Visible := False;
+ Static[StaticNextPlayer2].Visible := False;
+ end;
+
+ if (PartySession.Teams.NumTeams >= 3) then
+ begin
+ Text[TextScoreTeam3].Text := InttoStr(PartySession.Teams.TeamInfo[2].Score);
+ Text[TextNameTeam3].Text := String(PartySession.Teams.TeamInfo[2].Name);
+ Text[TextTeam3Players].Text := GetTeamPlayers(3);
+
+ Text[TextScoreTeam3].Visible := True;
+ Text[TextNameTeam3].Visible := True;
+ Text[TextTeam3Players].Visible := True;
+ Static[StaticTeam3].Visible := True;
+ Static[StaticNextPlayer3].Visible := True;
+ end
+ else
+ begin
+ Text[TextScoreTeam3].Visible := False;
+ Text[TextNameTeam3].Visible := False;
+ Text[TextTeam3Players].Visible := False;
+ Static[StaticTeam3].Visible := False;
+ Static[StaticNextPlayer3].Visible := False;
+ end;
+
+ //nextRound Texts
+ Text[TextNextRound].Text := PartySession.Plugins[PartySession.Rounds[PartySession.CurRound].PluginNr].Desc;
+
+ Text[TextNextRoundNo].Text := InttoStr(PartySession.CurRound + 1);
+ if (PartySession.Teams.NumTeams >= 1) then
+ begin
+ Text[TextNextPlayer1].Text := PartySession.Teams.Teaminfo[0].Playerinfo[PartySession.Teams.Teaminfo[0].CurPlayer].Name;
+ Text[TextNextPlayer1].Visible := True;
+ end
+ else
+ Text[TextNextPlayer1].Visible := False;
+
+ if (PartySession.Teams.NumTeams >= 2) then
+ begin
+ Text[TextNextPlayer2].Text := PartySession.Teams.Teaminfo[1].Playerinfo[PartySession.Teams.Teaminfo[1].CurPlayer].Name;
+ Text[TextNextPlayer2].Visible := True;
+ end
+ else
+ Text[TextNextPlayer2].Visible := False;
+
+ if (PartySession.Teams.NumTeams >= 3) then
+ begin
+ Text[TextNextPlayer3].Text := PartySession.Teams.Teaminfo[2].Playerinfo[PartySession.Teams.Teaminfo[2].CurPlayer].Name;
+ Text[TextNextPlayer3].Visible := True;
+ end
+ else
+ Text[TextNextPlayer3].Visible := False;
+
+
+// LCD.WriteText(1, ' Choose mode: ');
+// UpdateLCD;
+end;
+
+procedure TScreenPartyNewRound.Update;
+{
+ //Set Visibility of Round Infos
+ I := Length(PartySession.Rounds);
+ if (I >= 1) then
+ begin
+ Static[StaticRound1].Visible := True;
+ Text[TextRound1].Visible := True;
+ Text[TextWinner1].Visible := True;
+
+ //Texts:
+ Text[TextRound1].Text := Language.Translate(DllMan.Plugins[PartySession.Rounds[0].Plugin].Name);
+ Text[TextWinner1].Text := PartySession.GetWinnerString(0);
+ end; }
+
+
+
+var
+ N, R: Integer;
+ T: Integer;
+ NumRounds: Integer;
+begin
+ N:=0;
+ //current round-number
+ R:=PartySession.CurRound;
+
+ //Set Visibility of Round Infos
+ NumRounds := Length(PartySession.Rounds);
+
+ N:=ScreenRound;
+
+ if ((NumRounds-7)<N) then
+ begin
+ N:=NumRounds-7;
+ ScreenRound:=N;
+ end;
+
+ if (N<0) then
+ begin
+ N:=0;
+ ScreenRound:=0;
+ end;
+
+ for T := 1 to 7 do
+ begin
+ if (NumRounds >= T) then
+ begin
+ Static[StaticRound[T]].Visible := true;
+ Text[TextRound[T]].Visible := true;
+ if (N+T-1<R) then
+ Text[TextWinner[T]].Visible := true
+ else
+ Text[TextWinner[T]].Visible := false;
+
+ Text[TextRound[T]].Text := IntToStr(N+T)+') '+ PartySession.Plugins[PartySession.Rounds[N+T-1].PluginNr].Name;
+ Text[TextWinner[T]].Text := PartySession.GetWinnerString(N+T-1);
+ end else
+ begin
+ Static[StaticRound[T]].Visible := false;
+ Text[TextRound[T]].Visible := false;
+ Text[TextWinner[T]].Visible := false;
+ end;
+ end;
+end;
+
+
+procedure TScreenPartyNewRound.SetAnimationProgress(Progress: real);
+begin
+ {Button[0].Texture.ScaleW := Progress;
+ Button[1].Texture.ScaleW := Progress;
+ Button[2].Texture.ScaleW := Progress; }
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenPartyNewRoundM2.pas b/Game/Code/Screens/UScreenPartyNewRoundM2.pas
new file mode 100644
index 00000000..f25b928f
--- /dev/null
+++ b/Game/Code/Screens/UScreenPartyNewRoundM2.pas
@@ -0,0 +1,313 @@
+unit UScreenPartyNewRoundM2;
+
+interface
+
+uses
+ UMenu, SDL, UDisplay, UMusic, UFiles, SysUtils, UThemes;
+
+type
+ TScreenPartyNewRoundM2 = class(TMenu)
+ const
+ ID='ID_019'; //for help system
+
+ public
+ //Texts:
+ TextRound: array [1..9] of cardinal;
+ TextWinner: array [1..9] of cardinal;
+
+ TextNextRound: cardinal;
+
+ TextNextPlayer1: cardinal;
+ TextNextPlayer2: cardinal;
+ TextHandicap: cardinal;
+
+ //Statics
+ StaticRound: array [1..9] of cardinal;
+ StaticTable: array [1..9] of cardinal;
+
+ StaticNextPlayer1: cardinal;
+ StaticNextPlayer2: cardinal;
+ StaticHandicap: cardinal;
+
+ TextTableName: array[1..9,1..7] of cardinal;
+
+ ScreenRound: Integer;
+
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ function FillNulls(number: integer): String;
+ procedure onShow; override;
+ procedure SetAnimationProgress(Progress: real); override;
+ procedure Update;
+ end;
+
+implementation
+
+uses UGraphic, UMain, UIni, UTexture, UPartyM2, UDLLManager, ULanguage, ULog, UHelp;
+
+function TScreenPartyNewRoundM2.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ Music.PlayBack;
+ CheckFadeTo(@ScreenMain,'MSG_END_PARTY');
+ end;
+
+ SDLK_RETURN:
+ begin
+ if(PartySessionM2.CurRound<Length(PartySessionM2.Rounds)) then
+ begin
+ Music.PlayStart;
+ //Select PartyMode M2 ScreenSong
+ //Select PartyMode ScreenSong
+ ScreenSong.Mode := smChallenge;
+ FadeTo(@ScreenSong);
+ end else
+ begin
+ Music.PlayBack;
+ CheckFadeTo(@ScreenMain,'MSG_END_PARTY');
+ end;
+ end;
+ SDLK_DOWN:
+ begin
+ if ScreenRound<=(Length(PartySessionM2.Rounds)-9) then
+ inc(ScreenRound);
+ Update;
+ end;
+ SDLK_UP:
+ begin
+ if ScreenRound>=1 then
+ dec(ScreenRound);
+ Update;
+ end;
+ SDLK_RIGHT:
+ begin
+ if ScreenRound<=(Length(PartySessionM2.Rounds)-9) then
+ inc(ScreenRound);
+ Update;
+ end;
+ SDLK_LEFT:
+ begin
+ if ScreenRound>=1 then
+ dec(ScreenRound);
+ Update;
+ end;
+ end;
+ end;
+end;
+
+constructor TScreenPartyNewRoundM2.Create;
+var
+ I, J: integer;
+begin
+ inherited Create;
+
+ LoadFromTheme(Theme.PartyNewRoundM2);
+
+ for I := 1 to 9 do
+ begin
+ TextRound[I] := AddText (Theme.PartyNewRoundM2.TextRound[I]);
+ TextWinner[I] := AddText (Theme.PartyNewRoundM2.TextWinner[I]);
+ StaticRound[I] := AddStatic (Theme.PartyNewRoundM2.StaticRound[I]);
+ StaticTable[I] := AddStatic (Theme.PartyNewRoundM2.StaticTable[I]);
+ end;
+
+ TextNextRound := AddText (Theme.PartyNewRoundM2.TextNextRound);
+ TextNextPlayer1 := AddText (Theme.PartyNewRoundM2.TextNextPlayer1);
+ TextNextPlayer2 := AddText (Theme.PartyNewRoundM2.TextNextPlayer2);
+ TextHandicap := AddText (Theme.PartyNewRoundM2.TextHandicap);
+
+ StaticNextPlayer1 := AddStatic (Theme.PartyNewRoundM2.StaticNextPlayer1);
+ StaticNextPlayer2 := AddStatic (Theme.PartyNewRoundM2.StaticNextPlayer2);
+ StaticHandicap := AddStatic (Theme.PartyNewRoundM2.StaticHandicap);
+
+ //Table
+ for I := 1 to 9 do
+ begin
+ for J := 1 to 7 do
+ begin
+ TextTableName[I,J] := AddText (Theme.PartyNewRoundM2.TextTableName[I,J]);
+ end;
+ end;
+end;
+
+procedure TScreenPartyNewRoundM2.onShow;
+var
+ x,y: Integer;
+begin
+ inherited;
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenPartyNewRoundM2)');
+
+ PartySessionM2.StartRound;
+ ScreenRound:=PartySessionM2.CurRound-2;
+ if ScreenRound<0 then
+ begin
+ ScreenRound:=PartySessionM2.CurRound-1;
+ if ScreenRound<0 then
+ ScreenRound:=0;
+ end;
+ Update;
+
+ //Display Scores
+ for x := 1 to 9 do
+ begin
+ if x<=PartySessionM2.Players.NumPlayer then
+ begin
+ Static[StaticTable[x]].Visible := true;
+ Text[TextTableName[x,1]].Text := IntToStr(x);
+ Text[TextTableName[x,2]].Text := PartySessionM2.Players.Playerinfo[PartySessionM2.Order[x-1]].Name;
+ Text[TextTableName[x,3]].Text := IntToStr(PartySessionM2.Players.Playerinfo[PartySessionM2.Order[x-1]].Wins);
+ Text[TextTableName[x,4]].Text := IntToStr(PartySessionM2.Players.Playerinfo[PartySessionM2.Order[x-1]].Draws);
+ Text[TextTableName[x,5]].Text := IntToStr(PartySessionM2.Players.Playerinfo[PartySessionM2.Order[x-1]].Defeats);
+ Text[TextTableName[x,6]].Text := IntToStr(PartySessionM2.Players.Playerinfo[PartySessionM2.Order[x-1]].ScoreP -
+ PartySessionM2.Players.Playerinfo[PartySessionM2.Order[x-1]].ScoreN);
+ Text[TextTableName[x,7]].Text := IntToStr(PartySessionM2.Players.Playerinfo[PartySessionM2.Order[x-1]].Points);
+ end else
+ begin
+ for y := 1 to 7 do
+ begin
+ Text[TextTableName[x,y]].Text := '';
+ Static[StaticTable[x]].Visible := false;
+ end;
+ end;
+ end;
+
+ //nextRound Texts
+ if PartySessionM2.CurRound<Length(PartySessionM2.Rounds) then
+ begin
+ if PartySessionM2.Option_Plugins then
+ begin
+ Text[TextNextRound].Text := Language.Translate('PARTY_ROUND') + ' ' + IntToStr(PartySessionM2.CurRound + 1) +
+ ': ' + PartySessionM2.Plugins[PartySessionM2.Rounds[PartySessionM2.CurRound].PluginNr].Name;
+ end else
+ Text[TextNextRound].Text := Language.Translate('PARTY_ROUND') + ' ' + IntToStr(PartySessionM2.CurRound + 1);
+
+ Text[TextNextPlayer1].Text := PartySessionM2.Players.Playerinfo[PartySessionM2.Rounds[PartySessionM2.CurRound].Player1].Name;
+ Text[TextNextPlayer1].Visible := true;
+
+ Text[TextNextPlayer2].Text := PartySessionM2.Players.Playerinfo[PartySessionM2.Rounds[PartySessionM2.CurRound].Player2].Name;
+ Text[TextNextPlayer2].Visible := true;
+
+ Static[StaticNextPlayer1].Visible := true;
+ Static[StaticNextPlayer2].Visible := true;
+
+ //Handicap-mode
+ if PartySessionM2.HandicapMode then
+ begin
+ Text[TextHandicap].Text := '[' + FormatFloat('#0.00', PartySessionM2.Handicap.P1m) +
+ ' : ' + FormatFloat('#0.00', PartySessionM2.Handicap.P2m) + ']';
+ Text[TextHandicap].visible := true;
+ Static[StaticHandicap].visible := true;
+ end else
+ begin
+ Text[TextHandicap].visible := false;
+ Static[StaticHandicap].visible := false;
+ end;
+ end else
+ begin
+ Text[TextNextRound].Text := Language.Translate('PARTY_ROUNDM2_END');
+
+ Text[TextNextPlayer1].Visible := false;
+ Text[TextNextPlayer2].Visible := false;
+
+ Static[StaticNextPlayer1].Visible := false;
+ Static[StaticNextPlayer2].Visible := false;
+ end;
+end;
+
+procedure TScreenPartyNewRoundM2.Update;
+var
+ N, R: Integer;
+ T: Integer;
+ NumRounds: Integer;
+begin
+ N:=0;
+ //current round-number
+ R:=PartySessionM2.CurRound;
+
+ //Set Visibility of Round Infos
+ NumRounds := Length(PartySessionM2.Rounds);
+
+ N:=ScreenRound;
+
+ if ((NumRounds-9)<N) then
+ begin
+ N:=NumRounds-9;
+ ScreenRound:=N;
+ end;
+
+ if (N<0) then
+ begin
+ N:=0;
+ ScreenRound:=0;
+ end;
+
+ for T := 1 to 9 do
+ begin
+ if (NumRounds >= T) then
+ begin
+ Static[StaticRound[T]].Visible := true;
+ Text[TextRound[T]].Visible := true;
+ if (N+T-1<R) then
+ Text[TextWinner[T]].Visible := true
+ else
+ Text[TextWinner[T]].Visible := false;
+
+ //Texts:
+ if (N+T-1<R) then
+ Text[TextRound[T]].Text := IntToStr(N+T)+ ') ' + PartySessionM2.Players.Playerinfo[PartySessionM2.Rounds[N+T-1].Player1].Name +
+ ' - ' + PartySessionM2.Players.Playerinfo[PartySessionM2.Rounds[N+T-1].Player2].Name
+ else
+ begin
+ Text[TextRound[T]].Text := IntToStr(N+T)+ ') ';
+ Text[TextRound[T]].Text := Text[TextRound[T]].Text +
+ PartySessionM2.Plugins[PartySessionM2.Rounds[N+T-1].PluginNr].Name
+ end;
+
+ Text[TextWinner[T]].Text :=FillNulls(PartySessionM2.Rounds[N+T-1].ScoreP) +
+ ':' + FillNulls(PartySessionM2.Rounds[N+T-1].ScoreN);
+ end else
+ begin
+ Static[StaticRound[T]].Visible := false;
+ Text[TextRound[T]].Visible := false;
+ Text[TextWinner[T]].Visible := false;
+ end;
+ end;
+end;
+
+function TScreenPartyNewRoundM2.FillNulls(number: integer): String;
+begin
+ if number<10 then
+ Result := '000' + IntToStr(number)
+ else if number<100 then
+ Result := '00' + IntToStr(number)
+ else if number <1000 then
+ Result := '0' + IntToStr(number)
+ else
+ Result := IntToStr(number);
+end;
+
+procedure TScreenPartyNewRoundM2.SetAnimationProgress(Progress: real);
+begin
+ {Button[0].Texture.ScaleW := Progress;
+ Button[1].Texture.ScaleW := Progress;
+ Button[2].Texture.ScaleW := Progress; }
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenPartyOptions.pas b/Game/Code/Screens/UScreenPartyOptions.pas
new file mode 100644
index 00000000..7baa3743
--- /dev/null
+++ b/Game/Code/Screens/UScreenPartyOptions.pas
@@ -0,0 +1,649 @@
+unit UScreenPartyOptions;
+
+interface
+
+uses
+ UMenu, gl, glu, TextGL, SDL, UDisplay, UMusic, UParty, UFiles, SysUtils, UThemes;
+
+type
+ TScreenPartyOptions = class(TMenu)
+ const
+ ID='ID_015'; //for help system
+
+ public
+ SelectLevel: Cardinal;
+ SelectPlayList: Cardinal;
+ SelectPlayList2: Cardinal;
+ SelectRounds: Cardinal;
+ SelectTeams: Cardinal;
+ SelectPlayers1: Cardinal;
+ SelectPlayers2: Cardinal;
+ SelectPlayers3: Cardinal;
+
+ PluginList: array of TPartyPlugin;
+ SelectedPlugin: Integer;
+ MenuPluginOpen: boolean;
+
+ PlayList: Integer;
+ PlayList2: Integer;
+ Rounds: Integer;
+ NumTeams: Integer;
+ NumPlayer1, NumPlayer2, NumPlayer3: Integer;
+
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ function Draw: boolean; override;
+ procedure SetAnimationProgress(Progress: real); override;
+ procedure SetPlaylist2;
+
+ procedure Draw_MenuPlugin;
+ function PartyInput_MenuPlugin(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): boolean;
+ end;
+
+var
+ IPlaylist: array[0..2] of String;
+ IPlaylist2: array of String;
+const
+ ITeams: array[0..1] of String =('2', '3');
+ IPlayers: array[0..3] of String =('1', '2', '3', '4');
+ IRounds: array[0..30] of String = ('2', '3', '4', '5', '6', '7', '8', '9', '10',
+ '11', '12', '13', '14', '15', '16', '17', '18', '19', '20',
+ '21', '22', '23', '24', '25', '26', '27', '28', '29', '30',
+ '31', '32');
+
+implementation
+
+uses UGraphic, UMain, UIni, UTexture, ULanguage, UDLLManager, UPlaylist, USongs, UHelp, ULog;
+
+function TScreenPartyOptions.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+
+ if MenuPluginOpen then
+ begin
+ PartyInput_MenuPlugin(PressedKey, ScanCode, PressedDown);
+ Exit;
+ end;
+
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ Music.PlayBack;
+ FadeTo(@ScreenMain);
+ end;
+
+ SDLK_RETURN:
+ begin
+ MenuPluginOpen := true;
+ if not Help.SetHelpID('ID_030') then
+ Log.LogError('No Entry for Help-ID ID_030 (ScreenPartyOptions, SelectPlugins)');
+ end;
+
+ // Up and Down could be done at the same time,
+ // but I don't want to declare variables inside
+ // functions like this one, called so many times
+ SDLK_DOWN: InteractNext;
+ SDLK_UP: InteractPrev;
+ SDLK_RIGHT:
+ begin
+ Music.PlayOption;
+ InteractInc;
+
+ //Change Playlist2 if Playlist is Changed
+ If (Interaction = 1) then
+ begin
+ SetPlaylist2;
+ end //Change Team3 Players visibility
+ Else If (Interaction = 4) then
+ begin
+ SelectsS[7].Visible := (NumTeams = 1);
+ end;
+ end;
+ SDLK_LEFT:
+ begin
+ Music.PlayOption;
+ InteractDec;
+
+ //Change Playlist2 if Playlist is Changed
+ If (Interaction = 1) then
+ begin
+ SetPlaylist2;
+ end //Change Team3 Players visibility
+ Else If (Interaction = 4) then
+ begin
+ SelectsS[7].Visible := (NumTeams = 1);
+ end;
+ end;
+ end;
+ end;
+end;
+
+function TScreenPartyOptions.PartyInput_MenuPlugin(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): boolean;
+var
+ I, J, Len: Integer;
+ OnlyMultiPlayer: boolean;
+ SinglePlayerTeams: boolean;
+
+begin
+ Result := true;
+
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_ESCAPE:
+ begin
+ MenuPluginOpen := false;
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenPartyOptions)');
+ end;
+
+ SDLK_RETURN:
+ begin
+ MenuPluginOpen := false;
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenPartyOptions)');
+ //Don'T start when Playlist is Selected and there are no Playlists
+ If (Playlist = 2) and (Length(PlaylistMan.Playlists) = 0) then
+ Exit;
+ // Don't start when SinglePlayer Teams but only Multiplayer Plugins available
+ OnlyMultiPlayer:=true;
+ SinglePlayerTeams := ((NumPlayer1 = 0) OR (NumPlayer2 = 0) OR ((NumPlayer3 = 0) AND
+ (NumTeams = 1)));
+
+ SetLength(PartySession.Plugins, 0);
+ for I := 0 to Length(PluginList)-1 do
+ begin
+ if PluginList[I].Selected then
+ begin
+ if PluginList[I].Medley or
+ (not DLLMan.Plugins[PluginList[I].ID].TeamModeOnly) or
+ (not SinglePlayerTeams and DLLMan.Plugins[PluginList[I].ID].TeamModeOnly) then
+ begin
+ Len := Length(PartySession.Plugins);
+ SetLength(PartySession.Plugins, Len+1);
+ PartySession.Plugins[Len] := PluginList[I];
+ end;
+
+ if not PluginList[I].Medley then
+ OnlyMultiPlayer := (OnlyMultiPlayer AND
+ DLLMan.Plugins[PluginList[I].ID].TeamModeOnly)
+ else
+ OnlyMultiPlayer := false;
+ end;
+ end;
+
+ if (OnlyMultiPlayer) AND SinglePlayerTeams or
+ (Length(PartySession.Plugins)=0) then begin
+ ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_PLUGINS'));
+ Exit;
+ end;
+ //Save Difficulty
+ Ini.Difficulty := SelectsS[SelectLevel].SelectedOption;
+ Ini.SaveLevel;
+
+
+ //Save Num Teams:
+ PartySession.Teams.NumTeams := NumTeams + 2;
+ PartySession.Teams.Teaminfo[0].NumPlayers := NumPlayer1+1;
+ PartySession.Teams.Teaminfo[1].NumPlayers := NumPlayer2+1;
+ PartySession.Teams.Teaminfo[2].NumPlayers := NumPlayer3+1;
+
+ //Save Playlist
+ PlaylistMan.Mode := Playlist;
+ PlaylistMan.CurPlayList := High(Cardinal);
+ //If Category Selected Search Category ID
+ if Playlist = 1 then
+ begin
+ J := -1;
+ For I := 0 to high(CatSongs.Song) do
+ begin
+ if CatSongs.Song[I].Main then
+ Inc(J);
+
+ if J = Playlist2 then
+ begin
+ PlaylistMan.CurPlayList := I;
+ Break;
+ end;
+ end;
+
+ //No Categorys or Invalid Entry
+ If PlaylistMan.CurPlayList = High(Cardinal) then
+ Exit;
+ end
+ else
+ PlaylistMan.CurPlayList := Playlist2;
+
+ //Start Party
+ PartySession.StartNewParty(Rounds + 2);
+
+ Music.PlayStart;
+ //Go to Player Screen
+ FadeTo(@ScreenPartyPlayer);
+ end;
+
+ SDLK_SPACE:
+ begin
+ Music.PlayOption;
+ PluginList[SelectedPlugin].Selected := not PluginList[SelectedPlugin].Selected;
+ end;
+
+ SDLK_LEFT:
+ begin
+ if PluginList[SelectedPlugin].Selected then
+ begin
+ Music.PlayOption;
+ PluginList[SelectedPlugin].Selected := false;
+ end;
+ end;
+
+ SDLK_RIGHT:
+ begin
+ if not PluginList[SelectedPlugin].Selected then
+ begin
+ Music.PlayOption;
+ PluginList[SelectedPlugin].Selected := true;
+ end;
+ end;
+
+ SDLK_UP:
+ begin
+ if SelectedPlugin>0 then
+ Dec(SelectedPlugin);
+ end;
+
+ SDLK_DOWN:
+ begin
+ if SelectedPlugin<Length(PluginList)-1 then
+ Inc(SelectedPlugin);
+ end;
+ end; //of case
+ end; //of if
+end;
+
+procedure TScreenPartyOptions.Draw_MenuPlugin;
+Type
+ TRect = record
+ left, right, top, bottom: integer;
+ end;
+
+Const
+ h = 40;
+
+ procedure DrawPlugin(num: integer; Rect: TRect; Plug: TPartyPlugin; selected: boolean);
+ var
+ text: PChar;
+ name: string;
+
+ begin
+ glColor4f(1, 1, 1, 1);
+ glLineWidth(1);
+ if selected then
+ begin
+ glBegin(GL_LINE_LOOP);
+ glVertex2f(Rect.left-5, Rect.top+h*num);
+ glVertex2f(Rect.right+5, Rect.top+h*num);
+ glVertex2f(Rect.right+5, Rect.top+h*(num+1));
+ glVertex2f(Rect.left-5, Rect.top+h*(num+1));
+ glEnd;
+ end;
+
+ SetFontStyle(1);
+ SetFontItalic(false);
+ SetFontSize(13);
+
+ SetFontPos (Rect.left, Rect.top+ num*h);
+
+ name := Plug.Name;
+
+ text := Addr(name[1]);
+ glPrint(text);
+
+ SetFontPos (Rect.left+Round((Rect.right-Rect.left)/4*3), Rect.top+ num*h);
+ if Plug.Selected then
+ name := Language.Translate('SONG_MENU_YES')
+ else
+ name := Language.Translate('SONG_MENU_NO');
+
+ text := Addr(name[1]);
+ glPrint(text);
+ end;
+
+ procedure DrawScroll(X, Y, W, H: integer; pos, len: double);
+ var
+ fY, tY: double;
+ begin
+ glColor4f(1, 1, 1, 1);
+
+ glLineWidth(1);
+ glBegin(GL_LINE_LOOP);
+ glVertex2f(X, Y);
+ glVertex2f(X+W, Y);
+ glVertex2f(X+W, Y+H);
+ glVertex2f(X, Y+H);
+ glEnd;
+
+ fY := Y+(H-H*len)*pos;
+ tY := fY+H*len;
+ if tY+0.001>=Y+H then
+ tY := Y+H;
+
+ glBegin(GL_QUADS);
+ glVertex2f(X, fY);
+ glVertex2f(X+W, fY);
+ glVertex2f(X+W, tY);
+ glVertex2f(X, tY);
+ glEnd;
+ end;
+
+var
+ Rect: TRect;
+ abs: real;
+ ab: real;
+ I: integer;
+ barH: double;
+ pos: double;
+
+begin
+ Rect.left := 150;
+ Rect.right := 650;
+ Rect.top := 30;
+ Rect.bottom := 550;
+
+ abs := 15;
+
+ if Length(PluginList)<=13 then
+ begin
+ ab := 0;
+ barH := 1;
+ end else
+ begin
+ ab := 10;
+ barH := h*13/(h*Length(PluginList));
+ end;
+
+ glEnable(GL_BLEND);
+ glBegin(gl_quads);
+ //Background:
+ glColor4f(0.2, 0.2, 0.2, 0.8); glVertex2f(Rect.left-abs, Rect.top-abs);
+ glColor4f(0.2, 0.2, 0.2, 0.8); glVertex2f(Rect.right+abs+ab, Rect.top-abs);
+ glColor4f(0.2, 0.2, 0.2, 0.8); glVertex2f(Rect.right+abs+ab, Rect.bottom+abs);
+ glColor4f(0.2, 0.2, 0.2, 0.8); glVertex2f(Rect.left-abs, Rect.bottom+abs);
+ glEnd;
+ glDisable(GL_BLEND);
+
+ //Draw MainFrame
+ glColor4f(1, 1, 1, 1);
+
+ glLineWidth(1);
+ glBegin(GL_LINE_LOOP);
+ glVertex2f(Rect.left-abs+1, Rect.top-abs+1);
+ glVertex2f(Rect.right+abs-1, Rect.top-abs+1);
+ glVertex2f(Rect.right+abs-1, Rect.bottom+abs-1);
+ glVertex2f(Rect.left-abs+1, Rect.bottom+abs-1);
+ glEnd;
+
+ if barH<1 then
+ begin
+ pos := SelectedPlugin/(Length(PluginList)-1);
+
+ //draw plugin names and selections
+ for I := 0 to 12 do
+ begin
+ if (SelectedPlugin<=6) then
+ DrawPlugin(I, Rect, PluginList[I], I=SelectedPlugin)
+ else if ((SelectedPlugin-6)<=(Length(PluginList)-13)) then
+ DrawPlugin(I, Rect, PluginList[I+(SelectedPlugin-6)],
+ I+(SelectedPlugin-6)=SelectedPlugin)
+ else
+ DrawPlugin(I, Rect, PluginList[I+(Length(PluginList)-13)],
+ I+(Length(PluginList)-13)=SelectedPlugin);
+ end;
+
+ DrawScroll(Round(Rect.right+abs-1), Rect.top-round(abs)+1,
+ Round(ab), Rect.bottom-Rect.top+round(abs+abs)-2,
+ pos, barH);
+ end else
+ begin
+ for I := 0 to Length(PluginList)-1 do
+ DrawPlugin(I, Rect, PluginList[I], I=SelectedPlugin)
+ end;
+end;
+
+function TScreenPartyOptions.Draw: boolean;
+begin
+ // draw static menu
+ inherited Draw;
+
+ if MenuPluginOpen then
+ Draw_MenuPlugin;
+end;
+
+constructor TScreenPartyOptions.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+ //Fill IPlaylist
+ IPlaylist[0] := Language.Translate('PARTY_PLAYLIST_ALL');
+ IPlaylist[1] := Language.Translate('PARTY_PLAYLIST_CATEGORY');
+ IPlaylist[2] := Language.Translate('PARTY_PLAYLIST_PLAYLIST');
+
+ //Fill IPlaylist2
+ SetLength(IPlaylist2, 1);
+ IPlaylist2[0] := '---';
+
+ //Clear all Selects
+ NumTeams := 0;
+ NumPlayer1 := 0;
+ NumPlayer2 := 0;
+ NumPlayer3 := 0;
+ Rounds := 5;
+ PlayList := 0;
+ PlayList2 := 0;
+
+ //Load Screen From Theme
+ LoadFromTheme(Theme.PartyOptions);
+
+ SelectLevel := AddSelectSlide (Theme.PartyOptions.SelectLevel, Ini.Difficulty, Theme.ILevel);
+ SelectPlayList := AddSelectSlide (Theme.PartyOptions.SelectPlayList, PlayList, IPlaylist);
+ SelectPlayList2 := AddSelectSlide (Theme.PartyOptions.SelectPlayList2, PlayList2, IPlaylist2);
+ SelectRounds := AddSelectSlide (Theme.PartyOptions.SelectRounds, Rounds, IRounds);
+ SelectTeams := AddSelectSlide (Theme.PartyOptions.SelectTeams, NumTeams, ITeams);
+ SelectPlayers1 := AddSelectSlide (Theme.PartyOptions.SelectPlayers1, NumPlayer1, IPlayers);
+ SelectPlayers2 := AddSelectSlide (Theme.PartyOptions.SelectPlayers2, NumPlayer2, IPlayers);
+ SelectPlayers3 := AddSelectSlide (Theme.PartyOptions.SelectPlayers3, NumPlayer3, IPlayers);
+
+ Interaction := 0;
+
+ //Hide Team3 Players
+ SelectsS[7].Visible := False;
+end;
+
+procedure TScreenPartyOptions.SetPlaylist2;
+var I: Integer;
+begin
+ Case Playlist of
+ 0:
+ begin
+ SetLength(IPlaylist2, 1);
+ IPlaylist2[0] := '---';
+ end;
+ 1:
+ begin
+ SetLength(IPlaylist2, 0);
+ For I := 0 to high(CatSongs.Song) do
+ begin
+ If (CatSongs.Song[I].Main) then
+ begin
+ SetLength(IPlaylist2, Length(IPlaylist2) + 1);
+ IPlaylist2[high(IPlaylist2)] := CatSongs.Song[I].Artist;
+ end;
+ end;
+
+ If (Length(IPlaylist2) = 0) then
+ begin
+ SetLength(IPlaylist2, 1);
+ IPlaylist2[0] := 'No Categories found';
+ end;
+ end;
+ 2:
+ begin
+ if (Length(PlaylistMan.Playlists) > 0) then
+ begin
+ SetLength(IPlaylist2, Length(PlaylistMan.Playlists));
+ PlaylistMan.GetNames(IPlaylist2);
+ end
+ else
+ begin
+ SetLength(IPlaylist2, 1);
+ IPlaylist2[0] := 'No Playlists found';
+ end;
+ end;
+ end;
+
+ Playlist2 := 0;
+ UpdateSelectSlideOptions(Theme.PartyOptions.SelectPlayList2, 2, IPlaylist2, Playlist2);
+end;
+
+procedure TScreenPartyOptions.onShow;
+var
+ Len, I: Integer;
+ ID_DUELL: Integer;
+ ID_BLIND: Integer;
+ ID_NOSCORE: Integer;
+
+begin
+ Randomize;
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenPartyOptions)');
+
+ MenuPluginOpen := false;
+
+ //Fill plugin array
+ ID_DUELL := high(Byte);
+ ID_BLIND := high(Byte);
+ ID_NOSCORE := high(Byte);
+
+ SetLength(PluginList, 0);
+ for I := 0 to high(DLLMan.Plugins) do
+ begin
+ if DLLMan.Plugins[I].Name='PLUGIN_DUELL_NAME' then
+ ID_DUELL := I;
+
+ if DLLMan.Plugins[I].Name='PLUGIN_BLIND_NAME' then
+ ID_BLIND := I;
+
+ if DLLMan.Plugins[I].Name='PLUGIN_NOSCORE_NAME' then
+ ID_NOSCORE := I;
+
+ Len := Length(PluginList);
+ SetLength(PluginList, Len + 1);
+ PluginList[Len].ID := I;
+ PluginList[Len].TimesPlayed := 0;
+ PluginList[Len].Medley := false;
+ PluginList[Len].MedleySurprise := false;
+ PluginList[Len].Selected := true;
+ PluginList[Len].Name := Language.Translate(DLLMan.Plugins[I].Name);
+ PluginList[Len].Desc := Language.Translate(DLLMan.Plugins[I].PluginDesc);
+ end;
+
+ //Add Medley "Plugin" (if Plugin DUELL availible)
+ if ID_DUELL<>high(Byte) then
+ begin
+ Len := Length(PluginList);
+ SetLength(PluginList, Len + 1);
+ PluginList[Len].ID := ID_DUELL;
+ PluginList[Len].TimesPlayed := 0;
+ PluginList[Len].Medley := true;
+ PluginList[Len].MedleySurprise := false;
+ PluginList[Len].Selected := true;
+ PluginList[Len].Name := Language.Translate('PLUGIN_MEDLEY_NAME');
+ PluginList[Len].Desc := Language.Translate('PLUGIN_MEDLEY_DESC');
+ end;
+
+ //Add Medley blind "Plugin" (if Plugin BLIND availible)
+ if ID_BLIND<>high(Byte) then
+ begin
+ Len := Length(PluginList);
+ SetLength(PluginList, Len + 1);
+ PluginList[Len].ID := ID_BLIND;
+ PluginList[Len].TimesPlayed := 0;
+ PluginList[Len].Medley := true;
+ PluginList[Len].MedleySurprise := false;
+ PluginList[Len].Selected := true;
+ PluginList[Len].Name := Language.Translate('PLUGIN_MEDLEYBLIND_NAME');
+ PluginList[Len].Desc := Language.Translate('PLUGIN_MEDLEYBLIND_DESC');
+ end;
+
+ //Add Medley noscore "Plugin" (if Plugin NOSCORE availible)
+ if ID_NOSCORE<>high(Byte) then
+ begin
+ Len := Length(PluginList);
+ SetLength(PluginList, Len + 1);
+ PluginList[Len].ID := ID_NOSCORE;
+ PluginList[Len].TimesPlayed := 0;
+ PluginList[Len].Medley := true;
+ PluginList[Len].MedleySurprise := false;
+ PluginList[Len].Selected := true;
+ PluginList[Len].Name := Language.Translate('PLUGIN_MEDLEYNOSCORE_NAME');
+ PluginList[Len].Desc := Language.Translate('PLUGIN_MEDLEYNOSCORE_DESC');
+ end;
+
+ //Add Medley Surprise "Plugin" (if Plugin DUELL availible)
+ if ID_DUELL<>high(Byte) then
+ begin
+ Len := Length(PluginList);
+ SetLength(PluginList, Len + 1);
+ PluginList[Len].ID := ID_DUELL;
+ PluginList[Len].TimesPlayed := 0;
+ PluginList[Len].Medley := true;
+ PluginList[Len].MedleySurprise := true;
+ PluginList[Len].Selected := true;
+ PluginList[Len].Name := Language.Translate('PLUGIN_MEDLEYSURPRISE_NAME');
+ PluginList[Len].Desc := Language.Translate('PLUGIN_MEDLEYSURPRISE_DESC');
+ end;
+
+ //Add Medley Surprise blind "Plugin" (if Plugin BLIND availible)
+ if ID_BLIND<>high(Byte) then
+ begin
+ Len := Length(PluginList);
+ SetLength(PluginList, Len + 1);
+ PluginList[Len].ID := ID_BLIND;
+ PluginList[Len].TimesPlayed := 0;
+ PluginList[Len].Medley := true;
+ PluginList[Len].MedleySurprise := true;
+ PluginList[Len].Selected := true;
+ PluginList[Len].Name := Language.Translate('PLUGIN_MEDLEYSURPRISEBLIND_NAME');
+ PluginList[Len].Desc := Language.Translate('PLUGIN_MEDLEYSURPRISEBLIND_DESC');
+ end;
+
+ SelectedPlugin := 0;
+end;
+
+procedure TScreenPartyOptions.SetAnimationProgress(Progress: real);
+begin
+ {for I := 0 to 6 do
+ SelectS[I].Texture.ScaleW := Progress;}
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenPartyOptionsM2.pas b/Game/Code/Screens/UScreenPartyOptionsM2.pas
new file mode 100644
index 00000000..186983a1
--- /dev/null
+++ b/Game/Code/Screens/UScreenPartyOptionsM2.pas
@@ -0,0 +1,819 @@
+unit UScreenPartyOptionsM2;
+
+interface
+
+uses
+ UMenu,
+ gl,
+ glu,
+ TextGL,
+ SDL,
+ UDisplay,
+ UMusic,
+ UFiles,
+ SysUtils,
+ UPartyM2,
+ UThemes;
+
+type
+ TScreenPartyOptionsM2 = class(TMenu)
+ const
+ ID='ID_020'; //for help system
+
+ public
+ ID_DUELL: Byte;
+ SelectLevel: cardinal;
+ SelectPlayList: cardinal;
+ SelectPlayList2: cardinal;
+ NameRounds: cardinal;
+ CountRounds: cardinal;
+ SelectPlayers: cardinal;
+ SelectRounds: cardinal;
+ SelectOptionPlugin: cardinal;
+ SelectOptionHandicap: cardinal;
+
+ MenuPluginOpen: boolean;
+
+ PluginList: array of TPartyPlugin;
+ SelectedPlugin: Integer;
+
+ PlayList: integer;
+ PlayList2: integer;
+ Rounds: integer;
+ NumPlayer: integer;
+ OptionPlugin: integer;
+ OptionHandicap: integer;
+
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ function Draw: boolean; override;
+ procedure SetAnimationProgress(Progress: real); override;
+ procedure SetPlaylist2;
+
+ procedure Draw_MenuPlugin;
+ function PartyInput_MenuPlugin(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): boolean;
+ end;
+
+var
+ IPlaylist: array[0..2] of String;
+ IPlaylist2: array of String;
+ IRounds: array of String;
+ IOptionYesNo: array of String;
+
+const
+ IPlayers: array[0..7] of String = ('2', '3', '4', '5', '6', '7', '8', '9');
+ MAX_ROUNDS: Integer = 100;
+
+implementation
+
+uses
+ UGraphic,
+ UMain,
+ UIni,
+ UTexture,
+ ULanguage,
+ UDLLManager,
+ UPlaylist,
+ UHelp,
+ ULog,
+ USongs;
+
+function TScreenPartyOptionsM2.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+var
+ I, J, Len: integer;
+ DuellAvailible: boolean;
+
+begin
+ Result := true;
+
+ if MenuPluginOpen then
+ begin
+ PartyInput_MenuPlugin(PressedKey, ScanCode, PressedDown);
+ Exit;
+ end;
+
+ if (PressedDown) then
+ begin
+ // check special keys
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ Music.PlayBack;
+ FadeTo(@ScreenMain);
+ end;
+
+ SDLK_RETURN:
+ begin
+ if not (OptionPlugin=1) then
+ begin
+ //Don'T start when Playlist is Selected and there are no Playlists
+ if (Playlist = 2) and (Length(PlaylistMan.Playlists) = 0) then
+ Exit;
+
+ //check plugins
+ SetLength(PartySessionM2.Plugins, 0);
+ DuellAvailible := false;
+ for I := 0 to Length(PluginList)-1 do
+ begin
+ //deactivate if not select plugins
+ //deselect all Plugins
+ if (OptionPlugin=0) then
+ PluginList[I].Selected := false;
+
+ //activate only duell plugin
+ if (OptionPlugin=0) and (PluginList[I].ID=ID_DUELL) and not PluginList[I].Medley then
+ begin
+ DuellAvailible := true;
+ if OptionPlugin=0 then
+ PluginList[I].Selected := true;
+ end;
+
+ if PluginList[I].Selected then
+ begin
+ Len := Length(PartySessionM2.Plugins);
+ SetLength(PartySessionM2.Plugins, Len+1);
+ PartySessionM2.Plugins[Len] := PluginList[I];
+ end;
+ end;
+
+ // Don't start when OptionPlugin=0 and no DUEL-Plugin
+ if not DuellAvailible and (OptionPlugin=0) then
+ begin
+ ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_PLUGINS') + ' (Duell)');
+ Exit;
+ end;
+
+ if Length(PartySessionM2.Plugins)=0 then
+ begin
+ ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_PLUGINS'));
+ Exit;
+ end;
+
+ //Save OptionPlugin
+ if OptionPlugin=0 then
+ PartySessionM2.Option_Plugins := false
+ else
+ PartySessionM2.Option_Plugins := true;
+
+ //Save Option Handicap
+ if OptionHandicap=0 then
+ PartySessionM2.HandicapMode := false
+ else
+ PartySessionM2.HandicapMode := true;
+
+ //Save Difficulty
+ Ini.Difficulty := SelectsS[SelectLevel].SelectedOption;
+ Ini.SaveLevel;
+
+ //Save Playlist
+ PlaylistMan.Mode := Playlist;
+ PlaylistMan.CurPlayList := High(Cardinal);
+ //If Category Selected Search Category ID
+ if Playlist = 1 then
+ begin
+ J := -1;
+ For I := 0 to high(CatSongs.Song) do
+ begin
+ if CatSongs.Song[I].Main then
+ Inc(J);
+
+ if J = Playlist2 then
+ begin
+ PlaylistMan.CurPlayList := I;
+ Break;
+ end;
+ end;
+
+ //No Categorys or Invalid Entry
+ If PlaylistMan.CurPlayList = High(Cardinal) then
+ Exit;
+ end
+ else
+ PlaylistMan.CurPlayList := Playlist2;
+
+ //Start Party
+ PartySessionM2.StartNewParty(NumPlayer+2, Rounds+1);
+
+ Music.PlayStart;
+ //Go to Player Screen
+ FadeTo(@ScreenPartyPlayerM2);
+ end else
+ begin
+ MenuPluginOpen := true;
+ if not Help.SetHelpID('ID_030') then
+ Log.LogError('No Entry for Help-ID ID_030 (ScreenPartyOptionsM2, SelectPlugins)');
+ end;
+ end;
+
+ // Up and Down could be done at the same time,
+ // but I don't want to declare variables inside
+ // functions like this one, called so many times
+ SDLK_DOWN:
+ begin
+ InteractNext;
+ if Interaction=7 then
+ MenuPluginOpen := true;
+ end;
+ SDLK_UP: InteractPrev;
+ SDLK_RIGHT:
+ begin
+ Music.PlayOption;
+ InteractInc;
+
+ //Change Playlist2 if Playlist is Changed
+ if (Interaction = 1) then
+ begin
+ SetPlaylist2;
+ end
+ else if(Interaction = 3) then
+ begin
+ Rounds:=(((NumPlayer+2)*(NumPlayer+2))-NumPlayer-2)-1;
+ SelectsS[SelectRounds].SetSelectOpt(Rounds);
+ end else if(Interaction = 4) then
+ begin
+ if (Rounds+1 + NumPlayer + 1 <= MAX_ROUNDS-1) then
+ Rounds:=Rounds + NumPlayer + 1
+ else
+ dec(Rounds);
+
+ SelectsS[SelectRounds].SetSelectOpt(Rounds);
+ end else if(Interaction = 5) then //Option Plugins
+ begin
+ //select all Plugins
+ for I := 0 to Length(PluginList) - 1 do
+ begin
+ PluginList[I].Selected := true;
+ end;
+ end;
+ end;
+ SDLK_LEFT:
+ begin
+ Music.PlayOption;
+ InteractDec;
+
+ //Change Playlist2 if Playlist is Changed
+ if (Interaction = 1) then
+ begin
+ SetPlaylist2;
+ end
+ else if(Interaction = 3) then
+ begin
+ Rounds:=(((NumPlayer+2)*(NumPlayer+2))-NumPlayer-2)-1;
+ SelectsS[SelectRounds].SetSelectOpt(Rounds);
+ end else if(Interaction = 4) then
+ begin
+ if (Rounds+1 - NumPlayer - 1 >= 2) then
+ Rounds:=Rounds - NumPlayer - 1
+ else
+ inc(Rounds);
+
+ SelectsS[SelectRounds].SetSelectOpt(Rounds);
+ end;
+ end;
+ end;
+ end;
+end;
+
+function TScreenPartyOptionsM2.PartyInput_MenuPlugin(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): boolean;
+var
+ I, J, Len: integer;
+ DuellAvailible: boolean;
+
+begin
+ Result := true;
+
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_ESCAPE:
+ begin
+ MenuPluginOpen := false;
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenPartyOptions)');
+ end;
+
+ SDLK_RETURN:
+ begin
+ MenuPluginOpen := false;
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenPartyOptions)');
+ //Don'T start when Playlist is Selected and there are no Playlists
+ if (Playlist = 2) and (Length(PlaylistMan.Playlists) = 0) then
+ Exit;
+
+ //check plugins
+ SetLength(PartySessionM2.Plugins, 0);
+ DuellAvailible := false;
+ for I := 0 to Length(PluginList)-1 do
+ begin
+ if (PluginList[I].ID=ID_DUELL) then
+ begin
+ DuellAvailible := true;
+ if OptionPlugin=0 then
+ PluginList[I].Selected := true;
+ end;
+
+ if PluginList[I].Selected then
+ begin
+ Len := Length(PartySessionM2.Plugins);
+ SetLength(PartySessionM2.Plugins, Len+1);
+ PartySessionM2.Plugins[Len] := PluginList[I];
+ end;
+ end;
+
+ // Don't start when OptionPlugin=0 and no DUEL-Plugin
+ if not DuellAvailible and (OptionPlugin=0) then
+ begin
+ ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_PLUGINS') + ' (Duell)');
+ Exit;
+ end;
+
+ if Length(PartySessionM2.Plugins)=0 then
+ begin
+ ScreenPopupError.ShowPopup(Language.Translate('ERROR_NO_PLUGINS'));
+ Exit;
+ end;
+
+ //Save OptionPlugin
+ if OptionPlugin=0 then
+ PartySessionM2.Option_Plugins := false
+ else
+ PartySessionM2.Option_Plugins := true;
+
+ //Save Option Handicap
+ if OptionHandicap=0 then
+ PartySessionM2.HandicapMode := false
+ else
+ PartySessionM2.HandicapMode := true;
+
+ //Save Difficulty
+ Ini.Difficulty := SelectsS[SelectLevel].SelectedOption;
+ Ini.SaveLevel;
+
+ //Save Playlist
+ PlaylistMan.Mode := Playlist;
+ PlaylistMan.CurPlayList := High(Cardinal);
+ //If Category Selected Search Category ID
+ if Playlist = 1 then
+ begin
+ J := -1;
+ For I := 0 to high(CatSongs.Song) do
+ begin
+ if CatSongs.Song[I].Main then
+ Inc(J);
+
+ if J = Playlist2 then
+ begin
+ PlaylistMan.CurPlayList := I;
+ Break;
+ end;
+ end;
+
+ //No Categorys or Invalid Entry
+ If PlaylistMan.CurPlayList = High(Cardinal) then
+ Exit;
+ end
+ else
+ PlaylistMan.CurPlayList := Playlist2;
+
+ //Start Party
+ PartySessionM2.StartNewParty(NumPlayer+2, Rounds+1);
+
+ Music.PlayStart;
+ //Go to Player Screen
+ FadeTo(@ScreenPartyPlayerM2);
+ end;
+
+ SDLK_SPACE:
+ begin
+ Music.PlayOption;
+ PluginList[SelectedPlugin].Selected := not PluginList[SelectedPlugin].Selected;
+ end;
+
+ SDLK_LEFT:
+ begin
+ if PluginList[SelectedPlugin].Selected then
+ begin
+ Music.PlayOption;
+ PluginList[SelectedPlugin].Selected := false;
+ end;
+ end;
+
+ SDLK_RIGHT:
+ begin
+ if not PluginList[SelectedPlugin].Selected then
+ begin
+ Music.PlayOption;
+ PluginList[SelectedPlugin].Selected := true;
+ end;
+ end;
+
+ SDLK_UP:
+ begin
+ if SelectedPlugin>0 then
+ Dec(SelectedPlugin);
+ end;
+
+ SDLK_DOWN:
+ begin
+ if SelectedPlugin<Length(PluginList)-1 then
+ Inc(SelectedPlugin);
+ end;
+ end; //of case
+ end; //of if
+end;
+
+procedure TScreenPartyOptionsM2.Draw_MenuPlugin;
+Type
+ TRect = record
+ left, right, top, bottom: integer;
+ end;
+
+Const
+ h = 40;
+
+ procedure DrawPlugin(num: integer; Rect: TRect; Plug: TPartyPlugin; selected: boolean);
+ var
+ text: PChar;
+ name: string;
+
+ begin
+ glColor4f(1, 1, 1, 1);
+ glLineWidth(1);
+ if selected then
+ begin
+ glBegin(GL_LINE_LOOP);
+ glVertex2f(Rect.left-5, Rect.top+h*num);
+ glVertex2f(Rect.right+5, Rect.top+h*num);
+ glVertex2f(Rect.right+5, Rect.top+h*(num+1));
+ glVertex2f(Rect.left-5, Rect.top+h*(num+1));
+ glEnd;
+ end;
+
+ SetFontStyle(1);
+ SetFontItalic(false);
+ SetFontSize(13);
+
+ SetFontPos (Rect.left, Rect.top+ num*h);
+
+ name := Plug.Name;
+
+ text := Addr(name[1]);
+ glPrint(text);
+
+ SetFontPos (Rect.left+Round((Rect.right-Rect.left)/4*3), Rect.top+ num*h);
+ if Plug.Selected then
+ name := Language.Translate('SONG_MENU_YES')
+ else
+ name := Language.Translate('SONG_MENU_NO');
+
+ text := Addr(name[1]);
+ glPrint(text);
+ end;
+
+ procedure DrawScroll(X, Y, W, H: integer; pos, len: double);
+ var
+ fY, tY: double;
+ begin
+ glColor4f(1, 1, 1, 1);
+
+ glLineWidth(1);
+ glBegin(GL_LINE_LOOP);
+ glVertex2f(X, Y);
+ glVertex2f(X+W, Y);
+ glVertex2f(X+W, Y+H);
+ glVertex2f(X, Y+H);
+ glEnd;
+
+ fY := Y+(H-H*len)*pos;
+ tY := fY+H*len;
+ if tY+0.001>=Y+H then
+ tY := Y+H;
+
+ glBegin(GL_QUADS);
+ glVertex2f(X, fY);
+ glVertex2f(X+W, fY);
+ glVertex2f(X+W, tY);
+ glVertex2f(X, tY);
+ glEnd;
+ end;
+
+var
+ Rect: TRect;
+ abs: real;
+ ab: real;
+ I: integer;
+ barH: double;
+ pos: double;
+
+begin
+ Rect.left := 150;
+ Rect.right := 650;
+ Rect.top := 30;
+ Rect.bottom := 550;
+
+ abs := 15;
+
+ if Length(PluginList)<=13 then
+ begin
+ ab := 0;
+ barH := 1;
+ end else
+ begin
+ ab := 10;
+ barH := h*13/(h*Length(PluginList));
+ end;
+
+ glEnable(GL_BLEND);
+ glBegin(gl_quads);
+ //Background:
+ glColor4f(0.2, 0.2, 0.2, 0.8); glVertex2f(Rect.left-abs, Rect.top-abs);
+ glColor4f(0.2, 0.2, 0.2, 0.8); glVertex2f(Rect.right+abs+ab, Rect.top-abs);
+ glColor4f(0.2, 0.2, 0.2, 0.8); glVertex2f(Rect.right+abs+ab, Rect.bottom+abs);
+ glColor4f(0.2, 0.2, 0.2, 0.8); glVertex2f(Rect.left-abs, Rect.bottom+abs);
+ glEnd;
+ glDisable(GL_BLEND);
+
+ //Draw MainFrame
+ glColor4f(1, 1, 1, 1);
+
+ glLineWidth(1);
+ glBegin(GL_LINE_LOOP);
+ glVertex2f(Rect.left-abs+1, Rect.top-abs+1);
+ glVertex2f(Rect.right+abs-1, Rect.top-abs+1);
+ glVertex2f(Rect.right+abs-1, Rect.bottom+abs-1);
+ glVertex2f(Rect.left-abs+1, Rect.bottom+abs-1);
+ glEnd;
+
+ if barH<1 then
+ begin
+ pos := SelectedPlugin/(Length(PluginList)-1);
+
+ //draw plugin names and selections
+ for I := 0 to 12 do
+ begin
+ if (SelectedPlugin<=6) then
+ DrawPlugin(I, Rect, PluginList[I], I=SelectedPlugin)
+ else if ((SelectedPlugin-6)<=(Length(PluginList)-13)) then
+ DrawPlugin(I, Rect, PluginList[I+(SelectedPlugin-6)],
+ I+(SelectedPlugin-6)=SelectedPlugin)
+ else
+ DrawPlugin(I, Rect, PluginList[I+(Length(PluginList)-13)],
+ I+(Length(PluginList)-13)=SelectedPlugin);
+ end;
+
+ DrawScroll(Round(Rect.right+abs-1), Rect.top-round(abs)+1,
+ Round(ab), Rect.bottom-Rect.top+round(abs+abs)-2,
+ pos, barH);
+ end else
+ begin
+ for I := 0 to Length(PluginList)-1 do
+ DrawPlugin(I, Rect, PluginList[I], I=SelectedPlugin)
+ end;
+end;
+
+constructor TScreenPartyOptionsM2.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+ //Fill IPlaylist
+
+ SetLength(IOptionYesNo, 2);
+ IOptionYesNo[0] := Language.Translate('SONG_MENU_NO');
+ IOptionYesNo[1] := Language.Translate('SONG_MENU_YES');
+
+ SetLength(IRounds, Round(MAX_ROUNDS));
+ for I := 1 to MAX_ROUNDS do
+ begin
+ IRounds[I-1]:=IntToStr(I);
+ end;
+
+ IPlaylist[0] := Language.Translate('PARTY_PLAYLIST_ALL');
+ IPlaylist[1] := Language.Translate('PARTY_PLAYLIST_CATEGORY');
+ IPlaylist[2] := Language.Translate('PARTY_PLAYLIST_PLAYLIST');
+
+ //Fill IPlaylist2
+ SetLength(IPlaylist2, 1);
+ IPlaylist2[0] := '---';
+
+ //Clear all Selects
+ NumPlayer := 0;
+ Rounds := 0;
+ PlayList := 0;
+ PlayList2 := 0;
+
+ //Load Screen From Theme
+ LoadFromTheme(Theme.PartyOptionsM2);
+
+ SelectLevel := AddSelectSlide (Theme.PartyOptionsM2.SelectLevel, Ini.Difficulty, Theme.ILevel);
+ SelectPlayList := AddSelectSlide (Theme.PartyOptionsM2.SelectPlayList, PlayList, IPlaylist);
+ SelectPlayList2 := AddSelectSlide (Theme.PartyOptionsM2.SelectPlayList2, PlayList2, IPlaylist2);
+ SelectPlayers := AddSelectSlide (Theme.PartyOptionsM2.SelectPlayers1, NumPlayer, IPlayers);
+ SelectRounds := AddSelectSlide (Theme.PartyOptionsM2.SelectRounds, Rounds, IRounds);
+ SelectOptionPlugin := AddSelectSlide (Theme.PartyOptionsM2.SelectOptionPlugin, OptionPlugin, IOptionYesNo);
+ SelectOptionHandicap := AddSelectSlide (Theme.PartyOptionsM2.SelectOptionHandicap, OptionHandicap, IOptionYesNo);
+
+ Interaction := 0;
+ Rounds:=1;
+ SelectsS[SelectRounds].SetSelectOpt(Rounds);
+
+end;
+
+procedure TScreenPartyOptionsM2.SetPlaylist2;
+var
+ I: integer;
+begin
+ case Playlist of
+ 0:
+ begin
+ SetLength(IPlaylist2, 1);
+ IPlaylist2[0] := '---';
+ end;
+ 1:
+ begin
+ SetLength(IPlaylist2, 0);
+ for I := 0 to high(CatSongs.Song) do
+ begin
+ if (CatSongs.Song[I].Main) then
+ begin
+ SetLength(IPlaylist2, Length(IPlaylist2) + 1);
+ IPlaylist2[high(IPlaylist2)] := CatSongs.Song[I].Artist;
+ end;
+ end;
+
+ if (Length(IPlaylist2) = 0) then
+ begin
+ SetLength(IPlaylist2, 1);
+ IPlaylist2[0] := 'No Categories found';
+ end;
+ end;
+ 2:
+ begin
+ if (Length(PlaylistMan.Playlists) > 0) then
+ begin
+ SetLength(IPlaylist2, Length(PlaylistMan.Playlists));
+ PlaylistMan.GetNames(IPlaylist2);
+ end
+ else
+ begin
+ SetLength(IPlaylist2, 1);
+ IPlaylist2[0] := 'No Playlists found';
+ end;
+ end;
+ end;
+
+ Playlist2 := 0;
+ UpdateSelectSlideOptions(Theme.PartyOptionsM2.SelectPlayList2, 2, IPlaylist2, Playlist2);
+end;
+
+procedure TScreenPartyOptionsM2.onShow;
+var
+ Len, I: Integer;
+ ID_BLIND: Byte;
+ ID_NOSCORE: Byte;
+
+begin
+ Randomize;
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenPartyOptionsM2)');
+
+ MenuPluginOpen := false;
+
+ //Fill plugin array
+ ID_DUELL := high(Byte);
+ ID_BLIND := high(Byte);
+ ID_NOSCORE := high(Byte);
+
+ SetLength(PluginList, 0);
+ for I := 0 to high(DLLMan.Plugins) do
+ begin
+ if DLLMan.Plugins[I].Name='PLUGIN_DUELL_NAME' then
+ ID_DUELL := I;
+
+ if DLLMan.Plugins[I].Name='PLUGIN_BLIND_NAME' then
+ ID_BLIND := I;
+
+ if DLLMan.Plugins[I].Name='PLUGIN_NOSCORE_NAME' then
+ ID_NOSCORE := I;
+
+ if (not DLLMan.Plugins[I].TeamModeOnly) then
+ begin
+ Len := Length(PluginList);
+ SetLength(PluginList, Len + 1);
+ PluginList[Len].ID := I;
+ PluginList[Len].TimesPlayed := 0;
+ PluginList[Len].Medley := false;
+ PluginList[Len].MedleySurprise := false;
+
+ if I=ID_DUELL then
+ PluginList[Len].Selected := true
+ else
+ PluginList[Len].Selected := false;
+
+ PluginList[Len].Name := Language.Translate(DLLMan.Plugins[I].Name);
+ PluginList[Len].Desc := Language.Translate(DLLMan.Plugins[I].PluginDesc);
+ end;
+ end;
+
+ //Add Medley "Plugin" (if Plugin DUELL availible)
+ if ID_DUELL<>high(Byte) then
+ begin
+ Len := Length(PluginList);
+ SetLength(PluginList, Len + 1);
+ PluginList[Len].ID := ID_DUELL;
+ PluginList[Len].TimesPlayed := 0;
+ PluginList[Len].Medley := true;
+ PluginList[Len].MedleySurprise := false;
+ PluginList[Len].Selected := true;
+ PluginList[Len].Name := Language.Translate('PLUGIN_MEDLEY_NAME');
+ PluginList[Len].Desc := Language.Translate('PLUGIN_MEDLEY_DESC');
+ end;
+
+ //Add Medley blind "Plugin" (if Plugin BLIND availible)
+ if ID_BLIND<>high(Byte) then
+ begin
+ Len := Length(PluginList);
+ SetLength(PluginList, Len + 1);
+ PluginList[Len].ID := ID_BLIND;
+ PluginList[Len].TimesPlayed := 0;
+ PluginList[Len].Medley := true;
+ PluginList[Len].MedleySurprise := false;
+ PluginList[Len].Selected := true;
+ PluginList[Len].Name := Language.Translate('PLUGIN_MEDLEYBLIND_NAME');
+ PluginList[Len].Desc := Language.Translate('PLUGIN_MEDLEYBLIND_DESC');
+ end;
+
+ //Add Medley noscore "Plugin" (if Plugin NOSCORE availible)
+ if ID_NOSCORE<>high(Byte) then
+ begin
+ Len := Length(PluginList);
+ SetLength(PluginList, Len + 1);
+ PluginList[Len].ID := ID_NOSCORE;
+ PluginList[Len].TimesPlayed := 0;
+ PluginList[Len].Medley := true;
+ PluginList[Len].MedleySurprise := false;
+ PluginList[Len].Selected := true;
+ PluginList[Len].Name := Language.Translate('PLUGIN_MEDLEYNOSCORE_NAME');
+ PluginList[Len].Desc := Language.Translate('PLUGIN_MEDLEYNOSCORE_DESC');
+ end;
+
+ //Add Medley Surprise "Plugin" (if Plugin DUELL availible)
+ if ID_DUELL<>high(Byte) then
+ begin
+ Len := Length(PluginList);
+ SetLength(PluginList, Len + 1);
+ PluginList[Len].ID := ID_DUELL;
+ PluginList[Len].TimesPlayed := 0;
+ PluginList[Len].Medley := true;
+ PluginList[Len].MedleySurprise := true;
+ PluginList[Len].Selected := true;
+ PluginList[Len].Name := Language.Translate('PLUGIN_MEDLEYSURPRISE_NAME');
+ PluginList[Len].Desc := Language.Translate('PLUGIN_MEDLEYSURPRISE_DESC');
+ end;
+
+ //Add Medley Surprise blind "Plugin" (if Plugin BLIND availible)
+ if ID_BLIND<>high(Byte) then
+ begin
+ Len := Length(PluginList);
+ SetLength(PluginList, Len + 1);
+ PluginList[Len].ID := ID_BLIND;
+ PluginList[Len].TimesPlayed := 0;
+ PluginList[Len].Medley := true;
+ PluginList[Len].MedleySurprise := true;
+ PluginList[Len].Selected := true;
+ PluginList[Len].Name := Language.Translate('PLUGIN_MEDLEYSURPRISEBLIND_NAME');
+ PluginList[Len].Desc := Language.Translate('PLUGIN_MEDLEYSURPRISEBLIND_DESC');
+ end;
+
+ SelectedPlugin := 0;
+end;
+
+function TScreenPartyOptionsM2.Draw: boolean;
+begin
+ // draw static menu
+ inherited Draw;
+
+ if MenuPluginOpen then
+ Draw_MenuPlugin;
+end;
+
+procedure TScreenPartyOptionsM2.SetAnimationProgress(Progress: real);
+begin
+ {for I := 0 to 6 do
+ SelectS[I].Texture.ScaleW := Progress;}
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenPartyPlayer.pas b/Game/Code/Screens/UScreenPartyPlayer.pas
new file mode 100644
index 00000000..70e08adb
--- /dev/null
+++ b/Game/Code/Screens/UScreenPartyPlayer.pas
@@ -0,0 +1,340 @@
+unit UScreenPartyPlayer;
+
+Interface
+
+uses
+ UMenu, SDL, UDisplay, UMusic, UFiles, SysUtils, UThemes;
+
+type
+ TScreenPartyPlayer = class(TMenu)
+ const
+ ID='ID_016'; //for help system
+
+ public
+ Team1Name: Cardinal;
+ Player1Name: Cardinal;
+ Player2Name: Cardinal;
+ Player3Name: Cardinal;
+ Player4Name: Cardinal;
+
+ Team2Name: Cardinal;
+ Player5Name: Cardinal;
+ Player6Name: Cardinal;
+ Player7Name: Cardinal;
+ Player8Name: Cardinal;
+
+ Team3Name: Cardinal;
+ Player9Name: Cardinal;
+ Player10Name: Cardinal;
+ Player11Name: Cardinal;
+ Player12Name: Cardinal;
+
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ procedure SetAnimationProgress(Progress: real); override;
+ end;
+
+implementation
+
+uses UGraphic, UMain, UIni, UTexture, UParty, UHelp, ULog;
+
+function TScreenPartyPlayer.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+var
+ I, J: integer;
+ SDL_ModState: Word;
+ procedure IntNext;
+ begin
+ repeat
+ InteractNext;
+ until Button[Interaction].Visible;
+ end;
+ procedure IntPrev;
+ begin
+ repeat
+ InteractPrev;
+ until Button[Interaction].Visible;
+ end;
+begin
+ Result := true;
+ If (PressedDown) Then
+
+ SDL_ModState := SDL_GetModState and (KMOD_LSHIFT + KMOD_RSHIFT
+ + KMOD_LCTRL + KMOD_RCTRL + KMOD_LALT + KMOD_RALT);
+
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_0..SDLK_9, SDLK_A..SDLK_Z, SDLK_SPACE, SDLK_MINUS, SDLK_EXCLAIM, SDLK_COMMA, SDLK_SLASH, SDLK_ASTERISK, SDLK_QUESTION, SDLK_QUOTE, SDLK_QUOTEDBL:
+ begin
+ Button[Interaction].Text[0].Text := Button[Interaction].Text[0].Text + chr(ScanCode);
+ end;
+
+ // Templates for Names Mod
+ SDLK_F1:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[0] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[0];
+ end;
+ SDLK_F2:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[1] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[1];
+ end;
+ SDLK_F3:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[2] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[2];
+ end;
+ SDLK_F4:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[3] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[3];
+ end;
+ SDLK_F5:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[4] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[4];
+ end;
+ SDLK_F6:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[5] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[5];
+ end;
+ SDLK_F7:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[6] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[6];
+ end;
+ SDLK_F8:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[7] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[7];
+ end;
+ SDLK_F9:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[8] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[8];
+ end;
+ SDLK_F10:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[9] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[9];
+ end;
+ SDLK_F11:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[10] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[10];
+ end;
+ SDLK_F12:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[11] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[11];
+ end;
+
+ SDLK_BACKSPACE:
+ begin
+ Button[Interaction].Text[0].DeleteLastL;
+ end;
+
+ SDLK_ESCAPE :
+ begin
+ Ini.SaveNames;
+ Music.PlayBack;
+ FadeTo(@ScreenPartyOptions);
+ end;
+
+ SDLK_RETURN:
+ begin
+ Ini.SaveNames;
+ //Save PlayerNames
+ for I := 0 to PartySession.Teams.NumTeams-1 do
+ begin
+ PartySession.Teams.Teaminfo[I].Name := PChar(Button[I*5].Text[0].Text);
+ for J := 0 to PartySession.Teams.Teaminfo[I].NumPlayers-1 do
+ begin
+ PartySession.Teams.Teaminfo[I].Playerinfo[J].Name := PChar(Button[I*5 + J+1].Text[0].Text);
+ PartySession.Teams.Teaminfo[I].Playerinfo[J].TimesPlayed := 0;
+ end;
+ end;
+
+ Music.PlayStart;
+ FadeTo(@ScreenPartyNewRound);
+ end;
+
+ // Up and Down could be done at the same time,
+ // but I don't want to declare variables inside
+ // functions like this one, called so many times
+ SDLK_DOWN: IntNext;
+ SDLK_UP: IntPrev;
+ SDLK_RIGHT: IntNext;
+ SDLK_LEFT: IntPrev;
+ end;
+ end;
+end;
+
+constructor TScreenPartyPlayer.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ LoadFromTheme(Theme.PartyPlayer);
+
+ Team1Name := AddButton(Theme.PartyPlayer.Team1Name);
+ AddButton(Theme.PartyPlayer.Player1Name);
+ AddButton(Theme.PartyPlayer.Player2Name);
+ AddButton(Theme.PartyPlayer.Player3Name);
+ AddButton(Theme.PartyPlayer.Player4Name);
+
+ Team2Name := AddButton(Theme.PartyPlayer.Team2Name);
+ AddButton(Theme.PartyPlayer.Player5Name);
+ AddButton(Theme.PartyPlayer.Player6Name);
+ AddButton(Theme.PartyPlayer.Player7Name);
+ AddButton(Theme.PartyPlayer.Player8Name);
+
+ Team3Name := AddButton(Theme.PartyPlayer.Team3Name);
+ AddButton(Theme.PartyPlayer.Player9Name);
+ AddButton(Theme.PartyPlayer.Player10Name);
+ AddButton(Theme.PartyPlayer.Player11Name);
+ AddButton(Theme.PartyPlayer.Player12Name);
+
+ Interaction := 0;
+end;
+
+procedure TScreenPartyPlayer.onShow;
+var
+ I: integer;
+begin
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenPartyPlayer)');
+
+ // Templates for Names Mod
+ for I := 1 to 4 do
+ Button[I].Text[0].Text := Ini.Name[I-1];
+
+ for I := 6 to 9 do
+ Button[I].Text[0].Text := Ini.Name[I-2];
+
+ for I := 11 to 14 do
+ Button[I].Text[0].Text := Ini.Name[I-3];
+
+ Button[0].Text[0].Text := Ini.NameTeam[0];
+ Button[5].Text[0].Text := Ini.NameTeam[1];
+ Button[10].Text[0].Text := Ini.NameTeam[2];
+ // Templates for Names Mod end
+
+ If (PartySession.Teams.NumTeams>=1) then
+ begin
+ Button[0].Visible := True;
+ Button[1].Visible := (PartySession.Teams.Teaminfo[0].NumPlayers >=1);
+ Button[2].Visible := (PartySession.Teams.Teaminfo[0].NumPlayers >=2);
+ Button[3].Visible := (PartySession.Teams.Teaminfo[0].NumPlayers >=3);
+ Button[4].Visible := (PartySession.Teams.Teaminfo[0].NumPlayers >=4);
+ end
+ else
+ begin
+ Button[0].Visible := False;
+ Button[1].Visible := False;
+ Button[2].Visible := False;
+ Button[3].Visible := False;
+ Button[4].Visible := False;
+ end;
+
+ If (PartySession.Teams.NumTeams>=2) then
+ begin
+ Button[5].Visible := True;
+ Button[6].Visible := (PartySession.Teams.Teaminfo[1].NumPlayers >=1);
+ Button[7].Visible := (PartySession.Teams.Teaminfo[1].NumPlayers >=2);
+ Button[8].Visible := (PartySession.Teams.Teaminfo[1].NumPlayers >=3);
+ Button[9].Visible := (PartySession.Teams.Teaminfo[1].NumPlayers >=4);
+ end
+ else
+ begin
+ Button[5].Visible := False;
+ Button[6].Visible := False;
+ Button[7].Visible := False;
+ Button[8].Visible := False;
+ Button[9].Visible := False;
+ end;
+
+ If (PartySession.Teams.NumTeams>=3) then
+ begin
+ Button[10].Visible := True;
+ Button[11].Visible := (PartySession.Teams.Teaminfo[2].NumPlayers >=1);
+ Button[12].Visible := (PartySession.Teams.Teaminfo[2].NumPlayers >=2);
+ Button[13].Visible := (PartySession.Teams.Teaminfo[2].NumPlayers >=3);
+ Button[14].Visible := (PartySession.Teams.Teaminfo[2].NumPlayers >=4);
+ end
+ else
+ begin
+ Button[10].Visible := False;
+ Button[11].Visible := False;
+ Button[12].Visible := False;
+ Button[13].Visible := False;
+ Button[14].Visible := False;
+ end;
+
+end;
+
+procedure TScreenPartyPlayer.SetAnimationProgress(Progress: real);
+var
+ I: integer;
+begin
+ for I := 0 to high(Button) do
+ Button[I].Texture.ScaleW := Progress;
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenPartyPlayerM2.pas b/Game/Code/Screens/UScreenPartyPlayerM2.pas
new file mode 100644
index 00000000..0486dfda
--- /dev/null
+++ b/Game/Code/Screens/UScreenPartyPlayerM2.pas
@@ -0,0 +1,256 @@
+unit UScreenPartyPlayerM2;
+
+Interface
+
+uses
+ UMenu, SDL, UDisplay, UMusic, UFiles, SysUtils, UThemes;
+
+type
+ TScreenPartyPlayerM2 = class(TMenu)
+ const
+ ID='ID_021'; //for help system
+
+ public
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ procedure SetAnimationProgress(Progress: real); override;
+ end;
+
+implementation
+
+uses UGraphic, UMain, UIni, UTexture, UPartyM2, UHelp, ULog;
+
+function TScreenPartyPlayerM2.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+var
+ I, J: integer;
+ SDL_ModState: Word;
+ procedure IntNext;
+ begin
+ repeat
+ InteractNext;
+ until Button[Interaction].Visible;
+ end;
+ procedure IntPrev;
+ begin
+ repeat
+ InteractPrev;
+ until Button[Interaction].Visible;
+ end;
+begin
+ Result := true;
+ If (PressedDown) Then
+
+ SDL_ModState := SDL_GetModState and (KMOD_LSHIFT + KMOD_RSHIFT
+ + KMOD_LCTRL + KMOD_RCTRL + KMOD_LALT + KMOD_RALT);
+
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_0..SDLK_9, SDLK_A..SDLK_Z, SDLK_SPACE, SDLK_MINUS, SDLK_EXCLAIM, SDLK_COMMA, SDLK_SLASH, SDLK_ASTERISK, SDLK_QUESTION, SDLK_QUOTE, SDLK_QUOTEDBL:
+ begin
+ Button[Interaction].Text[0].Text := Button[Interaction].Text[0].Text + chr(ScanCode);
+ end;
+
+ // Templates for Names Mod
+ SDLK_F1:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[0] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[0];
+ end;
+ SDLK_F2:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[1] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[1];
+ end;
+ SDLK_F3:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[2] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[2];
+ end;
+ SDLK_F4:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[3] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[3];
+ end;
+ SDLK_F5:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[4] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[4];
+ end;
+ SDLK_F6:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[5] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[5];
+ end;
+ SDLK_F7:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[6] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[6];
+ end;
+ SDLK_F8:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[7] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[7];
+ end;
+ SDLK_F9:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[8] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[8];
+ end;
+ SDLK_F10:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[9] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[9];
+ end;
+ SDLK_F11:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[10] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[10];
+ end;
+ SDLK_F12:
+ if (SDL_ModState = KMOD_LALT) then
+ begin
+ Ini.NameTemplate[11] := Button[Interaction].Text[0].Text;
+ end
+ else
+ begin
+ Button[Interaction].Text[0].Text := Ini.NameTemplate[11];
+ end;
+
+ SDLK_BACKSPACE:
+ begin
+ Button[Interaction].Text[0].DeleteLastL;
+ end;
+
+ SDLK_ESCAPE :
+ begin
+ Ini.SaveNames;
+ Music.PlayBack;
+ FadeTo(@ScreenPartyOptionsM2);
+ end;
+
+ SDLK_RETURN:
+ begin
+ Ini.SaveNames;
+ //Save PlayerNames
+ for J := 0 to PartySessionM2.Players.NumPlayer-1 do
+ begin
+ PartySessionM2.Players.Playerinfo[J].Name := PChar(Button[J].Text[0].Text);
+ PartySessionM2.Players.Playerinfo[J].NumPlayed := 0;
+ end;
+
+ Music.PlayStart;
+ FadeTo(@ScreenPartyNewRoundM2);
+ end;
+
+ // Up and Down could be done at the same time,
+ // but I don't want to declare variables inside
+ // functions like this one, called so many times
+ SDLK_DOWN: IntNext;
+ SDLK_UP: IntPrev;
+ SDLK_RIGHT: IntNext;
+ SDLK_LEFT: IntPrev;
+ end;
+ end;
+end;
+
+constructor TScreenPartyPlayerM2.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ LoadFromTheme(Theme.PartyPlayerM2);
+
+ AddButton(Theme.PartyPlayerM2.Player1Name);
+ AddButton(Theme.PartyPlayerM2.Player2Name);
+ AddButton(Theme.PartyPlayerM2.Player3Name);
+ AddButton(Theme.PartyPlayerM2.Player4Name);
+ AddButton(Theme.PartyPlayerM2.Player5Name);
+ AddButton(Theme.PartyPlayerM2.Player6Name);
+ AddButton(Theme.PartyPlayerM2.Player7Name);
+ AddButton(Theme.PartyPlayerM2.Player8Name);
+ AddButton(Theme.PartyPlayerM2.Player9Name);
+
+ Interaction := 0;
+end;
+
+procedure TScreenPartyPlayerM2.onShow;
+var
+ I: integer;
+begin
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenPartyPlayerM2)');
+
+ // Templates for Names Mod
+ for I := 1 to 9 do
+ begin
+ Button[I-1].Text[0].Text := Ini.NameTemplate[I-1];
+ if (PartySessionM2.Players.NumPlayer >=I) then
+ begin
+ Button[I-1].Visible := true;
+ end else
+ begin
+ Button[I-1].Visible := false;
+ end;
+ end;
+end;
+
+procedure TScreenPartyPlayerM2.SetAnimationProgress(Progress: real);
+var
+ I: integer;
+begin
+ for I := 0 to high(Button) do
+ Button[I].Texture.ScaleW := Progress;
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenPartyScore.pas b/Game/Code/Screens/UScreenPartyScore.pas
new file mode 100644
index 00000000..fb6d6022
--- /dev/null
+++ b/Game/Code/Screens/UScreenPartyScore.pas
@@ -0,0 +1,301 @@
+unit UScreenPartyScore;
+
+interface
+
+uses
+ UMenu, SDL, UDisplay, UMusic, SysUtils, UThemes;
+
+type
+ TScreenPartyScore = class(TMenu)
+ const
+ ID='ID_017'; //for help system
+
+ public
+ TextScoreTeam1: Cardinal;
+ TextScoreTeam2: Cardinal;
+ TextScoreTeam3: Cardinal;
+ TextNameTeam1: Cardinal;
+ TextNameTeam2: Cardinal;
+ TextNameTeam3: Cardinal;
+ StaticTeam1: Cardinal;
+ StaticTeam1BG: Cardinal;
+ StaticTeam1Deco: Cardinal;
+ StaticTeam2: Cardinal;
+ StaticTeam2BG: Cardinal;
+ StaticTeam2Deco: Cardinal;
+ StaticTeam3: Cardinal;
+ StaticTeam3BG: Cardinal;
+ StaticTeam3Deco: Cardinal;
+ TextWinner: Cardinal;
+
+ DecoTex: Array[0..5] of Integer;
+ DecoColor: Array[0..5] of Record
+ R, G, B: Real;
+ end;
+
+ MaxScore: Word;
+
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ procedure SetAnimationProgress(Progress: real); override;
+ end;
+
+implementation
+
+uses UGraphic, UMain, UParty, UScreenSingModi, ULanguage, UTexture, USkins, UHelp, ULog;
+
+function TScreenPartyScore.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ Music.PlayStart;
+ if (PartySession.CurRound < High(PartySession.Rounds)) then
+ FadeTo(@ScreenPartyNewRound)
+ else
+ begin
+ PartySession.EndRound;
+ FadeTo(@ScreenPartyWin);
+ end;
+ end;
+
+ SDLK_RETURN:
+ begin
+ Music.PlayStart;
+ if (PartySession.CurRound < High(PartySession.Rounds)) then
+ FadeTo(@ScreenPartyNewRound)
+ else
+ FadeTo(@ScreenPartyWin);
+ end;
+ end;
+ end;
+end;
+
+constructor TScreenPartyScore.Create;
+var
+ I: integer;
+ Tex: TTexture;
+ R, G, B: Real;
+ Color: Integer;
+begin
+ inherited Create;
+
+ TextScoreTeam1 := AddText (Theme.PartyScore.TextScoreTeam1);
+ TextScoreTeam2 := AddText (Theme.PartyScore.TextScoreTeam2);
+ TextScoreTeam3 := AddText (Theme.PartyScore.TextScoreTeam3);
+ TextNameTeam1 := AddText (Theme.PartyScore.TextNameTeam1);
+ TextNameTeam2 := AddText (Theme.PartyScore.TextNameTeam2);
+ TextNameTeam3 := AddText (Theme.PartyScore.TextNameTeam3);
+
+ StaticTeam1 := AddStatic (Theme.PartyScore.StaticTeam1);
+ StaticTeam1BG := AddStatic (Theme.PartyScore.StaticTeam1BG);
+ StaticTeam1Deco := AddStatic (Theme.PartyScore.StaticTeam1Deco);
+ StaticTeam2 := AddStatic (Theme.PartyScore.StaticTeam2);
+ StaticTeam2BG := AddStatic (Theme.PartyScore.StaticTeam2BG);
+ StaticTeam2Deco := AddStatic (Theme.PartyScore.StaticTeam2Deco);
+ StaticTeam3 := AddStatic (Theme.PartyScore.StaticTeam3);
+ StaticTeam3BG := AddStatic (Theme.PartyScore.StaticTeam3BG);
+ StaticTeam3Deco := AddStatic (Theme.PartyScore.StaticTeam3Deco);
+
+ TextWinner := AddText (Theme.PartyScore.TextWinner);
+
+ //Load Deco Textures
+ if Theme.PartyScore.DecoTextures.ChangeTextures then
+ begin
+ //Get Color
+ LoadColor(R, G, B, Theme.PartyScore.DecoTextures.FirstColor);
+ Color := $10000 * Round(R*255) + $100 * Round(G*255) + Round(B*255);
+ DecoColor[0].R := R;
+ DecoColor[0].G := G;
+ DecoColor[0].B := B;
+
+ //Load Texture
+ Tex := Texture.LoadTexture(pchar(Skin.GetTextureFileName(Theme.PartyScore.DecoTextures.FirstTexture)), 'JPG', PChar(Theme.PartyScore.DecoTextures.FirstTyp), Color);
+ DecoTex[0] := Tex.TexNum;
+
+ //Get Second Color
+ LoadColor(R, G, B, Theme.PartyScore.DecoTextures.SecondColor);
+ Color := $10000 * Round(R*255) + $100 * Round(G*255) + Round(B*255);
+ DecoColor[1].R := R;
+ DecoColor[1].G := G;
+ DecoColor[1].B := B;
+
+ //Load Second Texture
+ Tex := Texture.LoadTexture(pchar(Skin.GetTextureFileName(Theme.PartyScore.DecoTextures.SecondTexture)), 'JPG', PChar(Theme.PartyScore.DecoTextures.SecondTyp), Color);
+ DecoTex[1] := Tex.TexNum;
+
+ //Get Third Color
+ LoadColor(R, G, B, Theme.PartyScore.DecoTextures.ThirdColor);
+ Color := $10000 * Round(R*255) + $100 * Round(G*255) + Round(B*255);
+ DecoColor[2].R := R;
+ DecoColor[2].G := G;
+ DecoColor[2].B := B;
+
+ //Load Third Texture
+ Tex := Texture.LoadTexture(pchar(Skin.GetTextureFileName(Theme.PartyScore.DecoTextures.ThirdTexture)), 'JPG', PChar(Theme.PartyScore.DecoTextures.ThirdTyp), Color);
+ DecoTex[2] := Tex.TexNum;
+ end;
+
+ LoadFromTheme(Theme.PartyScore);
+end;
+
+procedure TScreenPartyScore.onShow;
+var
+ I, J: Integer;
+ Placings: Array [0..5] of Byte;
+begin
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenPartyScore)');
+
+ //Get Maxscore
+ MaxScore := 0;
+ for I := 0 to ScreenSingModi.PlayerInfo.NumPlayers - 1 do
+ begin
+ if (ScreenSingModi.PlayerInfo.Playerinfo[I].Score > MaxScore) then
+ MaxScore := ScreenSingModi.PlayerInfo.Playerinfo[I].Score;
+ end;
+
+ //Get Placings
+ for I := 0 to ScreenSingModi.PlayerInfo.NumPlayers - 1 do
+ begin
+ Placings[I] := 0;
+ for J := 0 to ScreenSingModi.PlayerInfo.NumPlayers - 1 do
+ If (ScreenSingModi.PlayerInfo.Playerinfo[J].Score > ScreenSingModi.PlayerInfo.Playerinfo[I].Score) then
+ Inc(Placings[I]);
+ end;
+
+
+ //Set Static Length
+ Static[StaticTeam1].Texture.ScaleW := ScreenSingModi.PlayerInfo.Playerinfo[0].Percentage / 100;
+ Static[StaticTeam2].Texture.ScaleW := ScreenSingModi.PlayerInfo.Playerinfo[1].Percentage / 100;
+ Static[StaticTeam3].Texture.ScaleW := ScreenSingModi.PlayerInfo.Playerinfo[2].Percentage / 100;
+
+ //fix: prevents static from drawn out of bounds.
+ if Static[StaticTeam1].Texture.ScaleW > 99 then Static[StaticTeam1].Texture.ScaleW := 99;
+ if Static[StaticTeam2].Texture.ScaleW > 99 then Static[StaticTeam2].Texture.ScaleW := 99;
+ if Static[StaticTeam3].Texture.ScaleW > 99 then Static[StaticTeam3].Texture.ScaleW := 99;
+
+ //End Last Round
+ PartySession.EndRound;
+
+ //Set Winnertext
+ Text[TextWinner].Text := Format(Language.Translate('PARTY_SCORE_WINS'), [PartySession.GetWinnerString(PartySession.CurRound)]);
+
+ if (ScreenSingModi.PlayerInfo.NumPlayers >= 1) then
+ begin
+ Text[TextScoreTeam1].Text := InttoStr(ScreenSingModi.PlayerInfo.Playerinfo[0].Score);
+ Text[TextNameTeam1].Text := String(ScreenSingModi.TeamInfo.Teaminfo[0].Name);
+
+ //Set Deco Texture
+ if Theme.PartyScore.DecoTextures.ChangeTextures then
+ begin
+ Static[StaticTeam1Deco].Texture.TexNum := DecoTex[Placings[0]];
+ Static[StaticTeam1Deco].Texture.ColR := DecoColor[Placings[0]].R;
+ Static[StaticTeam1Deco].Texture.ColG := DecoColor[Placings[0]].G;
+ Static[StaticTeam1Deco].Texture.ColB := DecoColor[Placings[0]].B;
+ end;
+
+ Text[TextScoreTeam1].Visible := True;
+ Text[TextNameTeam1].Visible := True;
+ Static[StaticTeam1].Visible := True;
+ Static[StaticTeam1BG].Visible := True;
+ Static[StaticTeam1Deco].Visible := True;
+ end
+ else
+ begin
+ Text[TextScoreTeam1].Visible := False;
+ Text[TextNameTeam1].Visible := False;
+ Static[StaticTeam1].Visible := False;
+ Static[StaticTeam1BG].Visible := False;
+ Static[StaticTeam1Deco].Visible := False;
+ end;
+
+ if (ScreenSingModi.PlayerInfo.NumPlayers >= 2) then
+ begin
+ Text[TextScoreTeam2].Text := InttoStr(ScreenSingModi.PlayerInfo.Playerinfo[1].Score);
+ Text[TextNameTeam2].Text := String(ScreenSingModi.TeamInfo.Teaminfo[1].Name);
+
+ //Set Deco Texture
+ if Theme.PartyScore.DecoTextures.ChangeTextures then
+ begin
+ Static[StaticTeam2Deco].Texture.TexNum := DecoTex[Placings[1]];
+ Static[StaticTeam2Deco].Texture.ColR := DecoColor[Placings[1]].R;
+ Static[StaticTeam2Deco].Texture.ColG := DecoColor[Placings[1]].G;
+ Static[StaticTeam2Deco].Texture.ColB := DecoColor[Placings[1]].B;
+ end;
+
+ Text[TextScoreTeam2].Visible := True;
+ Text[TextNameTeam2].Visible := True;
+ Static[StaticTeam2].Visible := True;
+ Static[StaticTeam2BG].Visible := True;
+ Static[StaticTeam2Deco].Visible := True;
+ end
+ else
+ begin
+ Text[TextScoreTeam2].Visible := False;
+ Text[TextNameTeam2].Visible := False;
+ Static[StaticTeam2].Visible := False;
+ Static[StaticTeam2BG].Visible := False;
+ Static[StaticTeam2Deco].Visible := False;
+ end;
+
+ if (ScreenSingModi.PlayerInfo.NumPlayers >= 3) then
+ begin
+ Text[TextScoreTeam3].Text := InttoStr(ScreenSingModi.PlayerInfo.Playerinfo[2].Score);
+ Text[TextNameTeam3].Text := String(ScreenSingModi.TeamInfo.Teaminfo[2].Name);
+
+ //Set Deco Texture
+ if Theme.PartyScore.DecoTextures.ChangeTextures then
+ begin
+ Static[StaticTeam3Deco].Texture.TexNum := DecoTex[Placings[2]];
+ Static[StaticTeam3Deco].Texture.ColR := DecoColor[Placings[2]].R;
+ Static[StaticTeam3Deco].Texture.ColG := DecoColor[Placings[2]].G;
+ Static[StaticTeam3Deco].Texture.ColB := DecoColor[Placings[2]].B;
+ end;
+
+ Text[TextScoreTeam3].Visible := True;
+ Text[TextNameTeam3].Visible := True;
+ Static[StaticTeam3].Visible := True;
+ Static[StaticTeam3BG].Visible := True;
+ Static[StaticTeam3Deco].Visible := True;
+ end
+ else
+ begin
+ Text[TextScoreTeam3].Visible := False;
+ Text[TextNameTeam3].Visible := False;
+ Static[StaticTeam3].Visible := False;
+ Static[StaticTeam3BG].Visible := False;
+ Static[StaticTeam3Deco].Visible := False;
+ end;
+
+
+// LCD.WriteText(1, ' Choose mode: ');
+// UpdateLCD;
+end;
+
+procedure TScreenPartyScore.SetAnimationProgress(Progress: real);
+begin
+ if (ScreenSingModi.PlayerInfo.NumPlayers >= 1) then
+ Static[StaticTeam1].Texture.ScaleW := Progress * ScreenSingModi.PlayerInfo.Playerinfo[0].Percentage / 100;
+ if (ScreenSingModi.PlayerInfo.NumPlayers >= 2) then
+ Static[StaticTeam2].Texture.ScaleW := Progress * ScreenSingModi.PlayerInfo.Playerinfo[1].Percentage / 100;
+ if (ScreenSingModi.PlayerInfo.NumPlayers >= 3) then
+ Static[StaticTeam3].Texture.ScaleW := Progress * ScreenSingModi.PlayerInfo.Playerinfo[2].Percentage / 100;
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenPartyWin.pas b/Game/Code/Screens/UScreenPartyWin.pas
new file mode 100644
index 00000000..e40a48d8
--- /dev/null
+++ b/Game/Code/Screens/UScreenPartyWin.pas
@@ -0,0 +1,267 @@
+unit UScreenPartyWin;
+
+interface
+
+uses
+ UMenu, SDL, UDisplay, UMusic, SysUtils, UThemes;
+
+type
+ TScreenPartyWin = class(TMenu)
+ const
+ ID='ID_018'; //for help system
+
+ public
+ TextScoreTeam1: Cardinal;
+ TextScoreTeam2: Cardinal;
+ TextScoreTeam3: Cardinal;
+ TextNameTeam1: Cardinal;
+ TextNameTeam2: Cardinal;
+ TextNameTeam3: Cardinal;
+ StaticTeam1: Cardinal;
+ StaticTeam1BG: Cardinal;
+ StaticTeam1Deco: Cardinal;
+ StaticTeam2: Cardinal;
+ StaticTeam2BG: Cardinal;
+ StaticTeam2Deco: Cardinal;
+ StaticTeam3: Cardinal;
+ StaticTeam3BG: Cardinal;
+ StaticTeam3Deco: Cardinal;
+ TextWinner: Cardinal;
+
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ procedure SetAnimationProgress(Progress: real); override;
+ end;
+
+implementation
+
+uses UGraphic, UMain, UParty, UScreenSingModi, ULanguage, UHelp, ULog;
+
+function TScreenPartyWin.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ Music.PlayStart;
+ FadeTo(@ScreenMain);
+ end;
+
+ SDLK_RETURN:
+ begin
+ Music.PlayStart;
+ FadeTo(@ScreenMain);
+ end;
+ end;
+ end;
+end;
+
+constructor TScreenPartyWin.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ TextScoreTeam1 := AddText (Theme.PartyWin.TextScoreTeam1);
+ TextScoreTeam2 := AddText (Theme.PartyWin.TextScoreTeam2);
+ TextScoreTeam3 := AddText (Theme.PartyWin.TextScoreTeam3);
+ TextNameTeam1 := AddText (Theme.PartyWin.TextNameTeam1);
+ TextNameTeam2 := AddText (Theme.PartyWin.TextNameTeam2);
+ TextNameTeam3 := AddText (Theme.PartyWin.TextNameTeam3);
+
+ StaticTeam1 := AddStatic (Theme.PartyWin.StaticTeam1);
+ StaticTeam1BG := AddStatic (Theme.PartyWin.StaticTeam1BG);
+ StaticTeam1Deco := AddStatic (Theme.PartyWin.StaticTeam1Deco);
+ StaticTeam2 := AddStatic (Theme.PartyWin.StaticTeam2);
+ StaticTeam2BG := AddStatic (Theme.PartyWin.StaticTeam2BG);
+ StaticTeam2Deco := AddStatic (Theme.PartyWin.StaticTeam2Deco);
+ StaticTeam3 := AddStatic (Theme.PartyWin.StaticTeam3);
+ StaticTeam3BG := AddStatic (Theme.PartyWin.StaticTeam3BG);
+ StaticTeam3Deco := AddStatic (Theme.PartyWin.StaticTeam3Deco);
+
+ TextWinner := AddText (Theme.PartyWin.TextWinner);
+
+ LoadFromTheme(Theme.PartyWin);
+end;
+
+procedure TScreenPartyWin.onShow;
+var
+ I: Integer;
+ Placing: TeamOrderArray;
+ Function GetTeamColor(Team: Byte): Cardinal;
+ var
+ NameString: String;
+ begin
+ NameString := 'P' + InttoStr(Team+1) + 'Dark';
+
+ Result := ColorExists(NameString);
+ end;
+begin
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenParyWin)');
+
+ //Get Team Placing
+ Placing := PartySession.GetTeamOrder;
+
+ //Set Winnertext
+ Text[TextWinner].Text := Format(Language.Translate('PARTY_SCORE_WINS'), [PartySession.Teams.Teaminfo[Placing[0]].Name]);
+
+ if (PartySession.Teams.NumTeams >= 1) then
+ begin
+ Text[TextScoreTeam1].Text := InttoStr(PartySession.Teams.TeamInfo[Placing[0]].Score);
+ Text[TextNameTeam1].Text := String(PartySession.Teams.TeamInfo[Placing[0]].Name);
+
+ Text[TextScoreTeam1].Visible := True;
+ Text[TextNameTeam1].Visible := True;
+ Static[StaticTeam1].Visible := True;
+ Static[StaticTeam1BG].Visible := True;
+ Static[StaticTeam1Deco].Visible := True;
+
+ //Set Static Color to Team Color
+ If (Theme.PartyWin.StaticTeam1BG.Color = 'TeamColor') then
+ begin
+ I := GetTeamColor(Placing[0]);
+ if (I <> -1) then
+ begin
+ Static[StaticTeam1BG].Texture.ColR := Color[I].RGB.R;
+ Static[StaticTeam1BG].Texture.ColG := Color[I].RGB.G;
+ Static[StaticTeam1BG].Texture.ColB := Color[I].RGB.B;
+ end;
+ end;
+
+ If (Theme.PartyWin.StaticTeam1.Color = 'TeamColor') then
+ begin
+ I := GetTeamColor(Placing[0]);
+ if (I <> -1) then
+ begin
+ Static[StaticTeam1].Texture.ColR := Color[I].RGB.R;
+ Static[StaticTeam1].Texture.ColG := Color[I].RGB.G;
+ Static[StaticTeam1].Texture.ColB := Color[I].RGB.B;
+ end;
+ end;
+ end
+ else
+ begin
+ Text[TextScoreTeam1].Visible := False;
+ Text[TextNameTeam1].Visible := False;
+ Static[StaticTeam1].Visible := False;
+ Static[StaticTeam1BG].Visible := False;
+ Static[StaticTeam1Deco].Visible := False;
+ end;
+
+ if (PartySession.Teams.NumTeams >= 2) then
+ begin
+ Text[TextScoreTeam2].Text := InttoStr(PartySession.Teams.TeamInfo[Placing[1]].Score);
+ Text[TextNameTeam2].Text := String(PartySession.Teams.TeamInfo[Placing[1]].Name);
+
+ Text[TextScoreTeam2].Visible := True;
+ Text[TextNameTeam2].Visible := True;
+ Static[StaticTeam2].Visible := True;
+ Static[StaticTeam2BG].Visible := True;
+ Static[StaticTeam2Deco].Visible := True;
+
+ //Set Static Color to Team Color
+ If (Theme.PartyWin.StaticTeam2BG.Color = 'TeamColor') then
+ begin
+ I := GetTeamColor(Placing[1]);
+ if (I <> -1) then
+ begin
+ Static[StaticTeam2BG].Texture.ColR := Color[I].RGB.R;
+ Static[StaticTeam2BG].Texture.ColG := Color[I].RGB.G;
+ Static[StaticTeam2BG].Texture.ColB := Color[I].RGB.B;
+ end;
+ end;
+
+ If (Theme.PartyWin.StaticTeam2.Color = 'TeamColor') then
+ begin
+ I := GetTeamColor(Placing[1]);
+ if (I <> -1) then
+ begin
+ Static[StaticTeam2].Texture.ColR := Color[I].RGB.R;
+ Static[StaticTeam2].Texture.ColG := Color[I].RGB.G;
+ Static[StaticTeam2].Texture.ColB := Color[I].RGB.B;
+ end;
+ end;
+ end
+ else
+ begin
+ Text[TextScoreTeam2].Visible := False;
+ Text[TextNameTeam2].Visible := False;
+ Static[StaticTeam2].Visible := False;
+ Static[StaticTeam2BG].Visible := False;
+ Static[StaticTeam2Deco].Visible := False;
+ end;
+
+ if (PartySession.Teams.NumTeams >= 3) then
+ begin
+ Text[TextScoreTeam3].Text := InttoStr(PartySession.Teams.TeamInfo[Placing[2]].Score);
+ Text[TextNameTeam3].Text := String(PartySession.Teams.TeamInfo[Placing[2]].Name);
+
+ Text[TextScoreTeam3].Visible := True;
+ Text[TextNameTeam3].Visible := True;
+ Static[StaticTeam3].Visible := True;
+ Static[StaticTeam3BG].Visible := True;
+ Static[StaticTeam3Deco].Visible := True;
+
+ //Set Static Color to Team Color
+ If (Theme.PartyWin.StaticTeam3BG.Color = 'TeamColor') then
+ begin
+ I := GetTeamColor(Placing[2]);
+ if (I <> -1) then
+ begin
+ Static[StaticTeam3BG].Texture.ColR := Color[I].RGB.R;
+ Static[StaticTeam3BG].Texture.ColG := Color[I].RGB.G;
+ Static[StaticTeam3BG].Texture.ColB := Color[I].RGB.B;
+ end;
+ end;
+
+ If (Theme.PartyWin.StaticTeam3.Color = 'TeamColor') then
+ begin
+ I := GetTeamColor(Placing[2]);
+ if (I <> -1) then
+ begin
+ Static[StaticTeam3].Texture.ColR := Color[I].RGB.R;
+ Static[StaticTeam3].Texture.ColG := Color[I].RGB.G;
+ Static[StaticTeam3].Texture.ColB := Color[I].RGB.B;
+ end;
+ end;
+ end
+ else
+ begin
+ Text[TextScoreTeam3].Visible := False;
+ Text[TextNameTeam3].Visible := False;
+ Static[StaticTeam3].Visible := False;
+ Static[StaticTeam3BG].Visible := False;
+ Static[StaticTeam3Deco].Visible := False;
+ end;
+
+
+// LCD.WriteText(1, ' Choose mode: ');
+// UpdateLCD;
+end;
+
+procedure TScreenPartyWin.SetAnimationProgress(Progress: real);
+begin
+ {if (ScreenSingModi.PlayerInfo.NumPlayers >= 1) then
+ Static[StaticTeam1].Texture.ScaleW := Progress * ScreenSingModi.PlayerInfo.Playerinfo[0].Score / maxScore;
+ if (ScreenSingModi.PlayerInfo.NumPlayers >= 2) then
+ Static[StaticTeam2].Texture.ScaleW := Progress * ScreenSingModi.PlayerInfo.Playerinfo[1].Score / maxScore;
+ if (ScreenSingModi.PlayerInfo.NumPlayers >= 3) then
+ Static[StaticTeam3].Texture.ScaleW := Progress * ScreenSingModi.PlayerInfo.Playerinfo[2].Score / maxScore;}
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenPopup.pas b/Game/Code/Screens/UScreenPopup.pas
new file mode 100644
index 00000000..5a8bacc7
--- /dev/null
+++ b/Game/Code/Screens/UScreenPopup.pas
@@ -0,0 +1,862 @@
+unit UScreenPopup;
+
+interface
+
+uses
+ UMenu, SDL, UMusic, math, UFiles, SysUtils, UThemes, UHelp, gl, glu;
+
+type
+ TScreenPopupCheck = class(TMenu)
+ public
+ Visible: Boolean; //Whether the Menu should be Drawn
+
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ procedure ShowPopup(msg: String);
+ function Draw: boolean; override;
+ end;
+
+ TScreenPopupError = class(TMenu)
+ private
+ CurMenu: Byte; //Num of the cur. Shown Menu
+ public
+ Visible: Boolean; //Whether the Menu should be Drawn
+
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ procedure onHide; override;
+ procedure ShowPopup(msg: String);
+ function Draw: boolean; override;
+ end;
+
+ TRect = record
+ left, right, top, bottom: integer;
+ end;
+
+ TLine = record
+ fX, fY, tX, tY: integer;
+ end;
+
+ TText = record
+ X, Y: integer;
+ Style: integer;
+ Size: real;
+ Italic: boolean;
+ text: string;
+ end;
+
+ TResLine = record
+ Y: integer;
+ H: integer;
+ lines: array of TLine;
+ texts: array of TText;
+ end;
+
+ TScreenPopupHelp = class(TMenu)
+ private
+ CurMenu: Byte; //Num of the cur. Shown Menu
+
+ TextsGFX: array of TResLine;
+ msg: TTextResult;
+ Rect: TRect;
+
+ max_high: real;
+ step: double;
+ barH: double;
+
+ procedure DrawTable;
+ procedure DrawLine(line, index, Y: integer);
+ procedure DrawText(line, index, Y: integer);
+ procedure DrawScroll(X, Y, W, H: integer; pos, len: double);
+ public
+ Visible: Boolean; //Whether the Menu should be Drawn
+
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ procedure onHide; override;
+ procedure ShowPopup();
+ function Draw: boolean; override;
+ end;
+var
+// ISelections: Array of String;
+ SelectValue: Integer;
+
+
+implementation
+
+uses Classes, TextGL, UGraphic, UMain, UIni, UTexture, ULanguage, UParty, UPlaylist, UDisplay;
+
+function TScreenPopupCheck.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+
+ case PressedKey of
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ Display.CheckOK:=False;
+ Display.NextScreenWithCheck:=NIL;
+ Visible:=False;
+ Result := false;
+ end;
+
+ SDLK_RETURN:
+ begin
+ case Interaction of
+ 0: begin
+ //Hack to Finish Singscreen correct on Exit with Q Shortcut
+ if (Display.NextScreenWithCheck = NIL) then
+ begin
+ if (Display.ActualScreen = @ScreenSing) then
+ ScreenSing.Finish
+ else if (Display.ActualScreen = @ScreenSingModi) then
+ ScreenSingModi.Finish;
+ end;
+
+ Display.CheckOK:=True;
+ end;
+ 1: begin
+ Display.CheckOK:=False;
+ Display.NextScreenWithCheck:=NIL;
+ end;
+ end;
+ Visible:=False;
+ Result := false;
+ end;
+
+ SDLK_DOWN: InteractNext;
+ SDLK_UP: InteractPrev;
+
+ SDLK_RIGHT: InteractNext;
+ SDLK_LEFT: InteractPrev;
+ end;
+ end;
+end;
+
+constructor TScreenPopupCheck.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ AddBackground(Theme.CheckPopup.Background.Tex);
+
+ AddButton(Theme.CheckPopup.Button1);
+ if (Length(Button[0].Text) = 0) then
+ AddButtonText(14, 20, 'Button 1');
+
+ AddButton(Theme.CheckPopup.Button2);
+ if (Length(Button[1].Text) = 0) then
+ AddButtonText(14, 20, 'Button 2');
+
+ AddText(Theme.CheckPopup.TextCheck);
+
+ for I := 0 to High(Theme.CheckPopup.Static) do
+ AddStatic(Theme.CheckPopup.Static[I]);
+
+ for I := 0 to High(Theme.CheckPopup.Text) do
+ AddText(Theme.CheckPopup.Text[I]);
+
+ Interaction := 0;
+end;
+
+function TScreenPopupCheck.Draw: boolean;
+begin
+ inherited Draw;
+end;
+
+procedure TScreenPopupCheck.onShow;
+begin
+
+end;
+
+procedure TScreenPopupCheck.ShowPopup(msg: String);
+begin
+ Interaction := 0; //Reset Interaction
+ Visible := True; //Set Visible
+
+ Text[0].Text := Language.Translate(msg);
+
+ Button[0].Visible := True;
+ Button[1].Visible := True;
+
+ Button[0].Text[0].Text := Language.Translate('SONG_MENU_YES');
+ Button[1].Text[0].Text := Language.Translate('SONG_MENU_NO');
+end;
+
+// error popup
+
+function TScreenPopupError.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+
+ case PressedKey of
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ Visible:=False;
+ Result := false;
+ end;
+
+ SDLK_RETURN:
+ begin
+ Visible:=False;
+ Result := false;
+ end;
+
+ SDLK_DOWN: InteractNext;
+ SDLK_UP: InteractPrev;
+
+ SDLK_RIGHT: InteractNext;
+ SDLK_LEFT: InteractPrev;
+ end;
+ end;
+end;
+
+constructor TScreenPopupError.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ AddBackground(Theme.CheckPopup.Background.Tex);
+
+ AddButton(Theme.ErrorPopup.Button1);
+ if (Length(Button[0].Text) = 0) then
+ AddButtonText(14, 20, 'Button 1');
+
+ AddText(Theme.ErrorPopup.TextError);
+
+ for I := 0 to High(Theme.ErrorPopup.Static) do
+ AddStatic(Theme.ErrorPopup.Static[I]);
+
+ for I := 0 to High(Theme.ErrorPopup.Text) do
+ AddText(Theme.ErrorPopup.Text[I]);
+
+ Interaction := 0;
+end;
+
+function TScreenPopupError.Draw: boolean;
+begin
+ inherited Draw;
+end;
+
+procedure TScreenPopupError.onShow;
+begin
+
+end;
+
+procedure TScreenPopupError.onHide;
+var i: integer;
+begin
+end;
+
+procedure TScreenPopupError.ShowPopup(msg: String);
+var i: integer;
+begin
+ Interaction := 0; //Reset Interaction
+ Visible := True; //Set Visible
+
+{ //dirty hack... Text[0] is invisible for some strange reason
+ for i:=1 to high(Text) do
+ if i-1 <= high(msg) then
+ begin
+ Text[i].Visible:=True;
+ Text[i].Text := msg[i-1];
+ end
+ else
+ begin
+ Text[i].Visible:=False;
+ end;}
+ Text[0].Text:=msg;
+
+ Button[0].Visible := True;
+
+ Button[0].Text[0].Text := 'OK';
+end;
+
+// Help popup
+
+function TScreenPopupHelp.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+var
+ pos: double;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ pos := Help.GetScrollPos();
+ case PressedKey of
+ SDLK_TAB,
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ Visible:=False;
+ Result := false;
+ end;
+
+ SDLK_RETURN:
+ begin
+ Visible:=False;
+ Result := false;
+ end;
+
+ SDLK_DOWN:
+ begin
+ InteractNext;
+ if pos<(1-step) then
+ Help.SetScrollPos(pos+step)
+ else if pos>0 then
+ Help.SetScrollPos(1);
+ end;
+ SDLK_UP:
+ begin
+ InteractPrev;
+ if pos>step then
+ Help.SetScrollPos(pos-step)
+ else if pos>0 then
+ Help.SetScrollPos(0);
+ end;
+
+ SDLK_RIGHT: InteractNext;
+ SDLK_LEFT: InteractPrev;
+ end;
+ end;
+end;
+
+constructor TScreenPopupHelp.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ AddButton(Theme.HelpPopup.Button1);
+ if (Length(Button[0].Text) = 0) then
+ AddButtonText(14, 20, 'Button 1');
+ Button[0].Visible := false;
+ Interaction := 0;
+end;
+
+function TScreenPopupHelp.Draw: boolean;
+var
+ msg: TTextResult;
+ I: integer;
+ abs: real;
+begin
+ inherited Draw;
+ if step<1 then
+ abs := 20
+ else
+ abs := 5;
+
+ //Background:
+ glEnable(GL_BLEND);
+ glbegin(gl_quads);
+ glColor4f(0.2, 0.2, 0.2, 0.8); glVertex2f(Rect.left-5, Rect.top-5);
+ glColor4f(0.2, 0.2, 0.2, 0.8); glVertex2f(Rect.right+abs, Rect.top-5);
+ glColor4f(0.2, 0.2, 0.2, 0.8); glVertex2f(Rect.right+abs, Rect.bottom+5);
+ glColor4f(0.2, 0.2, 0.2, 0.8); glVertex2f(Rect.left-5, Rect.bottom+5);
+ glEnd;
+ glDisable(GL_BLEND);
+ //glScissor(Rect.left-1, ScreenH-Rect.bottom-1, Rect.right-Rect.left+2, Rect.bottom-Rect.top+2);
+ glScissor(round((Rect.left-1)*(ScreenW/Screens)/RenderW+(ScreenW/Screens)*(ScreenAct-1)),
+ round((RenderH-Rect.bottom-1)*ScreenH/RenderH),
+ round((Rect.right-Rect.left+2)*(ScreenW/Screens)/RenderW),
+ round((Rect.bottom-Rect.top+2)*ScreenH/RenderH));
+ glEnable(GL_SCISSOR_TEST);
+ DrawTable();
+ glDisable(GL_SCISSOR_TEST);
+ if step<1 then
+ DrawScroll(Rect.right+5, Rect.top, 10, Rect.bottom-Rect.top, Help.GetScrollPos(), barH);
+end;
+
+procedure TScreenPopupHelp.onShow;
+begin
+
+end;
+
+procedure TScreenPopupHelp.onHide;
+var i: integer;
+begin
+end;
+
+procedure TScreenPopupHelp.ShowPopup();
+var
+ I, J, K: integer;
+ line: integer;
+ SL: TStringList;
+ tempStr: String;
+ KeyEnd: integer;
+ Style: integer;
+ Size: real;
+ Italic: boolean;
+ fieldh: integer;
+ tline: integer;
+ countline:integer;
+
+ procedure AddLine(l, i, fX, fY, tX, tY: integer);
+ begin
+ TextsGFX[l].lines[i].fX := fX;
+ TextsGFX[l].lines[i].fY := fY;
+ TextsGFX[l].lines[i].tX := tX;
+ TextsGFX[l].lines[i].tY := tY;
+ end;
+
+ procedure NewLine(h, lines: integer);
+ begin
+ inc(line);
+ tline := -1;
+ SetLength(TextsGFX, line+1);
+ TextsGFX[line].H := h;
+ TextsGFX[line].Y := TextsGFX[line-1].Y + TextsGFX[line-1].H;
+ SetLength(TextsGFX[line].lines, lines);
+ end;
+
+ procedure NewText(X, Y: integer);
+ begin
+ inc(tline);
+ SetLength(TextsGFX[line].texts, tline+1);
+ TextsGFX[line].texts[tline].X := X;
+ TextsGFX[line].texts[tline].Y := Y;
+ TextsGFX[line].texts[tline].Style := Style;
+ TextsGFX[line].texts[tline].Size := Size;
+ TextsGFX[line].texts[tline].Italic := Italic;
+ end;
+
+begin
+ Interaction := 0; //Reset Interaction
+ Visible := True; //Set Visible
+
+ SetLength(TextsGFX, 0);
+ line := 0;
+ tline := -1;
+
+ Style := 1;
+ Size := 7;
+ Italic := false;
+
+ SetFontStyle(Style);
+ SetFontSize(Size);
+ SetFontItalic(Italic);
+
+
+ Rect.left := 25;
+ Rect.right := 770;
+ Rect.top := 25;
+ Rect.bottom := 575;
+
+ KeyEnd := round((Rect.right - Rect.left)*0.4);
+ fieldh := 22;
+
+ msg := Help.GetHelpStr();
+
+ //Title
+ SetLength(TextsGFX, 1);
+ TextsGFX[line].H := round(fieldh/4);
+ TextsGFX[line].Y := Rect.top;
+ SetLength(TextsGFX[line].lines, 3);
+
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y);
+ AddLine(line, 1, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 2, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+
+ NewLine(fieldh*2, 2);
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 1, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+
+ NewText(Rect.left + 5, TextsGFX[line].Y + 2);
+ TextsGFX[line].texts[tline].Size:=12;
+ TextsGFX[line].texts[tline].text := Language.Translate('MSG_HELP_TITLE') + ': ' + msg.Title;
+
+ NewLine(round(fieldh/4), 3);
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y);
+ AddLine(line, 1, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 2, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+
+ //Description
+ Style := 1;
+ SetFontStyle(Style);
+ SL:=TStringList.Create;
+ try
+ ExtractStrings([' '], [], PChar(msg.Description), SL);
+ if SL.Count>0 then
+ begin
+ NewLine(round(fieldh/4), 3);
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y);
+ AddLine(line, 1, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 2, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+
+ NewLine(fieldh, 2);
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 1, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+
+ NewText(Rect.left + 5, TextsGFX[line].Y + 2);
+ end;
+ tempStr := '';
+ for I := 0 to SL.Count-1 do
+ begin
+ if glTextWidth(PChar(tempStr + SL[I] + ' ')) <= (Rect.right - Rect.left - 10) then
+ begin
+ if I<SL.Count-1 then
+ tempStr := tempStr + SL[I] + ' '
+ else
+ tempStr := tempStr + SL[I];
+ TextsGFX[line].texts[tline].text := tempStr;
+ end else
+ begin
+ TextsGFX[line].texts[tline].text := tempStr;
+ NewLine(fieldh, 2);
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 1, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+
+ NewText(Rect.left + 5, TextsGFX[line].Y + 2);
+
+ if I<SL.Count-1 then
+ tempStr := SL[I] + ' '
+ else
+ tempStr := SL[I];
+ TextsGFX[line].texts[tline].text := tempStr;
+ end;
+ end;
+ Finally
+ SL.Free;
+ if Length(msg.Subs)<1 then
+ begin
+ NewLine(round(fieldh/4), 3);
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y + TextsGFX[line].H , Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 1, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 2, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+ end else
+ begin
+ NewLine(round(fieldh/4), 2);
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 1, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+ end;
+ end;
+
+ //Subs
+ for K := 0 to Length(msg.Subs) - 1 do
+ begin
+ //Sub title
+ Style := 1;
+ SetFontStyle(Style);
+ Size := 7;
+ SetFontSize(Size);
+
+ tempStr := '';
+ NewLine(round(fieldh/2), 2);
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 1, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+
+ NewLine(round(fieldh), 2);
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 1, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+
+ NewText(Rect.left+5, TextsGFX[line].Y + 2);
+ TextsGFX[line].texts[tline].text := msg.Subs[K].title+':';
+
+ //text
+ Style := 1;
+ SetFontStyle(Style);
+ Size := 7;
+ SetFontSize(Size);
+
+
+ for J := 0 to length(msg.Subs[K].text) - 1 do
+ begin
+ NewLine(fieldh, 2);
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 1, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+
+ SL:=TStringList.Create;
+ try
+ ExtractStrings([' '], [], PChar(msg.Subs[K].text[J]), SL);
+
+ NewText(Rect.left + 5, TextsGFX[line].Y + 2);
+ tempStr := '';
+ for I := 0 to SL.Count-1 do
+ begin
+ if glTextWidth(PChar(tempStr + SL[I] + ' ')) <= (Rect.right - Rect.left - 10) then
+ begin
+ if I<SL.Count-1 then
+ tempStr := tempStr + SL[I] + ' '
+ else
+ tempStr := tempStr + SL[I];
+ TextsGFX[line].texts[tline].text := tempStr;
+ end else
+ begin
+ TextsGFX[line].texts[tline].text := tempStr;
+
+ NewLine(fieldh, 2);
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 1, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+
+ NewText(Rect.left + 5, TextsGFX[line].Y + 2);
+
+ if I<SL.Count-1 then
+ tempStr := SL[I] + ' '
+ else
+ tempStr := SL[I];
+ TextsGFX[line].texts[tline].text := tempStr;
+ end;
+ end;
+ Finally
+ SL.Free;
+ end;
+ end;
+
+ if K<Length(msg.Subs) - 1 then
+ begin
+ NewLine(round(fieldh/4), 2);
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 1, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+ end else
+ begin
+ NewLine(round(fieldh/2), 3);
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y + TextsGFX[line].H , Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 1, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 2, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+ end;
+ end;
+
+ //Sections
+ for K := 0 to Length(msg.Sections) - 1 do
+ begin
+ //Section title
+ Style := 1;
+ SetFontStyle(Style);
+ Size := 9;
+ SetFontSize(Size);
+
+ tempStr := '';
+ NewLine(round(fieldh/2), 2);
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 1, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+
+ NewLine(round(fieldh*1.4), 2);
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 1, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+
+ tempStr := msg.Sections[K].name;
+ NewText(Rect.left + round((Rect.right - Rect.left - 10)/2 - glTextWidth((PChar(tempStr)))/2), TextsGFX[line].Y + 2);
+ TextsGFX[line].texts[tline].text := tempStr;
+
+ NewLine(round(fieldh/2), 3);
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y + TextsGFX[line].H , Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 1, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 2, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+
+ Style := 1;
+ SetFontStyle(Style);
+ Size := 7;
+ SetFontSize(Size);
+ //keys
+ for J := 0 to Length(msg.Sections[K].Keys) - 1 do
+ begin
+ NewLine(fieldh, 3);
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 1, KeyEnd, TextsGFX[line].Y, KeyEnd, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 2, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+
+ countline := 1;
+ NewText(Rect.left + 5, TextsGFX[line].Y + 2);
+ tempStr := '';
+ for I := 0 to Length(msg.Sections[K].Keys[J].Key) - 1 do
+ begin
+ if glTextWidth(PChar(tempStr + msg.Sections[K].Keys[J].Key[I] + '+')) <= (KeyEnd - Rect.left - 10) then
+ begin
+ if I<Length(msg.Sections[K].Keys[J].Key)-1 then
+ tempStr := tempStr + msg.Sections[K].Keys[J].Key[I] + '+'
+ else
+ tempStr := tempStr + msg.Sections[K].Keys[J].Key[I];
+ TextsGFX[line].texts[tline].text := tempStr;
+ end else
+ begin
+ TextsGFX[line].texts[tline].text := tempStr;
+ NewLine(fieldh, 3);
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 1, KeyEnd, TextsGFX[line].Y, KeyEnd, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 2, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+
+ NewText(Rect.left + 5, TextsGFX[line].Y + 2);
+
+ if I<Length(msg.Sections[K].Keys[J].Key)-1 then
+ tempStr := msg.Sections[K].Keys[J].Key[I] + '+'
+ else
+ tempStr := msg.Sections[K].Keys[J].Key[I];
+ TextsGFX[line].texts[tline].text := tempStr;
+ inc(countline);
+ end;
+ end;
+
+ //key-description
+ SL:=TStringList.Create;
+ try
+ ExtractStrings([' '], [], PChar(msg.Sections[K].KeyDescription[J]), SL);
+ line := line - countline + 1;
+ tline := Length(TextsGFX[line].texts) -1;
+
+ NewText(KeyEnd + 5, TextsGFX[line].Y + 2);
+ tempStr := '';
+ for I := 0 to SL.Count-1 do
+ begin
+ if glTextWidth(PChar(tempStr + SL[I] + ' ')) <= (Rect.right - KeyEnd - 10) then
+ begin
+ if I<SL.Count-1 then
+ tempStr := tempStr + SL[I] + ' '
+ else
+ tempStr := tempStr + SL[I];
+ TextsGFX[line].texts[tline].text := tempStr;
+ end else
+ begin
+ TextsGFX[line].texts[tline].text := tempStr;
+ if countline<2 then
+ begin
+ NewLine(fieldh, 3);
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 1, KeyEnd, TextsGFX[line].Y, KeyEnd, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 2, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+ end else
+ begin
+ dec(countline);
+ inc(line);
+ tline := Length(TextsGFX[line].texts) -1;
+ end;
+
+ NewText(KeyEnd + 5, TextsGFX[line].Y + 2);
+
+ if I<SL.Count-1 then
+ tempStr := SL[I] + ' '
+ else
+ tempStr := SL[I];
+ TextsGFX[line].texts[tline].text := tempStr;
+ end;
+ end;
+ Finally
+ SL.Free;
+ line := line + countline -1;
+ NewLine(round(fieldh/4), 4);
+ AddLine(line, 0, Rect.left, TextsGFX[line].Y, Rect.left, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 1, KeyEnd, TextsGFX[line].Y, KeyEnd, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 2, Rect.right, TextsGFX[line].Y, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+ AddLine(line, 3, Rect.left, TextsGFX[line].Y+TextsGFX[line].H, Rect.right, TextsGFX[line].Y + TextsGFX[line].H);
+ end;
+ end;
+ end;
+
+ max_high := (TextsGFX[Length(TextsGFX)-1].Y + TextsGFX[Length(TextsGFX)-1].H);
+
+ if max_high=0 then
+ max_high:=1.0; //TODO error.log!
+ if max_high<=Rect.bottom-Rect.top then
+ begin
+ barH := 1;
+ step := 1;
+ end
+ else
+ begin
+ barH := (Rect.bottom-Rect.top)/max_high;
+ step := barH/(1/barH);
+ end;
+end;
+
+procedure TScreenPopupHelp.DrawTable();
+var
+ I, J:integer;
+ maxh: integer;
+ h, offset: integer;
+begin
+
+ maxh := ScreenH+ScreenH-Rect.Bottom;
+ h := 0;
+
+ offset := round(Help.GetScrollPos()*(max_high-ScreenH+ScreenH-Rect.Bottom));
+
+ I := 0;
+ while (I<Length(TextsGFX)) and (h<maxh) do
+ begin
+ if (TextsGFX[I].Y >= offset-20) then
+ begin
+ for J := 0 to Length(TextsGFX[I].lines) - 1 do
+ DrawLine(I, J, offset);
+ for J := 0 to Length(TextsGFX[I].texts) - 1 do
+ DrawText(I, J, offset);
+
+ h := h + TextsGFX[I].H;
+ end;
+ inc(I);
+ end;
+end;
+
+procedure TScreenPopupHelp.DrawLine(line, index, Y: integer);
+begin
+ //glEnable(GL_BLEND);
+ glColor4f(1, 1, 1, 1);
+ glLineWidth(2);
+ glBegin(GL_LINES);
+ glVertex2f(TextsGFX[line].lines[index].fX, TextsGFX[line].lines[index].fY - Y);
+ glVertex2f(TextsGFX[line].lines[index].tX, TextsGFX[line].lines[index].tY - Y);
+ glEnd;
+ //glDisable(GL_BLEND);
+end;
+
+procedure TScreenPopupHelp.DrawText(line, index, Y: integer);
+var
+ text: PChar;
+
+begin
+ glColor4f(1, 1, 1, 1);
+ SetFontStyle(TextsGFX[line].texts[index].Style);
+ SetFontItalic(TextsGFX[line].texts[index].Italic);
+ SetFontSize(TextsGFX[line].texts[index].Size);
+ SetFontPos (TextsGFX[line].texts[index].X, TextsGFX[line].texts[index].Y - Y);
+ text := Addr(TextsGFX[line].texts[index].text[1]);
+ glPrint(text);
+end;
+
+procedure TScreenPopupHelp.DrawScroll(X, Y, W, H: integer; pos, len: double);
+var
+ fY, tY: double;
+begin
+ //glEnable(GL_BLEND);
+ glColor4f(1, 1, 1, 1);
+
+ glLineWidth(1);
+ glBegin(GL_LINE_LOOP);
+ glVertex2f(X, Y);
+ glVertex2f(X+W, Y);
+ glVertex2f(X+W, Y+H);
+ glVertex2f(X, Y+H);
+ glEnd;
+
+ fY := Y+(H-H*len)*Pos;
+ tY := fY+H*len;
+ if tY+0.001>=Y+H then
+ tY := Y+H;
+
+ glBegin(GL_QUADS);
+ glVertex2f(X, fY);
+ glVertex2f(X+W, fY);
+ glVertex2f(X+W, tY);
+ glVertex2f(X, tY);
+ glEnd;
+ //glDisable(GL_BLEND);
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenScore.pas b/Game/Code/Screens/UScreenScore.pas
new file mode 100644
index 00000000..fca4a84a
--- /dev/null
+++ b/Game/Code/Screens/UScreenScore.pas
@@ -0,0 +1,544 @@
+unit UScreenScore;
+
+interface
+
+uses
+ UMenu, SDL, SysUtils, UDisplay, UMusic, USongs, UThemes, ULCD, gl;
+
+type
+ TScreenScore = class(TMenu)
+ const
+ ID='ID_022'; //for help system
+
+ public
+ TextArtist: integer;
+ TextTitle: integer;
+
+ TextArtistTitle: integer;
+
+ StaticMedleyNav: integer;
+ TextMedleyNav: integer;
+
+ TextName: array[1..6] of integer;
+ TextScore: array[1..6] of integer;
+
+ TextNotes: array[1..6] of integer;
+ TextNotesScore: array[1..6] of integer;
+ TextLineBonus: array[1..6] of integer;
+ TextLineBonusScore: array[1..6] of integer;
+ TextGoldenNotes: array[1..6] of integer;
+ TextGoldenNotesScore: array[1..6] of integer;
+ TextTotal: array[1..6] of integer;
+ TextTotalScore: array[1..6] of integer;
+
+ PlayerStatic: array[1..6] of array of integer;
+ PlayerTexts : array[1..6] of array of integer;
+
+
+ StaticBoxLightest: array[1..6] of integer;
+ StaticBoxLight: array[1..6] of integer;
+ StaticBoxDark: array[1..6] of integer;
+
+ StaticBackLevel: array[1..6] of integer;
+ StaticBackLevelRound: array[1..6] of integer;
+ StaticLevel: array[1..6] of integer;
+ StaticLevelRound: array[1..6] of integer;
+
+ Animation: real;
+ Fadeout: boolean;
+ ActualRound: integer;
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ function Draw: boolean; override;
+ procedure FillPlayer(Item, P: integer);
+ procedure RefreshTexts;
+ procedure StartPreview;
+ end;
+
+implementation
+
+{{$IFDEF TRANSLATE}
+uses UGraphic, UScreenSong, UPartyM2, UMenuStatic, UTime, UMain, UIni, ULanguage, UHelp, ULog;
+{{$ELSE}{
+uses UGraphic, UScreenSong, UMenuStatic, UTime, UMain, UIni;
+{{$ENDIF}
+function TScreenScore.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then begin
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE,
+ SDLK_RETURN:
+ begin
+ if (not Fadeout) then
+ begin
+// Music.StopShuffle;
+ if ScreenSong.PartyMedley and (ScreenSong.Mode=smChallenge) then
+ begin
+ ScreenSong.SongIndex := -1;
+ Music.FadeStop(Ini.PreviewFading);
+ FadeTo(@ScreenPartyNewRoundM2);
+ end else if (ScreenSong.Mode <> smMedley) then
+ FadeTo(@ScreenTop)
+ else
+ begin
+ FadeTo(@ScreenSong);
+ end;
+ Fadeout := true;
+ end;
+ end;
+
+ SDLK_SYSREQ:
+ begin
+ Display.PrintScreen;
+ end;
+
+ SDLK_RIGHT:
+ begin
+ if ActualRound<Length(PlaylistMedley.Stats)-1 then
+ begin
+ Music.PlayChange;
+ inc(ActualRound);
+ RefreshTexts;
+ StartPreview;
+ end;
+ end;
+
+ SDLK_LEFT:
+ begin
+ if ActualRound>0 then
+ begin
+ Music.PlayChange;
+ dec(ActualRound);
+ RefreshTexts;
+ StartPreview;
+ end;
+ end;
+ end;
+ end;
+end;
+
+procedure TScreenScore.RefreshTexts;
+begin
+ if (ActualRound < Length(PlaylistMedley.Stats)-1) then
+ begin
+ Text[TextArtist].Text := IntToStr(ActualRound+1) + '/' +
+ IntToStr(Length(PlaylistMedley.Stats)-1) + ': ' +
+ PlaylistMedley.Stats[ActualRound].SongArtist;
+ Text[TextTitle].Text := PlaylistMedley.Stats[ActualRound].SongTitle;
+ Text[TextTitle].Visible := true;
+ Text[TextArtistTitle].Text := IntToStr(ActualRound+1) + '/' +
+ IntToStr(Length(PlaylistMedley.Stats)-1) + ': ' +
+ PlaylistMedley.Stats[ActualRound].SongArtist +
+ ' - ' + PlaylistMedley.Stats[ActualRound].SongTitle;
+ end else
+ begin
+ if (ScreenSong.Mode = smMedley) or ScreenSong.PartyMedley then
+ begin
+ Text[TextArtist].Text := Language.Translate('SING_TOTAL');
+ Text[TextTitle].Visible := false;
+ Text[TextArtistTitle].Text := Language.Translate('SING_TOTAL');
+ end else
+ begin
+ Text[TextArtist].Text := PlaylistMedley.Stats[ActualRound].SongArtist;
+ Text[TextTitle].Text := PlaylistMedley.Stats[ActualRound].SongTitle;
+ Text[TextTitle].Visible := true;
+ Text[TextArtistTitle].Text := PlaylistMedley.Stats[ActualRound].SongArtist + ' - ' +
+ PlaylistMedley.Stats[ActualRound].SongTitle;
+ end;
+ end;
+end;
+
+constructor TScreenScore.Create;
+var
+ P: integer;
+ I, C: integer;
+begin
+ inherited Create;
+
+ LoadFromTheme(Theme.Score);
+
+ TextArtist := AddText(Theme.Score.TextArtist);
+ TextTitle := AddText(Theme.Score.TextTitle);
+
+ TextArtistTitle := AddText(Theme.Score.TextArtistTitle);
+
+ StaticMedleyNav := AddStatic(Theme.Score.StaticMedleyNav);
+ TextMedleyNav := AddText(Theme.Score.TextMedleyNav);
+
+ for P := 1 to 6 do begin
+ TextName[P] := AddText(Theme.Score.TextName[P]);
+ TextScore[P] := AddText(Theme.Score.TextScore[P]);
+
+ TextNotes[P] := AddText(Theme.Score.TextNotes[P]);
+ TextNotesScore[P] := AddText(Theme.Score.TextNotesScore[P]);
+ TextLineBonus[P] := AddText(Theme.Score.TextLineBonus[P]);
+ TextLineBonusScore[P] := AddText(Theme.Score.TextLineBonusScore[P]);
+ TextGoldenNotes[P] := AddText(Theme.Score.TextGoldenNotes[P]);
+ TextGoldenNotesScore[P] := AddText(Theme.Score.TextGoldenNotesScore[P]);
+ TextTotal[P] := AddText(Theme.Score.TextTotal[P]);
+ TextTotalScore[P] := AddText(Theme.Score.TextTotalScore[P]);
+
+ SetLength(PlayerStatic[P], Length(Theme.Score.PlayerStatic[P]));
+
+ SetLength(PlayerTexts[P], Length(Theme.Score.PlayerTexts[P]));
+
+ for I := 0 to High(Theme.Score.PlayerStatic[P]) do
+ PlayerStatic[P, I] := AddStatic(Theme.Score.PlayerStatic[P, I]);
+
+
+ //added by mog
+ for C := 0 to High(Theme.Score.PlayerTexts[P]) do
+ PlayerTexts[P, C] := AddText(Theme.Score.PlayerTexts[P, C]);
+ // more skinable now
+
+ StaticBoxLightest[P] := AddStatic(Theme.Score.StaticBoxLightest[P]);
+ StaticBoxLight[P] := AddStatic(Theme.Score.StaticBoxLight[P]);
+ StaticBoxDark[P] := AddStatic(Theme.Score.StaticBoxDark[P]);
+
+ StaticBackLevel[P] := AddStatic(Theme.Score.StaticBackLevel[P]);
+ StaticBackLevelRound[P] := AddStatic(Theme.Score.StaticBackLevelRound[P]);
+ StaticLevel[P] := AddStatic(Theme.Score.StaticLevel[P]);
+ StaticLevelRound[P] := AddStatic(Theme.Score.StaticLevelRound[P]);
+ end;
+end;
+
+procedure TScreenScore.onShow;
+var
+ P: integer; // player
+ PP: integer; // another player variable
+ S: string;
+ I: integer;
+ Skip: integer;
+ V: array[1..6] of boolean; // visibility array
+begin
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenScore)');
+
+ // Singstar
+ Fadeout := false;
+ ActualRound:=0;
+ Text[TextArtist].Text := AktSong.Artist;
+ Text[TextTitle].Text := AktSong.Title;
+ Text[TextArtistTitle].Text := AktSong.Artist + ' - ' + AktSong.Title;
+
+ // set visibility
+ case PlayersPlay of
+ 1: begin
+ V[1] := true;
+ V[2] := false;
+ V[3] := false;
+ V[4] := false;
+ V[5] := false;
+ V[6] := false;
+ end;
+ 2, 4: begin
+ V[1] := false;
+ V[2] := true;
+ V[3] := true;
+ V[4] := false;
+ V[5] := false;
+ V[6] := false;
+ end;
+ 3, 6: begin
+ V[1] := false;
+ V[2] := false;
+ V[3] := false;
+ V[4] := true;
+ V[5] := true;
+ V[6] := true;
+ end;
+ end;
+
+ for P := 1 to 6 do
+ begin
+ Text[TextName[P]].Visible := V[P];
+ Text[TextScore[P]].Visible := V[P];
+
+ Text[TextNotes[P]].Visible := V[P];
+ Text[TextNotesScore[P]].Visible := V[P];
+ Text[TextLineBonus[P]].Visible := V[P];
+ Text[TextLineBonusScore[P]].Visible := V[P];
+ Text[TextGoldenNotes[P]].Visible := V[P];
+ Text[TextGoldenNotesScore[P]].Visible := V[P];
+ Text[TextTotal[P]].Visible := V[P];
+ Text[TextTotalScore[P]].Visible := V[P];
+
+ for I := 0 to high(PlayerStatic[P]) do
+ Static[PlayerStatic[P, I]].Visible := V[P];
+
+ for I := 0 to high(PlayerTexts[P]) do
+ Text[PlayerTexts[P, I]].Visible := V[P];
+
+ Static[StaticBoxLightest[P]].Visible := V[P];
+ Static[StaticBoxLight[P]].Visible := V[P];
+ Static[StaticBoxDark[P]].Visible := V[P];
+
+ Static[StaticBackLevel[P]].Visible := V[P];
+ Static[StaticBackLevelRound[P]].Visible := V[P];
+ Static[StaticLevel[P]].Visible := V[P];
+ Static[StaticLevelRound[P]].Visible := V[P];
+ end;
+
+ {
+ if PlayersPlay <= 3 then begin // only for 1 screen mode
+ for P := 0 to PlayersPlay-1 do begin
+ case PlayersPlay of
+ 1: PP := 1;
+ 2: PP := P + 2;
+ 3: PP := P + 4;
+ end;
+
+ //Replaced this whole thing with one Procedure call
+ FillPlayer(PP, P);
+
+ end; // for
+ end; // if }
+
+ if (ScreenSong.Mode = smMedley) or ScreenSong.PartyMedley then
+ begin
+ Static[StaticMedleyNav].Visible := true;
+ Text[TextMedleyNav].Visible := true;
+ end else
+ begin
+ Static[StaticMedleyNav].Visible := false;
+ Text[TextMedleyNav].Visible := false;
+ end;
+
+ RefreshTexts;
+
+ LCD.HideCursor;
+ LCD.Clear;
+ LCD.WriteText(1, Ini.Name[0]);
+ LCD.WriteText(2, 'Score: ' + Text[TextTotalScore[1]].Text);
+
+ StartPreview;
+end;
+
+function TScreenScore.Draw: boolean;
+var
+{ Min: real;
+ Max: real;
+ Wsp: real;
+ Wsp2: real;
+ Pet: integer;}
+
+ Item: integer;
+ P: integer;
+ C: integer;
+begin
+ if PlayersPlay <= 3 then begin // only for 1 screen mode
+ for P := 0 to PlayersPlay-1 do begin
+ case PlayersPlay of
+ 1: Item := 1;
+ 2: Item := P + 2;
+ 3: Item := P + 4;
+ end;
+
+ //Replaced this whole thing with one Procedure call
+ FillPlayer(Item, P);
+
+ end; // for
+ end; // if
+
+ // 0.5.0: try also use 4 players screen with nicks
+ if PlayersPlay = 4 then begin
+ for Item := 2 to 3 do begin
+ if ScreenAct = 1 then P := Item-2;
+ if ScreenAct = 2 then P := Item;
+
+ FillPlayer(Item, P);
+ end;
+ end;
+
+
+ // Singstar - let it be...... with 6 statics
+ if PlayersPlay = 6 then begin
+ for Item := 4 to 6 do begin
+ if ScreenAct = 1 then P := Item-4;
+ if ScreenAct = 2 then P := Item-1;
+
+ FillPlayer(Item, P);
+
+ end;
+ end;
+
+ inherited Draw;
+end;
+
+procedure TScreenScore.FillPlayer(Item, P: integer);
+var
+ S: string;
+ Lev: real;
+ MaxH: real; // maximum height of score bar
+ Wsp: real;
+begin
+ Text[TextName[Item]].Text := Ini.Name[P];
+
+ Text[PlayerTexts[Item, 0]].Text := 'P' + IntToStr(P+1);
+
+ if (ScreenSong.Mode = smMedley) or ScreenSong.PartyMedley then
+ begin
+ Player[P] := PlaylistMedley.Stats[ActualRound].Player[P];
+ end;
+
+ case (Player[P].ScoreTotalI) of
+ 0..2000: Text[TextScore[Item]].Text := Language.Translate('SING_SCORE_TONE_DEAF');
+ 2010..4000: Text[TextScore[Item]].Text := Language.Translate('SING_SCORE_AMATEUR');
+ 4010..6000: Text[TextScore[Item]].Text := Language.Translate('SING_SCORE_RISING_STAR');
+ 6010..8000: Text[TextScore[Item]].Text := Language.Translate('SING_SCORE_LEAD_SINGER');
+ 8010..9000: Text[TextScore[Item]].Text := Language.Translate('SING_SCORE_HIT_ARTIST');
+ 9010..9800: Text[TextScore[Item]].Text := Language.Translate('SING_SCORE_SUPERSTAR');
+ 9810..10000: Text[TextScore[Item]].Text := Language.Translate('SING_SCORE_ULTRASTAR');
+ end;
+
+
+ S := IntToStr(Player[P].ScoreI);
+ while (Length(S)<4) do S := '0' + S;
+ Text[TextNotesScore[Item]].Text := S;
+
+ S := IntToStr(Player[P].ScoreLineI);
+ while (Length(S)<4) do S := '0' + S;
+ Text[TextLineBonusScore[Item]].Text := S;
+
+ S := IntToStr(Player[P].ScoreGoldenI);
+ while (Length(S)<4) do S := '0' + S;
+ Text[TextGoldenNotesScore[Item]].Text := S;
+
+ S := IntToStr(Player[P].ScoreTotalI);
+ while (Length(S)<5) do S := '0' + S;
+ Text[TextTotalScore[Item]].Text := S;
+
+ // Level bar length
+
+
+ Lev := Player[P].ScoreTotalI / 10000;
+ MaxH := Static[StaticBackLevel[Item]].Texture.H + Static[StaticBackLevelRound[Item]].Texture.H / 2;
+
+ // developer note (Polish):
+ // w sumie np. 120 pix
+ // ten static moze miec 100 pix
+ // wlacza sie od 20 pix i rosnie do 120 pix
+ // wiec wysokosc = wyznaczona ilosc - 20
+ // nie moze byc mniejsze od 0
+ // Lev * MaxH = total number of pixels to draw
+ Static[StaticLevel[Item]].Visible := true;
+ Static[StaticLevel[Item]].Texture.H := Lev * MaxH - Static[StaticBackLevelRound[Item]].Texture.H / 2;
+ if Static[StaticLevel[Item]].Texture.H < 0 then Static[StaticLevel[Item]].Visible := false;
+
+ // Y doesn't change and depend on the back texture coordinate
+ Static[StaticLevel[Item]].Texture.Y := Static[StaticBackLevel[Item]].Texture.Y + Static[StaticBackLevel[Item]].Texture.H - Static[StaticLevel[Item]].Texture.H;
+
+ // we modify LevelRound texture by changing it's Y. TexY1 and TexY2 change when the height to draw is lower than 20
+ if Lev * MaxH < Static[StaticBackLevelRound[Item]].Texture.H / 2 then begin
+ // when it's lower than 20 => we move TexY1 and TexY2 higher to show only part of this texture
+ Static[StaticLevelRound[Item]].Texture.Y := Static[StaticBackLevel[Item]].Texture.Y + Static[StaticBackLevel[Item]].Texture.H - Static[StaticBackLevelRound[Item]].Texture.H;
+ // - 0.25 when points = 0
+ // - 0 wnen there are more points
+ // if Lev * MaxH = Static[StaticBackLevelRound[Item]].Texture.H / 2) then we do not change it
+ // if Lev * MaxH = 0 then we substract 0.25
+ // we substract (0.25 - 0.25 * (Lev * MaxH)/Static[StaticBackLevelRound[Item]].Texture.H / 2)
+ Wsp := Lev * MaxH / (Static[StaticBackLevelRound[Item]].Texture.H / 2);
+ Static[StaticLevelRound[Item]].Texture.TexY1 := Static[StaticBackLevelRound[Item]].Texture.TexY1 - 0.25 + 0.25 * Wsp;
+ Static[StaticLevelRound[Item]].Texture.TexY2 := Static[StaticBackLevelRound[Item]].Texture.TexY2 - 0.25 + 0.25 * Wsp;
+ end else begin
+ // when it's higher or equal 20 => full texture is being shown
+ Static[StaticLevelRound[Item]].Texture.TexY1 := Static[StaticBackLevelRound[Item]].Texture.TexY1;
+ Static[StaticLevelRound[Item]].Texture.TexY2 := Static[StaticBackLevelRound[Item]].Texture.TexY2;
+ Static[StaticLevelRound[Item]].Texture.Y := Static[StaticLevel[Item]].Texture.Y - Static[StaticBackLevelRound[Item]].Texture.H;
+ end;
+
+ //Load Colors of Player Buttons and Nicks
+ LoadColor(
+ Text[TextName[Item]].ColR,
+ Text[TextName[Item]].ColG,
+ Text[TextName[Item]].ColB,
+ 'P' + IntToStr(P+1) + 'Dark');
+
+ LoadColor(
+ Static[StaticBoxLightest[Item]].Texture.ColR,
+ Static[StaticBoxLightest[Item]].Texture.ColG,
+ Static[StaticBoxLightest[Item]].Texture.ColB,
+ 'P' + IntToStr(P+1) + 'Lightest');
+
+ LoadColor(
+ Static[StaticBoxLight[Item]].Texture.ColR,
+ Static[StaticBoxLight[Item]].Texture.ColG,
+ Static[StaticBoxLight[Item]].Texture.ColB,
+ 'P' + IntToStr(P+1) + 'Light');
+
+ LoadColor(
+ Static[StaticBoxDark[Item]].Texture.ColR,
+ Static[StaticBoxDark[Item]].Texture.ColG,
+ Static[StaticBoxDark[Item]].Texture.ColB,
+ 'P' + IntToStr(P+1) + 'Dark');
+
+ {StaticBackLevel[Item]
+ StaticLevelRound[Item]
+ and another static has to be colored here to.
+ S/o please do this ^^}
+end;
+
+//Procedure Change current played Preview
+procedure TScreenSCore.StartPreview;
+var
+ select: integer;
+ changed: boolean;
+begin
+ //When Music Preview is avtivated -> then Change Music
+ if (Ini.PreviewVolume <> 0) then
+ begin
+ changed := false;
+ if (ScreenSong.Mode = smMedley) or ScreenSong.PartyMedley then
+ begin
+ if (ActualRound<Length(PlaylistMedley.Stats)-1) and (ScreenSong.SongIndex <> PlaylistMedley.Song[ActualRound]) then
+ begin
+ select := PlaylistMedley.Song[ActualRound];
+ changed := true;
+ ScreenSong.SongIndex := select;
+ end;
+ end else
+ begin
+ select := ScreenSong.Interaction;
+ ScreenSong.SongIndex := select;
+ changed := true;
+ end;
+
+ if changed then
+ begin
+ Music.Close;
+ if Music.Open(CatSongs.Song[select].Path + CatSongs.Song[select].Mp3) then
+ begin
+ if (CatSongs.Song[select].PreviewStart>0) then
+ Music.MoveTo(CatSongs.Song[select].PreviewStart)
+ else
+ Music.MoveTo(Music.Length / 4);
+
+ //If Song Fading is activated then don't Play directly, and Set Volume to Null, else Play normal
+ if (Ini.PreviewFading = 0) then
+ begin
+ Music.SetMusicVolume (Ini.PreviewVolume * 10);
+ Music.Play;
+ end else
+ begin
+ Music.Fade(0, Ini.PreviewVolume*10, Ini.PreviewFading);
+ Music.Play;
+ end;
+ end;
+ end;
+ end;
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenSing.pas b/Game/Code/Screens/UScreenSing.pas
new file mode 100644
index 00000000..034eba5f
--- /dev/null
+++ b/Game/Code/Screens/UScreenSing.pas
@@ -0,0 +1,1611 @@
+unit UScreenSing;
+
+interface
+
+uses UMenu, UMusic, SDL, SysUtils, UFiles, UTime, USongs, UIni, ULog, UTexture, ULyrics,
+ TextGL, gl, BASS, UThemes, ULCD, UGraphicClasses, UVideo;
+
+type
+ THandler = record
+ changed: boolean;
+ change_time: real;
+ end;
+
+ TScreenSing = class(TMenu)
+ const
+ ID='ID_023'; //for help system
+
+ protected
+ paused: boolean; //Pause Mod
+ PauseTime: Real;
+ NumEmptySentences: integer;
+ public
+ //TextTime: integer;
+
+ //TimeBar mod
+ StaticTimeProgress: integer;
+ TextTimeText: integer;
+ //eoa TimeBar mod
+
+ StaticP1: integer;
+ StaticP1ScoreBG: integer;
+ TextP1: integer;
+ TextP1Score: integer;
+
+ //moveable singbar mod
+ StaticP1SingBar: integer;
+ StaticP1ThreePSingBar: integer;
+ StaticP1TwoPSingBar: integer;
+ StaticP2RSingBar: integer;
+ StaticP2MSingBar: integer;
+ StaticP3SingBar: integer;
+ //eoa moveable singbar
+
+ //Added for ps3 skin
+ //shown when game is in 2/4 player modus
+ StaticP1TwoP: integer;
+ StaticP1TwoPScoreBG: integer;
+ TextP1TwoP: integer;
+ TextP1TwoPScore: integer;
+ //shown when game is in 3/6 player modus
+ StaticP1ThreeP: integer;
+ StaticP1ThreePScoreBG: integer;
+ TextP1ThreeP: integer;
+ TextP1ThreePScore: integer;
+ //eoa
+
+ StaticP2R: integer;
+ StaticP2RScoreBG: integer;
+ TextP2R: integer;
+ TextP2RScore: integer;
+
+ StaticP2M: integer;
+ StaticP2MScoreBG: integer;
+ TextP2M: integer;
+ TextP2MScore: integer;
+
+ StaticP3R: integer;
+ StaticP3RScoreBG: integer;
+ TextP3R: integer;
+ TextP3RScore: integer;
+
+ Tex_Background: TTexture;
+ FadeOut: boolean;
+ LyricMain: TLyric;
+ LyricSub: TLyric;
+
+ //VideoAspect
+ VideoAspectText: integer;
+ VideoAspectStatic: integer;
+ AspectHandler: THandler;
+
+ //for Medley
+ SongNameStatic: integer;
+ SongNameText: integer;
+ MedleyHandler: THandler;
+ CountDownText: string;
+
+ MedleyStart, MedleyEnd: real;
+ StartNote, EndNote: TPos;
+
+ constructor Create; override;
+ procedure onShow; override;
+ procedure onShowFinish; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ function Draw: boolean; override;
+ procedure Finish; virtual;
+ procedure UpdateLCD;
+ procedure Pause; //Pause Mod(Toggles Pause)
+
+ //OnSentenceEnd for LineBonus + Singbar
+ procedure onSentenceEnd(S: Cardinal);
+ //OnSentenceChange (for Golden Notes)
+ procedure onSentenceChange(S: Cardinal);
+
+ procedure LoadNextSong;
+ procedure UpdateMedleyStats(medley_end: boolean);
+ procedure DrawMedleyCountdown();
+ end;
+
+implementation
+uses UGraphic, UDataBase, UDraw, UMain, Classes, URecord, ULanguage, UHelp, math,
+ UPartyM2, UParty;
+
+// Method for input parsing. If False is returned, GetNextWindow
+// should be checked to know the next window to load;
+function TScreenSing.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_K:
+ begin
+ if Music.VocalRemoverActivated() then
+ Music.DisableVocalRemover
+ else
+ Music.EnableVocalRemover;
+ end;
+
+ SDLK_TAB:
+ begin
+ Pause;
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_A:
+ begin
+ ToggleAspectCorrection;
+ AspectHandler.changed := true;
+ AspectHandler.change_time := Czas.Teraz;
+ Static[VideoAspectStatic].Visible := true;
+ case UVideo.fAspectCorrection of
+ acoStretch: Text[VideoAspectText].Text := Language.Translate('VIDEO_ASPECT_STRETCH');
+ acoCrop: Text[VideoAspectText].Text := Language.Translate('VIDEO_ASPECT_CROP');
+ acoLetterBox: Text[VideoAspectText].Text := Language.Translate('VIDEO_ASPECT_LETTER_BOX');
+ end;
+ DataBase.SetAspect(AktSong.Artist, AktSong.Title, integer(UVideo.fAspectCorrection));
+ Text[VideoAspectText].Visible := true;
+ end;
+ SDLK_Q:
+ begin
+ //When not ask before Exit then Finish now
+ if (Ini.AskbeforeDel <> 1) then
+ Finish
+ //else just Pause and let the Popup make the Work
+ else if not paused then
+ Pause;
+
+ Result := false;
+ end;
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ //Record Sound Hack:
+ //Sound[0].BufferLong
+ if (ScreenSong.Mode=smMedley) or ScreenSong.PartyMedley then
+ PlaylistMedley.CurrentMedleySong:=PlaylistMedley.NumMedleySongs+1;
+
+ Finish;
+ Music.PlayBack;
+
+ if ScreenSong.Mode<>smParty then
+ FadeTo(@ScreenScore);
+ end;
+
+ SDLK_P://Pause Mod
+ begin
+ Pause;
+ end;
+
+ SDLK_RETURN:
+ begin
+ end;
+
+ // Up and Down could be done at the same time,
+ // but I don't want to declare variables inside
+ // functions like this one, called so many times
+ SDLK_DOWN :
+ begin
+ end;
+ SDLK_UP :
+ begin
+ end;
+ end;
+ end;
+end;
+
+//Pause Mod
+procedure TScreenSing.Pause;
+begin
+ if not paused then //Pause einschalten
+ begin
+ PauseTime := Czas.Teraz;
+ Paused := true;
+ //stop Music
+ Music.Pause;
+ if (AktSong.Video <> '') and FileExists(AktSong.Path + AktSong.Video) then //Video
+ acTogglePause; //Video
+ end
+ else //Pause ausschalten
+ begin
+ Czas.Teraz := PauseTime; //Position of Notes
+ Music.MoveTo (PauseTime);//Position of Music
+ Music.Play; //Play Music
+ if (AktSong.Video <> '') and FileExists(AktSong.Path + AktSong.Video) then //Video
+ acTogglePause;
+ Paused := false;
+ end;
+end;
+//Pause Mod End
+
+constructor TScreenSing.Create;
+var
+ I: integer;
+ P: integer;
+begin
+ inherited Create;
+
+ LoadFromTheme(Theme.Sing);
+
+ // time
+ //TextTime := AddText(75, 14, 1, 8, 0.25, 0.25, 0.25, '00:00');
+
+ //TimeBar mod
+ StaticTimeProgress := AddStatic(Theme.Sing.StaticTimeProgress);
+ TextTimeText := AddText(Theme.Sing.TextTimeText);
+ //eoa TimeBar mod
+
+ StaticP1 := AddStatic(Theme.Sing.StaticP1);
+ StaticP1ScoreBG := AddStatic(Theme.Sing.StaticP1ScoreBG);
+ TextP1 := AddText(Theme.Sing.TextP1);
+ TextP1Score := AddText(Theme.Sing.TextP1Score);
+
+ //moveable singbar mod
+ StaticP1SingBar := AddStatic(Theme.Sing.StaticP1SingBar);
+ StaticP1ThreePSingBar := AddStatic(Theme.Sing.StaticP1ThreePSingBar);
+ StaticP1TwoPSingBar := AddStatic(Theme.Sing.StaticP2RSingBar);
+ StaticP2RSingBar := AddStatic(Theme.Sing.StaticP2RSingBar);
+ StaticP2MSingBar := AddStatic(Theme.Sing.StaticP2MSingBar);
+ StaticP3SingBar := AddStatic(Theme.Sing.StaticP3SingBar);
+ //eoa moveable singbar
+
+ //Added for ps3 skin
+ //This one is shown in 2/4P mode
+ StaticP1TwoP := AddStatic(Theme.Sing.StaticP1TwoP);
+ StaticP1TwoPScoreBG := AddStatic(Theme.Sing.StaticP1TwoPScoreBG);
+ TextP1TwoP := AddText(Theme.Sing.TextP1TwoP);
+ TextP1TwoPScore := AddText(Theme.Sing.TextP1TwoPScore);
+
+ //This one is shown in 3/6P mode
+ StaticP1ThreeP := AddStatic(Theme.Sing.StaticP1ThreeP);
+ StaticP1ThreePScoreBG := AddStatic(Theme.Sing.StaticP1ThreePScoreBG);
+ TextP1ThreeP := AddText(Theme.Sing.TextP1ThreeP);
+ TextP1ThreePScore := AddText(Theme.Sing.TextP1ThreePScore);
+ //eoa
+
+ StaticP2R := AddStatic(Theme.Sing.StaticP2R);
+ StaticP2RScoreBG := AddStatic(Theme.Sing.StaticP2RScoreBG);
+ TextP2R := AddText(Theme.Sing.TextP2R);
+ TextP2RScore := AddText(Theme.Sing.TextP2RScore);
+
+ StaticP2M := AddStatic(Theme.Sing.StaticP2M);
+ StaticP2MScoreBG := AddStatic(Theme.Sing.StaticP2MScoreBG);
+ TextP2M := AddText(Theme.Sing.TextP2M);
+ TextP2MScore := AddText(Theme.Sing.TextP2MScore);
+
+ StaticP3R := AddStatic(Theme.Sing.StaticP3R);
+ StaticP3RScoreBG := AddStatic(Theme.Sing.StaticP3RScoreBG);
+ TextP3R := AddText(Theme.Sing.TextP3R);
+ TextP3RScore := AddText(Theme.Sing.TextP3RScore);
+
+ SongNameStatic := AddStatic(Theme.Sing.StaticSongName);
+ SongNameText := AddText(Theme.Sing.TextSongName);
+
+ VideoAspectStatic:= AddStatic(Theme.Sing.VideoAspectStatic);
+ VideoAspectText:= AddText(Theme.Sing.VideoAspectText);
+
+ LyricMain := TLyric.Create;
+ LyricSub := TLyric.Create;
+ UVideo.Init;
+end;
+
+procedure TScreenSing.onShow;
+var
+ P: integer;
+ V1: boolean;
+ V1TwoP: boolean; //added for ps3 skin
+ V1ThreeP: boolean; //added for ps3 skin
+ V2R: boolean;
+ V2M: boolean;
+ V3R: boolean;
+ NR: TRecR; //Line Bonus Mod
+begin
+ Log.LogStatus('Begin', 'onShow');
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenSing)');
+
+ FadeOut := false; // 0.5.0: early 0.5.0 problems were by this line commented
+
+ AspectHandler.changed := false;
+ Text[VideoAspectText].Visible := false;
+ Static[VideoAspectStatic].Visible := false;
+
+ //Reset Player Medley stats
+ if (ScreenSong.Mode = smMedley) or ScreenSong.PartyMedley then
+ begin
+ PlaylistMedley.CurrentMedleySong:=1;
+
+ //max_song_score_medley := round(MAX_SONG_SCORE / NumMedleySongs);
+ //max_song_line_bonus_medley := round(MAX_SONG_LINE_BONUS / NumMedleySongs);
+ PlaylistMedley.NumPlayer := PlayersPlay;
+ SetLength(PlaylistMedley.Stats, 0);
+ //max_song_score_medley := round(MAX_SONG_SCORE / PlaylistMedley.NumMedleySongs);
+ //max_song_line_bonus_medley := round(MAX_SONG_LINE_BONUS / PlaylistMedley.NumMedleySongs);
+ end;
+
+ // prepare players
+ SetLength(Player, PlayersPlay);
+// Player[0].ScoreTotalI := 0;
+
+ case PlayersPlay of
+ 1: begin
+ V1 := true;
+ V1TwoP := false; //added for ps3 skin
+ V1ThreeP := false; //added for ps3 skin
+ V2R := false;
+ V2M := false;
+ V3R := false;
+ end;
+ 2: begin
+ V1 := false;
+ V1TwoP := true; //added for ps3 skin
+ V1ThreeP := false; //added for ps3 skin
+ V2R := true;
+ V2M := false;
+ V3R := false;
+ end;
+ 3: begin
+ V1 := false;
+ V1TwoP := false; //added for ps3 skin
+ V1ThreeP := true; //added for ps3 skin
+ V2R := false;
+ V2M := true;
+ V3R := true;
+ end;
+ 4: begin // double screen
+ V1 := false;
+ V1TwoP := true; //added for ps3 skin
+ V1ThreeP := false; //added for ps3 skin
+ V2R := true;
+ V2M := false;
+ V3R := false;
+ end;
+ 6: begin // double screen
+ V1 := false;
+ V1TwoP := false; //added for ps3 skin
+ V1ThreeP := true; //added for ps3 skin
+ V2R := false;
+ V2M := true;
+ V3R := true;
+ end;
+
+ end;
+
+ //Added for ps3 skin
+ //This one is shown in 1P mode
+ Static[StaticP1].Visible := V1;
+ Static[StaticP1ScoreBG].Visible := V1;
+ Text[TextP1].Visible := V1;
+ Text[TextP1Score].Visible := V1;
+ //This one is shown in 2/4P mode
+ Static[StaticP1TwoP].Visible := V1TwoP;
+ Static[StaticP1TwoPScoreBG].Visible := V1TwoP;
+ Text[TextP1TwoP].Visible := V1TwoP;
+ Text[TextP1TwoPScore].Visible := V1TwoP;
+ //This one is shown in 3/6P mode
+ Static[StaticP1ThreeP].Visible := V1ThreeP;
+ Static[StaticP1ThreePScoreBG].Visible := V1ThreeP;
+ Text[TextP1ThreeP].Visible := V1ThreeP;
+ Text[TextP1ThreePScore].Visible := V1ThreeP;
+ //eoa
+
+ Static[StaticP2R].Visible := V2R;
+ Static[StaticP2RScoreBG].Visible := V2R;
+ Text[TextP2R].Visible := V2R;
+ Text[TextP2RScore].Visible := V2R;
+
+ Static[StaticP2M].Visible := V2M;
+ Static[StaticP2MScoreBG].Visible := V2M;
+ Text[TextP2M].Visible := V2M;
+ Text[TextP2MScore].Visible := V2M;
+
+ Static[StaticP3R].Visible := V3R;
+ Static[StaticP3RScoreBG].Visible := V3R;
+ Text[TextP3R].Visible := V3R;
+ Text[TextP3RScore].Visible := V3R;
+
+ //Set Position of Line Bonus - PhrasenBonus
+ if (Ini.LineBonus = 1) then //Show Line Bonus at Scores
+ begin
+ Case PlayersPlay of
+ 1: begin
+ Player[0].LineBonus_TargetX := Theme.Sing.StaticP1ScoreBG.x;
+ Player[0].LineBonus_TargetY := Theme.Sing.TextP1Score.Y;
+ Player[0].LineBonus_StartX := Theme.Sing.StaticP1ScoreBG.x;
+ Player[0].LineBonus_StartY := Theme.Sing.TextP1Score.Y + 65;
+ end;
+
+ 2: begin
+ //P1
+ Player[0].LineBonus_TargetX := Theme.Sing.StaticP1TwoPScoreBG.x;
+ Player[0].LineBonus_TargetY := Theme.Sing.TextP1TwoPScore.Y;
+ Player[0].LineBonus_StartX := Theme.Sing.StaticP1TwoPScoreBG.X;
+ Player[0].LineBonus_StartY := Theme.Sing.TextP1TwoPScore.Y + 65;
+
+ //P2
+ Player[1].LineBonus_TargetX := Theme.Sing.StaticP2RScoreBG.X;
+ Player[1].LineBonus_TargetY := Theme.Sing.TextP2RScore.Y;
+ Player[1].LineBonus_StartX := Theme.Sing.StaticP2RScoreBG.X;
+ Player[1].LineBonus_StartY := Theme.Sing.TextP2RScore.Y + 65;
+ end;
+
+ 3: begin
+ //P1
+ Player[0].LineBonus_TargetX := Theme.Sing.StaticP1ThreePScoreBG.x;
+ Player[0].LineBonus_TargetY := Theme.Sing.TextP1ThreePScore.Y;
+ Player[0].LineBonus_StartX := Theme.Sing.StaticP1ThreePScoreBG.x;
+ Player[0].LineBonus_StartY := Theme.Sing.TextP1ThreePScore.Y + 65;
+
+ //P2
+ Player[1].LineBonus_TargetX := Theme.Sing.StaticP2MScoreBG.x;
+ Player[1].LineBonus_TargetY := Theme.Sing.TextP2MScore.Y;
+ Player[1].LineBonus_StartX := Theme.Sing.StaticP2MScoreBG.x;
+ Player[1].LineBonus_StartY := Theme.Sing.TextP2MScore.Y + 65;
+
+ //P3
+ Player[2].LineBonus_TargetX := Theme.Sing.StaticP3RScoreBG.x;
+ Player[2].LineBonus_TargetY := Theme.Sing.TextP3RScore.Y;
+ Player[2].LineBonus_StartX := Theme.Sing.StaticP3RScoreBG.x;
+ Player[2].LineBonus_StartY := Theme.Sing.TextP3RScore.Y + 65;
+ end;
+
+ 4: begin
+ //P1
+ Player[0].LineBonus_TargetX := Theme.Sing.StaticP1TwoPScoreBG.x;
+ Player[0].LineBonus_TargetY := Theme.Sing.TextP1TwoPScore.Y;
+ Player[0].LineBonus_StartX := Theme.Sing.StaticP1TwoPScoreBG.x;
+ Player[0].LineBonus_StartY := Theme.Sing.TextP1TwoPScore.Y + 65;
+
+ //P2
+ Player[1].LineBonus_TargetX := Theme.Sing.StaticP2RScoreBG.x;
+ Player[1].LineBonus_TargetY := Theme.Sing.TextP2RScore.Y;
+ Player[1].LineBonus_StartX := Theme.Sing.StaticP2RScoreBG.x;
+ Player[1].LineBonus_StartY := Theme.Sing.TextP2RScore.Y + 65;
+
+ //P3
+ Player[2].LineBonus_TargetX := Theme.Sing.StaticP1TwoPScoreBG.x;
+ Player[2].LineBonus_TargetY := Theme.Sing.TextP1TwoPScore.Y;
+ Player[2].LineBonus_StartX := Theme.Sing.StaticP1TwoPScoreBG.x;
+ Player[2].LineBonus_StartY := Theme.Sing.TextP1TwoPScore.Y + 65;
+
+ //P4
+ Player[3].LineBonus_TargetX := Theme.Sing.StaticP2RScoreBG.x;
+ Player[3].LineBonus_TargetY := Theme.Sing.TextP2RScore.Y;
+ Player[3].LineBonus_StartX := Theme.Sing.StaticP2RScoreBG.x;
+ Player[3].LineBonus_StartY := Theme.Sing.TextP2RScore.Y + 65;
+ end;
+
+ 6: begin
+ //P1
+ Player[0].LineBonus_TargetX := Theme.Sing.StaticP1ThreePScoreBG.x;
+ Player[0].LineBonus_TargetY := Theme.Sing.TextP1ThreePScore.Y;
+ Player[0].LineBonus_StartX := Theme.Sing.StaticP1ThreePScoreBG.x;
+ Player[0].LineBonus_StartY := Theme.Sing.TextP1ThreePScore.Y + 65;
+
+ //P2
+ Player[1].LineBonus_TargetX := Theme.Sing.StaticP2MScoreBG.x;
+ Player[1].LineBonus_TargetY := Theme.Sing.TextP2MScore.Y;
+ Player[1].LineBonus_StartX := Theme.Sing.StaticP2MScoreBG.x;
+ Player[1].LineBonus_StartY := Theme.Sing.TextP2MScore.Y + 65;
+
+ //P3
+ Player[2].LineBonus_TargetX := Theme.Sing.StaticP3RScoreBG.x;
+ Player[2].LineBonus_TargetY := Theme.Sing.TextP3RScore.Y;
+ Player[2].LineBonus_StartX := Theme.Sing.StaticP3RScoreBG.x;
+ Player[2].LineBonus_StartY := Theme.Sing.TextP3RScore.Y + 65;
+
+ //P4
+ Player[3].LineBonus_TargetX := Theme.Sing.StaticP1ThreePScoreBG.x;
+ Player[3].LineBonus_TargetY := Theme.Sing.TextP1ThreePScore.Y;
+ Player[3].LineBonus_StartX := Theme.Sing.StaticP1ThreePScoreBG.x;
+ Player[3].LineBonus_StartY := Theme.Sing.TextP1ThreePScore.Y + 65;
+
+ //P5
+ Player[4].LineBonus_TargetX := Theme.Sing.StaticP2MScoreBG.x;
+ Player[4].LineBonus_TargetY := Theme.Sing.TextP2MScore.Y;
+ Player[4].LineBonus_StartX := Theme.Sing.StaticP2MScoreBG.x;
+ Player[4].LineBonus_StartY := Theme.Sing.TextP2MScore.Y + 65;
+
+ //P6
+ Player[5].LineBonus_TargetX := Theme.Sing.StaticP3RScoreBG.x;
+ Player[5].LineBonus_TargetY := Theme.Sing.TextP3RScore.Y;
+ Player[5].LineBonus_StartX := Theme.Sing.StaticP3RScoreBG.x;
+ Player[5].LineBonus_StartY := Theme.Sing.TextP3RScore.Y + 65;
+ end;
+ end;
+ end
+ else if (Ini.LineBonus = 2) then //Show Line Bonus at Notes
+ begin
+ //SingDrawNoteLines(Nr.Left + 10*ScreenX, 120, Nr.Right + 10*ScreenX, 12);
+ //SingDrawNoteLines(Nr.Left + 10*ScreenX, 245, Nr.Right + 10*ScreenX, 12);
+ //SingDrawNoteLines(Nr.Left + 10*ScreenX, 370, Nr.Right + 10*ScreenX, 12);
+
+ // positions
+ if Ini.SingWindow = 0 then begin
+ NR.Left := 120;
+ end else begin
+ NR.Left := 20;
+ end;
+ NR.Right := 780;
+
+ NR.Width := NR.Right - NR.Left;
+ NR.WMid := NR.Width / 2;
+ NR.Mid := NR.Left + NR.WMid;
+
+ Case PlayersPlay of
+ 1: begin
+ Player[0].LineBonus_TargetX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[0].LineBonus_TargetY := Skin_P2_NotesB - 105 - 65;
+ Player[0].LineBonus_StartX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[0].LineBonus_StartY := Skin_P2_NotesB - 105;
+ end;
+
+ 2: begin
+ //P1
+ Player[0].LineBonus_TargetX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[0].LineBonus_TargetY := Skin_P1_NotesB - 105 - 65 + 28;
+ Player[0].LineBonus_StartX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[0].LineBonus_StartY := Skin_P1_NotesB - 105 + 28;
+
+ //P2
+ Player[1].LineBonus_TargetX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[1].LineBonus_TargetY := Skin_P2_NotesB - 105 - 65 + 28;
+ Player[1].LineBonus_StartX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[1].LineBonus_StartY := Skin_P2_NotesB - 105 + 28;
+ end;
+
+ 3: begin
+ //P1
+ Player[0].LineBonus_TargetX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[0].LineBonus_TargetY := 120 - 65 + 28;
+ Player[0].LineBonus_StartX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[0].LineBonus_StartY := 120 + 28;
+
+ //P2
+ Player[1].LineBonus_TargetX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[1].LineBonus_TargetY := 245 - 65 + 28;
+ Player[1].LineBonus_StartX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[1].LineBonus_StartY := 245 + 28;
+
+ //P3
+ Player[2].LineBonus_TargetX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[2].LineBonus_TargetY := 370 - 65 + 28;
+ Player[2].LineBonus_StartX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[2].LineBonus_StartY := 370 + 28;
+ end;
+
+ 4: begin
+ //P1
+ Player[0].LineBonus_TargetX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[0].LineBonus_TargetY := Skin_P1_NotesB - 105 - 65 + 28;
+ Player[0].LineBonus_StartX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[0].LineBonus_StartY := Skin_P1_NotesB - 105 + 28;
+
+ //P2
+ Player[1].LineBonus_TargetX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[1].LineBonus_TargetY := Skin_P2_NotesB - 105 - 65 + 28;
+ Player[1].LineBonus_StartX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[1].LineBonus_StartY := Skin_P2_NotesB - 105 + 28;
+
+ //P3
+ Player[2].LineBonus_TargetX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[2].LineBonus_TargetY := Skin_P1_NotesB - 105 - 65 + 28;
+ Player[2].LineBonus_StartX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[2].LineBonus_StartY := Skin_P1_NotesB - 105 + 28;
+
+ //P4
+ Player[3].LineBonus_TargetX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[3].LineBonus_TargetY := Skin_P2_NotesB - 105 - 65 + 28;
+ Player[3].LineBonus_StartX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[3].LineBonus_StartY := Skin_P2_NotesB - 105 + 28;
+ end;
+
+ 6: begin
+ //P1
+ Player[0].LineBonus_TargetX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[0].LineBonus_TargetY := 120 - 65 + 28;
+ Player[0].LineBonus_StartX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[0].LineBonus_StartY := 120 + 28;
+
+ //P2
+ Player[1].LineBonus_TargetX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[1].LineBonus_TargetY := 245 - 65 + 28;
+ Player[1].LineBonus_StartX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[1].LineBonus_StartY := 245 + 28;
+
+ //P3
+ Player[2].LineBonus_TargetX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[2].LineBonus_TargetY := 370 - 65 + 28;
+ Player[2].LineBonus_StartX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[2].LineBonus_StartY := 370 + 28;
+
+ //P4
+ Player[3].LineBonus_TargetX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[3].LineBonus_TargetY := 120 - 65 + 28;
+ Player[3].LineBonus_StartX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[3].LineBonus_StartY := 120 + 28;
+
+ //P5
+ Player[4].LineBonus_TargetX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[4].LineBonus_TargetY := 245 - 65 + 28;
+ Player[4].LineBonus_StartX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[4].LineBonus_StartY := 245 + 28;
+
+ //P6
+ Player[5].LineBonus_TargetX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[5].LineBonus_TargetY := 370 - 65 + 28;
+ Player[5].LineBonus_StartX := Round(Nr.Right + 10*ScreenX - 100);
+ Player[5].LineBonus_StartY := 370 + 28;
+ end;
+ end;
+ end;
+ //Set Position of Line Bonus - PhrasenBonus End
+
+ // main text
+ LyricMain.Clear;
+ LyricMain.X := 400;
+ LyricMain.Y := Skin_LyricsT;
+ LyricMain.Scale := 1.4; //1.4
+ LyricMain.Align := 1;
+
+ // sub text
+ LyricSub.Clear;
+ LyricSub.X := 400;
+ LyricSub.Y := Skin_LyricsT + 35; //42 //40
+ LyricSub.Align := 1;
+
+ // set custom options
+ case Ini.LyricsFont of
+ 0:
+ begin
+ LyricMain.FontStyle := 0;
+ LyricSub.FontStyle := 0;
+ LyricMain.Size := 14; // 13
+ LyricSub.Size := 14; // 13
+ LyricMain.ColR := Skin_FontR;
+ LyricMain.ColG := Skin_FontG;
+ LyricMain.ColB := Skin_FontB; //Change für Crazy Joker
+ {LyricMain.ColSR := Skin_FontHighlightR;
+ LyricMain.ColSG := Skin_FontHighlightG;
+ LyricMain.ColSB := Skin_FontHighlightB;1aa5dc}
+ LyricMain.ColSR := 5/255; //26
+ LyricMain.ColSG := 163/255; //165
+ LyricMain.ColSB := 210/255; //220
+
+ LyricSub.ColR := 0.4; //0.6
+ LyricSub.ColG := 0.4; //0.6
+ LyricSub.ColB := 0.4; //0.6
+ end;
+ 1:
+ begin
+ LyricMain.FontStyle := 2;
+ LyricSub.FontStyle := 2;
+ LyricMain.Size := 14;
+ LyricSub.Size := 14;
+ LyricMain.ColR := 0.75;
+ LyricMain.ColG := 0.75;
+ LyricMain.ColB := 1;
+ LyricMain.ColSR := 0.5;
+ LyricMain.ColSG := 0.5;
+ LyricMain.ColSB := 1;
+ LyricSub.ColR := 0.8;
+ LyricSub.ColG := 0.8;
+ LyricSub.ColB := 0.8;
+ end;
+ 2:
+ begin
+ LyricMain.FontStyle := 3;
+ LyricSub.FontStyle := 3;
+ LyricMain.Size := 12;
+ LyricSub.Size := 12;
+ LyricMain.ColR := 0.75;
+ LyricMain.ColG := 0.75;
+ LyricMain.ColB := 1;
+ LyricMain.ColSR := 0.5;
+ LyricMain.ColSG := 0.5;
+ LyricMain.ColSB := 1;
+ LyricSub.ColR := 0.8;
+ LyricSub.ColG := 0.8;
+ LyricSub.ColB := 0.8;
+ end;
+ end; // case
+
+ case Ini.LyricsEffect of
+ 0: LyricMain.Style := 1; // 0 - one selected, 1 - selected all to the current
+ 1: LyricMain.Style := 2;
+ 2: LyricMain.Style := 3;
+ 3: LyricMain.Style := 4;
+ end; // case
+
+ LoadNextSong;
+
+ Log.LogStatus('End', 'onShow');
+end;
+
+procedure TScreenSing.LoadNextSong;
+var
+ P: integer;
+ numNotes: integer;
+begin
+ // load notes
+ ResetSingTemp;
+ PlaylistMedley.ApplausePlayed := false;
+ if (ScreenSong.Mode = smMedley) or ScreenSong.PartyMedley then
+ begin
+ CatSongs.Selected := PlaylistMedley.Song[PlaylistMedley.CurrentMedleySong-1];
+ Music.Open(CatSongs.Song[CatSongs.Selected].Path + CatSongs.Song[CatSongs.Selected].Mp3);
+ end;
+
+ AktSong := CatSongs.Song[CatSongs.Selected];
+ try
+ if not LoadSong(CatSongs.Song[CatSongs.Selected].Path + CatSongs.Song[CatSongs.Selected].FileName, SONG_LOAD_COMPLETE) then
+ begin
+ //Error Loading Song -> Go back to Song Screen and Show some Error Message
+ FadeTo(@ScreenSong);
+ //Select New Song in Party Mode
+ if ScreenSong.Mode = smParty then
+ ScreenSong.SelectRandomSong;
+ ScreenPopupError.ShowPopup (Language.Translate('ERROR_CORRUPT_SONG'));
+ Exit;
+ end;
+ except
+ //Error Loading Song -> Go back to Song Screen and Show some Error Message
+ FadeTo(@ScreenSong);
+ //Select New Song in Party Mode
+ if ScreenSong.Mode = smParty then
+ ScreenSong.SelectRandomSong;
+ ScreenPopupError.ShowPopup (Language.Translate('ERROR_CORRUPT_SONG'));
+ Exit;
+ end;
+ AktSong.Path := CatSongs.Song[CatSongs.Selected].Path;
+ // AktSong.GAP := AktSong.GAP + 40 {4096 = 100ms for buffer} + 20 {microphone} + 60000 / AktSong.BPM[0].BPM / 2; // temporary until UMain will be fixed
+
+ if (ScreenSong.Mode = smMedley) or ScreenSong.PartyMedley then
+ begin
+ SetMedleyMode;
+ Text[SongNameText].Text := IntToStr(PlaylistMedley.CurrentMedleySong) +
+ '/' + IntToStr(PlaylistMedley.NumMedleySongs) + ': ' +
+ AktSong.Artist + ' - ' + AktSong.Title;
+
+ //medley start and end timestamps
+ StartNote := FindNote(AktSong.Medley.StartBeat - round(AktSong.BPM[0].BPM*AktSong.Medley.FadeIn_time/60));
+ MedleyStart := GetTimeFromBeat(Czesci[0].Czesc[StartNote.line].Nuta[0].Start);
+
+ //check Medley-Start
+ if (MedleyStart+AktSong.Medley.FadeIn_time*0.5>GetTimeFromBeat(AktSong.Medley.StartBeat)) then
+ MedleyStart := GetTimeFromBeat(AktSong.Medley.StartBeat) - AktSong.Medley.FadeIn_time;
+ if MedleyStart<0 then
+ MedleyStart := 0;
+
+ //that one is better:
+ MedleyEnd := GetTimeFromBeat(AktSong.Medley.EndBeat) + AktSong.Medley.FadeOut_time;
+ end;
+
+ // set movie
+ if (Ini.MovieSize<2) and (AktSong.Video <> '') and FileExists(AktSong.Path + AktSong.Video) then begin
+ acOpenFile(PAnsiChar(AktSong.Path + AktSong.Video));
+
+ if (ScreenSong.Mode = smMedley) or ScreenSong.PartyMedley then
+ acSkip(AktSong.VideoGAP, MedleyStart)
+ else
+ acSkip(AktSong.VideoGAP, AktSong.Start);
+
+ if (UVideo.VideoOpened) then
+ AktSong.VideoLoaded := true;
+
+ UVideo.SetAspectCorrection(TAspectCorrection(
+ DataBase.GetAspect(AktSong.Artist, AktSong.Title, Ini.AspectCorrect)));
+ end;
+
+ // set background
+ if (AktSong.Background <> '') and (AktSong.VideoLoaded = false) then
+ try
+ Tex_Background := Texture.LoadTexture(AktSong.Path + AktSong.Background);
+ except
+ log.LogError('Background could not be loaded: ' + AktSong.Path + AktSong.Background);
+ Tex_Background.TexNum := -1;
+ end
+ else
+ Tex_Background.TexNum := -1;
+
+ // play music+timer (I)
+ Music.CaptureStart;
+
+ if (ScreenSong.Mode = smMedley) or ScreenSong.PartyMedley then
+ begin
+ Music.MoveTo(MedleyStart);
+ Czas.Teraz := MedleyStart;
+ Czas.Razem := MedleyEnd;
+ end else
+ begin
+ Music.MoveTo(AktSong.Start);
+
+ Czas.Teraz := AktSong.Start;
+ Czas.Razem := Music.Length;
+ if (AktSong.Finish > 0) then
+ Czas.Razem := AktSong.Finish / 1000;
+ end;
+
+ Czas.OldBeat := -1;
+
+
+ for P := 0 to High(Player) do
+ ClearScores(P);
+
+ // fill texts
+ LyricMain.AddCzesc(0);
+ LyricMain.Selected := -1;
+ LyricSub.AddCzesc(1);
+ LyricSub.Selected := -1;
+
+ UpdateLCD;
+
+ //Deactivate Pause
+ Paused := False;
+
+ //Kill all Stars not Killed yet
+ //GoldenStarsTwinkle Mod
+ GoldenRec.SentenceChange;
+ //GoldenStarsTwinkle Mod End
+
+ //Set Num of Empty Sentences for Phrasen Bonus
+ NumEmptySentences := 0;
+ for P := low(Czesci[0].Czesc) to high(Czesci[0].Czesc) do
+ if Czesci[0].Czesc[P].TotalNotes = 0 then Inc(NumEmptySentences);
+
+ if (ScreenSong.Mode = smMedley) or ScreenSong.PartyMedley then
+ begin
+ MedleyHandler.changed := true;
+ MedleyHandler.change_time := Czas.Teraz;
+
+ Static[SongNameStatic].Visible := true;
+ Text[SongNameText].Visible := true;
+ end else
+ begin
+ Static[SongNameStatic].Visible := false;
+ Text[SongNameText].Visible := false;
+ end;
+
+ if ((ScreenSong.Mode = smMedley) or ScreenSong.PartyMedley)
+ and (PlaylistMedley.CurrentMedleySong>1) then
+ onShowFinish;
+end;
+
+procedure TScreenSing.onShowFinish;
+begin
+ // play movie (II)
+
+ if AktSong.VideoLoaded then
+ begin
+ try
+ acGetFrame(Czas.Teraz);
+ except
+ //If an Error occurs Reading Video: prevent Video from being Drawn again and Close Video
+ AktSong.VideoLoaded := False;
+ Log.LogError('Error drawing Video, Video has been disabled for this Song/Session.');
+ Log.LogError('Corrupted File: ' + AktSong.Video);
+ try
+ acClose;
+ except
+
+ end;
+ end;
+ end;
+
+ // play music (II)
+ if (ScreenSong.Mode = smMedley) or ScreenSong.PartyMedley then
+ Music.Fade(10, 100, AktSong.Medley.FadeIn_time)
+ else
+ Music.SetVolume(100);
+
+ Music.Play;
+
+ // prepare timer (II)
+ CountSkipTimeSet;
+end;
+
+function TScreenSing.Draw: boolean;
+var
+ Min: integer;
+ Sec: integer;
+ Tekst: string;
+ Flash: real;
+ S: integer;
+ T: integer;
+ lastLine, LastWord: integer;
+ medley_end: boolean;
+ medley_start_applause: boolean;
+ CurTime: real;
+begin
+
+ //ScoreBG Mod
+ // set player colors
+ if PlayersPlay = 4 then
+ begin
+ if ScreenAct = 1 then
+ begin
+ LoadColor(Static[StaticP1TwoP].Texture.ColR, Static[StaticP1TwoP].Texture.ColG,
+ Static[StaticP1TwoP].Texture.ColB, 'P1Dark');
+ LoadColor(Static[StaticP2R].Texture.ColR, Static[StaticP2R].Texture.ColG,
+ Static[StaticP2R].Texture.ColB, 'P2Dark');
+
+ LoadColor(Static[StaticP1TwoPScoreBG].Texture.ColR, Static[StaticP1TwoPScoreBG].Texture.ColG,
+ Static[StaticP1TwoPScoreBG].Texture.ColB, 'P1Dark');
+ LoadColor(Static[StaticP2RScoreBG].Texture.ColR, Static[StaticP2RScoreBG].Texture.ColG,
+ Static[StaticP2RScoreBG].Texture.ColB, 'P2Dark');
+ end;
+
+ if ScreenAct = 2 then
+ begin
+ LoadColor(Static[StaticP1TwoP].Texture.ColR, Static[StaticP1TwoP].Texture.ColG,
+ Static[StaticP1TwoP].Texture.ColB, 'P3Dark');
+ LoadColor(Static[StaticP2R].Texture.ColR, Static[StaticP2R].Texture.ColG,
+ Static[StaticP2R].Texture.ColB, 'P4Dark');
+
+ LoadColor(Static[StaticP1TwoPScoreBG].Texture.ColR, Static[StaticP1TwoPScoreBG].Texture.ColG,
+ Static[StaticP1TwoPScoreBG].Texture.ColB, 'P3Dark');
+ LoadColor(Static[StaticP2RScoreBG].Texture.ColR, Static[StaticP2RScoreBG].Texture.ColG,
+ Static[StaticP2RScoreBG].Texture.ColB, 'P4Dark');
+ end;
+ end;
+
+ if PlayersPlay = 6 then
+ begin
+ if ScreenAct = 1 then
+ begin
+ LoadColor(Static[StaticP1ThreeP].Texture.ColR, Static[StaticP1ThreeP].Texture.ColG,
+ Static[StaticP1ThreeP].Texture.ColB, 'P1Dark');
+ LoadColor(Static[StaticP2M].Texture.ColR, Static[StaticP2M].Texture.ColG,
+ Static[StaticP2R].Texture.ColB, 'P2Dark');
+ LoadColor(Static[StaticP3R].Texture.ColR, Static[StaticP3R].Texture.ColG,
+ Static[StaticP3R].Texture.ColB, 'P3Dark');
+
+ LoadColor(Static[StaticP1ThreePScoreBG].Texture.ColR, Static[StaticP1ThreePScoreBG].Texture.ColG,
+ Static[StaticP1ThreePScoreBG].Texture.ColB, 'P1Dark');
+ LoadColor(Static[StaticP2MScoreBG].Texture.ColR, Static[StaticP2MScoreBG].Texture.ColG,
+ Static[StaticP2RScoreBG].Texture.ColB, 'P2Dark');
+ LoadColor(Static[StaticP3RScoreBG].Texture.ColR, Static[StaticP3RScoreBG].Texture.ColG,
+ Static[StaticP3RScoreBG].Texture.ColB, 'P3Dark');
+ end;
+
+ if ScreenAct = 2 then
+ begin
+ LoadColor(Static[StaticP1ThreeP].Texture.ColR, Static[StaticP1ThreeP].Texture.ColG,
+ Static[StaticP1ThreeP].Texture.ColB, 'P4Dark');
+ LoadColor(Static[StaticP2M].Texture.ColR, Static[StaticP2M].Texture.ColG,
+ Static[StaticP2R].Texture.ColB, 'P5Dark');
+ LoadColor(Static[StaticP3R].Texture.ColR, Static[StaticP3R].Texture.ColG,
+ Static[StaticP3R].Texture.ColB, 'P6Dark');
+
+ LoadColor(Static[StaticP1ThreePScoreBG].Texture.ColR, Static[StaticP1ThreePScoreBG].Texture.ColG,
+ Static[StaticP1ThreePScoreBG].Texture.ColB, 'P4Dark');
+ LoadColor(Static[StaticP2MScoreBG].Texture.ColR, Static[StaticP2MScoreBG].Texture.ColG,
+ Static[StaticP2RScoreBG].Texture.ColB, 'P5Dark');
+ LoadColor(Static[StaticP3RScoreBG].Texture.ColR, Static[StaticP3RScoreBG].Texture.ColG,
+ Static[StaticP3RScoreBG].Texture.ColB, 'P6Dark');
+ end;
+ end;
+
+ // set player names (for 2 screens and only Singstar skin)
+ if ScreenAct = 1 then begin
+ Text[TextP1].Text := 'P1';
+ Text[TextP1TwoP].Text := 'P1'; //added for ps3 skin
+ Text[TextP1ThreeP].Text := 'P1'; //added for ps3 skin
+ Text[TextP2R].Text := 'P2';
+ Text[TextP2M].Text := 'P2';
+ Text[TextP3R].Text := 'P3';
+ end;
+
+ if ScreenAct = 2 then begin
+ case PlayersPlay of
+{ 1: begin
+ Text[TextP1].Text := 'P2';
+ end;
+ 2: begin
+ Text[TextP1].Text := 'P3';
+ Text[TextP2R].Text := 'P4';
+ end;
+ 3: begin
+ Text[TextP1].Text := 'P4';
+ Text[TextP2M].Text := 'P5';
+ Text[TextP3R].Text := 'P6';
+ end;}
+
+ 4: begin
+ Text[TextP1TwoP].Text := 'P3';
+ Text[TextP2R].Text := 'P4';
+ end;
+ 6: begin
+ Text[TextP1ThreeP].Text := 'P4';
+ Text[TextP2M].Text := 'P5';
+ Text[TextP3R].Text := 'P6';
+ end;
+ end; // case
+ end; // if
+
+ // stereo
+
+// weird stuff, maybe this is for "dual screen?", but where is player three then?
+ Static[StaticP1].Texture.X := Static[StaticP1].Texture.X + 10*ScreenX;
+ Static[StaticP1ScoreBG].Texture.X := Static[StaticP1ScoreBG].Texture.X + 10*ScreenX;
+
+ Text[TextP1].X := Text[TextP1].X + 10*ScreenX;
+ Text[TextP1Score].X := Text[TextP1Score].X + 10*ScreenX;
+
+
+ Static[StaticP2R].Texture.X := Static[StaticP2R].Texture.X + 10*ScreenX;
+ Static[StaticP2RScoreBG].Texture.X := Static[StaticP2RScoreBG].Texture.X + 10*ScreenX;
+
+ Text[TextP2R].X := Text[TextP2R].X + 10*ScreenX;
+ Text[TextP2RScore].X := Text[TextP2RScore].X + 10*ScreenX;
+// end of weird stuff
+
+ for S := 1 to 1 do
+ Static[S].Texture.X := Static[S].Texture.X + 10*ScreenX;
+
+ for T := 0 to 1 do
+ Text[T].X := Text[T].X + 10*ScreenX;
+
+ // update static menu with time ...
+ if ScreenSong.Mode <> smMedley then
+ CurTime := Czas.Razem - Czas.Teraz
+ else
+ CurTime := MedleyEnd - Czas.Teraz;
+
+ Min := Round(CurTime) div 60;
+ Sec := Round(CurTime) mod 60;
+ Text[TextTimeText].Text := '';
+ if Min < 10 then Text[TextTimeText].Text := '0';
+ Text[TextTimeText].Text := Text[TextTimeText].Text + IntToStr(Min) + ':';
+ if Sec < 10 then Text[TextTimeText].Text := Text[TextTimeText].Text + '0';
+ Text[TextTimeText].Text := Text[TextTimeText].Text + IntToStr(Sec);
+
+ lastLine := Length(Czesci[0].Czesc)-1;
+ lastWord := Length(Czesci[0].Czesc[lastLine].Nuta)-1;
+ if (Czas.AktBeat>(Czesci[0].Czesc[lastLine].Nuta[lastWord].Start+
+ Czesci[0].Czesc[lastLine].Nuta[lastWord].Dlugosc)) then
+ ScreenSong.SungToEnd := true;
+
+ // for medley-mode:
+ CurTime := Czas.Teraz;
+ if (ScreenSong.Mode = smMedley) and (CurTime > MedleyEnd) then
+ medley_end := true
+ else
+ medley_end := false;
+
+ if (ScreenSong.Mode = smMedley) and (CurTime >
+ GetTimeFromBeat(AktSong.Medley.EndBeat)) then
+ medley_start_applause := true
+ else
+ medley_start_applause := false;
+
+ // .. and scores
+ if PlayersPlay = 1 then begin
+ Tekst := IntToStr(Player[0].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP1Score].Text := Tekst;
+ end;
+
+ if PlayersPlay = 2 then begin
+ Tekst := IntToStr(Player[0].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP1TwoPScore].Text := Tekst;
+
+ Tekst := IntToStr(Player[1].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP2RScore].Text := Tekst;
+ end;
+
+ if PlayersPlay = 3 then begin
+ Tekst := IntToStr(Player[0].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP1ThreePScore].Text := Tekst;
+
+ Tekst := IntToStr(Player[1].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP2MScore].Text := Tekst;
+
+ Tekst := IntToStr(Player[2].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP3RScore].Text := Tekst;
+ end;
+
+ if PlayersPlay = 4 then begin
+ if ScreenAct = 1 then begin
+ Tekst := IntToStr(Player[0].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP1TwoPScore].Text := Tekst;
+
+ Tekst := IntToStr(Player[1].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP2RScore].Text := Tekst;
+ end;
+ if ScreenAct = 2 then begin
+ Tekst := IntToStr(Player[2].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP1TwoPScore].Text := Tekst;
+
+ Tekst := IntToStr(Player[3].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP2RScore].Text := Tekst;
+ end;
+ end;
+
+ if PlayersPlay = 6 then begin
+ if ScreenAct = 1 then begin
+ Tekst := IntToStr(Player[0].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP1ThreePScore].Text := Tekst;
+
+ Tekst := IntToStr(Player[1].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP2MScore].Text := Tekst;
+
+ Tekst := IntToStr(Player[2].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP3RScore].Text := Tekst;
+ end;
+ if ScreenAct = 2 then begin
+ Tekst := IntToStr(Player[3].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP1ThreePScore].Text := Tekst;
+
+ Tekst := IntToStr(Player[4].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP2MScore].Text := Tekst;
+
+ Tekst := IntToStr(Player[5].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP3RScore].Text := Tekst;
+ end;
+ end;
+
+
+ // beat flash
+{ Flash := 1 - (Czas.MidBeat - Czas.AktBeat);
+ if (Czas.AktBeat + AktSong.NotesGAP) mod AktSong.Resolution = 0 then Flash := 1
+ else Flash := 0;
+ if Czas.AktBeat < 0 then Flash := 0;
+ glClearColor(Flash, Flash, Flash, 1);}
+
+ // beat sound
+// if (Ini.BeatClick = 1) and (Flash = 1) and (Czas.AktBeat <> Czas.OldBeat) then Music.PlayClick;
+
+ // draw static menu (BG)
+ DrawBG;
+ //Draw Background
+ SingDrawBackground;
+ // update and draw movie
+ if ShowFinish and AktSong.VideoLoaded then begin
+ try
+ acGetFrame(Czas.Teraz);
+ acDrawGL(ScreenAct); // this only draws
+ except
+ //If an Error occurs drawing: prevent Video from being Drawn again and Close Video
+ AktSong.VideoLoaded := False;
+ log.LogError('Error drawing Video, Video has been disabled for this Song/Session.');
+ Log.LogError('Corrupted File: ' + AktSong.Video);
+ try
+ acClose;
+ except
+
+ end;
+ end;
+ end;
+
+ // draw static menu (FG)
+ DrawFG;
+
+ //Medley Countdown
+ if ScreenSong.Mode = smMedley then
+ DrawMedleyCountdown;
+
+ // check for music finish
+ // Log.LogError('Check for music finish: ' + BoolToStr(Music.Finished) + ' ' + FloatToStr(Czas.Teraz*1000) + ' ' + IntToStr(AktSong.Finish));
+ if ShowFinish then
+ begin
+ if (not Music.Finished) and (not medley_end or (ScreenSong.Mode <> smMedley))
+ and ((AktSong.Finish = 0) or (CurTime*1000 <= AktSong.Finish)) then
+ begin
+ //Pause Mod:
+ if not Paused then
+ begin
+ Sing(Self); // analyze song
+ //Update Medley Stats
+ if (ScreenSong.Mode = smMedley) and not FadeOut then
+ UpdateMedleyStats(medley_start_applause);
+ end;
+ end else
+ begin
+ if not FadeOut then
+ begin
+ Finish;
+ if ScreenSong.Mode = smNormal then
+ begin
+ FadeOut := true;
+ FadeTo(@ScreenScore);
+ end;
+ end;
+ end;
+ end;
+
+ // draw custom items
+ SingDraw; // always draw
+
+ //GoldenNoteStarsTwinkle Mod
+ GoldenRec.SpawnRec;
+ //GoldenNoteStarsTwinkle Mod
+
+ // back stereo
+
+ // weird stuff, maybe this is for "dual screen?", but where is player three then?
+ Static[StaticP1].Texture.X := Static[StaticP1].Texture.X - 10*ScreenX;
+ Static[StaticP1ScoreBG].Texture.X := Static[StaticP1ScoreBG].Texture.X - 10*ScreenX;
+
+ Text[TextP1].X := Text[TextP1].X - 10*ScreenX;
+ Text[TextP1Score].X := Text[TextP1Score].X - 10*ScreenX;
+
+
+ Static[StaticP2R].Texture.X := Static[StaticP2R].Texture.X - 10*ScreenX;
+ Static[StaticP2RScoreBG].Texture.X := Static[StaticP2RScoreBG].Texture.X - 10*ScreenX;
+
+ Text[TextP2R].X := Text[TextP2R].X - 10*ScreenX;
+ Text[TextP2RScore].X := Text[TextP2RScore].X - 10*ScreenX;
+ //weird end
+
+ for S := 1 to 1 do
+ Static[S].Texture.X := Static[S].Texture.X - 10*ScreenX;
+
+ for T := 0 to 1 do
+ Text[T].X := Text[T].X - 10*ScreenX;
+
+ //Aspect
+ if AspectHandler.changed and (Czas.Teraz>AspectHandler.change_time + 3) then
+ begin
+ AspectHandler.changed:=false;
+ Text[VideoAspectText].Visible := false;
+ Static[VideoAspectStatic].Visible := false;
+ end;
+
+ //Medley
+ if MedleyHandler.changed and (Czas.Teraz>MedleyHandler.change_time + AktSong.Medley.FadeIn_time) then
+ begin
+ MedleyHandler.changed:=false;
+ Static[SongNameStatic].Visible := false;
+ Text[SongNameText].Visible := false;
+ end;
+end;
+
+procedure TScreenSing.UpdateMedleyStats(medley_end: boolean);
+var
+ len, num, I : integer;
+ lastline: boolean;
+ vol: real;
+begin
+ len := Length(PlaylistMedley.Stats);
+ num := PlaylistMedley.NumPlayer;
+
+ if (PlaylistMedley.CurrentMedleySong>len) and
+ (PlaylistMedley.CurrentMedleySong<=PlaylistMedley.NumMedleySongs) then
+ begin
+ inc(len);
+ SetLength(PlaylistMedley.Stats, len);
+ SetLength(PlaylistMedley.Stats[len-1].Player, num);
+ PlaylistMedley.Stats[len-1].SongArtist := AktSong.Artist;
+ PlaylistMedley.Stats[len-1].SongTitle := AktSong.Title;
+ end;
+
+ if (PlaylistMedley.CurrentMedleySong<=PlaylistMedley.NumMedleySongs) then
+ for I := 0 to num - 1 do
+ PlaylistMedley.Stats[len-1].Player[I] := Player[I];
+
+ if medley_end and not PlaylistMedley.ApplausePlayed and
+ (PlaylistMedley.CurrentMedleySong<=PlaylistMedley.NumMedleySongs) then
+ begin
+ PlaylistMedley.ApplausePlayed:=true;
+ Music.PlayApplause;
+ Music.Fade(100, 10, AktSong.Medley.FadeOut_time);
+ end;
+end;
+
+procedure TScreenSing.Finish;
+var
+ I, J: integer;
+ len, num: integer;
+
+begin
+ Music.CaptureStop;
+ Music.Stop;
+
+ if Ini.SavePlayback = 1 then begin
+ Log.BenchmarkStart(0);
+ Log.LogVoice(0);
+ Log.LogVoice(1);
+ Log.LogVoice(2);
+ Log.BenchmarkEnd(0);
+ Log.LogBenchmark('Creating files', 0);
+ end;
+
+ if AktSong.VideoLoaded then begin
+ acClose;
+ AktSong.VideoLoaded := false; // to prevent drawing closed video
+ end;
+
+ SetFontItalic (False);
+
+ if (ScreenSong.Mode = smMedley) or ScreenSong.PartyMedley then
+ begin
+ if not FadeOut then
+ begin
+ inc(PlaylistMedley.CurrentMedleySong);
+ if PlaylistMedley.CurrentMedleySong<=PlaylistMedley.NumMedleySongs then
+ begin
+ //AudioPlayback.PlaySound(SoundLib.Applause);
+ LoadNextSong;
+ end else
+ begin
+ //build sums
+ len := Length(PlaylistMedley.Stats);
+ num := PlaylistMedley.NumPlayer;
+
+ SetLength(PlaylistMedley.Stats, len+1);
+ SetLength(PlaylistMedley.Stats[len].Player, num);
+
+ for J := 0 to len - 1 do
+ begin
+ for I := 0 to num - 1 do
+ begin
+ PlaylistMedley.Stats[len].Player[I].Score :=
+ PlaylistMedley.Stats[len].Player[I].Score +
+ PlaylistMedley.Stats[J].Player[I].Score;
+
+ PlaylistMedley.Stats[len].Player[I].ScoreLine :=
+ PlaylistMedley.Stats[len].Player[I].ScoreLine +
+ PlaylistMedley.Stats[J].Player[I].ScoreLine;
+
+ PlaylistMedley.Stats[len].Player[I].ScoreGolden :=
+ PlaylistMedley.Stats[len].Player[I].ScoreGolden +
+ PlaylistMedley.Stats[J].Player[I].ScoreGolden;
+
+ PlaylistMedley.Stats[len].Player[I].ScoreI :=
+ PlaylistMedley.Stats[len].Player[I].ScoreI +
+ PlaylistMedley.Stats[J].Player[I].ScoreI;
+
+ PlaylistMedley.Stats[len].Player[I].ScoreLineI :=
+ PlaylistMedley.Stats[len].Player[I].ScoreLineI +
+ PlaylistMedley.Stats[J].Player[I].ScoreLineI;
+
+ PlaylistMedley.Stats[len].Player[I].ScoreGoldenI :=
+ PlaylistMedley.Stats[len].Player[I].ScoreGoldenI +
+ PlaylistMedley.Stats[J].Player[I].ScoreGoldenI;
+
+ PlaylistMedley.Stats[len].Player[I].ScoreTotalI :=
+ PlaylistMedley.Stats[len].Player[I].ScoreTotalI +
+ PlaylistMedley.Stats[J].Player[I].ScoreTotalI;
+ end; //of for I
+ end; //of for J
+
+ //build mean on sum
+ for I := 0 to num - 1 do
+ begin
+ PlaylistMedley.Stats[len].Player[I].Score := round(
+ PlaylistMedley.Stats[len].Player[I].Score / len);
+
+ PlaylistMedley.Stats[len].Player[I].ScoreLine := round(
+ PlaylistMedley.Stats[len].Player[I].ScoreLine / len);
+
+ PlaylistMedley.Stats[len].Player[I].ScoreGolden := round(
+ PlaylistMedley.Stats[J].Player[I].ScoreGolden / len);
+
+ PlaylistMedley.Stats[len].Player[I].ScoreI := round(
+ PlaylistMedley.Stats[len].Player[I].ScoreI / len);
+
+ PlaylistMedley.Stats[len].Player[I].ScoreLineI := round(
+ PlaylistMedley.Stats[len].Player[I].ScoreLineI / len);
+
+ PlaylistMedley.Stats[len].Player[I].ScoreGoldenI := round(
+ PlaylistMedley.Stats[len].Player[I].ScoreGoldenI / len);
+
+ PlaylistMedley.Stats[len].Player[I].ScoreTotalI := round(
+ PlaylistMedley.Stats[len].Player[I].ScoreTotalI / len);
+ end;
+
+ FadeOut:=true;
+ if ScreenSong.PartyMedley then
+ begin
+ for I := 0 to PlayersPlay-1 do
+ begin
+ Player[I].ScoreTotalI := PlaylistMedley.Stats[Length(PlaylistMedley.Stats)-1].Player[I].ScoreTotalI;
+ if(ScreenSong.Mode=smChallenge) then
+ ScreenSingModi.TeamInfo.TeamInfo[I].Score:=Player[I].ScoreTotalI;
+ end;
+
+ if ScreenSong.Mode=smChallenge then
+ begin
+ PartySessionM2.Teams:=ScreenSingModi.TeamInfo;
+ PartySessionM2.EndRound;
+ end;{ else if ScreenSong.Mode = smParty then
+ begin
+ PartySession.Teams := ScreenSingModi.TeamInfo;
+ PartySession.EndRound;
+ end; }
+ end;
+
+ if (ScreenSong.Mode=smMedley) or (ScreenSong.Mode=smChallenge) then
+ FadeTo(@ScreenScore)
+ else
+ FadeTo(@ScreenPartyScore);
+ end;
+ end;
+ end else
+ begin
+ SetLength(PlaylistMedley.Stats, 1);
+ SetLength(PlaylistMedley.Stats[0].Player, PlayersPlay);
+ for I := 0 to PlayersPlay - 1 do
+ PlaylistMedley.Stats[0].Player[I] := Player[I];
+ PlaylistMedley.Stats[0].SongArtist := AktSong.Artist;
+ PlaylistMedley.Stats[0].SongTitle := AktSong.Title;
+ end;
+end;
+
+procedure TScreenSing.UpdateLCD;
+var
+ T: string;
+begin
+ LCD.HideCursor;
+ LCD.Clear;
+
+ T := LyricMain.Text;
+ if Copy(T, Length(T), 1) <> ' ' then T := T + ' ';
+ LCD.AddTextBR(T);
+
+ T := LyricSub.Text;
+ if Copy(T, Length(T), 1) <> ' ' then T := T + ' ';
+ LCD.AddTextBR(T);
+end;
+
+procedure TScreenSing.onSentenceEnd(S: Cardinal);
+var
+I: Integer;
+A: Real;
+B: integer; //Max Points for Notes
+begin
+
+ //Check for Empty Sentence
+ if (Czesci[0].Czesc[S].TotalNotes<=0) then
+ exit;
+
+ //Set Max Note Points
+ if (Ini.LineBonus > 0) then
+ B := 9000
+ else
+ B := 10000;
+
+ for I := 0 to High(Player) do begin
+ A := Player[I].Score + Player[I].ScoreGolden - Player[I].ScoreLast + 2;
+
+ //SingBar Mod
+ If ({(Ini.Oscilloscope = 2) and }(Czesci[0].Czesc[S].TotalNotes>0)) then
+ begin
+ Player[I].ScorePercentTarget := Player[I].ScorePercentTarget + floor(A / (B * Czesci[0].Czesc[S].TotalNotes / Czesci[0].Wartosc) * 40 - 26);
+ if Player[I].ScorePercentTarget < 0 then Player[I].ScorePercentTarget := 0;
+ if Player[I].ScorePercentTarget > 99 then Player[I].ScorePercentTarget := 99;
+
+ //end Singbar Mod
+ end;
+
+ //PhrasenBonus - Line Bonus Mod
+
+ //Generate Steps 0 to 8
+ A := Floor(A / (B * Czesci[0].Czesc[S].TotalNotes / Czesci[0].Wartosc) * 8);
+
+ If (Ini.LineBonus > 0) then
+ begin
+
+ //Generate Text
+ if A >= 8 then
+ Player[I].LineBonus_Text := Theme.Sing.LineBonusText[8]
+ else
+ Player[I].LineBonus_Text := Theme.Sing.LineBonusText[Floor(A)];
+
+ //PhrasenBonus give Points
+ Player[I].ScoreLine := Player[I].ScoreLine + (1000 / (Length(Czesci[0].Czesc) - NumEmptySentences) * A / 8);
+ Player[I].ScoreLineI := Round(Player[I].ScoreLine / 10) * 10;
+ //Update Total Score
+ Player[I].ScoreTotalI := Player[I].ScoreI + Player[I].ScoreGoldenI + Player[I].ScoreLineI;
+
+ //Color
+ Case Floor(A) of
+ 0: begin
+ Player[I].LineBonus_Color.R := 1;
+ Player[I].LineBonus_Color.G := 0;
+ Player[I].LineBonus_Color.B := 0;
+ end;
+ 1..3: begin
+ Player[I].LineBonus_Color.R := 1;
+ Player[I].LineBonus_Color.G := (A * 0.25);
+ Player[I].LineBonus_Color.B := 0;
+ end;
+ 4: begin
+ Player[I].LineBonus_Color.R := 1;
+ Player[I].LineBonus_Color.G := 1;
+ Player[I].LineBonus_Color.B := 0;
+ end;
+ 5..7: begin
+ Player[I].LineBonus_Color.R := 1-((a-4)*0.25);
+ Player[I].LineBonus_Color.G := 1;
+ Player[I].LineBonus_Color.B := 0;
+ end;
+ 8: begin
+ Player[I].LineBonus_Color.R := 0;
+ Player[I].LineBonus_Color.G := 1;
+ Player[I].LineBonus_Color.B := 0;
+ end;
+ End; //Case
+ //Player[I].LineBonus_Color.B := 0;
+ //Player[I].LineBonus_Color.R := (8-A)/8;
+ //Player[I].LineBonus_Color.G := A/10;
+
+ Player[I].LineBonus_PosX := Player[I].LineBonus_StartX;
+ Player[I].LineBonus_PosY := Player[I].LineBonus_StartY;
+ Player[I].LineBonus_Alpha := 0.92;
+ Player[I].LineBonus_Visible := True;
+ Player[I].LineBonus_Age := 1;
+ end;
+ //PhrasenBonus - Line Bonus Mod End// }
+
+ //PerfectLineTwinkle Mod (effect) Pt.1
+ If (Ini.EffectSing=1) then
+ begin
+ if A >= 8 then Player[I].LastSentencePerfect := True
+ else Player[I].LastSentencePerfect := False;
+ end;
+ //PerfectLineTwinkle Mod end
+
+ //Refresh LastScore
+ Player[I].ScoreLast := Player[I].Score + Player[I].ScoreGolden;
+
+ end;
+
+ //PerfectLineTwinkle Mod (effect) Pt.2
+ if Ini.EffectSing=1 then
+ GoldenRec.SpawnPerfectLineTwinkle;
+ //PerfectLineTwinkle Mod end
+end;
+
+//Called on Sentence Change S= New Current Sentence
+procedure TScreenSing.onSentenceChange(S: Cardinal);
+begin
+ //GoldenStarsTwinkle Mod
+ GoldenRec.SentenceChange;
+ //GoldenStarsTwinkle Mod End
+end;
+
+procedure TScreenSing.DrawMedleyCountdown();
+var
+ txt: PChar;
+ w, h: real;
+ timeDiff: real;
+ t: real;
+begin
+ if (Czas.Teraz < GetTimeFromBeat(AktSong.Medley.StartBeat)) then
+ begin
+ timeDiff := GetTimeFromBeat(AktSong.Medley.StartBeat)-Czas.Teraz+1;
+ t := frac(timeDiff);
+ CountDownText := IntToStr(round(timeDiff-t));
+ glColor4f(0.15, 0.30, 0.6, t);
+
+ h := 130*t*ScreenH/RenderH;
+ SetFontStyle(1);
+ SetFontItalic(false);
+ SetFontSize(h);
+ w := glTextWidth(PChar(CountDownText));
+
+ SetFontPos (RenderW/2-w/2, RenderH/2-h/2*3);
+ txt := Addr(CountDownText[1]);
+ glPrint(txt);
+ end;
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenSingModi.pas b/Game/Code/Screens/UScreenSingModi.pas
new file mode 100644
index 00000000..1f766ebe
--- /dev/null
+++ b/Game/Code/Screens/UScreenSingModi.pas
@@ -0,0 +1,772 @@
+unit UScreenSingModi;
+
+interface
+
+uses UMenu, UMusic, SDL, SysUtils, UFiles, UTime, USongs, UIni, ULog, UTexture, ULyrics,
+ TextGL, gl, BASS, UThemes, ULCD, UScreenSing, ModiSDK, UVideo;
+
+type
+ TScreenSingModi = class(TScreenSing)
+ protected
+ //paused: boolean; //Pause Mod
+ //PauseTime: Real;
+ //NumEmptySentences: integer;
+ public
+ //TextTime: integer;
+
+ //StaticP1: integer;
+ //StaticP1ScoreBG: integer;
+ //TextP1: integer;
+ //TextP1Score: integer;
+
+ //StaticP2R: integer;
+ //StaticP2RScoreBG: integer;
+ //TextP2R: integer;
+ //TextP2RScore: integer;
+
+ //StaticP2M: integer;
+ //StaticP2MScoreBG: integer;
+ //TextP2M: integer;
+ //TextP2MScore: integer;
+
+ //StaticP3R: integer;
+ //StaticP3RScoreBG: integer;
+ //TextP3R: integer;
+ //TextP3RScore: integer;
+
+ //Tex_Background: TTexture;
+ //FadeOut: boolean;
+ //LyricMain: TLyric;
+ //LyricSub: TLyric;
+ Winner: Byte; //Who Wins
+ PlayerInfo: TPlayerInfo;
+ TeamInfo: TTeamInfo;
+
+ constructor Create; override;
+ procedure onShow; override;
+ //procedure onShowFinish; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ function Draw: boolean; override;
+ procedure Finish; override;
+ //procedure UpdateLCD;
+ //procedure Pause; //Pause Mod(Toggles Pause)
+ end;
+
+//Procedured for Plugin
+function LoadTex (const Name, Typ: PChar): TsmallTexture; stdcall;
+//function Translate (const Name: PChar): PChar; stdcall;
+procedure Print (const Style, Size: Byte; const X, Y: Real; const Text: PChar); stdcall; //Procedure to Print Text
+function LoadSound (const Name: PChar): Cardinal; stdcall; //Procedure that loads a Custom Sound
+procedure PlaySound (const Index: Cardinal); stdcall; //Plays a Custom Sound
+
+//Utilys
+function ToSentences(Const Czeski: TCzesci): TSentences;
+
+implementation
+uses UGraphic, UPartyM2, UParty, UDraw, UMain, Classes, URecord, ULanguage, math, UDLLManager, USkins, UGraphicClasses;
+
+// Method for input parsing. If False is returned, GetNextWindow
+// should be checked to know the next window to load;
+function TScreenSingModi.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+var
+ I: integer;
+
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ if ScreenSong.PartyMedley then
+ begin
+ PlaylistMedley.CurrentMedleySong:=PlaylistMedley.NumMedleySongs+1;
+ Finish;
+ Music.PlayBack;
+
+ for I := 0 to PlayersPlay-1 do //TODO: leave all this?
+ begin
+ Player[I].ScoreTotalI := PlaylistMedley.Stats[Length(PlaylistMedley.Stats)-1].Player[I].ScoreTotalI;
+ if(ScreenSong.Mode=smChallenge) then
+ TeamInfo.TeamInfo[I].Score:=Player[I].ScoreTotalI;
+ end;
+
+ {if ScreenSong.Mode=smChallenge then
+ begin
+ PartySessionM2.Teams:=TeamInfo;
+ PartySessionM2.EndRound;
+ end;}
+
+ if ScreenSong.Mode = smChallenge then
+ FadeTo(@ScreenScore)
+ else
+ FadeTo(@ScreenPartyScore);
+
+ end else
+ begin
+ Finish;
+ Music.PlayBack;
+
+ if (ScreenSong.Mode=smParty) then
+ FadeTo(@ScreenPartyScore)
+ else
+ FadeTo(@ScreenScore);
+ end;
+ end;
+
+ else
+ Result := inherited ParseInput(PressedKey, ScanCode, PressedDown);
+ end;
+ end;
+end;
+
+constructor TScreenSingModi.Create;
+begin
+ inherited Create;
+
+end;
+
+function ToSentences(Const Czeski: TCzesci): TSentences;
+var
+ I, J: Integer;
+begin
+ Result.Akt := Czeski.Akt;
+ Result.High := Czeski.High;
+ Result.Ilosc := Czeski.Ilosc;
+ Result.Resolution := Czeski.Resolution;
+ Result.NotesGAP := Czeski.NotesGAP;
+ Result.TotalLength := Czeski.Wartosc;
+
+ SetLength(Result.Sentence, Length(Czeski.Czesc));
+ for I := low(Result.Sentence) to high(Result.Sentence) do
+ begin
+ Result.Sentence[I].Start := Czeski.Czesc[I].Start;
+ Result.Sentence[I].StartNote := Czeski.Czesc[I].StartNote;
+ Result.Sentence[I].Lyric := Czeski.Czesc[I].Lyric;
+ Result.Sentence[I].LyricWidth := Czeski.Czesc[I].LyricWidth;
+ Result.Sentence[I].Koniec := Czeski.Czesc[I].Koniec;
+ Result.Sentence[I].BaseNote := Czeski.Czesc[I].BaseNote;
+ Result.Sentence[I].HighNote := Czeski.Czesc[I].HighNut;
+ Result.Sentence[I].IlNut := Czeski.Czesc[I].IlNut;
+ Result.Sentence[I].TotalNotes := Czeski.Czesc[I].TotalNotes;
+
+ SetLength(Result.Sentence[I].Note, Length(Czeski.Czesc[I].Nuta));
+ for J := low(Result.Sentence[I].Note) to high(Result.Sentence[I].Note) do
+ begin
+ Result.Sentence[I].Note[J].Color := Czeski.Czesc[I].Nuta[J].Color;
+ Result.Sentence[I].Note[J].Start := Czeski.Czesc[I].Nuta[J].Start;
+ Result.Sentence[I].Note[J].Length := Czeski.Czesc[I].Nuta[J].Dlugosc;
+ Result.Sentence[I].Note[J].Ton := Czeski.Czesc[I].Nuta[J].Ton;
+ Result.Sentence[I].Note[J].TonGamy := Czeski.Czesc[I].Nuta[J].TonGamy;
+ //Result.Sentence[I].Note[J].Text := Czeski.Czesc[I].Nuta[J].Tekst;
+ Result.Sentence[I].Note[J].FreeStyle := Czeski.Czesc[I].Nuta[J].FreeStyle;
+ Result.Sentence[I].Note[J].Typ := Czeski.Czesc[I].Nuta[J].Wartosc;
+ end;
+ end;
+end;
+
+procedure TScreenSingModi.onShow;
+var
+ I: Integer;
+begin
+ PlayersPlay := TeamInfo.NumTeams;
+
+ if DLLMan.Selected.LoadSong then //Start with Song
+ begin
+ inherited;
+ end
+ else //Start Without Song
+ begin
+ Music.CaptureStart;
+ end;
+
+//Set Playerinfo
+ PlayerInfo.NumPlayers := PlayersPlay;
+ for I := 0 to PlayerInfo.NumPlayers-1 do
+ begin
+ if (ScreenSong.Mode=smChallenge) then
+ Ini.Name[I] := TeamInfo.TeamInfo[I].Playerinfo[TeamInfo.TeamInfo[I].CurPlayer].Name;
+ PlayerInfo.Playerinfo[I].Name := PChar(Ini.Name[I]);
+ PlayerInfo.Playerinfo[I].Score:= 0;
+ PlayerInfo.Playerinfo[I].Bar := 50;
+ PlayerInfo.Playerinfo[I].Enabled := True;
+ end;
+
+ for I := PlayerInfo.NumPlayers to high(PlayerInfo.Playerinfo) do
+ begin
+ PlayerInfo.Playerinfo[I].Score:= 0;
+ PlayerInfo.Playerinfo[I].Bar := 0;
+ PlayerInfo.Playerinfo[I].Enabled := False;
+ end;
+
+ Case PlayersPlay of
+ 1: begin
+ PlayerInfo.Playerinfo[0].PosX := Static[StaticP1ScoreBG].Texture.X;
+ PlayerInfo.Playerinfo[0].PosY := Static[StaticP1ScoreBG].Texture.Y + Static[StaticP1ScoreBG].Texture.H;
+ end;
+ 2,4: begin
+ PlayerInfo.Playerinfo[0].PosX := Static[StaticP1TwoPScoreBG].Texture.X;
+ PlayerInfo.Playerinfo[0].PosY := Static[StaticP1TwoPScoreBG].Texture.Y + Static[StaticP1TwoPScoreBG].Texture.H;
+ PlayerInfo.Playerinfo[2].PosX := Static[StaticP1TwoPScoreBG].Texture.X;
+ PlayerInfo.Playerinfo[2].PosY := Static[StaticP1TwoPScoreBG].Texture.Y + Static[StaticP1TwoPScoreBG].Texture.H;
+ PlayerInfo.Playerinfo[1].PosX := Static[StaticP2RScoreBG].Texture.X;
+ PlayerInfo.Playerinfo[1].PosY := Static[StaticP2RScoreBG].Texture.Y + Static[StaticP2RScoreBG].Texture.H;
+ PlayerInfo.Playerinfo[3].PosX := Static[StaticP2RScoreBG].Texture.X;
+ PlayerInfo.Playerinfo[3].PosY := Static[StaticP2RScoreBG].Texture.Y + Static[StaticP2RScoreBG].Texture.H;
+ end;
+ 3,6: begin
+ PlayerInfo.Playerinfo[0].PosX := Static[StaticP1ThreePScoreBG].Texture.X;
+ PlayerInfo.Playerinfo[0].PosY := Static[StaticP1ThreePScoreBG].Texture.Y + Static[StaticP1ThreePScoreBG].Texture.H;
+ PlayerInfo.Playerinfo[3].PosX := Static[StaticP1ThreePScoreBG].Texture.X;
+ PlayerInfo.Playerinfo[3].PosY := Static[StaticP1ThreePScoreBG].Texture.Y + Static[StaticP1ThreePScoreBG].Texture.H;
+ PlayerInfo.Playerinfo[1].PosX := Static[StaticP2MScoreBG].Texture.X;
+ PlayerInfo.Playerinfo[1].PosY := Static[StaticP2MScoreBG].Texture.Y + Static[StaticP2MScoreBG].Texture.H;
+ PlayerInfo.Playerinfo[4].PosX := Static[StaticP2MScoreBG].Texture.X;
+ PlayerInfo.Playerinfo[4].PosY := Static[StaticP2MScoreBG].Texture.Y + Static[StaticP2MScoreBG].Texture.H;
+ PlayerInfo.Playerinfo[2].PosX := Static[StaticP3RScoreBG].Texture.X;
+ PlayerInfo.Playerinfo[2].PosY := Static[StaticP3RScoreBG].Texture.Y + Static[StaticP3RScoreBG].Texture.H;
+ PlayerInfo.Playerinfo[5].PosX := Static[StaticP3RScoreBG].Texture.X;
+ PlayerInfo.Playerinfo[5].PosY := Static[StaticP3RScoreBG].Texture.Y + Static[StaticP3RScoreBG].Texture.H;
+ end;
+ end;
+
+ // play music (I)
+ //Music.CaptureStart;
+ //Music.MoveTo(AktSong.Start);
+
+ //Init Plugin
+ if not DLLMan.PluginInit(TeamInfo, PlayerInfo, ToSentences(Czesci[0]), LoadTex, Print, LoadSound, PlaySound) then
+ begin
+ //Fehler
+ Log.LogError('Could not Init Plugin');
+ Halt;
+ end;
+
+ // Set Background (Little Workaround, maybe change sometime)
+ if (DLLMan.Selected.LoadBack) AND (DLLMan.Selected.LoadSong) then
+ ScreenSing.Tex_Background := Tex_Background;
+
+ Winner := 0;
+
+ //Set Score Visibility
+ if PlayersPlay = 1 then begin
+ Text[TextP1Score].Visible := DLLMan.Selected.ShowScore;
+ Static[StaticP1ScoreBG].Visible := DLLMan.Selected.ShowScore;
+ end;
+
+ if (PlayersPlay = 2) OR (PlayersPlay = 4) then begin
+ Text[TextP1TwoPScore].Visible := DLLMan.Selected.ShowScore;
+ Static[StaticP1TwoPScoreBG].Visible := DLLMan.Selected.ShowScore;
+
+ Text[TextP2RScore].Visible := DLLMan.Selected.ShowScore;
+ Static[StaticP2RScoreBG].Visible := DLLMan.Selected.ShowScore;
+ end;
+
+ if (PlayersPlay = 3) OR (PlayersPlay = 6) then begin
+ Text[TextP1ThreePScore].Visible := DLLMan.Selected.ShowScore;
+ Static[StaticP1ThreePScoreBG].Visible := DLLMan.Selected.ShowScore;
+
+ Text[TextP2MScore].Visible := DLLMan.Selected.ShowScore;
+ Static[StaticP2MScoreBG].Visible := DLLMan.Selected.ShowScore;
+
+ Text[TextP3RScore].Visible := DLLMan.Selected.ShowScore;
+ Static[StaticP3RScoreBG].Visible := DLLMan.Selected.ShowScore;
+ end;
+end;
+
+function TScreenSingModi.Draw: boolean;
+var
+ Min: integer;
+ Sec: integer;
+ Tekst: string;
+ S, I: integer;
+ T: integer;
+ lastLine, LastWord: integer;
+ medley_end: boolean;
+ medley_start_applause: boolean;
+ CurTime: real;
+begin
+ //Aspect
+ if AspectHandler.changed and (Czas.Teraz>AspectHandler.change_time + 3) then
+ begin
+ AspectHandler.changed:=false;
+ Text[VideoAspectText].Visible := false;
+ Static[VideoAspectStatic].Visible := false;
+ end;
+
+ // Set Background (Little Workaround, maybe change sometime)
+ if (DLLMan.Selected.LoadBack) AND (DLLMan.Selected.LoadSong) then
+ ScreenSing.Tex_Background := Tex_Background;
+
+//Set Playerinfo
+ PlayerInfo.NumPlayers := PlayersPlay;
+ for I := 0 to PlayerInfo.NumPlayers-1 do
+ begin
+ PlayerInfo.Playerinfo[I].Name := PChar(Player[I].Name);
+ if PlayerInfo.Playerinfo[I].Enabled then
+ begin
+ if (Player[I].ScoreTotalI<=10000) then
+ PlayerInfo.Playerinfo[I].Score:= Player[I].ScoreTotalI;
+ PlayerInfo.Playerinfo[I].Bar := Player[I].ScorePercent;
+ end;
+ end;
+
+//Show Score
+if DLLMan.Selected.ShowScore then
+begin
+ //ScoreBG Mod
+ // set player colors
+ if PlayersPlay = 4 then begin
+ if ScreenAct = 1 then begin
+ LoadColor(Static[StaticP1TwoP].Texture.ColR, Static[StaticP1TwoP].Texture.ColG,
+ Static[StaticP1TwoP].Texture.ColB, 'P1Dark');
+ LoadColor(Static[StaticP2R].Texture.ColR, Static[StaticP2R].Texture.ColG,
+ Static[StaticP2R].Texture.ColB, 'P2Dark');
+
+
+
+ LoadColor(Static[StaticP1TwoPScoreBG].Texture.ColR, Static[StaticP1TwoPScoreBG].Texture.ColG,
+ Static[StaticP1TwoPScoreBG].Texture.ColB, 'P1Dark');
+ LoadColor(Static[StaticP2RScoreBG].Texture.ColR, Static[StaticP2RScoreBG].Texture.ColG,
+ Static[StaticP2RScoreBG].Texture.ColB, 'P2Dark');
+
+
+
+ end;
+ if ScreenAct = 2 then begin
+ LoadColor(Static[StaticP1TwoP].Texture.ColR, Static[StaticP1TwoP].Texture.ColG,
+ Static[StaticP1TwoP].Texture.ColB, 'P3Dark');
+ LoadColor(Static[StaticP2R].Texture.ColR, Static[StaticP2R].Texture.ColG,
+ Static[StaticP2R].Texture.ColB, 'P4Dark');
+
+
+
+ LoadColor(Static[StaticP1TwoPScoreBG].Texture.ColR, Static[StaticP1TwoPScoreBG].Texture.ColG,
+ Static[StaticP1TwoPScoreBG].Texture.ColB, 'P3Dark');
+ LoadColor(Static[StaticP2RScoreBG].Texture.ColR, Static[StaticP2RScoreBG].Texture.ColG,
+ Static[StaticP2RScoreBG].Texture.ColB, 'P4Dark');
+
+
+
+ end;
+ end;
+
+ if PlayersPlay = 6 then begin
+ if ScreenAct = 1 then begin
+ LoadColor(Static[StaticP1ThreeP].Texture.ColR, Static[StaticP1ThreeP].Texture.ColG,
+ Static[StaticP1ThreeP].Texture.ColB, 'P1Dark');
+ LoadColor(Static[StaticP2M].Texture.ColR, Static[StaticP2M].Texture.ColG,
+ Static[StaticP2R].Texture.ColB, 'P2Dark');
+ LoadColor(Static[StaticP3R].Texture.ColR, Static[StaticP3R].Texture.ColG,
+ Static[StaticP3R].Texture.ColB, 'P3Dark');
+
+
+
+ LoadColor(Static[StaticP1ThreePScoreBG].Texture.ColR, Static[StaticP1ThreePScoreBG].Texture.ColG,
+ Static[StaticP1ThreePScoreBG].Texture.ColB, 'P1Dark');
+ LoadColor(Static[StaticP2MScoreBG].Texture.ColR, Static[StaticP2MScoreBG].Texture.ColG,
+ Static[StaticP2RScoreBG].Texture.ColB, 'P2Dark');
+ LoadColor(Static[StaticP3RScoreBG].Texture.ColR, Static[StaticP3RScoreBG].Texture.ColG,
+ Static[StaticP3RScoreBG].Texture.ColB, 'P3Dark');
+
+
+
+ end;
+ if ScreenAct = 2 then begin
+ LoadColor(Static[StaticP1ThreeP].Texture.ColR, Static[StaticP1ThreeP].Texture.ColG,
+ Static[StaticP1ThreeP].Texture.ColB, 'P4Dark');
+ LoadColor(Static[StaticP2M].Texture.ColR, Static[StaticP2M].Texture.ColG,
+ Static[StaticP2R].Texture.ColB, 'P5Dark');
+ LoadColor(Static[StaticP3R].Texture.ColR, Static[StaticP3R].Texture.ColG,
+ Static[StaticP3R].Texture.ColB, 'P6Dark');
+
+
+
+
+ LoadColor(Static[StaticP1ThreePScoreBG].Texture.ColR, Static[StaticP1ThreePScoreBG].Texture.ColG,
+ Static[StaticP1ThreePScoreBG].Texture.ColB, 'P4Dark');
+ LoadColor(Static[StaticP2MScoreBG].Texture.ColR, Static[StaticP2MScoreBG].Texture.ColG,
+ Static[StaticP2RScoreBG].Texture.ColB, 'P5Dark');
+ LoadColor(Static[StaticP3RScoreBG].Texture.ColR, Static[StaticP3RScoreBG].Texture.ColG,
+ Static[StaticP3RScoreBG].Texture.ColB, 'P6Dark');
+
+
+
+
+ end;
+ end;
+ //end ScoreBG Mod
+
+// set player names (for 2 screens and only Singstar skin)
+ if ScreenAct = 1 then begin
+ Text[TextP1].Text := 'P1';
+ Text[TextP1TwoP].Text := 'P1'; // added for ps3 skin
+ Text[TextP1ThreeP].Text := 'P1'; // added for ps3 skin
+ Text[TextP2R].Text := 'P2';
+ Text[TextP2M].Text := 'P2';
+ Text[TextP3R].Text := 'P3';
+ end;
+
+ if ScreenAct = 2 then begin
+ case PlayersPlay of
+ 4: begin
+ Text[TextP1TwoP].Text := 'P3';
+ Text[TextP2R].Text := 'P4';
+ end;
+ 6: begin
+ Text[TextP1ThreeP].Text := 'P4';
+ Text[TextP2M].Text := 'P5';
+ Text[TextP3R].Text := 'P6';
+ end;
+ end; // case
+ end; // if
+
+
+ // stereo <- and where iss P2M? or P3?
+ Static[StaticP1].Texture.X := Static[StaticP1].Texture.X + 10*ScreenX;
+ Static[StaticP1ScoreBG].Texture.X := Static[StaticP1ScoreBG].Texture.X + 10*ScreenX;
+
+ Text[TextP1].X := Text[TextP1].X + 10*ScreenX;
+ Text[TextP1Score].X := Text[TextP1Score].X + 10*ScreenX;
+
+ Static[StaticP2R].Texture.X := Static[StaticP2R].Texture.X + 10*ScreenX;
+ Static[StaticP2RScoreBG].Texture.X := Static[StaticP2RScoreBG].Texture.X + 10*ScreenX;
+
+ Text[TextP2R].X := Text[TextP2R].X + 10*ScreenX;
+ Text[TextP2RScore].X := Text[TextP2RScore].X + 10*ScreenX;
+
+ // .. and scores
+ if PlayersPlay = 1 then begin
+ Tekst := IntToStr(Player[0].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP1Score].Text := Tekst;
+ end;
+
+ if PlayersPlay = 2 then begin
+ Tekst := IntToStr(Player[0].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP1TwoPScore].Text := Tekst;
+
+ Tekst := IntToStr(Player[1].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP2RScore].Text := Tekst;
+ end;
+
+ if PlayersPlay = 3 then begin
+ Tekst := IntToStr(Player[0].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP1ThreePScore].Text := Tekst;
+
+ Tekst := IntToStr(Player[1].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP2MScore].Text := Tekst;
+
+ Tekst := IntToStr(Player[2].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP3RScore].Text := Tekst;
+ end;
+
+ if PlayersPlay = 4 then begin
+ if ScreenAct = 1 then begin
+ Tekst := IntToStr(Player[0].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP1TwoPScore].Text := Tekst;
+
+ Tekst := IntToStr(Player[1].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP2RScore].Text := Tekst;
+ end;
+ if ScreenAct = 2 then begin
+ Tekst := IntToStr(Player[2].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP1TwoPScore].Text := Tekst;
+
+ Tekst := IntToStr(Player[3].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP2RScore].Text := Tekst;
+ end;
+ end;
+
+ if PlayersPlay = 6 then begin
+ if ScreenAct = 1 then begin
+ Tekst := IntToStr(Player[0].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP1ThreePScore].Text := Tekst;
+
+ Tekst := IntToStr(Player[1].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP2MScore].Text := Tekst;
+
+ Tekst := IntToStr(Player[2].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP3RScore].Text := Tekst;
+ end;
+ if ScreenAct = 2 then begin
+ Tekst := IntToStr(Player[3].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP1ThreePScore].Text := Tekst;
+
+ Tekst := IntToStr(Player[4].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP2MScore].Text := Tekst;
+
+ Tekst := IntToStr(Player[5].ScoreTotalI);
+ while Length(Tekst) < 5 do Tekst := '0' + Tekst;
+ Text[TextP3RScore].Text := Tekst;
+ end;
+ end;
+
+end; //ShowScore
+
+ for S := 1 to 1 do
+ Static[S].Texture.X := Static[S].Texture.X + 10*ScreenX;
+
+ for T := 0 to 1 do
+ Text[T].X := Text[T].X + 10*ScreenX;
+
+if DLLMan.Selected.LoadSong then
+begin
+ // update static menu with time ...
+ CurTime := Czas.Razem - Czas.Teraz;
+
+ // update static menu with time ...
+ if ScreenSong.PartyMedley then
+ CurTime := MedleyEnd - Czas.Teraz
+ else
+ CurTime := Czas.Razem - Czas.Teraz ;
+
+ Min := Round(CurTime) div 60;
+ Sec := Round(CurTime) mod 60;
+ Text[TextTimeText].Text := '';
+ if Min < 10 then Text[TextTimeText].Text := '0';
+ Text[TextTimeText].Text := Text[TextTimeText].Text + IntToStr(Min) + ':';
+
+ if Sec < 10 then Text[TextTimeText].Text := Text[TextTimeText].Text + '0';
+ Text[TextTimeText].Text := Text[TextTimeText].Text + IntToStr(Sec);
+end;
+
+ lastLine := Length(Czesci[0].Czesc)-1;
+ lastWord := Length(Czesci[0].Czesc[lastLine].Nuta)-1;
+ if (Czas.AktBeat>(Czesci[0].Czesc[lastLine].Nuta[lastWord].Start+
+ Czesci[0].Czesc[lastLine].Nuta[lastWord].Dlugosc)) then
+ ScreenSong.SungToEnd := true
+ else
+ ScreenSong.SungToEnd := false;
+
+ // for medley-mode:
+ CurTime := Czas.Teraz;
+ if ScreenSong.PartyMedley and (CurTime > MedleyEnd) then
+ medley_end := true
+ else
+ medley_end := false;
+
+ if ScreenSong.PartyMedley and (CurTime >
+ GetTimeFromBeat(AktSong.Medley.EndBeat)) then
+ medley_start_applause := true
+ else
+ medley_start_applause := false;
+
+ // draw static menu (BG)
+ DrawBG;
+
+ //Draw Background
+ if (DllMan.Selected.LoadSong) AND (DllMan.Selected.LoadBack) then
+ SingDrawBackground;
+
+ // update and draw movie
+ if ShowFinish and AktSong.VideoLoaded AND DllMan.Selected.LoadVideo then
+ begin
+ acGetFrame(Czas.Teraz);
+ acDrawGL(ScreenAct); // this only draws
+ end;
+
+ // draw static menu (FG)
+ DrawFG;
+
+ //Medley Countdown
+ if ScreenSong.PartyMedley then
+ DrawMedleyCountdown;
+
+ if ShowFinish and DllMan.Selected.LoadSong then
+ begin
+ if (not Music.Finished) and (not medley_end or not ScreenSong.PartyMedley)
+ and ((AktSong.Finish = 0) or (CurTime*1000 <= AktSong.Finish)) then
+ begin
+ //Pause Mod:
+ if not Paused then
+ begin
+ Sing(Self); // analyze song
+ //Update Medley Stats
+ if ScreenSong.PartyMedley and not FadeOut then
+ UpdateMedleyStats(medley_start_applause);
+ end;
+ end else
+ begin
+ if not FadeOut then
+ begin
+ Finish;
+ if not ScreenSong.PartyMedley then
+ begin
+ FadeOut := true;
+ if (ScreenSong.Mode=smParty) then
+ FadeTo(@ScreenPartyScore)
+ else
+ FadeTo(@ScreenScore);
+ end;
+ end;
+ end;
+ end;
+
+ // draw custom items
+ SingModiDraw(PlayerInfo); // always draw
+
+ //GoldenNoteStarsTwinkle Mod
+ GoldenRec.SpawnRec;
+ //GoldenNoteStarsTwinkle Mod
+
+ //Update PlayerInfo
+ for I := 0 to PlayerInfo.NumPlayers-1 do
+ begin
+ if PlayerInfo.Playerinfo[I].Enabled then
+ begin
+ PlayerInfo.Playerinfo[I].Bar := Player[I].ScorePercent;
+ PlayerInfo.Playerinfo[I].Score := Player[I].ScoreTotalI;
+ end;
+ end;
+
+ if ((ShowFinish) AND (NOT Paused)) then
+ begin
+ if not DLLMan.PluginDraw(Playerinfo, Czesci[0].Akt) then
+ begin
+ if not FadeOut then
+ begin
+ Finish;
+ if not ScreenSong.PartyMedley then
+ begin
+ FadeOut := true;
+ if (ScreenSong.Mode=smParty) then
+ FadeTo(@ScreenPartyScore)
+ else
+ FadeTo(@ScreenScore);
+ end;
+ end;
+ end;
+ end;
+
+ //Change PlayerInfo/Changeables
+ for I := 0 to PlayerInfo.NumPlayers-1 do
+ begin
+ if (Player[I].ScoreTotalI <> PlayerInfo.Playerinfo[I].Score) then
+ begin
+ //Player[I].ScoreTotal := Player[I].ScoreTotal + (PlayerInfo.Playerinfo[I].Score - Player[I].ScoreTotalI);
+ Player[I].ScoreTotalI := PlayerInfo.Playerinfo[I].Score;
+ end;
+ if (PlayerInfo.Playerinfo[I].Bar <> Player[I].ScorePercent) then
+ Player[I].ScorePercentTarget := PlayerInfo.Playerinfo[I].Bar;
+ end;
+
+ // back stereo
+ Static[StaticP1].Texture.X := Static[StaticP1].Texture.X - 10*ScreenX;
+ Static[StaticP1ScoreBG].Texture.X := Static[StaticP1ScoreBG].Texture.X - 10*ScreenX;
+
+ Text[TextP1].X := Text[TextP1].X - 10*ScreenX;
+ Text[TextP1Score].X := Text[TextP1Score].X - 10*ScreenX;
+
+
+ Static[StaticP2R].Texture.X := Static[StaticP2R].Texture.X - 10*ScreenX;
+ Static[StaticP2RScoreBG].Texture.X := Static[StaticP2RScoreBG].Texture.X - 10*ScreenX;
+
+ Text[TextP2R].X := Text[TextP2R].X - 10*ScreenX;
+ Text[TextP2RScore].X := Text[TextP2RScore].X - 10*ScreenX;
+
+
+ for S := 1 to 1 do
+ Static[S].Texture.X := Static[S].Texture.X - 10*ScreenX;
+
+ for T := 0 to 1 do
+ Text[T].X := Text[T].X - 10*ScreenX;
+
+ //Aspect
+ if AspectHandler.changed and (Czas.Teraz>AspectHandler.change_time + 3) then
+ begin
+ AspectHandler.changed:=false;
+ Text[VideoAspectText].Visible := false;
+ Static[VideoAspectStatic].Visible := false;
+ end;
+
+ //Medley
+ if MedleyHandler.changed and (Czas.Teraz>MedleyHandler.change_time + AktSong.Medley.FadeIn_time) then
+ begin
+ MedleyHandler.changed:=false;
+ Static[SongNameStatic].Visible := false;
+ Text[SongNameText].Visible := false;
+ end;
+
+ if ((ScreenSong.Mode=smParty) and
+ (DLLMan.Plugins[PartySession.Rounds[PartySession.CurRound].Plugin].Name='PLUGIN_HAUDENLUKAS_NAME')) or
+ ((ScreenSong.Mode=smChallenge) and
+ (DLLMan.Plugins[PartySessionM2.Rounds[PartySessionM2.CurRound].Plugin].Name='PLUGIN_HAUDENLUKAS_NAME')) then
+ begin
+
+ end;
+
+end;
+
+procedure TScreenSingModi.Finish;
+begin
+ inherited Finish;
+
+ Winner := DllMan.PluginFinish(PlayerInfo);
+
+ //Log.LogError('Winner: ' + InttoStr(Winner));
+
+ //DLLMan.UnLoadPlugin;
+end;
+
+function LoadTex (const Name, Typ: PChar): TsmallTexture; stdcall;
+var
+ Texname, EXT: String;
+ Tex: TTexture;
+begin
+ //Get texture Name
+ TexName := Skin.GetTextureFileName(String(Name));
+ //Get File Typ
+ Ext := ExtractFileExt(TexName);
+ if (uppercase(Ext) = '.JPG') then
+ Ext := 'JPG'
+ else
+ Ext := 'BMP';
+
+ Tex := Texture.LoadTexture(PChar(TexName), PChar(Ext), Typ, 0);
+
+ Result.TexNum := Tex.TexNum;
+ Result.W := Tex.W;
+ Result.H := Tex.H;
+end;
+{
+function Translate (const Name: PChar): PChar; stdcall;
+begin
+ Result := PChar(Language.Translate(String(Name)));
+end; }
+
+procedure Print (const Style, Size: Byte; const X, Y: Real; const Text: PChar); stdcall; //Procedure to Print Text
+begin
+ SetFontItalic ((Style and 128) = 128);
+ SetFontStyle(Style and 7);
+ SetFontSize(Size);
+ SetFontPos (X, Y);
+ glPrint (PChar(Language.Translate(String(Text))));
+end;
+
+function LoadSound (const Name: PChar): Cardinal; stdcall; //Procedure that loads a Custom Sound
+begin
+ Result := Music.LoadCustomSound(String(Name));
+end;
+
+procedure PlaySound (const Index: Cardinal); stdcall; //Plays a Custom Sound
+begin
+ Music.PlayCustomSound(Index);
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenSong.pas b/Game/Code/Screens/UScreenSong.pas
new file mode 100644
index 00000000..a6908278
--- /dev/null
+++ b/Game/Code/Screens/UScreenSong.pas
@@ -0,0 +1,3133 @@
+unit UScreenSong;
+
+interface
+
+uses
+ UMenu, TextGL, SDL, UMusic, UFiles, UTime, UDisplay, USongs, SysUtils, ULog, UThemes, UTexture, ULanguage,
+ ULCD, ULight, UIni, UVideo;
+
+type
+ TVisArr = array of integer;
+
+ TVidVis = (none, windowed, full);
+
+ THandler = record
+ changed: boolean;
+ change_time: real;
+ end;
+
+ TScreenSong = class(TMenu)
+ private
+ SkippedSongs: array of integer; //for M2-MOD
+ ChooseableSongs: integer; //for M2-MOD
+
+ public
+ TextArtist: integer;
+ TextTitle: integer;
+ TextNumber: integer;
+
+ TextPlugin: integer;
+ TextP1: integer; //for M2-MOD: show actual player-name p1
+ TextP2: integer; //for M2-MOD: show actual player-name p2
+
+ TextMedley: array[1..4] of integer;
+
+ FoundCAT: boolean; //for M2-MOD: a cat is chosen, see whats next...
+
+ SongIndex: integer; //Index of Song that is playing since UScreenScore...
+
+ //Video Icon Mod
+ VideoIcon: Cardinal;
+
+ VidVis: TVidVis; //video visiability
+ StartTry: boolean;
+
+ MinSource: TMedleySource;
+
+ MakeMedley: boolean;
+
+ //VideoAspect
+ AspectHandler: THandler;
+
+ //Medley Icons
+ MedleyIcon: cardinal;
+ CalcMedleyIcon: cardinal;
+
+ TextCat: integer;
+ StaticCat: integer;
+
+ SongCurrent: real;
+ SongTarget: real;
+
+ HighSpeed: boolean;
+ CoverFull: boolean;
+ CoverTime: real;
+ CoverX: integer;
+ CoverY: integer;
+ CoverW: integer;
+ is_jump: boolean; // Jump to Song Mod
+ is_jump_title:boolean; //Jump to SOng MOd-YTrue if search for Title
+
+ EqualizerBands: array of Byte;
+ EqualizerTime: Cardinal;
+ EqualizerTime2: Byte;
+
+ ID: string; //for help-system
+
+ //Party Mod
+ Mode: TSongMode; //0 = Standard, 1= Go to PartyMode after Selection + Change to Random Song at Show
+ //2 = M2-Mode, 3=Medley-Mode
+ PartyMedley: boolean;
+
+ SungToEnd: boolean; //Song was sung to the end?
+
+ //party Statics (Joker)
+ StaticTeam1Joker1: Cardinal;
+ StaticTeam1Joker2: Cardinal;
+ StaticTeam1Joker3: Cardinal;
+ StaticTeam1Joker4: Cardinal;
+ StaticTeam1Joker5: Cardinal;
+
+ StaticTeam2Joker1: Cardinal;
+ StaticTeam2Joker2: Cardinal;
+ StaticTeam2Joker3: Cardinal;
+ StaticTeam2Joker4: Cardinal;
+ StaticTeam2Joker5: Cardinal;
+
+ StaticTeam3Joker1: Cardinal;
+ StaticTeam3Joker2: Cardinal;
+ StaticTeam3Joker3: Cardinal;
+ StaticTeam3Joker4: Cardinal;
+ StaticTeam3Joker5: Cardinal;
+
+ TextNumJokerTeam1: Cardinal;
+ TextNumJokerTeam2: Cardinal;
+ TextNumJokerTeam3: Cardinal;
+
+ StaticParty: Array of Cardinal;
+ TextParty: Array of Cardinal;
+ StaticNonParty: Array of Cardinal;
+ TextNonParty: Array of Cardinal;
+ StaticM2Party: Array of Cardinal;
+ TextM2Party: Array of Cardinal;
+
+
+ constructor Create; override;
+ procedure SetScroll;
+ procedure SetScroll1;
+ procedure SetScroll2;
+ procedure SetScroll3;
+ procedure SetScroll4;
+ procedure SetScroll5;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ function Draw: boolean; override;
+ procedure onShow; override;
+ procedure onHide; override;
+ procedure SelectNext;
+ procedure SelectPrev;
+ procedure UpdateLCD;
+ procedure SkipTo(Target: Cardinal);
+ procedure RandomSongChallenge();
+ procedure SkipTo2(Target: Cardinal); //skipt exactly to the target song nr.
+ procedure FixSelected; //Show Wrong Song when Tabs on Fix
+ procedure FixSelected2; //Show Wrong Song when Tabs on Fix
+ procedure ShowCatTL(Cat: Integer);// Show Cat in Top left
+ procedure ShowCatTLCustom(Caption: String);// Show Custom Text in Top left
+ procedure HideCatTL;// Show Cat in Tob left
+ procedure Refresh; //Refresh Song Sorting
+ procedure DrawEqualizer;
+ procedure ChangeMusic;
+ procedure StartVideoPreview;
+ //Party Mode
+ procedure SelectRandomSong;
+ procedure SetJoker;
+ procedure SetStatics;
+ //procedures for Menu
+ procedure StartSong;
+ procedure OpenEditor;
+ procedure DoJoker(Team: Byte; SDL_ModState: Word);
+ procedure SelectPlayers;
+
+ procedure UnLoadDetailedCover;
+
+ //Extensions
+ procedure DrawExtensions;
+
+ //for M2-MOD:
+ function SongSkipped(SongNr: integer): boolean;
+ function GetSongsSkipped(): Integer;
+ procedure DoJokerM2;
+ function getVisibleMedleyArr(MinS: TMedleySource): TVisArr;
+ procedure StartMedley(num: integer; MinS: TMedleySource);
+ procedure DrawAspect;
+ end;
+
+implementation
+uses UGraphic, UMain,
+ UCovers,
+ math,
+ gl,
+ Windows,
+ USkins,
+ UHelp,
+ UDLLManager, UDataBase, UParty, UPartyM2, UPlaylist, UScreenSongMenu;
+
+// ***** Public methods ****** //
+function TScreenSong.SongSkipped(SongNr: integer): boolean;
+var
+ i: integer;
+ skipped :boolean;
+begin
+ skipped := false;
+ for i := 0 to Length(SkippedSongs) - 1 do
+ begin
+ if (SongNr=SkippedSongs[i]) then
+ begin
+ skipped:=true;
+ break;
+ end;
+ end;
+ Result:=skipped;
+end;
+
+function TScreenSong.GetSongsSkipped(): Integer;
+begin
+ Result := Length(SkippedSongs);
+end;
+
+//Show Wrong Song when Tabs on Fix
+procedure TScreenSong.FixSelected;
+var I, I2: Integer;
+ begin
+ if CatSongs.VisibleSongs > 0 then
+ begin
+ I2:= 0;
+ for I := low(CatSongs.Song) to High(Catsongs.Song) do
+ begin
+ if CatSongs.Song[I].Visible then
+ inc(I2);
+
+ if I = Interaction - 1 then
+ break;
+ end;
+
+ SongCurrent := I2;
+ SongTarget := I2;
+ end;
+ end;
+
+procedure TScreenSong.FixSelected2;
+var I, I2: Integer;
+ begin
+ if CatSongs.VisibleSongs > 0 then
+ begin
+ I2:= 0;
+ for I := low(CatSongs.Song) to High(Catsongs.Song) do
+ begin
+ if CatSongs.Song[I].Visible then
+ inc(I2);
+
+ if I = Interaction - 1 then
+ break;
+ end;
+
+ SongTarget := I2;
+ end;
+ end;
+//Show Wrong Song when Tabs on Fix End
+
+ procedure TScreenSong.ShowCatTLCustom(Caption: String);// Show Custom Text in Top left
+ begin
+ Text[TextCat].Text := Caption;
+ Text[TextCat].Visible := true;
+ Static[StaticCat].Visible := False;
+ end;
+
+ //Show Cat in Top Left Mod
+ procedure TScreenSong.ShowCatTL(Cat: Integer);
+ begin
+ //Change
+ Text[TextCat].Text := CatSongs.Song[Cat].Artist;
+ //showmessage(CatSongs.Song[Cat].Path + CatSongs.Song[Cat].Cover);
+ //Static[StaticCat].Texture := Texture.GetTexture(Button[Cat].Texture.Name, 'Plain', true);
+
+ Static[StaticCat].Texture := Texture.GetTexture(Button[Cat].Texture.Name, 'Plain', true);
+ //Texture.GetTexture(Button[Cat].Texture.Name, 'Plain', false);
+ //Button[Cat].
+ //Cover
+
+
+ //Show
+ Text[TextCat].Visible := true;
+ Static[StaticCat].Visible := True;
+ end;
+
+ procedure TScreenSong.HideCatTL;
+ begin
+ //Hide
+ //Text[TextCat].Visible := false;
+ Static[StaticCat].Visible := false;
+ //New -> Show Text specified in Theme
+ Text[TextCat].Visible := True;
+ Text[TextCat].Text := Theme.Song.TextCat.Text;
+ end;
+ //Show Cat in Top Left Mod End
+
+
+// Method for input parsing. If False is returned, GetNextWindow
+// should be checked to know the next window to load;
+function TScreenSong.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+var
+ I: integer;
+ I2: integer;
+ HS: integer;
+ SDL_ModState: Word;
+ Letter: Char;
+ VisArr: array of integer;
+begin
+ Result := true;
+
+ //Song Screen Extensions (Jumpto + Menu)
+ if (ScreenSongMenu.Visible) then
+ begin
+ Result := ScreenSongMenu.ParseInput(PressedKey, ScanCode, PressedDown);
+ Exit;
+ end
+ else if (ScreenSongJumpto.Visible) then
+ begin
+ Result := ScreenSongJumpto.ParseInput(PressedKey, ScanCode, PressedDown);
+ Exit;
+ end;
+
+ If (PressedDown) Then
+ begin // Key Down
+
+ SDL_ModState := SDL_GetModState and (KMOD_LSHIFT + KMOD_RSHIFT
+ + KMOD_LCTRL + KMOD_RCTRL + KMOD_LALT + KMOD_RALT);
+
+ //Jump to Artist/Titel (not in party-mode)
+ if (SDL_ModState and KMOD_LALT <> 0) AND (Mode = smNormal) AND (PressedKey >= SDLK_A) AND (PressedKey <= SDLK_Z) then
+ begin
+ Letter := UpCase(Chr(ScanCode));
+ I2 := Length(CatSongs.Song);
+
+ //Jump To Titel
+ if (SDL_ModState = KMOD_LALT or KMOD_LSHIFT) then
+ begin
+ For I := 1 to high(CatSongs.Song) do
+ begin
+ if (CatSongs.Song[(I + Interaction) mod I2].Visible) AND
+ (Length(CatSongs.Song[(I + Interaction) mod I2].Title)>0) AND
+ (UpCase(CatSongs.Song[(I + Interaction) mod I2].Title[1]) = Letter) then
+ begin
+ SkipTo(CatSongs.VisibleIndex((I + Interaction) mod I2));
+
+ Music.PlayChange;
+
+ ChangeMusic;
+ SetScroll4;
+ UpdateLCD;
+ //Break and Exit
+ Exit;
+ end;
+ end;
+ end
+ //Jump to Artist
+ else if (SDL_ModState = KMOD_LALT) then
+ begin
+ For I := 1 to high(CatSongs.Song) do
+ begin
+ if (CatSongs.Song[(I + Interaction) mod I2].Visible) AND (Length(CatSongs.Song[(I + Interaction) mod I2].Artist)>0) AND (UpCase(CatSongs.Song[(I + Interaction) mod I2].Artist[1]) = Letter) then
+ begin
+ SkipTo(CatSongs.VisibleIndex((I + Interaction) mod I2));
+
+ Music.PlayChange;
+
+ ChangeMusic;
+ SetScroll4;
+ UpdateLCD;
+
+ //Break and Exit
+ Exit;
+ end;
+ end;
+ end;
+ Exit;
+ end;
+
+ case PressedKey of
+ SDLK_K:
+ begin
+ if Music.VocalRemoverActivated() then
+ Music.DisableVocalRemover
+ else
+ Music.EnableVocalRemover;
+ end;
+
+ SDLK_A:
+ begin
+ if VidVis = full then
+
+ ToggleAspectCorrection;
+
+ DataBase.SetAspect(CatSongs.Song[Interaction].Artist,
+ CatSongs.Song[Interaction].Title, integer(UVideo.fAspectCorrection));
+
+ AspectHandler.changed := true;
+ AspectHandler.change_time := Czas.Teraz;
+ end;
+ SDLK_V:
+ begin
+ if UVideo.VideoOpened then
+ begin
+ if VidVis=full then
+ VidVis:=windowed
+ else begin
+ VidVis:=full;
+ UVideo.SetAspectCorrection(TAspectCorrection(
+ DataBase.GetAspect(CatSongs.Song[Interaction].Artist,
+ CatSongs.Song[Interaction].Title, Ini.AspectCorrect)));
+ AspectHandler.changed := true;
+ AspectHandler.change_time := Czas.Teraz;
+ end;
+
+ end;
+ end;
+
+ SDLK_TAB:
+ begin
+ Help.SetHelpID(ID);
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+
+ SDLK_S:
+ begin
+ if (SDL_ModState = KMOD_LSHIFT) and not MakeMedley and
+ (CatSongs.Song[Interaction].Medley.Source>=msCalculated) and
+ (Mode = smNormal)then
+ StartMedley(0, msCalculated)
+ else if (CatSongs.Song[Interaction].Medley.Source>=msTag) and not MakeMedley and
+ (Mode = smNormal) then
+ StartMedley(0, msTag);
+ end;
+
+ SDLK_D:
+ begin
+ if (Mode = smNormal) and (SDL_ModState = KMOD_LSHIFT) and not MakeMedley and
+ (length(getVisibleMedleyArr(msCalculated))>0) then
+ StartMedley(5, msCalculated)
+ else if (Mode = smNormal) and (Length(getVisibleMedleyArr(msTag)) > 0)
+ and MakeMedley then
+ StartMedley(5, msTag);
+ end;
+
+ SDLK_F:
+ begin
+ if (Mode = smNormal) and (SDL_ModState = KMOD_LSHIFT) and MakeMedley then
+ begin
+ if Length(PlaylistMedley.Song)>0 then
+ begin
+ SetLength(PlaylistMedley.Song, Length(PlaylistMedley.Song)-1);
+ PlaylistMedley.NumMedleySongs := Length(PlaylistMedley.Song);
+ end;
+
+ if Length(PlaylistMedley.Song)=0 then
+ MakeMedley := false;
+ end else if (Mode = smNormal) and (Length(getVisibleMedleyArr(msCalculated)) > 0) then
+ begin
+ MakeMedley := true;
+ StartMedley(99, msCalculated);
+ end;
+ end;
+
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ if (Mode = smNormal) or ((Mode = smChallenge) and not PartyMedley and not FoundCAT) then
+ begin
+ //On Escape goto Cat-List Hack
+ if (Ini.Tabs_at_startup = 1) AND (CatSongs.CatNumShow <> -1) then
+ begin
+ //Find Category
+ I := Interaction;
+ while not catsongs.Song[I].Main do
+ begin
+ Dec (I);
+ if (I < low(catsongs.Song)) then
+ break;
+ end;
+ if (I<= 1) then
+ Interaction := high(catsongs.Song)
+ else
+ Interaction := I - 1;
+
+ //Stop Music
+ Music.Stop;
+
+ //Stop Video
+ acClose;
+ VidVis := none;
+ CatSongs.ShowCategoryList;
+
+ //Show Cat in Top Left Mod
+ HideCatTL;
+
+
+ //Show Wrong Song when Tabs on Fix
+ SelectNext;
+ FixSelected;
+ //SelectPrev;
+ //CatSongs.Song[0].Visible := False;
+ end
+ else
+ begin
+ //On Escape goto Cat-List Hack End
+ //Tabs off and in Search or Playlist -> Go back to Song view
+ if (CatSongs.CatNumShow < -1) then
+ begin
+ //Atm: Set Empty Filter
+ CatSongs.SetFilter('', 0);
+
+ //Show Cat in Top Left Mod
+ HideCatTL;
+ Interaction := 0;
+
+ //Show Wrong Song when Tabs on Fix
+ SelectNext;
+ FixSelected;
+
+ ChangeMusic;
+ end
+ else if (Mode = smNormal) then
+ begin
+ Music.Stop;
+ Music.PlayBack;
+ acClose;
+ VidVis := none;
+ FadeTo(@ScreenMain);
+ end;
+
+ end;
+ end
+ //When in party Mode then Ask before Close
+ else if (Mode = smParty) then
+ begin
+ Music.PlayBack;
+ CheckFadeTo(@ScreenMain,'MSG_END_PARTY');
+ end;
+ end;
+ SDLK_RETURN:
+ begin
+ if Length(Songs.Song) > 0 then
+ begin
+// PortWriteB($378, 0);
+ if CatSongs.Song[Interaction].Main then
+ begin // clicked on Category Button
+
+ //Show Cat in Top Left Mod
+ ShowCatTL (Interaction);
+
+ //I := CatSongs.VisibleIndex(Interaction);
+ CatSongs.ClickCategoryButton(Interaction);
+ {I2 := CatSongs.VisibleIndex(Interaction);
+ SongCurrent := SongCurrent - I + I2;
+ SongTarget := SongTarget - I + I2; }
+
+// if I<>I2 then beep;
+ // SetScroll4;
+
+ //Show Wrong Song when Tabs on Fix
+ SelectNext;
+ FixSelected;
+
+ //Play Music:
+ ChangeMusic;
+
+ end else
+ begin // clicked on song
+ if (Mode = smNormal) then //Normal Mode -> Start Song
+ begin
+ if MakeMedley then
+ begin
+ Mode := smMedley;
+ Music.Stop;
+ //Do the Action that is specified in Ini
+ case Ini.OnSongClick of
+ 0: FadeTo(@ScreenSing);
+ 1: SelectPlayers;
+ 2: FadeTo(@ScreenSing);
+ end;
+ end else
+ begin
+ //Do the Action that is specified in Ini
+ case Ini.OnSongClick of
+ 0: StartSong;
+ 1: SelectPlayers;
+ 2:begin
+ VidVis := windowed;
+ If (CatSongs.CatNumShow = -3) then
+ ScreenSongMenu.MenuShow(SM_Playlist)
+ else
+ ScreenSongMenu.MenuShow(SM_Main);
+ end;
+ end;
+ end;
+ end
+ else if (Mode = smParty) and not PartyMedley then //PartyMode classic -> Show Menu
+ begin
+ VidVis := windowed;
+ if (Ini.PartyPopup = 1) then
+ ScreenSongMenu.MenuShow(SM_Party_Main)
+ else
+ ScreenSong.StartSong;
+ end else if (Mode = smChallenge) and (ChooseableSongs>0) and
+ not PartyMedley then //PartyMode M2
+ begin
+ PartySessionM2.AddSongPlayed(CatSongs.CatNumShow, Interaction);
+ ScreenSong.StartSong;
+ end else if PartyMedley then
+ begin
+ StartMedley(5, MinSource);
+ end;
+ end;
+ end;
+ end;
+
+ SDLK_M: //Show SongMenu
+ begin
+ if (Length(Songs.Song) > 0) and (Mode <> smChallenge) then begin //not in M2-Mode
+ if (Mode = smNormal) then begin
+ if not CatSongs.Song[Interaction].Main then begin // clicked on Song
+ if CatSongs.CatNumShow = -3 then
+ ScreenSongMenu.MenuShow(SM_Playlist)
+ else
+ ScreenSongMenu.MenuShow(SM_Main);
+ end
+ else
+ begin
+ ScreenSongMenu.MenuShow(SM_Playlist_Load);
+ end;
+ end //Party Mode -> Show Party Menu
+ else ScreenSongMenu.MenuShow(SM_Party_Main);
+ end;
+ end;
+
+ SDLK_P: //Show Playlist Menu
+ begin
+ if (Length(Songs.Song) > 0) AND (Mode = smNormal) then begin //not in party-modes
+ ScreenSongMenu.MenuShow(SM_Playlist_Load);
+ end;
+ end;
+
+ SDLK_J: //Show Jumpto Menu / Joker
+ begin
+ if (Length(Songs.Song) > 0) AND (Mode = smNormal) then //not in party-modes
+ begin
+ VidVis := windowed;
+ ScreenSongJumpto.Visible := True;
+ end else if (Mode=smChallenge) and not PartyMedley then //M2-MOD-mode
+ DoJokerM2
+ else if PartyMedley and (Mode=smChallenge) then
+ begin
+ DoJoker(0, SDL_ModState)
+ end;
+ end;
+
+ SDLK_DOWN:
+ begin
+ if (Mode = smNormal) or ((Mode = smChallenge) and not FoundCAT) then
+ begin
+ //Only Change Cat when not in Playlist or Search Mode
+ if (CatSongs.CatNumShow > -2) then
+ begin
+ //Cat Change Hack
+ if Ini.Tabs_at_startup = 1 then
+ begin
+ I := Interaction;
+ if I <= 0 then I := 1;
+
+ while not catsongs.Song[I].Main do
+ begin
+ Inc (I);
+ if (I > high(catsongs.Song)) then
+ I := low(catsongs.Song);
+ end;
+
+ Interaction := I;
+
+ //Show Cat in Top Left Mod
+ ShowCatTL (Interaction);
+
+ CatSongs.ClickCategoryButton(Interaction);
+ SelectNext;
+ FixSelected;
+
+ //Play Music:
+ Music.PlayChange;
+ ChangeMusic;
+
+ end;
+
+ //
+ //Cat Change Hack End}
+ end;
+ end;
+ end;
+ SDLK_UP:
+ begin
+ if (Mode = smNormal) or ((Mode = smChallenge) and not FoundCAT) then
+ begin
+ //Only Change Cat when not in Playlist or Search Mode
+ if (CatSongs.CatNumShow > -2) then
+ begin
+ //Cat Change Hack
+ if Ini.Tabs_at_startup = 1 then
+ begin
+ I := Interaction;
+ I2 := 0;
+ if I <= 0 then I := 1;
+
+ while not catsongs.Song[I].Main or (I2 = 0) do
+ begin
+ if catsongs.Song[I].Main then
+ Inc(I2);
+ Dec (I);
+ if (I < low(catsongs.Song)) then
+ I := high(catsongs.Song);
+ end;
+
+ Interaction := I;
+
+ //Show Cat in Top Left Mod
+ ShowCatTL (I);
+
+ CatSongs.ClickCategoryButton(I);
+ SelectNext;
+ FixSelected;
+
+ //Play Music:
+ Music.PlayChange;
+ ChangeMusic;
+ end;
+ end;
+ //Cat Change Hack End}
+ end;
+ end;
+
+ SDLK_RIGHT:
+ begin
+ if (Length(Songs.Song) > 0) AND
+ ((Mode = smNormal) or ((Mode = smChallenge) and CatSongs.Song[Interaction].Main)) then
+ begin
+ Music.PlayChange;
+ SelectNext;
+ ChangeMusic;
+ SetScroll4;
+ UpdateLCD;
+ Light.LightOne(1, 200);
+ end;
+ end;
+
+ SDLK_LEFT:
+ begin
+ if (Length(Songs.Song) > 0) AND
+ ((Mode = smNormal) or ((Mode = smChallenge) and CatSongs.Song[Interaction].Main)) then
+ begin
+ Music.PlayChange;
+ SelectPrev;
+ ChangeMusic;
+ SetScroll4;
+ UpdateLCD;
+ Light.LightOne(0, 200);
+ end;
+ end;
+
+ SDLK_E:
+ begin
+ if (Mode = smNormal) then
+ OpenEditor;
+ end;
+
+ SDLK_R:
+ begin
+ if (Length(Songs.Song) > 0) and (Mode = smNormal) then
+ begin
+ if (SDL_ModState = KMOD_LSHIFT) AND (Ini.Tabs_at_startup = 1) then
+ //Random Category
+ begin
+ SetLength(VisArr, 0);
+
+ //Search Cat
+ for I2 := Interaction downto low(CatSongs.Song) do
+ begin
+ if CatSongs.Song[I2].Main then
+ break;
+ end;
+
+ for I := 0 to Length(CatSongs.Song) - 1 do
+ begin
+ if CatSongs.Song[I].Main and not (I=I2) then
+ begin
+ SetLength(VisArr, Length(VisArr)+1);
+ VisArr[Length(VisArr)-1] := I;
+ end;
+ end;
+
+ if (Length(VisArr)>0) then
+ begin
+ I2 := Random(Length(VisArr));
+ I2 := VisArr[I2];
+
+ //Search Cat
+ for I := I2 downto low(CatSongs.Song) do
+ begin
+ if CatSongs.Song[I].Main then
+ break;
+ end;
+ //In I ist jetzt die Kategorie in I2 der Song
+ //I is the CatNum, I2 is the No of the Song within this Cat
+
+ //Choose Cat
+ CatSongs.ShowCategoryList;
+
+ //Show Cat in Top Left Mod
+ ShowCatTL (I);
+
+ //CatSongs.ClickCategoryButton(I);
+ //SelectNext;
+
+ //Choose Song
+ SkipTo2(I);
+ end;
+ end else if (SDL_ModState = KMOD_LCTRL) AND (Ini.Tabs_at_startup = 1) then
+ //random in All Categorys
+ begin
+ SetLength(VisArr, 0);
+
+ for I := 0 to Length(CatSongs.Song) - 1 do
+ begin
+ if not CatSongs.Song[I].Main and (I<>Interaction)then
+ begin
+ SetLength(VisArr, Length(VisArr)+1);
+ VisArr[Length(VisArr)-1] := I;
+ end;
+ end;
+
+
+ if (Length(VisArr)>0) then
+ begin
+ I2 := Random(Length(VisArr));
+ I2 := VisArr[I2];
+
+ //Search Cat
+ for I := I2 downto low(CatSongs.Song) do
+ begin
+ if CatSongs.Song[I].Main then
+ break;
+ end;
+
+ //Choose Cat
+ CatSongs.ShowCategoryList;
+
+ //Show Cat in Top Left Mod
+ ShowCatTL (I);
+
+ CatSongs.ClickCategoryButton(I);
+ //SelectNext;
+
+ //Choose Song
+ SkipTo2(I2);
+ end;
+ end else //Random in one Category
+ begin
+ SetLength(VisArr, 0);
+
+ for I := 0 to Length(CatSongs.Song) - 1 do
+ begin
+ if CatSongs.Song[I].Visible and not (I=Interaction)then
+ begin
+ SetLength(VisArr, Length(VisArr)+1);
+ VisArr[Length(VisArr)-1] := I;
+ end;
+ end;
+
+
+ if (Length(VisArr)>0) then
+ begin
+ I := Random(Length(VisArr));
+ I := VisArr[I];
+
+ //Choose Song
+ SkipTo2(I);
+ end;
+ //old: SkipTo(Random(CatSongs.VisibleSongs));
+ end;
+ Music.PlayChange;
+ ChangeMusic;
+ SetScroll4;
+ end else if (Mode = smChallenge) and not PartyMedley then //M2-MOD-mode
+ DoJokerM2
+ else if (Mode = smChallenge) and PartyMedley then
+ DoJoker(0, SDL_ModState);
+ end;
+
+ SDLK_1:
+ begin //Joker Team 1
+ if (Mode = smParty) AND (PartySession.Teams.NumTeams >= 1) AND (PartySession.Teams.Teaminfo[0].Joker > 0) then
+ begin
+ //Joker spielen
+ DoJoker(0, SDL_ModState);
+ end;
+ end;
+
+ SDLK_2:
+ begin //Joker Team 2
+ if (Mode = smParty) AND (PartySession.Teams.NumTeams >= 2) AND (PartySession.Teams.Teaminfo[1].Joker > 0) then
+ begin
+ //Joker spielen
+ DoJoker(1, SDL_ModState);
+ end;
+ end;
+
+ SDLK_3:
+ begin //Joker Team 3
+ if (Mode = smParty) AND (PartySession.Teams.NumTeams >= 3) AND (PartySession.Teams.Teaminfo[2].Joker > 0) then
+ begin
+ //Joker spielen
+ DoJoker(2, SDL_ModState);
+ end;
+ end;
+ end;
+ end;
+end;
+
+constructor TScreenSong.Create;
+var
+ Pet: integer;
+ I: integer;
+Label CreateSongButtons;
+begin
+ inherited Create;
+
+ LoadFromTheme(Theme.Song);
+
+ TextArtist := AddText(Theme.Song.TextArtist);
+ TextTitle := AddText(Theme.Song.TextTitle);
+ TextNumber := AddText(Theme.Song.TextNumber);
+
+ TextPlugin := AddText(Theme.Song.TextPlugin);
+
+ for I := 1 to 4 do
+ TextMedley[I] := AddText(Theme.Song.TextMedley[I]);
+
+ //for M2-MOD-mode:
+ TextP1 := AddText(Theme.Song.TextP1);
+ TextP2 := AddText(Theme.Song.TextP2);
+
+ //Show Cat in Top Left mod
+ TextCat := AddText(Theme.Song.TextCat);
+ StaticCat := AddStatic(Theme.Song.StaticCat);
+
+ //Show Video Icon Mod
+ VideoIcon := AddStatic(Theme.Song.VideoIcon);
+
+ //Meldey Icons
+ MedleyIcon := AddStatic(Theme.Song.MedleyIcon);
+ CalcMedleyIcon := AddStatic(Theme.Song.CalculatedMedleyIcon);
+
+ //Party Mode
+ StaticTeam1Joker1 := AddStatic(Theme.Song.StaticTeam1Joker1);
+ StaticTeam1Joker2 := AddStatic(Theme.Song.StaticTeam1Joker2);
+ StaticTeam1Joker3 := AddStatic(Theme.Song.StaticTeam1Joker3);
+ StaticTeam1Joker4 := AddStatic(Theme.Song.StaticTeam1Joker4);
+ StaticTeam1Joker5 := AddStatic(Theme.Song.StaticTeam1Joker5);
+
+ StaticTeam2Joker1 := AddStatic(Theme.Song.StaticTeam2Joker1);
+ StaticTeam2Joker2 := AddStatic(Theme.Song.StaticTeam2Joker2);
+ StaticTeam2Joker3 := AddStatic(Theme.Song.StaticTeam2Joker3);
+ StaticTeam2Joker4 := AddStatic(Theme.Song.StaticTeam2Joker4);
+ StaticTeam2Joker5 := AddStatic(Theme.Song.StaticTeam2Joker5);
+
+ StaticTeam3Joker1 := AddStatic(Theme.Song.StaticTeam3Joker1);
+ StaticTeam3Joker2 := AddStatic(Theme.Song.StaticTeam3Joker2);
+ StaticTeam3Joker3 := AddStatic(Theme.Song.StaticTeam3Joker3);
+ StaticTeam3Joker4 := AddStatic(Theme.Song.StaticTeam3Joker4);
+ StaticTeam3Joker5 := AddStatic(Theme.Song.StaticTeam3Joker5);
+
+ TextNumJokerTeam1 := AddText(Theme.Song.SongTextPartyTeam1NumJoker);
+ TextNumJokerTeam2 := AddText(Theme.Song.SongTextPartyTeam2NumJoker);
+ TextNumJokerTeam3 := AddText(Theme.Song.SongTextPartyTeam3NumJoker);
+
+ //Load Party and NonParty specific Statics and Texts
+ SetLength(StaticParty, Length(Theme.Song.StaticParty));
+ for I := 0 to High(Theme.Song.StaticParty) do
+ StaticParty[I] := AddStatic(Theme.Song.StaticParty[I]);
+
+ SetLength(TextParty, Length(Theme.Song.TextParty));
+ for I := 0 to High(Theme.Song.TextParty) do
+ TextParty[I] := AddText(Theme.Song.TextParty[I]);
+
+ SetLength(StaticNonParty, Length(Theme.Song.StaticNonParty));
+ for I := 0 to High(Theme.Song.StaticNonParty) do
+ StaticNonParty[I] := AddStatic(Theme.Song.StaticNonParty[I]);
+
+ SetLength(TextNonParty, Length(Theme.Song.TextNonParty));
+ for I := 0 to High(Theme.Song.TextNonParty) do
+ TextNonParty[I] := AddText(Theme.Song.TextNonParty[I]);
+
+ SetLength(StaticM2Party, Length(Theme.Song.StaticM2Party));
+ for I := 0 to High(Theme.Song.StaticM2Party) do
+ StaticM2Party[I] := AddStatic(Theme.Song.StaticM2Party[I]);
+
+ SetLength(TextM2Party, Length(Theme.Song.TextM2Party));
+ for I := 0 to High(Theme.Song.TextM2Party) do
+ TextM2Party[I] := AddText(Theme.Song.TextM2Party[I]);
+
+ // Song List
+// Songs.LoadSongList; // moved to the UltraStar unit
+ CatSongs.Refresh;
+
+ if (length(CatSongs.Song) > 0) then
+ begin
+ //Set Length of Button Array one Time Instead of one time for every Song
+ SetButtonLength(Length(CatSongs.Song));
+
+ I := 0;
+ CreateSongButtons:
+
+ try
+ for Pet := I to High(CatSongs.Song) do begin // creating all buttons
+ // new
+ Texture.Limit := 512;// 256 0.4.2 value, 512 in 0.5.0
+
+ if not FileExists(CatSongs.Song[Pet].Path + CatSongs.Song[Pet].Cover) then
+ CatSongs.Song[Pet].Cover := ''; // 0.5.0: if cover not found then show 'no cover'
+
+ if CatSongs.Song[Pet].Cover = '' then
+ AddButton(300 + Pet*250, 140, 200, 200, Skin.GetTextureFileName('SongCover'), 'JPG', 'Plain', Theme.Song.Cover.Reflections)
+ else begin
+ // cache texture if there is a need to this
+ if not Covers.CoverExists(CatSongs.Song[Pet].Path + CatSongs.Song[Pet].Cover) then begin
+ Texture.CreateCacheMipmap := true;
+ Texture.GetTexture(CatSongs.Song[Pet].Path + CatSongs.Song[Pet].Cover, 'Plain', true); // preloads textures and creates cache mipmap
+ Texture.CreateCacheMipmap := false;
+
+ // puts this texture to the cache file
+ Covers.AddCover(CatSongs.Song[Pet].Path + CatSongs.Song[Pet].Cover);
+
+ // unload full size texture
+ Texture.UnloadTexture(CatSongs.Song[Pet].Path + CatSongs.Song[Pet].Cover, false);
+
+ // we should also add mipmap texture by calling createtexture and use mipmap cache as data source
+ end;
+
+ // and now load it from cache file (small place for the optimization by eliminating reading it from file, but not here)
+ AddButton(300 + Pet*250, 140, 200, 200, CatSongs.Song[Pet].Path + CatSongs.Song[Pet].Cover, 'JPG', 'Plain', Theme.Song.Cover.Reflections);
+ end;
+ Texture.Limit := 1024*1024;
+ I := -1;
+ end;
+ except
+ //When Error is reported the First time for this Song
+ if (I <> Pet) then
+ begin
+ //Some Error reporting:
+ Log.LogError('Could not load Cover: ' + CatSongs.Song[Pet].Cover);
+
+ //Change Cover to NoCover and Continue Loading
+ CatSongs.Song[Pet].Cover := '';
+ I := Pet;
+ end
+ else //when Error occurs Multiple Times(NoSong Cover is damaged), then start loading next Song
+ begin
+ Log.LogError('NoCover Cover is damaged!');
+ try
+ AddButton(300 + Pet*250, 140, 200, 200, '', 'JPG', 'Plain', Theme.Song.Cover.Reflections);
+ except
+ Messagebox(0, PChar('No Cover Image is damage. Could not Workaround Song Loading, Ultrastar will exit now.'), PChar(Language.Translate('US_VERSION')), MB_ICONERROR or MB_OK);
+ Halt;
+ end;
+ I := Pet + 1;
+ end;
+ end;
+
+ if (I <> -1) then
+ GoTo CreateSongButtons;
+
+ end;
+
+ // Randomize Patch
+ Randomize;
+ //Equalizer
+ SetLength(EqualizerBands, Theme.Song.Equalizer.Bands);
+ //ClearArray
+ For I := low(EqualizerBands) to high(EqualizerBands) do
+ EqualizerBands[I] := 3;
+
+ if (Length(CatSongs.Song) > 0) then
+ Interaction := 0;
+end;
+
+procedure TScreenSong.SetScroll;
+var
+ VS, B, I: Integer;
+ VisArr: array of Integer;
+
+begin
+ VS := CatSongs.VisibleSongs;
+ if VS > 0 then
+ begin
+ //Set Positions
+ Case Theme.Song.Cover.Style of
+ 3: SetScroll3;
+ 5:begin
+ if VS > 5 then
+ SetScroll5
+ else
+ SetScroll4;
+ end;
+ else SetScroll4;
+ end;
+ //Set Visibility of Video Icon
+ Static[VideoIcon].Visible := (CatSongs.Song[Interaction].Video <> '');
+
+ // Set visibility of medley icons
+ if Mode=smNormal then
+ begin
+ Static[MedleyIcon].Visible := (CatSongs.Song[Interaction].Medley.Source = msTag);
+ Static[CalcMedleyIcon].Visible := (CatSongs.Song[Interaction].Medley.Source = msCalculated);
+ end else
+ begin
+ Static[MedleyIcon].Visible := false;
+ Static[CalcMedleyIcon].Visible := false;
+ end;
+
+ //Set Texts:
+ Text[TextArtist].Text := CatSongs.Song[Interaction].Artist;
+ Text[TextTitle].Text := CatSongs.Song[Interaction].Title;
+ if (Mode=smNormal) then
+ begin
+ if (Ini.Tabs_at_startup = 1) And (CatSongs.CatNumShow = -1) then
+ begin
+ Text[TextNumber].Text := IntToStr(CatSongs.Song[Interaction].OrderNum) + '/' + IntToStr(CatSongs.CatCount);
+ Text[TextTitle].Text := '(' + IntToStr(CatSongs.Song[Interaction].CatNumber) + ' ' + Language.Translate('SING_SONGS_IN_CAT') + ')';
+ end else if (CatSongs.CatNumShow = -2) then
+ Text[TextNumber].Text := IntToStr(CatSongs.VisibleIndex(Interaction)+1) + '/' + IntToStr(VS)
+ else if (CatSongs.CatNumShow = -3) then
+ Text[TextNumber].Text := IntToStr(CatSongs.VisibleIndex(Interaction)+1) + '/' + IntToStr(VS)
+ else if (Ini.Tabs_at_startup = 1) then
+ Text[TextNumber].Text := IntToStr(CatSongs.Song[Interaction].CatNumber) + '/' +
+ IntToStr(CatSongs.Song[Interaction - CatSongs.Song[Interaction].CatNumber].CatNumber)
+ else
+ Text[TextNumber].Text := IntToStr(Interaction+1) + '/' + IntToStr(Length(CatSongs.Song));
+ end else if (Mode=smChallenge) and not PartyMedley then
+ begin
+ if (Ini.Tabs_at_startup = 1) and (CatSongs.CatNumShow = -1) then
+ begin
+ Text[TextNumber].Text := IntToStr(CatSongs.Song[Interaction].OrderNum) + '/' + IntToStr(CatSongs.CatCount);
+ Text[TextTitle].Text := '(' +
+ IntToStr(CatSongs.Song[Interaction].CatNumber - PartySessionM2.GetSongsPlayed(CatSongs.Song[Interaction].OrderNum)) +
+ '/' +
+ IntToStr(CatSongs.Song[Interaction].CatNumber) + ' ' + Language.Translate('SING_SONGS_IN_CAT') + ')'; //AND HERE!
+ end else if (CatSongs.CatNumShow = -2) then
+ Text[TextNumber].Text := IntToStr(CatSongs.VisibleIndex(Interaction)+1) + '/' + IntToStr(VS)
+ else if (CatSongs.CatNumShow = -3) then
+ begin
+ ChooseableSongs := VS - PartySessionM2.GetSongsPlayed(CatSongs.CatNumShow) - GetSongsSkipped();
+ Text[TextNumber].Text := IntToStr(CatSongs.VisibleIndex(Interaction)+1) + '/' + IntToStr(VS) +
+ ' (' + IntToStr(ChooseableSongs) + ')';
+ end else if (Ini.Tabs_at_startup = 1) then
+ begin
+ ChooseableSongs:=CatSongs.Song[Interaction - CatSongs.Song[Interaction].CatNumber].CatNumber -
+ PartySessionM2.GetSongsPlayed(CatSongs.CatNumShow) - GetSongsSkipped();
+
+ Text[TextNumber].Text := IntToStr(CatSongs.Song[Interaction].CatNumber) + '/' +
+ IntToStr(CatSongs.Song[Interaction - CatSongs.Song[Interaction].CatNumber].CatNumber) + ' (' +
+ IntToStr(ChooseableSongs) + ')'; //HERE!
+ end else
+ begin
+ ChooseableSongs:=Length(CatSongs.Song)-PartySessionM2.GetSongsPlayed(CatSongs.CatNumShow)-GetSongsSkipped();
+ Text[TextNumber].Text := IntToStr(Interaction+1) + '/' + IntToStr(Length(CatSongs.Song)) + ' (' +
+ IntToStr(ChooseableSongs) + ')'; //HERE!
+ end
+ end else if PartyMedley then//PartyMedley
+ begin
+ SetLength(VisArr, 0);
+
+ if (CatSongs.CatNumShow = -2) then
+ begin
+ Text[TextNumber].Text := IntToStr(CatSongs.VisibleIndex(Interaction)+1) + '/' + IntToStr(VS);
+ end
+ else if (CatSongs.CatNumShow = -3) then //Playlist!
+ begin
+ for I := 0 to Length(CatSongs.Song) - 1 do
+ begin
+ if CatSongs.Song[I].Visible and not SongSkipped(I) and (CatSongs.Song[I].Medley.Source>=MinSource) then
+ begin
+ SetLength(VisArr, Length(VisArr)+1);
+ VisArr[Length(VisArr)-1] := I;
+ end;
+ end;
+ ChooseableSongs := Length(VisArr);
+ Text[TextNumber].Text := IntToStr(CatSongs.VisibleIndex(Interaction)+1) + '/' + IntToStr(VS) +
+ ' (' + IntToStr(ChooseableSongs) + ')'; //HERE!
+ end else if (Ini.Tabs_at_startup = 1) then
+ begin
+ for I := 0 to Length(CatSongs.Song) - 1 do
+ begin
+ if not CatSongs.Song[I].Main and not SongSkipped(I) and (CatSongs.Song[I].Medley.Source>=MinSource) then
+ begin
+ SetLength(VisArr, Length(VisArr)+1);
+ VisArr[Length(VisArr)-1] := I;
+ end;
+ end;
+ ChooseableSongs := Length(VisArr);
+
+ Text[TextNumber].Text := IntToStr(CatSongs.Song[Interaction].CatNumber) + '/' +
+ IntToStr(CatSongs.Song[Interaction - CatSongs.Song[Interaction].CatNumber].CatNumber) + ' (' +
+ IntToStr(ChooseableSongs) + ')'; //HERE!
+ end else
+ begin
+ for I := 0 to Length(CatSongs.Song) - 1 do
+ begin
+ if CatSongs.Song[I].Visible and not SongSkipped(I) and (CatSongs.Song[I].Medley.Source>=MinSource) then
+ begin
+ SetLength(VisArr, Length(VisArr)+1);
+ VisArr[Length(VisArr)-1] := I;
+ end;
+ end;
+ ChooseableSongs := Length(VisArr);
+ Text[TextNumber].Text := IntToStr(Interaction+1) + '/' + IntToStr(Length(CatSongs.Song)) + ' (' +
+ IntToStr(ChooseableSongs) + ')'; //HERE!
+ end;
+ end else if (Mode=smParty) then
+ begin
+ SetLength(VisArr, 0);
+
+ if (CatSongs.CatNumShow = -2) then
+ begin
+ Text[TextNumber].Text := IntToStr(CatSongs.VisibleIndex(Interaction)+1) +
+ '/' + IntToStr(VS);
+ end
+ else if (CatSongs.CatNumShow = -3) then //Playlist!
+ begin
+ for I := 0 to Length(CatSongs.Song) - 1 do
+ begin
+ if CatSongs.Song[I].Visible and not SongSkipped(I) then
+ begin
+ SetLength(VisArr, Length(VisArr)+1);
+ VisArr[Length(VisArr)-1] := I;
+ end;
+ end;
+ ChooseableSongs := Length(VisArr);
+ Text[TextNumber].Text := IntToStr(CatSongs.VisibleIndex(Interaction)+1) +
+ '/' + IntToStr(VS) +
+ ' (' + IntToStr(ChooseableSongs) + ')'; //HERE!
+ end else if (Ini.Tabs_at_startup = 1) then
+ begin
+ for I := 0 to Length(CatSongs.Song) - 1 do
+ begin
+ if not CatSongs.Song[I].Main and not SongSkipped(I) then
+ begin
+ SetLength(VisArr, Length(VisArr)+1);
+ VisArr[Length(VisArr)-1] := I;
+ end;
+ end;
+ ChooseableSongs := Length(VisArr);
+
+ Text[TextNumber].Text := IntToStr(CatSongs.Song[Interaction].CatNumber) + '/' +
+ IntToStr(CatSongs.Song[Interaction - CatSongs.Song[Interaction].CatNumber].CatNumber) + ' (' +
+ IntToStr(ChooseableSongs) + ')'; //HERE!
+ end else
+ begin
+ for I := 0 to Length(CatSongs.Song) - 1 do
+ begin
+ if CatSongs.Song[I].Visible and not SongSkipped(I) then
+ begin
+ SetLength(VisArr, Length(VisArr)+1);
+ VisArr[Length(VisArr)-1] := I;
+ end;
+ end;
+ ChooseableSongs := Length(VisArr);
+ Text[TextNumber].Text := IntToStr(Interaction+1) + '/' + IntToStr(Length(CatSongs.Song)) + ' (' +
+ IntToStr(ChooseableSongs) + ')'; //HERE!
+ end;
+ end;
+ end else
+ begin
+ Text[TextNumber].Text := '0/0';
+ Text[TextArtist].Text := '';
+ Text[TextTitle].Text := '';
+ for B := 0 to High(Button) do
+ Button[B].Visible := False;
+
+ end;
+end;
+
+procedure TScreenSong.SetScroll1;
+var
+ B: integer; // button
+ BMin: integer; // button min
+ BMax: integer; // button max
+ Src: integer;
+// Dst: integer;
+ Count: integer; // Dst is not used. Count is used.
+ Ready: boolean;
+
+ VisCount: integer; // count of visible (or selectable) buttons
+ VisInt: integer; // visible position of interacted button
+ Typ: integer; // 0 when all songs fits the screen
+ Placed: integer; // number of placed visible buttons
+begin
+// Src := 0;
+// Dst := -1;
+ Count := 1;
+ Typ := 0;
+ Ready := false;
+ Placed := 0;
+
+ VisCount := 0;
+ for B := 0 to High(Button) do
+ if CatSongs.Song[B].Visible then Inc(VisCount);
+
+ VisInt := 0;
+ for B := 0 to Interaction-1 do
+ if CatSongs.Song[B].Visible then Inc(VisInt);
+
+
+ if VisCount <= 6 then begin
+ Typ := 0;
+ end else begin
+ if VisInt <= 3 then begin
+ Typ := 1;
+ Count := 7;
+ Ready := true;
+ end;
+
+ if (VisCount - VisInt) <= 3 then begin
+ Typ := 2;
+ Count := 7;
+ Ready := true;
+ end;
+
+ if not Ready then begin
+ Typ := 3;
+ Src := Interaction;
+ end;
+ end;
+
+
+
+ // hide all buttons
+ for B := 0 to High(Button) do begin
+ Button[B].Visible := false;
+ Button[B].Selectable := CatSongs.Song[B].Visible;
+ end;
+
+{ for B := Src to Dst do begin
+// Button[B].Visible := true;
+ Button[B].Visible := CatSongs.Song[B].Visible;
+ Button[B].Selectable := Button[B].Visible;
+ Button[B].Y := 140 + (B-Src) * 60;
+ end;}
+
+
+ if Typ = 0 then begin
+ for B := 0 to High(Button) do begin
+ if CatSongs.Song[B].Visible then begin
+ Button[B].Visible := true;
+ Button[B].Y := 140 + (Placed) * 60;
+ Inc(Placed);
+ end;
+ end;
+ end;
+
+ if Typ = 1 then begin
+ B := 0;
+ while (Count > 0) do begin
+ if CatSongs.Song[B].Visible then begin
+ Button[B].Visible := true;
+ Button[B].Y := 140 + (Placed) * 60;
+ Inc(Placed);
+ Dec(Count);
+ end;
+ Inc(B);
+ end;
+ end;
+
+ if Typ = 2 then begin
+ B := High(Button);
+ while (Count > 0) do begin
+ if CatSongs.Song[B].Visible then begin
+ Button[B].Visible := true;
+ Button[B].Y := 140 + (6-Placed) * 60;
+ Inc(Placed);
+ Dec(Count);
+ end;
+ Dec(B);
+ end;
+ end;
+
+ if Typ = 3 then begin
+ B := Src;
+ Count := 4;
+ while (Count > 0) do begin
+ if CatSongs.Song[B].Visible then begin
+ Button[B].Visible := true;
+ Button[B].Y := 140 + (3+Placed) * 60;
+ Inc(Placed);
+ Dec(Count);
+ end;
+ Inc(B);
+ end;
+
+ B := Src-1;
+ Placed := 0;
+ Count := 3;
+ while (Count > 0) do begin
+ if CatSongs.Song[B].Visible then begin
+ Button[B].Visible := true;
+ Button[B].Y := 140 + (2-Placed) * 60;
+ Inc(Placed);
+ Dec(Count);
+ end;
+ Dec(B);
+ end;
+
+ end;
+
+ if Length(Button) > 0 then
+ Static[1].Texture.Y := Button[Interaction].Y - 5; // selection texture
+end;
+
+procedure TScreenSong.SetScroll2;
+var
+ B: integer;
+ Wsp: integer; // wspolczynnik przesuniecia wzgledem srodka ekranu
+ Wsp2: real;
+begin
+ // liniowe
+ for B := 0 to High(Button) do
+ Button[B].X := 300 + (B - Interaction) * 260;
+
+ if Length(Button) >= 3 then begin
+ if Interaction = 0 then
+ Button[High(Button)].X := 300 - 260;
+
+ if Interaction = High(Button) then
+ Button[0].X := 300 + 260;
+ end;
+
+ // kolowe
+{ for B := 0 to High(Button) do begin
+ Wsp := (B - Interaction); // 0 dla srodka, -1 dla lewego, +1 dla prawego itd.
+ Wsp2 := Wsp / Length(Button);
+ Button[B].X := 300 + 10000 * sin(2*pi*Wsp2);
+// Button[B].Y := 140 + 50 * ;
+ end;}
+end;
+
+procedure TScreenSong.SetScroll3; // with slide
+var
+ B: integer;
+ Wsp: integer; // wspolczynnik przesuniecia wzgledem srodka ekranu
+ Wsp2: real;
+begin
+ SongTarget := Interaction;
+
+ // liniowe
+ for B := 0 to High(Button) do
+ begin
+ Button[B].X := 300 + (B - SongCurrent) * 260;
+ if (Button[B].X < -Button[B].W) OR (Button[B].X > 800) then
+ Button[B].Visible := False
+ else
+ Button[B].Visible := True;
+ end;
+
+{ if Length(Button) >= 3 then begin
+ if Interaction = 0 then
+ Button[High(Button)].X := 300 - 260;
+
+ if Interaction = High(Button) then
+ Button[0].X := 300 + 260;
+ end;}
+
+ // kolowe
+{ for B := 0 to High(Button) do begin
+ Wsp := (B - Interaction); // 0 dla srodka, -1 dla lewego, +1 dla prawego itd.
+ Wsp2 := Wsp / Length(Button);
+ Button[B].X := 300 + 10000 * sin(2*pi*Wsp2);
+// Button[B].Y := 140 + 50 * ;
+ end;}
+end;
+
+procedure TScreenSong.SetScroll4; // rotate
+var
+ B: integer;
+ Wsp: real;
+ Z, Z2: real;
+ VS: integer;
+begin
+ VS := CatSongs.VisibleSongs; // 0.5.0 (I): cached, very important
+
+ // kolowe
+ for B := 0 to High(Button) do begin
+ Button[B].Visible := CatSongs.Song[B].Visible; // nowe
+ if Button[B].Visible then begin // 0.5.0 optimization for 1000 songs - updates only visible songs, hiding in tabs becomes useful for maintaing good speed
+
+ Wsp := 2 * pi * (CatSongs.VisibleIndex(B) - SongCurrent) / VS {CatSongs.VisibleSongs};// 0.5.0 (II): takes another 16ms
+
+ Z := (1 + cos(Wsp)) / 2;
+ Z2 := (1 + 2*Z) / 3;
+
+
+ Button[B].X := Theme.Song.Cover.X + (0.185 * Theme.Song.Cover.H * VS * sin(Wsp)) * Z2 - ((Button[B].H - Theme.Song.Cover.H)/2); // 0.5.0 (I): 2 times faster by not calling CatSongs.VisibleSongs
+ Button[B].Z := Z / 2 + 0.3;
+
+ Button[B].W := Theme.Song.Cover.H * Z2;
+
+// Button[B].Y := {50 +} 140 + 50 - 50 * Z2;
+ Button[B].Y := Theme.Song.Cover.Y + (Theme.Song.Cover.H - Abs(Button[B].H)) * 0.7 ;
+ Button[B].H := Button[B].W;
+ end;
+ end;
+end;
+
+procedure TScreenSong.SetScroll5; // rotate
+var
+ B: integer;
+ Angle: real;
+ Pos: Real;
+ VS: integer;
+ diff: real;
+ X: Real;
+begin
+ VS := CatSongs.VisibleSongs; // cache Visible Songs
+ {Vars
+ Theme.Song.CoverW: Radius des Kreises
+ Theme.Song.CoverX: X Pos Linke Kante des gewählten Covers
+ Theme.Song.CoverX: Y Pos Obere Kante des gewählten Covers
+ Theme.Song.CoverH: Höhe der Cover
+
+ (CatSongs.VisibleIndex(B) - SongCurrent)/VS = Abstand zum MIttleren Cover in %
+ }
+
+ //Change Pos of all Buttons
+ for B := low(Button) to high(Button) do
+ begin
+ Button[B].Visible := CatSongs.Song[B].Visible; //Adjust Visability
+ if Button[B].Visible then //Only Change Pos for Visible Buttons
+ begin
+ Pos := (CatSongs.VisibleIndex(B) - SongCurrent);
+ if (Pos < -VS/2) then
+ Pos := Pos + VS
+ else if (Pos > VS/2) then
+ Pos := Pos - VS;
+
+ if (Abs(Pos) < 2.5) then {fixed Positions}
+ begin
+ Angle := Pi * (Pos / 5);
+ //Button[B].Visible := False;
+
+ Button[B].H := Abs(Theme.Song.Cover.H * cos(Angle*0.8));//Power(Z2, 3);
+
+// Button[B].Reflectionspacing := 15 * Button[B].H/Theme.Song.Cover.H;
+ Button[B].DeSelectReflectionspacing := 15 * Button[B].H/Theme.Song.Cover.H;
+
+ Button[B].Z := 0.95 - Abs(Pos) * 0.01;
+
+ Button[B].Y := (Theme.Song.Cover.Y + (Theme.Song.Cover.H - Abs(Theme.Song.Cover.H * cos(Angle))) * 0.5);
+
+ Button[B].W := Button[B].H;
+
+ Diff := (Button[B].H - Theme.Song.Cover.H)/2;
+
+
+ X := Sin(Angle*1.3)*0.9;
+
+ Button[B].X := Theme.Song.Cover.X + Theme.Song.Cover.W * X - Diff;
+
+ end
+ else
+ begin {Behind the Front Covers}
+// Button[B].Visible := False;
+// if VS/2-abs(Pos)>VS*0.4 then Button[B].Visible := False;
+
+ if Pos < 0 then
+ Pos := (Pos - VS/2) /VS
+ else
+ Pos := (Pos + VS/2) /VS;
+
+ Angle := pi * Pos*2;
+
+ Button[B].Z := (0.4 - Abs(Pos/4)) -0.00001; //z < 0.49999 is behind the cover 1 is in front of the covers
+
+ Button[B].H :=0.6*(Theme.Song.Cover.H-Abs(Theme.Song.Cover.H * cos(Angle/2)*0.8));//Power(Z2, 3);
+
+ Button[B].W := Button[B].H;
+
+ Button[B].Y := Theme.Song.Cover.Y - (Button[B].H - Theme.Song.Cover.H)*0.75;
+
+// Button[B].Reflectionspacing := 15 * Button[B].H/Theme.Song.Cover.H;
+ Button[B].DeSelectReflectionspacing := 15 * Button[B].H/Theme.Song.Cover.H;
+
+ Diff := (Button[B].H - Theme.Song.Cover.H)/2;
+
+ Button[B].X := Theme.Song.Cover.X+Theme.Song.Cover.H/2-Button[b].H/2 + (Theme.Song.Cover.H)*sin(Angle/2)*1.52;
+
+ end;
+
+ //Button[B].Y := (Theme.Song.Cover.Y + (Theme.Song.Cover.H - Button[B].H)/1.5); //Cover at down border of the change field
+// Button[B].Y := (Theme.Song.Cover.Y + (Theme.Song.Cover.H - Button[B].H) * 0.7);
+
+ end;
+ end;
+end;
+
+procedure TScreenSong.onShow;
+var
+ I: Integer;
+
+begin
+ if SongIndex<>Interaction then
+ Music.Stop;
+
+ PartyMedley := false;
+
+ SungToEnd := false;
+ if Mode = smMedley then
+ Mode := smNormal;
+
+ MakeMedley := false;
+
+ StartTry := false;
+ AspectHandler.changed := false;
+
+ SetLength(PlaylistMedley.Song, 0);
+ SetLength(SkippedSongs, 0);
+
+ if Ini.Players <= 3 then PlayersPlay := Ini.Players + 1;
+ if Ini.Players = 4 then PlayersPlay := 6;
+
+ //Cat Mod etc
+ if (Ini.Tabs_at_startup = 1) AND (CatSongs.CatNumShow = -1) AND
+ (PlaylistMan.Mode=0) then
+ begin
+ CatSongs.ShowCategoryList;
+ SelectNext;
+ //Show Cat in Top Left Mod
+ HideCatTL;
+ end else if (PlaylistMan.Mode=0) and (Ini.Tabs_at_startup = 1) AND (CatSongs.CatNumShow = -3) then
+ begin
+ //Find Category
+ I := Interaction;
+ while not catsongs.Song[I].Main do
+ begin
+ Dec (I);
+ if (I < low(catsongs.Song)) then
+ break;
+ end;
+ if (I<= 1) then
+ Interaction := high(catsongs.Song)
+ else
+ Interaction := I - 1;
+
+ //Stop Music
+ Music.Stop;
+
+ //Stop Video
+ acClose;
+ VidVis := none;
+ CatSongs.ShowCategoryList;
+
+ //Show Cat in Top Left Mod
+ HideCatTL;
+
+ //Show Wrong Song when Tabs on Fix
+ SelectNext;
+ FixSelected;
+ end else if (Mode<>smNormal) and (PlaylistMan.Mode=0) and (CatSongs.CatNumShow < -1) then
+ begin
+ //Atm: Set Empty Filter
+ CatSongs.SetFilter('', 0);
+
+ //Show Cat in Top Left Mod
+ HideCatTL;
+ Interaction := 0;
+
+ //Show Wrong Song when Tabs on Fix
+ SelectNext;
+ FixSelected;
+
+ ChangeMusic;
+ end;
+
+
+ //Playlist Mode
+ if (Mode = smNormal) then
+ begin
+ ScreenSongMenu.Visible := False;
+
+ //If Playlist Shown -> Select Next automatically
+ if (CatSongs.CatNumShow = -3) then
+ begin
+ SelectNext;
+ end;
+ Text[TextP1].visible := false;
+ Text[TextP2].visible := false;
+ ID := 'ID_024';
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenSong, smNormal)');
+ Text[TextPlugin].Visible := false;
+ end else if (Mode = smParty) then //Party Mode classic
+ begin
+ //TODO: PartyMedley
+ PartyMedley := PartySession.Rounds[PartySession.CurRound].Medley;
+
+ //Show Menu directly in PartyMode
+ //But only if selected in Options
+ if (Ini.PartyPopup = 1) then
+ begin
+ ScreenSongMenu.MenuShow(SM_Party_Main);
+ end;
+ Text[TextP1].visible := false;
+ Text[TextP2].visible := false;
+ ID := 'ID_025';
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenSong, smParty)');
+
+ Text[TextPlugin].Visible := true;
+ if PartyMedley then
+ MinSource := msCalculated;
+
+ Text[TextPlugin].Text := PartySession.Plugins[PartySession.Rounds[PartySession.CurRound].PluginNr].Name;
+ SelectRandomSong;
+ end else if (Mode = smChallenge) then //M2-MOD
+ begin
+ PartyMedley := PartySessionM2.Rounds[PartySessionM2.CurRound].Medley;
+
+ ID := 'ID_026';
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenSong, smChallenge)');
+
+ if not PartyMedley then
+ begin
+ if (PlaylistMan.Mode=1) then //One Category Select Category and Select Random Song
+ begin
+ CatSongs.ShowCategoryList;
+ CatSongs.ClickCategoryButton(PlaylistMan.CurPlayList);
+ ShowCatTL(PlaylistMan.CurPlayList);
+ end else if (PlaylistMan.Mode=2) then
+ begin
+ PlaylistMan.SetPlayList(PlaylistMan.CurPlayList);
+ end;
+
+ if (CatSongs.VisibleSongs - PartySessionM2.GetSongsPlayed(CatSongs.CatNumShow))=0 then
+ PartySessionM2.ResetSongsPlayed(CatSongs.CatNumShow);
+
+ RandomSongChallenge;
+ //SkipTo(Random(CatSongs.VisibleSongs - PartySessionM2.GetSongsPlayed(CatSongs.CatNumShow)));
+
+ if (Ini.Tabs_at_startup = 1) and (PlaylistMan.Mode <> 2) and
+ (PlaylistMan.Mode <> 1) then
+ FoundCAT:=false
+ else
+ FoundCAT:=true;
+ end else
+ begin
+ MinSource := msCalculated;
+ FoundCAT:=true;
+ SelectRandomSong;
+ end;
+
+ Text[TextP1].Text := 'P1: ' + PartySessionM2.Teams.Teaminfo[0].Playerinfo[0].Name;
+ Text[TextP2].Text := 'P2: ' + PartySessionM2.Teams.Teaminfo[1].Playerinfo[0].Name;
+ Text[TextP1].visible := true;
+ Text[TextP2].visible := true;
+ if PartySessionM2.Option_Plugins then
+ begin
+ Text[TextPlugin].Visible := true;
+ Text[TextPlugin].Text := PartySessionM2.Plugins[PartySessionM2.Rounds[PartySessionM2.CurRound].PluginNr].Name;
+ end else
+ Text[TextPlugin].Visible := false;
+ end;
+
+ if Length(CatSongs.Song) > 0 then begin
+ if SongIndex<>Interaction then
+ ChangeMusic
+ else
+ begin
+ StartVideoPreview;
+ CoverTime := 0;
+ end;
+
+ SongIndex := -1;
+ SetScroll;
+ UpdateLCD;
+ end;
+
+ SetJoker;
+ SetStatics;
+end;
+
+procedure TScreenSong.RandomSongChallenge();
+var
+ VisArr: array of integer;
+ I: integer;
+begin
+ SetLength(VisArr, 0);
+ for I := 0 to Length(CatSongs.Song) - 1 do
+ begin
+ if not PartyMedley then
+ begin
+ if CatSongs.Song[I].Visible and not SongSkipped(I) and
+ not PartySessionM2.SongPlayed(CatSongs.CatNumShow, I) then
+ begin
+ SetLength(VisArr, Length(VisArr)+1);
+ VisArr[Length(VisArr)-1] := I;
+ end;
+ end else
+ begin
+ if CatSongs.Song[I].Visible and not SongSkipped(I) and
+ (CatSongs.Song[I].Medley.Source >= MinSource) then
+ begin
+ SetLength(VisArr, Length(VisArr)+1);
+ VisArr[Length(VisArr)-1] := I;
+ end;
+ end;
+ end;
+
+ if (Length(VisArr)>0) then
+ begin
+ I := Random(Length(VisArr));
+ I := VisArr[I];
+
+ //Choose Song
+ SkipTo2(I);
+ end;
+end;
+
+procedure TScreenSong.onHide;
+begin
+ //When Music Fading is activated, Turn Music to 100 %
+ If (Ini.PreviewVolume <> 100) or (Ini.PreviewFading <> 0) then
+ Music.SetMusicVolume(100);
+
+ //If Preview is deactivated: Load MUsicfile now
+ If (Ini.PreviewVolume = 0) then
+ Music.Open(CatSongs.Song[Interaction].Path + CatSongs.Song[Interaction].Mp3);
+
+ //When hide then Stop Music (For Party Mode Popup on Exit)
+ if (Display.NextScreen <> @ScreenSing) and (Display.NextScreen <> @ScreenSingModi) and (Music <> nil) then
+ Music.Stop;
+end;
+
+procedure TScreenSong.DrawExtensions;
+begin
+ //Draw Song Menu
+ if (ScreenSongMenu.Visible) then
+ begin
+ ScreenSongMenu.Draw;
+ end
+ else if (ScreenSongJumpto.Visible) then
+ begin
+ ScreenSongJumpto.Draw;
+ end
+end;
+
+function TScreenSong.Draw: boolean;
+var
+ dx: real;
+ dt: real;
+ I, J: Integer;
+ Window: TRectCoords;
+ Blend: real;
+begin
+ dx := SongTarget-SongCurrent;
+ dt := TimeSkip*7;
+ if dt > 1 then dt := 1;
+ SongCurrent := SongCurrent + dx*dt;
+
+{ if SongCurrent > Catsongs.VisibleSongs then begin
+ SongCurrent := SongCurrent - Catsongs.VisibleSongs;
+ SongTarget := SongTarget - Catsongs.VisibleSongs;
+ end;}
+
+// Log.BenchmarkStart(5);
+ SetScroll;
+// Log.BenchmarkEnd(5);
+// Log.LogBenchmark('SetScroll4', 5);
+
+ //Fading Functions, Only if Covertime is under 5 Seconds
+ If (CoverTime < 5) then
+ begin
+ // 0.5.0: cover fade
+ if (CoverTime < 1) and (CoverTime + TimeSkip >= 1) then begin
+ // load new texture
+ Texture.GetTexture(Button[Interaction].Texture.Name, 'Plain', false);
+ Button[Interaction].Texture.Alpha := 1;
+ Button[Interaction].Texture2 := Texture.GetTexture(Button[Interaction].Texture.Name, 'Plain', false);
+ Button[Interaction].Texture2.Alpha := 1;
+ end;
+ {
+ //Song Fade
+ if (CatSongs.VisibleSongs > 0) AND (Ini.PreviewVolume <> 0) AND (Not CatSongs.Song[Interaction].Main) AND (Ini.PreviewFading <> 0) then
+ begin
+ //Start Song Fade after a little Time, to prevent Song to be Played on Scrolling
+ if (CoverTime < 0.2) and (CoverTime + TimeSkip >= 0.2) then
+ Music.Play;
+
+ //Update Song Volume
+ if (CoverTime < Ini.PreviewFading) then
+ Music.SetMusicVolume(Round (CoverTime * Ini.PreviewVolume / Ini.PreviewFading * 10))
+ else
+ Music.SetMusicVolume(Ini.PreviewVolume * 10);
+
+ end;
+ }
+
+ //Update Fading Time
+ CoverTime := CoverTime + TimeSkip;
+
+ //Update Fading Texture
+ Button[Interaction].Texture2.Alpha := (CoverTime - 1) * 1.5;
+ if Button[Interaction].Texture2.Alpha > 1 then Button[Interaction].Texture2.Alpha := 1;
+
+ end;
+
+
+ //inherited Draw;
+ //heres a little Hack, that causes the Statics
+ //are Drawn after the Buttons because of some Blending Problems.
+ //This should cause no Problems because all Buttons on this screen
+ //Has Z Position.
+ //Draw BG
+ DrawBG;
+
+ //Medley Playlist
+ if Length(PlaylistMedley.Song)>4 then
+ J := Length(PlaylistMedley.Song)-4
+ else
+ J := 0;
+
+ for I := 1 to 4 do
+ begin
+ if Length(PlaylistMedley.Song)>=I+J then
+ begin
+ Text[TextMedley[I]].Visible := true;
+ Text[TextMedley[I]].Text := IntToStr(I+J)+') ' +
+ CatSongs.Song[PlaylistMedley.Song[I-1+J]].Artist + '\n' +
+ CatSongs.Song[PlaylistMedley.Song[I-1+J]].Title;
+ end else
+ Text[TextMedley[I]].Visible := false;
+ end;
+
+ //Medley Mode
+ if (Mode=smNormal) then
+ begin
+ if MakeMedley then
+ begin
+ Text[TextPlugin].Text := 'Medley-Mode';
+ Text[TextPlugin].Visible := true;
+ end else
+ Text[TextPlugin].Visible := false;
+ end;
+
+ //Instead of Draw FG Procedure:
+ //We draw Buttons for our own
+ for I := 0 to Length(Button) - 1 do
+ Button[I].Draw;
+
+ // Statics
+ for I := 0 to Length(Static) - 1 do
+ Static[I].Draw;
+
+ // and texts
+ for I := 0 to Length(Text) - 1 do
+ Text[I].Draw;
+
+
+
+ //Draw Equalizer
+ if Theme.Song.Equalizer.Visible then
+ DrawEqualizer;
+
+ if (CatSongs.Song[Interaction].Main) or (CatSongs.VisibleSongs = 0) then
+ begin
+ acClose;
+ VidVis := none;
+ end;
+
+ if UVideo.VideoOpened then
+ begin
+ Czas.Teraz := Czas.Teraz + TimeSkip;
+ try
+ acGetFrame(Czas.Teraz);
+
+ if VidVis=windowed then
+ begin
+ Window.Left := Button[Interaction].X;
+ Window.Right := Button[Interaction].X+Button[Interaction].W;
+ Window.Upper := Button[Interaction].Y;
+ Window.Lower := Button[Interaction].Y+Button[Interaction].H;
+ Window.windowed := true;
+
+ {if CoverTime>=Ini.PreviewFading then
+ begin
+ glColor4f(0, 0, 0, 1);
+
+ glbegin(gl_quads);
+ glVertex2f(Window.Left, Window.Upper);
+ glVertex2f(Window.Left, Window.Lower);
+ glVertex2f(Window.Right, Window.Lower);
+ glVertex2f(Window.Right, Window.Upper);
+ glEnd;
+ end; }
+ SetAspectCorrection(acoCrop);
+ Blend := (CoverTime-1.75)/Ini.PreviewFading;
+ if Blend<0 then
+ Blend := 0
+ else if Blend>1 then
+ Blend := 1;
+
+ acDrawGLi(ScreenAct, Window, Blend);
+ end else if VidVis=full then
+ begin
+ acDrawGL(ScreenAct);
+ end;
+
+ //ResetAspectCorrection;
+
+ if (Czas.Teraz>=Czas.Razem) then
+ begin
+ acClose;
+ VidVis := none;
+ end;
+ except
+ //If an Error occurs drawing: prevent Video from being Drawn again and Close Video
+ log.LogError('Error drawing Video, Video has been disabled for this Song/Session.');
+ Log.LogError('Corrupted File: ' + CatSongs.Song[Interaction].Video);
+ try
+ acClose;
+ VidVis := none;
+ except
+
+ end;
+ end;
+ end else
+ StartVideoPreview;
+
+ if (VidVis = full) and AspectHandler.changed and
+ (AspectHandler.change_time+3>Czas.Teraz) then
+ begin
+ DrawAspect;
+ end else if AspectHandler.changed and
+ (AspectHandler.change_time+3<Czas.Teraz) then
+ AspectHandler.changed := false;
+
+ DrawExtensions;
+end;
+
+procedure TScreenSong.DrawAspect();
+var
+ txt: PChar;
+ w, h: real;
+ str: string;
+
+begin
+ //draw quad
+ glColor4f(0.7, 0.7, 0.7, 0.6);
+ glEnable(GL_BLEND);
+ glbegin(gl_quads);
+ glVertex2f(270, 20);
+ glVertex2f(270, 60);
+ glVertex2f(530, 60);
+ glVertex2f(530, 20);
+ glEnd;
+ glDisable(GL_BLEND);
+
+ //print Text
+ case UVideo.fAspectCorrection of
+ acoStretch: str := Language.Translate('VIDEO_ASPECT_STRETCH');
+ acoCrop: str := Language.Translate('VIDEO_ASPECT_CROP');
+ acoLetterBox: str := Language.Translate('VIDEO_ASPECT_LETTER_BOX');
+ else
+ str := 'error';
+ end;
+
+ glColor4f(1, 1, 1, 1);
+
+ h := 11*ScreenH/RenderH;
+ SetFontStyle(1);
+ SetFontItalic(false);
+ SetFontSize(h);
+ w := glTextWidth(PChar(str));
+
+ SetFontPos (RenderW/2-w/2, 20);
+ txt := Addr(str[1]);
+ glPrint(txt);
+end;
+
+procedure TScreenSong.SelectNext;
+var
+ Skip, Skip2: integer;
+ I: integer;
+ VS: Integer;
+begin
+ VS := CatSongs.VisibleSongs;
+
+ if VS > 0 then
+ begin
+ UnLoadDetailedCover;
+
+ Skip := 1;
+ Skip2:= 0;
+
+ if (Mode=smChallenge) and not PartyMedley then
+ begin
+ while (not CatSongs.Song[(Interaction + Skip + Skip2) mod Length(Interactions)].Visible or
+ PartySessionM2.SongPlayed(CatSongs.CatNumShow, (Interaction + Skip + Skip2) mod Length(Interactions)) or
+ SongSkipped((Interaction + Skip + Skip2) mod Length(Interactions))) do
+ begin
+ if not CatSongs.Song[(Interaction + Skip + Skip2) mod Length(Interactions)].Visible then
+ Inc(Skip)
+ else
+ Inc(Skip2);
+ end;
+ end else if PartyMedley then
+ begin
+ while (not CatSongs.Song[(Interaction + Skip + Skip2) mod Length(Interactions)].Visible or
+ (CatSongs.Song[(Interaction + Skip + Skip2) mod Length(Interactions)].Medley.Source < MinSource) or
+ SongSkipped((Interaction + Skip + Skip2) mod Length(Interactions))) do
+ begin
+ if not CatSongs.Song[(Interaction + Skip + Skip2) mod Length(Interactions)].Visible then
+ Inc(Skip)
+ else
+ Inc(Skip2);
+ end;
+ end else
+ begin
+ while (not CatSongs.Song[(Interaction + Skip + Skip2) mod Length(Interactions)].Visible or
+ SongSkipped((Interaction + Skip + Skip2) mod Length(Interactions))) do
+ begin
+ if not CatSongs.Song[(Interaction + Skip + Skip2) mod Length(Interactions)].Visible then
+ Inc(Skip)
+ else
+ Inc(Skip2);
+ end;
+ end;
+
+
+ SongTarget := SongTarget + 1 + Skip2;//Skip;
+ Interaction := (Interaction + Skip + Skip2) mod Length(Interactions);
+
+ // try to keep all at the beginning
+ if SongTarget > VS-1 then
+ begin
+ SongTarget := SongTarget - VS;
+ SongCurrent := SongCurrent - VS;
+ end;
+
+ end;
+ // Interaction -> Button, ktorego okladke przeczytamy
+ // Button[Interaction].Texture := Texture.GetTexture(Button[Interaction].Texture.Name, 'Plain', false); // 0.5.0: show uncached texture
+end;
+
+procedure TScreenSong.SelectPrev;
+var
+ Skip: integer;
+ I: integer;
+ VS: Integer;
+begin
+ VS := CatSongs.VisibleSongs;
+
+ if VS > 0 then
+ begin
+ UnLoadDetailedCover;
+
+ Skip := 1;
+
+ while (not CatSongs.Song[(Interaction - Skip + Length(Interactions)) mod Length(Interactions)].Visible) do Inc(Skip);
+ SongTarget := SongTarget - 1;//Skip;
+
+ Interaction := (Interaction - Skip + Length(Interactions)) mod Length(Interactions);
+
+ // try to keep all at the beginning
+ if SongTarget < 0 then begin
+ SongTarget := SongTarget + CatSongs.VisibleSongs;
+ SongCurrent := SongCurrent + CatSongs.VisibleSongs;
+ end;
+
+ // Button[Interaction].Texture := Texture.GetTexture(Button[Interaction].Texture.Name, 'Plain', false); // 0.5.0: show uncached texture
+ end;
+end;
+
+procedure TScreenSong.UpdateLCD;
+begin
+ LCD.HideCursor;
+ LCD.Clear;
+ LCD.WriteText(1, Text[TextArtist].Text);
+ LCD.WriteText(2, Text[TextTitle].Text);
+end;
+
+//Procedure Change current played Preview
+procedure TScreenSong.ChangeMusic;
+begin
+ //When Music Preview is avtivated -> then Change Music
+ if (Ini.PreviewVolume <> 0) then
+ begin
+ if (NOT CatSongs.Song[Interaction].Main) AND(CatSongs.VisibleSongs > 0) then
+ begin
+ Music.Close;
+ if Music.Open(CatSongs.Song[Interaction].Path + CatSongs.Song[Interaction].Mp3) then
+ begin
+ if (CatSongs.Song[Interaction].PreviewStart>0) then
+ Music.MoveTo(CatSongs.Song[Interaction].PreviewStart)
+ else
+ Music.MoveTo(Music.Length / 4);
+
+ StartVideoPreview;
+ //If Song Fading is activated then don't Play directly, and Set Volume to Null, else Play normal
+ if (Ini.PreviewFading = 0) then
+ begin
+ Music.SetMusicVolume (Ini.PreviewVolume * 10);
+ Music.Play;
+ end else
+ begin
+ Music.Fade(0, Ini.PreviewVolume*10, Ini.PreviewFading);
+ Music.Play;
+ end;
+ end;
+ end else
+ Music.Stop;
+ end;
+end;
+
+procedure TScreenSong.StartVideoPreview;
+begin
+ if (Ini.PreviewVolume <> 0) and (Ini.MovieSize < 2) then
+ begin
+ if (NOT CatSongs.Song[Interaction].Main) AND (CatSongs.VisibleSongs > 0) then
+ begin
+ if CoverTime<0.75 then
+ begin
+ acClose;
+ VidVis := none;
+ StartTry := true;
+ AspectHandler.changed := false;
+ end else if (Ini.MoviePreview=1) and StartTry then
+ begin
+ if (CatSongs.Song[Interaction].Video <> '') and
+ FileExists(CatSongs.Song[Interaction].Path + CatSongs.Song[Interaction].Video) then
+ begin
+ acOpenFile(PAnsiChar(CatSongs.Song[Interaction].Path + CatSongs.Song[Interaction].Video));
+
+ acSkip2(CatSongs.Song[Interaction].VideoGAP, Music.Position);
+ Czas.Teraz := Music.Position;
+ Czas.Razem := Music.Length;
+ StartTry := false;
+ try
+ acGetFrame(Czas.Teraz);
+ VidVis := windowed;
+ except
+ //If an Error occurs Reading Video: prevent Video from being Drawn again and Close Video
+ Log.LogError('Error drawing Video, Video has been disabled for this Song/Session.');
+ Log.LogError('Corrupted File: ' + CatSongs.Song[Interaction].Video);
+ CatSongs.Song[Interaction].Video := ''; //dirt fix
+ try
+ acClose;
+ VidVis := none;
+ except
+
+ end;
+ end;
+ end else
+ VidVis := none;
+ end;
+ end;
+ end;
+end;
+
+
+procedure TScreenSong.SkipTo(Target: Cardinal); // 0.5.0
+var
+ I: integer;
+begin
+ UnLoadDetailedCover;
+
+ Interaction := High(CatSongs.Song);
+ SongTarget := 0;
+
+ for I := 1 to Target+1 do
+ SelectNext;
+
+ FixSelected2;
+end;
+
+procedure TScreenSong.SkipTo2(Target: Cardinal); //new
+var
+ I: integer;
+
+begin
+ UnLoadDetailedCover;
+
+ Interaction := High(CatSongs.Song);
+ SongTarget := 0;
+
+ while Interaction<>Target do
+ begin
+ SelectNext;
+ end;
+
+ FixSelected2;
+end;
+
+procedure TScreenSong.DrawEqualizer;
+var
+ Data: TFFTData; //Audio Data
+ I, J: Integer;
+ Res: byte;
+ A, B: Integer;
+ PosX, PosY: Integer;
+ Pos: Real;
+begin
+if (not Music.Finished) AND (Theme.Song.Equalizer.Length > 0) then
+begin
+
+
+ A := GetTickCount div 44;
+
+ if (A <> EqualizerTime) then
+ begin
+ EqualizerTime := A;
+ Data := Music.GetFFTData;
+
+ B:=0;
+ Pos := 0;
+ Res := ceil(92/Theme.Song.Equalizer.Bands);//How much channels are used for one Band
+
+ //Change Lengths
+ for I := 0 to (Res * Theme.Song.Equalizer.Bands - 1) do
+ begin
+ A := floor(I/Res);
+
+ if (A<>B) then //Band changed
+ begin
+ if (Pos <= Theme.Song.Equalizer.Length) then
+ begin
+ if ((Pos < EqualizerBands[B]) AND (EqualizerBands[B]>1)) then
+ EqualizerBands[B] := EqualizerBands[B] - 1
+ else
+ EqualizerBands[B] := floor(Pos);
+ end
+ else
+ EqualizerBands[B] := 1;
+
+ B := A;
+ Pos := 0;
+ end;
+
+ if I > 35 then
+ Data[i] := Data[i] * 8
+ else if I > 11 then
+ Data[i] := Data[i] * 4.5
+ else
+ Data[i] := Data[i] * 1.1;
+
+ if (Data[i] >= 1) then
+ Data[i] := 0.9999999999999;
+
+ if Data[i]*Theme.Song.Equalizer.Length > Pos then
+ Pos := Data[i]*Theme.Song.Equalizer.Length;
+ end;
+
+ //Change Last Band
+ if (EqualizerBands[B] <= Theme.Song.Equalizer.Length) then
+ begin
+ if ((Pos < EqualizerBands[B]) AND (EqualizerBands[B]>1)) then
+ EqualizerBands[B] := EqualizerBands[B] - 1
+ else
+ EqualizerBands[B] := floor(Pos)
+ end
+ else
+ EqualizerBands[B] := 1;
+ end;
+
+ //Draw every Channel
+ glColor4f(Theme.Song.Equalizer.ColR, Theme.Song.Equalizer.ColG, Theme.Song.Equalizer.ColB, Theme.Song.Equalizer.Alpha); //Set Color
+ glDisable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+
+ PosY := Theme.Song.Equalizer.Y;
+ PosX := Theme.Song.Equalizer.X;
+
+ For I := 0 to Theme.Song.Equalizer.Bands-1 do
+ begin
+ if Theme.Song.Equalizer.Direction then
+ PosY := Theme.Song.Equalizer.Y //+ (Theme.Song.Equalizer.H + Theme.Song.Equalizer.Space) * Theme.Song.Equalizer.Length
+ else
+ PosX := Theme.Song.Equalizer.X;
+ //Draw for every visible quad
+ for J := 1 to EqualizerBands[I] do
+ begin
+ glBegin(GL_QUADS);
+ glVertex3f(PosX, PosY, Theme.Song.Equalizer.Z);
+ glVertex3f(PosX, PosY+Theme.Song.Equalizer.H, Theme.Song.Equalizer.Z);
+ glVertex3f(PosX+Theme.Song.Equalizer.W, PosY+Theme.Song.Equalizer.H, Theme.Song.Equalizer.Z);
+ glVertex3f(PosX+Theme.Song.Equalizer.W, PosY, Theme.Song.Equalizer.Z);
+ glEnd;
+
+ if Theme.Song.Equalizer.Direction then //Vertically
+ PosY := PosY - Theme.Song.Equalizer.H - Theme.Song.Equalizer.Space
+ else //Horizontally
+ PosX := PosX + Theme.Song.Equalizer.W + Theme.Song.Equalizer.Space;
+ end;
+ if Theme.Song.Equalizer.Direction then //Horizontally
+ PosX := PosX + Theme.Song.Equalizer.W + Theme.Song.Equalizer.Space
+ else //Vertically
+ PosY := PosY + Theme.Song.Equalizer.H + Theme.Song.Equalizer.Space;
+ end;
+end;
+end;
+
+Procedure TScreenSong.SelectRandomSong;
+var
+ I, I2: Integer;
+ VisArr: array of Integer;
+
+begin
+ Case PlaylistMan.Mode of
+ 0: //All Songs Just Select Random Song
+ begin
+ //When Tabs are activated then use Tab Method
+ if (Ini.Tabs_at_startup = 1) then
+ begin
+ SetLength(VisArr, 0);
+ for I := 0 to Length(CatSongs.Song) - 1 do
+ begin
+ if not PartyMedley then
+ begin
+ if not CatSongs.Song[I].Main and not SongSkipped(I)then
+ begin
+ SetLength(VisArr, Length(VisArr)+1);
+ VisArr[Length(VisArr)-1] := I;
+ end;
+ end else
+ begin
+ if not CatSongs.Song[I].Main and not SongSkipped(I) and
+ (CatSongs.Song[I].Medley.Source >= MinSource) then
+ begin
+ SetLength(VisArr, Length(VisArr)+1);
+ VisArr[Length(VisArr)-1] := I;
+ end;
+ end;
+ end;
+
+ if (Length(VisArr)>0) then
+ begin
+ I2 := Random(Length(VisArr));
+ I2 := VisArr[I2];
+
+ //Search Cat
+ for I := I2 downto low(CatSongs.Song) do
+ begin
+ if CatSongs.Song[I].Main then
+ break;
+ end;
+ //In I ist jetzt die Kategorie in I2 der Song
+ //I is the CatNum, I2 is the No of the Song within this Cat
+
+ //Choose Cat
+ CatSongs.ShowCategoryList;
+
+ //Show Cat in Top Left Mod
+ ShowCatTL (I);
+
+ CatSongs.ClickCategoryButton(I);
+ //SelectNext;
+
+ //Choose Song
+ SkipTo2(I2);
+ end;
+ end
+ //When Tabs are deactivated use easy Method
+ else
+ begin
+ SetLength(VisArr, 0);
+ for I := 0 to Length(CatSongs.Song) - 1 do
+ begin
+ if not PartyMedley then
+ begin
+ if not CatSongs.Song[I].Main and not SongSkipped(I)then
+ begin
+ SetLength(VisArr, Length(VisArr)+1);
+ VisArr[Length(VisArr)-1] := I;
+ end;
+ end else
+ begin
+ if not CatSongs.Song[I].Main and not SongSkipped(I) and
+ (CatSongs.Song[I].Medley.Source >= MinSource) then
+ begin
+ SetLength(VisArr, Length(VisArr)+1);
+ VisArr[Length(VisArr)-1] := I;
+ end;
+ end;
+ end;
+ if (Length(VisArr)>0) then
+ begin
+ I2 := Random(Length(VisArr));
+ I2 := VisArr[I2];
+
+ //Search Cat
+ for I := I2 downto low(CatSongs.Song) do
+ begin
+ if CatSongs.Song[I].Main then
+ break;
+ end;
+ //Choose Song
+ SkipTo2(I2);
+ end;
+ end;
+ end;
+ 1: //One Category Select Category and Select Random Song
+ begin
+ CatSongs.ShowCategoryList;
+ CatSongs.ClickCategoryButton(PlaylistMan.CurPlayList);
+ ShowCatTL(PlaylistMan.CurPlayList);
+
+ SetLength(VisArr, 0);
+ for I := 0 to Length(CatSongs.Song) - 1 do
+ begin
+ if not PartyMedley then
+ begin
+ if CatSongs.Song[I].Visible and not SongSkipped(I)then
+ begin
+ SetLength(VisArr, Length(VisArr)+1);
+ VisArr[Length(VisArr)-1] := I;
+ end;
+ end else
+ begin
+ if CatSongs.Song[I].Visible and not SongSkipped(I) and
+ (CatSongs.Song[I].Medley.Source >= MinSource) then
+ begin
+ SetLength(VisArr, Length(VisArr)+1);
+ VisArr[Length(VisArr)-1] := I;
+ end;
+ end;
+ end;
+ if (Length(VisArr)>0) then
+ begin
+ I2 := Random(Length(VisArr));
+ I2 := VisArr[I2];
+
+ //Search Cat
+ for I := I2 downto low(CatSongs.Song) do
+ begin
+ if CatSongs.Song[I].Main then
+ break;
+ end;
+ //Choose Song
+ SkipTo2(I2);
+ end;
+ end;
+ 2: //Playlist: Select Playlist and Select Random Song
+ begin
+ PlaylistMan.SetPlayList(PlaylistMan.CurPlayList);
+
+ SetLength(VisArr, 0);
+ for I := 0 to Length(CatSongs.Song) - 1 do
+ begin
+ if not PartyMedley then
+ begin
+ if CatSongs.Song[I].Visible and not SongSkipped(I)then
+ begin
+ SetLength(VisArr, Length(VisArr)+1);
+ VisArr[Length(VisArr)-1] := I;
+ end;
+ end else
+ begin
+ if CatSongs.Song[I].Visible and not SongSkipped(I) and
+ (CatSongs.Song[I].Medley.Source >= MinSource) then
+ begin
+ SetLength(VisArr, Length(VisArr)+1);
+ VisArr[Length(VisArr)-1] := I;
+ end;
+ end;
+ end;
+ if (Length(VisArr)>0) then
+ begin
+ I2 := Random(Length(VisArr));
+ I2 := VisArr[I2];
+
+ //Search Cat
+ for I := I2 downto low(CatSongs.Song) do
+ begin
+ if CatSongs.Song[I].Main then
+ break;
+ end;
+ //Choose Song
+ SkipTo2(I2);
+ end;
+
+ FixSelected2;
+ end;
+ end;
+
+ Music.PlayChange;
+ ChangeMusic;
+ SetScroll;
+ UpdateLCD;
+end;
+
+//do Joker in M2-MOD mode
+procedure TScreenSong.DoJokerM2;
+begin
+ if (PartySessionM2.Teams.Teaminfo[0].Joker>0) then
+ begin
+ if (((not CatSongs.Song[Interaction].Main) or (Ini.Tabs_at_startup=0)) and (ChooseableSongs>1)) then
+ begin
+ if (FoundCAT) then Dec(PartySessionM2.Teams.Teaminfo[0].Joker);
+ FoundCAT:=true;
+
+ SetLength(SkippedSongs, Length(SkippedSongs)+1);
+ SkippedSongs[Length(SkippedSongs)-1] := Interaction;
+ end;
+
+ if (ChooseableSongs > 1) then
+ begin
+ RandomSongChallenge;
+ //SkipTo(Random(CatSongs.VisibleSongs - PartySessionM2.GetSongsPlayed(CatSongs.CatNumShow) - GetSongsSkipped()));
+ SetJoker;
+
+ Music.PlayChange;
+ ChangeMusic;
+ SetScroll4;
+ end;
+ end;
+end;
+
+procedure TScreenSong.SetJoker;
+var
+ txt: string;
+ h, x, y: real;
+ ptxt: pchar;
+begin
+ //If Party Mode
+ if Mode = smParty then //Show Joker that are available
+ begin
+ if (PartySession.Teams.NumTeams >= 1) then
+ begin
+ Static[StaticTeam1Joker1].Visible := (PartySession.Teams.Teaminfo[0].Joker >= 1);
+ if PartySession.Teams.Teaminfo[0].Joker > 5 then
+ begin
+ Text[TextNumJokerTeam1].Text := 'x'+IntToStr(PartySession.Teams.Teaminfo[0].Joker);
+ Text[TextNumJokerTeam1].Visible := true;
+
+ Static[StaticTeam1Joker2].Visible := False;
+ Static[StaticTeam1Joker3].Visible := False;
+ Static[StaticTeam1Joker4].Visible := False;
+ Static[StaticTeam1Joker5].Visible := False;
+ end else
+ begin
+ Text[TextNumJokerTeam1].Visible := false;
+ Static[StaticTeam1Joker2].Visible := (PartySession.Teams.Teaminfo[0].Joker >= 2);
+ Static[StaticTeam1Joker3].Visible := (PartySession.Teams.Teaminfo[0].Joker >= 3);
+ Static[StaticTeam1Joker4].Visible := (PartySession.Teams.Teaminfo[0].Joker >= 4);
+ Static[StaticTeam1Joker5].Visible := (PartySession.Teams.Teaminfo[0].Joker >= 5);
+ end;
+ end
+ else
+ begin
+ Static[StaticTeam1Joker1].Visible := False;
+ Static[StaticTeam1Joker2].Visible := False;
+ Static[StaticTeam1Joker3].Visible := False;
+ Static[StaticTeam1Joker4].Visible := False;
+ Static[StaticTeam1Joker5].Visible := False;
+ Text[TextNumJokerTeam1].Visible := false;
+ end;
+
+ if (PartySession.Teams.NumTeams >= 2) then
+ begin
+ Static[StaticTeam2Joker1].Visible := (PartySession.Teams.Teaminfo[1].Joker >= 1);
+
+ if PartySession.Teams.Teaminfo[1].Joker > 5 then
+ begin
+ Text[TextNumJokerTeam2].Text := 'x'+IntToStr(PartySession.Teams.Teaminfo[1].Joker);
+ Text[TextNumJokerTeam2].Visible := true;
+
+ Static[StaticTeam2Joker2].Visible := False;
+ Static[StaticTeam2Joker3].Visible := False;
+ Static[StaticTeam2Joker4].Visible := False;
+ Static[StaticTeam2Joker5].Visible := False;
+ end else
+ begin
+ Text[TextNumJokerTeam2].Visible := false;
+ Static[StaticTeam2Joker2].Visible := (PartySession.Teams.Teaminfo[1].Joker >= 2);
+ Static[StaticTeam2Joker3].Visible := (PartySession.Teams.Teaminfo[1].Joker >= 3);
+ Static[StaticTeam2Joker4].Visible := (PartySession.Teams.Teaminfo[1].Joker >= 4);
+ Static[StaticTeam2Joker5].Visible := (PartySession.Teams.Teaminfo[1].Joker >= 5);
+ end;
+ end
+ else
+ begin
+ Static[StaticTeam2Joker1].Visible := False;
+ Static[StaticTeam2Joker2].Visible := False;
+ Static[StaticTeam2Joker3].Visible := False;
+ Static[StaticTeam2Joker4].Visible := False;
+ Static[StaticTeam2Joker5].Visible := False;
+ Text[TextNumJokerTeam2].Visible := false;
+ end;
+
+ if (PartySession.Teams.NumTeams >= 3) then
+ begin
+ Static[StaticTeam3Joker1].Visible := (PartySession.Teams.Teaminfo[2].Joker >= 1);
+
+ if PartySession.Teams.Teaminfo[2].Joker > 5 then
+ begin
+ Text[TextNumJokerTeam3].Text := 'x'+IntToStr(PartySession.Teams.Teaminfo[2].Joker);
+ Text[TextNumJokerTeam3].Visible := true;
+
+ Static[StaticTeam3Joker2].Visible := False;
+ Static[StaticTeam3Joker3].Visible := False;
+ Static[StaticTeam3Joker4].Visible := False;
+ Static[StaticTeam3Joker5].Visible := False;
+ end else
+ begin
+ Text[TextNumJokerTeam3].Visible := false;
+ Static[StaticTeam3Joker2].Visible := (PartySession.Teams.Teaminfo[2].Joker >= 2);
+ Static[StaticTeam3Joker3].Visible := (PartySession.Teams.Teaminfo[2].Joker >= 3);
+ Static[StaticTeam3Joker4].Visible := (PartySession.Teams.Teaminfo[2].Joker >= 4);
+ Static[StaticTeam3Joker5].Visible := (PartySession.Teams.Teaminfo[2].Joker >= 5);
+ end;
+ end
+ else
+ begin
+ Static[StaticTeam3Joker1].Visible := False;
+ Static[StaticTeam3Joker2].Visible := False;
+ Static[StaticTeam3Joker3].Visible := False;
+ Static[StaticTeam3Joker4].Visible := False;
+ Static[StaticTeam3Joker5].Visible := False;
+ Text[TextNumJokerTeam3].Visible := false;
+ end;
+ end
+ else if (Mode = smChallenge) then //M2-MOD-mode
+ begin
+ if (PartySessionM2.Teams.NumTeams >= 1) then
+ begin
+ Static[StaticTeam1Joker1].Visible := (PartySessionM2.Teams.Teaminfo[0].Joker >= 1);
+ Static[StaticTeam1Joker2].Visible := (PartySessionM2.Teams.Teaminfo[0].Joker >= 2);
+ Static[StaticTeam1Joker3].Visible := (PartySessionM2.Teams.Teaminfo[0].Joker >= 3);
+ Static[StaticTeam1Joker4].Visible := (PartySessionM2.Teams.Teaminfo[0].Joker >= 4);
+ Static[StaticTeam1Joker5].Visible := (PartySessionM2.Teams.Teaminfo[0].Joker >= 5);
+ Text[TextNumJokerTeam1].Visible := false;
+ end
+ else
+ begin
+ Static[StaticTeam1Joker1].Visible := false;
+ Static[StaticTeam1Joker2].Visible := false;
+ Static[StaticTeam1Joker3].Visible := false;
+ Static[StaticTeam1Joker4].Visible := false;
+ Static[StaticTeam1Joker5].Visible := false;
+ Text[TextNumJokerTeam1].Visible := false;
+ end;
+
+ if (PartySessionM2.Teams.NumTeams >= 2) then
+ begin
+ Static[StaticTeam2Joker1].Visible := (PartySessionM2.Teams.Teaminfo[1].Joker >= 1);
+ Static[StaticTeam2Joker2].Visible := (PartySessionM2.Teams.Teaminfo[1].Joker >= 2);
+ Static[StaticTeam2Joker3].Visible := (PartySessionM2.Teams.Teaminfo[1].Joker >= 3);
+ Static[StaticTeam2Joker4].Visible := (PartySessionM2.Teams.Teaminfo[1].Joker >= 4);
+ Static[StaticTeam2Joker5].Visible := (PartySessionM2.Teams.Teaminfo[1].Joker >= 5);
+ Text[TextNumJokerTeam2].Visible := false;
+ end
+ else
+ begin
+ Static[StaticTeam2Joker1].Visible := false;
+ Static[StaticTeam2Joker2].Visible := false;
+ Static[StaticTeam2Joker3].Visible := false;
+ Static[StaticTeam2Joker4].Visible := false;
+ Static[StaticTeam2Joker5].Visible := false;
+ Text[TextNumJokerTeam2].Visible := false;
+ end;
+
+ if (PartySessionM2.Teams.NumTeams >= 3) then
+ begin
+ Static[StaticTeam3Joker1].Visible := (PartySessionM2.Teams.Teaminfo[2].Joker >= 1);
+ Static[StaticTeam3Joker2].Visible := (PartySessionM2.Teams.Teaminfo[2].Joker >= 2);
+ Static[StaticTeam3Joker3].Visible := (PartySessionM2.Teams.Teaminfo[2].Joker >= 3);
+ Static[StaticTeam3Joker4].Visible := (PartySessionM2.Teams.Teaminfo[2].Joker >= 4);
+ Static[StaticTeam3Joker5].Visible := (PartySessionM2.Teams.Teaminfo[2].Joker >= 5);
+ Text[TextNumJokerTeam3].Visible := false;
+ end
+ else
+ begin
+ Static[StaticTeam3Joker1].Visible := false;
+ Static[StaticTeam3Joker2].Visible := false;
+ Static[StaticTeam3Joker3].Visible := false;
+ Static[StaticTeam3Joker4].Visible := false;
+ Static[StaticTeam3Joker5].Visible := false;
+ Text[TextNumJokerTeam3].Visible := false;
+ end;
+ end else
+ begin //Hide all
+ Static[StaticTeam1Joker1].Visible := False;
+ Static[StaticTeam1Joker2].Visible := False;
+ Static[StaticTeam1Joker3].Visible := False;
+ Static[StaticTeam1Joker4].Visible := False;
+ Static[StaticTeam1Joker5].Visible := False;
+ Text[TextNumJokerTeam1].Visible := false;
+
+ Static[StaticTeam2Joker1].Visible := False;
+ Static[StaticTeam2Joker2].Visible := False;
+ Static[StaticTeam2Joker3].Visible := False;
+ Static[StaticTeam2Joker4].Visible := False;
+ Static[StaticTeam2Joker5].Visible := False;
+ Text[TextNumJokerTeam2].Visible := false;
+
+ Static[StaticTeam3Joker1].Visible := False;
+ Static[StaticTeam3Joker2].Visible := False;
+ Static[StaticTeam3Joker3].Visible := False;
+ Static[StaticTeam3Joker4].Visible := False;
+ Static[StaticTeam3Joker5].Visible := False;
+ Text[TextNumJokerTeam3].Visible := false;
+ end;
+end;
+
+procedure TScreenSong.SetStatics;
+var
+ I: Integer;
+ Visible: Boolean;
+begin
+ //Set Visibility of Party M2 Statics and Text
+ Visible := (Mode = smChallenge);
+
+ For I := 0 to high(StaticM2Party) do
+ Static[StaticM2Party[I]].Visible := Visible;
+
+ For I := 0 to high(TextM2Party) do
+ Text[TextM2Party[I]].Visible := Visible;
+
+ //Set Visibility of Party Statics and Text
+ Visible := (Mode = smParty);
+
+ For I := 0 to high(StaticParty) do
+ Static[StaticParty[I]].Visible := Visible;
+
+ For I := 0 to high(TextParty) do
+ Text[TextParty[I]].Visible := Visible;
+
+ //Set Visibility of Non Party Statics and Text
+ Visible := (Mode = smNormal);
+
+ For I := 0 to high(StaticNonParty) do
+ Static[StaticNonParty[I]].Visible := Visible;
+
+ For I := 0 to high(TextNonParty) do
+ Text[TextNonParty[I]].Visible := Visible;
+
+end;
+
+//Procedures for Menu
+
+procedure TScreenSong.StartSong;
+begin
+ CatSongs.Selected := Interaction;
+ Music.Stop;
+ //Party Mode
+ if (Mode = smParty) or (Mode = smChallenge) then
+ begin
+ FadeTo(@ScreenSingModi);
+ end
+ else
+ begin
+ FadeTo(@ScreenSing);
+ end;
+end;
+
+procedure TScreenSong.SelectPlayers;
+begin
+ CatSongs.Selected := Interaction;
+ Music.Stop;
+ acClose;
+ VidVis := none;
+ ScreenName.Goto_SingScreen := True;
+ FadeTo(@ScreenName);
+end;
+
+procedure TScreenSong.OpenEditor;
+begin
+ if (Length(Songs.Song) > 0) and (not CatSongs.Song[Interaction].Main) AND (Mode = smNormal) then begin
+ Music.Stop;
+ acClose;
+ VidVis := none;
+ Music.PlayStart;
+ ScreenEditSub.Path := CatSongs.Song[Interaction].Path;
+ ScreenEditSub.FileName := CatSongs.Song[Interaction].FileName;
+ ScreenEditSub.SongIndex := Interaction;
+ FadeTo(@ScreenEditSub);
+ end;
+end;
+
+//Team No of Team (0-5)
+procedure TScreenSong.DoJoker (Team: Byte; SDL_ModState: Word);
+begin
+ if not PartyMedley and (ChooseableSongs>1) and
+ (Mode = smParty) AND (PartySession.Teams.NumTeams >= Team + 1) AND (PartySession.Teams.Teaminfo[Team].Joker > 0) then
+ begin
+ //Joker spielen
+ if (SDL_ModState <> KMOD_LALT) then
+ Dec(PartySession.Teams.Teaminfo[Team].Joker);
+
+ SetLength(SkippedSongs, Length(SkippedSongs)+1);
+ SkippedSongs[Length(SkippedSongs)-1] := Interaction;
+ SelectRandomSong;
+ SetJoker;
+ end;
+
+ if PartyMedley and (Mode=smChallenge) and (PartySessionM2.Teams.Teaminfo[0].Joker>0) then
+ begin
+ if (ChooseableSongs>1) then
+ begin
+ Dec(PartySessionM2.Teams.Teaminfo[0].Joker);
+
+ SetLength(SkippedSongs, Length(SkippedSongs)+1);
+ SkippedSongs[Length(SkippedSongs)-1] := Interaction;
+
+ SelectRandomSong;
+ SetJoker;
+ end;
+ end;
+
+ if PartyMedley and (Mode=smParty) and (PartySession.Teams.Teaminfo[Team].Joker>0) then
+ begin
+ if (ChooseableSongs>1) then
+ begin
+ if (SDL_ModState <> KMOD_LALT) then
+ Dec(PartySession.Teams.Teaminfo[Team].Joker);
+
+ SetLength(SkippedSongs, Length(SkippedSongs)+1);
+ SkippedSongs[Length(SkippedSongs)-1] := Interaction;
+
+ SelectRandomSong;
+ SetJoker;
+ end;
+ end;
+
+end;
+
+//Detailed Cover Unloading. Unloads the Detailed, uncached Cover of the cur. Song
+procedure TScreenSong.UnLoadDetailedCover;
+begin
+ CoverTime := 0;
+
+ Button[Interaction].Texture := Texture.GetTexture(Button[Interaction].Texture.Name, 'Plain', true); // 0.5.0: show cached texture
+ Button[Interaction].Texture2.Alpha := 0;
+
+ if Button[Interaction].Texture.Name <> Skin.GetTextureFileName('SongCover') then
+ Texture.UnloadTexture(Button[Interaction].Texture.Name, false);
+end;
+
+procedure TScreenSong.Refresh;
+begin {
+CatSongs.Refresh;
+CatSongs.ShowCategoryList;
+Interaction := 0;
+SelectNext;
+FixSelected; }
+
+end;
+
+function TScreenSong.getVisibleMedleyArr(MinS: TMedleySource): TVisArr;
+var
+ I: integer;
+ res: TVisArr;
+begin
+ SetLength(res, 0);
+ if CatSongs.Song[Interaction].main then
+ begin
+ for I := 0 to Length(CatSongs.Song) - 1 do
+ begin
+ if not CatSongs.Song[I].main and (CatSongs.Song[I].Medley.Source >= MinS) then
+ begin
+ SetLength(res, Length(res)+1);
+ res[Length(res)-1] := I;
+ end;
+ end;
+ end else begin
+ for I := 0 to Length(CatSongs.Song) - 1 do
+ begin
+ if CatSongs.Song[I].Visible and (CatSongs.Song[I].Medley.Source >= MinS) then
+ begin
+ SetLength(res, Length(res)+1);
+ res[Length(res)-1] := I;
+ end;
+ end;
+ end;
+ Result := res;
+end;
+
+//start Medley round
+procedure TScreenSong.StartMedley(num: integer; MinS: TMedleySource);
+ procedure AddSong(SongNr: integer);
+ begin
+ SetLength(PlaylistMedley.Song, Length(PlaylistMedley.Song)+1);
+ PlaylistMedley.Song[Length(PlaylistMedley.Song)-1] := SongNr;
+ end;
+
+ function SongAdded(SongNr: integer): boolean;
+ var
+ i: integer;
+ skipped :boolean;
+ begin
+ skipped := false;
+ for i := 0 to Length(PlaylistMedley.Song) - 1 do
+ begin
+ if (SongNr=PlaylistMedley.Song[i]) then
+ begin
+ skipped:=true;
+ break;
+ end;
+ end;
+ Result:=skipped;
+ end;
+
+ function NumSongsAdded(): Integer;
+ begin
+ Result := Length(PlaylistMedley.Song);
+ end;
+
+ function GetNextSongNr(MinS: TMedleySource): integer;
+ var
+ I, num: integer;
+ unused_arr: array of integer;
+ visible_arr: TVisArr;
+ begin
+ SetLength(unused_arr, 0);
+ visible_arr := getVisibleMedleyArr(MinS);
+ for I := 0 to Length(visible_arr) - 1 do
+ begin
+ if (not SongAdded(visible_arr[I])) then
+ begin
+ SetLength(unused_arr, Length(unused_arr)+1);
+ unused_arr[Length(unused_arr)-1] := visible_arr[I];
+ end;
+ end;
+
+ num := random(Length(unused_arr));
+ Result := unused_arr[num];
+end;
+
+var
+ I: integer;
+ VS: integer;
+
+begin
+ if (num>0) and not PartyMedley and not MakeMedley then
+ begin
+ VS := Length(getVisibleMedleyArr(MinS));
+ if VS < num then
+ PlaylistMedley.NumMedleySongs := VS
+ else
+ PlaylistMedley.NumMedleySongs := num;
+
+ Randomize;
+ //set up Playlist Medley
+ SetLength(PlaylistMedley.Song, 0);
+ for I := 0 to PlaylistMedley.NumMedleySongs - 1 do
+ begin
+ AddSong(GetNextSongNr(MinS));
+ end;
+ end else if not PartyMedley and not MakeMedley then //start this song
+ begin
+ SetLength(PlaylistMedley.Song, 1);
+ PlaylistMedley.Song[0] := Interaction;
+ PlaylistMedley.NumMedleySongs := 1;
+ end else if PartyMedley then //PartyMedley
+ begin
+ AddSong(Interaction);
+ PlaylistMedley.NumMedleySongs := Length(PlaylistMedley.Song);
+
+ SetLength(SkippedSongs, Length(SkippedSongs)+1);
+ SkippedSongs[Length(SkippedSongs)-1] := Interaction;
+
+ if ((Mode=smParty) and (PartySession.Rounds[PartySession.CurRound].MedleySurprise)) or
+ ((Mode=smChallenge) and (PartySessionM2.Rounds[PartySessionM2.CurRound].MedleySurprise)) then
+ begin
+ VS := Length(getVisibleMedleyArr(MinS));
+ if VS < num then
+ PlaylistMedley.NumMedleySongs := VS
+ else
+ PlaylistMedley.NumMedleySongs := num;
+
+ Randomize;
+
+ //set up Playlist Medley
+ for I := 1 to PlaylistMedley.NumMedleySongs - 1 do
+ begin
+ AddSong(GetNextSongNr(MinS));
+ end;
+ end;
+ end else if MakeMedley then
+ begin
+ if (CatSongs.Song[Interaction].Medley.Source>=MinS) then
+ begin
+ AddSong(Interaction);
+ PlaylistMedley.NumMedleySongs := Length(PlaylistMedley.Song);
+ end;
+ end;
+
+ if (Mode=smNormal) and not MakeMedley then
+ begin
+ Mode := smMedley;
+ Music.Stop;
+ //TODO: how about case 2? menu for medley mode?
+ case Ini.OnSongClick of
+ 0: FadeTo(@ScreenSing);
+ 1: SelectPlayers;
+ 2: FadeTo(@ScreenSing);
+ {2: begin
+ if (CatSongs.CatNumShow = -3) then
+ ScreenSongMenu.MenuShow(SM_Playlist)
+ else
+ ScreenSongMenu.MenuShow(SM_Main);
+ end;}
+ end;
+ end else if PartyMedley then
+ begin
+ if (PlaylistMedley.NumMedleySongs=num) or
+ (ChooseableSongs=1) then
+ begin
+ Music.Stop;
+ FadeTo(@ScreenSingModi);
+ end else
+ SelectRandomSong;
+ end else if MakeMedley then
+ begin
+ if PlaylistMedley.NumMedleySongs=num then
+ begin
+ Mode := smMedley;
+ Music.Stop;
+ //TODO: how about case 2? menu for medley mode?
+ case Ini.OnSongClick of
+ 0: FadeTo(@ScreenSing);
+ 1: SelectPlayers;
+ 2: FadeTo(@ScreenSing);
+ {2: begin
+ if (CatSongs.CatNumShow = -3) then
+ ScreenSongMenu.MenuShow(SM_Playlist)
+ else
+ ScreenSongMenu.MenuShow(SM_Main);
+ end;}
+ end;
+ end;
+ end;
+end;
+
+
+end. \ No newline at end of file
diff --git a/Game/Code/Screens/UScreenSongJumpto.pas b/Game/Code/Screens/UScreenSongJumpto.pas
new file mode 100644
index 00000000..0b643ebc
--- /dev/null
+++ b/Game/Code/Screens/UScreenSongJumpto.pas
@@ -0,0 +1,213 @@
+unit UScreenSongJumpto;
+
+interface
+
+uses
+ UMenu, SDL, UDisplay, UMusic, UFiles, SysUtils, UThemes, UVideo;
+
+type
+ TScreenSongJumpto = class(TMenu)
+ const
+ ID='ID_031'; //for help system
+ private
+ //For ChangeMusic
+ LastPlayed: Integer;
+ VisibleBool: Boolean;
+ public
+ VisSongs: Integer;
+
+ constructor Create; override;
+
+ //Visible //Whether the Menu should be Drawn
+ //Whether the Menu should be Drawn
+ procedure SetVisible(Value: Boolean);
+ property Visible: Boolean read VisibleBool write SetVisible;
+
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ function Draw: boolean; override;
+
+ procedure SetTextFound(const Count: Cardinal);
+ end;
+
+var
+ IType: Array [0..2] of String;
+ SelectType: Integer;
+
+
+implementation
+
+uses UGraphic, UHelp, UMain, UIni, UTexture, ULanguage, UParty, USongs, UScreenSong, ULog;
+
+function TScreenSongJumpto.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_0..SDLK_9, SDLK_A..SDLK_Z, SDLK_SPACE, SDLK_MINUS, SDLK_EXCLAIM, SDLK_COMMA, SDLK_SLASH, SDLK_ASTERISK, SDLK_QUESTION, SDLK_QUOTE, SDLK_QUOTEDBL, SDLK_LEFTBRACKET, SDLK_SEMICOLON:
+ begin
+ if Interaction = 0 then
+ begin
+ Button[0].Text[0].Text := Button[0].Text[0].Text + chr(ScanCode);
+ SetTextFound(CatSongs.SetFilter(Button[0].Text[0].Text, SelectType));
+ end;
+ end;
+
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_BACKSPACE:
+ begin
+ if (Interaction = 0) AND (Length(Button[0].Text[0].Text) > 0) then
+ begin
+ Button[0].Text[0].DeleteLastL;
+ SetTextFound(CatSongs.SetFilter(Button[0].Text[0].Text, SelectType));
+ end;
+ end;
+
+ SDLK_RETURN,
+ SDLK_ESCAPE:
+ begin
+ Visible := False;
+ Music.PlayBack;
+ if (VisSongs = 0) AND (Length(Button[0].Text[0].Text) > 0) then
+ begin
+ ScreenSong.UnLoadDetailedCover;
+ Button[0].Text[0].Text := '';
+ CatSongs.SetFilter('', 0);
+ SetTextFound(0);
+ end;
+ end;
+
+ // Up and Down could be done at the same time,
+ // but I don't want to declare variables inside
+ // functions like this one, called so many times
+ SDLK_DOWN:
+ begin
+ {SelectNext;
+ Button[0].Text[0].Selected := (Interaction = 0);}
+ end;
+
+ SDLK_UP:
+ begin
+ {SelectPrev;
+ Button[0].Text[0].Selected := (Interaction = 0); }
+ end;
+
+ SDLK_RIGHT:
+ begin
+ Interaction := 1;
+ InteractInc;
+ if (Length(Button[0].Text[0].Text) > 0) then
+ SetTextFound(CatSongs.SetFilter(Button[0].Text[0].Text, SelectType));
+ Interaction := 0;
+ end;
+ SDLK_LEFT:
+ begin
+ Interaction := 1;
+ InteractDec;
+ if (Length(Button[0].Text[0].Text) > 0) then
+ SetTextFound(CatSongs.SetFilter(Button[0].Text[0].Text, SelectType));
+ Interaction := 0;
+ end;
+ end;
+ end;
+end;
+
+constructor TScreenSongJumpto.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ AddText(Theme.SongJumpto.TextFound);
+
+ LoadFromTheme(Theme.SongJumpto);
+
+ AddButton(Theme.SongJumpto.ButtonSearchText);
+ if (Length(Button[0].Text) = 0) then
+ AddButtonText(14, 20, '');
+
+ SelectType := 0;
+ AddSelectSlide(Theme.SongJumpto.SelectSlideType, SelectType, Theme.SongJumpto.IType);
+
+
+ Interaction := 0;
+ LastPlayed := 0;
+end;
+
+procedure TScreenSongJumpto.SetVisible(Value: Boolean);
+begin
+//If change from unvisible to Visible then OnShow
+ if (VisibleBool = False) AND (Value = True) then
+ OnShow;
+
+ VisibleBool := Value;
+end;
+
+procedure TScreenSongJumpto.onShow;
+begin
+ //Reset Screen if no Old Search is Displayed
+ if (CatSongs.CatNumShow <> -2) then
+ begin
+ SelectsS[0].SetSelectOpt(0);
+
+ Button[0].Text[0].Text := '';
+ Text[0].Text := Theme.SongJumpto.NoSongsFound;
+ end;
+
+ //Select Input
+ Interaction := 0;
+ Button[0].Text[0].Selected := True;
+
+ LastPlayed := ScreenSong.Interaction;
+
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenSongJumpTo)');
+end;
+
+function TScreenSongJumpto.Draw: boolean;
+begin
+ Result := inherited Draw;
+end;
+
+procedure TScreenSongJumpto.SetTextFound(const Count: Cardinal);
+begin
+ if (Count = 0) then
+ begin
+ Text[0].Text := Theme.SongJumpto.NoSongsFound;
+ if (Length(Button[0].Text[0].Text) = 0) then
+ ScreenSong.HideCatTL
+ else
+ ScreenSong.ShowCatTLCustom(Format(Theme.SongJumpto.CatText, [Button[0].Text[0].Text]));
+ end
+ else
+ begin
+ Text[0].Text := Format(Theme.SongJumpto.SongsFound, [Count]);
+
+ //Set CatTopLeftText
+ ScreenSong.ShowCatTLCustom(Format(Theme.SongJumpto.CatText, [Button[0].Text[0].Text]));
+ end;
+
+
+ //Set visSongs
+ VisSongs := Count;
+
+ //Fix SongSelection
+ ScreenSong.Interaction := high(CatSongs.Song);
+ ScreenSong.SelectNext;
+ ScreenSong.FixSelected;
+
+ //Play Correct Music
+ if (ScreenSong.Interaction <> LastPlayed) then
+ begin
+ LastPlayed := ScreenSong.Interaction;
+
+ ScreenSong.ChangeMusic;
+ end;
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenSongMenu.pas b/Game/Code/Screens/UScreenSongMenu.pas
new file mode 100644
index 00000000..880e3855
--- /dev/null
+++ b/Game/Code/Screens/UScreenSongMenu.pas
@@ -0,0 +1,661 @@
+unit UScreenSongMenu;
+
+interface
+
+uses
+ UMenu, SDL, UDisplay, UMusic, UFiles, SysUtils, UThemes;
+
+type
+ TScreenSongMenu = class(TMenu)
+ private
+ CurMenu: Byte; //Num of the cur. Shown Menu
+ ID: String; //for help-system
+
+ public
+ Visible: Boolean; //Whether the Menu should be Drawn
+
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ function Draw: boolean; override;
+ procedure MenuShow(sMenu: Byte);
+ procedure HandleReturn;
+ end;
+
+const
+ SM_Main = 1;
+
+ SM_PlayList = 64 or 1;
+ SM_Playlist_Add = 64 or 2;
+ SM_Playlist_New = 64 or 3;
+
+ SM_Playlist_DelItem = 64 or 5;
+
+ SM_Playlist_Load = 64 or 8 or 1;
+ SM_Playlist_Del = 64 or 8 or 5;
+
+
+ SM_Party_Main = 128 or 1;
+ SM_Party_Joker = 128 or 2;
+
+var
+ ISelections: Array of String;
+ SelectValue: Integer;
+
+
+implementation
+
+uses UGraphic, UMain, UDatabase, UScreenSong, UVideo, ULog, UIni, UTexture, ULanguage, UParty, UPlaylist, USongs, UHelp;
+
+function TScreenSongMenu.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+var
+ SDL_ModState: Word;
+
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ SDL_ModState := SDL_GetModState and (KMOD_LSHIFT + KMOD_RSHIFT
+ + KMOD_LCTRL + KMOD_RCTRL + KMOD_LALT + KMOD_RALT);
+
+ if (CurMenu = SM_Playlist_New) AND (Interaction=0) then
+ begin
+ case PressedKey of
+ SDLK_0..SDLK_9, SDLK_A..SDLK_Z, SDLK_SPACE, SDLK_MINUS, SDLK_EXCLAIM, SDLK_COMMA, SDLK_SLASH, SDLK_ASTERISK, SDLK_QUESTION, SDLK_QUOTE, SDLK_QUOTEDBL:
+ begin
+ Button[Interaction].Text[0].Text := Button[Interaction].Text[0].Text + chr(ScanCode);
+ exit;
+ end;
+
+ SDLK_BACKSPACE:
+ begin
+ Button[Interaction].Text[0].DeleteLastL;
+ exit;
+ end;
+ end;
+ end;
+
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ Help.SetHelpID(ID);
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_V:
+ begin
+ if UVideo.VideoOpened then
+ begin
+ if ScreenSong.VidVis=full then
+ ScreenSong.VidVis:=windowed
+ else begin
+ ScreenSong.VidVis:=full;
+ UVideo.SetAspectCorrection(TAspectCorrection(
+ DataBase.GetAspect(CatSongs.Song[Interaction].Artist,
+ CatSongs.Song[Interaction].Title, Ini.AspectCorrect)));
+ ScreenSong.AspectHandler.changed := true;
+ ScreenSong.AspectHandler.change_time := Czas.Teraz;
+ end;
+ Visible := False;
+ end;
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ Music.PlayBack;
+ Visible := False;
+ end;
+
+ SDLK_RETURN:
+ begin
+ HandleReturn;
+ end;
+
+ SDLK_DOWN: InteractNext;
+ SDLK_UP: InteractPrev;
+
+ SDLK_RIGHT:
+ begin
+ if (Interaction=3) then
+ InteractInc;
+ end;
+ SDLK_LEFT:
+ begin
+ if (Interaction=3) then
+ InteractDec;
+ end;
+
+ SDLK_1:
+ begin //Jocker
+ //Joker spielen
+ case CurMenu of
+ SM_Party_Main:
+ begin
+ ScreenSong.DoJoker(0, SDL_ModState)
+ end;
+ end;
+ end;
+ SDLK_2:
+ begin //Jocker
+ //Joker spielen
+ case CurMenu of
+ SM_Party_Main:
+ begin
+ ScreenSong.DoJoker(1, SDL_ModState)
+ end;
+ end;
+ end;
+ SDLK_3:
+ begin //Jocker
+ //Joker spielen
+ case CurMenu of
+ SM_Party_Main:
+ begin
+ ScreenSong.DoJoker(2, SDL_ModState)
+ end;
+ end;
+ end;
+
+
+ end;
+ end;
+end;
+
+constructor TScreenSongMenu.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ //Create Dummy SelectSlide Entrys
+ SetLength(ISelections, 1);
+ ISelections[0] := 'Dummy';
+
+
+ AddText(Theme.SongMenu.TextMenu);
+
+ LoadFromTheme(Theme.SongMenu);
+
+ AddButton(Theme.SongMenu.Button1);
+ if (Length(Button[0].Text) = 0) then
+ AddButtonText(14, 20, 'Button 1');
+
+ AddButton(Theme.SongMenu.Button2);
+ if (Length(Button[1].Text) = 0) then
+ AddButtonText(14, 20, 'Button 2');
+
+ AddButton(Theme.SongMenu.Button3);
+ if (Length(Button[2].Text) = 0) then
+ AddButtonText(14, 20, 'Button 3');
+
+ AddSelectSlide(Theme.SongMenu.SelectSlide3, SelectValue, ISelections);
+
+ AddButton(Theme.SongMenu.Button4);
+ if (Length(Button[3].Text) = 0) then
+ AddButtonText(14, 20, 'Button 4');
+
+
+ Interaction := 0;
+end;
+
+function TScreenSongMenu.Draw: boolean;
+begin
+ inherited Draw;
+end;
+
+procedure TScreenSongMenu.onShow;
+begin
+
+end;
+
+procedure TScreenSongMenu.MenuShow(sMenu: Byte);
+begin
+ Interaction := 0; //Reset Interaction
+ Visible := True; //Set Visible
+ Case sMenu of
+ SM_Main:
+ begin
+ ID := 'ID_032';
+ CurMenu := sMenu;
+ Text[0].Text := Language.Translate('SONG_MENU_NAME_MAIN');
+
+ Button[0].Visible := True;
+ Button[1].Visible := True;
+ Button[2].Visible := True;
+ Button[3].Visible := True;
+ SelectsS[0].Visible := False;
+
+ Button[0].Text[0].Text := Language.Translate('SONG_MENU_PLAY');
+ Button[1].Text[0].Text := Language.Translate('SONG_MENU_CHANGEPLAYERS');
+ Button[2].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_ADD');
+ Button[3].Text[0].Text := Language.Translate('SONG_MENU_EDIT');
+ end;
+
+ SM_PlayList:
+ begin
+ ID := 'ID_032';
+ CurMenu := sMenu;
+ Text[0].Text := Language.Translate('SONG_MENU_NAME_PLAYLIST');
+
+ Button[0].Visible := True;
+ Button[1].Visible := True;
+ Button[2].Visible := True;
+ Button[3].Visible := True;
+ SelectsS[0].Visible := False;
+
+ Button[0].Text[0].Text := Language.Translate('SONG_MENU_PLAY');
+ Button[1].Text[0].Text := Language.Translate('SONG_MENU_CHANGEPLAYERS');
+ Button[2].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_DEL');
+ Button[3].Text[0].Text := Language.Translate('SONG_MENU_EDIT');
+ end;
+
+ SM_Playlist_Add:
+ begin
+ ID := 'ID_032';
+ CurMenu := sMenu;
+ Text[0].Text := Language.Translate('SONG_MENU_NAME_PLAYLIST_ADD');
+
+ Button[0].Visible := True;
+ Button[1].Visible := False;
+ Button[2].Visible := False;
+ Button[3].Visible := True;
+ SelectsS[0].Visible := True;
+
+ Button[0].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_ADD_NEW');
+ Button[3].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_ADD_EXISTING');
+
+ SetLength(ISelections, Length(PlaylistMan.Playlists));
+ PlaylistMan.GetNames(ISelections);
+
+ if (Length(ISelections)>=1) then
+ begin
+ UpdateSelectSlideOptions(Theme.SongMenu.SelectSlide3, 0, ISelections, SelectValue);
+ end
+ else
+ begin
+ Button[3].Visible := False;
+ SelectsS[0].Visible := False;
+ Button[2].Visible := True;
+ Button[2].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_NOEXISTING');
+ end;
+ end;
+
+ SM_Playlist_New:
+ begin
+ ID := 'ID_032';
+ CurMenu := sMenu;
+ Text[0].Text := Language.Translate('SONG_MENU_NAME_PLAYLIST_NEW');
+
+ Button[0].Visible := True;
+ Button[1].Visible := False;
+ Button[2].Visible := True;
+ Button[3].Visible := True;
+ SelectsS[0].Visible := False;
+
+ Button[0].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_NEW_UNNAMED');
+ Button[2].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_NEW_CREATE');
+ Button[3].Text[0].Text := Language.Translate('SONG_MENU_CANCEL');
+ end;
+
+ SM_Playlist_DelItem:
+ begin
+ ID := 'ID_032';
+ CurMenu := sMenu;
+ Text[0].Text := Language.Translate('SONG_MENU_NAME_PLAYLIST_DELITEM');
+
+ Button[0].Visible := True;
+ Button[1].Visible := False;
+ Button[2].Visible := False;
+ Button[3].Visible := True;
+ SelectsS[0].Visible := False;
+
+ Button[0].Text[0].Text := Language.Translate('SONG_MENU_YES');
+ Button[3].Text[0].Text := Language.Translate('SONG_MENU_CANCEL');
+ end;
+
+ SM_Playlist_Load:
+ begin
+ ID := 'ID_032';
+ CurMenu := sMenu;
+ Text[0].Text := Language.Translate('SONG_MENU_NAME_PLAYLIST_LOAD');
+
+ //Show Delete Curent Playlist Button when Playlist is opened
+ Button[0].Visible := (CatSongs.CatNumShow = -3);
+
+ Button[1].Visible := False;
+ Button[2].Visible := False;
+ Button[3].Visible := True;
+ SelectsS[0].Visible := True;
+
+ Button[0].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_DELCURRENT');
+ Button[3].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_LOAD');
+
+ SetLength(ISelections, Length(PlaylistMan.Playlists));
+ PlaylistMan.GetNames(ISelections);
+
+ if (Length(ISelections)>=1) then
+ begin
+ UpdateSelectSlideOptions(Theme.SongMenu.SelectSlide3, 0, ISelections, SelectValue);
+ Interaction := 3;
+ end
+ else
+ begin
+ Button[3].Visible := False;
+ SelectsS[0].Visible := False;
+ Button[2].Visible := True;
+ Button[2].Text[0].Text := Language.Translate('SONG_MENU_PLAYLIST_NOEXISTING');
+ Interaction := 2;
+ end;
+ end;
+
+ SM_Playlist_Del:
+ begin
+ ID := 'ID_032';
+ CurMenu := sMenu;
+ Text[0].Text := Language.Translate('SONG_MENU_NAME_PLAYLIST_DEL');
+
+ Button[0].Visible := True;
+ Button[1].Visible := False;
+ Button[2].Visible := False;
+ Button[3].Visible := True;
+ SelectsS[0].Visible := False;
+
+ Button[0].Text[0].Text := Language.Translate('SONG_MENU_YES');
+ Button[3].Text[0].Text := Language.Translate('SONG_MENU_CANCEL');
+ end;
+
+
+ SM_Party_Main:
+ begin
+ ID := 'ID_033';
+ CurMenu := sMenu;
+ Text[0].Text := Language.Translate('SONG_MENU_NAME_PARTY_MAIN');
+
+ Button[0].Visible := True;
+ Button[1].Visible := False;
+ Button[2].Visible := False;
+ Button[3].Visible := True;
+ SelectsS[0].Visible := False;
+
+ Button[0].Text[0].Text := Language.Translate('SONG_MENU_PLAY');
+ //Button[1].Text[0].Text := Language.Translate('SONG_MENU_JOKER');
+ //Button[2].Text[0].Text := Language.Translate('SONG_MENU_PLAYMODI');
+ Button[3].Text[0].Text := Language.Translate('SONG_MENU_JOKER');
+ end;
+
+ SM_Party_Joker:
+ begin
+ ID := 'ID_033';
+ CurMenu := sMenu;
+ Text[0].Text := Language.Translate('SONG_MENU_NAME_PARTY_JOKER');
+
+ Button[0].Visible := (PartySession.Teams.NumTeams >= 1) AND (PartySession.Teams.Teaminfo[0].Joker > 0);
+ Button[1].Visible := (PartySession.Teams.NumTeams >= 2) AND (PartySession.Teams.Teaminfo[1].Joker > 0);
+ Button[2].Visible := (PartySession.Teams.NumTeams >= 3) AND (PartySession.Teams.Teaminfo[2].Joker > 0);
+ Button[3].Visible := True;
+ SelectsS[0].Visible := False;
+
+ Button[0].Text[0].Text := String(PartySession.Teams.Teaminfo[0].Name);
+ Button[1].Text[0].Text := String(PartySession.Teams.Teaminfo[1].Name);
+ Button[2].Text[0].Text := String(PartySession.Teams.Teaminfo[2].Name);
+ Button[3].Text[0].Text := Language.Translate('SONG_MENU_CANCEL');
+
+ //Set right Interaction
+ if (not Button[0].Visible) then
+ begin
+ if (not Button[1].Visible) then
+ begin
+ if (not Button[2].Visible) then
+ begin
+ Interaction := 4;
+ end
+ else Interaction := 2;
+ end
+ else Interaction := 1;
+ end;
+
+ end;
+ end;
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenSongMenu)');
+end;
+
+procedure TScreenSongMenu.HandleReturn;
+begin
+ Case CurMenu of
+ SM_Main:
+ begin
+ Case Interaction of
+ 0: //Button 1
+ begin
+ ScreenSong.StartSong;
+ Visible := False;
+ end;
+
+ 1: //Button 2
+ begin
+ //Select New Players then Sing:
+ ScreenSong.SelectPlayers;
+ Visible := False;
+ end;
+
+ 2: //Button 3
+ begin
+ //Show add to Playlist Menu
+ MenuShow(SM_Playlist_Add);
+ end;
+
+ 3: //SelectSlide 3
+ begin
+ //Dummy
+ end;
+
+ 4: //Button 4
+ begin
+ ScreenSong.OpenEditor;
+ Visible := False;
+ end;
+ end;
+ end;
+
+ SM_PlayList:
+ begin
+ Visible := False;
+ Case Interaction of
+ 0: //Button 1
+ begin
+ ScreenSong.StartSong;
+ Visible := False;
+ end;
+
+ 1: //Button 2
+ begin
+ //Select New Players then Sing:
+ ScreenSong.SelectPlayers;
+ Visible := False;
+ end;
+
+ 2: //Button 3
+ begin
+ //Show add to Playlist Menu
+ MenuShow(SM_Playlist_DelItem);
+ end;
+
+ 3: //SelectSlide 3
+ begin
+ //Dummy
+ end;
+
+ 4: //Button 4
+ begin
+ ScreenSong.OpenEditor;
+ Visible := False;
+ end;
+ end;
+ end;
+
+ SM_Playlist_Add:
+ begin
+ Case Interaction of
+ 0: //Button 1
+ begin
+ MenuShow(SM_Playlist_New);
+ end;
+
+ 3: //SelectSlide 3
+ begin
+ //Dummy
+ end;
+
+ 4: //Button 4
+ begin
+ PlaylistMan.AddItem(ScreenSong.Interaction, SelectValue);
+ Visible := False;
+ end;
+ end;
+ end;
+
+ SM_Playlist_New:
+ begin
+ Case Interaction of
+ 0: //Button 1
+ begin
+ //Nothing, Button for Entering Name
+ end;
+
+ 2: //Button 3
+ begin
+ //Create Playlist and Add Song
+ PlaylistMan.AddItem(
+ ScreenSong.Interaction,
+ PlaylistMan.AddPlaylist(Button[0].Text[0].Text));
+ Visible := False;
+ end;
+
+ 3: //SelectSlide 3
+ begin
+ //Cancel -> Go back to Add screen
+ MenuShow(SM_Playlist_Add);
+ end;
+
+ 4: //Button 4
+ begin
+ Visible := False;
+ end;
+ end;
+ end;
+
+ SM_Playlist_DelItem:
+ begin
+ Visible := False;
+ Case Interaction of
+ 0: //Button 1
+ begin
+ //Delete
+ PlayListMan.DelItem(PlayListMan.GetIndexbySongID(ScreenSong.Interaction));
+ Visible := False;
+ end;
+
+ 4: //Button 4
+ begin
+ MenuShow(SM_Playlist);
+ end;
+ end;
+ end;
+
+ SM_Playlist_Load:
+ begin
+ Case Interaction of
+ 0: //Button 1 (Delete Playlist)
+ begin
+ MenuShow(SM_Playlist_Del);
+ end;
+ 4: //Button 4
+ begin
+ //Load Playlist
+ PlaylistMan.SetPlayList(SelectValue);
+ Visible := False;
+ end;
+ end;
+ end;
+
+ SM_Playlist_Del:
+ begin
+ Visible := False;
+ Case Interaction of
+ 0: //Button 1
+ begin
+ //Delete
+ PlayListMan.DelPlaylist(PlaylistMan.CurPlayList);
+ Visible := False;
+ end;
+
+ 4: //Button 4
+ begin
+ MenuShow(SM_Playlist_Load);
+ end;
+ end;
+ end;
+
+ SM_Party_Main:
+ begin
+ Case Interaction of
+ 0: //Button 1
+ begin
+ //Start Singing
+ if not ScreenSong.PartyMedley then
+ begin
+ ScreenSong.StartSong;
+ Visible := False;
+ end else
+ ScreenSong.StartMedley(5, msCalculated);
+ end;
+
+ 4: //Button 4
+ begin
+ //Joker
+ MenuShow(SM_Party_Joker);
+ end;
+ end;
+ end;
+
+ SM_Party_Joker:
+ begin
+ Visible := False;
+ Case Interaction of
+ 0: //Button 1
+ begin
+ //Joker Team 1
+ ScreenSong.DoJoker(0, 0);
+ end;
+
+ 1: //Button 2
+ begin
+ //Joker Team 2
+ ScreenSong.DoJoker(1, 0);
+ end;
+
+ 2: //Button 3
+ begin
+ //Joker Team 3
+ ScreenSong.DoJoker(2, 0);
+ end;
+
+ 4: //Button 4
+ begin
+ //Cancel... (Fo back to old Menu)
+ MenuShow(SM_Party_Main);
+ end;
+ end;
+ end;
+ end;
+end;
+
+end.
+ \ No newline at end of file
diff --git a/Game/Code/Screens/UScreenStatDetail.pas b/Game/Code/Screens/UScreenStatDetail.pas
new file mode 100644
index 00000000..452c5cc2
--- /dev/null
+++ b/Game/Code/Screens/UScreenStatDetail.pas
@@ -0,0 +1,259 @@
+unit UScreenStatDetail;
+
+interface
+
+uses
+ UMenu, SDL, SysUtils, UDisplay, UMusic, UIni, UThemes;
+
+type
+ TScreenStatDetail = class(TMenu)
+ const
+ ID='ID_027'; //for help system
+
+ public
+ Typ: Byte;
+ Page: CardinaL;
+ Count: Byte;
+ Reversed: Boolean;
+
+ TotEntrys: Cardinal;
+ TotPages: Cardinal;
+
+
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ procedure SetAnimationProgress(Progress: real); override;
+
+ procedure SetTitle;
+ Procedure SetPage(NewPage: Cardinal);
+ end;
+
+implementation
+
+{Stat Screens:
+ 0 - Best Scores
+ 1 - Best Singers
+ 2 - Most sung Songs
+ 3 - Most popular Band
+}
+
+uses UGraphic, UDataBase, ULanguage, math, ULog, UHelp;
+
+function TScreenStatDetail.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE:
+ begin
+ Music.PlayBack;
+ FadeTo(@ScreenStatMain);
+ end;
+ SDLK_RETURN:
+ begin
+ if Interaction = 0 then begin
+ //Next Page
+ SetPage(Page+1);
+ end;
+
+ if Interaction = 1 then begin
+ //Previous Page
+ if (Page > 0) then
+ SetPage(Page-1);
+ end;
+
+ if Interaction = 2 then begin
+ //Reverse Order
+ Reversed := not Reversed;
+ SetPage(Page);
+ end;
+
+ if Interaction = 3 then begin
+ Music.PlayBack;
+ FadeTo(@ScreenStatMain);
+ end;
+ end;
+ SDLK_LEFT:
+ begin
+ InteractPrev;
+ end;
+ SDLK_RIGHT:
+ begin
+ InteractNext;
+ end;
+ SDLK_UP:
+ begin
+ InteractPrev;
+ end;
+ SDLK_DOWN:
+ begin
+ InteractNext;
+ end;
+ end;
+ end;
+end;
+
+constructor TScreenStatDetail.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ for I := 0 to High(Theme.StatDetail.TextList) do
+ AddText(Theme.StatDetail.TextList[I]);
+
+ Count := Length(Theme.StatDetail.TextList);
+
+ AddText(Theme.StatDetail.TextDescription);
+ AddText(Theme.StatDetail.TextPage);
+
+ LoadFromTheme(Theme.StatDetail);
+
+ AddButton(Theme.StatDetail.ButtonNext);
+ if (Length(Button[0].Text)=0) then
+ AddButtonText(14, 20, Language.Translate('STAT_NEXT'));
+
+ AddButton(Theme.StatDetail.ButtonPrev);
+ if (Length(Button[1].Text)=0) then
+ AddButtonText(14, 20, Language.Translate('STAT_PREV'));
+
+ AddButton(Theme.StatDetail.ButtonReverse);
+ if (Length(Button[2].Text)=0) then
+ AddButtonText(14, 20, Language.Translate('STAT_REVERSE'));
+
+ AddButton(Theme.StatDetail.ButtonExit);
+ if (Length(Button[3].Text)=0) then
+ AddButtonText(14, 20, Theme.Options.Description[7]);
+
+ Interaction := 0;
+ Typ := 0;
+end;
+
+procedure TScreenStatDetail.onShow;
+begin
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenStatDetail)');
+ //Set Tot Entrys and PAges
+ TotEntrys := DataBase.GetTotalEntrys(Typ);
+ TotPages := Ceil(TotEntrys / Count);
+ //Show correct Title
+ SetTitle;
+ //Show First Page
+ Reversed := False;
+ SetPage(0);
+end;
+
+procedure TScreenStatDetail.SetTitle;
+begin
+ //Set Title
+ Case Reversed of
+ True: Text[Count].Text := Theme.StatDetail.DescriptionR[Typ];
+ False: Text[Count].Text := Theme.StatDetail.Description[Typ];
+ end;
+end;
+
+Procedure TScreenStatDetail.SetPage(NewPage: Cardinal);
+var
+ Result: AStatResult;
+ I: Integer;
+ FormatStr: String;
+ PerPage: Byte;
+begin
+ SetLength(Result, Count);
+ if (Database.GetStats(Result, Typ, Count, NewPage, Reversed)) then
+ begin
+ Page := NewPage;
+
+ FormatStr := Theme.StatDetail.FormatStr[Typ];
+
+ //refresh Texts
+ For I := 0 to Count-1 do
+ begin
+ try
+ case Typ of
+ 0:begin //Best Scores
+ //Set Texts
+ if (Result[I].Score>0) then
+ Text[I].Text := Format(FormatStr, [Result[I].Singer,
+ Result[I].Score,
+ Theme.ILevel[Result[I].Difficulty],
+ Result[I].SongArtist,
+ Result[I].SongTitle,
+ Result[I].Date])
+ else
+ Text[I].Text := '';
+ end;
+
+ 1:begin //Best Singers
+ //Set Texts
+ if (Result[I].AverageScore>0) then
+ Text[I].Text := Format(FormatStr, [Result[I].Player,
+ Result[I].AverageScore,
+ Result[I].SungTimes])
+ else
+ Text[I].Text := '';
+ end;
+
+ 2:begin //Popular Songs
+ //Set Texts
+ if (Result[I].Artist<>'') then
+ Text[I].Text := Format(FormatStr, [Result[I].Artist,
+ Result[I].Title,
+ Result[I].TimesSung])
+ else
+ Text[I].Text := '';
+ end;
+
+ 3:begin //Popular Bands
+ //Set Texts
+ if (Result[I].ArtistName<>'') then
+ Text[I].Text := Format(FormatStr, [Result[I].ArtistName,
+ Result[I].TimesSungtot])
+ else
+ Text[I].Text := '';
+ end;
+ end;
+ except
+ on E: EConvertError do
+ Log.LogError('Error Parsing FormatString in UScreenStatDetail: ' + E.Message);
+ end;
+ end;
+
+ if (Page + 1 = TotPages) AND (TotEntrys Mod Count <> 0) then
+ PerPage := (TotEntrys Mod Count)
+ else
+ PerPage := Count;
+
+ Text[Count+1].Text := Format(Theme.StatDetail.PageStr, [Page + 1,
+ TotPages,
+ PerPage,
+ TotEntrys]);
+
+ //Show correct Title
+ SetTitle;
+
+ end;
+
+end;
+
+
+procedure TScreenStatDetail.SetAnimationProgress(Progress: real);
+var I: Integer;
+begin
+ For I := 0 to high(Button) do
+ Button[I].Texture.ScaleW := Progress;
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenStatMain.pas b/Game/Code/Screens/UScreenStatMain.pas
new file mode 100644
index 00000000..8f5c3cd1
--- /dev/null
+++ b/Game/Code/Screens/UScreenStatMain.pas
@@ -0,0 +1,235 @@
+unit UScreenStatMain;
+
+interface
+
+uses
+ UMenu, SDL, SysUtils, UDisplay, UMusic, UIni, UThemes;
+
+type
+ TScreenStatMain = class(TMenu)
+ const
+ ID='ID_028'; //for help system
+
+ private
+ //Some Stat Value that don't need to be calculated 2 times
+ SongswithVid: Cardinal;
+ public
+ TextOverview: integer;
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ procedure SetAnimationProgress(Progress: real); override;
+
+ procedure SetOverview;
+ end;
+
+implementation
+
+uses UGraphic, UDataBase, USongs, ULanguage, windows, ULog, UHelp;
+
+function TScreenStatMain.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then
+ begin // Key Down
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE:
+ begin
+ Ini.Save;
+ Music.PlayBack;
+ FadeTo(@ScreenMain);
+ end;
+ SDLK_RETURN:
+ begin
+ //Exit Button Pressed
+ if Interaction = 4 then begin
+ Music.PlayBack;
+ FadeTo(@ScreenMain);
+ end
+ else //One of the Stats Buttons Pressed
+ begin
+ Music.PlayBack;
+ ScreenStatDetail.Typ := Interaction;
+ FadeTo(@ScreenStatDetail);
+ end;
+ end;
+ SDLK_LEFT:
+ begin
+ InteractPrev;
+ end;
+ SDLK_RIGHT:
+ begin
+ InteractNext;
+ end;
+ SDLK_UP:
+ begin
+ InteractPrev;
+ end;
+ SDLK_DOWN:
+ begin
+ InteractNext;
+ end;
+ end;
+ end;
+end;
+
+constructor TScreenStatMain.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ TextOverview := AddText(Theme.StatMain.TextOverview);
+
+ LoadFromTheme(Theme.StatMain);
+
+ AddButton(Theme.StatMain.ButtonScores);
+ if (Length(Button[0].Text)=0) then
+ AddButtonText(14, 20, Theme.StatDetail.Description[0]);
+
+ AddButton(Theme.StatMain.ButtonSingers);
+ if (Length(Button[1].Text)=0) then
+ AddButtonText(14, 20, Theme.StatDetail.Description[1]);
+
+ AddButton(Theme.StatMain.ButtonSongs);
+ if (Length(Button[2].Text)=0) then
+ AddButtonText(14, 20, Theme.StatDetail.Description[2]);
+
+ AddButton(Theme.StatMain.ButtonBands);
+ if (Length(Button[3].Text)=0) then
+ AddButtonText(14, 20, Theme.StatDetail.Description[3]);
+
+ AddButton(Theme.StatMain.ButtonExit);
+ if (Length(Button[4].Text)=0) then
+ AddButtonText(14, 20, Theme.Options.Description[4]);
+
+ Interaction := 0;
+
+ //Set Songs with Vid
+ SongswithVid := 0;
+ For I := 0 to high(Songs.Song) do
+ if (Songs.Song[I].Video <> '') then
+ Inc(SongswithVid);
+end;
+
+procedure TScreenStatMain.onShow;
+begin
+ //Set Overview Text:
+ SetOverview;
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenStatMain)');
+end;
+
+procedure TScreenStatMain.SetOverview;
+var
+ Overview, Formatstr: String;
+ I: Integer;
+ //Some Vars to Save Attributes to
+ A1, A2, A3: Integer;
+ A4, A5: String;
+ Result1, Result2: AStatResult;
+ ResetTime: TSystemTime;
+ function GetFileCreation(Filename: String): TSystemTime;
+ var
+ FindData: TWin32FindData;
+ Handle: THandle;
+ begin
+ Handle := FindFirstFile(PChar(Filename), FindData);
+ if Handle <> INVALID_HANDLE_VALUE then
+ begin
+ FileTimeToSystemTime(FindData.ftCreationTime, Result);
+ Windows.FindClose(Handle);
+ end;
+ end;
+begin
+ //Song Overview
+
+ //Introduction
+ Formatstr := Language.Translate ('STAT_OVERVIEW_INTRO');
+ {Format:
+ %0:d Ultrastar Version
+ %1:d Day of Reset (A1)
+ %2:d Month of Reset (A2)
+ %3:d Year of Reset (A3)}
+
+ ResetTime := GetFileCreation(Database.Filename);
+
+ A1 := ResetTime.wDay;
+ A2 := ResetTime.wMonth;
+ A3 := ResetTime.wYear;
+ try
+ Overview := Format(Formatstr, [Language.Translate('US_VERSION'), A1, A2, A3]);
+ except
+ on E: EConvertError do
+ Log.LogError('Error Parsing FormatString "STAT_OVERVIEW_INTRO": ' + E.Message);
+ end;
+
+ Formatstr := Language.Translate ('STAT_OVERVIEW_SONG');
+ {Format:
+ %0:d Count Songs (A1)
+ %1:d Count of Sung Songs (A2)
+ %2:d Count of UnSung Songs
+ %3:d Count of Songs with Video (A3)
+ %4:s Name of the most popular Song}
+ A1 := Length(Songs.Song);
+ A2 := Database.GetTotalEntrys(2);
+
+ A3 := SongswithVid;
+
+ SetLength(Result1, 1);
+ Database.GetStats(Result1, 2, 1, 0, False);
+ A4 := Result1[0].Artist;
+ A5 := Result1[0].Title;
+
+ try
+ Overview := Overview + '\n \n' + Format(Formatstr, [A1, A2, A1-A2, A3, A4, A5]);
+ except
+ on E: EConvertError do
+ Log.LogError('Error Parsing FormatString "STAT_OVERVIEW_SONG": ' + E.Message);
+ end;
+
+ //Player Overview
+ Formatstr := Language.Translate ('STAT_OVERVIEW_PLAYER');
+ {Format:
+ %0:d Count Players (A1)
+ %1:s Best Player (Result)
+ %2:d Best Players Score
+ %3:s Best Score Player (Result2)
+ %4:d Best Score}
+ A1 := Database.GetTotalEntrys(1);
+
+ SetLength(Result1, 1);
+ Database.GetStats(Result1, 1, 1, 0, False);
+
+ SetLength(Result2, 1);
+ Database.GetStats(Result2, 0, 1, 0, False);
+
+ try
+ Overview := Overview + '\n \n' + Format(Formatstr, [A1, Result1[0].Player, Result1[0].AverageScore, Result2[0].Singer, Result2[0].Score]);
+ except
+ on E: EConvertError do
+ Log.LogError('Error Parsing FormatString "STAT_OVERVIEW_PLAYER": ' + E.Message);
+ end;
+
+ Text[0].Text := Overview;
+end;
+
+
+procedure TScreenStatMain.SetAnimationProgress(Progress: real);
+var I: Integer;
+begin
+ For I := 0 to high(Button) do
+ Button[I].Texture.ScaleW := Progress;
+end;
+
+end. \ No newline at end of file
diff --git a/Game/Code/Screens/UScreenTop.pas b/Game/Code/Screens/UScreenTop.pas
new file mode 100644
index 00000000..340fe2ad
--- /dev/null
+++ b/Game/Code/Screens/UScreenTop.pas
@@ -0,0 +1,210 @@
+unit UScreenTop;
+
+interface
+
+uses
+ UMenu, SDL, SysUtils, UDisplay, UMusic, USongs, UThemes, ULCD, ModiSDK;
+
+type
+ TScreenTop = class(TMenu)
+ const
+ ID='ID_029'; //for help system
+
+ public
+ TextLevel: integer;
+ TextArtistTitle: integer;
+
+ DifficultyShow: integer; //TODO
+ TeamInfo : TTeamInfo; //for M2-MOD
+
+ StaticNumber: array[1..8] of integer;
+ TextNumber: array[1..8] of integer;
+ TextName: array[1..8] of integer;
+ TextScore: array[1..8] of integer;
+ TextDate: array[1..8] of integer;
+
+ Fadeout: boolean;
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ procedure onShow; override;
+ function Draw: boolean; override;
+ //procedure DrawScores(difficulty: integer); TODO
+ end;
+
+implementation
+
+uses UGraphic, UDataBase, UMain, UIni, UPartyM2, DateUtils, UHelp, ULog;
+
+function TScreenTop.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then begin
+ case PressedKey of
+ SDLK_TAB:
+ begin
+ ScreenPopupHelp.ShowPopup();
+ end;
+
+ SDLK_Q:
+ begin
+ Result := false;
+ end;
+
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE,
+ SDLK_RETURN:
+ begin
+ if (not Fadeout) then begin
+ if(ScreenSong.Mode = smNormal) or (ScreenSong.Mode = smMedley) then
+ FadeTo(@ScreenSong)
+ else
+ begin
+ ScreenSong.SongIndex := -1;
+ Music.FadeStop(Ini.PreviewFading);
+ FadeTo(@ScreenPartyNewRoundM2);
+ end;
+ Fadeout := true;
+ end;
+ end;
+ SDLK_SYSREQ:
+ begin
+ Display.PrintScreen;
+ end;
+ end;
+ end;
+end;
+
+constructor TScreenTop.Create;
+var
+ I: integer;
+begin
+ inherited Create;
+
+ LoadFromTheme(Theme.Top);
+
+
+ TextLevel := AddText(Theme.Top.TextLevel);
+ TextArtistTitle := AddText(Theme.Top.TextArtistTitle);
+
+ for I := 0 to 7 do
+ StaticNumber[I+1] := AddStatic(Theme.Top.StaticNumber[I]);
+
+ for I := 0 to 7 do
+ TextNumber[I+1] := AddText(Theme.Top.TextNumber[I]);
+ for I := 0 to 7 do
+ TextName[I+1] := AddText(Theme.Top.TextName[I]);
+ for I := 0 to 7 do
+ TextScore[I+1] := AddText(Theme.Top.TextScore[I]);
+ for I := 0 to 7 do
+ TextDate[I+1] := AddText(Theme.Top.TextDate[I]);
+
+end;
+
+procedure TScreenTop.onShow;
+var
+ I: integer;
+ PMax: integer;
+ sung: boolean;
+ TimeStamp: integer;
+begin
+ if not Help.SetHelpID(ID) then
+ Log.LogError('No Entry for Help-ID ' + ID + ' (ScreenTop)');
+
+ Fadeout := false;
+ sung:=false;
+ TimeStamp := DateTimeToUnix(Now());
+
+ PMax := PlayersPlay - 1;
+
+ for I := 0 to PMax do
+ begin
+ if(ScreenSong.Mode=smChallenge) then
+ TeamInfo.TeamInfo[I].Score:=Player[I].ScoreTotalI;
+
+ if (Player[I].ScoreTotalI>100) and ScreenSong.SungToEnd and (ScreenSong.Mode<>smMedley) and
+ (not ScreenSong.PartyMedley) then
+ begin
+ DataBase.AddScore(AktSong, Ini.Difficulty, Ini.Name[I], Player[I].ScoreTotalI, TimeStamp);
+ sung := true;
+ end;
+ end;
+
+ if ScreenSong.Mode=smChallenge then
+ begin
+ PartySessionM2.Teams:=TeamInfo;
+ PartySessionM2.EndRound;
+ end;
+
+ if sung then
+ DataBase.WriteScore(AktSong);
+
+ DataBase.ReadScore(AktSong);
+
+ Text[TextArtistTitle].Text := AktSong.Artist + ' - ' + AktSong.Title;
+
+ for I := 1 to Length(AktSong.Score[Ini.Difficulty]) do begin
+ Static[StaticNumber[I]].Visible := true;
+ Text[TextNumber[I]].Visible := true;
+ Text[TextName[I]].Visible := true;
+ Text[TextScore[I]].Visible := true;
+ Text[TextDate[I]].Visible := true;
+
+ Text[TextName[I]].Text := AktSong.Score[Ini.Difficulty, I-1].Name;
+ Text[TextScore[I]].Text := IntToStr(AktSong.Score[Ini.Difficulty, I-1].Score);
+ Text[TextDate[I]].Text := AktSong.Score[Ini.Difficulty, I-1].Date;
+ end;
+
+ for I := Length(AktSong.Score[Ini.Difficulty])+1 to 8 do begin
+ Static[StaticNumber[I]].Visible := false;
+ Text[TextNumber[I]].Visible := false;
+ Text[TextName[I]].Visible := false;
+ Text[TextScore[I]].Visible := false;
+ Text[TextDate[I]].Visible := false;
+ end;
+
+ Text[TextLevel].Text := IDifficulty[Ini.Difficulty];
+end;
+
+function TScreenTop.Draw: boolean;
+//var
+{ Min: real;
+ Max: real;
+ Wsp: real;
+ Wsp2: real;
+ Pet: integer;}
+
+{ Item: integer;
+ P: integer;
+ C: integer;}
+begin
+ // Singstar - let it be...... with 6 statics
+{ if PlayersPlay = 6 then begin
+ for Item := 4 to 6 do begin
+ if ScreenAct = 1 then P := Item-4;
+ if ScreenAct = 2 then P := Item-1;
+
+ FillPlayer(Item, P);
+
+{ if ScreenAct = 1 then begin
+ LoadColor(
+ Static[StaticBoxLightest[Item]].Texture.ColR,
+ Static[StaticBoxLightest[Item]].Texture.ColG,
+ Static[StaticBoxLightest[Item]].Texture.ColB,
+ 'P1Dark');
+ end;
+
+ if ScreenAct = 2 then begin
+ LoadColor(
+ Static[StaticBoxLightest[Item]].Texture.ColR,
+ Static[StaticBoxLightest[Item]].Texture.ColG,
+ Static[StaticBoxLightest[Item]].Texture.ColB,
+ 'P4Dark');
+ end;}
+
+{ end;
+ end;}
+
+ inherited Draw;
+end;
+
+end.
diff --git a/Game/Code/Screens/UScreenWelcome.pas b/Game/Code/Screens/UScreenWelcome.pas
new file mode 100644
index 00000000..35e159f8
--- /dev/null
+++ b/Game/Code/Screens/UScreenWelcome.pas
@@ -0,0 +1,118 @@
+unit UScreenWelcome;
+
+interface
+
+uses
+ UMenu, SDL, SysUtils, UThemes;
+
+type
+ TScreenWelcome = class(TMenu)
+ public
+ Animation: real;
+ Fadeout: boolean;
+ constructor Create; override;
+ function ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean; override;
+ function Draw: boolean; override;
+ procedure onShow; override;
+ end;
+
+implementation
+
+uses UGraphic, UTime, USkins;
+
+function TScreenWelcome.ParseInput(PressedKey: Cardinal; ScanCode: byte; PressedDown: Boolean): Boolean;
+begin
+ Result := true;
+ If (PressedDown) Then begin
+ case PressedKey of
+ SDLK_ESCAPE,
+ SDLK_BACKSPACE :
+ begin
+ Result := False;
+ end;
+ SDLK_RETURN:
+ begin
+ FadeTo(@ScreenMain);
+ Fadeout := true;
+ end;
+ end;
+ end;
+end;
+
+constructor TScreenWelcome.Create;
+begin
+ inherited Create;
+ AddStatic(-10, -10, 0, 0, 1, 1, 1, Skin.GetTextureFileName('ButtonAlt') , 'JPG', 'Transparent');
+ AddStatic(-500, 440, 200, 5, 0, 0, 0, Skin.GetTextureFileName('Rectangle'), 'JPG', 'Font Black');
+ AddStatic(-500, 472, 200, 5, 0, 0, 0, Skin.GetTextureFileName('Rectangle'), 'JPG', 'Font Black');
+ AddStatic(-500, 504, 200, 5, 0, 0, 0, Skin.GetTextureFileName('Rectangle'), 'JPG', 'Font Black');
+ AddStatic(-500, 536, 200, 5, 0, 0, 0, Skin.GetTextureFileName('Rectangle'), 'JPG', 'Font Black');
+ AddStatic(-500, 568, 200, 5, 0, 0, 0, Skin.GetTextureFileName('Rectangle'), 'JPG', 'Font Black');
+ Animation := 0;
+ Fadeout := false;
+end;
+
+procedure TScreenWelcome.onShow;
+begin
+ CountSkipTimeSet;
+end;
+
+function TScreenWelcome.Draw: boolean;
+var
+ Min: real;
+ Max: real;
+ Wsp: real;
+ Pet: integer;
+begin
+ // star animation
+ Animation := Animation + TimeSkip*1000;
+
+ // draw nothing
+ Min := 0; Max := 1000;
+ if (Animation >= Min) and (Animation < Max) then begin
+ end;
+
+ // popup
+ Min := 1000; Max := 1120;
+ if (Animation >= Min) and (Animation < Max) then begin
+ Wsp := (Animation - Min) / (Max - Min);
+ Static[0].Texture.X := 600;
+ Static[0].Texture.Y := 600 - Wsp * 230;
+ Static[0].Texture.W := 200;
+ Static[0].Texture.H := Wsp * 230;
+ end;
+
+ // bounce
+ Min := 1120; Max := 1200;
+ if (Animation >= Min) and (Animation < Max) then begin
+ Wsp := (Animation - Min) / (Max - Min);
+ Static[0].Texture.Y := 370 + Wsp * 50;
+ Static[0].Texture.H := 230 - Wsp * 50;
+ end;
+
+ // run
+ Min := 1500; Max := 3500;
+ if (Animation >= Min) and (Animation < Max) then begin
+ Wsp := (Animation - Min) / (Max - Min);
+
+ Static[0].Texture.X := 600 - Wsp * 1400;
+ Static[0].Texture.H := 180;
+
+
+ for Pet := 1 to 5 do begin
+ Static[Pet].Texture.X := 770 - Wsp * 1400;
+ Static[Pet].Texture.W := 150 + Wsp * 200;
+ Static[Pet].Texture.Alpha := Wsp * 0.5;
+ end;
+ end;
+
+ Min := 3500;
+ if (Animation >= Min) and (not Fadeout) then begin
+ FadeTo(@ScreenMain);
+ Fadeout := true;
+ end;
+
+ inherited Draw;
+end;
+
+end.
diff --git a/Game/Code/UltraStar.bdsproj b/Game/Code/UltraStar.bdsproj
new file mode 100644
index 00000000..06215810
--- /dev/null
+++ b/Game/Code/UltraStar.bdsproj
@@ -0,0 +1,175 @@
+<?xml version="1.0" encoding="utf-8"?>
+<BorlandProject>
+ <PersonalityInfo>
+ <Option>
+ <Option Name="Personality">Delphi.Personality</Option>
+ <Option Name="ProjectType">VCLApplication</Option>
+ <Option Name="Version">1.0</Option>
+ <Option Name="GUID">{EB374F8C-2152-44FB-83CA-E2D8BE2FAC91}</Option>
+ </Option>
+ </PersonalityInfo>
+ <Delphi.Personality>
+ <Source>
+ <Source Name="MainSource">UltraStar.dpr</Source>
+ </Source>
+ <FileVersion>
+ <FileVersion Name="Version">7.0</FileVersion>
+ </FileVersion>
+ <Compiler>
+ <Compiler Name="A">8</Compiler>
+ <Compiler Name="B">0</Compiler>
+ <Compiler Name="C">1</Compiler>
+ <Compiler Name="D">1</Compiler>
+ <Compiler Name="E">0</Compiler>
+ <Compiler Name="F">0</Compiler>
+ <Compiler Name="G">1</Compiler>
+ <Compiler Name="H">1</Compiler>
+ <Compiler Name="I">1</Compiler>
+ <Compiler Name="J">0</Compiler>
+ <Compiler Name="K">0</Compiler>
+ <Compiler Name="L">1</Compiler>
+ <Compiler Name="M">0</Compiler>
+ <Compiler Name="N">1</Compiler>
+ <Compiler Name="O">1</Compiler>
+ <Compiler Name="P">1</Compiler>
+ <Compiler Name="Q">0</Compiler>
+ <Compiler Name="R">0</Compiler>
+ <Compiler Name="S">0</Compiler>
+ <Compiler Name="T">0</Compiler>
+ <Compiler Name="U">1</Compiler>
+ <Compiler Name="V">1</Compiler>
+ <Compiler Name="W">0</Compiler>
+ <Compiler Name="X">1</Compiler>
+ <Compiler Name="Y">1</Compiler>
+ <Compiler Name="Z">1</Compiler>
+ <Compiler Name="ShowHints">True</Compiler>
+ <Compiler Name="ShowWarnings">True</Compiler>
+ <Compiler Name="UnitAliases">WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;</Compiler>
+ <Compiler Name="NamespacePrefix"></Compiler>
+ <Compiler Name="GenerateDocumentation">False</Compiler>
+ <Compiler Name="DefaultNamespace"></Compiler>
+ <Compiler Name="SymbolDeprecated">True</Compiler>
+ <Compiler Name="SymbolLibrary">True</Compiler>
+ <Compiler Name="SymbolPlatform">True</Compiler>
+ <Compiler Name="SymbolExperimental">True</Compiler>
+ <Compiler Name="UnitLibrary">True</Compiler>
+ <Compiler Name="UnitPlatform">True</Compiler>
+ <Compiler Name="UnitDeprecated">True</Compiler>
+ <Compiler Name="UnitExperimental">True</Compiler>
+ <Compiler Name="HResultCompat">True</Compiler>
+ <Compiler Name="HidingMember">True</Compiler>
+ <Compiler Name="HiddenVirtual">True</Compiler>
+ <Compiler Name="Garbage">True</Compiler>
+ <Compiler Name="BoundsError">True</Compiler>
+ <Compiler Name="ZeroNilCompat">True</Compiler>
+ <Compiler Name="StringConstTruncated">True</Compiler>
+ <Compiler Name="ForLoopVarVarPar">True</Compiler>
+ <Compiler Name="TypedConstVarPar">True</Compiler>
+ <Compiler Name="AsgToTypedConst">True</Compiler>
+ <Compiler Name="CaseLabelRange">True</Compiler>
+ <Compiler Name="ForVariable">True</Compiler>
+ <Compiler Name="ConstructingAbstract">True</Compiler>
+ <Compiler Name="ComparisonFalse">True</Compiler>
+ <Compiler Name="ComparisonTrue">True</Compiler>
+ <Compiler Name="ComparingSignedUnsigned">True</Compiler>
+ <Compiler Name="CombiningSignedUnsigned">True</Compiler>
+ <Compiler Name="UnsupportedConstruct">True</Compiler>
+ <Compiler Name="FileOpen">True</Compiler>
+ <Compiler Name="FileOpenUnitSrc">True</Compiler>
+ <Compiler Name="BadGlobalSymbol">True</Compiler>
+ <Compiler Name="DuplicateConstructorDestructor">True</Compiler>
+ <Compiler Name="InvalidDirective">True</Compiler>
+ <Compiler Name="PackageNoLink">True</Compiler>
+ <Compiler Name="PackageThreadVar">True</Compiler>
+ <Compiler Name="ImplicitImport">True</Compiler>
+ <Compiler Name="HPPEMITIgnored">True</Compiler>
+ <Compiler Name="NoRetVal">True</Compiler>
+ <Compiler Name="UseBeforeDef">True</Compiler>
+ <Compiler Name="ForLoopVarUndef">True</Compiler>
+ <Compiler Name="UnitNameMismatch">True</Compiler>
+ <Compiler Name="NoCFGFileFound">True</Compiler>
+ <Compiler Name="ImplicitVariants">True</Compiler>
+ <Compiler Name="UnicodeToLocale">True</Compiler>
+ <Compiler Name="LocaleToUnicode">True</Compiler>
+ <Compiler Name="ImagebaseMultiple">True</Compiler>
+ <Compiler Name="SuspiciousTypecast">True</Compiler>
+ <Compiler Name="PrivatePropAccessor">True</Compiler>
+ <Compiler Name="UnsafeType">False</Compiler>
+ <Compiler Name="UnsafeCode">False</Compiler>
+ <Compiler Name="UnsafeCast">False</Compiler>
+ <Compiler Name="OptionTruncated">True</Compiler>
+ <Compiler Name="WideCharReduced">True</Compiler>
+ <Compiler Name="DuplicatesIgnored">True</Compiler>
+ <Compiler Name="UnitInitSeq">True</Compiler>
+ <Compiler Name="LocalPInvoke">True</Compiler>
+ <Compiler Name="MessageDirective">True</Compiler>
+ <Compiler Name="CodePage"></Compiler>
+ </Compiler>
+ <Linker>
+ <Linker Name="MapFile">0</Linker>
+ <Linker Name="OutputObjs">0</Linker>
+ <Linker Name="GenerateHpps">False</Linker>
+ <Linker Name="ConsoleApp">1</Linker>
+ <Linker Name="DebugInfo">False</Linker>
+ <Linker Name="RemoteSymbols">False</Linker>
+ <Linker Name="GenerateDRC">False</Linker>
+ <Linker Name="MinStackSize">16384</Linker>
+ <Linker Name="MaxStackSize">1048576</Linker>
+ <Linker Name="ImageBase">4194304</Linker>
+ <Linker Name="ExeDescription"></Linker>
+ </Linker>
+ <Directories>
+ <Directories Name="OutputDir">..\Output</Directories>
+ <Directories Name="UnitOutputDir">..\Units</Directories>
+ <Directories Name="PackageDLLOutputDir"></Directories>
+ <Directories Name="PackageDCPOutputDir"></Directories>
+ <Directories Name="SearchPath">lib\JEDI-SDLv1.0\SDL\Pas</Directories>
+ <Directories Name="Packages"></Directories>
+ <Directories Name="Conditionals"></Directories>
+ <Directories Name="DebugSourceDirs"></Directories>
+ <Directories Name="UsePackages">False</Directories>
+ </Directories>
+ <Parameters>
+ <Parameters Name="RunParams"></Parameters>
+ <Parameters Name="HostApplication"></Parameters>
+ <Parameters Name="Launcher"></Parameters>
+ <Parameters Name="UseLauncher">False</Parameters>
+ <Parameters Name="DebugCWD"></Parameters>
+ <Parameters Name="Debug Symbols Search Path"></Parameters>
+ <Parameters Name="LoadAllSymbols">True</Parameters>
+ <Parameters Name="LoadUnspecifiedSymbols">False</Parameters>
+ </Parameters>
+ <Language>
+ <Language Name="ActiveLang"></Language>
+ <Language Name="ProjectLang">$00000000</Language>
+ <Language Name="RootDir"></Language>
+ </Language>
+ <VersionInfo>
+ <VersionInfo Name="IncludeVerInfo">False</VersionInfo>
+ <VersionInfo Name="AutoIncBuild">False</VersionInfo>
+ <VersionInfo Name="MajorVer">1</VersionInfo>
+ <VersionInfo Name="MinorVer">0</VersionInfo>
+ <VersionInfo Name="Release">0</VersionInfo>
+ <VersionInfo Name="Build">0</VersionInfo>
+ <VersionInfo Name="Debug">False</VersionInfo>
+ <VersionInfo Name="PreRelease">False</VersionInfo>
+ <VersionInfo Name="Special">False</VersionInfo>
+ <VersionInfo Name="Private">False</VersionInfo>
+ <VersionInfo Name="DLL">False</VersionInfo>
+ <VersionInfo Name="Locale">1031</VersionInfo>
+ <VersionInfo Name="CodePage">1252</VersionInfo>
+ </VersionInfo>
+ <VersionInfoKeys>
+ <VersionInfoKeys Name="CompanyName"></VersionInfoKeys>
+ <VersionInfoKeys Name="FileDescription"></VersionInfoKeys>
+ <VersionInfoKeys Name="FileVersion">1.0.0.0</VersionInfoKeys>
+ <VersionInfoKeys Name="InternalName"></VersionInfoKeys>
+ <VersionInfoKeys Name="LegalCopyright"></VersionInfoKeys>
+ <VersionInfoKeys Name="LegalTrademarks"></VersionInfoKeys>
+ <VersionInfoKeys Name="OriginalFilename"></VersionInfoKeys>
+ <VersionInfoKeys Name="ProductName"></VersionInfoKeys>
+ <VersionInfoKeys Name="ProductVersion">1.0.0.0</VersionInfoKeys>
+ <VersionInfoKeys Name="Comments"></VersionInfoKeys>
+ </VersionInfoKeys>
+ </Delphi.Personality>
+</BorlandProject>
diff --git a/Game/Code/UltraStar.bdsproj.local b/Game/Code/UltraStar.bdsproj.local
new file mode 100644
index 00000000..d576f039
--- /dev/null
+++ b/Game/Code/UltraStar.bdsproj.local
@@ -0,0 +1,2 @@
+<?xml version="1.0" encoding="utf-8"?>
+<BorlandProject/>
diff --git a/Game/Code/UltraStar.cfg b/Game/Code/UltraStar.cfg
new file mode 100644
index 00000000..c99ab319
--- /dev/null
+++ b/Game/Code/UltraStar.cfg
@@ -0,0 +1,44 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U+
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-E"..\Output"
+-N0"..\Units"
+-LE"C:\Users\Alex\Documents\Borland Studio-Projekte\Bpl"
+-LN"C:\Users\Alex\Documents\Borland Studio-Projekte\Bpl"
+-U"lib\JEDI-SDLv1.0\SDL\Pas"
+-O"lib\JEDI-SDLv1.0\SDL\Pas"
+-I"lib\JEDI-SDLv1.0\SDL\Pas"
+-R"lib\JEDI-SDLv1.0\SDL\Pas"
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/Game/Code/UltraStar.dpr b/Game/Code/UltraStar.dpr
new file mode 100644
index 00000000..1e3ce033
--- /dev/null
+++ b/Game/Code/UltraStar.dpr
@@ -0,0 +1,364 @@
+program UltraStar;
+
+{$DEFINE TRANSLATE}
+
+{$R 'UltraStar.res' 'UltraStar.rc'}
+
+uses
+ SDL in 'lib\JEDI-SDLv1.0\SDL\Pas\SDL.pas',
+ moduleloader in 'lib\JEDI-SDLv1.0\SDL\Pas\moduleloader.pas',
+ sdlutils in 'lib\JEDI-SDLv1.0\SDL\Pas\sdlutils.pas',
+ sdl_image in 'lib\JEDI-SDLv1.0\SDL_Image\Pas\sdl_image.pas',
+ gl in 'lib\JEDI-SDLv1.0\OpenGL\Pas\gl.pas',
+ glu in 'lib\JEDI-SDLv1.0\OpenGL\Pas\glu.pas',
+ glext in 'lib\JEDI-SDLv1.0\OpenGL\Pas\glext.pas',
+ sdl_ttf in 'lib\JEDI-SDLv1.0\SDL_ttf\Pas\sdl_ttf.pas',
+ smpeg in 'lib\JEDI-SDLv1.0\smpeg\Pas\smpeg.pas',
+ bass in 'lib\bass\delphi\bass.pas',
+ PNGImage in 'lib\PNGImage\PNGImage.pas',
+ PNGzLib in 'lib\PNGImage\PNGzLib.pas',
+ pnglang in 'lib\PNGImage\pnglang.pas',
+ midiout in 'lib\midi\midiout.pas',
+ midiin in 'lib\midi\midiin.pas',
+ CIRCBUF in 'lib\midi\CIRCBUF.PAS',
+ MidiType in 'lib\midi\MidiType.PAS',
+ MidiDefs in 'lib\midi\MidiDefs.PAS',
+ MidiCons in 'lib\midi\MidiCons.PAS',
+ MidiFile in 'lib\midi\MidiFile.PAS',
+ Delphmcb in 'lib\midi\Delphmcb.PAS',
+ zlportio in 'lib\zlportio\zlportio.pas',
+ ddkint in 'lib\zlportio\ddkint.pas',
+ SQLiteTable3 in 'lib\SQLite\SQLiteTable3.pas',
+ SQLite3 in 'lib\SQLite\SQLite3.pas',
+ UDisplay in 'Menu\UDisplay.pas',
+ UMenu in 'Menu\UMenu.pas',
+ UMenuStatic in 'Menu\UMenuStatic.pas',
+ UMenuText in 'Menu\UMenuText.pas',
+ UMenuButton in 'Menu\UMenuButton.pas',
+ UMenuInteract in 'Menu\UMenuInteract.pas',
+ UMenuSelect in 'Menu\UMenuSelect.pas',
+ UMenuSelectSlide in 'Menu\UMenuSelectSlide.pas',
+ UDrawTexture in 'Menu\UDrawTexture.pas',
+ UMenuButtonCollection in 'Menu\UMenuButtonCollection.pas',
+ UGraphic in 'Classes\UGraphic.pas',
+ UTexture in 'Classes\UTexture.pas',
+ UMusic in 'Classes\UMusic.pas',
+ ULanguage in 'Classes\ULanguage.pas',
+ UMain in 'Classes\UMain.pas',
+ UDraw in 'Classes\UDraw.pas',
+ URecord in 'Classes\URecord.pas',
+ UTime in 'Classes\UTime.pas',
+ TextGL in 'Classes\TextGL.pas',
+ USongs in 'Classes\USongs.pas',
+ UIni in 'Classes\UIni.pas',
+ UHelp in 'Classes\UHelp.pas',
+ USmpeg in 'SMpeg\USmpeg.pas',
+ ULyrics in 'Classes\ULyrics.pas',
+ USkins in 'Classes\USkins.pas',
+ UThemes in 'Classes\UThemes.pas',
+ ULog in 'Classes\ULog.pas',
+ UJoystick in 'Classes\UJoystick.pas',
+ ULCD in 'Classes\ULCD.pas',
+ ULight in 'Classes\ULight.pas',
+ UDataBase in 'Classes\UDataBase.pas',
+ UCovers in 'Classes\UCovers.pas',
+ UCatCovers in 'Classes\UCatCovers.pas',
+ UFiles in 'Classes\UFiles.pas',
+ UGraphicClasses in 'Classes\UGraphicClasses.pas',
+
+
+ UDLLManager in 'Classes\UDLLManager.pas',
+ UParty in 'Classes\UParty.pas',
+ UPartyM2 in 'Classes\UPartyM2.pas', //Party M2-MOD
+
+ UPlaylist in 'Classes\UPlaylist.pas',
+ UCommandLine in 'Classes\UCommandLine.pas',
+
+
+ UScreenLoading in 'Screens\UScreenLoading.pas',
+ UScreenWelcome in 'Screens\UScreenWelcome.pas',
+ UScreenMain in 'Screens\UScreenMain.pas',
+ UScreenName in 'Screens\UScreenName.pas',
+ UScreenLevel in 'Screens\UScreenLevel.pas',
+ UScreenSong in 'Screens\UScreenSong.pas',
+ UScreenSing in 'Screens\UScreenSing.pas',
+ UScreenScore in 'Screens\UScreenScore.pas',
+ UScreenOptions in 'Screens\UScreenOptions.pas',
+ UScreenOptionsGame in 'Screens\UScreenOptionsGame.pas',
+ UScreenOptionsGraphics in 'Screens\UScreenOptionsGraphics.pas',
+ UScreenOptionsSound in 'Screens\UScreenOptionsSound.pas',
+ UScreenOptionsLyrics in 'Screens\UScreenOptionsLyrics.pas',
+ UScreenOptionsThemes in 'Screens\UScreenOptionsThemes.pas',
+ UScreenOptionsRecord in 'Screens\UScreenOptionsRecord.pas',
+ UScreenOptionsAdvanced in 'Screens\UScreenOptionsAdvanced.pas',
+ UScreenEditSub in 'Screens\UScreenEditSub.pas',
+ UScreenEdit in 'Screens\UScreenEdit.pas',
+ UScreenEditConvert in 'Screens\UScreenEditConvert.pas',
+ UScreenEditHeader in 'Screens\UScreenEditHeader.pas',
+ UScreenOpen in 'Screens\UScreenOpen.pas',
+ UScreenTop in 'Screens\UScreenTop.pas',
+ UScreenSongMenu in 'Screens\UScreenSongMenu.pas',
+ UScreenSongJumpto in 'Screens\UScreenSongJumpto.pas',
+ UScreenStatMain in 'Screens\UScreenStatMain.pas',
+ UScreenStatDetail in 'Screens\UScreenStatDetail.pas',
+ UScreenCredits in 'Screens\UScreenCredits.pas',
+ UScreenPopup in 'Screens\UScreenPopup.pas',
+
+ UScreenSingModi in 'Screens\UScreenSingModi.pas',
+ UScreenPartyNewRound in 'Screens\UScreenPartyNewRound.pas',
+ UScreenPartyScore in 'Screens\UScreenPartyScore.pas',
+ UScreenPartyPlayer in 'Screens\UScreenPartyPlayer.pas',
+ UScreenPartyOptions in 'Screens\UScreenPartyOptions.pas',
+ UScreenPartyWin in 'Screens\UScreenPartyWin.pas',
+
+ UScreenPartyNewRoundM2 in 'Screens\UScreenPartyNewRoundM2.pas',
+ UScreenPartyPlayerM2 in 'Screens\UScreenPartyPlayerM2.pas',
+ UScreenPartyOptionsM2 in 'Screens\UScreenPartyOptionsM2.pas',
+
+ ModiSDK in '..\..\Modis\SDK\ModiSDK.pas',
+
+
+ Windows,
+ SysUtils,
+ UVideo in 'Classes\UVideo.pas',
+ acinerella in 'lib\acinerella\acinerella.pas';
+
+const
+ Version = 'UltraStar Deluxe v1.0.1a Challenge-MOD r6b 2010-02-17';
+
+var
+ WndTitle: string;
+ hWnd: THandle;
+ I: Integer;
+
+begin
+ WndTitle := Version;
+
+ //------------------------------
+ //Start more than One Time Prevention
+ //------------------------------
+ hWnd:= FindWindow(nil, PChar(WndTitle));
+ //Programm already started
+ if (hWnd <> 0) then
+ begin
+ I := Messagebox(0, PChar('Another Instance of Ultrastar is already running. Continue ?'), PChar(WndTitle), MB_ICONWARNING or MB_YESNO);
+ if (I = IDYes) then
+ begin
+ I := 1;
+ repeat
+ Inc(I);
+ hWnd := FindWindow(nil, PChar(WndTitle + ' Instance ' + InttoStr(I)));
+ until (hWnd = 0);
+
+ WndTitle := WndTitle + ' Instance ' + InttoStr(I);
+ end
+ else
+ Exit;
+ end;
+
+ //------------------------------
+ //StartUp - Create Classes and Load Files
+ //------------------------------
+ USTime := TTime.Create;
+
+ // Commandline Parameter Parser
+ Params := TCMDParams.Create;
+
+ // Log + Benchmark
+ Log := TLog.Create;
+ Log.Title := WndTitle;
+ Log.Enabled := Not Params.NoLog;
+ Log.BenchmarkStart(0);
+
+ // Language
+ Log.BenchmarkStart(1);
+ Log.LogStatus('Initialize Paths', 'Initialization'); InitializePaths;
+ Log.LogStatus('Load Language', 'Initialization'); Language := TLanguage.Create;
+ //Add Const Values:
+ Language.AddConst('US_VERSION', Version);
+ Log.BenchmarkEnd(1);
+ Log.LogBenchmark('Loading Language', 1);
+
+ // SDL
+ Log.BenchmarkStart(1);
+ Log.LogStatus('Initialize SDL', 'Initialization');
+ SDL_Init(SDL_INIT_VIDEO or SDL_INIT_AUDIO);
+ Log.BenchmarkEnd(1);
+ Log.LogBenchmark('Initializing SDL', 1);
+
+ // Skin
+ Log.BenchmarkStart(1);
+ Log.LogStatus('Loading Skin List', 'Initialization'); Skin := TSkin.Create;
+ Log.BenchmarkEnd(1);
+ Log.LogBenchmark('Loading Skin List', 1);
+
+ // Sound Card List
+ Log.BenchmarkStart(1);
+ Log.LogStatus('Loading Soundcard list', 'Initialization');
+ Recording := TRecord.Create;
+ Log.BenchmarkEnd(1);
+ Log.LogBenchmark('Loading Soundcard list', 1);
+
+ // Ini + Paths
+ Log.BenchmarkStart(1);
+ Log.LogStatus('Load Ini', 'Initialization'); Ini := TIni.Create;
+ Ini.Load;
+
+ // Help
+ Log.BenchmarkStart(1);
+ Log.LogStatus('Load Help', 'Initialization'); Help := THelp.Create;
+
+ //Load Languagefile
+ if (Params.Language <> -1) then
+ begin
+ Language.ChangeLanguage(ILanguage[Params.Language]);
+ Help.ChangeLanguage(ILanguage[Params.Language]);
+ end else
+ begin
+ Language.ChangeLanguage(ILanguage[Ini.Language]);
+ Help.ChangeLanguage(ILanguage[Ini.Language]);
+ end;
+
+ Log.BenchmarkEnd(1);
+ Log.LogBenchmark('Loading Ini', 1);
+
+ // LCD
+ Log.BenchmarkStart(1);
+ Log.LogStatus('Load LCD', 'Initialization'); LCD := TLCD.Create;
+ if Ini.LPT = 1 then begin
+// LCD.HalfInterface := true;
+ LCD.Enable;
+ LCD.Clear;
+ LCD.WriteText(1, ' UltraStar ');
+ LCD.WriteText(2, ' Loading... ');
+ end;
+ Log.BenchmarkEnd(1);
+ Log.LogBenchmark('Loading LCD', 1);
+
+ // Light
+ Log.BenchmarkStart(1);
+ Log.LogStatus('Load Light', 'Initialization'); Light := TLight.Create;
+ if Ini.LPT = 2 then begin
+ Light.Enable;
+ end;
+ Log.BenchmarkEnd(1);
+ Log.LogBenchmark('Loading Light', 1);
+
+ // Theme
+ Log.BenchmarkStart(1);
+ Log.LogStatus('Load Themes', 'Initialization'); Theme := TTheme.Create('Themes\' + ITheme[Ini.Theme] + '.ini', Ini.Color);
+ Log.BenchmarkEnd(1);
+ Log.LogBenchmark('Loading Themes', 1);
+
+ // Covers Cache
+ Log.BenchmarkStart(1);
+ Log.LogStatus('Creating Covers Cache', 'Initialization'); Covers := TCovers.Create;
+ Log.LogBenchmark('Loading Covers Cache Array', 1);
+ Log.BenchmarkStart(1);
+
+ // Category Covers
+ Log.BenchmarkStart(1);
+ Log.LogStatus('Creating Category Covers Array', 'Initialization');
+ CatCovers:= TCatCovers.Create;
+ Log.BenchmarkEnd(1);
+ Log.LogBenchmark('Loading Category Covers Array', 1);
+
+ // Songs
+ //Log.BenchmarkStart(1);
+ Log.LogStatus('Creating Song Array', 'Initialization'); Songs := TSongs.Create;
+ Songs.LoadSongList;
+ Log.LogStatus('Creating 2nd Song Array', 'Initialization'); CatSongs := TCatSongs.Create;
+ Log.BenchmarkEnd(1);
+ Log.LogBenchmark('Loading Songs', 1);
+
+ // PluginManager
+ Log.BenchmarkStart(1);
+ Log.LogStatus('PluginManager', 'Initialization');
+ DLLMan := TDLLMan.Create; //Load PluginList
+ Log.BenchmarkEnd(1);
+ Log.LogBenchmark('Loading PluginManager', 1);
+
+ // Party Mode Manager
+ Log.BenchmarkStart(1);
+ Log.LogStatus('PartySession Manager', 'Initialization');
+ PartySession := TParty_Session.Create; //Load PartySession
+ Log.BenchmarkEnd(1);
+ Log.LogBenchmark('Loading PartySession Manager', 1);
+
+ // Party M2 Mode Manager
+ Log.BenchmarkStart(1);
+ Log.LogStatus('PartySessionM2 Manager', 'Initialization');
+ PartySessionM2 := TPartySessionM2.Create; //Load PartySessionM2
+ Log.BenchmarkEnd(1);
+ Log.LogBenchmark('Loading PartySessionM2 Manager', 1);
+
+ // Graphics
+ Log.BenchmarkStart(1);
+ Log.LogStatus('Initialize 3D', 'Initialization'); Initialize3D(WndTitle);
+ Log.BenchmarkEnd(1);
+ Log.LogBenchmark('Initializing 3D', 1);
+
+ // Sound
+ Log.BenchmarkStart(1);
+ Log.LogStatus('Initialize Sound', 'Initialization');
+ Log.LogStatus('Creating Music', 'InitializeSound'); Music := TMusic.Create;
+ InitializeSound;
+ Log.BenchmarkEnd(1);
+ Log.LogBenchmark('Initializing Sound', 1);
+
+ // Score Saving System
+ Log.BenchmarkStart(1);
+ Log.LogStatus('DataBase System', 'Initialization');
+ DataBase := TDataBaseSystem.Create;
+
+ if (Params.ScoreFile = '') then
+ DataBase.Init ('Ultrastar.db')
+ else
+ DataBase.Init (Params.ScoreFile);
+
+ Log.BenchmarkEnd(1);
+ Log.LogBenchmark('Loading DataBase System', 1);
+
+ //Playlist Manager
+ Log.BenchmarkStart(1);
+ Log.LogStatus('Playlist Manager', 'Initialization');
+ PlaylistMan := TPlaylistManager.Create;
+ Log.BenchmarkEnd(1);
+ Log.LogBenchmark('Loading Playlist Manager', 1);
+
+ //GoldenStarsTwinkleMod
+ Log.BenchmarkStart(1);
+ Log.LogStatus('Effect Manager', 'Initialization');
+ GoldenRec := TEffectManager.Create;
+ Log.BenchmarkEnd(1);
+ Log.LogBenchmark('Loading Particel System', 1);
+
+ // Joypad
+ if (Ini.Joypad = 1) OR (Params.Joypad) then begin
+ Log.BenchmarkStart(1);
+ Log.LogStatus('Initialize Joystick', 'Initialization'); Joy := TJoy.Create;
+ Log.BenchmarkEnd(1);
+ Log.LogBenchmark('Initializing Joystick', 1);
+ end;
+
+ Log.BenchmarkEnd(0);
+ Log.LogBenchmark('Loading Time', 0);
+
+
+ //------------------------------
+ //Start- Mainloop
+ //------------------------------
+ //Music.SetLoop(true);
+ //Music.SetVolume(50);
+ //Music.Open(SkinPath + 'Menu Music 3.mp3');
+ //Music.Play;
+ Log.LogStatus('Main Loop', 'Initialization'); MainLoop;
+
+ //------------------------------
+ //Finish Application
+ //------------------------------
+ if Ini.LPT = 1 then LCD.Clear;
+ if Ini.LPT = 2 then Light.TurnOff;
+
+ Log.Free;
+end.
diff --git a/Game/Code/UltraStar.rc b/Game/Code/UltraStar.rc
new file mode 100644
index 00000000..95dcb2ee
--- /dev/null
+++ b/Game/Code/UltraStar.rc
@@ -0,0 +1,37 @@
+Font PNG "..\Fonts\Normal\eurostar_regular.png"
+Font FNT "..\Fonts\Normal\eurostar_regular.dat"
+
+FontB PNG "..\Fonts\Bold\eurostar_regular_bold.png"
+FontB FNT "..\Fonts\Bold\eurostar_regular_bold.dat"
+
+FontO PNG "..\Fonts\Outline 1\Outline 1.PNG"
+FontO FNT "..\Fonts\Outline 1\Outline 1.dat"
+
+FontO2 PNG "..\Fonts\Outline 2\Outline 2.PNG"
+FontO2 FNT "..\Fonts\Outline 2\Outline 2.dat"
+
+MAINICON ICON "..\Graphics\ustar-icon_v01.ico"
+
+CRDTS_BG PNG "..\Graphics\credits_v5_bg.png"
+CRDTS_OVL PNG "..\Graphics\credits_v5_overlay.png"
+CRDTS_blindy PNG "..\Graphics\names_blindy.png"
+CRDTS_canni PNG "..\Graphics\names_canni.png"
+CRDTS_ggkfc PNG "..\Graphics\names_ggkfc.png"
+CRDTS_jaybinks PNG "..\Graphics\names_jaybinks.png"
+CRDTS_linnex PNG "..\Graphics\names_linnex.png"
+CRDTS_mog PNG "..\Graphics\names_mog.png"
+CRDTS_omgdutch PNG "..\Graphics\names_omgdutch.png"
+CRDTS_skillmaster PNG "..\Graphics\names_skillmaster.png"
+CRDTS_whiteshark PNG "..\Graphics\names_whiteshark.png"
+INTRO_L01 PNG "..\Graphics\intro-l-01.png"
+INTRO_L02 PNG "..\Graphics\intro-l-02.png"
+INTRO_L03 PNG "..\Graphics\intro-l-03.png"
+INTRO_L04 PNG "..\Graphics\intro-l-04.png"
+INTRO_L05 PNG "..\Graphics\intro-l-05.png"
+INTRO_L06 PNG "..\Graphics\intro-l-06.png"
+INTRO_L07 PNG "..\Graphics\intro-l-07.png"
+INTRO_L08 PNG "..\Graphics\intro-l-08.png"
+INTRO_L09 PNG "..\Graphics\intro-l-09.png"
+OUTRO_BG PNG "..\Graphics\outro-bg.png"
+OUTRO_ESC PNG "..\Graphics\outro-esc.png"
+OUTRO_EXD PNG "..\Graphics\outro-exit-dark.png" \ No newline at end of file
diff --git a/Game/Code/UltraStar.res b/Game/Code/UltraStar.res
new file mode 100644
index 00000000..8808a569
--- /dev/null
+++ b/Game/Code/UltraStar.res
Binary files differ
diff --git a/Game/Code/bamboo-build-win-delphi.bat b/Game/Code/bamboo-build-win-delphi.bat
new file mode 100644
index 00000000..bbde59a3
--- /dev/null
+++ b/Game/Code/bamboo-build-win-delphi.bat
@@ -0,0 +1,24 @@
+del UltraStar.res
+"C:\Program Files\Borland\BDS\4.0\Bin\BRC32 -r UltraStar.RC
+
+"C:\Program Files\Borland\BDS\4.0\Bin\dcc32.exe" -U"lib\JEDI-SDLv1.0\SDL\Pas" -O"lib\JEDI-SDLv1.0\SDL\Pas" -I"lib\JEDI-SDLv1.0\SDL\Pas" -R"lib\JEDI-SDLv1.0\SDL\Pas" UltraStar.dpr
+copy UltraStar.exe ..\..\
+cd ..\..\
+
+
+cd ScoreConverter
+"C:\Program Files\Borland\BDS\4.0\Bin\dcc32.exe" -U"..\Game\Code\Lib\SQLite" -O"..\Game\Code\Lib\SQLite" -I"..\Game\Code\Lib\SQLite" -R"..\Game\Code\Lib\SQLite" ScoreConverter.dpr
+copy ScoreConverter.exe ..\
+
+cd ..\
+
+upx --force -9 *.exe
+
+cd Installer
+"E:\Programme\NSIS\makeNSIS.exe" UltraStarDeluxe.nsi
+
+cd u3portable
+7za.exe a -tzip Files.zip "Manifest\*" "Data\*" "Host\*"
+ren "Files.zip" "UltraStar Deluxe Portable.u3p"
+
+cd ..\..\Game\Code \ No newline at end of file
diff --git a/Game/Code/lib/JEDI-SDLv1.0/JEDI-SDL-README.txt b/Game/Code/lib/JEDI-SDLv1.0/JEDI-SDL-README.txt
new file mode 100644
index 00000000..a068e943
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/JEDI-SDL-README.txt
@@ -0,0 +1,244 @@
+This is the based on the SDL ( http://www.libsdl.org ) headers, and has been converted, comments and all, to the Pascal unit called sdl.pas.
+Other conversions that have also been done are SDL_Mixer.h, SDL_Net.h, SDL_Image.h, SDL_ttf, SMPEG.h, SDL_sound and the SFont library,
+which are all included in this distribution.
+
+It allows you to access all the functions within the SDL libraries under Windows, Linux and FreeBSD, so you can write cross-platform games or multimedia applications.
+
+Installation Instructions
+-------------------------
+Windows - We now have a semi-automated setup under Windows ( thanks to David House and the Jedi JCL team ).
+ Once you have extracted the zip file, simply double click on the "JEDISDLWin32Installer.exe" to have the correct paths added to your respective
+ IDEs. All IDEs from Delphi 4 - 7 are supported and it also adds a link to the .CHM help file under the Tools menu.
+
+Linux - Alternatively if you use Linux or want to to manually install the paths, then make sure you read the "Getting Started.html" file ( ideal for those who are new to JEDI-SDL ) and is now included as a guide to help getting everything setup for smooth compilation.
+
+Also included is a guide of how to use Sourceforge using TortoiseCVS under Windows ( Linux guide is under development ).
+Both documents can be found in the "documentation" directory.
+
+
+Release History
+---------------
+1.0 : Yeah!! The Official v1.0 Release of JEDI-SDL!!
+ JEDI-SDL now updated to SDL v1.2.11, SDL_Image v1.2.5, SDL_Mixer v1.2.7, SDL_Net v1.2.6 & SDL_ttf v2.0.8
+ Added Improved FreePascal, TMT Pascal and GnuPascal support as well as maintaining Delphi/Kylix support.
+ Fixed Various bugs as pointed out on the JEDI-SDL mailing list.
+ Added SDL_GL_STEREO, SDL_GL_MULTISAMPLEBUFFERS, SDL_GL_MULTISAMPLESAMPLES
+
+Now works on MacOS X and a MacOS X disk image is available for download.
+
+// DLL/Shared object functions
+function SDL_LoadObject( const sofile : PChar ) : Pointer;
+
+function SDL_LoadFunction( handle : Pointer; const name : PChar ) : Pointer;
+
+procedure SDL_UnloadObject( handle : Pointer );
+
+//Added function to create RWops from const memory: SDL_RWFromConstMem()
+function SDL_RWFromConstMem(const mem: Pointer; size: Integer) : PSDL_RWops;
+
+//Added support for environment variables SDL_VIDEO_WINDOW_POS and SDL_VIDEO_CENTERED on Windows
+
+ New Units :
+ -----------
+ sdl_cpuinfo.pas - ported SDL_cpuinfo.h so Now you can test for Specific CPU types.
+ sdlinput.pas - Input wrapper class
+ sdlwindow.pas - Window wrapper class
+ sdltruetypefont.pas - True Type Font wrapper class
+ tcputils.pas - SDL_Net utility functions
+ sdlweb.pas - SDL_Net Web class
+ sdlwebhttp.pas - SDL_Net http protocol wrapper class
+ sdlwebftp.pas - SDL_Net ftp protocol wrapper class
+
+ New 2D Demos :
+ --------------
+
+
+ New 3D Demos :
+ --------------
+
+
+ Other New Stuff :
+ -----------------
+
+
+
+0.5 : The JEDI-SDL project is now also set up on Sourceforge ( http://sf.net/projects/jedi-sdl/ ) so the latest code is available from there.
+ Improved FreePascal support has been added.
+ Various bug fixes as pointed out on the JEDI-SDL mailing list.
+ SDL_Mixer has been updated to version 1.2.1 and includes an Effects API.
+ Demo directories are now split into 2D and 3D related sub-directories.
+ There are now both Kylix ( K prefix ) and Delphi ( D prefix ) project groups for all the demos.
+ They can be found in Demos and the 2D and 3D directories.
+
+ New Units
+ ---------
+ SDLStreams.pas - Chris Bruner has created a wrapper that uses Streams to load BMPs
+ SDLUtils.pas - Pascal only version of some Utility functions
+ SDLi386Utils.pas - Intel Assembler versions of the SDLUtils.pas functions.
+ SDL_ttf.pas - Port of the SDL True Type font support unit.
+ SDL_Sound.pas - Port of the SDL Sound library ( untested ).
+
+ New 2D Demos :
+ --------------
+ Pan and Zoom Demo - How to Pan and Zoom an SDL surface.
+ Isometric Demo - I ported my old DelphiX isometric demo over to SDL.
+ TestTimer demo - Shows hows how to use AddTimer and RemoveTimer.
+ MpegPlayer - I have updated and improved Anders Ohlsson's CLX MPegPlayer and component and it now works
+ and installs into D4, D5, D6, D7, K1, K2 & K3.
+ Showfont - Demo to show how to us SDL_ttf.dll
+ SmpegPlayer - is a console MPEG player that use smpeg and SDL_Mixer
+
+ New 3D Demos :
+ --------------
+ DeathTruckTion 1.1 - A slightly updated version of this fully functional 3D network game.
+ TerrainDemo - Terrain demo ported from the book "OpenGL Game programming" by Hawkins and Astle.
+ TestGL - the standard SDL/OpenGL Test demo. Shows how to mix 2D and 3D rendering using OpenGL.
+ glfont - Demo to show how to us SDL_ttf with OpenGL.
+ Particle Engine - Ariel's OpenGL Particle Engine.
+ Picking - Phil Freeman's Picking Demo
+ Motion Blur - Phil Freeman's Motion Blur Demo
+ Dynamic Light - Phil Freeman's Dynamic Light Demo
+ Environment Map - Phil Freeman's Environment Map Demo
+ GLMovie - is an MPEG Player that uses OpenGL to render the movie.
+ NeHe - Quite a few more NeHe demos are now included.
+
+ New Network Demos :
+ -------------------
+ There are now 3 SDL_Net Server demos and 4 SDL_Client demos as submitted by Dean Ellis.
+
+
+Beta 4 : The JEDI-SDL home page is now located @ http://www.delphi-jedi.org/Jedi:TEAM_SDL_HOME
+ All Demos ( including OpenGL Demos ) now compile under both Kylix and Delphi.
+ I have added quite a few more OpenGL examples, we are now up to Nehe tutorial 12.
+ All OpenGL demos also show how to handle Window resizing.
+ Included an OpenGL demo called Puntos by Gustavo Maximo.
+ Ported Jan Horn's OpenGL MetaBalls and also SkyBox demo to SDL.
+ Ported Ilkka Tuomioja's OpenGL Quake 2 Model Viewer/Animator to SDL.
+ NOTE : All OpenGL demos require OpenGL12.pas which can be found at...
+ http://www.lischke-online.de/Graphics.html#OpenGL12
+ I also fixed a conversion bug to do with SDL_MustLock and also a conversion omission to do with various events.
+ Fixed a conversion bug with SDL_CDOpen ( as suggested on the mailing list ).
+ Added the GetPixel and PuxPixel functions to the SDLUtils.pas file.
+ Jason Farmer has donated SFont, a simple, yet effective Font library he converted for JEDI-SDL.
+ It contains 4 Demos show how to best use it.
+ Added TUInt8Array and PUIntArray to SDL.pas after suggestions from Matthias Thoma and Eric Grange.
+ In the file area of the JEDI-SDL mailing list ( http://groups.yahoo.com/group/JEDI-SDL/files/DTTSrc/ there
+ is a fully functional 3D network game called DeathTruckTion v1.0 written by the TNTeam that makes use of
+ JEDI-SDL and is just too big to include with this distribution but is well worth looking at as it works under Windows and Linux!
+ Gustavo Maxima is working on translating the JEDI-SDL Documentation to Spanish and Portugese.
+ The Mouse Demo has now been speeded up considerably and it is very responsive now.
+ Dean Ellis will provide steps on how to compile the demos using the Free Pascal compiler.
+ Jason Farmer and I are working on a series of Tutorials that should hopefully be out soon.
+ David Aclan has donated a SMpeg component that should work under Kylix.
+ Róbert Kisnémeth, has been hard at work, and has donated some new demos he has created with a SpriteEngine ( which he also donated ).
+ He has also donated a couple of games called BlitzBomber and Oxygene ( which uses the SpriteEngine ) and added a couple of useful
+ functions to SDLUtils.pas.
+ The Functions added are SDL_FlipV, SDL_FlipH, SDL_NewPutPixel ( assembler version ), SDL_AddPixel, SDL_SubPixel, SDL_DrawLine, SDL_AddLine,
+ SDL_SubLine, SDL_AddSurface, SDL_SubSurface, SDL_MonoSurface & SDL_TexturedSurface.
+ He has also donated a Font Blitting class and demo called SDL_MonoFonts which supports alignment like Left, Right and Center.
+ He and Thomas are also working on a GUI library.
+ Jason Farmer has donated a set of Image Filtering functions which add quite a few interesting effects. Check the SDL_Filter sub-directory for more
+ info.
+ Christian Hackbart also donated an OpenGL BlockOut clone.
+
+
+Beta 3 : I have added conversions for SDL_env.h, SDL_Mixer.h and SDL_Net.h while Matthias Thoma has added conversions for SDL_Image.h and SMPEG.h.
+ This version is also SDL version 1.2.0 compliant.
+ This release also adds demos for the SDL_Image, SDL_Mixer and SDL_Net libraries.
+ There are now also some OpenGL demos that make some use of SDL as well as a demo on how to use the Mouse with Clickable regions.
+ A conversion bug, that was pointed out by Clem Vasseur, has also been fixed.
+ There is now a mailing list that has been set up at http://groups.yahoo.com/group/JEDI-SDL/join/ so we can all learn from each other how to use
+ these libraries.
+ Demos have not been unified into single .dpr files for each demo, thus showing how you would write a crossplatform game using only 1 .dpr file.
+ There is also a documentation directory that is currently in HTML format. All code examples in the documentation have been converted to Object
+ Pascal but are untested.
+ I Also fixed a few conversion bugs which I came across while converting the documentation.
+
+Beta 2 : I have added conversions for SDL_active.h, SDL_thread.h, SDL_mutex.h and
+ SDL_error.h, Matthias Thoma has added Linux Support and JEDI compliancy so these
+ units and examples are now x-platform and x-compiler compilable.
+ I also added Tom Jones' SDLUtils.pas file;
+ Matthias also cleaned up the 2 new demos and made them work on both Linux and
+ Windows.
+
+Beta 1 : Initial Release;
+
+
+There are now 5 examples included with this JEDI-SDL distribution.
+1. Is the TestWin application, which is based on the testwin application that comes with the SDL SDK, only my version has a gui front end to the options available and has been compiled under Delphi 4.03. It should be compatible with Delphi 3.0 onwards ( though Delphi 2 compatibility has not been tested ).
+
+2. A Plasma example which was converted from one found on the Demos page of the SDL site.
+
+3. A Voxel terrain following demo, which was converted from one found on the Demos page of the SDL site. This one should be of interest to others as it shows how to handle keyboard events when using SDL.
+
+4. A Mouse handling demo that shows how to use transparency and clickable regions.
+
+5. A Space Invaders style game called Aliens which shows the use of SDL, SDL_Image and SDL_Mixer. This game shows how to handle sound, keyboards and some basic collision detection. It is a conversion of one found on the SDL Demos page.
+
+There are also 14 OpenGL demos that are based on the NeHe tutorials <nehe.gamedev.net>. The other 3 OpenGL demos are Jan Horns' OpenGL demo, A Quake 2 Model viewer that I ported and a Demo by Gustavo Maxima called Puntos.
+
+If writing your own, just make sure that the SDL.pas file is in your projects path for compiling and that the SDL.dll file is in your path when running the compiled app.
+
+Please test these units and report problems to the JEDI-SDL mailing list @ http://groups.yahoo.com/group/JEDI-SDL/ outlining steps under which the error occurred. If you convert any more demos please send them to me so that I can
+include them in the ditribution for others to learn from.
+
+Also if you are using these Units to write any games
+please let me know about it so that I can post the information to the http://www.DelphiGamer.com site.
+
+The plan is to have this unit JEDI certified at some point so that it can be included on the Delphi and Kylix CDs, so all feedback is greatly welcomed.
+
+Compilers supported Tested
+------------------- ------
+Delphi Yes
+Kylix Yes
+FreePascal Yes
+TMT Pascal compiler Not Yet.
+Virtual Pascal No
+Gnu Pascal No
+
+
+
+Credits
+-------
+Matthias Thoma <ma.thoma@gmx.de> for is endless help with my conversion bugs.
+Jason Farmer <jason@cerebral-bicycle.co.uk> for donating the SFont Font Library.
+Gustavo Maximo <gmaximo@secretariaplus.com> for the Puntos OpenGL Demo and work he is doing on the documentation
+Róbert Kisnémeth <mikrobi@freemail.hu> for his numerous contributions
+Chris Bruner <cryst@golden.net> for testing under Kylix
+August Logan Bear Jr.<augustjr@columbus.rr.com> for testing under Kylix
+Dean Ellis<dean_ellis@yahoo.com> for FreePascal Compiler compatability testing and SDL_Net demos and testing
+David House<david@dahsoftware.com> for Windows Insaller and testing.
+Romi Kuntsman<romik12345@lycos.co.uk> for helping out on some OpenGL issues.
+Everyone on the JEDI-SDL <http://groups.yahoo.com/group/JEDI-SDL/join/> mailing list for their feedback and support.
+Everyone on the Delphi-JEDI <http://groups.yahoo.com/group/Delphi-JEDI/join/> mailing for answering my conversion questions.
+Tom Jones for inspiring this conversion.
+
+The JEDI-SDL Home page can be found @ http://www.delphi-jedi.org/Jedi:TEAM_SDL_HOME
+
+The JEDI-SDL source code archive can be found @ http://www.sf.net/projects/jedi-sdl/
+
+The JEDI-SDL mailing list can be found @ http://groups.yahoo.com/group/JEDI-SDL/join/
+
+The Latest Stable Release version of the JEDI-SDL.zip file can always be found on the Delphi-JEDI site <http://www.delphi-jedi.org/Jedi:TEAM_SDL_HOME>
+
+The Latest Alpha/Unstable version can always be grabbed from the SourceForge CVS http://sourceforge.net/cvs/?group_id=43805
+
+
+Sincerely,
+
+
+
+Dominique Louis
+Delphi Game Developer.
+*********************************************************
+** To Do Nothing is to Collaborate with the oppressor **
+** -------------------------------------------------- **
+*********************************************************
+=========================================================
+From . . . . . . . : Dominique Louis
+Email. . . . . . . : Dominique@SavageSoftware.com.au
+Company. . . . . . : Savage Software Solutions
+Delphi Games Site. : http://www.DelphiGamer.com
+Delphi JEDI Site . : http://www.delphi-jedi.org
+=========================================================
+
diff --git a/Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/geometry.pas b/Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/geometry.pas
new file mode 100644
index 00000000..15783515
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/geometry.pas
@@ -0,0 +1,1994 @@
+unit geometry;
+{
+ $Id: geometry.pas,v 1.1 2004/03/30 21:53:54 savage Exp $
+
+}
+
+// This unit contains many needed types, functions and procedures for
+// quaternion, vector and matrix arithmetics. It is specifically designed
+// for geometric calculations within R3 (affine vector space)
+// and R4 (homogeneous vector space).
+//
+// Note: The terms 'affine' or 'affine coordinates' are not really correct here
+// because an 'affine transformation' describes generally a transformation which leads
+// to a uniquely solvable system of equations and has nothing to do with the dimensionality
+// of a vector. One could use 'projective coordinates' but this is also not really correct
+// and since I haven't found a better name (or even any correct one), 'affine' is as good
+// as any other one.
+//
+// Identifiers containing no dimensionality (like affine or homogeneous)
+// and no datatype (integer..extended) are supposed as R4 representation
+// with 'single' floating point type (examples are TVector, TMatrix,
+// and TQuaternion). The default data type is 'single' ('GLFloat' for OpenGL)
+// and used in all routines (except conversions and trigonometric functions).
+//
+// Routines with an open array as argument can either take Func([1,2,3,4,..]) or Func(Vect).
+// The latter is prefered, since no extra stack operations is required.
+// Note: Be careful while passing open array elements! If you pass more elements
+// than there's room in the result the behaviour will be unpredictable.
+//
+// If not otherwise stated, all angles are given in radians
+// (instead of degrees). Use RadToDeg or DegToRad to convert between them.
+//
+// Geometry.pas was assembled from different sources (like GraphicGems)
+// and relevant books or based on self written code, respectivly.
+//
+// Note: Some aspects need to be considered when using Delphi and pure
+// assembler code. Delphi ensures that the direction flag is always
+// cleared while entering a function and expects it cleared on return.
+// This is in particular important in routines with (CPU) string commands (MOVSD etc.)
+// The registers EDI, ESI and EBX (as well as the stack management
+// registers EBP and ESP) must not be changed! EAX, ECX and EDX are
+// freely available and mostly used for parameter.
+//
+// Version 2.5
+// last change : 04. January 2000
+//
+// (c) Copyright 1999, Dipl. Ing. Mike Lischke (public@lischke-online.de)
+{
+ $Log: geometry.pas,v $
+ Revision 1.1 2004/03/30 21:53:54 savage
+ Moved to it's own folder.
+
+ Revision 1.1 2004/02/05 00:08:19 savage
+ Module 1.0 release
+
+
+}
+
+interface
+
+{$I jedi-sdl.inc}
+
+type
+ // data types needed for 3D graphics calculation,
+ // included are 'C like' aliases for each type (to be
+ // conformal with OpenGL types)
+
+ PByte = ^Byte;
+ PWord = ^Word;
+ PInteger = ^Integer;
+ PFloat = ^Single;
+ PDouble = ^Double;
+ PExtended = ^Extended;
+ PPointer = ^Pointer;
+
+ // types to specify continous streams of a specific type
+ // switch off range checking to access values beyond the limits
+ PByteVector = ^TByteVector;
+ PByteArray = PByteVector;
+ TByteVector = array[0..0] of Byte;
+
+ PWordVector = ^TWordVector;
+ PWordArray = PWordVector; // note: there's a same named type in SysUtils
+ TWordVector = array[0..0] of Word;
+
+ PIntegerVector = ^TIntegerVector;
+ PIntegerArray = PIntegerVector;
+ TIntegerVector = array[0..0] of Integer;
+
+ PFloatVector = ^TFloatVector;
+ PFloatArray = PFloatVector;
+ TFloatVector = array[0..0] of Single;
+
+ PDoubleVector = ^TDoubleVector;
+ PDoubleArray = PDoubleVector;
+ TDoubleVector = array[0..0] of Double;
+
+ PExtendedVector = ^TExtendedVector;
+ PExtendedArray = PExtendedVector;
+ TExtendedVector = array[0..0] of Extended;
+
+ PPointerVector = ^TPointerVector;
+ PPointerArray = PPointerVector;
+ TPointerVector = array[0..0] of Pointer;
+
+ PCardinalVector = ^TCardinalVector;
+ PCardinalArray = PCardinalVector;
+ TCardinalVector = array[0..0] of Cardinal;
+
+ // common vector and matrix types with predefined limits
+ // indices correspond like: x -> 0
+ // y -> 1
+ // z -> 2
+ // w -> 3
+
+ PHomogeneousByteVector = ^THomogeneousByteVector;
+ THomogeneousByteVector = array[0..3] of Byte;
+ TVector4b = THomogeneousByteVector;
+
+ PHomogeneousWordVector = ^THomogeneousWordVector;
+ THomogeneousWordVector = array[0..3] of Word;
+ TVector4w = THomogeneousWordVector;
+
+ PHomogeneousIntVector = ^THomogeneousIntVector;
+ THomogeneousIntVector = array[0..3] of Integer;
+ TVector4i = THomogeneousIntVector;
+
+ PHomogeneousFltVector = ^THomogeneousFltVector;
+ THomogeneousFltVector = array[0..3] of Single;
+ TVector4f = THomogeneousFltVector;
+
+ PHomogeneousDblVector = ^THomogeneousDblVector;
+ THomogeneousDblVector = array[0..3] of Double;
+ TVector4d = THomogeneousDblVector;
+
+ PHomogeneousExtVector = ^THomogeneousExtVector;
+ THomogeneousExtVector = array[0..3] of Extended;
+ TVector4e = THomogeneousExtVector;
+
+ PHomogeneousPtrVector = ^THomogeneousPtrVector;
+ THomogeneousPtrVector = array[0..3] of Pointer;
+ TVector4p = THomogeneousPtrVector;
+
+ PAffineByteVector = ^TAffineByteVector;
+ TAffineByteVector = array[0..2] of Byte;
+ TVector3b = TAffineByteVector;
+
+ PAffineWordVector = ^TAffineWordVector;
+ TAffineWordVector = array[0..2] of Word;
+ TVector3w = TAffineWordVector;
+
+ PAffineIntVector = ^TAffineIntVector;
+ TAffineIntVector = array[0..2] of Integer;
+ TVector3i = TAffineIntVector;
+
+ PAffineFltVector = ^TAffineFltVector;
+ TAffineFltVector = array[0..2] of Single;
+ TVector3f = TAffineFltVector;
+
+ PAffineDblVector = ^TAffineDblVector;
+ TAffineDblVector = array[0..2] of Double;
+ TVector3d = TAffineDblVector;
+
+ PAffineExtVector = ^TAffineExtVector;
+ TAffineExtVector = array[0..2] of Extended;
+ TVector3e = TAffineExtVector;
+
+ PAffinePtrVector = ^TAffinePtrVector;
+ TAffinePtrVector = array[0..2] of Pointer;
+ TVector3p = TAffinePtrVector;
+
+ // some simplified names
+ PVector = ^TVector;
+ TVector = THomogeneousFltVector;
+
+ PHomogeneousVector = ^THomogeneousVector;
+ THomogeneousVector = THomogeneousFltVector;
+
+ PAffineVector = ^TAffineVector;
+ TAffineVector = TAffineFltVector;
+
+ // arrays of vectors
+ PVectorArray = ^TVectorArray;
+ TVectorArray = array[0..0] of TAffineVector;
+
+ // matrices
+ THomogeneousByteMatrix = array[0..3] of THomogeneousByteVector;
+ TMatrix4b = THomogeneousByteMatrix;
+
+ THomogeneousWordMatrix = array[0..3] of THomogeneousWordVector;
+ TMatrix4w = THomogeneousWordMatrix;
+
+ THomogeneousIntMatrix = array[0..3] of THomogeneousIntVector;
+ TMatrix4i = THomogeneousIntMatrix;
+
+ THomogeneousFltMatrix = array[0..3] of THomogeneousFltVector;
+ TMatrix4f = THomogeneousFltMatrix;
+
+ THomogeneousDblMatrix = array[0..3] of THomogeneousDblVector;
+ TMatrix4d = THomogeneousDblMatrix;
+
+ THomogeneousExtMatrix = array[0..3] of THomogeneousExtVector;
+ TMatrix4e = THomogeneousExtMatrix;
+
+ TAffineByteMatrix = array[0..2] of TAffineByteVector;
+ TMatrix3b = TAffineByteMatrix;
+
+ TAffineWordMatrix = array[0..2] of TAffineWordVector;
+ TMatrix3w = TAffineWordMatrix;
+
+ TAffineIntMatrix = array[0..2] of TAffineIntVector;
+ TMatrix3i = TAffineIntMatrix;
+
+ TAffineFltMatrix = array[0..2] of TAffineFltVector;
+ TMatrix3f = TAffineFltMatrix;
+
+ TAffineDblMatrix = array[0..2] of TAffineDblVector;
+ TMatrix3d = TAffineDblMatrix;
+
+ TAffineExtMatrix = array[0..2] of TAffineExtVector;
+ TMatrix3e = TAffineExtMatrix;
+
+ // some simplified names
+ PMatrix = ^TMatrix;
+ TMatrix = THomogeneousFltMatrix;
+
+ PHomogeneousMatrix = ^THomogeneousMatrix;
+ THomogeneousMatrix = THomogeneousFltMatrix;
+
+ PAffineMatrix = ^TAffineMatrix;
+ TAffineMatrix = TAffineFltMatrix;
+
+ // q = ([x, y, z], w)
+ TQuaternion = record
+ case Integer of
+ 0:
+ (ImagPart: TAffineVector;
+ RealPart: Single);
+ 1:
+ (Vector: TVector4f);
+ end;
+
+ TRectangle = record
+ Left,
+ Top,
+ Width,
+ Height: Integer;
+ end;
+
+ TTransType = (ttScaleX, ttScaleY, ttScaleZ,
+ ttShearXY, ttShearXZ, ttShearYZ,
+ ttRotateX, ttRotateY, ttRotateZ,
+ ttTranslateX, ttTranslateY, ttTranslateZ,
+ ttPerspectiveX, ttPerspectiveY, ttPerspectiveZ, ttPerspectiveW);
+
+ // used to describe a sequence of transformations in following order:
+ // [Sx][Sy][Sz][ShearXY][ShearXZ][ShearZY][Rx][Ry][Rz][Tx][Ty][Tz][P(x,y,z,w)]
+ // constants are declared for easier access (see MatrixDecompose below)
+ TTransformations = array[TTransType] of Single;
+
+
+const
+ // useful constants
+
+ // standard vectors
+ XVector: TAffineVector = (1, 0, 0);
+ YVector: TAffineVector = (0, 1, 0);
+ ZVector: TAffineVector = (0, 0, 1);
+ NullVector: TAffineVector = (0, 0, 0);
+
+ IdentityMatrix: TMatrix = ((1, 0, 0, 0),
+ (0, 1, 0, 0),
+ (0, 0, 1, 0),
+ (0, 0, 0, 1));
+ EmptyMatrix: TMatrix = ((0, 0, 0, 0),
+ (0, 0, 0, 0),
+ (0, 0, 0, 0),
+ (0, 0, 0, 0));
+ // some very small numbers
+ EPSILON = 1e-100;
+ EPSILON2 = 1e-50;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+// vector functions
+function VectorAdd(V1, V2: TVector): TVector;
+function VectorAffineAdd(V1, V2: TAffineVector): TAffineVector;
+function VectorAffineCombine(V1, V2: TAffineVector; F1, F2: Single): TAffineVector;
+function VectorAffineDotProduct(V1, V2: TAffineVector): Single;
+function VectorAffineLerp(V1, V2: TAffineVector; t: Single): TAffineVector;
+function VectorAffineSubtract(V1, V2: TAffineVector): TAffineVector;
+function VectorAngle(V1, V2: TAffineVector): Single;
+function VectorCombine(V1, V2: TVector; F1, F2: Single): TVector;
+function VectorCrossProduct(V1, V2: TAffineVector): TAffineVector;
+function VectorDotProduct(V1, V2: TVector): Single;
+function VectorLength(V: array of Single): Single;
+function VectorLerp(V1, V2: TVector; t: Single): TVector;
+procedure VectorNegate(V: array of Single);
+function VectorNorm(V: array of Single): Single;
+function VectorNormalize(V: array of Single): Single;
+function VectorPerpendicular(V, N: TAffineVector): TAffineVector;
+function VectorReflect(V, N: TAffineVector): TAffineVector;
+procedure VectorRotate(var Vector: TVector4f; Axis: TVector3f; Angle: Single);
+procedure VectorScale(V: array of Single; Factor: Single);
+function VectorSubtract(V1, V2: TVector): TVector;
+
+// matrix functions
+function CreateRotationMatrixX(Sine, Cosine: Single): TMatrix;
+function CreateRotationMatrixY(Sine, Cosine: Single): TMatrix;
+function CreateRotationMatrixZ(Sine, Cosine: Single): TMatrix;
+function CreateScaleMatrix(V: TAffineVector): TMatrix;
+function CreateTranslationMatrix(V: TVector): TMatrix;
+procedure MatrixAdjoint(var M: TMatrix);
+function MatrixAffineDeterminant(M: TAffineMatrix): Single;
+procedure MatrixAffineTranspose(var M: TAffineMatrix);
+function MatrixDeterminant(M: TMatrix): Single;
+procedure MatrixInvert(var M: TMatrix);
+function MatrixMultiply(M1, M2: TMatrix): TMatrix;
+procedure MatrixScale(var M: TMatrix; Factor: Single);
+procedure MatrixTranspose(var M: TMatrix);
+
+// quaternion functions
+function QuaternionConjugate(Q: TQuaternion): TQuaternion;
+function QuaternionFromPoints(V1, V2: TAffineVector): TQuaternion;
+function QuaternionMultiply(qL, qR: TQuaternion): TQuaternion;
+function QuaternionSlerp(QStart, QEnd: TQuaternion; Spin: Integer; t: Single): TQuaternion;
+function QuaternionToMatrix(Q: TQuaternion): TMatrix;
+procedure QuaternionToPoints(Q: TQuaternion; var ArcFrom, ArcTo: TAffineVector);
+
+// mixed functions
+function ConvertRotation(Angles: TAffineVector): TVector;
+function CreateRotationMatrix(Axis: TVector3f; Angle: Single): TMatrix;
+function MatrixDecompose(M: TMatrix; var Tran: TTransformations): Boolean;
+function VectorAffineTransform(V: TAffineVector; M: TAffineMatrix): TAffineVector;
+function VectorTransform(V: TVector4f; M: TMatrix): TVector4f; overload;
+function VectorTransform(V: TVector3f; M: TMatrix): TVector3f; overload;
+
+// miscellaneous functions
+function MakeAffineDblVector(V: array of Double): TAffineDblVector;
+function MakeDblVector(V: array of Double): THomogeneousDblVector;
+function MakeAffineVector(V: array of Single): TAffineVector;
+function MakeQuaternion(Imag: array of Single; Real: Single): TQuaternion;
+function MakeVector(V: array of Single): TVector;
+function PointInPolygon(xp, yp : array of Single; x, y: Single): Boolean;
+function VectorAffineDblToFlt(V: TAffineDblVector): TAffineVector;
+function VectorDblToFlt(V: THomogeneousDblVector): THomogeneousVector;
+function VectorAffineFltToDbl(V: TAffineVector): TAffineDblVector;
+function VectorFltToDbl(V: TVector): THomogeneousDblVector;
+
+// trigonometric functions
+function ArcCos(X: Extended): Extended;
+function ArcSin(X: Extended): Extended;
+function ArcTan2(Y, X: Extended): Extended;
+function CoTan(X: Extended): Extended;
+function DegToRad(Degrees: Extended): Extended;
+function RadToDeg(Radians: Extended): Extended;
+procedure SinCos(Theta: Extended; var Sin, Cos: Extended);
+function Tan(X: Extended): Extended;
+
+// coordinate system manipulation functions
+function Turn(Matrix: TMatrix; Angle: Single): TMatrix; overload;
+function Turn(Matrix: TMatrix; MasterUp: TAffineVector; Angle: Single): TMatrix; overload;
+function Pitch(Matrix: TMatrix; Angle: Single): TMatrix; overload;
+function Pitch(Matrix: TMatrix; MasterRight: TAffineVector; Angle: Single): TMatrix; overload;
+function Roll(Matrix: TMatrix; Angle: Single): TMatrix; overload;
+function Roll(Matrix: TMatrix; MasterDirection: TAffineVector; Angle: Single): TMatrix; overload;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+implementation
+
+const
+ // FPU status flags (high order byte)
+ C0 = 1;
+ C1 = 2;
+ C2 = 4;
+ C3 = $40;
+
+ // to be used as descriptive indices
+ X = 0;
+ Y = 1;
+ Z = 2;
+ W = 3;
+
+//----------------- trigonometric helper functions ---------------------------------------------------------------------
+
+function DegToRad(Degrees: Extended): Extended;
+
+begin
+ Result := Degrees * (PI / 180);
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function RadToDeg(Radians: Extended): Extended;
+
+begin
+ Result := Radians * (180 / PI);
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+procedure SinCos(Theta: Extended; var Sin, Cos: Extended); assembler; register;
+
+// calculates sine and cosine from the given angle Theta
+// EAX contains address of Sin
+// EDX contains address of Cos
+// Theta is passed over the stack
+
+asm
+ FLD Theta
+ FSINCOS
+ FSTP TBYTE PTR [EDX] // cosine
+ FSTP TBYTE PTR [EAX] // sine
+ FWAIT
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function ArcCos(X: Extended): Extended;
+
+begin
+ Result := ArcTan2(Sqrt(1 - X * X), X);
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function ArcSin(X: Extended): Extended;
+
+begin
+ Result := ArcTan2(X, Sqrt(1 - X * X))
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function ArcTan2(Y, X: Extended): Extended;
+
+asm
+ FLD Y
+ FLD X
+ FPATAN
+ FWAIT
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function Tan(X: Extended): Extended;
+
+asm
+ FLD X
+ FPTAN
+ FSTP ST(0) // FPTAN pushes 1.0 after result
+ FWAIT
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function CoTan(X: Extended): Extended;
+
+asm
+ FLD X
+ FPTAN
+ FDIVRP
+ FWAIT
+end;
+
+//----------------- miscellaneous vector functions ---------------------------------------------------------------------
+
+function MakeAffineDblVector(V: array of Double): TAffineDblVector; assembler;
+
+// creates a vector from given values
+// EAX contains address of V
+// ECX contains address to result vector
+// EDX contains highest index of V
+
+asm
+ PUSH EDI
+ PUSH ESI
+ MOV EDI, ECX
+ MOV ESI, EAX
+ MOV ECX, EDX
+ ADD ECX, 2
+ REP MOVSD
+ POP ESI
+ POP EDI
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function MakeDblVector(V: array of Double): THomogeneousDblVector; assembler;
+
+// creates a vector from given values
+// EAX contains address of V
+// ECX contains address to result vector
+// EDX contains highest index of V
+
+asm
+ PUSH EDI
+ PUSH ESI
+ MOV EDI, ECX
+ MOV ESI, EAX
+ MOV ECX, EDX
+ ADD ECX, 2
+ REP MOVSD
+ POP ESI
+ POP EDI
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function MakeAffineVector(V: array of Single): TAffineVector; assembler;
+
+// creates a vector from given values
+// EAX contains address of V
+// ECX contains address to result vector
+// EDX contains highest index of V
+
+asm
+ PUSH EDI
+ PUSH ESI
+ MOV EDI, ECX
+ MOV ESI, EAX
+ MOV ECX, EDX
+ INC ECX
+ CMP ECX, 3
+ JB @@1
+ MOV ECX, 3
+@@1: REP MOVSD // copy given values
+ MOV ECX, 2
+ SUB ECX, EDX // determine missing entries
+ JS @@Finish
+ XOR EAX, EAX
+ REP STOSD // set remaining fields to 0
+@@Finish: POP ESI
+ POP EDI
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function MakeQuaternion(Imag: array of Single; Real: Single): TQuaternion; assembler;
+
+// creates a quaternion from the given values
+// EAX contains address of Imag
+// ECX contains address to result vector
+// EDX contains highest index of Imag
+// Real part is passed on the stack
+
+asm
+ PUSH EDI
+ PUSH ESI
+ MOV EDI, ECX
+ MOV ESI, EAX
+ MOV ECX, EDX
+ INC ECX
+ REP MOVSD
+ MOV EAX, [Real]
+ MOV [EDI], EAX
+ POP ESI
+ POP EDI
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function MakeVector(V: array of Single): TVector; assembler;
+
+// creates a vector from given values
+// EAX contains address of V
+// ECX contains address to result vector
+// EDX contains highest index of V
+
+asm
+ PUSH EDI
+ PUSH ESI
+ MOV EDI, ECX
+ MOV ESI, EAX
+ MOV ECX, EDX
+ INC ECX
+ CMP ECX, 4
+ JB @@1
+ MOV ECX, 4
+@@1: REP MOVSD // copy given values
+ MOV ECX, 3
+ SUB ECX, EDX // determine missing entries
+ JS @@Finish
+ XOR EAX, EAX
+ REP STOSD // set remaining fields to 0
+@@Finish: POP ESI
+ POP EDI
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorLength(V: array of Single): Single; assembler;
+
+// calculates the length of a vector following the equation: sqrt(x * x + y * y + ...)
+// Note: The parameter of this function is declared as open array. Thus
+// there's no restriction about the number of the components of the vector.
+//
+// EAX contains address of V
+// EDX contains the highest index of V
+// the result is returned in ST(0)
+
+asm
+ FLDZ // initialize sum
+@@Loop: FLD DWORD PTR [EAX + 4 * EDX] // load a component
+ FMUL ST, ST
+ FADDP
+ SUB EDX, 1
+ JNL @@Loop
+ FSQRT
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorAngle(V1, V2: TAffineVector): Single; assembler;
+
+// calculates the cosine of the angle between Vector1 and Vector2
+// Result = DotProduct(V1, V2) / (Length(V1) * Length(V2))
+//
+// EAX contains address of Vector1
+// EDX contains address of Vector2
+
+asm
+ FLD DWORD PTR [EAX] // V1[0]
+ FLD ST // double V1[0]
+ FMUL ST, ST // V1[0]^2 (prep. for divisor)
+ FLD DWORD PTR [EDX] // V2[0]
+ FMUL ST(2), ST // ST(2) := V1[0] * V2[0]
+ FMUL ST, ST // V2[0]^2 (prep. for divisor)
+ FLD DWORD PTR [EAX + 4] // V1[1]
+ FLD ST // double V1[1]
+ FMUL ST, ST // ST(0) := V1[1]^2
+ FADDP ST(3), ST // ST(2) := V1[0]^2 + V1[1] * * 2
+ FLD DWORD PTR [EDX + 4] // V2[1]
+ FMUL ST(1), ST // ST(1) := V1[1] * V2[1]
+ FMUL ST, ST // ST(0) := V2[1]^2
+ FADDP ST(2), ST // ST(1) := V2[0]^2 + V2[1]^2
+ FADDP ST(3), ST // ST(2) := V1[0] * V2[0] + V1[1] * V2[1]
+ FLD DWORD PTR [EAX + 8] // load V2[1]
+ FLD ST // same calcs go here
+ FMUL ST, ST // (compare above)
+ FADDP ST(3), ST
+ FLD DWORD PTR [EDX + 8]
+ FMUL ST(1), ST
+ FMUL ST, ST
+ FADDP ST(2), ST
+ FADDP ST(3), ST
+ FMULP // ST(0) := (V1[0]^2 + V1[1]^2 + V1[2]) *
+ // (V2[0]^2 + V2[1]^2 + V2[2])
+ FSQRT // sqrt(ST(0))
+ FDIVP // ST(0) := Result := ST(1) / ST(0)
+ // the result is expected in ST(0), if it's invalid, an error is raised
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorNorm(V: array of Single): Single; assembler; register;
+
+// calculates norm of a vector which is defined as norm = x * x + y * y + ...
+// EAX contains address of V
+// EDX contains highest index in V
+// result is passed in ST(0)
+
+asm
+ FLDZ // initialize sum
+@@Loop: FLD DWORD PTR [EAX + 4 * EDX] // load a component
+ FMUL ST, ST // make square
+ FADDP // add previous calculated sum
+ SUB EDX, 1
+ JNL @@Loop
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorNormalize(V: array of Single): Single; assembler; register;
+
+// transforms a vector to unit length and return length
+// EAX contains address of V
+// EDX contains the highest index in V
+// return former length of V in ST
+
+asm
+ PUSH EBX
+ MOV ECX, EDX // save size of V
+ CALL VectorLength // calculate length of vector
+ FTST // test if length = 0
+ MOV EBX, EAX // save parameter address
+ FSTSW AX // get test result
+ TEST AH, C3 // check the test result
+ JNZ @@Finish
+ SUB EBX, 4 // simplyfied address calculation
+ INC ECX
+ FLD1 // calculate reciprocal of length
+ FDIV ST, ST(1)
+@@1: FLD ST // double reciprocal
+ FMUL DWORD PTR [EBX + 4 * ECX] // scale component
+ WAIT
+ FSTP DWORD PTR [EBX + 4 * ECX] // store result
+ LOOP @@1
+ FSTP ST // remove reciprocal from FPU stack
+@@Finish: POP EBX
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorAffineSubtract(V1, V2: TAffineVector): TAffineVector; assembler; register;
+
+// returns v1 minus v2
+// EAX contains address of V1
+// EDX contains address of V2
+// ECX contains address of the result
+
+asm
+ {Result[X] := V1[X]-V2[X];
+ Result[Y] := V1[Y]-V2[Y];
+ Result[Z] := V1[Z]-V2[Z];}
+
+ FLD DWORD PTR [EAX]
+ FSUB DWORD PTR [EDX]
+ FSTP DWORD PTR [ECX]
+ FLD DWORD PTR [EAX + 4]
+ FSUB DWORD PTR [EDX + 4]
+ FSTP DWORD PTR [ECX + 4]
+ FLD DWORD PTR [EAX + 8]
+ FSUB DWORD PTR [EDX + 8]
+ FSTP DWORD PTR [ECX + 8]
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorReflect(V, N: TAffineVector): TAffineVector; assembler; register;
+
+// reflects vector V against N (assumes N is normalized)
+// EAX contains address of V
+// EDX contains address of N
+// ECX contains address of the result
+
+//var Dot : Single;
+
+asm
+ {Dot := VectorAffineDotProduct(V, N);
+ Result[X] := V[X]-2 * Dot * N[X];
+ Result[Y] := V[Y]-2 * Dot * N[Y];
+ Result[Z] := V[Z]-2 * Dot * N[Z];}
+
+ CALL VectorAffineDotProduct // dot is now in ST(0)
+ FCHS // -dot
+ FADD ST, ST // -dot * 2
+ FLD DWORD PTR [EDX] // ST := N[X]
+ FMUL ST, ST(1) // ST := -2 * dot * N[X]
+ FADD DWORD PTR[EAX] // ST := V[X] - 2 * dot * N[X]
+ FSTP DWORD PTR [ECX] // store result
+ FLD DWORD PTR [EDX + 4] // etc.
+ FMUL ST, ST(1)
+ FADD DWORD PTR[EAX + 4]
+ FSTP DWORD PTR [ECX + 4]
+ FLD DWORD PTR [EDX + 8]
+ FMUL ST, ST(1)
+ FADD DWORD PTR[EAX + 8]
+ FSTP DWORD PTR [ECX + 8]
+ FSTP ST // clean FPU stack
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+procedure VectorRotate(var Vector: TVector4f; Axis: TVector3f; Angle: Single);
+
+// rotates Vector about Axis with Angle radiants
+
+var RotMatrix : TMatrix4f;
+
+begin
+ RotMatrix := CreateRotationMatrix(Axis, Angle);
+ Vector := VectorTransform(Vector, RotMatrix);
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+procedure VectorScale(V: array of Single; Factor: Single); assembler; register;
+
+// returns a vector scaled by a factor
+// EAX contains address of V
+// EDX contains highest index in V
+// Factor is located on the stack
+
+asm
+ {for I := Low(V) to High(V) do V[I] := V[I] * Factor;}
+
+ FLD DWORD PTR [Factor] // load factor
+@@Loop: FLD DWORD PTR [EAX + 4 * EDX] // load a component
+ FMUL ST, ST(1) // multiply it with the factor
+ WAIT
+ FSTP DWORD PTR [EAX + 4 * EDX] // store the result
+ DEC EDX // do the entire array
+ JNS @@Loop
+ FSTP ST(0) // clean the FPU stack
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+procedure VectorNegate(V: array of Single); assembler; register;
+
+// returns a negated vector
+// EAX contains address of V
+// EDX contains highest index in V
+
+asm
+ {V[X] := -V[X];
+ V[Y] := -V[Y];
+ V[Z] := -V[Z];}
+
+@@Loop: FLD DWORD PTR [EAX + 4 * EDX]
+ FCHS
+ WAIT
+ FSTP DWORD PTR [EAX + 4 * EDX]
+ DEC EDX
+ JNS @@Loop
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorAdd(V1, V2: TVector): TVector; register;
+
+// returns the sum of two vectors
+
+begin
+ Result[X] := V1[X] + V2[X];
+ Result[Y] := V1[Y] + V2[Y];
+ Result[Z] := V1[Z] + V2[Z];
+ Result[W] := V1[W] + V2[W];
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorAffineAdd(V1, V2: TAffineVector): TAffineVector; register;
+
+// returns the sum of two vectors
+
+begin
+ Result[X] := V1[X] + V2[X];
+ Result[Y] := V1[Y] + V2[Y];
+ Result[Z] := V1[Z] + V2[Z];
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorSubtract(V1, V2: TVector): TVector; register;
+
+// returns the difference of two vectors
+
+begin
+ Result[X] := V1[X] - V2[X];
+ Result[Y] := V1[Y] - V2[Y];
+ Result[Z] := V1[Z] - V2[Z];
+ Result[W] := V1[W] - V2[W];
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorDotProduct(V1, V2: TVector): Single; register;
+
+begin
+ Result := V1[X] * V2[X] + V1[Y] * V2[Y] + V1[Z] * V2[Z] + V1[W] * V2[W];
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorAffineDotProduct(V1, V2: TAffineVector): Single; assembler; register;
+
+// calculates the dot product between V1 and V2
+// EAX contains address of V1
+// EDX contains address of V2
+// result is stored in ST(0)
+
+asm
+ //Result := V1[X] * V2[X] + V1[Y] * V2[Y] + V1[Z] * V2[Z];
+
+ FLD DWORD PTR [EAX]
+ FMUL DWORD PTR [EDX]
+ FLD DWORD PTR [EAX + 4]
+ FMUL DWORD PTR [EDX + 4]
+ FADDP
+ FLD DWORD PTR [EAX + 8]
+ FMUL DWORD PTR [EDX + 8]
+ FADDP
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorCrossProduct(V1, V2: TAffineVector): TAffineVector;
+
+// calculates the cross product between vector 1 and 2, Temp is necessary because
+// either V1 or V2 could also be the result vector
+//
+// EAX contains address of V1
+// EDX contains address of V2
+// ECX contains address of result
+
+var Temp: TAffineVector;
+
+asm
+ {Temp[X] := V1[Y] * V2[Z]-V1[Z] * V2[Y];
+ Temp[Y] := V1[Z] * V2[X]-V1[X] * V2[Z];
+ Temp[Z] := V1[X] * V2[Y]-V1[Y] * V2[X];
+ Result := Temp;}
+
+ PUSH EBX // save EBX, must be restored to original value
+ LEA EBX, [Temp]
+ FLD DWORD PTR [EDX + 8] // first load both vectors onto FPU register stack
+ FLD DWORD PTR [EDX + 4]
+ FLD DWORD PTR [EDX + 0]
+ FLD DWORD PTR [EAX + 8]
+ FLD DWORD PTR [EAX + 4]
+ FLD DWORD PTR [EAX + 0]
+
+ FLD ST(1) // ST(0) := V1[Y]
+ FMUL ST, ST(6) // ST(0) := V1[Y] * V2[Z]
+ FLD ST(3) // ST(0) := V1[Z]
+ FMUL ST, ST(6) // ST(0) := V1[Z] * V2[Y]
+ FSUBP ST(1), ST // ST(0) := ST(1)-ST(0)
+ FSTP DWORD [EBX] // Temp[X] := ST(0)
+ FLD ST(2) // ST(0) := V1[Z]
+ FMUL ST, ST(4) // ST(0) := V1[Z] * V2[X]
+ FLD ST(1) // ST(0) := V1[X]
+ FMUL ST, ST(7) // ST(0) := V1[X] * V2[Z]
+ FSUBP ST(1), ST // ST(0) := ST(1)-ST(0)
+ FSTP DWORD [EBX + 4] // Temp[Y] := ST(0)
+ FLD ST // ST(0) := V1[X]
+ FMUL ST, ST(5) // ST(0) := V1[X] * V2[Y]
+ FLD ST(2) // ST(0) := V1[Y]
+ FMUL ST, ST(5) // ST(0) := V1[Y] * V2[X]
+ FSUBP ST(1), ST // ST(0) := ST(1)-ST(0)
+ FSTP DWORD [EBX + 8] // Temp[Z] := ST(0)
+ FSTP ST(0) // clear FPU register stack
+ FSTP ST(0)
+ FSTP ST(0)
+ FSTP ST(0)
+ FSTP ST(0)
+ FSTP ST(0)
+ MOV EAX, [EBX] // copy Temp to Result
+ MOV [ECX], EAX
+ MOV EAX, [EBX + 4]
+ MOV [ECX + 4], EAX
+ MOV EAX, [EBX + 8]
+ MOV [ECX + 8], EAX
+ POP EBX
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorPerpendicular(V, N: TAffineVector): TAffineVector;
+
+// calculates a vector perpendicular to N (N is assumed to be of unit length)
+// subtract out any component parallel to N
+
+var Dot: Single;
+
+begin
+ Dot := VectorAffineDotProduct(V, N);
+ Result[X] := V[X]-Dot * N[X];
+ Result[Y] := V[Y]-Dot * N[Y];
+ Result[Z] := V[Z]-Dot * N[Z];
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorTransform(V: TVector4f; M: TMatrix): TVector4f; register;
+
+// transforms a homogeneous vector by multiplying it with a matrix
+
+var TV: TVector4f;
+
+begin
+ TV[X] := V[X] * M[X, X] + V[Y] * M[Y, X] + V[Z] * M[Z, X] + V[W] * M[W, X];
+ TV[Y] := V[X] * M[X, Y] + V[Y] * M[Y, Y] + V[Z] * M[Z, Y] + V[W] * M[W, Y];
+ TV[Z] := V[X] * M[X, Z] + V[Y] * M[Y, Z] + V[Z] * M[Z, Z] + V[W] * M[W, Z];
+ TV[W] := V[X] * M[X, W] + V[Y] * M[Y, W] + V[Z] * M[Z, W] + V[W] * M[W, W];
+ Result := TV
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorTransform(V: TVector3f; M: TMatrix): TVector3f;
+
+// transforms an affine vector by multiplying it with a (homogeneous) matrix
+
+var TV: TVector3f;
+
+begin
+ TV[X] := V[X] * M[X, X] + V[Y] * M[Y, X] + V[Z] * M[Z, X] + M[W, X];
+ TV[Y] := V[X] * M[X, Y] + V[Y] * M[Y, Y] + V[Z] * M[Z, Y] + M[W, Y];
+ TV[Z] := V[X] * M[X, Z] + V[Y] * M[Y, Z] + V[Z] * M[Z, Z] + M[W, Z];
+ Result := TV;
+end;
+
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorAffineTransform(V: TAffineVector; M: TAffineMatrix): TAffineVector; register;
+
+// transforms an affine vector by multiplying it with a matrix
+
+var TV: TAffineVector;
+
+begin
+ TV[X] := V[X] * M[X, X] + V[Y] * M[Y, X] + V[Z] * M[Z, X];
+ TV[Y] := V[X] * M[X, Y] + V[Y] * M[Y, Y] + V[Z] * M[Z, Y];
+ TV[Z] := V[X] * M[X, Z] + V[Y] * M[Y, Z] + V[Z] * M[Z, Z];
+ Result := TV;
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function PointInPolygon(xp, yp : array of Single; x, y: Single): Boolean;
+
+// The code below is from Wm. Randolph Franklin <wrf@ecse.rpi.edu>
+// with some minor modifications for speed. It returns 1 for strictly
+// interior points, 0 for strictly exterior, and 0 or 1 for points on
+// the boundary.
+// This code is not yet tested!
+
+var I, J: Integer;
+
+begin
+ Result := False;
+ if High(XP) <> High(YP) then Exit;
+ J := High(XP);
+ for I := 0 to High(XP) do
+ begin
+ if ((((yp[I] <= y) and (y < yp[J])) or ((yp[J] <= y) and (y < yp[I]))) and
+ (x < (xp[J] - xp[I]) * (y - yp[I]) / (yp[J] - yp[I]) + xp[I]))
+ then Result := not Result;
+ J := I + 1;
+ end;
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function QuaternionConjugate(Q: TQuaternion): TQuaternion; assembler;
+
+// returns the conjugate of a quaternion
+// EAX contains address of Q
+// EDX contains address of result
+
+asm
+ FLD DWORD PTR [EAX]
+ FCHS
+ WAIT
+ FSTP DWORD PTR [EDX]
+ FLD DWORD PTR [EAX + 4]
+ FCHS
+ WAIT
+ FSTP DWORD PTR [EDX + 4]
+ FLD DWORD PTR [EAX + 8]
+ FCHS
+ WAIT
+ FSTP DWORD PTR [EDX + 8]
+ MOV EAX, [EAX + 12]
+ MOV [EDX + 12], EAX
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function QuaternionFromPoints(V1, V2: TAffineVector): TQuaternion; assembler;
+
+// constructs a unit quaternion from two points on unit sphere
+// EAX contains address of V1
+// ECX contains address to result
+// EDX contains address of V2
+
+asm
+ {Result.ImagPart := VectorCrossProduct(V1, V2);
+ Result.RealPart := Sqrt((VectorAffineDotProduct(V1, V2) + 1)/2);}
+
+ PUSH EAX
+ CALL VectorCrossProduct // determine axis to rotate about
+ POP EAX
+ FLD1 // prepare next calculation
+ Call VectorAffineDotProduct // calculate cos(angle between V1 and V2)
+ FADD ST, ST(1) // transform angle to angle/2 by: cos(a/2)=sqrt((1 + cos(a))/2)
+ FXCH ST(1)
+ FADD ST, ST
+ FDIVP ST(1), ST
+ FSQRT
+ FSTP DWORD PTR [ECX + 12] // Result.RealPart := ST(0)
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function QuaternionMultiply(qL, qR: TQuaternion): TQuaternion;
+
+// Returns quaternion product qL * qR. Note: order is important!
+// To combine rotations, use the product QuaternionMuliply(qSecond, qFirst),
+// which gives the effect of rotating by qFirst then qSecond.
+
+var Temp : TQuaternion;
+
+begin
+ Temp.RealPart := qL.RealPart * qR.RealPart - qL.ImagPart[X] * qR.ImagPart[X] -
+ qL.ImagPart[Y] * qR.ImagPart[Y] - qL.ImagPart[Z] * qR.ImagPart[Z];
+ Temp.ImagPart[X] := qL.RealPart * qR.ImagPart[X] + qL.ImagPart[X] * qR.RealPart +
+ qL.ImagPart[Y] * qR.ImagPart[Z] - qL.ImagPart[Z] * qR.ImagPart[Y];
+ Temp.ImagPart[Y] := qL.RealPart * qR.ImagPart[Y] + qL.ImagPart[Y] * qR.RealPart +
+ qL.ImagPart[Z] * qR.ImagPart[X] - qL.ImagPart[X] * qR.ImagPart[Z];
+ Temp.ImagPart[Z] := qL.RealPart * qR.ImagPart[Z] + qL.ImagPart[Z] * qR.RealPart +
+ qL.ImagPart[X] * qR.ImagPart[Y] - qL.ImagPart[Y] * qR.ImagPart[X];
+ Result := Temp;
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function QuaternionToMatrix(Q: TQuaternion): TMatrix;
+
+// Constructs rotation matrix from (possibly non-unit) quaternion.
+// Assumes matrix is used to multiply column vector on the left:
+// vnew = mat vold. Works correctly for right-handed coordinate system
+// and right-handed rotations.
+
+// Essentially, this function is the same as CreateRotationMatrix and you can consider it as
+// being for reference here.
+
+{var Norm, S,
+ XS, YS, ZS,
+ WX, WY, WZ,
+ XX, XY, XZ,
+ YY, YZ, ZZ : Single;
+
+begin
+ Norm := Q.Vector[X] * Q.Vector[X] + Q.Vector[Y] * Q.Vector[Y] + Q.Vector[Z] * Q.Vector[Z] + Q.RealPart * Q.RealPart;
+ if Norm > 0 then S := 2 / Norm
+ else S := 0;
+
+ XS := Q.Vector[X] * S; YS := Q.Vector[Y] * S; ZS := Q.Vector[Z] * S;
+ WX := Q.RealPart * XS; WY := Q.RealPart * YS; WZ := Q.RealPart * ZS;
+ XX := Q.Vector[X] * XS; XY := Q.Vector[X] * YS; XZ := Q.Vector[X] * ZS;
+ YY := Q.Vector[Y] * YS; YZ := Q.Vector[Y] * ZS; ZZ := Q.Vector[Z] * ZS;
+
+ Result[X, X] := 1 - (YY + ZZ); Result[Y, X] := XY + WZ; Result[Z, X] := XZ - WY; Result[W, X] := 0;
+ Result[X, Y] := XY - WZ; Result[Y, Y] := 1 - (XX + ZZ); Result[Z, Y] := YZ + WX; Result[W, Y] := 0;
+ Result[X, Z] := XZ + WY; Result[Y, Z] := YZ - WX; Result[Z, Z] := 1 - (XX + YY); Result[W, Z] := 0;
+ Result[X, W] := 0; Result[Y, W] := 0; Result[Z, W] := 0; Result[W, W] := 1;}
+
+var
+ V: TAffineVector;
+ SinA, CosA,
+ A, B, C: Extended;
+
+begin
+ V := Q.ImagPart;
+ VectorNormalize(V);
+ SinCos(Q.RealPart / 2, SinA, CosA);
+ A := V[X] * SinA;
+ B := V[Y] * SinA;
+ C := V[Z] * SinA;
+
+ Result := IdentityMatrix;
+ Result[X, X] := 1 - 2 * B * B - 2 * C * C;
+ Result[X, Y] := 2 * A * B - 2 * CosA * C;
+ Result[X, Z] := 2 * A * C + 2 * CosA * B;
+
+ Result[Y, X] := 2 * A * B + 2 * CosA * C;
+ Result[Y, Y] := 1 - 2 * A * A - 2 * C * C;
+ Result[Y, Z] := 2 * B * C - 2 * CosA * A;
+
+ Result[Z, X] := 2 * A * C - 2 * CosA * B;
+ Result[Z, Y] := 2 * B * C + 2 * CosA * A;
+ Result[Z, Z] := 1 - 2 * A * A - 2 * B * B;
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+procedure QuaternionToPoints(Q: TQuaternion; var ArcFrom, ArcTo: TAffineVector); register;
+
+// converts a unit quaternion into two points on a unit sphere
+
+var S: Single;
+
+begin
+ S := Sqrt(Q.ImagPart[X] * Q.ImagPart[X] + Q.ImagPart[Y] * Q.ImagPart[Y]);
+ if S = 0 then ArcFrom := MakeAffineVector([0, 1, 0])
+ else ArcFrom := MakeAffineVector([-Q.ImagPart[Y] / S, Q.ImagPart[X] / S, 0]);
+ ArcTo[X] := Q.RealPart * ArcFrom[X] - Q.ImagPart[Z] * ArcFrom[Y];
+ ArcTo[Y] := Q.RealPart * ArcFrom[Y] + Q.ImagPart[Z] * ArcFrom[X];
+ ArcTo[Z] := Q.ImagPart[X] * ArcFrom[Y] - Q.ImagPart[Y] * ArcFrom[X];
+ if Q.RealPart < 0 then ArcFrom := MakeAffineVector([-ArcFrom[X], -ArcFrom[Y], 0]);
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function MatrixAffineDeterminant(M: TAffineMatrix): Single; register;
+
+// determinant of a 3x3 matrix
+
+begin
+ Result := M[X, X] * (M[Y, Y] * M[Z, Z] - M[Z, Y] * M[Y, Z]) -
+ M[X, Y] * (M[Y, X] * M[Z, Z] - M[Z, X] * M[Y, Z]) +
+ M[X, Z] * (M[Y, X] * M[Z, Y] - M[Z, X] * M[Y, Y]);
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function MatrixDetInternal(a1, a2, a3, b1, b2, b3, c1, c2, c3: Single): Single;
+
+// internal version for the determinant of a 3x3 matrix
+
+begin
+ Result := a1 * (b2 * c3 - b3 * c2) -
+ b1 * (a2 * c3 - a3 * c2) +
+ c1 * (a2 * b3 - a3 * b2);
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+procedure MatrixAdjoint(var M: TMatrix); register;
+
+// Adjoint of a 4x4 matrix - used in the computation of the inverse
+// of a 4x4 matrix
+
+var a1, a2, a3, a4,
+ b1, b2, b3, b4,
+ c1, c2, c3, c4,
+ d1, d2, d3, d4: Single;
+
+
+begin
+ a1 := M[X, X]; b1 := M[X, Y];
+ c1 := M[X, Z]; d1 := M[X, W];
+ a2 := M[Y, X]; b2 := M[Y, Y];
+ c2 := M[Y, Z]; d2 := M[Y, W];
+ a3 := M[Z, X]; b3 := M[Z, Y];
+ c3 := M[Z, Z]; d3 := M[Z, W];
+ a4 := M[W, X]; b4 := M[W, Y];
+ c4 := M[W, Z]; d4 := M[W, W];
+
+ // row column labeling reversed since we transpose rows & columns
+ M[X, X] := MatrixDetInternal(b2, b3, b4, c2, c3, c4, d2, d3, d4);
+ M[Y, X] := -MatrixDetInternal(a2, a3, a4, c2, c3, c4, d2, d3, d4);
+ M[Z, X] := MatrixDetInternal(a2, a3, a4, b2, b3, b4, d2, d3, d4);
+ M[W, X] := -MatrixDetInternal(a2, a3, a4, b2, b3, b4, c2, c3, c4);
+
+ M[X, Y] := -MatrixDetInternal(b1, b3, b4, c1, c3, c4, d1, d3, d4);
+ M[Y, Y] := MatrixDetInternal(a1, a3, a4, c1, c3, c4, d1, d3, d4);
+ M[Z, Y] := -MatrixDetInternal(a1, a3, a4, b1, b3, b4, d1, d3, d4);
+ M[W, Y] := MatrixDetInternal(a1, a3, a4, b1, b3, b4, c1, c3, c4);
+
+ M[X, Z] := MatrixDetInternal(b1, b2, b4, c1, c2, c4, d1, d2, d4);
+ M[Y, Z] := -MatrixDetInternal(a1, a2, a4, c1, c2, c4, d1, d2, d4);
+ M[Z, Z] := MatrixDetInternal(a1, a2, a4, b1, b2, b4, d1, d2, d4);
+ M[W, Z] := -MatrixDetInternal(a1, a2, a4, b1, b2, b4, c1, c2, c4);
+
+ M[X, W] := -MatrixDetInternal(b1, b2, b3, c1, c2, c3, d1, d2, d3);
+ M[Y, W] := MatrixDetInternal(a1, a2, a3, c1, c2, c3, d1, d2, d3);
+ M[Z, W] := -MatrixDetInternal(a1, a2, a3, b1, b2, b3, d1, d2, d3);
+ M[W, W] := MatrixDetInternal(a1, a2, a3, b1, b2, b3, c1, c2, c3);
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function MatrixDeterminant(M: TMatrix): Single; register;
+
+// Determinant of a 4x4 matrix
+
+var a1, a2, a3, a4,
+ b1, b2, b3, b4,
+ c1, c2, c3, c4,
+ d1, d2, d3, d4 : Single;
+
+begin
+ a1 := M[X, X]; b1 := M[X, Y]; c1 := M[X, Z]; d1 := M[X, W];
+ a2 := M[Y, X]; b2 := M[Y, Y]; c2 := M[Y, Z]; d2 := M[Y, W];
+ a3 := M[Z, X]; b3 := M[Z, Y]; c3 := M[Z, Z]; d3 := M[Z, W];
+ a4 := M[W, X]; b4 := M[W, Y]; c4 := M[W, Z]; d4 := M[W, W];
+
+ Result := a1 * MatrixDetInternal(b2, b3, b4, c2, c3, c4, d2, d3, d4) -
+ b1 * MatrixDetInternal(a2, a3, a4, c2, c3, c4, d2, d3, d4) +
+ c1 * MatrixDetInternal(a2, a3, a4, b2, b3, b4, d2, d3, d4) -
+ d1 * MatrixDetInternal(a2, a3, a4, b2, b3, b4, c2, c3, c4);
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+procedure MatrixScale(var M: TMatrix; Factor: Single); register;
+
+// multiplies all elements of a 4x4 matrix with a factor
+
+var I, J: Integer;
+
+begin
+ for I := 0 to 3 do
+ for J := 0 to 3 do M[I, J] := M[I, J] * Factor;
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+procedure MatrixInvert(var M: TMatrix); register;
+
+// finds the inverse of a 4x4 matrix
+
+var Det: Single;
+
+begin
+ Det := MatrixDeterminant(M);
+ if Abs(Det) < EPSILON then M := IdentityMatrix
+ else
+ begin
+ MatrixAdjoint(M);
+ MatrixScale(M, 1 / Det);
+ end;
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+procedure MatrixTranspose(var M: TMatrix); register;
+
+// computes transpose of 4x4 matrix
+
+var I, J: Integer;
+ TM: TMatrix;
+
+begin
+ for I := 0 to 3 do
+ for J := 0 to 3 do TM[J, I] := M[I, J];
+ M := TM;
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+procedure MatrixAffineTranspose(var M: TAffineMatrix); register;
+
+// computes transpose of 3x3 matrix
+
+var I, J: Integer;
+ TM: TAffineMatrix;
+
+begin
+ for I := 0 to 2 do
+ for J := 0 to 2 do TM[J, I] := M[I, J];
+ M := TM;
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function MatrixMultiply(M1, M2: TMatrix): TMatrix; register;
+
+// multiplies two 4x4 matrices
+
+var I, J: Integer;
+ TM: TMatrix;
+
+begin
+ for I := 0 to 3 do
+ for J := 0 to 3 do
+ TM[I, J] := M1[I, X] * M2[X, J] +
+ M1[I, Y] * M2[Y, J] +
+ M1[I, Z] * M2[Z, J] +
+ M1[I, W] * M2[W, J];
+ Result := TM;
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function CreateRotationMatrix(Axis: TVector3f; Angle: Single): TMatrix; register;
+
+// Creates a rotation matrix along the given Axis by the given Angle in radians.
+
+var cosine,
+ sine,
+ Len,
+ one_minus_cosine: Extended;
+
+begin
+ SinCos(Angle, Sine, Cosine);
+ one_minus_cosine := 1 - cosine;
+ Len := VectorNormalize(Axis);
+
+ if Len = 0 then Result := IdentityMatrix
+ else
+ begin
+ Result[X, X] := (one_minus_cosine * Sqr(Axis[0])) + Cosine;
+ Result[X, Y] := (one_minus_cosine * Axis[0] * Axis[1]) - (Axis[2] * Sine);
+ Result[X, Z] := (one_minus_cosine * Axis[2] * Axis[0]) + (Axis[1] * Sine);
+ Result[X, W] := 0;
+
+ Result[Y, X] := (one_minus_cosine * Axis[0] * Axis[1]) + (Axis[2] * Sine);
+ Result[Y, Y] := (one_minus_cosine * Sqr(Axis[1])) + Cosine;
+ Result[Y, Z] := (one_minus_cosine * Axis[1] * Axis[2]) - (Axis[0] * Sine);
+ Result[Y, W] := 0;
+
+ Result[Z, X] := (one_minus_cosine * Axis[2] * Axis[0]) - (Axis[1] * Sine);
+ Result[Z, Y] := (one_minus_cosine * Axis[1] * Axis[2]) + (Axis[0] * Sine);
+ Result[Z, Z] := (one_minus_cosine * Sqr(Axis[2])) + Cosine;
+ Result[Z, W] := 0;
+
+ Result[W, X] := 0;
+ Result[W, Y] := 0;
+ Result[W, Z] := 0;
+ Result[W, W] := 1;
+ end;
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function ConvertRotation(Angles: TAffineVector): TVector; register;
+
+{ Turn a triplet of rotations about x, y, and z (in that order) into an
+ equivalent rotation around a single axis (all in radians).
+
+ Rotation of the Angle t about the axis (X, Y, Z) is given by:
+
+ | X^2 + (1-X^2) Cos(t), XY(1-Cos(t)) + Z Sin(t), XZ(1-Cos(t))-Y Sin(t) |
+ M = | XY(1-Cos(t))-Z Sin(t), Y^2 + (1-Y^2) Cos(t), YZ(1-Cos(t)) + X Sin(t) |
+ | XZ(1-Cos(t)) + Y Sin(t), YZ(1-Cos(t))-X Sin(t), Z^2 + (1-Z^2) Cos(t) |
+
+ Rotation about the three axes (Angles a1, a2, a3) can be represented as
+ the product of the individual rotation matrices:
+
+ | 1 0 0 | | Cos(a2) 0 -Sin(a2) | | Cos(a3) Sin(a3) 0 |
+ | 0 Cos(a1) Sin(a1) | * | 0 1 0 | * | -Sin(a3) Cos(a3) 0 |
+ | 0 -Sin(a1) Cos(a1) | | Sin(a2) 0 Cos(a2) | | 0 0 1 |
+ Mx My Mz
+
+ We now want to solve for X, Y, Z, and t given 9 equations in 4 unknowns.
+ Using the diagonal elements of the two matrices, we get:
+
+ X^2 + (1-X^2) Cos(t) = M[0][0]
+ Y^2 + (1-Y^2) Cos(t) = M[1][1]
+ Z^2 + (1-Z^2) Cos(t) = M[2][2]
+
+ Adding the three equations, we get:
+
+ X^2 + Y^2 + Z^2 - (M[0][0] + M[1][1] + M[2][2]) =
+ - (3 - X^2 - Y^2 - Z^2) Cos(t)
+
+ Since (X^2 + Y^2 + Z^2) = 1, we can rewrite as:
+
+ Cos(t) = (1 - (M[0][0] + M[1][1] + M[2][2])) / 2
+
+ Solving for t, we get:
+
+ t = Acos(((M[0][0] + M[1][1] + M[2][2]) - 1) / 2)
+
+ We can substitute t into the equations for X^2, Y^2, and Z^2 above
+ to get the values for X, Y, and Z. To find the proper signs we note
+ that:
+
+ 2 X Sin(t) = M[1][2] - M[2][1]
+ 2 Y Sin(t) = M[2][0] - M[0][2]
+ 2 Z Sin(t) = M[0][1] - M[1][0]
+}
+
+var Axis1, Axis2: TVector3f;
+ M, M1, M2: TMatrix;
+ cost, cost1,
+ sint,
+ s1, s2, s3: Single;
+ I: Integer;
+
+
+begin
+ // see if we are only rotating about a single Axis
+ if Abs(Angles[X]) < EPSILON then
+ begin
+ if Abs(Angles[Y]) < EPSILON then
+ begin
+ Result := MakeVector([0, 0, 1, Angles[Z]]);
+ Exit;
+ end
+ else
+ if Abs(Angles[Z]) < EPSILON then
+ begin
+ Result := MakeVector([0, 1, 0, Angles[Y]]);
+ Exit;
+ end
+ end
+ else
+ if (Abs(Angles[Y]) < EPSILON) and
+ (Abs(Angles[Z]) < EPSILON) then
+ begin
+ Result := MakeVector([1, 0, 0, Angles[X]]);
+ Exit;
+ end;
+
+ // make the rotation matrix
+ Axis1 := MakeAffineVector([1, 0, 0]);
+ M := CreateRotationMatrix(Axis1, Angles[X]);
+
+ Axis2 := MakeAffineVector([0, 1, 0]);
+ M2 := CreateRotationMatrix(Axis2, Angles[Y]);
+ M1 := MatrixMultiply(M, M2);
+
+ Axis2 := MakeAffineVector([0, 0, 1]);
+ M2 := CreateRotationMatrix(Axis2, Angles[Z]);
+ M := MatrixMultiply(M1, M2);
+
+ cost := ((M[X, X] + M[Y, Y] + M[Z, Z])-1) / 2;
+ if cost < -1 then cost := -1
+ else
+ if cost > 1 - EPSILON then
+ begin
+ // Bad Angle - this would cause a crash
+ Result := MakeVector([1, 0, 0, 0]);
+ Exit;
+ end;
+
+ cost1 := 1 - cost;
+ Result := Makevector([Sqrt((M[X, X]-cost) / cost1),
+ Sqrt((M[Y, Y]-cost) / cost1),
+ sqrt((M[Z, Z]-cost) / cost1),
+ arccos(cost)]);
+
+ sint := 2 * Sqrt(1 - cost * cost); // This is actually 2 Sin(t)
+
+ // Determine the proper signs
+ for I := 0 to 7 do
+ begin
+ if (I and 1) > 1 then s1 := -1 else s1 := 1;
+ if (I and 2) > 1 then s2 := -1 else s2 := 1;
+ if (I and 4) > 1 then s3 := -1 else s3 := 1;
+ if (Abs(s1 * Result[X] * sint-M[Y, Z] + M[Z, Y]) < EPSILON2) and
+ (Abs(s2 * Result[Y] * sint-M[Z, X] + M[X, Z]) < EPSILON2) and
+ (Abs(s3 * Result[Z] * sint-M[X, Y] + M[Y, X]) < EPSILON2) then
+ begin
+ // We found the right combination of signs
+ Result[X] := Result[X] * s1;
+ Result[Y] := Result[Y] * s2;
+ Result[Z] := Result[Z] * s3;
+ Exit;
+ end;
+ end;
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function CreateRotationMatrixX(Sine, Cosine: Single): TMatrix; register;
+
+// creates matrix for rotation about x-axis
+
+begin
+ Result := EmptyMatrix;
+ Result[X, X] := 1;
+ Result[Y, Y] := Cosine;
+ Result[Y, Z] := Sine;
+ Result[Z, Y] := -Sine;
+ Result[Z, Z] := Cosine;
+ Result[W, W] := 1;
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function CreateRotationMatrixY(Sine, Cosine: Single): TMatrix; register;
+
+// creates matrix for rotation about y-axis
+
+begin
+ Result := EmptyMatrix;
+ Result[X, X] := Cosine;
+ Result[X, Z] := -Sine;
+ Result[Y, Y] := 1;
+ Result[Z, X] := Sine;
+ Result[Z, Z] := Cosine;
+ Result[W, W] := 1;
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function CreateRotationMatrixZ(Sine, Cosine: Single): TMatrix; register;
+
+// creates matrix for rotation about z-axis
+
+begin
+ Result := EmptyMatrix;
+ Result[X, X] := Cosine;
+ Result[X, Y] := Sine;
+ Result[Y, X] := -Sine;
+ Result[Y, Y] := Cosine;
+ Result[Z, Z] := 1;
+ Result[W, W] := 1;
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function CreateScaleMatrix(V: TAffineVector): TMatrix; register;
+
+// creates scaling matrix
+
+begin
+ Result := IdentityMatrix;
+ Result[X, X] := V[X];
+ Result[Y, Y] := V[Y];
+ Result[Z, Z] := V[Z];
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function CreateTranslationMatrix(V: TVector): TMatrix; register;
+
+// creates translation matrix
+
+begin
+ Result := IdentityMatrix;
+ Result[W, X] := V[X];
+ Result[W, Y] := V[Y];
+ Result[W, Z] := V[Z];
+ Result[W, W] := V[W];
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function Lerp(Start, Stop, t: Single): Single;
+
+// calculates linear interpolation between start and stop at point t
+
+begin
+ Result := Start + (Stop - Start) * t;
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorAffineLerp(V1, V2: TAffineVector; t: Single): TAffineVector;
+
+// calculates linear interpolation between vector1 and vector2 at point t
+
+begin
+ Result[X] := Lerp(V1[X], V2[X], t);
+ Result[Y] := Lerp(V1[Y], V2[Y], t);
+ Result[Z] := Lerp(V1[Z], V2[Z], t);
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorLerp(V1, V2: TVector; t: Single): TVector;
+
+// calculates linear interpolation between vector1 and vector2 at point t
+
+begin
+ Result[X] := Lerp(V1[X], V2[X], t);
+ Result[Y] := Lerp(V1[Y], V2[Y], t);
+ Result[Z] := Lerp(V1[Z], V2[Z], t);
+ Result[W] := Lerp(V1[W], V2[W], t);
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function QuaternionSlerp(QStart, QEnd: TQuaternion; Spin: Integer; t: Single): TQuaternion;
+
+// spherical linear interpolation of unit quaternions with spins
+// QStart, QEnd - start and end unit quaternions
+// t - interpolation parameter (0 to 1)
+// Spin - number of extra spin rotations to involve
+
+var beta, // complementary interp parameter
+ theta, // Angle between A and B
+ sint, cost, // sine, cosine of theta
+ phi: Single; // theta plus spins
+ bflip: Boolean; // use negativ t?
+
+
+begin
+ // cosine theta
+ cost := VectorAngle(QStart.ImagPart, QEnd.ImagPart);
+
+ // if QEnd is on opposite hemisphere from QStart, use -QEnd instead
+ if cost < 0 then
+ begin
+ cost := -cost;
+ bflip := True;
+ end
+ else bflip := False;
+
+ // if QEnd is (within precision limits) the same as QStart,
+ // just linear interpolate between QStart and QEnd.
+ // Can't do spins, since we don't know what direction to spin.
+
+ if (1 - cost) < EPSILON then beta := 1 - t
+ else
+ begin
+ // normal case
+ theta := arccos(cost);
+ phi := theta + Spin * Pi;
+ sint := sin(theta);
+ beta := sin(theta - t * phi) / sint;
+ t := sin(t * phi) / sint;
+ end;
+
+ if bflip then t := -t;
+
+ // interpolate
+ Result.ImagPart[X] := beta * QStart.ImagPart[X] + t * QEnd.ImagPart[X];
+ Result.ImagPart[Y] := beta * QStart.ImagPart[Y] + t * QEnd.ImagPart[Y];
+ Result.ImagPart[Z] := beta * QStart.ImagPart[Z] + t * QEnd.ImagPart[Z];
+ Result.RealPart := beta * QStart.RealPart + t * QEnd.RealPart;
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorAffineCombine(V1, V2: TAffineVector; F1, F2: Single): TAffineVector;
+
+// makes a linear combination of two vectors and return the result
+
+begin
+ Result[X] := (F1 * V1[X]) + (F2 * V2[X]);
+ Result[Y] := (F1 * V1[Y]) + (F2 * V2[Y]);
+ Result[Z] := (F1 * V1[Z]) + (F2 * V2[Z]);
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorCombine(V1, V2: TVector; F1, F2: Single): TVector;
+
+// makes a linear combination of two vectors and return the result
+
+begin
+ Result[X] := (F1 * V1[X]) + (F2 * V2[X]);
+ Result[Y] := (F1 * V1[Y]) + (F2 * V2[Y]);
+ Result[Z] := (F1 * V1[Z]) + (F2 * V2[Z]);
+ Result[W] := (F1 * V1[W]) + (F2 * V2[W]);
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function MatrixDecompose(M: TMatrix; var Tran: TTransformations): Boolean; register;
+
+// Author: Spencer W. Thomas, University of Michigan
+//
+// MatrixDecompose - Decompose a non-degenerated 4x4 transformation matrix into
+// the sequence of transformations that produced it.
+//
+// The coefficient of each transformation is returned in the corresponding
+// element of the vector Tran.
+//
+// Returns true upon success, false if the matrix is singular.
+
+var I, J: Integer;
+ LocMat,
+ pmat,
+ invpmat,
+ tinvpmat: TMatrix;
+ prhs,
+ psol: TVector;
+ Row: array[0..2] of TAffineVector;
+
+begin
+ Result := False;
+ locmat := M;
+ // normalize the matrix
+ if locmat[W, W] = 0 then Exit;
+ for I := 0 to 3 do
+ for J := 0 to 3 do
+ locmat[I, J] := locmat[I, J] / locmat[W, W];
+
+ // pmat is used to solve for perspective, but it also provides
+ // an easy way to test for singularity of the upper 3x3 component.
+
+ pmat := locmat;
+ for I := 0 to 2 do pmat[I, W] := 0;
+ pmat[W, W] := 1;
+
+ if MatrixDeterminant(pmat) = 0 then Exit;
+
+ // First, isolate perspective. This is the messiest.
+ if (locmat[X, W] <> 0) or
+ (locmat[Y, W] <> 0) or
+ (locmat[Z, W] <> 0) then
+ begin
+ // prhs is the right hand side of the equation.
+ prhs[X] := locmat[X, W];
+ prhs[Y] := locmat[Y, W];
+ prhs[Z] := locmat[Z, W];
+ prhs[W] := locmat[W, W];
+
+ // Solve the equation by inverting pmat and multiplying
+ // prhs by the inverse. (This is the easiest way, not
+ // necessarily the best.)
+
+ invpmat := pmat;
+ MatrixInvert(invpmat);
+ MatrixTranspose(invpmat);
+ psol := VectorTransform(prhs, tinvpmat);
+
+ // stuff the answer away
+ Tran[ttPerspectiveX] := psol[X];
+ Tran[ttPerspectiveY] := psol[Y];
+ Tran[ttPerspectiveZ] := psol[Z];
+ Tran[ttPerspectiveW] := psol[W];
+
+ // clear the perspective partition
+ locmat[X, W] := 0;
+ locmat[Y, W] := 0;
+ locmat[Z, W] := 0;
+ locmat[W, W] := 1;
+ end
+ else
+ begin
+ // no perspective
+ Tran[ttPerspectiveX] := 0;
+ Tran[ttPerspectiveY] := 0;
+ Tran[ttPerspectiveZ] := 0;
+ Tran[ttPerspectiveW] := 0;
+ end;
+
+ // next take care of translation (easy)
+ for I := 0 to 2 do
+ begin
+ Tran[TTransType(Ord(ttTranslateX) + I)] := locmat[W, I];
+ locmat[W, I] := 0;
+ end;
+
+ // now get scale and shear
+ for I := 0 to 2 do
+ begin
+ row[I, X] := locmat[I, X];
+ row[I, Y] := locmat[I, Y];
+ row[I, Z] := locmat[I, Z];
+ end;
+
+ // compute X scale factor and normalize first row
+ Tran[ttScaleX] := Sqr(VectorNormalize(row[0])); // ml: calculation optimized
+
+ // compute XY shear factor and make 2nd row orthogonal to 1st
+ Tran[ttShearXY] := VectorAffineDotProduct(row[0], row[1]);
+ row[1] := VectorAffineCombine(row[1], row[0], 1, -Tran[ttShearXY]);
+
+ // now, compute Y scale and normalize 2nd row
+ Tran[ttScaleY] := Sqr(VectorNormalize(row[1])); // ml: calculation optimized
+ Tran[ttShearXY] := Tran[ttShearXY]/Tran[ttScaleY];
+
+ // compute XZ and YZ shears, orthogonalize 3rd row
+ Tran[ttShearXZ] := VectorAffineDotProduct(row[0], row[2]);
+ row[2] := VectorAffineCombine(row[2], row[0], 1, -Tran[ttShearXZ]);
+ Tran[ttShearYZ] := VectorAffineDotProduct(row[1], row[2]);
+ row[2] := VectorAffineCombine(row[2], row[1], 1, -Tran[ttShearYZ]);
+
+ // next, get Z scale and normalize 3rd row
+ Tran[ttScaleZ] := Sqr(VectorNormalize(row[1])); // (ML) calc. optimized
+ Tran[ttShearXZ] := Tran[ttShearXZ] / tran[ttScaleZ];
+ Tran[ttShearYZ] := Tran[ttShearYZ] / Tran[ttScaleZ];
+
+ // At this point, the matrix (in rows[]) is orthonormal.
+ // Check for a coordinate system flip. If the determinant
+ // is -1, then negate the matrix and the scaling factors.
+ if VectorAffineDotProduct(row[0], VectorCrossProduct(row[1], row[2])) < 0 then
+ for I := 0 to 2 do
+ begin
+ Tran[TTransType(Ord(ttScaleX) + I)] := -Tran[TTransType(Ord(ttScaleX) + I)];
+ row[I, X] := -row[I, X];
+ row[I, Y] := -row[I, Y];
+ row[I, Z] := -row[I, Z];
+ end;
+
+ // now, get the rotations out, as described in the gem
+ Tran[ttRotateY] := arcsin(-row[0, Z]);
+ if cos(Tran[ttRotateY]) <> 0 then
+ begin
+ Tran[ttRotateX] := arctan2(row[1, Z], row[2, Z]);
+ Tran[ttRotateZ] := arctan2(row[0, Y], row[0, X]);
+ end
+ else
+ begin
+ tran[ttRotateX] := arctan2(row[1, X], row[1, Y]);
+ tran[ttRotateZ] := 0;
+ end;
+ // All done!
+ Result := True;
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorDblToFlt(V: THomogeneousDblVector): THomogeneousVector; assembler;
+
+// converts a vector containing double sized values into a vector with single sized values
+
+asm
+ FLD QWORD PTR [EAX]
+ FSTP DWORD PTR [EDX]
+ FLD QWORD PTR [EAX + 8]
+ FSTP DWORD PTR [EDX + 4]
+ FLD QWORD PTR [EAX + 16]
+ FSTP DWORD PTR [EDX + 8]
+ FLD QWORD PTR [EAX + 24]
+ FSTP DWORD PTR [EDX + 12]
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorAffineDblToFlt(V: TAffineDblVector): TAffineVector; assembler;
+
+// converts a vector containing double sized values into a vector with single sized values
+
+asm
+ FLD QWORD PTR [EAX]
+ FSTP DWORD PTR [EDX]
+ FLD QWORD PTR [EAX + 8]
+ FSTP DWORD PTR [EDX + 4]
+ FLD QWORD PTR [EAX + 16]
+ FSTP DWORD PTR [EDX + 8]
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorAffineFltToDbl(V: TAffineVector): TAffineDblVector; assembler;
+
+// converts a vector containing single sized values into a vector with double sized values
+
+asm
+ FLD DWORD PTR [EAX]
+ FSTP QWORD PTR [EDX]
+ FLD DWORD PTR [EAX + 8]
+ FSTP QWORD PTR [EDX + 4]
+ FLD DWORD PTR [EAX + 16]
+ FSTP QWORD PTR [EDX + 8]
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function VectorFltToDbl(V: TVector): THomogeneousDblVector; assembler;
+
+// converts a vector containing single sized values into a vector with double sized values
+
+asm
+ FLD DWORD PTR [EAX]
+ FSTP QWORD PTR [EDX]
+ FLD DWORD PTR [EAX + 8]
+ FSTP QWORD PTR [EDX + 4]
+ FLD DWORD PTR [EAX + 16]
+ FSTP QWORD PTR [EDX + 8]
+ FLD DWORD PTR [EAX + 24]
+ FSTP QWORD PTR [EDX + 12]
+end;
+
+//----------------- coordinate system manipulation functions -----------------------------------------------------------
+
+function Turn(Matrix: TMatrix; Angle: Single): TMatrix;
+
+// rotates the given coordinate system (represented by the matrix) around its Y-axis
+
+begin
+ Result := MatrixMultiply(Matrix, CreateRotationMatrix(MakeAffineVector(Matrix[1]), Angle));
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function Turn(Matrix: TMatrix; MasterUp: TAffineVector; Angle: Single): TMatrix;
+
+// rotates the given coordinate system (represented by the matrix) around MasterUp
+
+begin
+ Result := MatrixMultiply(Matrix, CreateRotationMatrix(MasterUp, Angle));
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function Pitch(Matrix: TMatrix; Angle: Single): TMatrix;
+
+// rotates the given coordinate system (represented by the matrix) around its X-axis
+
+begin
+ Result := MatrixMultiply(Matrix, CreateRotationMatrix(MakeAffineVector(Matrix[0]), Angle));
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function Pitch(Matrix: TMatrix; MasterRight: TAffineVector; Angle: Single): TMatrix; overload;
+
+// rotates the given coordinate system (represented by the matrix) around MasterRight
+
+begin
+ Result := MatrixMultiply(Matrix, CreateRotationMatrix(MasterRight, Angle));
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function Roll(Matrix: TMatrix; Angle: Single): TMatrix;
+
+// rotates the given coordinate system (represented by the matrix) around its Z-axis
+
+begin
+ Result := MatrixMultiply(Matrix, CreateRotationMatrix(MakeAffineVector(Matrix[2]), Angle));
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+function Roll(Matrix: TMatrix; MasterDirection: TAffineVector; Angle: Single): TMatrix; overload;
+
+// rotates the given coordinate system (represented by the matrix) around MasterDirection
+
+begin
+ Result := MatrixMultiply(Matrix, CreateRotationMatrix(MasterDirection, Angle));
+end;
+
+//----------------------------------------------------------------------------------------------------------------------
+
+end.
+
+
diff --git a/Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/gl.pas b/Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/gl.pas
new file mode 100644
index 00000000..ce37e43d
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/gl.pas
@@ -0,0 +1,2300 @@
+unit gl;
+{
+ $Id: gl.pas,v 1.5 2007/05/20 20:28:31 savage Exp $
+
+ Adaption of the delphi3d.net OpenGL units to FreePascal
+ Sebastian Guenther (sg@freepascal.org) in 2002
+ These units are free to use
+}
+
+(*++ BUILD Version: 0004 // Increment this if a change has global effects
+
+Copyright (c) 1985-96, Microsoft Corporation
+
+Module Name:
+
+ gl.h
+
+Abstract:
+
+ Procedure declarations, constant definitions and macros for the OpenGL
+ component.
+
+--*)
+
+(*
+** Copyright 1996 Silicon Graphics, Inc.
+** All Rights Reserved.
+**
+** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
+** the contents of this file may not be disclosed to third parties, copied or
+** duplicated in any form, in whole or in part, without the prior written
+** permission of Silicon Graphics, Inc.
+**
+** RESTRICTED RIGHTS LEGEND:
+** Use, duplication or disclosure by the Government is subject to restrictions
+** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
+** and Computer Software clause at DFARS 252.227-7013, and/or in similar or
+** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
+** rights reserved under the Copyright Laws of the United States.
+*)
+
+{******************************************************************************}
+{ }
+{ Converted to Delphi by Tom Nuydens (tom@delphi3d.net) }
+{ For the latest updates, visit Delphi3D: http://www.delphi3d.net }
+{ }
+{ Modified for Delphi/Kylix and FreePascal }
+{ by Dominique Louis ( Dominique@Savagesoftware.com.au) }
+{ For the latest updates, visit JEDI-SDL : http://www.sf.net/projects/jedi-sdl }
+{ }
+{******************************************************************************}
+
+{
+ $Log: gl.pas,v $
+ Revision 1.5 2007/05/20 20:28:31 savage
+ Initial Changes to Handle 64 Bits
+
+ Revision 1.4 2006/11/20 21:20:59 savage
+ Updated to work in MacOS X
+
+ Revision 1.3 2005/05/22 18:52:09 savage
+ Changes as suggested by Michalis Kamburelis. Thanks again.
+
+ Revision 1.2 2004/08/14 22:54:30 savage
+ Updated so that Library name defines are correctly defined for MacOS X.
+
+ Revision 1.1 2004/03/30 21:53:54 savage
+ Moved to it's own folder.
+
+ Revision 1.4 2004/02/20 17:09:55 savage
+ Code tidied up in gl, glu and glut, while extensions in glext.pas are now loaded using SDL_GL_GetProcAddress, thus making it more cross-platform compatible, but now more tied to SDL.
+
+ Revision 1.3 2004/02/14 00:23:39 savage
+ As UNIX is defined in jedi-sdl.inc this will be used to check linux compatability as well. Units have been changed to reflect this change.
+
+ Revision 1.2 2004/02/14 00:09:18 savage
+ Changed uses to now make use of moduleloader.pas rather than dllfuncs.pas
+
+ Revision 1.1 2004/02/05 00:08:19 savage
+ Module 1.0 release
+
+ Revision 1.6 2003/06/02 12:32:12 savage
+ Modified Sources to avoid warnings with Delphi by moving CVS Logging to the top of the header files. Hopefully CVS Logging still works.
+
+}
+
+interface
+
+{$I jedi-sdl.inc}
+
+uses
+{$IFDEF __GPC__}
+ system,
+ gpc,
+{$ENDIF}
+
+{$IFDEF WINDOWS}
+ Windows,
+{$ENDIF}
+ moduleloader;
+
+var
+ LibGL: TModuleHandle;
+
+type
+ GLenum = Cardinal; PGLenum = ^GLenum;
+ GLboolean = Byte; PGLboolean = ^GLboolean;
+ GLbitfield = Cardinal; PGLbitfield = ^GLbitfield;
+ GLbyte = ShortInt; PGLbyte = ^GLbyte;
+ GLshort = SmallInt; PGLshort = ^GLshort;
+ GLint = Integer; PGLint = ^GLint;
+ GLsizei = Integer; PGLsizei = ^GLsizei;
+ GLubyte = Byte; PGLubyte = ^GLubyte;
+ GLushort = Word; PGLushort = ^GLushort;
+ GLuint = Cardinal; PGLuint = ^GLuint;
+ GLfloat = Single; PGLfloat = ^GLfloat;
+ GLclampf = Single; PGLclampf = ^GLclampf;
+ GLdouble = Double; PGLdouble = ^GLdouble;
+ GLclampd = Double; PGLclampd = ^GLclampd;
+{ GLvoid = void; } PGLvoid = Pointer;
+
+{******************************************************************************}
+
+const
+{$IFDEF WINDOWS}
+ GLLibName = 'OpenGL32.dll';
+{$ENDIF}
+
+{$IFDEF UNIX}
+{$IFDEF DARWIN}
+ GLLibName = '/System/Library/Frameworks/OpenGL.framework/Libraries/libGL.dylib';
+{$ELSE}
+ GLLibName = 'libGL.so';
+{$ENDIF}
+{$ENDIF}
+
+ // Version
+ GL_VERSION_1_1 = 1;
+
+ // AccumOp
+ GL_ACCUM = $0100;
+ GL_LOAD = $0101;
+ GL_RETURN = $0102;
+ GL_MULT = $0103;
+ GL_ADD = $0104;
+
+ // AlphaFunction
+ GL_NEVER = $0200;
+ GL_LESS = $0201;
+ GL_EQUAL = $0202;
+ GL_LEQUAL = $0203;
+ GL_GREATER = $0204;
+ GL_NOTEQUAL = $0205;
+ GL_GEQUAL = $0206;
+ GL_ALWAYS = $0207;
+
+ // AttribMask
+ GL_CURRENT_BIT = $00000001;
+ GL_POINT_BIT = $00000002;
+ GL_LINE_BIT = $00000004;
+ GL_POLYGON_BIT = $00000008;
+ GL_POLYGON_STIPPLE_BIT = $00000010;
+ GL_PIXEL_MODE_BIT = $00000020;
+ GL_LIGHTING_BIT = $00000040;
+ GL_FOG_BIT = $00000080;
+ GL_DEPTH_BUFFER_BIT = $00000100;
+ GL_ACCUM_BUFFER_BIT = $00000200;
+ GL_STENCIL_BUFFER_BIT = $00000400;
+ GL_VIEWPORT_BIT = $00000800;
+ GL_TRANSFORM_BIT = $00001000;
+ GL_ENABLE_BIT = $00002000;
+ GL_COLOR_BUFFER_BIT = $00004000;
+ GL_HINT_BIT = $00008000;
+ GL_EVAL_BIT = $00010000;
+ GL_LIST_BIT = $00020000;
+ GL_TEXTURE_BIT = $00040000;
+ GL_SCISSOR_BIT = $00080000;
+ GL_ALL_ATTRIB_BITS = $000FFFFF;
+
+ // BeginMode
+ GL_POINTS = $0000;
+ GL_LINES = $0001;
+ GL_LINE_LOOP = $0002;
+ GL_LINE_STRIP = $0003;
+ GL_TRIANGLES = $0004;
+ GL_TRIANGLE_STRIP = $0005;
+ GL_TRIANGLE_FAN = $0006;
+ GL_QUADS = $0007;
+ GL_QUAD_STRIP = $0008;
+ GL_POLYGON = $0009;
+
+ // BlendingFactorDest
+ GL_ZERO = 0;
+ GL_ONE = 1;
+ GL_SRC_COLOR = $0300;
+ GL_ONE_MINUS_SRC_COLOR = $0301;
+ GL_SRC_ALPHA = $0302;
+ GL_ONE_MINUS_SRC_ALPHA = $0303;
+ GL_DST_ALPHA = $0304;
+ GL_ONE_MINUS_DST_ALPHA = $0305;
+
+ // BlendingFactorSrc
+ // GL_ZERO
+ // GL_ONE
+ GL_DST_COLOR = $0306;
+ GL_ONE_MINUS_DST_COLOR = $0307;
+ GL_SRC_ALPHA_SATURATE = $0308;
+ // GL_SRC_ALPHA
+ // GL_ONE_MINUS_SRC_ALPHA
+ // GL_DST_ALPHA
+ // GL_ONE_MINUS_DST_ALPHA
+
+ // Boolean
+ GL_TRUE = 1;
+ GL_FALSE = 0;
+
+ // ClearBufferMask
+ // GL_COLOR_BUFFER_BIT
+ // GL_ACCUM_BUFFER_BIT
+ // GL_STENCIL_BUFFER_BIT
+ // GL_DEPTH_BUFFER_BIT
+
+ // ClientArrayType
+ // GL_VERTEX_ARRAY
+ // GL_NORMAL_ARRAY
+ // GL_COLOR_ARRAY
+ // GL_INDEX_ARRAY
+ // GL_TEXTURE_COORD_ARRAY
+ // GL_EDGE_FLAG_ARRAY
+
+ // ClipPlaneName
+ GL_CLIP_PLANE0 = $3000;
+ GL_CLIP_PLANE1 = $3001;
+ GL_CLIP_PLANE2 = $3002;
+ GL_CLIP_PLANE3 = $3003;
+ GL_CLIP_PLANE4 = $3004;
+ GL_CLIP_PLANE5 = $3005;
+
+ // ColorMaterialFace
+ // GL_FRONT
+ // GL_BACK
+ // GL_FRONT_AND_BACK
+
+ // ColorMaterialParameter
+ // GL_AMBIENT
+ // GL_DIFFUSE
+ // GL_SPECULAR
+ // GL_EMISSION
+ // GL_AMBIENT_AND_DIFFUSE
+
+ // ColorPointerType
+ // GL_BYTE
+ // GL_UNSIGNED_BYTE
+ // GL_SHORT
+ // GL_UNSIGNED_SHORT
+ // GL_INT
+ // GL_UNSIGNED_INT
+ // GL_FLOAT
+ // GL_DOUBLE
+
+ // CullFaceMode
+ // GL_FRONT
+ // GL_BACK
+ // GL_FRONT_AND_BACK
+
+ // DataType
+ GL_BYTE = $1400;
+ GL_UNSIGNED_BYTE = $1401;
+ GL_SHORT = $1402;
+ GL_UNSIGNED_SHORT = $1403;
+ GL_INT = $1404;
+ GL_UNSIGNED_INT = $1405;
+ GL_FLOAT = $1406;
+ GL_2_BYTES = $1407;
+ GL_3_BYTES = $1408;
+ GL_4_BYTES = $1409;
+ GL_DOUBLE = $140A;
+
+ // DepthFunction
+ // GL_NEVER
+ // GL_LESS
+ // GL_EQUAL
+ // GL_LEQUAL
+ // GL_GREATER
+ // GL_NOTEQUAL
+ // GL_GEQUAL
+ // GL_ALWAYS
+
+ // DrawBufferMode
+ GL_NONE = 0;
+ GL_FRONT_LEFT = $0400;
+ GL_FRONT_RIGHT = $0401;
+ GL_BACK_LEFT = $0402;
+ GL_BACK_RIGHT = $0403;
+ GL_FRONT = $0404;
+ GL_BACK = $0405;
+ GL_LEFT = $0406;
+ GL_RIGHT = $0407;
+ GL_FRONT_AND_BACK = $0408;
+ GL_AUX0 = $0409;
+ GL_AUX1 = $040A;
+ GL_AUX2 = $040B;
+ GL_AUX3 = $040C;
+
+ // Enable
+ // GL_FOG
+ // GL_LIGHTING
+ // GL_TEXTURE_1D
+ // GL_TEXTURE_2D
+ // GL_LINE_STIPPLE
+ // GL_POLYGON_STIPPLE
+ // GL_CULL_FACE
+ // GL_ALPHA_TEST
+ // GL_BLEND
+ // GL_INDEX_LOGIC_OP
+ // GL_COLOR_LOGIC_OP
+ // GL_DITHER
+ // GL_STENCIL_TEST
+ // GL_DEPTH_TEST
+ // GL_CLIP_PLANE0
+ // GL_CLIP_PLANE1
+ // GL_CLIP_PLANE2
+ // GL_CLIP_PLANE3
+ // GL_CLIP_PLANE4
+ // GL_CLIP_PLANE5
+ // GL_LIGHT0
+ // GL_LIGHT1
+ // GL_LIGHT2
+ // GL_LIGHT3
+ // GL_LIGHT4
+ // GL_LIGHT5
+ // GL_LIGHT6
+ // GL_LIGHT7
+ // GL_TEXTURE_GEN_S
+ // GL_TEXTURE_GEN_T
+ // GL_TEXTURE_GEN_R
+ // GL_TEXTURE_GEN_Q
+ // GL_MAP1_VERTEX_3
+ // GL_MAP1_VERTEX_4
+ // GL_MAP1_COLOR_4
+ // GL_MAP1_INDEX
+ // GL_MAP1_NORMAL
+ // GL_MAP1_TEXTURE_COORD_1
+ // GL_MAP1_TEXTURE_COORD_2
+ // GL_MAP1_TEXTURE_COORD_3
+ // GL_MAP1_TEXTURE_COORD_4
+ // GL_MAP2_VERTEX_3
+ // GL_MAP2_VERTEX_4
+ // GL_MAP2_COLOR_4
+ // GL_MAP2_INDEX
+ // GL_MAP2_NORMAL
+ // GL_MAP2_TEXTURE_COORD_1
+ // GL_MAP2_TEXTURE_COORD_2
+ // GL_MAP2_TEXTURE_COORD_3
+ // GL_MAP2_TEXTURE_COORD_4
+ // GL_POINT_SMOOTH
+ // GL_LINE_SMOOTH
+ // GL_POLYGON_SMOOTH
+ // GL_SCISSOR_TEST
+ // GL_COLOR_MATERIAL
+ // GL_NORMALIZE
+ // GL_AUTO_NORMAL
+ // GL_VERTEX_ARRAY
+ // GL_NORMAL_ARRAY
+ // GL_COLOR_ARRAY
+ // GL_INDEX_ARRAY
+ // GL_TEXTURE_COORD_ARRAY
+ // GL_EDGE_FLAG_ARRAY
+ // GL_POLYGON_OFFSET_POINT
+ // GL_POLYGON_OFFSET_LINE
+ // GL_POLYGON_OFFSET_FILL
+
+ // ErrorCode
+ GL_NO_ERROR = 0;
+ GL_INVALID_ENUM = $0500;
+ GL_INVALID_VALUE = $0501;
+ GL_INVALID_OPERATION = $0502;
+ GL_STACK_OVERFLOW = $0503;
+ GL_STACK_UNDERFLOW = $0504;
+ GL_OUT_OF_MEMORY = $0505;
+
+ // FeedBackMode
+ GL_2D = $0600;
+ GL_3D = $0601;
+ GL_3D_COLOR = $0602;
+ GL_3D_COLOR_TEXTURE = $0603;
+ GL_4D_COLOR_TEXTURE = $0604;
+
+ // FeedBackToken
+ GL_PASS_THROUGH_TOKEN = $0700;
+ GL_POINT_TOKEN = $0701;
+ GL_LINE_TOKEN = $0702;
+ GL_POLYGON_TOKEN = $0703;
+ GL_BITMAP_TOKEN = $0704;
+ GL_DRAW_PIXEL_TOKEN = $0705;
+ GL_COPY_PIXEL_TOKEN = $0706;
+ GL_LINE_RESET_TOKEN = $0707;
+
+ // FogMode
+ // GL_LINEAR
+ GL_EXP = $0800;
+ GL_EXP2 = $0801;
+
+ // FogParameter
+ // GL_FOG_COLOR
+ // GL_FOG_DENSITY
+ // GL_FOG_END
+ // GL_FOG_INDEX
+ // GL_FOG_MODE
+ // GL_FOG_START
+
+ // FrontFaceDirection
+ GL_CW = $0900;
+ GL_CCW = $0901;
+
+ // GetMapTarget
+ GL_COEFF = $0A00;
+ GL_ORDER = $0A01;
+ GL_DOMAIN = $0A02;
+
+ // GetPixelMap
+ // GL_PIXEL_MAP_I_TO_I
+ // GL_PIXEL_MAP_S_TO_S
+ // GL_PIXEL_MAP_I_TO_R
+ // GL_PIXEL_MAP_I_TO_G
+ // GL_PIXEL_MAP_I_TO_B
+ // GL_PIXEL_MAP_I_TO_A
+ // GL_PIXEL_MAP_R_TO_R
+ // GL_PIXEL_MAP_G_TO_G
+ // GL_PIXEL_MAP_B_TO_B
+ // GL_PIXEL_MAP_A_TO_A
+
+ // GetPointerTarget
+ // GL_VERTEX_ARRAY_POINTER
+ // GL_NORMAL_ARRAY_POINTER
+ // GL_COLOR_ARRAY_POINTER
+ // GL_INDEX_ARRAY_POINTER
+ // GL_TEXTURE_COORD_ARRAY_POINTER
+ // GL_EDGE_FLAG_ARRAY_POINTER
+
+ // GetTarget
+ GL_CURRENT_COLOR = $0B00;
+ GL_CURRENT_INDEX = $0B01;
+ GL_CURRENT_NORMAL = $0B02;
+ GL_CURRENT_TEXTURE_COORDS = $0B03;
+ GL_CURRENT_RASTER_COLOR = $0B04;
+ GL_CURRENT_RASTER_INDEX = $0B05;
+ GL_CURRENT_RASTER_TEXTURE_COORDS = $0B06;
+ GL_CURRENT_RASTER_POSITION = $0B07;
+ GL_CURRENT_RASTER_POSITION_VALID = $0B08;
+ GL_CURRENT_RASTER_DISTANCE = $0B09;
+ GL_POINT_SMOOTH = $0B10;
+ GL_POINT_SIZE = $0B11;
+ GL_POINT_SIZE_RANGE = $0B12;
+ GL_POINT_SIZE_GRANULARITY = $0B13;
+ GL_LINE_SMOOTH = $0B20;
+ GL_LINE_WIDTH = $0B21;
+ GL_LINE_WIDTH_RANGE = $0B22;
+ GL_LINE_WIDTH_GRANULARITY = $0B23;
+ GL_LINE_STIPPLE = $0B24;
+ GL_LINE_STIPPLE_PATTERN = $0B25;
+ GL_LINE_STIPPLE_REPEAT = $0B26;
+ GL_LIST_MODE = $0B30;
+ GL_MAX_LIST_NESTING = $0B31;
+ GL_LIST_BASE = $0B32;
+ GL_LIST_INDEX = $0B33;
+ GL_POLYGON_MODE = $0B40;
+ GL_POLYGON_SMOOTH = $0B41;
+ GL_POLYGON_STIPPLE = $0B42;
+ GL_EDGE_FLAG = $0B43;
+ GL_CULL_FACE = $0B44;
+ GL_CULL_FACE_MODE = $0B45;
+ GL_FRONT_FACE = $0B46;
+ GL_LIGHTING = $0B50;
+ GL_LIGHT_MODEL_LOCAL_VIEWER = $0B51;
+ GL_LIGHT_MODEL_TWO_SIDE = $0B52;
+ GL_LIGHT_MODEL_AMBIENT = $0B53;
+ GL_SHADE_MODEL = $0B54;
+ GL_COLOR_MATERIAL_FACE = $0B55;
+ GL_COLOR_MATERIAL_PARAMETER = $0B56;
+ GL_COLOR_MATERIAL = $0B57;
+ GL_FOG = $0B60;
+ GL_FOG_INDEX = $0B61;
+ GL_FOG_DENSITY = $0B62;
+ GL_FOG_START = $0B63;
+ GL_FOG_END = $0B64;
+ GL_FOG_MODE = $0B65;
+ GL_FOG_COLOR = $0B66;
+ GL_DEPTH_RANGE = $0B70;
+ GL_DEPTH_TEST = $0B71;
+ GL_DEPTH_WRITEMASK = $0B72;
+ GL_DEPTH_CLEAR_VALUE = $0B73;
+ GL_DEPTH_FUNC = $0B74;
+ GL_ACCUM_CLEAR_VALUE = $0B80;
+ GL_STENCIL_TEST = $0B90;
+ GL_STENCIL_CLEAR_VALUE = $0B91;
+ GL_STENCIL_FUNC = $0B92;
+ GL_STENCIL_VALUE_MASK = $0B93;
+ GL_STENCIL_FAIL = $0B94;
+ GL_STENCIL_PASS_DEPTH_FAIL = $0B95;
+ GL_STENCIL_PASS_DEPTH_PASS = $0B96;
+ GL_STENCIL_REF = $0B97;
+ GL_STENCIL_WRITEMASK = $0B98;
+ GL_MATRIX_MODE = $0BA0;
+ GL_NORMALIZE = $0BA1;
+ GL_VIEWPORT = $0BA2;
+ GL_MODELVIEW_STACK_DEPTH = $0BA3;
+ GL_PROJECTION_STACK_DEPTH = $0BA4;
+ GL_TEXTURE_STACK_DEPTH = $0BA5;
+ GL_MODELVIEW_MATRIX = $0BA6;
+ GL_PROJECTION_MATRIX = $0BA7;
+ GL_TEXTURE_MATRIX = $0BA8;
+ GL_ATTRIB_STACK_DEPTH = $0BB0;
+ GL_CLIENT_ATTRIB_STACK_DEPTH = $0BB1;
+ GL_ALPHA_TEST = $0BC0;
+ GL_ALPHA_TEST_FUNC = $0BC1;
+ GL_ALPHA_TEST_REF = $0BC2;
+ GL_DITHER = $0BD0;
+ GL_BLEND_DST = $0BE0;
+ GL_BLEND_SRC = $0BE1;
+ GL_BLEND = $0BE2;
+ GL_LOGIC_OP_MODE = $0BF0;
+ GL_INDEX_LOGIC_OP = $0BF1;
+ GL_COLOR_LOGIC_OP = $0BF2;
+ GL_AUX_BUFFERS = $0C00;
+ GL_DRAW_BUFFER = $0C01;
+ GL_READ_BUFFER = $0C02;
+ GL_SCISSOR_BOX = $0C10;
+ GL_SCISSOR_TEST = $0C11;
+ GL_INDEX_CLEAR_VALUE = $0C20;
+ GL_INDEX_WRITEMASK = $0C21;
+ GL_COLOR_CLEAR_VALUE = $0C22;
+ GL_COLOR_WRITEMASK = $0C23;
+ GL_INDEX_MODE = $0C30;
+ GL_RGBA_MODE = $0C31;
+ GL_DOUBLEBUFFER = $0C32;
+ GL_STEREO = $0C33;
+ GL_RENDER_MODE = $0C40;
+ GL_PERSPECTIVE_CORRECTION_HINT = $0C50;
+ GL_POINT_SMOOTH_HINT = $0C51;
+ GL_LINE_SMOOTH_HINT = $0C52;
+ GL_POLYGON_SMOOTH_HINT = $0C53;
+ GL_FOG_HINT = $0C54;
+ GL_TEXTURE_GEN_S = $0C60;
+ GL_TEXTURE_GEN_T = $0C61;
+ GL_TEXTURE_GEN_R = $0C62;
+ GL_TEXTURE_GEN_Q = $0C63;
+ GL_PIXEL_MAP_I_TO_I = $0C70;
+ GL_PIXEL_MAP_S_TO_S = $0C71;
+ GL_PIXEL_MAP_I_TO_R = $0C72;
+ GL_PIXEL_MAP_I_TO_G = $0C73;
+ GL_PIXEL_MAP_I_TO_B = $0C74;
+ GL_PIXEL_MAP_I_TO_A = $0C75;
+ GL_PIXEL_MAP_R_TO_R = $0C76;
+ GL_PIXEL_MAP_G_TO_G = $0C77;
+ GL_PIXEL_MAP_B_TO_B = $0C78;
+ GL_PIXEL_MAP_A_TO_A = $0C79;
+ GL_PIXEL_MAP_I_TO_I_SIZE = $0CB0;
+ GL_PIXEL_MAP_S_TO_S_SIZE = $0CB1;
+ GL_PIXEL_MAP_I_TO_R_SIZE = $0CB2;
+ GL_PIXEL_MAP_I_TO_G_SIZE = $0CB3;
+ GL_PIXEL_MAP_I_TO_B_SIZE = $0CB4;
+ GL_PIXEL_MAP_I_TO_A_SIZE = $0CB5;
+ GL_PIXEL_MAP_R_TO_R_SIZE = $0CB6;
+ GL_PIXEL_MAP_G_TO_G_SIZE = $0CB7;
+ GL_PIXEL_MAP_B_TO_B_SIZE = $0CB8;
+ GL_PIXEL_MAP_A_TO_A_SIZE = $0CB9;
+ GL_UNPACK_SWAP_BYTES = $0CF0;
+ GL_UNPACK_LSB_FIRST = $0CF1;
+ GL_UNPACK_ROW_LENGTH = $0CF2;
+ GL_UNPACK_SKIP_ROWS = $0CF3;
+ GL_UNPACK_SKIP_PIXELS = $0CF4;
+ GL_UNPACK_ALIGNMENT = $0CF5;
+ GL_PACK_SWAP_BYTES = $0D00;
+ GL_PACK_LSB_FIRST = $0D01;
+ GL_PACK_ROW_LENGTH = $0D02;
+ GL_PACK_SKIP_ROWS = $0D03;
+ GL_PACK_SKIP_PIXELS = $0D04;
+ GL_PACK_ALIGNMENT = $0D05;
+ GL_MAP_COLOR = $0D10;
+ GL_MAP_STENCIL = $0D11;
+ GL_INDEX_SHIFT = $0D12;
+ GL_INDEX_OFFSET = $0D13;
+ GL_RED_SCALE = $0D14;
+ GL_RED_BIAS = $0D15;
+ GL_ZOOM_X = $0D16;
+ GL_ZOOM_Y = $0D17;
+ GL_GREEN_SCALE = $0D18;
+ GL_GREEN_BIAS = $0D19;
+ GL_BLUE_SCALE = $0D1A;
+ GL_BLUE_BIAS = $0D1B;
+ GL_ALPHA_SCALE = $0D1C;
+ GL_ALPHA_BIAS = $0D1D;
+ GL_DEPTH_SCALE = $0D1E;
+ GL_DEPTH_BIAS = $0D1F;
+ GL_MAX_EVAL_ORDER = $0D30;
+ GL_MAX_LIGHTS = $0D31;
+ GL_MAX_CLIP_PLANES = $0D32;
+ GL_MAX_TEXTURE_SIZE = $0D33;
+ GL_MAX_PIXEL_MAP_TABLE = $0D34;
+ GL_MAX_ATTRIB_STACK_DEPTH = $0D35;
+ GL_MAX_MODELVIEW_STACK_DEPTH = $0D36;
+ GL_MAX_NAME_STACK_DEPTH = $0D37;
+ GL_MAX_PROJECTION_STACK_DEPTH = $0D38;
+ GL_MAX_TEXTURE_STACK_DEPTH = $0D39;
+ GL_MAX_VIEWPORT_DIMS = $0D3A;
+ GL_MAX_CLIENT_ATTRIB_STACK_DEPTH = $0D3B;
+ GL_SUBPIXEL_BITS = $0D50;
+ GL_INDEX_BITS = $0D51;
+ GL_RED_BITS = $0D52;
+ GL_GREEN_BITS = $0D53;
+ GL_BLUE_BITS = $0D54;
+ GL_ALPHA_BITS = $0D55;
+ GL_DEPTH_BITS = $0D56;
+ GL_STENCIL_BITS = $0D57;
+ GL_ACCUM_RED_BITS = $0D58;
+ GL_ACCUM_GREEN_BITS = $0D59;
+ GL_ACCUM_BLUE_BITS = $0D5A;
+ GL_ACCUM_ALPHA_BITS = $0D5B;
+ GL_NAME_STACK_DEPTH = $0D70;
+ GL_AUTO_NORMAL = $0D80;
+ GL_MAP1_COLOR_4 = $0D90;
+ GL_MAP1_INDEX = $0D91;
+ GL_MAP1_NORMAL = $0D92;
+ GL_MAP1_TEXTURE_COORD_1 = $0D93;
+ GL_MAP1_TEXTURE_COORD_2 = $0D94;
+ GL_MAP1_TEXTURE_COORD_3 = $0D95;
+ GL_MAP1_TEXTURE_COORD_4 = $0D96;
+ GL_MAP1_VERTEX_3 = $0D97;
+ GL_MAP1_VERTEX_4 = $0D98;
+ GL_MAP2_COLOR_4 = $0DB0;
+ GL_MAP2_INDEX = $0DB1;
+ GL_MAP2_NORMAL = $0DB2;
+ GL_MAP2_TEXTURE_COORD_1 = $0DB3;
+ GL_MAP2_TEXTURE_COORD_2 = $0DB4;
+ GL_MAP2_TEXTURE_COORD_3 = $0DB5;
+ GL_MAP2_TEXTURE_COORD_4 = $0DB6;
+ GL_MAP2_VERTEX_3 = $0DB7;
+ GL_MAP2_VERTEX_4 = $0DB8;
+ GL_MAP1_GRID_DOMAIN = $0DD0;
+ GL_MAP1_GRID_SEGMENTS = $0DD1;
+ GL_MAP2_GRID_DOMAIN = $0DD2;
+ GL_MAP2_GRID_SEGMENTS = $0DD3;
+ GL_TEXTURE_1D = $0DE0;
+ GL_TEXTURE_2D = $0DE1;
+ GL_FEEDBACK_BUFFER_POINTER = $0DF0;
+ GL_FEEDBACK_BUFFER_SIZE = $0DF1;
+ GL_FEEDBACK_BUFFER_TYPE = $0DF2;
+ GL_SELECTION_BUFFER_POINTER = $0DF3;
+ GL_SELECTION_BUFFER_SIZE = $0DF4;
+ // GL_TEXTURE_BINDING_1D
+ // GL_TEXTURE_BINDING_2D
+ // GL_VERTEX_ARRAY
+ // GL_NORMAL_ARRAY
+ // GL_COLOR_ARRAY
+ // GL_INDEX_ARRAY
+ // GL_TEXTURE_COORD_ARRAY
+ // GL_EDGE_FLAG_ARRAY
+ // GL_VERTEX_ARRAY_SIZE
+ // GL_VERTEX_ARRAY_TYPE
+ // GL_VERTEX_ARRAY_STRIDE
+ // GL_NORMAL_ARRAY_TYPE
+ // GL_NORMAL_ARRAY_STRIDE
+ // GL_COLOR_ARRAY_SIZE
+ // GL_COLOR_ARRAY_TYPE
+ // GL_COLOR_ARRAY_STRIDE
+ // GL_INDEX_ARRAY_TYPE
+ // GL_INDEX_ARRAY_STRIDE
+ // GL_TEXTURE_COORD_ARRAY_SIZE
+ // GL_TEXTURE_COORD_ARRAY_TYPE
+ // GL_TEXTURE_COORD_ARRAY_STRIDE
+ // GL_EDGE_FLAG_ARRAY_STRIDE
+ // GL_POLYGON_OFFSET_FACTOR
+ // GL_POLYGON_OFFSET_UNITS
+
+ // GetTextureParameter
+ // GL_TEXTURE_MAG_FILTER
+ // GL_TEXTURE_MIN_FILTER
+ // GL_TEXTURE_WRAP_S
+ // GL_TEXTURE_WRAP_T
+ GL_TEXTURE_WIDTH = $1000;
+ GL_TEXTURE_HEIGHT = $1001;
+ GL_TEXTURE_INTERNAL_FORMAT = $1003;
+ GL_TEXTURE_BORDER_COLOR = $1004;
+ GL_TEXTURE_BORDER = $1005;
+ // GL_TEXTURE_RED_SIZE
+ // GL_TEXTURE_GREEN_SIZE
+ // GL_TEXTURE_BLUE_SIZE
+ // GL_TEXTURE_ALPHA_SIZE
+ // GL_TEXTURE_LUMINANCE_SIZE
+ // GL_TEXTURE_INTENSITY_SIZE
+ // GL_TEXTURE_PRIORITY
+ // GL_TEXTURE_RESIDENT
+
+ // HintMode
+ GL_DONT_CARE = $1100;
+ GL_FASTEST = $1101;
+ GL_NICEST = $1102;
+
+ // HintTarget
+ // GL_PERSPECTIVE_CORRECTION_HINT
+ // GL_POINT_SMOOTH_HINT
+ // GL_LINE_SMOOTH_HINT
+ // GL_POLYGON_SMOOTH_HINT
+ // GL_FOG_HINT
+
+ // IndexPointerType
+ // GL_SHORT
+ // GL_INT
+ // GL_FLOAT
+ // GL_DOUBLE
+
+ // LightModelParameter
+ // GL_LIGHT_MODEL_AMBIENT
+ // GL_LIGHT_MODEL_LOCAL_VIEWER
+ // GL_LIGHT_MODEL_TWO_SIDE
+
+ // LightName
+ GL_LIGHT0 = $4000;
+ GL_LIGHT1 = $4001;
+ GL_LIGHT2 = $4002;
+ GL_LIGHT3 = $4003;
+ GL_LIGHT4 = $4004;
+ GL_LIGHT5 = $4005;
+ GL_LIGHT6 = $4006;
+ GL_LIGHT7 = $4007;
+
+ // LightParameter
+ GL_AMBIENT = $1200;
+ GL_DIFFUSE = $1201;
+ GL_SPECULAR = $1202;
+ GL_POSITION = $1203;
+ GL_SPOT_DIRECTION = $1204;
+ GL_SPOT_EXPONENT = $1205;
+ GL_SPOT_CUTOFF = $1206;
+ GL_CONSTANT_ATTENUATION = $1207;
+ GL_LINEAR_ATTENUATION = $1208;
+ GL_QUADRATIC_ATTENUATION = $1209;
+
+ // InterleavedArrays
+ // GL_V2F
+ // GL_V3F
+ // GL_C4UB_V2F
+ // GL_C4UB_V3F
+ // GL_C3F_V3F
+ // GL_N3F_V3F
+ // GL_C4F_N3F_V3F
+ // GL_T2F_V3F
+ // GL_T4F_V4F
+ // GL_T2F_C4UB_V3F
+ // GL_T2F_C3F_V3F
+ // GL_T2F_N3F_V3F
+ // GL_T2F_C4F_N3F_V3F
+ // GL_T4F_C4F_N3F_V4F
+
+ // ListMode
+ GL_COMPILE = $1300;
+ GL_COMPILE_AND_EXECUTE = $1301;
+
+ // ListNameType
+ // GL_BYTE
+ // GL_UNSIGNED_BYTE
+ // GL_SHORT
+ // GL_UNSIGNED_SHORT
+ // GL_INT
+ // GL_UNSIGNED_INT
+ // GL_FLOAT
+ // GL_2_BYTES
+ // GL_3_BYTES
+ // GL_4_BYTES
+
+ // LogicOp
+ GL_CLEAR = $1500;
+ GL_AND = $1501;
+ GL_AND_REVERSE = $1502;
+ GL_COPY = $1503;
+ GL_AND_INVERTED = $1504;
+ GL_NOOP = $1505;
+ GL_XOR = $1506;
+ GL_OR = $1507;
+ GL_NOR = $1508;
+ GL_EQUIV = $1509;
+ GL_INVERT = $150A;
+ GL_OR_REVERSE = $150B;
+ GL_COPY_INVERTED = $150C;
+ GL_OR_INVERTED = $150D;
+ GL_NAND = $150E;
+ GL_SET = $150F;
+
+ // MapTarget
+ // GL_MAP1_COLOR_4
+ // GL_MAP1_INDEX
+ // GL_MAP1_NORMAL
+ // GL_MAP1_TEXTURE_COORD_1
+ // GL_MAP1_TEXTURE_COORD_2
+ // GL_MAP1_TEXTURE_COORD_3
+ // GL_MAP1_TEXTURE_COORD_4
+ // GL_MAP1_VERTEX_3
+ // GL_MAP1_VERTEX_4
+ // GL_MAP2_COLOR_4
+ // GL_MAP2_INDEX
+ // GL_MAP2_NORMAL
+ // GL_MAP2_TEXTURE_COORD_1
+ // GL_MAP2_TEXTURE_COORD_2
+ // GL_MAP2_TEXTURE_COORD_3
+ // GL_MAP2_TEXTURE_COORD_4
+ // GL_MAP2_VERTEX_3
+ // GL_MAP2_VERTEX_4
+
+ // MaterialFace
+ // GL_FRONT
+ // GL_BACK
+ // GL_FRONT_AND_BACK
+
+ // MaterialParameter
+ GL_EMISSION = $1600;
+ GL_SHININESS = $1601;
+ GL_AMBIENT_AND_DIFFUSE = $1602;
+ GL_COLOR_INDEXES = $1603;
+ // GL_AMBIENT
+ // GL_DIFFUSE
+ // GL_SPECULAR
+
+ // MatrixMode
+ GL_MODELVIEW = $1700;
+ GL_PROJECTION = $1701;
+ GL_TEXTURE = $1702;
+
+ // MeshMode1
+ // GL_POINT
+ // GL_LINE
+
+ // MeshMode2
+ // GL_POINT
+ // GL_LINE
+ // GL_FILL
+
+ // NormalPointerType
+ // GL_BYTE
+ // GL_SHORT
+ // GL_INT
+ // GL_FLOAT
+ // GL_DOUBLE
+
+ // PixelCopyType
+ GL_COLOR = $1800;
+ GL_DEPTH = $1801;
+ GL_STENCIL = $1802;
+
+ // PixelFormat
+ GL_COLOR_INDEX = $1900;
+ GL_STENCIL_INDEX = $1901;
+ GL_DEPTH_COMPONENT = $1902;
+ GL_RED = $1903;
+ GL_GREEN = $1904;
+ GL_BLUE = $1905;
+ GL_ALPHA = $1906;
+ GL_RGB = $1907;
+ GL_RGBA = $1908;
+ GL_LUMINANCE = $1909;
+ GL_LUMINANCE_ALPHA = $190A;
+
+ // PixelMap
+ // GL_PIXEL_MAP_I_TO_I
+ // GL_PIXEL_MAP_S_TO_S
+ // GL_PIXEL_MAP_I_TO_R
+ // GL_PIXEL_MAP_I_TO_G
+ // GL_PIXEL_MAP_I_TO_B
+ // GL_PIXEL_MAP_I_TO_A
+ // GL_PIXEL_MAP_R_TO_R
+ // GL_PIXEL_MAP_G_TO_G
+ // GL_PIXEL_MAP_B_TO_B
+ // GL_PIXEL_MAP_A_TO_A
+
+ // PixelStore
+ // GL_UNPACK_SWAP_BYTES
+ // GL_UNPACK_LSB_FIRST
+ // GL_UNPACK_ROW_LENGTH
+ // GL_UNPACK_SKIP_ROWS
+ // GL_UNPACK_SKIP_PIXELS
+ // GL_UNPACK_ALIGNMENT
+ // GL_PACK_SWAP_BYTES
+ // GL_PACK_LSB_FIRST
+ // GL_PACK_ROW_LENGTH
+ // GL_PACK_SKIP_ROWS
+ // GL_PACK_SKIP_PIXELS
+ // GL_PACK_ALIGNMENT
+
+ // PixelTransfer
+ // GL_MAP_COLOR
+ // GL_MAP_STENCIL
+ // GL_INDEX_SHIFT
+ // GL_INDEX_OFFSET
+ // GL_RED_SCALE
+ // GL_RED_BIAS
+ // GL_GREEN_SCALE
+ // GL_GREEN_BIAS
+ // GL_BLUE_SCALE
+ // GL_BLUE_BIAS
+ // GL_ALPHA_SCALE
+ // GL_ALPHA_BIAS
+ // GL_DEPTH_SCALE
+ // GL_DEPTH_BIAS
+
+ // PixelType
+ GL_BITMAP = $1A00;
+ // GL_BYTE
+ // GL_UNSIGNED_BYTE
+ // GL_SHORT
+ // GL_UNSIGNED_SHORT
+ // GL_INT
+ // GL_UNSIGNED_INT
+ // GL_FLOAT
+
+ // PolygonMode
+ GL_POINT = $1B00;
+ GL_LINE = $1B01;
+ GL_FILL = $1B02;
+
+ // ReadBufferMode
+ // GL_FRONT_LEFT
+ // GL_FRONT_RIGHT
+ // GL_BACK_LEFT
+ // GL_BACK_RIGHT
+ // GL_FRONT
+ // GL_BACK
+ // GL_LEFT
+ // GL_RIGHT
+ // GL_AUX0
+ // GL_AUX1
+ // GL_AUX2
+ // GL_AUX3
+
+ // RenderingMode
+ GL_RENDER = $1C00;
+ GL_FEEDBACK = $1C01;
+ GL_SELECT = $1C02;
+
+ // ShadingModel
+ GL_FLAT = $1D00;
+ GL_SMOOTH = $1D01;
+
+ // StencilFunction
+ // GL_NEVER
+ // GL_LESS
+ // GL_EQUAL
+ // GL_LEQUAL
+ // GL_GREATER
+ // GL_NOTEQUAL
+ // GL_GEQUAL
+ // GL_ALWAYS
+
+ // StencilOp
+ // GL_ZERO
+ GL_KEEP = $1E00;
+ GL_REPLACE = $1E01;
+ GL_INCR = $1E02;
+ GL_DECR = $1E03;
+ // GL_INVERT
+
+ // StringName
+ GL_VENDOR = $1F00;
+ GL_RENDERER = $1F01;
+ GL_VERSION = $1F02;
+ GL_EXTENSIONS = $1F03;
+
+ // TextureCoordName
+ GL_S = $2000;
+ GL_T = $2001;
+ GL_R = $2002;
+ GL_Q = $2003;
+
+ // TexCoordPointerType
+ // GL_SHORT
+ // GL_INT
+ // GL_FLOAT
+ // GL_DOUBLE
+
+ // TextureEnvMode
+ GL_MODULATE = $2100;
+ GL_DECAL = $2101;
+ // GL_BLEND
+ // GL_REPLACE
+
+ // TextureEnvParameter
+ GL_TEXTURE_ENV_MODE = $2200;
+ GL_TEXTURE_ENV_COLOR = $2201;
+
+ // TextureEnvTarget
+ GL_TEXTURE_ENV = $2300;
+
+ // TextureGenMode
+ GL_EYE_LINEAR = $2400;
+ GL_OBJECT_LINEAR = $2401;
+ GL_SPHERE_MAP = $2402;
+
+ // TextureGenParameter
+ GL_TEXTURE_GEN_MODE = $2500;
+ GL_OBJECT_PLANE = $2501;
+ GL_EYE_PLANE = $2502;
+
+ // TextureMagFilter
+ GL_NEAREST = $2600;
+ GL_LINEAR = $2601;
+
+ // TextureMinFilter
+ // GL_NEAREST
+ // GL_LINEAR
+ GL_NEAREST_MIPMAP_NEAREST = $2700;
+ GL_LINEAR_MIPMAP_NEAREST = $2701;
+ GL_NEAREST_MIPMAP_LINEAR = $2702;
+ GL_LINEAR_MIPMAP_LINEAR = $2703;
+
+ // TextureParameterName
+ GL_TEXTURE_MAG_FILTER = $2800;
+ GL_TEXTURE_MIN_FILTER = $2801;
+ GL_TEXTURE_WRAP_S = $2802;
+ GL_TEXTURE_WRAP_T = $2803;
+ // GL_TEXTURE_BORDER_COLOR
+ // GL_TEXTURE_PRIORITY
+
+ // TextureTarget
+ // GL_TEXTURE_1D
+ // GL_TEXTURE_2D
+ // GL_PROXY_TEXTURE_1D
+ // GL_PROXY_TEXTURE_2D
+
+ // TextureWrapMode
+ GL_CLAMP = $2900;
+ GL_REPEAT = $2901;
+
+ // VertexPointerType
+ // GL_SHORT
+ // GL_INT
+ // GL_FLOAT
+ // GL_DOUBLE
+
+ // ClientAttribMask
+ GL_CLIENT_PIXEL_STORE_BIT = $00000001;
+ GL_CLIENT_VERTEX_ARRAY_BIT = $00000002;
+ GL_CLIENT_ALL_ATTRIB_BITS = $FFFFFFFF;
+
+ // polygon_offset
+ GL_POLYGON_OFFSET_FACTOR = $8038;
+ GL_POLYGON_OFFSET_UNITS = $2A00;
+ GL_POLYGON_OFFSET_POINT = $2A01;
+ GL_POLYGON_OFFSET_LINE = $2A02;
+ GL_POLYGON_OFFSET_FILL = $8037;
+
+ // texture
+ GL_ALPHA4 = $803B;
+ GL_ALPHA8 = $803C;
+ GL_ALPHA12 = $803D;
+ GL_ALPHA16 = $803E;
+ GL_LUMINANCE4 = $803F;
+ GL_LUMINANCE8 = $8040;
+ GL_LUMINANCE12 = $8041;
+ GL_LUMINANCE16 = $8042;
+ GL_LUMINANCE4_ALPHA4 = $8043;
+ GL_LUMINANCE6_ALPHA2 = $8044;
+ GL_LUMINANCE8_ALPHA8 = $8045;
+ GL_LUMINANCE12_ALPHA4 = $8046;
+ GL_LUMINANCE12_ALPHA12 = $8047;
+ GL_LUMINANCE16_ALPHA16 = $8048;
+ GL_INTENSITY = $8049;
+ GL_INTENSITY4 = $804A;
+ GL_INTENSITY8 = $804B;
+ GL_INTENSITY12 = $804C;
+ GL_INTENSITY16 = $804D;
+ GL_R3_G3_B2 = $2A10;
+ GL_RGB4 = $804F;
+ GL_RGB5 = $8050;
+ GL_RGB8 = $8051;
+ GL_RGB10 = $8052;
+ GL_RGB12 = $8053;
+ GL_RGB16 = $8054;
+ GL_RGBA2 = $8055;
+ GL_RGBA4 = $8056;
+ GL_RGB5_A1 = $8057;
+ GL_RGBA8 = $8058;
+ GL_RGB10_A2 = $8059;
+ GL_RGBA12 = $805A;
+ GL_RGBA16 = $805B;
+ GL_TEXTURE_RED_SIZE = $805C;
+ GL_TEXTURE_GREEN_SIZE = $805D;
+ GL_TEXTURE_BLUE_SIZE = $805E;
+ GL_TEXTURE_ALPHA_SIZE = $805F;
+ GL_TEXTURE_LUMINANCE_SIZE = $8060;
+ GL_TEXTURE_INTENSITY_SIZE = $8061;
+ GL_PROXY_TEXTURE_1D = $8063;
+ GL_PROXY_TEXTURE_2D = $8064;
+
+ // texture_object
+ GL_TEXTURE_PRIORITY = $8066;
+ GL_TEXTURE_RESIDENT = $8067;
+ GL_TEXTURE_BINDING_1D = $8068;
+ GL_TEXTURE_BINDING_2D = $8069;
+
+ // vertex_array
+ GL_VERTEX_ARRAY = $8074;
+ GL_NORMAL_ARRAY = $8075;
+ GL_COLOR_ARRAY = $8076;
+ GL_INDEX_ARRAY = $8077;
+ GL_TEXTURE_COORD_ARRAY = $8078;
+ GL_EDGE_FLAG_ARRAY = $8079;
+ GL_VERTEX_ARRAY_SIZE = $807A;
+ GL_VERTEX_ARRAY_TYPE = $807B;
+ GL_VERTEX_ARRAY_STRIDE = $807C;
+ GL_NORMAL_ARRAY_TYPE = $807E;
+ GL_NORMAL_ARRAY_STRIDE = $807F;
+ GL_COLOR_ARRAY_SIZE = $8081;
+ GL_COLOR_ARRAY_TYPE = $8082;
+ GL_COLOR_ARRAY_STRIDE = $8083;
+ GL_INDEX_ARRAY_TYPE = $8085;
+ GL_INDEX_ARRAY_STRIDE = $8086;
+ GL_TEXTURE_COORD_ARRAY_SIZE = $8088;
+ GL_TEXTURE_COORD_ARRAY_TYPE = $8089;
+ GL_TEXTURE_COORD_ARRAY_STRIDE = $808A;
+ GL_EDGE_FLAG_ARRAY_STRIDE = $808C;
+ GL_VERTEX_ARRAY_POINTER = $808E;
+ GL_NORMAL_ARRAY_POINTER = $808F;
+ GL_COLOR_ARRAY_POINTER = $8090;
+ GL_INDEX_ARRAY_POINTER = $8091;
+ GL_TEXTURE_COORD_ARRAY_POINTER = $8092;
+ GL_EDGE_FLAG_ARRAY_POINTER = $8093;
+ GL_V2F = $2A20;
+ GL_V3F = $2A21;
+ GL_C4UB_V2F = $2A22;
+ GL_C4UB_V3F = $2A23;
+ GL_C3F_V3F = $2A24;
+ GL_N3F_V3F = $2A25;
+ GL_C4F_N3F_V3F = $2A26;
+ GL_T2F_V3F = $2A27;
+ GL_T4F_V4F = $2A28;
+ GL_T2F_C4UB_V3F = $2A29;
+ GL_T2F_C3F_V3F = $2A2A;
+ GL_T2F_N3F_V3F = $2A2B;
+ GL_T2F_C4F_N3F_V3F = $2A2C;
+ GL_T4F_C4F_N3F_V4F = $2A2D;
+
+ // Extensions
+ GL_EXT_vertex_array = 1;
+ GL_WIN_swap_hint = 1;
+ GL_EXT_bgra = 1;
+ GL_EXT_paletted_texture = 1;
+
+ // EXT_vertex_array
+ GL_VERTEX_ARRAY_EXT = $8074;
+ GL_NORMAL_ARRAY_EXT = $8075;
+ GL_COLOR_ARRAY_EXT = $8076;
+ GL_INDEX_ARRAY_EXT = $8077;
+ GL_TEXTURE_COORD_ARRAY_EXT = $8078;
+ GL_EDGE_FLAG_ARRAY_EXT = $8079;
+ GL_VERTEX_ARRAY_SIZE_EXT = $807A;
+ GL_VERTEX_ARRAY_TYPE_EXT = $807B;
+ GL_VERTEX_ARRAY_STRIDE_EXT = $807C;
+ GL_VERTEX_ARRAY_COUNT_EXT = $807D;
+ GL_NORMAL_ARRAY_TYPE_EXT = $807E;
+ GL_NORMAL_ARRAY_STRIDE_EXT = $807F;
+ GL_NORMAL_ARRAY_COUNT_EXT = $8080;
+ GL_COLOR_ARRAY_SIZE_EXT = $8081;
+ GL_COLOR_ARRAY_TYPE_EXT = $8082;
+ GL_COLOR_ARRAY_STRIDE_EXT = $8083;
+ GL_COLOR_ARRAY_COUNT_EXT = $8084;
+ GL_INDEX_ARRAY_TYPE_EXT = $8085;
+ GL_INDEX_ARRAY_STRIDE_EXT = $8086;
+ GL_INDEX_ARRAY_COUNT_EXT = $8087;
+ GL_TEXTURE_COORD_ARRAY_SIZE_EXT = $8088;
+ GL_TEXTURE_COORD_ARRAY_TYPE_EXT = $8089;
+ GL_TEXTURE_COORD_ARRAY_STRIDE_EXT = $808A;
+ GL_TEXTURE_COORD_ARRAY_COUNT_EXT = $808B;
+ GL_EDGE_FLAG_ARRAY_STRIDE_EXT = $808C;
+ GL_EDGE_FLAG_ARRAY_COUNT_EXT = $808D;
+ GL_VERTEX_ARRAY_POINTER_EXT = $808E;
+ GL_NORMAL_ARRAY_POINTER_EXT = $808F;
+ GL_COLOR_ARRAY_POINTER_EXT = $8090;
+ GL_INDEX_ARRAY_POINTER_EXT = $8091;
+ GL_TEXTURE_COORD_ARRAY_POINTER_EXT = $8092;
+ GL_EDGE_FLAG_ARRAY_POINTER_EXT = $8093;
+ GL_DOUBLE_EXT = GL_DOUBLE;
+
+ // EXT_bgra
+ GL_BGR_EXT = $80E0;
+ GL_BGRA_EXT = $80E1;
+
+ // EXT_paletted_texture
+
+ // These must match the GL_COLOR_TABLE_*_SGI enumerants
+ GL_COLOR_TABLE_FORMAT_EXT = $80D8;
+ GL_COLOR_TABLE_WIDTH_EXT = $80D9;
+ GL_COLOR_TABLE_RED_SIZE_EXT = $80DA;
+ GL_COLOR_TABLE_GREEN_SIZE_EXT = $80DB;
+ GL_COLOR_TABLE_BLUE_SIZE_EXT = $80DC;
+ GL_COLOR_TABLE_ALPHA_SIZE_EXT = $80DD;
+ GL_COLOR_TABLE_LUMINANCE_SIZE_EXT = $80DE;
+ GL_COLOR_TABLE_INTENSITY_SIZE_EXT = $80DF;
+
+ GL_COLOR_INDEX1_EXT = $80E2;
+ GL_COLOR_INDEX2_EXT = $80E3;
+ GL_COLOR_INDEX4_EXT = $80E4;
+ GL_COLOR_INDEX8_EXT = $80E5;
+ GL_COLOR_INDEX12_EXT = $80E6;
+ GL_COLOR_INDEX16_EXT = $80E7;
+
+ // For compatibility with OpenGL v1.0
+ GL_LOGIC_OP = GL_INDEX_LOGIC_OP;
+ GL_TEXTURE_COMPONENTS = GL_TEXTURE_INTERNAL_FORMAT;
+
+{******************************************************************************}
+
+var
+ glAccum: procedure(op: GLenum; value: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glAlphaFunc: procedure(func: GLenum; ref: GLclampf); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glAreTexturesResident: function (n: GLsizei; const textures: PGLuint; residences: PGLboolean): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glArrayElement: procedure(i: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBegin: procedure(mode: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBindTexture: procedure(target: GLenum; texture: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBitmap: procedure (width, height: GLsizei; xorig, yorig: GLfloat; xmove, ymove: GLfloat; const bitmap: PGLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBlendFunc: procedure(sfactor, dfactor: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCallList: procedure(list: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCallLists: procedure(n: GLsizei; atype: GLenum; const lists: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glClear: procedure(mask: GLbitfield); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glClearAccum: procedure(red, green, blue, alpha: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glClearColor: procedure(red, green, blue, alpha: GLclampf); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glClearDepth: procedure(depth: GLclampd); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glClearIndex: procedure(c: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glClearStencil: procedure(s: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glClipPlane: procedure(plane: GLenum; const equation: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor3b: procedure(red, green, blue: GLbyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor3bv: procedure(const v: PGLbyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor3d: procedure(red, green, blue: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor3dv: procedure(const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor3f: procedure(red, green, blue: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor3fv: procedure(const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor3i: procedure(red, green, blue: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor3iv: procedure(const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor3s: procedure(red, green, blue: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor3sv: procedure(const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor3ub: procedure(red, green, blue: GLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor3ubv: procedure(const v: PGLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor3ui: procedure(red, green, blue: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor3uiv: procedure(const v: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor3us: procedure(red, green, blue: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor3usv: procedure(const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4b: procedure(red, green, blue, alpha: GLbyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4bv: procedure(const v: PGLbyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4d: procedure(red, green, blue, alpha: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4dv: procedure(const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4f: procedure(red, green, blue, alpha: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4fv: procedure(const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4i: procedure(red, green, blue, alpha: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4iv: procedure(const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4s: procedure(red, green, blue, alpha: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4sv: procedure(const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4ub: procedure(red, green, blue, alpha: GLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4ubv: procedure(const v: PGLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4ui: procedure(red, green, blue, alpha: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4uiv: procedure(const v: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4us: procedure(red, green, blue, alpha: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4usv: procedure(const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColorMask: procedure(red, green, blue, alpha: GLboolean); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColorMaterial: procedure(face, mode: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColorPointer: procedure(size: GLint; atype: GLenum; stride: GLsizei; const pointer: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCopyPixels: procedure(x, y: GLint; width, height: GLsizei; atype: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCopyTexImage1D: procedure (target: GLenum; level: GLint; internalFormat: GLenum; x, y: GLint; width: GLsizei; border: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCopyTexImage2D: procedure(target: GLenum; level: GLint; internalFormat: GLenum; x, y: GLint; width, height: GLsizei; border: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCopyTexSubImage1D: procedure(target: GLenum; level, xoffset, x, y: GLint; width: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCopyTexSubImage2D: procedure(target: GLenum; level, xoffset, yoffset, x, y: GLint; width, height: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCullFace: procedure(mode: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDeleteLists: procedure(list: GLuint; range: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDeleteTextures: procedure(n: GLsizei; const textures: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDepthFunc: procedure(func: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDepthMask: procedure(flag: GLboolean); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDepthRange: procedure(zNear, zFar: GLclampd); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDisable: procedure(cap: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDisableClientState: procedure(aarray: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDrawArrays: procedure(mode: GLenum; first: GLint; count: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDrawBuffer: procedure(mode: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDrawElements: procedure(mode: GLenum; count: GLsizei; atype: GLenum; const indices: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDrawPixels: procedure(width, height: GLsizei; format, atype: GLenum; const pixels: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEdgeFlag: procedure(flag: GLboolean); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEdgeFlagPointer: procedure(stride: GLsizei; const pointer: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEdgeFlagv: procedure(const flag: PGLboolean); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEnable: procedure(cap: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEnableClientState: procedure(aarray: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEnd: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEndList: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEvalCoord1d: procedure(u: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEvalCoord1dv: procedure(const u: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEvalCoord1f: procedure(u: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEvalCoord1fv: procedure(const u: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEvalCoord2d: procedure(u, v: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEvalCoord2dv: procedure(const u: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEvalCoord2f: procedure(u, v: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEvalCoord2fv: procedure(const u: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEvalMesh1: procedure(mode: GLenum; i1, i2: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEvalMesh2: procedure(mode: GLenum; i1, i2, j1, j2: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEvalPoint1: procedure(i: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEvalPoint2: procedure(i, j: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFeedbackBuffer: procedure(size: GLsizei; atype: GLenum; buffer: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFinish: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFlush: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFogf: procedure(pname: GLenum; param: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFogfv: procedure(pname: GLenum; const params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFogi: procedure(pname: GLenum; param: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFogiv: procedure(pname: GLenum; const params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFrontFace: procedure(mode: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFrustum: procedure(left, right, bottom, top, zNear, zFar: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGenLists: function(range: GLsizei): GLuint; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGenTextures: procedure(n: GLsizei; textures: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetBooleanv: procedure(pname: GLenum; params: PGLboolean); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetClipPlane: procedure(plane: GLenum; equation: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetDoublev: procedure(pname: GLenum; params: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetError: function: GLenum; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetFloatv: procedure(pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetIntegerv: procedure(pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetLightfv: procedure(light, pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetLightiv: procedure(light, pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetMapdv: procedure(target, query: GLenum; v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetMapfv: procedure(target, query: GLenum; v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetMapiv: procedure(target, query: GLenum; v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetMaterialfv: procedure(face, pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetMaterialiv: procedure(face, pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetPixelMapfv: procedure(map: GLenum; values: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetPixelMapuiv: procedure(map: GLenum; values: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetPixelMapusv: procedure(map: GLenum; values: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetPointerv: procedure(pname: GLenum; params: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetPolygonStipple: procedure(mask: PGLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetString: function(name: GLenum): PChar; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetTexEnvfv: procedure(target, pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetTexEnviv: procedure(target, pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetTexGendv: procedure(coord, pname: GLenum; params: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetTexGenfv: procedure(coord, pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetTexGeniv: procedure(coord, pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetTexImage: procedure(target: GLenum; level: GLint; format: GLenum; atype: GLenum; pixels: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetTexLevelParameterfv: procedure(target: GLenum; level: GLint; pname: GLenum; params: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetTexLevelParameteriv: procedure(target: GLenum; level: GLint; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetTexParameterfv: procedure(target, pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetTexParameteriv: procedure(target, pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glHint: procedure(target, mode: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIndexMask: procedure(mask: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIndexPointer: procedure(atype: GLenum; stride: GLsizei; const pointer: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIndexd: procedure(c: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIndexdv: procedure(const c: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIndexf: procedure(c: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIndexfv: procedure(const c: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIndexi: procedure(c: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIndexiv: procedure(const c: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIndexs: procedure(c: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIndexsv: procedure(const c: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIndexub: procedure(c: GLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIndexubv: procedure(const c: PGLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glInitNames: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glInterleavedArrays: procedure(format: GLenum; stride: GLsizei; const pointer: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIsEnabled: function(cap: GLenum): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIsList: function(list: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIsTexture: function(texture: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLightModelf: procedure(pname: GLenum; param: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLightModelfv: procedure(pname: GLenum; const params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLightModeli: procedure(pname: GLenum; param: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLightModeliv: procedure(pname: GLenum; const params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLightf: procedure(light, pname: GLenum; param: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLightfv: procedure(light, pname: GLenum; const params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLighti: procedure(light, pname: GLenum; param: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLightiv: procedure(light, pname: GLenum; const params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLineStipple: procedure(factor: GLint; pattern: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLineWidth: procedure(width: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glListBase: procedure(base: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLoadIdentity: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLoadMatrixd: procedure(const m: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLoadMatrixf: procedure(const m: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLoadName: procedure(name: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLogicOp: procedure(opcode: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMap1d: procedure(target: GLenum; u1, u2: GLdouble; stride, order: GLint; const points: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMap1f: procedure(target: GLenum; u1, u2: GLfloat; stride, order: GLint; const points: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMap2d: procedure(target: GLenum; u1, u2: GLdouble; ustride, uorder: GLint; v1, v2: GLdouble; vstride, vorder: GLint; const points: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMap2f: procedure(target: GLenum; u1, u2: GLfloat; ustride, uorder: GLint; v1, v2: GLfloat; vstride, vorder: GLint; const points: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMapGrid1d: procedure(un: GLint; u1, u2: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMapGrid1f: procedure(un: GLint; u1, u2: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMapGrid2d: procedure(un: GLint; u1, u2: GLdouble; vn: GLint; v1, v2: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMapGrid2f: procedure(un: GLint; u1, u2: GLfloat; vn: GLint; v1, v2: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMaterialf: procedure(face, pname: GLenum; param: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMaterialfv: procedure(face, pname: GLenum; const params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMateriali: procedure(face, pname: GLenum; param: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMaterialiv: procedure(face, pname: GLenum; const params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMatrixMode: procedure(mode: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultMatrixd: procedure(const m: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultMatrixf: procedure(const m: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNewList: procedure(list: GLuint; mode: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormal3b: procedure(nx, ny, nz: GLbyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormal3bv: procedure(const v: PGLbyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormal3d: procedure(nx, ny, nz: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormal3dv: procedure(const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormal3f: procedure(nx, ny, nz: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormal3fv: procedure(const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormal3i: procedure(nx, ny, nz: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormal3iv: procedure(const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormal3s: procedure(nx, ny, nz: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormal3sv: procedure(const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormalPointer: procedure(atype: GLenum; stride: GLsizei; const pointer: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glOrtho: procedure(left, right, bottom, top, zNear, zFar: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPassThrough: procedure(token: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPixelMapfv: procedure(map: GLenum; mapsize: GLsizei; const values: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPixelMapuiv: procedure(map: GLenum; mapsize: GLsizei; const values: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPixelMapusv: procedure(map: GLenum; mapsize: GLsizei; const values: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPixelStoref: procedure(pname: GLenum; param: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPixelStorei: procedure(pname: GLenum; param: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPixelTransferf: procedure(pname: GLenum; param: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPixelTransferi: procedure(pname: GLenum; param: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPixelZoom: procedure(xfactor, yfactor: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPointSize: procedure(size: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPolygonMode: procedure(face, mode: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPolygonOffset: procedure(factor, units: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPolygonStipple: procedure(const mask: PGLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPopAttrib: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPopClientAttrib: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPopMatrix: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPopName: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPrioritizeTextures: procedure(n: GLsizei; const textures: PGLuint; const priorities: PGLclampf); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPushAttrib: procedure(mask: GLbitfield); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPushClientAttrib: procedure(mask: GLbitfield); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPushMatrix: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPushName: procedure(name: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos2d: procedure(x, y: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos2dv: procedure(const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos2f: procedure(x, y: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos2fv: procedure(const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos2i: procedure(x, y: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos2iv: procedure(const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos2s: procedure(x, y: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos2sv: procedure(const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos3d: procedure(x, y, z: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos3dv: procedure(const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos3f: procedure(x, y, z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos3fv: procedure(const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos3i: procedure(x, y, z: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos3iv: procedure(const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos3s: procedure(x, y, z: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos3sv: procedure(const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos4d: procedure(x, y, z, w: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos4dv: procedure(const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos4f: procedure(x, y, z, w: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos4fv: procedure(const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos4i: procedure(x, y, z, w: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos4iv: procedure(const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos4s: procedure(x, y, z, w: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRasterPos4sv: procedure(const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glReadBuffer: procedure(mode: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glReadPixels: procedure(x, y: GLint; width, height: GLsizei; format, atype: GLenum; pixels: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRectd: procedure(x1, y1, x2, y2: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRectdv: procedure(const v1: PGLdouble; const v2: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRectf: procedure(x1, y1, x2, y2: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRectfv: procedure(const v1: PGLfloat; const v2: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRecti: procedure(x1, y1, x2, y2: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRectiv: procedure(const v1: PGLint; const v2: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRects: procedure(x1, y1, x2, y2: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRectsv: procedure(const v1: PGLshort; const v2: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRenderMode: function(mode: GLint): GLint; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRotated: procedure(angle, x, y, z: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRotatef: procedure(angle, x, y, z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glScaled: procedure(x, y, z: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glScalef: procedure(x, y, z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glScissor: procedure(x, y: GLint; width, height: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSelectBuffer: procedure(size: GLsizei; buffer: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glShadeModel: procedure(mode: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glStencilFunc: procedure(func: GLenum; ref: GLint; mask: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glStencilMask: procedure(mask: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glStencilOp: procedure(fail, zfail, zpass: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord1d: procedure(s: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord1dv: procedure(const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord1f: procedure(s: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord1fv: procedure(const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord1i: procedure(s: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord1iv: procedure(const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord1s: procedure(s: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord1sv: procedure(const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord2d: procedure(s, t: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord2dv: procedure(const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord2f: procedure(s, t: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord2fv: procedure(const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord2i: procedure(s, t: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord2iv: procedure(const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord2s: procedure(s, t: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord2sv: procedure(const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord3d: procedure(s, t, r: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord3dv: procedure(const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord3f: procedure(s, t, r: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord3fv: procedure(const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord3i: procedure(s, t, r: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord3iv: procedure(const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord3s: procedure(s, t, r: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord3sv: procedure(const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord4d: procedure(s, t, r, q: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord4dv: procedure(const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord4f: procedure(s, t, r, q: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord4fv: procedure(const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord4i: procedure(s, t, r, q: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord4iv: procedure(const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord4s: procedure(s, t, r, q: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord4sv: procedure(const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoordPointer: procedure(size: GLint; atype: GLenum; stride: GLsizei; const pointer: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexEnvf: procedure(target: GLenum; pname: GLenum; param: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexEnvfv: procedure(target: GLenum; pname: GLenum; const params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexEnvi: procedure(target: GLenum; pname: GLenum; param: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexEnviv: procedure(target: GLenum; pname: GLenum; const params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexGend: procedure(coord: GLenum; pname: GLenum; param: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexGendv: procedure(coord: GLenum; pname: GLenum; const params: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexGenf: procedure(coord: GLenum; pname: GLenum; param: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexGenfv: procedure(coord: GLenum; pname: GLenum; const params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexGeni: procedure(coord: GLenum; pname: GLenum; param: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexGeniv: procedure(coord: GLenum; pname: GLenum; const params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexImage1D: procedure(target: GLenum; level, internalformat: GLint; width: GLsizei; border: GLint; format, atype: GLenum; const pixels: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexImage2D: procedure(target: GLenum; level, internalformat: GLint; width, height: GLsizei; border: GLint; format, atype: GLenum; const pixels: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexParameterf: procedure(target: GLenum; pname: GLenum; param: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexParameterfv: procedure(target: GLenum; pname: GLenum; const params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexParameteri: procedure(target: GLenum; pname: GLenum; param: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexParameteriv: procedure(target: GLenum; pname: GLenum; const params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexSubImage1D: procedure(target: GLenum; level, xoffset: GLint; width: GLsizei; format, atype: GLenum; const pixels: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexSubImage2D: procedure(target: GLenum; level, xoffset, yoffset: GLint; width, height: GLsizei; format, atype: GLenum; const pixels: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTranslated: procedure(x, y, z: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTranslatef: procedure(x, y, z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex2d: procedure(x, y: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex2dv: procedure(const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex2f: procedure(x, y: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex2fv: procedure(const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex2i: procedure(x, y: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex2iv: procedure(const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex2s: procedure(x, y: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex2sv: procedure(const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex3d: procedure(x, y, z: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex3dv: procedure(const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex3f: procedure(x, y, z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex3fv: procedure(const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex3i: procedure(x, y, z: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex3iv: procedure(const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex3s: procedure(x, y, z: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex3sv: procedure(const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex4d: procedure(x, y, z, w: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex4dv: procedure(const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex4f: procedure(x, y, z, w: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex4fv: procedure(const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex4i: procedure(x, y, z, w: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex4iv: procedure(const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex4s: procedure(x, y, z, w: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex4sv: procedure(const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexPointer: procedure(size: GLint; atype: GLenum; stride: GLsizei; const pointer: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glViewport: procedure(x, y: GLint; width, height: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ {$IFDEF WINDOWS}
+ ChoosePixelFormat: function(DC: HDC; p2: PPixelFormatDescriptor): Integer; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ {$ENDIF}
+
+type
+ // EXT_vertex_array
+ PFNGLARRAYELEMENTEXTPROC = procedure(i: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ PFNGLDRAWARRAYSEXTPROC = procedure(mode: GLenum; first: GLint; count: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ PFNGLVERTEXPOINTEREXTPROC = procedure(size: GLint; atype: GLenum;
+ stride, count: GLsizei; const pointer: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ PFNGLNORMALPOINTEREXTPROC = procedure(atype: GLenum; stride, count: GLsizei;
+ const pointer: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ PFNGLCOLORPOINTEREXTPROC = procedure(size: GLint; atype: GLenum; stride, count: GLsizei;
+ const pointer: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ PFNGLINDEXPOINTEREXTPROC = procedure(atype: GLenum; stride, count: GLsizei;
+ const pointer: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ PFNGLTEXCOORDPOINTEREXTPROC = procedure(size: GLint; atype: GLenum;
+ stride, count: GLsizei; const pointer: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ PFNGLEDGEFLAGPOINTEREXTPROC = procedure(stride, count: GLsizei;
+ const pointer: PGLboolean); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ PFNGLGETPOINTERVEXTPROC = procedure(pname: GLenum; params: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ PFNGLARRAYELEMENTARRAYEXTPROC = procedure(mode: GLenum; count: GLsizei;
+ const pi: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+ // WIN_swap_hint
+ PFNGLADDSWAPHINTRECTWINPROC = procedure(x, y: GLint; width, height: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+ // EXT_paletted_texture
+ PFNGLCOLORTABLEEXTPROC = procedure(target, internalFormat: GLenum; width: GLsizei;
+ format, atype: GLenum; const data: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ PFNGLCOLORSUBTABLEEXTPROC = procedure(target: GLenum; start, count: GLsizei;
+ format, atype: GLenum; const data: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ PFNGLGETCOLORTABLEEXTPROC = procedure(target, format, atype: GLenum; data: Pointer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ PFNGLGETCOLORTABLEPARAMETERIVEXTPROC = procedure(target, pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ PFNGLGETCOLORTABLEPARAMETERFVEXTPROC = procedure(target, pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+procedure LoadOpenGL( const dll: PChar );
+procedure FreeOpenGL;
+
+implementation
+
+procedure FreeOpenGL;
+begin
+
+ @glAccum := nil;
+ @glAlphaFunc := nil;
+ @glAreTexturesResident := nil;
+ @glArrayElement := nil;
+ @glBegin := nil;
+ @glBindTexture := nil;
+ @glBitmap := nil;
+ @glBlendFunc := nil;
+ @glCallList := nil;
+ @glCallLists := nil;
+ @glClear := nil;
+ @glClearAccum := nil;
+ @glClearColor := nil;
+ @glClearDepth := nil;
+ @glClearIndex := nil;
+ @glClearStencil := nil;
+ @glClipPlane := nil;
+ @glColor3b := nil;
+ @glColor3bv := nil;
+ @glColor3d := nil;
+ @glColor3dv := nil;
+ @glColor3f := nil;
+ @glColor3fv := nil;
+ @glColor3i := nil;
+ @glColor3iv := nil;
+ @glColor3s := nil;
+ @glColor3sv := nil;
+ @glColor3ub := nil;
+ @glColor3ubv := nil;
+ @glColor3ui := nil;
+ @glColor3uiv := nil;
+ @glColor3us := nil;
+ @glColor3usv := nil;
+ @glColor4b := nil;
+ @glColor4bv := nil;
+ @glColor4d := nil;
+ @glColor4dv := nil;
+ @glColor4f := nil;
+ @glColor4fv := nil;
+ @glColor4i := nil;
+ @glColor4iv := nil;
+ @glColor4s := nil;
+ @glColor4sv := nil;
+ @glColor4ub := nil;
+ @glColor4ubv := nil;
+ @glColor4ui := nil;
+ @glColor4uiv := nil;
+ @glColor4us := nil;
+ @glColor4usv := nil;
+ @glColorMask := nil;
+ @glColorMaterial := nil;
+ @glColorPointer := nil;
+ @glCopyPixels := nil;
+ @glCopyTexImage1D := nil;
+ @glCopyTexImage2D := nil;
+ @glCopyTexSubImage1D := nil;
+ @glCopyTexSubImage2D := nil;
+ @glCullFace := nil;
+ @glDeleteLists := nil;
+ @glDeleteTextures := nil;
+ @glDepthFunc := nil;
+ @glDepthMask := nil;
+ @glDepthRange := nil;
+ @glDisable := nil;
+ @glDisableClientState := nil;
+ @glDrawArrays := nil;
+ @glDrawBuffer := nil;
+ @glDrawElements := nil;
+ @glDrawPixels := nil;
+ @glEdgeFlag := nil;
+ @glEdgeFlagPointer := nil;
+ @glEdgeFlagv := nil;
+ @glEnable := nil;
+ @glEnableClientState := nil;
+ @glEnd := nil;
+ @glEndList := nil;
+ @glEvalCoord1d := nil;
+ @glEvalCoord1dv := nil;
+ @glEvalCoord1f := nil;
+ @glEvalCoord1fv := nil;
+ @glEvalCoord2d := nil;
+ @glEvalCoord2dv := nil;
+ @glEvalCoord2f := nil;
+ @glEvalCoord2fv := nil;
+ @glEvalMesh1 := nil;
+ @glEvalMesh2 := nil;
+ @glEvalPoint1 := nil;
+ @glEvalPoint2 := nil;
+ @glFeedbackBuffer := nil;
+ @glFinish := nil;
+ @glFlush := nil;
+ @glFogf := nil;
+ @glFogfv := nil;
+ @glFogi := nil;
+ @glFogiv := nil;
+ @glFrontFace := nil;
+ @glFrustum := nil;
+ @glGenLists := nil;
+ @glGenTextures := nil;
+ @glGetBooleanv := nil;
+ @glGetClipPlane := nil;
+ @glGetDoublev := nil;
+ @glGetError := nil;
+ @glGetFloatv := nil;
+ @glGetIntegerv := nil;
+ @glGetLightfv := nil;
+ @glGetLightiv := nil;
+ @glGetMapdv := nil;
+ @glGetMapfv := nil;
+ @glGetMapiv := nil;
+ @glGetMaterialfv := nil;
+ @glGetMaterialiv := nil;
+ @glGetPixelMapfv := nil;
+ @glGetPixelMapuiv := nil;
+ @glGetPixelMapusv := nil;
+ @glGetPointerv := nil;
+ @glGetPolygonStipple := nil;
+ @glGetString := nil;
+ @glGetTexEnvfv := nil;
+ @glGetTexEnviv := nil;
+ @glGetTexGendv := nil;
+ @glGetTexGenfv := nil;
+ @glGetTexGeniv := nil;
+ @glGetTexImage := nil;
+ @glGetTexLevelParameterfv := nil;
+ @glGetTexLevelParameteriv := nil;
+ @glGetTexParameterfv := nil;
+ @glGetTexParameteriv := nil;
+ @glHint := nil;
+ @glIndexMask := nil;
+ @glIndexPointer := nil;
+ @glIndexd := nil;
+ @glIndexdv := nil;
+ @glIndexf := nil;
+ @glIndexfv := nil;
+ @glIndexi := nil;
+ @glIndexiv := nil;
+ @glIndexs := nil;
+ @glIndexsv := nil;
+ @glIndexub := nil;
+ @glIndexubv := nil;
+ @glInitNames := nil;
+ @glInterleavedArrays := nil;
+ @glIsEnabled := nil;
+ @glIsList := nil;
+ @glIsTexture := nil;
+ @glLightModelf := nil;
+ @glLightModelfv := nil;
+ @glLightModeli := nil;
+ @glLightModeliv := nil;
+ @glLightf := nil;
+ @glLightfv := nil;
+ @glLighti := nil;
+ @glLightiv := nil;
+ @glLineStipple := nil;
+ @glLineWidth := nil;
+ @glListBase := nil;
+ @glLoadIdentity := nil;
+ @glLoadMatrixd := nil;
+ @glLoadMatrixf := nil;
+ @glLoadName := nil;
+ @glLogicOp := nil;
+ @glMap1d := nil;
+ @glMap1f := nil;
+ @glMap2d := nil;
+ @glMap2f := nil;
+ @glMapGrid1d := nil;
+ @glMapGrid1f := nil;
+ @glMapGrid2d := nil;
+ @glMapGrid2f := nil;
+ @glMaterialf := nil;
+ @glMaterialfv := nil;
+ @glMateriali := nil;
+ @glMaterialiv := nil;
+ @glMatrixMode := nil;
+ @glMultMatrixd := nil;
+ @glMultMatrixf := nil;
+ @glNewList := nil;
+ @glNormal3b := nil;
+ @glNormal3bv := nil;
+ @glNormal3d := nil;
+ @glNormal3dv := nil;
+ @glNormal3f := nil;
+ @glNormal3fv := nil;
+ @glNormal3i := nil;
+ @glNormal3iv := nil;
+ @glNormal3s := nil;
+ @glNormal3sv := nil;
+ @glNormalPointer := nil;
+ @glOrtho := nil;
+ @glPassThrough := nil;
+ @glPixelMapfv := nil;
+ @glPixelMapuiv := nil;
+ @glPixelMapusv := nil;
+ @glPixelStoref := nil;
+ @glPixelStorei := nil;
+ @glPixelTransferf := nil;
+ @glPixelTransferi := nil;
+ @glPixelZoom := nil;
+ @glPointSize := nil;
+ @glPolygonMode := nil;
+ @glPolygonOffset := nil;
+ @glPolygonStipple := nil;
+ @glPopAttrib := nil;
+ @glPopClientAttrib := nil;
+ @glPopMatrix := nil;
+ @glPopName := nil;
+ @glPrioritizeTextures := nil;
+ @glPushAttrib := nil;
+ @glPushClientAttrib := nil;
+ @glPushMatrix := nil;
+ @glPushName := nil;
+ @glRasterPos2d := nil;
+ @glRasterPos2dv := nil;
+ @glRasterPos2f := nil;
+ @glRasterPos2fv := nil;
+ @glRasterPos2i := nil;
+ @glRasterPos2iv := nil;
+ @glRasterPos2s := nil;
+ @glRasterPos2sv := nil;
+ @glRasterPos3d := nil;
+ @glRasterPos3dv := nil;
+ @glRasterPos3f := nil;
+ @glRasterPos3fv := nil;
+ @glRasterPos3i := nil;
+ @glRasterPos3iv := nil;
+ @glRasterPos3s := nil;
+ @glRasterPos3sv := nil;
+ @glRasterPos4d := nil;
+ @glRasterPos4dv := nil;
+ @glRasterPos4f := nil;
+ @glRasterPos4fv := nil;
+ @glRasterPos4i := nil;
+ @glRasterPos4iv := nil;
+ @glRasterPos4s := nil;
+ @glRasterPos4sv := nil;
+ @glReadBuffer := nil;
+ @glReadPixels := nil;
+ @glRectd := nil;
+ @glRectdv := nil;
+ @glRectf := nil;
+ @glRectfv := nil;
+ @glRecti := nil;
+ @glRectiv := nil;
+ @glRects := nil;
+ @glRectsv := nil;
+ @glRenderMode := nil;
+ @glRotated := nil;
+ @glRotatef := nil;
+ @glScaled := nil;
+ @glScalef := nil;
+ @glScissor := nil;
+ @glSelectBuffer := nil;
+ @glShadeModel := nil;
+ @glStencilFunc := nil;
+ @glStencilMask := nil;
+ @glStencilOp := nil;
+ @glTexCoord1d := nil;
+ @glTexCoord1dv := nil;
+ @glTexCoord1f := nil;
+ @glTexCoord1fv := nil;
+ @glTexCoord1i := nil;
+ @glTexCoord1iv := nil;
+ @glTexCoord1s := nil;
+ @glTexCoord1sv := nil;
+ @glTexCoord2d := nil;
+ @glTexCoord2dv := nil;
+ @glTexCoord2f := nil;
+ @glTexCoord2fv := nil;
+ @glTexCoord2i := nil;
+ @glTexCoord2iv := nil;
+ @glTexCoord2s := nil;
+ @glTexCoord2sv := nil;
+ @glTexCoord3d := nil;
+ @glTexCoord3dv := nil;
+ @glTexCoord3f := nil;
+ @glTexCoord3fv := nil;
+ @glTexCoord3i := nil;
+ @glTexCoord3iv := nil;
+ @glTexCoord3s := nil;
+ @glTexCoord3sv := nil;
+ @glTexCoord4d := nil;
+ @glTexCoord4dv := nil;
+ @glTexCoord4f := nil;
+ @glTexCoord4fv := nil;
+ @glTexCoord4i := nil;
+ @glTexCoord4iv := nil;
+ @glTexCoord4s := nil;
+ @glTexCoord4sv := nil;
+ @glTexCoordPointer := nil;
+ @glTexEnvf := nil;
+ @glTexEnvfv := nil;
+ @glTexEnvi := nil;
+ @glTexEnviv := nil;
+ @glTexGend := nil;
+ @glTexGendv := nil;
+ @glTexGenf := nil;
+ @glTexGenfv := nil;
+ @glTexGeni := nil;
+ @glTexGeniv := nil;
+ @glTexImage1D := nil;
+ @glTexImage2D := nil;
+ @glTexParameterf := nil;
+ @glTexParameterfv := nil;
+ @glTexParameteri := nil;
+ @glTexParameteriv := nil;
+ @glTexSubImage1D := nil;
+ @glTexSubImage2D := nil;
+ @glTranslated := nil;
+ @glTranslatef := nil;
+ @glVertex2d := nil;
+ @glVertex2dv := nil;
+ @glVertex2f := nil;
+ @glVertex2fv := nil;
+ @glVertex2i := nil;
+ @glVertex2iv := nil;
+ @glVertex2s := nil;
+ @glVertex2sv := nil;
+ @glVertex3d := nil;
+ @glVertex3dv := nil;
+ @glVertex3f := nil;
+ @glVertex3fv := nil;
+ @glVertex3i := nil;
+ @glVertex3iv := nil;
+ @glVertex3s := nil;
+ @glVertex3sv := nil;
+ @glVertex4d := nil;
+ @glVertex4dv := nil;
+ @glVertex4f := nil;
+ @glVertex4fv := nil;
+ @glVertex4i := nil;
+ @glVertex4iv := nil;
+ @glVertex4s := nil;
+ @glVertex4sv := nil;
+ @glVertexPointer := nil;
+ @glViewport := nil;
+ {$IFDEF WINDOWS}
+ @ChoosePixelFormat := nil;
+ {$ENDIF}
+
+ UnLoadModule(LibGL);
+
+end;
+
+procedure LoadOpenGL(const dll: PChar);
+begin
+
+ FreeOpenGL;
+
+ if LoadModule( LibGL, dll ) then
+ begin
+ @glAccum := GetModuleSymbol(LibGL, 'glAccum');
+ @glAlphaFunc := GetModuleSymbol(LibGL, 'glAlphaFunc');
+ @glAreTexturesResident := GetModuleSymbol(LibGL, 'glAreTexturesResident');
+ @glArrayElement := GetModuleSymbol(LibGL, 'glArrayElement');
+ @glBegin := GetModuleSymbol(LibGL, 'glBegin');
+ @glBindTexture := GetModuleSymbol(LibGL, 'glBindTexture');
+ @glBitmap := GetModuleSymbol(LibGL, 'glBitmap');
+ @glBlendFunc := GetModuleSymbol(LibGL, 'glBlendFunc');
+ @glCallList := GetModuleSymbol(LibGL, 'glCallList');
+ @glCallLists := GetModuleSymbol(LibGL, 'glCallLists');
+ @glClear := GetModuleSymbol(LibGL, 'glClear');
+ @glClearAccum := GetModuleSymbol(LibGL, 'glClearAccum');
+ @glClearColor := GetModuleSymbol(LibGL, 'glClearColor');
+ @glClearDepth := GetModuleSymbol(LibGL, 'glClearDepth');
+ @glClearIndex := GetModuleSymbol(LibGL, 'glClearIndex');
+ @glClearStencil := GetModuleSymbol(LibGL, 'glClearStencil');
+ @glClipPlane := GetModuleSymbol(LibGL, 'glClipPlane');
+ @glColor3b := GetModuleSymbol(LibGL, 'glColor3b');
+ @glColor3bv := GetModuleSymbol(LibGL, 'glColor3bv');
+ @glColor3d := GetModuleSymbol(LibGL, 'glColor3d');
+ @glColor3dv := GetModuleSymbol(LibGL, 'glColor3dv');
+ @glColor3f := GetModuleSymbol(LibGL, 'glColor3f');
+ @glColor3fv := GetModuleSymbol(LibGL, 'glColor3fv');
+ @glColor3i := GetModuleSymbol(LibGL, 'glColor3i');
+ @glColor3iv := GetModuleSymbol(LibGL, 'glColor3iv');
+ @glColor3s := GetModuleSymbol(LibGL, 'glColor3s');
+ @glColor3sv := GetModuleSymbol(LibGL, 'glColor3sv');
+ @glColor3ub := GetModuleSymbol(LibGL, 'glColor3ub');
+ @glColor3ubv := GetModuleSymbol(LibGL, 'glColor3ubv');
+ @glColor3ui := GetModuleSymbol(LibGL, 'glColor3ui');
+ @glColor3uiv := GetModuleSymbol(LibGL, 'glColor3uiv');
+ @glColor3us := GetModuleSymbol(LibGL, 'glColor3us');
+ @glColor3usv := GetModuleSymbol(LibGL, 'glColor3usv');
+ @glColor4b := GetModuleSymbol(LibGL, 'glColor4b');
+ @glColor4bv := GetModuleSymbol(LibGL, 'glColor4bv');
+ @glColor4d := GetModuleSymbol(LibGL, 'glColor4d');
+ @glColor4dv := GetModuleSymbol(LibGL, 'glColor4dv');
+ @glColor4f := GetModuleSymbol(LibGL, 'glColor4f');
+ @glColor4fv := GetModuleSymbol(LibGL, 'glColor4fv');
+ @glColor4i := GetModuleSymbol(LibGL, 'glColor4i');
+ @glColor4iv := GetModuleSymbol(LibGL, 'glColor4iv');
+ @glColor4s := GetModuleSymbol(LibGL, 'glColor4s');
+ @glColor4sv := GetModuleSymbol(LibGL, 'glColor4sv');
+ @glColor4ub := GetModuleSymbol(LibGL, 'glColor4ub');
+ @glColor4ubv := GetModuleSymbol(LibGL, 'glColor4ubv');
+ @glColor4ui := GetModuleSymbol(LibGL, 'glColor4ui');
+ @glColor4uiv := GetModuleSymbol(LibGL, 'glColor4uiv');
+ @glColor4us := GetModuleSymbol(LibGL, 'glColor4us');
+ @glColor4usv := GetModuleSymbol(LibGL, 'glColor4usv');
+ @glColorMask := GetModuleSymbol(LibGL, 'glColorMask');
+ @glColorMaterial := GetModuleSymbol(LibGL, 'glColorMaterial');
+ @glColorPointer := GetModuleSymbol(LibGL, 'glColorPointer');
+ @glCopyPixels := GetModuleSymbol(LibGL, 'glCopyPixels');
+ @glCopyTexImage1D := GetModuleSymbol(LibGL, 'glCopyTexImage1D');
+ @glCopyTexImage2D := GetModuleSymbol(LibGL, 'glCopyTexImage2D');
+ @glCopyTexSubImage1D := GetModuleSymbol(LibGL, 'glCopyTexSubImage1D');
+ @glCopyTexSubImage2D := GetModuleSymbol(LibGL, 'glCopyTexSubImage2D');
+ @glCullFace := GetModuleSymbol(LibGL, 'glCullFace');
+ @glDeleteLists := GetModuleSymbol(LibGL, 'glDeleteLists');
+ @glDeleteTextures := GetModuleSymbol(LibGL, 'glDeleteTextures');
+ @glDepthFunc := GetModuleSymbol(LibGL, 'glDepthFunc');
+ @glDepthMask := GetModuleSymbol(LibGL, 'glDepthMask');
+ @glDepthRange := GetModuleSymbol(LibGL, 'glDepthRange');
+ @glDisable := GetModuleSymbol(LibGL, 'glDisable');
+ @glDisableClientState := GetModuleSymbol(LibGL, 'glDisableClientState');
+ @glDrawArrays := GetModuleSymbol(LibGL, 'glDrawArrays');
+ @glDrawBuffer := GetModuleSymbol(LibGL, 'glDrawBuffer');
+ @glDrawElements := GetModuleSymbol(LibGL, 'glDrawElements');
+ @glDrawPixels := GetModuleSymbol(LibGL, 'glDrawPixels');
+ @glEdgeFlag := GetModuleSymbol(LibGL, 'glEdgeFlag');
+ @glEdgeFlagPointer := GetModuleSymbol(LibGL, 'glEdgeFlagPointer');
+ @glEdgeFlagv := GetModuleSymbol(LibGL, 'glEdgeFlagv');
+ @glEnable := GetModuleSymbol(LibGL, 'glEnable');
+ @glEnableClientState := GetModuleSymbol(LibGL, 'glEnableClientState');
+ @glEnd := GetModuleSymbol(LibGL, 'glEnd');
+ @glEndList := GetModuleSymbol(LibGL, 'glEndList');
+ @glEvalCoord1d := GetModuleSymbol(LibGL, 'glEvalCoord1d');
+ @glEvalCoord1dv := GetModuleSymbol(LibGL, 'glEvalCoord1dv');
+ @glEvalCoord1f := GetModuleSymbol(LibGL, 'glEvalCoord1f');
+ @glEvalCoord1fv := GetModuleSymbol(LibGL, 'glEvalCoord1fv');
+ @glEvalCoord2d := GetModuleSymbol(LibGL, 'glEvalCoord2d');
+ @glEvalCoord2dv := GetModuleSymbol(LibGL, 'glEvalCoord2dv');
+ @glEvalCoord2f := GetModuleSymbol(LibGL, 'glEvalCoord2f');
+ @glEvalCoord2fv := GetModuleSymbol(LibGL, 'glEvalCoord2fv');
+ @glEvalMesh1 := GetModuleSymbol(LibGL, 'glEvalMesh1');
+ @glEvalMesh2 := GetModuleSymbol(LibGL, 'glEvalMesh2');
+ @glEvalPoint1 := GetModuleSymbol(LibGL, 'glEvalPoint1');
+ @glEvalPoint2 := GetModuleSymbol(LibGL, 'glEvalPoint2');
+ @glFeedbackBuffer := GetModuleSymbol(LibGL, 'glFeedbackBuffer');
+ @glFinish := GetModuleSymbol(LibGL, 'glFinish');
+ @glFlush := GetModuleSymbol(LibGL, 'glFlush');
+ @glFogf := GetModuleSymbol(LibGL, 'glFogf');
+ @glFogfv := GetModuleSymbol(LibGL, 'glFogfv');
+ @glFogi := GetModuleSymbol(LibGL, 'glFogi');
+ @glFogiv := GetModuleSymbol(LibGL, 'glFogiv');
+ @glFrontFace := GetModuleSymbol(LibGL, 'glFrontFace');
+ @glFrustum := GetModuleSymbol(LibGL, 'glFrustum');
+ @glGenLists := GetModuleSymbol(LibGL, 'glGenLists');
+ @glGenTextures := GetModuleSymbol(LibGL, 'glGenTextures');
+ @glGetBooleanv := GetModuleSymbol(LibGL, 'glGetBooleanv');
+ @glGetClipPlane := GetModuleSymbol(LibGL, 'glGetClipPlane');
+ @glGetDoublev := GetModuleSymbol(LibGL, 'glGetDoublev');
+ @glGetError := GetModuleSymbol(LibGL, 'glGetError');
+ @glGetFloatv := GetModuleSymbol(LibGL, 'glGetFloatv');
+ @glGetIntegerv := GetModuleSymbol(LibGL, 'glGetIntegerv');
+ @glGetLightfv := GetModuleSymbol(LibGL, 'glGetLightfv');
+ @glGetLightiv := GetModuleSymbol(LibGL, 'glGetLightiv');
+ @glGetMapdv := GetModuleSymbol(LibGL, 'glGetMapdv');
+ @glGetMapfv := GetModuleSymbol(LibGL, 'glGetMapfv');
+ @glGetMapiv := GetModuleSymbol(LibGL, 'glGetMapiv');
+ @glGetMaterialfv := GetModuleSymbol(LibGL, 'glGetMaterialfv');
+ @glGetMaterialiv := GetModuleSymbol(LibGL, 'glGetMaterialiv');
+ @glGetPixelMapfv := GetModuleSymbol(LibGL, 'glGetPixelMapfv');
+ @glGetPixelMapuiv := GetModuleSymbol(LibGL, 'glGetPixelMapuiv');
+ @glGetPixelMapusv := GetModuleSymbol(LibGL, 'glGetPixelMapusv');
+ @glGetPointerv := GetModuleSymbol(LibGL, 'glGetPointerv');
+ @glGetPolygonStipple := GetModuleSymbol(LibGL, 'glGetPolygonStipple');
+ @glGetString := GetModuleSymbol(LibGL, 'glGetString');
+ @glGetTexEnvfv := GetModuleSymbol(LibGL, 'glGetTexEnvfv');
+ @glGetTexEnviv := GetModuleSymbol(LibGL, 'glGetTexEnviv');
+ @glGetTexGendv := GetModuleSymbol(LibGL, 'glGetTexGendv');
+ @glGetTexGenfv := GetModuleSymbol(LibGL, 'glGetTexGenfv');
+ @glGetTexGeniv := GetModuleSymbol(LibGL, 'glGetTexGeniv');
+ @glGetTexImage := GetModuleSymbol(LibGL, 'glGetTexImage');
+ @glGetTexLevelParameterfv := GetModuleSymbol(LibGL, 'glGetTexLevelParameterfv');
+ @glGetTexLevelParameteriv := GetModuleSymbol(LibGL, 'glGetTexLevelParameteriv');
+ @glGetTexParameterfv := GetModuleSymbol(LibGL, 'glGetTexParameterfv');
+ @glGetTexParameteriv := GetModuleSymbol(LibGL, 'glGetTexParameteriv');
+ @glHint := GetModuleSymbol(LibGL, 'glHint');
+ @glIndexMask := GetModuleSymbol(LibGL, 'glIndexMask');
+ @glIndexPointer := GetModuleSymbol(LibGL, 'glIndexPointer');
+ @glIndexd := GetModuleSymbol(LibGL, 'glIndexd');
+ @glIndexdv := GetModuleSymbol(LibGL, 'glIndexdv');
+ @glIndexf := GetModuleSymbol(LibGL, 'glIndexf');
+ @glIndexfv := GetModuleSymbol(LibGL, 'glIndexfv');
+ @glIndexi := GetModuleSymbol(LibGL, 'glIndexi');
+ @glIndexiv := GetModuleSymbol(LibGL, 'glIndexiv');
+ @glIndexs := GetModuleSymbol(LibGL, 'glIndexs');
+ @glIndexsv := GetModuleSymbol(LibGL, 'glIndexsv');
+ @glIndexub := GetModuleSymbol(LibGL, 'glIndexub');
+ @glIndexubv := GetModuleSymbol(LibGL, 'glIndexubv');
+ @glInitNames := GetModuleSymbol(LibGL, 'glInitNames');
+ @glInterleavedArrays := GetModuleSymbol(LibGL, 'glInterleavedArrays');
+ @glIsEnabled := GetModuleSymbol(LibGL, 'glIsEnabled');
+ @glIsList := GetModuleSymbol(LibGL, 'glIsList');
+ @glIsTexture := GetModuleSymbol(LibGL, 'glIsTexture');
+ @glLightModelf := GetModuleSymbol(LibGL, 'glLightModelf');
+ @glLightModelfv := GetModuleSymbol(LibGL, 'glLightModelfv');
+ @glLightModeli := GetModuleSymbol(LibGL, 'glLightModeli');
+ @glLightModeliv := GetModuleSymbol(LibGL, 'glLightModeliv');
+ @glLightf := GetModuleSymbol(LibGL, 'glLightf');
+ @glLightfv := GetModuleSymbol(LibGL, 'glLightfv');
+ @glLighti := GetModuleSymbol(LibGL, 'glLighti');
+ @glLightiv := GetModuleSymbol(LibGL, 'glLightiv');
+ @glLineStipple := GetModuleSymbol(LibGL, 'glLineStipple');
+ @glLineWidth := GetModuleSymbol(LibGL, 'glLineWidth');
+ @glListBase := GetModuleSymbol(LibGL, 'glListBase');
+ @glLoadIdentity := GetModuleSymbol(LibGL, 'glLoadIdentity');
+ @glLoadMatrixd := GetModuleSymbol(LibGL, 'glLoadMatrixd');
+ @glLoadMatrixf := GetModuleSymbol(LibGL, 'glLoadMatrixf');
+ @glLoadName := GetModuleSymbol(LibGL, 'glLoadName');
+ @glLogicOp := GetModuleSymbol(LibGL, 'glLogicOp');
+ @glMap1d := GetModuleSymbol(LibGL, 'glMap1d');
+ @glMap1f := GetModuleSymbol(LibGL, 'glMap1f');
+ @glMap2d := GetModuleSymbol(LibGL, 'glMap2d');
+ @glMap2f := GetModuleSymbol(LibGL, 'glMap2f');
+ @glMapGrid1d := GetModuleSymbol(LibGL, 'glMapGrid1d');
+ @glMapGrid1f := GetModuleSymbol(LibGL, 'glMapGrid1f');
+ @glMapGrid2d := GetModuleSymbol(LibGL, 'glMapGrid2d');
+ @glMapGrid2f := GetModuleSymbol(LibGL, 'glMapGrid2f');
+ @glMaterialf := GetModuleSymbol(LibGL, 'glMaterialf');
+ @glMaterialfv := GetModuleSymbol(LibGL, 'glMaterialfv');
+ @glMateriali := GetModuleSymbol(LibGL, 'glMateriali');
+ @glMaterialiv := GetModuleSymbol(LibGL, 'glMaterialiv');
+ @glMatrixMode := GetModuleSymbol(LibGL, 'glMatrixMode');
+ @glMultMatrixd := GetModuleSymbol(LibGL, 'glMultMatrixd');
+ @glMultMatrixf := GetModuleSymbol(LibGL, 'glMultMatrixf');
+ @glNewList := GetModuleSymbol(LibGL, 'glNewList');
+ @glNormal3b := GetModuleSymbol(LibGL, 'glNormal3b');
+ @glNormal3bv := GetModuleSymbol(LibGL, 'glNormal3bv');
+ @glNormal3d := GetModuleSymbol(LibGL, 'glNormal3d');
+ @glNormal3dv := GetModuleSymbol(LibGL, 'glNormal3dv');
+ @glNormal3f := GetModuleSymbol(LibGL, 'glNormal3f');
+ @glNormal3fv := GetModuleSymbol(LibGL, 'glNormal3fv');
+ @glNormal3i := GetModuleSymbol(LibGL, 'glNormal3i');
+ @glNormal3iv := GetModuleSymbol(LibGL, 'glNormal3iv');
+ @glNormal3s := GetModuleSymbol(LibGL, 'glNormal3s');
+ @glNormal3sv := GetModuleSymbol(LibGL, 'glNormal3sv');
+ @glNormalPointer := GetModuleSymbol(LibGL, 'glNormalPointer');
+ @glOrtho := GetModuleSymbol(LibGL, 'glOrtho');
+ @glPassThrough := GetModuleSymbol(LibGL, 'glPassThrough');
+ @glPixelMapfv := GetModuleSymbol(LibGL, 'glPixelMapfv');
+ @glPixelMapuiv := GetModuleSymbol(LibGL, 'glPixelMapuiv');
+ @glPixelMapusv := GetModuleSymbol(LibGL, 'glPixelMapusv');
+ @glPixelStoref := GetModuleSymbol(LibGL, 'glPixelStoref');
+ @glPixelStorei := GetModuleSymbol(LibGL, 'glPixelStorei');
+ @glPixelTransferf := GetModuleSymbol(LibGL, 'glPixelTransferf');
+ @glPixelTransferi := GetModuleSymbol(LibGL, 'glPixelTransferi');
+ @glPixelZoom := GetModuleSymbol(LibGL, 'glPixelZoom');
+ @glPointSize := GetModuleSymbol(LibGL, 'glPointSize');
+ @glPolygonMode := GetModuleSymbol(LibGL, 'glPolygonMode');
+ @glPolygonOffset := GetModuleSymbol(LibGL, 'glPolygonOffset');
+ @glPolygonStipple := GetModuleSymbol(LibGL, 'glPolygonStipple');
+ @glPopAttrib := GetModuleSymbol(LibGL, 'glPopAttrib');
+ @glPopClientAttrib := GetModuleSymbol(LibGL, 'glPopClientAttrib');
+ @glPopMatrix := GetModuleSymbol(LibGL, 'glPopMatrix');
+ @glPopName := GetModuleSymbol(LibGL, 'glPopName');
+ @glPrioritizeTextures := GetModuleSymbol(LibGL, 'glPrioritizeTextures');
+ @glPushAttrib := GetModuleSymbol(LibGL, 'glPushAttrib');
+ @glPushClientAttrib := GetModuleSymbol(LibGL, 'glPushClientAttrib');
+ @glPushMatrix := GetModuleSymbol(LibGL, 'glPushMatrix');
+ @glPushName := GetModuleSymbol(LibGL, 'glPushName');
+ @glRasterPos2d := GetModuleSymbol(LibGL, 'glRasterPos2d');
+ @glRasterPos2dv := GetModuleSymbol(LibGL, 'glRasterPos2dv');
+ @glRasterPos2f := GetModuleSymbol(LibGL, 'glRasterPos2f');
+ @glRasterPos2fv := GetModuleSymbol(LibGL, 'glRasterPos2fv');
+ @glRasterPos2i := GetModuleSymbol(LibGL, 'glRasterPos2i');
+ @glRasterPos2iv := GetModuleSymbol(LibGL, 'glRasterPos2iv');
+ @glRasterPos2s := GetModuleSymbol(LibGL, 'glRasterPos2s');
+ @glRasterPos2sv := GetModuleSymbol(LibGL, 'glRasterPos2sv');
+ @glRasterPos3d := GetModuleSymbol(LibGL, 'glRasterPos3d');
+ @glRasterPos3dv := GetModuleSymbol(LibGL, 'glRasterPos3dv');
+ @glRasterPos3f := GetModuleSymbol(LibGL, 'glRasterPos3f');
+ @glRasterPos3fv := GetModuleSymbol(LibGL, 'glRasterPos3fv');
+ @glRasterPos3i := GetModuleSymbol(LibGL, 'glRasterPos3i');
+ @glRasterPos3iv := GetModuleSymbol(LibGL, 'glRasterPos3iv');
+ @glRasterPos3s := GetModuleSymbol(LibGL, 'glRasterPos3s');
+ @glRasterPos3sv := GetModuleSymbol(LibGL, 'glRasterPos3sv');
+ @glRasterPos4d := GetModuleSymbol(LibGL, 'glRasterPos4d');
+ @glRasterPos4dv := GetModuleSymbol(LibGL, 'glRasterPos4dv');
+ @glRasterPos4f := GetModuleSymbol(LibGL, 'glRasterPos4f');
+ @glRasterPos4fv := GetModuleSymbol(LibGL, 'glRasterPos4fv');
+ @glRasterPos4i := GetModuleSymbol(LibGL, 'glRasterPos4i');
+ @glRasterPos4iv := GetModuleSymbol(LibGL, 'glRasterPos4iv');
+ @glRasterPos4s := GetModuleSymbol(LibGL, 'glRasterPos4s');
+ @glRasterPos4sv := GetModuleSymbol(LibGL, 'glRasterPos4sv');
+ @glReadBuffer := GetModuleSymbol(LibGL, 'glReadBuffer');
+ @glReadPixels := GetModuleSymbol(LibGL, 'glReadPixels');
+ @glRectd := GetModuleSymbol(LibGL, 'glRectd');
+ @glRectdv := GetModuleSymbol(LibGL, 'glRectdv');
+ @glRectf := GetModuleSymbol(LibGL, 'glRectf');
+ @glRectfv := GetModuleSymbol(LibGL, 'glRectfv');
+ @glRecti := GetModuleSymbol(LibGL, 'glRecti');
+ @glRectiv := GetModuleSymbol(LibGL, 'glRectiv');
+ @glRects := GetModuleSymbol(LibGL, 'glRects');
+ @glRectsv := GetModuleSymbol(LibGL, 'glRectsv');
+ @glRenderMode := GetModuleSymbol(LibGL, 'glRenderMode');
+ @glRotated := GetModuleSymbol(LibGL, 'glRotated');
+ @glRotatef := GetModuleSymbol(LibGL, 'glRotatef');
+ @glScaled := GetModuleSymbol(LibGL, 'glScaled');
+ @glScalef := GetModuleSymbol(LibGL, 'glScalef');
+ @glScissor := GetModuleSymbol(LibGL, 'glScissor');
+ @glSelectBuffer := GetModuleSymbol(LibGL, 'glSelectBuffer');
+ @glShadeModel := GetModuleSymbol(LibGL, 'glShadeModel');
+ @glStencilFunc := GetModuleSymbol(LibGL, 'glStencilFunc');
+ @glStencilMask := GetModuleSymbol(LibGL, 'glStencilMask');
+ @glStencilOp := GetModuleSymbol(LibGL, 'glStencilOp');
+ @glTexCoord1d := GetModuleSymbol(LibGL, 'glTexCoord1d');
+ @glTexCoord1dv := GetModuleSymbol(LibGL, 'glTexCoord1dv');
+ @glTexCoord1f := GetModuleSymbol(LibGL, 'glTexCoord1f');
+ @glTexCoord1fv := GetModuleSymbol(LibGL, 'glTexCoord1fv');
+ @glTexCoord1i := GetModuleSymbol(LibGL, 'glTexCoord1i');
+ @glTexCoord1iv := GetModuleSymbol(LibGL, 'glTexCoord1iv');
+ @glTexCoord1s := GetModuleSymbol(LibGL, 'glTexCoord1s');
+ @glTexCoord1sv := GetModuleSymbol(LibGL, 'glTexCoord1sv');
+ @glTexCoord2d := GetModuleSymbol(LibGL, 'glTexCoord2d');
+ @glTexCoord2dv := GetModuleSymbol(LibGL, 'glTexCoord2dv');
+ @glTexCoord2f := GetModuleSymbol(LibGL, 'glTexCoord2f');
+ @glTexCoord2fv := GetModuleSymbol(LibGL, 'glTexCoord2fv');
+ @glTexCoord2i := GetModuleSymbol(LibGL, 'glTexCoord2i');
+ @glTexCoord2iv := GetModuleSymbol(LibGL, 'glTexCoord2iv');
+ @glTexCoord2s := GetModuleSymbol(LibGL, 'glTexCoord2s');
+ @glTexCoord2sv := GetModuleSymbol(LibGL, 'glTexCoord2sv');
+ @glTexCoord3d := GetModuleSymbol(LibGL, 'glTexCoord3d');
+ @glTexCoord3dv := GetModuleSymbol(LibGL, 'glTexCoord3dv');
+ @glTexCoord3f := GetModuleSymbol(LibGL, 'glTexCoord3f');
+ @glTexCoord3fv := GetModuleSymbol(LibGL, 'glTexCoord3fv');
+ @glTexCoord3i := GetModuleSymbol(LibGL, 'glTexCoord3i');
+ @glTexCoord3iv := GetModuleSymbol(LibGL, 'glTexCoord3iv');
+ @glTexCoord3s := GetModuleSymbol(LibGL, 'glTexCoord3s');
+ @glTexCoord3sv := GetModuleSymbol(LibGL, 'glTexCoord3sv');
+ @glTexCoord4d := GetModuleSymbol(LibGL, 'glTexCoord4d');
+ @glTexCoord4dv := GetModuleSymbol(LibGL, 'glTexCoord4dv');
+ @glTexCoord4f := GetModuleSymbol(LibGL, 'glTexCoord4f');
+ @glTexCoord4fv := GetModuleSymbol(LibGL, 'glTexCoord4fv');
+ @glTexCoord4i := GetModuleSymbol(LibGL, 'glTexCoord4i');
+ @glTexCoord4iv := GetModuleSymbol(LibGL, 'glTexCoord4iv');
+ @glTexCoord4s := GetModuleSymbol(LibGL, 'glTexCoord4s');
+ @glTexCoord4sv := GetModuleSymbol(LibGL, 'glTexCoord4sv');
+ @glTexCoordPointer := GetModuleSymbol(LibGL, 'glTexCoordPointer');
+ @glTexEnvf := GetModuleSymbol(LibGL, 'glTexEnvf');
+ @glTexEnvfv := GetModuleSymbol(LibGL, 'glTexEnvfv');
+ @glTexEnvi := GetModuleSymbol(LibGL, 'glTexEnvi');
+ @glTexEnviv := GetModuleSymbol(LibGL, 'glTexEnviv');
+ @glTexGend := GetModuleSymbol(LibGL, 'glTexGend');
+ @glTexGendv := GetModuleSymbol(LibGL, 'glTexGendv');
+ @glTexGenf := GetModuleSymbol(LibGL, 'glTexGenf');
+ @glTexGenfv := GetModuleSymbol(LibGL, 'glTexGenfv');
+ @glTexGeni := GetModuleSymbol(LibGL, 'glTexGeni');
+ @glTexGeniv := GetModuleSymbol(LibGL, 'glTexGeniv');
+ @glTexImage1D := GetModuleSymbol(LibGL, 'glTexImage1D');
+ @glTexImage2D := GetModuleSymbol(LibGL, 'glTexImage2D');
+ @glTexParameterf := GetModuleSymbol(LibGL, 'glTexParameterf');
+ @glTexParameterfv := GetModuleSymbol(LibGL, 'glTexParameterfv');
+ @glTexParameteri := GetModuleSymbol(LibGL, 'glTexParameteri');
+ @glTexParameteriv := GetModuleSymbol(LibGL, 'glTexParameteriv');
+ @glTexSubImage1D := GetModuleSymbol(LibGL, 'glTexSubImage1D');
+ @glTexSubImage2D := GetModuleSymbol(LibGL, 'glTexSubImage2D');
+ @glTranslated := GetModuleSymbol(LibGL, 'glTranslated');
+ @glTranslatef := GetModuleSymbol(LibGL, 'glTranslatef');
+ @glVertex2d := GetModuleSymbol(LibGL, 'glVertex2d');
+ @glVertex2dv := GetModuleSymbol(LibGL, 'glVertex2dv');
+ @glVertex2f := GetModuleSymbol(LibGL, 'glVertex2f');
+ @glVertex2fv := GetModuleSymbol(LibGL, 'glVertex2fv');
+ @glVertex2i := GetModuleSymbol(LibGL, 'glVertex2i');
+ @glVertex2iv := GetModuleSymbol(LibGL, 'glVertex2iv');
+ @glVertex2s := GetModuleSymbol(LibGL, 'glVertex2s');
+ @glVertex2sv := GetModuleSymbol(LibGL, 'glVertex2sv');
+ @glVertex3d := GetModuleSymbol(LibGL, 'glVertex3d');
+ @glVertex3dv := GetModuleSymbol(LibGL, 'glVertex3dv');
+ @glVertex3f := GetModuleSymbol(LibGL, 'glVertex3f');
+ @glVertex3fv := GetModuleSymbol(LibGL, 'glVertex3fv');
+ @glVertex3i := GetModuleSymbol(LibGL, 'glVertex3i');
+ @glVertex3iv := GetModuleSymbol(LibGL, 'glVertex3iv');
+ @glVertex3s := GetModuleSymbol(LibGL, 'glVertex3s');
+ @glVertex3sv := GetModuleSymbol(LibGL, 'glVertex3sv');
+ @glVertex4d := GetModuleSymbol(LibGL, 'glVertex4d');
+ @glVertex4dv := GetModuleSymbol(LibGL, 'glVertex4dv');
+ @glVertex4f := GetModuleSymbol(LibGL, 'glVertex4f');
+ @glVertex4fv := GetModuleSymbol(LibGL, 'glVertex4fv');
+ @glVertex4i := GetModuleSymbol(LibGL, 'glVertex4i');
+ @glVertex4iv := GetModuleSymbol(LibGL, 'glVertex4iv');
+ @glVertex4s := GetModuleSymbol(LibGL, 'glVertex4s');
+ @glVertex4sv := GetModuleSymbol(LibGL, 'glVertex4sv');
+ @glVertexPointer := GetModuleSymbol(LibGL, 'glVertexPointer');
+ @glViewport := GetModuleSymbol(LibGL, 'glViewport');
+
+ {$IFDEF WINDOWS}
+ @ChoosePixelFormat := GetModuleSymbol(LibGL, 'ChoosePixelFormat');
+ if not Assigned(ChoosePixelFormat) then
+ {$IFNDEF FPC}@{$ENDIF}ChoosePixelFormat := @Windows.ChoosePixelFormat;
+ {$ENDIF}
+ end;
+end;
+
+initialization
+ {$ifdef x86}
+ Set8087CW($133F);
+ {$endif x86}
+
+ LoadOpenGL( GLLibName );
+
+finalization
+
+ FreeOpenGL;
+
+end.
+
diff --git a/Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/glext.pas b/Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/glext.pas
new file mode 100644
index 00000000..835c1703
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/glext.pas
@@ -0,0 +1,9578 @@
+unit glext;
+{
+ $Id: glext.pas,v 1.6 2007/05/20 20:28:31 savage Exp $
+
+}
+(**************************************************
+ * OpenGL extension loading library *
+ * Generated by MetaGLext, written by Tom Nuydens *
+ * (tom@delphi3d.net -- http://www.delphi3d.net *
+ **************************************************)
+
+{
+ $Log: glext.pas,v $
+ Revision 1.6 2007/05/20 20:28:31 savage
+ Initial Changes to Handle 64 Bits
+
+ Revision 1.5 2006/01/11 22:39:02 drellis
+ Updated to Support Up to OpenGL 2.0
+
+ Revision 1.4 2005/01/05 00:28:40 savage
+ Forgot to wrap a couple of Load_WGL function calls with an IFDEF WIN32. Fixed so now compiles under Linux as well.
+
+ Revision 1.3 2004/08/24 19:33:06 savage
+ Removed declarations of SDL_GL_GetProcAddress as the correct ones are in sdl.pas.
+
+ Revision 1.2 2004/08/09 00:38:01 savage
+ Updated to Tom's latest version. May contains bugs, but I hope not.
+
+ Revision 1.1 2004/03/30 21:53:54 savage
+ Moved to it's own folder.
+
+ Revision 1.6 2004/03/28 00:28:43 savage
+ Fixed some glSecondaryColor definitions...
+
+ Revision 1.5 2004/02/20 17:18:16 savage
+ Forgot to prefix function pointer with @ for FPC and other Pascal compilers.
+
+ Revision 1.4 2004/02/20 17:09:55 savage
+ Code tidied up in gl, glu and glut, while extensions in glext.pas are now loaded using SDL_GL_GetProcAddress, thus making it more cross-platform compatible, but now more tied to SDL.
+
+ Revision 1.3 2004/02/14 22:36:29 savage
+ Fixed inconsistencies of using LoadLibrary and LoadModule.
+ Now all units make use of LoadModule rather than LoadLibrary and other dynamic proc procedures.
+
+ Revision 1.2 2004/02/14 00:09:19 savage
+ Changed uses to now make use of moduleloader.pas rather than dllfuncs.pas
+
+ Revision 1.1 2004/02/05 00:08:19 savage
+ Module 1.0 release
+
+ Revision 1.7 2003/06/02 12:32:13 savage
+ Modified Sources to avoid warnings with Delphi by moving CVS Logging to the top of the header files. Hopefully CVS Logging still works.
+
+}
+
+interface
+
+{$I jedi-sdl.inc}
+
+uses
+ SysUtils,
+{$IFDEF __GPC__}
+ gpc,
+{$ENDIF}
+
+{$IFDEF WINDOWS}
+ Windows,
+{$ENDIF}
+ moduleloader,
+ gl;
+
+// Test if the given extension name is present in the given extension string.
+function glext_ExtensionSupported(const extension: PChar; const searchIn: PChar): Boolean;
+
+// Load a Specific Extension
+function glext_LoadExtension(ext: String): Boolean;
+// Some types that were introduced by extensions:
+type
+ GLintptrARB = Integer;
+ PGLintptrARB = ^GLintptrARB;
+
+ GLsizeiptrARB = Integer;
+ PGLsizeiptrARB = ^GLsizeiptrARB;
+
+ GLcharARB = Char;
+ PGLcharARB = ^GLcharARB;
+
+ GLhandleARB = Cardinal;
+ PGLhandleARB = ^GLhandleARB;
+
+ GLintptr = Integer;
+ PGLintptr = ^GLintptr;
+
+ GLsizeiptr = Integer;
+ PGLsizeiptr = ^GLsizeiptr;
+
+ GLchar = Char;
+ PGLchar = ^GLchar;
+
+//***** GL_version_1_2 *****//
+const
+ GL_UNSIGNED_BYTE_3_3_2 = $8032;
+ GL_UNSIGNED_SHORT_4_4_4_4 = $8033;
+ GL_UNSIGNED_SHORT_5_5_5_1 = $8034;
+ GL_UNSIGNED_INT_8_8_8_8 = $8035;
+ GL_UNSIGNED_INT_10_10_10_2 = $8036;
+ GL_RESCALE_NORMAL = $803A;
+ GL_UNSIGNED_BYTE_2_3_3_REV = $8362;
+ GL_UNSIGNED_SHORT_5_6_5 = $8363;
+ GL_UNSIGNED_SHORT_5_6_5_REV = $8364;
+ GL_UNSIGNED_SHORT_4_4_4_4_REV = $8365;
+ GL_UNSIGNED_SHORT_1_5_5_5_REV = $8366;
+ GL_UNSIGNED_INT_8_8_8_8_REV = $8367;
+ GL_UNSIGNED_INT_2_10_10_10_REV = $8368;
+ GL_BGR = $80E0;
+ GL_BGRA = $80E1;
+ GL_MAX_ELEMENTS_VERTICES = $80E8;
+ GL_MAX_ELEMENTS_INDICES = $80E9;
+ GL_CLAMP_TO_EDGE = $812F;
+ GL_TEXTURE_MIN_LOD = $813A;
+ GL_TEXTURE_MAX_LOD = $813B;
+ GL_TEXTURE_BASE_LEVEL = $813C;
+ GL_TEXTURE_MAX_LEVEL = $813D;
+ GL_LIGHT_MODEL_COLOR_CONTROL = $81F8;
+ GL_SINGLE_COLOR = $81F9;
+ GL_SEPARATE_SPECULAR_COLOR = $81FA;
+ GL_SMOOTH_POINT_SIZE_RANGE = $0B12;
+ GL_SMOOTH_POINT_SIZE_GRANULARITY = $0B13;
+ GL_SMOOTH_LINE_WIDTH_RANGE = $0B22;
+ GL_SMOOTH_LINE_WIDTH_GRANULARITY = $0B23;
+ GL_ALIASED_POINT_SIZE_RANGE = $846D;
+ GL_ALIASED_LINE_WIDTH_RANGE = $846E;
+ GL_PACK_SKIP_IMAGES = $806B;
+ GL_PACK_IMAGE_HEIGHT = $806C;
+ GL_UNPACK_SKIP_IMAGES = $806D;
+ GL_UNPACK_IMAGE_HEIGHT = $806E;
+ GL_TEXTURE_3D = $806F;
+ GL_PROXY_TEXTURE_3D = $8070;
+ GL_TEXTURE_DEPTH = $8071;
+ GL_TEXTURE_WRAP_R = $8072;
+ GL_MAX_3D_TEXTURE_SIZE = $8073;
+var
+ glDrawRangeElements: procedure(mode: GLenum; start: GLuint; _end: GLuint; count: GLsizei; _type: GLenum; const indices: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexImage3D: procedure(target: GLenum; level: GLint; internalformat: GLint; width: GLsizei; height: GLsizei; depth: GLsizei; border: GLint; format: GLenum; _type: GLenum; const pixels: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexSubImage3D: procedure(target: GLenum; level: GLint; xoffset: GLint; yoffset: GLint; zoffset: GLint; width: GLsizei; height: GLsizei; depth: GLsizei; format: GLenum; _type: GLenum; const pixels: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCopyTexSubImage3D: procedure(target: GLenum; level: GLint; xoffset: GLint; yoffset: GLint; zoffset: GLint; x: GLint; y: GLint; width: GLsizei; height: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_version_1_2: Boolean;
+
+//***** GL_ARB_imaging *****//
+const
+ GL_CONSTANT_COLOR = $8001;
+ GL_ONE_MINUS_CONSTANT_COLOR = $8002;
+ GL_CONSTANT_ALPHA = $8003;
+ GL_ONE_MINUS_CONSTANT_ALPHA = $8004;
+ GL_BLEND_COLOR = $8005;
+ GL_FUNC_ADD = $8006;
+ GL_MIN = $8007;
+ GL_MAX = $8008;
+ GL_BLEND_EQUATION = $8009;
+ GL_FUNC_SUBTRACT = $800A;
+ GL_FUNC_REVERSE_SUBTRACT = $800B;
+ GL_CONVOLUTION_1D = $8010;
+ GL_CONVOLUTION_2D = $8011;
+ GL_SEPARABLE_2D = $8012;
+ GL_CONVOLUTION_BORDER_MODE = $8013;
+ GL_CONVOLUTION_FILTER_SCALE = $8014;
+ GL_CONVOLUTION_FILTER_BIAS = $8015;
+ GL_REDUCE = $8016;
+ GL_CONVOLUTION_FORMAT = $8017;
+ GL_CONVOLUTION_WIDTH = $8018;
+ GL_CONVOLUTION_HEIGHT = $8019;
+ GL_MAX_CONVOLUTION_WIDTH = $801A;
+ GL_MAX_CONVOLUTION_HEIGHT = $801B;
+ GL_POST_CONVOLUTION_RED_SCALE = $801C;
+ GL_POST_CONVOLUTION_GREEN_SCALE = $801D;
+ GL_POST_CONVOLUTION_BLUE_SCALE = $801E;
+ GL_POST_CONVOLUTION_ALPHA_SCALE = $801F;
+ GL_POST_CONVOLUTION_RED_BIAS = $8020;
+ GL_POST_CONVOLUTION_GREEN_BIAS = $8021;
+ GL_POST_CONVOLUTION_BLUE_BIAS = $8022;
+ GL_POST_CONVOLUTION_ALPHA_BIAS = $8023;
+ GL_HISTOGRAM = $8024;
+ GL_PROXY_HISTOGRAM = $8025;
+ GL_HISTOGRAM_WIDTH = $8026;
+ GL_HISTOGRAM_FORMAT = $8027;
+ GL_HISTOGRAM_RED_SIZE = $8028;
+ GL_HISTOGRAM_GREEN_SIZE = $8029;
+ GL_HISTOGRAM_BLUE_SIZE = $802A;
+ GL_HISTOGRAM_ALPHA_SIZE = $802B;
+ GL_HISTOGRAM_LUMINANCE_SIZE = $802C;
+ GL_HISTOGRAM_SINK = $802D;
+ GL_MINMAX = $802E;
+ GL_MINMAX_FORMAT = $802F;
+ GL_MINMAX_SINK = $8030;
+ GL_TABLE_TOO_LARGE = $8031;
+ GL_COLOR_MATRIX = $80B1;
+ GL_COLOR_MATRIX_STACK_DEPTH = $80B2;
+ GL_MAX_COLOR_MATRIX_STACK_DEPTH = $80B3;
+ GL_POST_COLOR_MATRIX_RED_SCALE = $80B4;
+ GL_POST_COLOR_MATRIX_GREEN_SCALE = $80B5;
+ GL_POST_COLOR_MATRIX_BLUE_SCALE = $80B6;
+ GL_POST_COLOR_MATRIX_ALPHA_SCALE = $80B7;
+ GL_POST_COLOR_MATRIX_RED_BIAS = $80B8;
+ GL_POST_COLOR_MATRIX_GREEN_BIAS = $80B9;
+ GL_POST_COLOR_MATRIX_BLUE_BIAS = $80BA;
+ GL_POST_COLOR_MATIX_ALPHA_BIAS = $80BB;
+ GL_COLOR_TABLE = $80D0;
+ GL_POST_CONVOLUTION_COLOR_TABLE = $80D1;
+ GL_POST_COLOR_MATRIX_COLOR_TABLE = $80D2;
+ GL_PROXY_COLOR_TABLE = $80D3;
+ GL_PROXY_POST_CONVOLUTION_COLOR_TABLE = $80D4;
+ GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE = $80D5;
+ GL_COLOR_TABLE_SCALE = $80D6;
+ GL_COLOR_TABLE_BIAS = $80D7;
+ GL_COLOR_TABLE_FORMAT = $80D8;
+ GL_COLOR_TABLE_WIDTH = $80D9;
+ GL_COLOR_TABLE_RED_SIZE = $80DA;
+ GL_COLOR_TABLE_GREEN_SIZE = $80DB;
+ GL_COLOR_TABLE_BLUE_SIZE = $80DC;
+ GL_COLOR_TABLE_ALPHA_SIZE = $80DD;
+ GL_COLOR_TABLE_LUMINANCE_SIZE = $80DE;
+ GL_COLOR_TABLE_INTENSITY_SIZE = $80DF;
+ GL_IGNORE_BORDER = $8150;
+ GL_CONSTANT_BORDER = $8151;
+ GL_WRAP_BORDER = $8152;
+ GL_REPLICATE_BORDER = $8153;
+ GL_CONVOLUTION_BORDER_COLOR = $8154;
+var
+ glColorTable: procedure(target: GLenum; internalformat: GLenum; width: GLsizei; format: GLenum; _type: GLenum; const table: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColorTableParameterfv: procedure(target: GLenum; pname: GLenum; const params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColorTableParameteriv: procedure(target: GLenum; pname: GLenum; const params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCopyColorTable: procedure(target: GLenum; internalformat: GLenum; x: GLint; y: GLint; width: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetColorTable: procedure(target: GLenum; format: GLenum; _type: GLenum; table: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetColorTableParameterfv: procedure(target: GLenum; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetColorTableParameteriv: procedure(target: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColorSubTable: procedure(target: GLenum; start: GLsizei; count: GLsizei; format: GLenum; _type: GLenum; const data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCopyColorSubTable: procedure(target: GLenum; start: GLsizei; x: GLint; y: GLint; width: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glConvolutionFilter1D: procedure(target: GLenum; internalformat: GLenum; width: GLsizei; format: GLenum; _type: GLenum; const image: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glConvolutionFilter2D: procedure(target: GLenum; internalformat: GLenum; width: GLsizei; height: GLsizei; format: GLenum; _type: GLenum; const image: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glConvolutionParameterf: procedure(target: GLenum; pname: GLenum; params: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glConvolutionParameterfv: procedure(target: GLenum; pname: GLenum; const params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glConvolutionParameteri: procedure(target: GLenum; pname: GLenum; params: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glConvolutionParameteriv: procedure(target: GLenum; pname: GLenum; const params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCopyConvolutionFilter1D: procedure(target: GLenum; internalformat: GLenum; x: GLint; y: GLint; width: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCopyConvolutionFilter2D: procedure(target: GLenum; internalformat: GLenum; x: GLint; y: GLint; width: GLsizei; height: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetConvolutionFilter: procedure(target: GLenum; format: GLenum; _type: GLenum; image: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetConvolutionParameterfv: procedure(target: GLenum; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetConvolutionParameteriv: procedure(target: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetSeparableFilter: procedure(target: GLenum; format: GLenum; _type: GLenum; row: PGLvoid; column: PGLvoid; span: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSeparableFilter2D: procedure(target: GLenum; internalformat: GLenum; width: GLsizei; height: GLsizei; format: GLenum; _type: GLenum; const row: PGLvoid; const column: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetHistogram: procedure(target: GLenum; reset: GLboolean; format: GLenum; _type: GLenum; values: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetHistogramParameterfv: procedure(target: GLenum; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetHistogramParameteriv: procedure(target: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetMinmax: procedure(target: GLenum; reset: GLboolean; format: GLenum; _type: GLenum; values: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetMinmaxParameterfv: procedure(target: GLenum; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetMinmaxParameteriv: procedure(target: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glHistogram: procedure(target: GLenum; width: GLsizei; internalformat: GLenum; sink: GLboolean); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMinmax: procedure(target: GLenum; internalformat: GLenum; sink: GLboolean); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glResetHistogram: procedure(target: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glResetMinmax: procedure(target: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBlendEquation: procedure(mode: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBlendColor: procedure(red: GLclampf; green: GLclampf; blue: GLclampf; alpha: GLclampf); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ARB_imaging: Boolean;
+
+//***** GL_version_1_3 *****//
+const
+ GL_TEXTURE0 = $84C0;
+ GL_TEXTURE1 = $84C1;
+ GL_TEXTURE2 = $84C2;
+ GL_TEXTURE3 = $84C3;
+ GL_TEXTURE4 = $84C4;
+ GL_TEXTURE5 = $84C5;
+ GL_TEXTURE6 = $84C6;
+ GL_TEXTURE7 = $84C7;
+ GL_TEXTURE8 = $84C8;
+ GL_TEXTURE9 = $84C9;
+ GL_TEXTURE10 = $84CA;
+ GL_TEXTURE11 = $84CB;
+ GL_TEXTURE12 = $84CC;
+ GL_TEXTURE13 = $84CD;
+ GL_TEXTURE14 = $84CE;
+ GL_TEXTURE15 = $84CF;
+ GL_TEXTURE16 = $84D0;
+ GL_TEXTURE17 = $84D1;
+ GL_TEXTURE18 = $84D2;
+ GL_TEXTURE19 = $84D3;
+ GL_TEXTURE20 = $84D4;
+ GL_TEXTURE21 = $84D5;
+ GL_TEXTURE22 = $84D6;
+ GL_TEXTURE23 = $84D7;
+ GL_TEXTURE24 = $84D8;
+ GL_TEXTURE25 = $84D9;
+ GL_TEXTURE26 = $84DA;
+ GL_TEXTURE27 = $84DB;
+ GL_TEXTURE28 = $84DC;
+ GL_TEXTURE29 = $84DD;
+ GL_TEXTURE30 = $84DE;
+ GL_TEXTURE31 = $84DF;
+ GL_ACTIVE_TEXTURE = $84E0;
+ GL_CLIENT_ACTIVE_TEXTURE = $84E1;
+ GL_MAX_TEXTURE_UNITS = $84E2;
+ GL_TRANSPOSE_MODELVIEW_MATRIX = $84E3;
+ GL_TRANSPOSE_PROJECTION_MATRIX = $84E4;
+ GL_TRANSPOSE_TEXTURE_MATRIX = $84E5;
+ GL_TRANSPOSE_COLOR_MATRIX = $84E6;
+ GL_MULTISAMPLE = $809D;
+ GL_SAMPLE_ALPHA_TO_COVERAGE = $809E;
+ GL_SAMPLE_ALPHA_TO_ONE = $809F;
+ GL_SAMPLE_COVERAGE = $80A0;
+ GL_SAMPLE_BUFFERS = $80A8;
+ GL_SAMPLES = $80A9;
+ GL_SAMPLE_COVERAGE_VALUE = $80AA;
+ GL_SAMPLE_COVERAGE_INVERT = $80AB;
+ GL_MULTISAMPLE_BIT = $20000000;
+ GL_NORMAL_MAP = $8511;
+ GL_REFLECTION_MAP = $8512;
+ GL_TEXTURE_CUBE_MAP = $8513;
+ GL_TEXTURE_BINDING_CUBE_MAP = $8514;
+ GL_TEXTURE_CUBE_MAP_POSITIVE_X = $8515;
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_X = $8516;
+ GL_TEXTURE_CUBE_MAP_POSITIVE_Y = $8517;
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y = $8518;
+ GL_TEXTURE_CUBE_MAP_POSITIVE_Z = $8519;
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z = $851A;
+ GL_PROXY_TEXTURE_CUBE_MAP = $851B;
+ GL_MAX_CUBE_MAP_TEXTURE_SIZE = $851C;
+ GL_COMPRESSED_ALPHA = $84E9;
+ GL_COMPRESSED_LUMINANCE = $84EA;
+ GL_COMPRESSED_LUMINANCE_ALPHA = $84EB;
+ GL_COMPRESSED_INTENSITY = $84EC;
+ GL_COMPRESSED_RGB = $84ED;
+ GL_COMPRESSED_RGBA = $84EE;
+ GL_TEXTURE_COMPRESSION_HINT = $84EF;
+ GL_TEXTURE_COMPRESSED_IMAGE_SIZE = $86A0;
+ GL_TEXTURE_COMPRESSED = $86A1;
+ GL_NUM_COMPRESSED_TEXTURE_FORMATS = $86A2;
+ GL_COMPRESSED_TEXTURE_FORMATS = $86A3;
+ GL_CLAMP_TO_BORDER = $812D;
+ GL_CLAMP_TO_BORDER_SGIS = $812D;
+ GL_COMBINE = $8570;
+ GL_COMBINE_RGB = $8571;
+ GL_COMBINE_ALPHA = $8572;
+ GL_SOURCE0_RGB = $8580;
+ GL_SOURCE1_RGB = $8581;
+ GL_SOURCE2_RGB = $8582;
+ GL_SOURCE0_ALPHA = $8588;
+ GL_SOURCE1_ALPHA = $8589;
+ GL_SOURCE2_ALPHA = $858A;
+ GL_OPERAND0_RGB = $8590;
+ GL_OPERAND1_RGB = $8591;
+ GL_OPERAND2_RGB = $8592;
+ GL_OPERAND0_ALPHA = $8598;
+ GL_OPERAND1_ALPHA = $8599;
+ GL_OPERAND2_ALPHA = $859A;
+ GL_RGB_SCALE = $8573;
+ GL_ADD_SIGNED = $8574;
+ GL_INTERPOLATE = $8575;
+ GL_SUBTRACT = $84E7;
+ GL_CONSTANT = $8576;
+ GL_PRIMARY_COLOR = $8577;
+ GL_PREVIOUS = $8578;
+ GL_DOT3_RGB = $86AE;
+ GL_DOT3_RGBA = $86AF;
+var
+ glActiveTexture: procedure(texture: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glClientActiveTexture: procedure(texture: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord1d: procedure(target: GLenum; s: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord1dv: procedure(target: GLenum; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord1f: procedure(target: GLenum; s: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord1fv: procedure(target: GLenum; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord1i: procedure(target: GLenum; s: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord1iv: procedure(target: GLenum; const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord1s: procedure(target: GLenum; s: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord1sv: procedure(target: GLenum; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord2d: procedure(target: GLenum; s: GLdouble; t: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord2dv: procedure(target: GLenum; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord2f: procedure(target: GLenum; s: GLfloat; t: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord2fv: procedure(target: GLenum; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord2i: procedure(target: GLenum; s: GLint; t: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord2iv: procedure(target: GLenum; const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord2s: procedure(target: GLenum; s: GLshort; t: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord2sv: procedure(target: GLenum; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord3d: procedure(target: GLenum; s: GLdouble; t: GLdouble; r: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord3dv: procedure(target: GLenum; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord3f: procedure(target: GLenum; s: GLfloat; t: GLfloat; r: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord3fv: procedure(target: GLenum; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord3i: procedure(target: GLenum; s: GLint; t: GLint; r: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord3iv: procedure(target: GLenum; const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord3s: procedure(target: GLenum; s: GLshort; t: GLshort; r: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord3sv: procedure(target: GLenum; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord4d: procedure(target: GLenum; s: GLdouble; t: GLdouble; r: GLdouble; q: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord4dv: procedure(target: GLenum; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord4f: procedure(target: GLenum; s: GLfloat; t: GLfloat; r: GLfloat; q: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord4fv: procedure(target: GLenum; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord4i: procedure(target: GLenum; s: GLint; t: GLint; r: GLint; q: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord4iv: procedure(target: GLenum; const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord4s: procedure(target: GLenum; s: GLshort; t: GLshort; r: GLshort; q: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord4sv: procedure(target: GLenum; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLoadTransposeMatrixf: procedure(const m: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLoadTransposeMatrixd: procedure(const m: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultTransposeMatrixf: procedure(const m: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultTransposeMatrixd: procedure(const m: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSampleCoverage: procedure(value: GLclampf; invert: GLboolean); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCompressedTexImage3D: procedure(target: GLenum; level: GLint; internalformat: GLenum; width: GLsizei; height: GLsizei; depth: GLsizei; border: GLint; imageSize: GLsizei; const data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCompressedTexImage2D: procedure(target: GLenum; level: GLint; internalformat: GLenum; width: GLsizei; height: GLsizei; border: GLint; imageSize: GLsizei; const data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCompressedTexImage1D: procedure(target: GLenum; level: GLint; internalformat: GLenum; width: GLsizei; border: GLint; imageSize: GLsizei; const data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCompressedTexSubImage3D: procedure(target: GLenum; level: GLint; xoffset: GLint; yoffset: GLint; zoffset: GLint; width: GLsizei; height: GLsizei; depth: GLsizei; format: GLenum; imageSize: GLsizei; const data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCompressedTexSubImage2D: procedure(target: GLenum; level: GLint; xoffset: GLint; yoffset: GLint; width: GLsizei; height: GLsizei; format: GLenum; imageSize: GLsizei; const data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCompressedTexSubImage1D: procedure(target: GLenum; level: GLint; xoffset: GLint; width: GLsizei; format: GLenum; imageSize: GLsizei; const data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetCompressedTexImage: procedure(target: GLenum; level: GLint; img: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_version_1_3: Boolean;
+
+//***** GL_ARB_multitexture *****//
+const
+ GL_TEXTURE0_ARB = $84C0;
+ GL_TEXTURE1_ARB = $84C1;
+ GL_TEXTURE2_ARB = $84C2;
+ GL_TEXTURE3_ARB = $84C3;
+ GL_TEXTURE4_ARB = $84C4;
+ GL_TEXTURE5_ARB = $84C5;
+ GL_TEXTURE6_ARB = $84C6;
+ GL_TEXTURE7_ARB = $84C7;
+ GL_TEXTURE8_ARB = $84C8;
+ GL_TEXTURE9_ARB = $84C9;
+ GL_TEXTURE10_ARB = $84CA;
+ GL_TEXTURE11_ARB = $84CB;
+ GL_TEXTURE12_ARB = $84CC;
+ GL_TEXTURE13_ARB = $84CD;
+ GL_TEXTURE14_ARB = $84CE;
+ GL_TEXTURE15_ARB = $84CF;
+ GL_TEXTURE16_ARB = $84D0;
+ GL_TEXTURE17_ARB = $84D1;
+ GL_TEXTURE18_ARB = $84D2;
+ GL_TEXTURE19_ARB = $84D3;
+ GL_TEXTURE20_ARB = $84D4;
+ GL_TEXTURE21_ARB = $84D5;
+ GL_TEXTURE22_ARB = $84D6;
+ GL_TEXTURE23_ARB = $84D7;
+ GL_TEXTURE24_ARB = $84D8;
+ GL_TEXTURE25_ARB = $84D9;
+ GL_TEXTURE26_ARB = $84DA;
+ GL_TEXTURE27_ARB = $84DB;
+ GL_TEXTURE28_ARB = $84DC;
+ GL_TEXTURE29_ARB = $84DD;
+ GL_TEXTURE30_ARB = $84DE;
+ GL_TEXTURE31_ARB = $84DF;
+ GL_ACTIVE_TEXTURE_ARB = $84E0;
+ GL_CLIENT_ACTIVE_TEXTURE_ARB = $84E1;
+ GL_MAX_TEXTURE_UNITS_ARB = $84E2;
+var
+ glActiveTextureARB: procedure(texture: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glClientActiveTextureARB: procedure(texture: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord1dARB: procedure(target: GLenum; s: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord1dvARB: procedure(target: GLenum; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord1fARB: procedure(target: GLenum; s: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord1fvARB: procedure(target: GLenum; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord1iARB: procedure(target: GLenum; s: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord1ivARB: procedure(target: GLenum; const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord1sARB: procedure(target: GLenum; s: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord1svARB: procedure(target: GLenum; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord2dARB: procedure(target: GLenum; s: GLdouble; t: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord2dvARB: procedure(target: GLenum; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord2fARB: procedure(target: GLenum; s: GLfloat; t: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord2fvARB: procedure(target: GLenum; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord2iARB: procedure(target: GLenum; s: GLint; t: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord2ivARB: procedure(target: GLenum; const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord2sARB: procedure(target: GLenum; s: GLshort; t: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord2svARB: procedure(target: GLenum; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord3dARB: procedure(target: GLenum; s: GLdouble; t: GLdouble; r: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord3dvARB: procedure(target: GLenum; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord3fARB: procedure(target: GLenum; s: GLfloat; t: GLfloat; r: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord3fvARB: procedure(target: GLenum; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord3iARB: procedure(target: GLenum; s: GLint; t: GLint; r: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord3ivARB: procedure(target: GLenum; const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord3sARB: procedure(target: GLenum; s: GLshort; t: GLshort; r: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord3svARB: procedure(target: GLenum; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord4dARB: procedure(target: GLenum; s: GLdouble; t: GLdouble; r: GLdouble; q: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord4dvARB: procedure(target: GLenum; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord4fARB: procedure(target: GLenum; s: GLfloat; t: GLfloat; r: GLfloat; q: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord4fvARB: procedure(target: GLenum; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord4iARB: procedure(target: GLenum; s: GLint; t: GLint; r: GLint; q: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord4ivARB: procedure(target: GLenum; const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord4sARB: procedure(target: GLenum; s: GLshort; t: GLshort; r: GLshort; q: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord4svARB: procedure(target: GLenum; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ARB_multitexture: Boolean;
+
+//***** GL_ARB_transpose_matrix *****//
+const
+ GL_TRANSPOSE_MODELVIEW_MATRIX_ARB = $84E3;
+ GL_TRANSPOSE_PROJECTION_MATRIX_ARB = $84E4;
+ GL_TRANSPOSE_TEXTURE_MATRIX_ARB = $84E5;
+ GL_TRANSPOSE_COLOR_MATRIX_ARB = $84E6;
+var
+ glLoadTransposeMatrixfARB: procedure(m: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLoadTransposeMatrixdARB: procedure(m: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultTransposeMatrixfARB: procedure(m: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultTransposeMatrixdARB: procedure(m: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ARB_transpose_matrix: Boolean;
+
+//***** GL_ARB_multisample *****//
+const
+ WGL_SAMPLE_BUFFERS_ARB = $2041;
+ WGL_SAMPLES_ARB = $2042;
+ GL_MULTISAMPLE_ARB = $809D;
+ GL_SAMPLE_ALPHA_TO_COVERAGE_ARB = $809E;
+ GL_SAMPLE_ALPHA_TO_ONE_ARB = $809F;
+ GL_SAMPLE_COVERAGE_ARB = $80A0;
+ GL_MULTISAMPLE_BIT_ARB = $20000000;
+ GL_SAMPLE_BUFFERS_ARB = $80A8;
+ GL_SAMPLES_ARB = $80A9;
+ GL_SAMPLE_COVERAGE_VALUE_ARB = $80AA;
+ GL_SAMPLE_COVERAGE_INVERT_ARB = $80AB;
+var
+ glSampleCoverageARB: procedure(value: GLclampf; invert: GLboolean); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ARB_multisample: Boolean;
+
+//***** GL_ARB_texture_env_add *****//
+
+function Load_GL_ARB_texture_env_add: Boolean;
+
+{$IFDEF WINDOWS}
+//***** WGL_ARB_extensions_string *****//
+var
+ wglGetExtensionsStringARB: function(hdc: HDC): Pchar; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_WGL_ARB_extensions_string: Boolean;
+
+//***** WGL_ARB_buffer_region *****//
+const
+ WGL_FRONT_COLOR_BUFFER_BIT_ARB = $0001;
+ WGL_BACK_COLOR_BUFFER_BIT_ARB = $0002;
+ WGL_DEPTH_BUFFER_BIT_ARB = $0004;
+ WGL_STENCIL_BUFFER_BIT_ARB = $0008;
+var
+ wglCreateBufferRegionARB: function(hDC: HDC; iLayerPlane: GLint; uType: GLuint): THandle; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglDeleteBufferRegionARB: procedure(hRegion: THandle); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglSaveBufferRegionARB: function(hRegion: THandle; x: GLint; y: GLint; width: GLint; height: GLint): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglRestoreBufferRegionARB: function(hRegion: THandle; x: GLint; y: GLint; width: GLint; height: GLint; xSrc: GLint; ySrc: GLint): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_WGL_ARB_buffer_region: Boolean;
+{$ENDIF}
+
+//***** GL_ARB_texture_cube_map *****//
+const
+ GL_NORMAL_MAP_ARB = $8511;
+ GL_REFLECTION_MAP_ARB = $8512;
+ GL_TEXTURE_CUBE_MAP_ARB = $8513;
+ GL_TEXTURE_BINDING_CUBE_MAP_ARB = $8514;
+ GL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB = $8515;
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB = $8516;
+ GL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB = $8517;
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB = $8518;
+ GL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB = $8519;
+ GL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB = $851A;
+ GL_PROXY_TEXTURE_CUBE_MAP_ARB = $851B;
+ GL_MAX_CUBE_MAP_TEXTURE_SIZE_ARB = $851C;
+
+function Load_GL_ARB_texture_cube_map: Boolean;
+
+//***** GL_ARB_depth_texture *****//
+const
+ GL_DEPTH_COMPONENT16_ARB = $81A5;
+ GL_DEPTH_COMPONENT24_ARB = $81A6;
+ GL_DEPTH_COMPONENT32_ARB = $81A7;
+ GL_TEXTURE_DEPTH_SIZE_ARB = $884A;
+ GL_DEPTH_TEXTURE_MODE_ARB = $884B;
+
+function Load_GL_ARB_depth_texture: Boolean;
+
+//***** GL_ARB_point_parameters *****//
+const
+ GL_POINT_SIZE_MIN_ARB = $8126;
+ GL_POINT_SIZE_MAX_ARB = $8127;
+ GL_POINT_FADE_THRESHOLD_SIZE_ARB = $8128;
+ GL_POINT_DISTANCE_ATTENUATION_ARB = $8129;
+var
+ glPointParameterfARB: procedure(pname: GLenum; param: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPointParameterfvARB: procedure(pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ARB_point_parameters: Boolean;
+
+//***** GL_ARB_shadow *****//
+const
+ GL_TEXTURE_COMPARE_MODE_ARB = $884C;
+ GL_TEXTURE_COMPARE_FUNC_ARB = $884D;
+ GL_COMPARE_R_TO_TEXTURE_ARB = $884E;
+
+function Load_GL_ARB_shadow: Boolean;
+
+//***** GL_ARB_shadow_ambient *****//
+const
+ GL_TEXTURE_COMPARE_FAIL_VALUE_ARB = $80BF;
+
+function Load_GL_ARB_shadow_ambient: Boolean;
+
+//***** GL_ARB_texture_border_clamp *****//
+const
+ GL_CLAMP_TO_BORDER_ARB = $812D;
+
+function Load_GL_ARB_texture_border_clamp: Boolean;
+
+//***** GL_ARB_texture_compression *****//
+const
+ GL_COMPRESSED_ALPHA_ARB = $84E9;
+ GL_COMPRESSED_LUMINANCE_ARB = $84EA;
+ GL_COMPRESSED_LUMINANCE_ALPHA_ARB = $84EB;
+ GL_COMPRESSED_INTENSITY_ARB = $84EC;
+ GL_COMPRESSED_RGB_ARB = $84ED;
+ GL_COMPRESSED_RGBA_ARB = $84EE;
+ GL_TEXTURE_COMPRESSION_HINT_ARB = $84EF;
+ GL_TEXTURE_COMPRESSED_IMAGE_SIZE_ARB = $86A0;
+ GL_TEXTURE_COMPRESSED_ARB = $86A1;
+ GL_NUM_COMPRESSED_TEXTURE_FORMATS_ARB = $86A2;
+ GL_COMPRESSED_TEXTURE_FORMATS_ARB = $86A3;
+var
+ glCompressedTexImage3DARB: procedure(target: GLenum; level: GLint; internalformat: GLenum; width: GLsizei; height: GLsizei; depth: GLsizei; border: GLint; imageSize: GLsizei; const data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCompressedTexImage2DARB: procedure(target: GLenum; level: GLint; internalformat: GLenum; width: GLsizei; height: GLsizei; border: GLint; imageSize: GLsizei; const data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCompressedTexImage1DARB: procedure(target: GLenum; level: GLint; internalformat: GLenum; width: GLsizei; border: GLint; imageSize: GLsizei; const data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCompressedTexSubImage3DARB: procedure(target: GLenum; level: GLint; xoffset: GLint; yoffset: GLint; zoffset: GLint; width: GLsizei; height: GLsizei; depth: GLsizei; format: GLenum; imageSize: GLsizei; const data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCompressedTexSubImage2DARB: procedure(target: GLenum; level: GLint; xoffset: GLint; yoffset: GLint; width: GLsizei; height: GLsizei; format: GLenum; imageSize: GLsizei; const data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCompressedTexSubImage1DARB: procedure(target: GLenum; level: GLint; xoffset: GLint; width: GLsizei; format: GLenum; imageSize: GLsizei; const data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetCompressedTexImageARB: procedure(target: GLenum; lod: GLint; img: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ARB_texture_compression: Boolean;
+
+//***** GL_ARB_texture_env_combine *****//
+const
+ GL_COMBINE_ARB = $8570;
+ GL_COMBINE_RGB_ARB = $8571;
+ GL_COMBINE_ALPHA_ARB = $8572;
+ GL_SOURCE0_RGB_ARB = $8580;
+ GL_SOURCE1_RGB_ARB = $8581;
+ GL_SOURCE2_RGB_ARB = $8582;
+ GL_SOURCE0_ALPHA_ARB = $8588;
+ GL_SOURCE1_ALPHA_ARB = $8589;
+ GL_SOURCE2_ALPHA_ARB = $858A;
+ GL_OPERAND0_RGB_ARB = $8590;
+ GL_OPERAND1_RGB_ARB = $8591;
+ GL_OPERAND2_RGB_ARB = $8592;
+ GL_OPERAND0_ALPHA_ARB = $8598;
+ GL_OPERAND1_ALPHA_ARB = $8599;
+ GL_OPERAND2_ALPHA_ARB = $859A;
+ GL_RGB_SCALE_ARB = $8573;
+ GL_ADD_SIGNED_ARB = $8574;
+ GL_INTERPOLATE_ARB = $8575;
+ GL_SUBTRACT_ARB = $84E7;
+ GL_CONSTANT_ARB = $8576;
+ GL_PRIMARY_COLOR_ARB = $8577;
+ GL_PREVIOUS_ARB = $8578;
+
+function Load_GL_ARB_texture_env_combine: Boolean;
+
+//***** GL_ARB_texture_env_crossbar *****//
+
+function Load_GL_ARB_texture_env_crossbar: Boolean;
+
+//***** GL_ARB_texture_env_dot3 *****//
+const
+ GL_DOT3_RGB_ARB = $86AE;
+ GL_DOT3_RGBA_ARB = $86AF;
+
+function Load_GL_ARB_texture_env_dot3: Boolean;
+
+//***** GL_ARB_texture_mirrored_repeat *****//
+const
+ GL_MIRRORED_REPEAT_ARB = $8370;
+
+function Load_GL_ARB_texture_mirrored_repeat: Boolean;
+
+//***** GL_ARB_vertex_blend *****//
+const
+ GL_MAX_VERTEX_UNITS_ARB = $86A4;
+ GL_ACTIVE_VERTEX_UNITS_ARB = $86A5;
+ GL_WEIGHT_SUM_UNITY_ARB = $86A6;
+ GL_VERTEX_BLEND_ARB = $86A7;
+ GL_MODELVIEW0_ARB = $1700;
+ GL_MODELVIEW1_ARB = $850A;
+ GL_MODELVIEW2_ARB = $8722;
+ GL_MODELVIEW3_ARB = $8723;
+ GL_MODELVIEW4_ARB = $8724;
+ GL_MODELVIEW5_ARB = $8725;
+ GL_MODELVIEW6_ARB = $8726;
+ GL_MODELVIEW7_ARB = $8727;
+ GL_MODELVIEW8_ARB = $8728;
+ GL_MODELVIEW9_ARB = $8729;
+ GL_MODELVIEW10_ARB = $872A;
+ GL_MODELVIEW11_ARB = $872B;
+ GL_MODELVIEW12_ARB = $872C;
+ GL_MODELVIEW13_ARB = $872D;
+ GL_MODELVIEW14_ARB = $872E;
+ GL_MODELVIEW15_ARB = $872F;
+ GL_MODELVIEW16_ARB = $8730;
+ GL_MODELVIEW17_ARB = $8731;
+ GL_MODELVIEW18_ARB = $8732;
+ GL_MODELVIEW19_ARB = $8733;
+ GL_MODELVIEW20_ARB = $8734;
+ GL_MODELVIEW21_ARB = $8735;
+ GL_MODELVIEW22_ARB = $8736;
+ GL_MODELVIEW23_ARB = $8737;
+ GL_MODELVIEW24_ARB = $8738;
+ GL_MODELVIEW25_ARB = $8739;
+ GL_MODELVIEW26_ARB = $873A;
+ GL_MODELVIEW27_ARB = $873B;
+ GL_MODELVIEW28_ARB = $873C;
+ GL_MODELVIEW29_ARB = $873D;
+ GL_MODELVIEW30_ARB = $873E;
+ GL_MODELVIEW31_ARB = $873F;
+ GL_CURRENT_WEIGHT_ARB = $86A8;
+ GL_WEIGHT_ARRAY_TYPE_ARB = $86A9;
+ GL_WEIGHT_ARRAY_STRIDE_ARB = $86AA;
+ GL_WEIGHT_ARRAY_SIZE_ARB = $86AB;
+ GL_WEIGHT_ARRAY_POINTER_ARB = $86AC;
+ GL_WEIGHT_ARRAY_ARB = $86AD;
+var
+ glWeightbvARB: procedure(size: GLint; weights: PGLbyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWeightsvARB: procedure(size: GLint; weights: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWeightivARB: procedure(size: GLint; weights: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWeightfvARB: procedure(size: GLint; weights: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWeightdvARB: procedure(size: GLint; weights: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWeightvARB: procedure(size: GLint; weights: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWeightubvARB: procedure(size: GLint; weights: PGLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWeightusvARB: procedure(size: GLint; weights: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWeightuivARB: procedure(size: GLint; weights: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWeightPointerARB: procedure(size: GLint; _type: GLenum; stride: GLsizei; pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexBlendARB: procedure(count: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ARB_vertex_blend: Boolean;
+
+//***** GL_ARB_vertex_program *****//
+const
+ GL_VERTEX_PROGRAM_ARB = $8620;
+ GL_VERTEX_PROGRAM_POINT_SIZE_ARB = $8642;
+ GL_VERTEX_PROGRAM_TWO_SIDE_ARB = $8643;
+ GL_COLOR_SUM_ARB = $8458;
+ GL_PROGRAM_FORMAT_ASCII_ARB = $8875;
+ GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB = $8622;
+ GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB = $8623;
+ GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB = $8624;
+ GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB = $8625;
+ GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB = $886A;
+ GL_CURRENT_VERTEX_ATTRIB_ARB = $8626;
+ GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB = $8645;
+ GL_PROGRAM_LENGTH_ARB = $8627;
+ GL_PROGRAM_FORMAT_ARB = $8876;
+ GL_PROGRAM_BINDING_ARB = $8677;
+ GL_PROGRAM_INSTRUCTIONS_ARB = $88A0;
+ GL_MAX_PROGRAM_INSTRUCTIONS_ARB = $88A1;
+ GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB = $88A2;
+ GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB = $88A3;
+ GL_PROGRAM_TEMPORARIES_ARB = $88A4;
+ GL_MAX_PROGRAM_TEMPORARIES_ARB = $88A5;
+ GL_PROGRAM_NATIVE_TEMPORARIES_ARB = $88A6;
+ GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB = $88A7;
+ GL_PROGRAM_PARAMETERS_ARB = $88A8;
+ GL_MAX_PROGRAM_PARAMETERS_ARB = $88A9;
+ GL_PROGRAM_NATIVE_PARAMETERS_ARB = $88AA;
+ GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB = $88AB;
+ GL_PROGRAM_ATTRIBS_ARB = $88AC;
+ GL_MAX_PROGRAM_ATTRIBS_ARB = $88AD;
+ GL_PROGRAM_NATIVE_ATTRIBS_ARB = $88AE;
+ GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB = $88AF;
+ GL_PROGRAM_ADDRESS_REGISTERS_ARB = $88B0;
+ GL_MAX_PROGRAM_ADDRESS_REGISTERS_ARB = $88B1;
+ GL_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB = $88B2;
+ GL_MAX_PROGRAM_NATIVE_ADDRESS_REGISTERS_ARB = $88B3;
+ GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB = $88B4;
+ GL_MAX_PROGRAM_ENV_PARAMETERS_ARB = $88B5;
+ GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB = $88B6;
+ GL_PROGRAM_STRING_ARB = $8628;
+ GL_PROGRAM_ERROR_POSITION_ARB = $864B;
+ GL_CURRENT_MATRIX_ARB = $8641;
+ GL_TRANSPOSE_CURRENT_MATRIX_ARB = $88B7;
+ GL_CURRENT_MATRIX_STACK_DEPTH_ARB = $8640;
+ GL_MAX_VERTEX_ATTRIBS_ARB = $8869;
+ GL_MAX_PROGRAM_MATRICES_ARB = $862F;
+ GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB = $862E;
+ GL_PROGRAM_ERROR_STRING_ARB = $8874;
+ GL_MATRIX0_ARB = $88C0;
+ GL_MATRIX1_ARB = $88C1;
+ GL_MATRIX2_ARB = $88C2;
+ GL_MATRIX3_ARB = $88C3;
+ GL_MATRIX4_ARB = $88C4;
+ GL_MATRIX5_ARB = $88C5;
+ GL_MATRIX6_ARB = $88C6;
+ GL_MATRIX7_ARB = $88C7;
+ GL_MATRIX8_ARB = $88C8;
+ GL_MATRIX9_ARB = $88C9;
+ GL_MATRIX10_ARB = $88CA;
+ GL_MATRIX11_ARB = $88CB;
+ GL_MATRIX12_ARB = $88CC;
+ GL_MATRIX13_ARB = $88CD;
+ GL_MATRIX14_ARB = $88CE;
+ GL_MATRIX15_ARB = $88CF;
+ GL_MATRIX16_ARB = $88D0;
+ GL_MATRIX17_ARB = $88D1;
+ GL_MATRIX18_ARB = $88D2;
+ GL_MATRIX19_ARB = $88D3;
+ GL_MATRIX20_ARB = $88D4;
+ GL_MATRIX21_ARB = $88D5;
+ GL_MATRIX22_ARB = $88D6;
+ GL_MATRIX23_ARB = $88D7;
+ GL_MATRIX24_ARB = $88D8;
+ GL_MATRIX25_ARB = $88D9;
+ GL_MATRIX26_ARB = $88DA;
+ GL_MATRIX27_ARB = $88DB;
+ GL_MATRIX28_ARB = $88DC;
+ GL_MATRIX29_ARB = $88DD;
+ GL_MATRIX30_ARB = $88DE;
+ GL_MATRIX31_ARB = $88DF;
+var
+ glVertexAttrib1sARB: procedure(index: GLuint; x: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib1fARB: procedure(index: GLuint; x: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib1dARB: procedure(index: GLuint; x: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib2sARB: procedure(index: GLuint; x: GLshort; y: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib2fARB: procedure(index: GLuint; x: GLfloat; y: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib2dARB: procedure(index: GLuint; x: GLdouble; y: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib3sARB: procedure(index: GLuint; x: GLshort; y: GLshort; z: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib3fARB: procedure(index: GLuint; x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib3dARB: procedure(index: GLuint; x: GLdouble; y: GLdouble; z: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4sARB: procedure(index: GLuint; x: GLshort; y: GLshort; z: GLshort; w: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4fARB: procedure(index: GLuint; x: GLfloat; y: GLfloat; z: GLfloat; w: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4dARB: procedure(index: GLuint; x: GLdouble; y: GLdouble; z: GLdouble; w: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4NubARB: procedure(index: GLuint; x: GLubyte; y: GLubyte; z: GLubyte; w: GLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib1svARB: procedure(index: GLuint; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib1fvARB: procedure(index: GLuint; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib1dvARB: procedure(index: GLuint; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib2svARB: procedure(index: GLuint; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib2fvARB: procedure(index: GLuint; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib2dvARB: procedure(index: GLuint; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib3svARB: procedure(index: GLuint; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib3fvARB: procedure(index: GLuint; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib3dvARB: procedure(index: GLuint; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4bvARB: procedure(index: GLuint; const v: PGLbyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4svARB: procedure(index: GLuint; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4ivARB: procedure(index: GLuint; const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4ubvARB: procedure(index: GLuint; const v: PGLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4usvARB: procedure(index: GLuint; const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4uivARB: procedure(index: GLuint; const v: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4fvARB: procedure(index: GLuint; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4dvARB: procedure(index: GLuint; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4NbvARB: procedure(index: GLuint; const v: PGLbyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4NsvARB: procedure(index: GLuint; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4NivARB: procedure(index: GLuint; const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4NubvARB: procedure(index: GLuint; const v: PGLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4NusvARB: procedure(index: GLuint; const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4NuivARB: procedure(index: GLuint; const v: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttribPointerARB: procedure(index: GLuint; size: GLint; _type: GLenum; normalized: GLboolean; stride: GLsizei; const pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEnableVertexAttribArrayARB: procedure(index: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDisableVertexAttribArrayARB: procedure(index: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glProgramStringARB: procedure(target: GLenum; format: GLenum; len: GLsizei; const _string: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBindProgramARB: procedure(target: GLenum; _program: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDeleteProgramsARB: procedure(n: GLsizei; const programs: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGenProgramsARB: procedure(n: GLsizei; programs: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glProgramEnvParameter4dARB: procedure(target: GLenum; index: GLuint; x: GLdouble; y: GLdouble; z: GLdouble; w: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glProgramEnvParameter4dvARB: procedure(target: GLenum; index: GLuint; const params: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glProgramEnvParameter4fARB: procedure(target: GLenum; index: GLuint; x: GLfloat; y: GLfloat; z: GLfloat; w: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glProgramEnvParameter4fvARB: procedure(target: GLenum; index: GLuint; const params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glProgramLocalParameter4dARB: procedure(target: GLenum; index: GLuint; x: GLdouble; y: GLdouble; z: GLdouble; w: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glProgramLocalParameter4dvARB: procedure(target: GLenum; index: GLuint; const params: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glProgramLocalParameter4fARB: procedure(target: GLenum; index: GLuint; x: GLfloat; y: GLfloat; z: GLfloat; w: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glProgramLocalParameter4fvARB: procedure(target: GLenum; index: GLuint; const params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetProgramEnvParameterdvARB: procedure(target: GLenum; index: GLuint; params: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetProgramEnvParameterfvARB: procedure(target: GLenum; index: GLuint; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetProgramLocalParameterdvARB: procedure(target: GLenum; index: GLuint; params: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetProgramLocalParameterfvARB: procedure(target: GLenum; index: GLuint; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetProgramivARB: procedure(target: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetProgramStringARB: procedure(target: GLenum; pname: GLenum; _string: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetVertexAttribdvARB: procedure(index: GLuint; pname: GLenum; params: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetVertexAttribfvARB: procedure(index: GLuint; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetVertexAttribivARB: procedure(index: GLuint; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetVertexAttribPointervARB: procedure(index: GLuint; pname: GLenum; pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIsProgramARB: function(_program: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ARB_vertex_program: Boolean;
+
+//***** GL_ARB_window_pos *****//
+var
+ glWindowPos2dARB: procedure(x: GLdouble; y: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2fARB: procedure(x: GLfloat; y: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2iARB: procedure(x: GLint; y: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2sARB: procedure(x: GLshort; y: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2dvARB: procedure(const p: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2fvARB: procedure(const p: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2ivARB: procedure(const p: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2svARB: procedure(const p: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3dARB: procedure(x: GLdouble; y: GLdouble; z: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3fARB: procedure(x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3iARB: procedure(x: GLint; y: GLint; z: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3sARB: procedure(x: GLshort; y: GLshort; z: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3dvARB: procedure(const p: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3fvARB: procedure(const p: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3ivARB: procedure(const p: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3svARB: procedure(const p: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ARB_window_pos: Boolean;
+
+//***** GL_EXT_422_pixels *****//
+const
+ GL_422_EXT = $80CC;
+ GL_422_REV_EXT = $80CD;
+ GL_422_AVERAGE_EXT = $80CE;
+ GL_422_REV_AVERAGE_EXT = $80CF;
+
+function Load_GL_EXT_422_pixels: Boolean;
+
+//***** GL_EXT_abgr *****//
+const
+ GL_ABGR_EXT = $8000;
+
+function Load_GL_EXT_abgr: Boolean;
+
+//***** GL_EXT_bgra *****//
+const
+ GL_BGR_EXT = $80E0;
+ GL_BGRA_EXT = $80E1;
+
+function Load_GL_EXT_bgra: Boolean;
+
+//***** GL_EXT_blend_color *****//
+const
+ GL_CONSTANT_COLOR_EXT = $8001;
+ GL_ONE_MINUS_CONSTANT_COLOR_EXT = $8002;
+ GL_CONSTANT_ALPHA_EXT = $8003;
+ GL_ONE_MINUS_CONSTANT_ALPHA_EXT = $8004;
+ GL_BLEND_COLOR_EXT = $8005;
+var
+ glBlendColorEXT: procedure(red: GLclampf; green: GLclampf; blue: GLclampf; alpha: GLclampf); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_blend_color: Boolean;
+
+//***** GL_EXT_blend_func_separate *****//
+const
+ GL_BLEND_DST_RGB_EXT = $80C8;
+ GL_BLEND_SRC_RGB_EXT = $80C9;
+ GL_BLEND_DST_ALPHA_EXT = $80CA;
+ GL_BLEND_SRC_ALPHA_EXT = $80CB;
+var
+ glBlendFuncSeparateEXT: procedure(sfactorRGB: GLenum; dfactorRGB: GLenum; sfactorAlpha: GLenum; dfactorAlpha: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_blend_func_separate: Boolean;
+
+//***** GL_EXT_blend_logic_op *****//
+
+function Load_GL_EXT_blend_logic_op: Boolean;
+
+//***** GL_EXT_blend_minmax *****//
+const
+ GL_FUNC_ADD_EXT = $8006;
+ GL_MIN_EXT = $8007;
+ GL_MAX_EXT = $8008;
+ GL_BLEND_EQUATION_EXT = $8009;
+var
+ glBlendEquationEXT: procedure(mode: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_blend_minmax: Boolean;
+
+//***** GL_EXT_blend_subtract *****//
+const
+ GL_FUNC_SUBTRACT_EXT = $800A;
+ GL_FUNC_REVERSE_SUBTRACT_EXT = $800B;
+
+function Load_GL_EXT_blend_subtract: Boolean;
+
+//***** GL_EXT_clip_volume_hint *****//
+const
+ GL_CLIP_VOLUME_CLIPPING_HINT_EXT = $80F0;
+
+function Load_GL_EXT_clip_volume_hint: Boolean;
+
+//***** GL_EXT_color_subtable *****//
+var
+ glColorSubTableEXT: procedure(target: GLenum; start: GLsizei; count: GLsizei; format: GLenum; _type: GLenum; const data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCopyColorSubTableEXT: procedure(target: GLenum; start: GLsizei; x: GLint; y: GLint; width: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_color_subtable: Boolean;
+
+//***** GL_EXT_compiled_vertex_array *****//
+const
+ GL_ARRAY_ELEMENT_LOCK_FIRST_EXT = $81A8;
+ GL_ARRAY_ELEMENT_LOCK_COUNT_EXT = $81A9;
+var
+ glLockArraysEXT: procedure(first: GLint; count: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUnlockArraysEXT: procedure(); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_compiled_vertex_array: Boolean;
+
+//***** GL_EXT_convolution *****//
+const
+ GL_CONVOLUTION_1D_EXT = $8010;
+ GL_CONVOLUTION_2D_EXT = $8011;
+ GL_SEPARABLE_2D_EXT = $8012;
+ GL_CONVOLUTION_BORDER_MODE_EXT = $8013;
+ GL_CONVOLUTION_FILTER_SCALE_EXT = $8014;
+ GL_CONVOLUTION_FILTER_BIAS_EXT = $8015;
+ GL_REDUCE_EXT = $8016;
+ GL_CONVOLUTION_FORMAT_EXT = $8017;
+ GL_CONVOLUTION_WIDTH_EXT = $8018;
+ GL_CONVOLUTION_HEIGHT_EXT = $8019;
+ GL_MAX_CONVOLUTION_WIDTH_EXT = $801A;
+ GL_MAX_CONVOLUTION_HEIGHT_EXT = $801B;
+ GL_POST_CONVOLUTION_RED_SCALE_EXT = $801C;
+ GL_POST_CONVOLUTION_GREEN_SCALE_EXT = $801D;
+ GL_POST_CONVOLUTION_BLUE_SCALE_EXT = $801E;
+ GL_POST_CONVOLUTION_ALPHA_SCALE_EXT = $801F;
+ GL_POST_CONVOLUTION_RED_BIAS_EXT = $8020;
+ GL_POST_CONVOLUTION_GREEN_BIAS_EXT = $8021;
+ GL_POST_CONVOLUTION_BLUE_BIAS_EXT = $8022;
+ GL_POST_CONVOLUTION_ALPHA_BIAS_EXT = $8023;
+var
+ glConvolutionFilter1DEXT: procedure(target: GLenum; internalformat: GLenum; width: GLsizei; format: GLenum; _type: GLenum; const image: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glConvolutionFilter2DEXT: procedure(target: GLenum; internalformat: GLenum; width: GLsizei; height: GLsizei; format: GLenum; _type: GLenum; const image: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCopyConvolutionFilter1DEXT: procedure(target: GLenum; internalformat: GLenum; x: GLint; y: GLint; width: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCopyConvolutionFilter2DEXT: procedure(target: GLenum; internalformat: GLenum; x: GLint; y: GLint; width: GLsizei; height: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetConvolutionFilterEXT: procedure(target: GLenum; format: GLenum; _type: GLenum; image: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSeparableFilter2DEXT: procedure(target: GLenum; internalformat: GLenum; width: GLsizei; height: GLsizei; format: GLenum; _type: GLenum; const row: PGLvoid; const column: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetSeparableFilterEXT: procedure(target: GLenum; format: GLenum; _type: GLenum; row: PGLvoid; column: PGLvoid; span: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glConvolutionParameteriEXT: procedure(target: GLenum; pname: GLenum; param: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glConvolutionParameterivEXT: procedure(target: GLenum; pname: GLenum; const params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glConvolutionParameterfEXT: procedure(target: GLenum; pname: GLenum; param: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glConvolutionParameterfvEXT: procedure(target: GLenum; pname: GLenum; const params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetConvolutionParameterivEXT: procedure(target: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetConvolutionParameterfvEXT: procedure(target: GLenum; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_convolution: Boolean;
+
+//***** GL_EXT_histogram *****//
+const
+ GL_HISTOGRAM_EXT = $8024;
+ GL_PROXY_HISTOGRAM_EXT = $8025;
+ GL_HISTOGRAM_WIDTH_EXT = $8026;
+ GL_HISTOGRAM_FORMAT_EXT = $8027;
+ GL_HISTOGRAM_RED_SIZE_EXT = $8028;
+ GL_HISTOGRAM_GREEN_SIZE_EXT = $8029;
+ GL_HISTOGRAM_BLUE_SIZE_EXT = $802A;
+ GL_HISTOGRAM_ALPHA_SIZE_EXT = $802B;
+ GL_HISTOGRAM_LUMINANCE_SIZE_EXT = $802C;
+ GL_HISTOGRAM_SINK_EXT = $802D;
+ GL_MINMAX_EXT = $802E;
+ GL_MINMAX_FORMAT_EXT = $802F;
+ GL_MINMAX_SINK_EXT = $8030;
+var
+ glHistogramEXT: procedure(target: GLenum; width: GLsizei; internalformat: GLenum; sink: GLboolean); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glResetHistogramEXT: procedure(target: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetHistogramEXT: procedure(target: GLenum; reset: GLboolean; format: GLenum; _type: GLenum; values: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetHistogramParameterivEXT: procedure(target: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetHistogramParameterfvEXT: procedure(target: GLenum; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMinmaxEXT: procedure(target: GLenum; internalformat: GLenum; sink: GLboolean); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glResetMinmaxEXT: procedure(target: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetMinmaxEXT: procedure(target: GLenum; reset: GLboolean; format: GLenum; _type: GLenum; values: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetMinmaxParameterivEXT: procedure(target: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetMinmaxParameterfvEXT: procedure(target: GLenum; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_histogram: Boolean;
+
+//***** GL_EXT_multi_draw_arrays *****//
+var
+ glMultiDrawArraysEXT: procedure(mode: GLenum; first: PGLint; count: PGLsizei; primcount: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiDrawElementsEXT: procedure(mode: GLenum; count: PGLsizei; _type: GLenum; const indices: PGLvoid; primcount: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_multi_draw_arrays: Boolean;
+
+//***** GL_EXT_packed_pixels *****//
+const
+ GL_UNSIGNED_BYTE_3_3_2_EXT = $8032;
+ GL_UNSIGNED_SHORT_4_4_4_4_EXT = $8033;
+ GL_UNSIGNED_SHORT_5_5_5_1_EXT = $8034;
+ GL_UNSIGNED_INT_8_8_8_8_EXT = $8035;
+ GL_UNSIGNED_INT_10_10_10_2_EXT = $8036;
+
+function Load_GL_EXT_packed_pixels: Boolean;
+
+//***** GL_EXT_paletted_texture *****//
+const
+ GL_COLOR_INDEX1_EXT = $80E2;
+ GL_COLOR_INDEX2_EXT = $80E3;
+ GL_COLOR_INDEX4_EXT = $80E4;
+ GL_COLOR_INDEX8_EXT = $80E5;
+ GL_COLOR_INDEX12_EXT = $80E6;
+ GL_COLOR_INDEX16_EXT = $80E7;
+ GL_COLOR_TABLE_FORMAT_EXT = $80D8;
+ GL_COLOR_TABLE_WIDTH_EXT = $80D9;
+ GL_COLOR_TABLE_RED_SIZE_EXT = $80DA;
+ GL_COLOR_TABLE_GREEN_SIZE_EXT = $80DB;
+ GL_COLOR_TABLE_BLUE_SIZE_EXT = $80DC;
+ GL_COLOR_TABLE_ALPHA_SIZE_EXT = $80DD;
+ GL_COLOR_TABLE_LUMINANCE_SIZE_EXT = $80DE;
+ GL_COLOR_TABLE_INTENSITY_SIZE_EXT = $80DF;
+ GL_TEXTURE_INDEX_SIZE_EXT = $80ED;
+ GL_TEXTURE_1D = $0DE0;
+ GL_TEXTURE_2D = $0DE1;
+ GL_TEXTURE_3D_EXT = $806F;
+ // GL_TEXTURE_CUBE_MAP_ARB { already defined }
+ GL_PROXY_TEXTURE_1D = $8063;
+ GL_PROXY_TEXTURE_2D = $8064;
+ GL_PROXY_TEXTURE_3D_EXT = $8070;
+ // GL_PROXY_TEXTURE_CUBE_MAP_ARB { already defined }
+ // GL_TEXTURE_1D { already defined }
+ // GL_TEXTURE_2D { already defined }
+ // GL_TEXTURE_3D_EXT { already defined }
+ // GL_TEXTURE_CUBE_MAP_ARB { already defined }
+var
+ glColorTableEXT: procedure(target: GLenum; internalFormat: GLenum; width: GLsizei; format: GLenum; _type: GLenum; const data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ // glColorSubTableEXT { already defined }
+ glGetColorTableEXT: procedure(target: GLenum; format: GLenum; _type: GLenum; data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetColorTableParameterivEXT: procedure(target: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetColorTableParameterfvEXT: procedure(target: GLenum; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_paletted_texture: Boolean;
+
+//***** GL_EXT_point_parameters *****//
+const
+ GL_POINT_SIZE_MIN_EXT = $8126;
+ GL_POINT_SIZE_MAX_EXT = $8127;
+ GL_POINT_FADE_THRESHOLD_SIZE_EXT = $8128;
+ GL_DISTANCE_ATTENUATION_EXT = $8129;
+var
+ glPointParameterfEXT: procedure(pname: GLenum; param: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPointParameterfvEXT: procedure(pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_point_parameters: Boolean;
+
+//***** GL_EXT_polygon_offset *****//
+const
+ GL_POLYGON_OFFSET_EXT = $8037;
+ GL_POLYGON_OFFSET_FACTOR_EXT = $8038;
+ GL_POLYGON_OFFSET_BIAS_EXT = $8039;
+var
+ glPolygonOffsetEXT: procedure(factor: GLfloat; bias: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_polygon_offset: Boolean;
+
+//***** GL_EXT_separate_specular_color *****//
+const
+ GL_LIGHT_MODEL_COLOR_CONTROL_EXT = $81F8;
+ GL_SINGLE_COLOR_EXT = $81F9;
+ GL_SEPARATE_SPECULAR_COLOR_EXT = $81FA;
+
+function Load_GL_EXT_separate_specular_color: Boolean;
+
+//***** GL_EXT_shadow_funcs *****//
+
+function Load_GL_EXT_shadow_funcs: Boolean;
+
+//***** GL_EXT_shared_texture_palette *****//
+const
+ GL_SHARED_TEXTURE_PALETTE_EXT = $81FB;
+
+function Load_GL_EXT_shared_texture_palette: Boolean;
+
+//***** GL_EXT_stencil_two_side *****//
+const
+ GL_STENCIL_TEST_TWO_SIDE_EXT = $8910;
+ GL_ACTIVE_STENCIL_FACE_EXT = $8911;
+var
+ glActiveStencilFaceEXT: procedure(face: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_stencil_two_side: Boolean;
+
+//***** GL_EXT_stencil_wrap *****//
+const
+ GL_INCR_WRAP_EXT = $8507;
+ GL_DECR_WRAP_EXT = $8508;
+
+function Load_GL_EXT_stencil_wrap: Boolean;
+
+//***** GL_EXT_subtexture *****//
+var
+ glTexSubImage1DEXT: procedure(target: GLenum; level: GLint; xoffset: GLint; width: GLsizei; format: GLenum; _type: GLenum; const pixels: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexSubImage2DEXT: procedure(target: GLenum; level: GLint; xoffset: GLint; yoffset: GLint; width: GLsizei; height: GLsizei; format: GLenum; _type: GLenum; const pixels: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexSubImage3DEXT: procedure(target: GLenum; level: GLint; xoffset: GLint; yoffset: GLint; zoffset: GLint; width: GLsizei; height: GLsizei; depth: GLsizei; format: GLenum; _type: GLenum; const pixels: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_subtexture: Boolean;
+
+//***** GL_EXT_texture3D *****//
+const
+ GL_PACK_SKIP_IMAGES_EXT = $806B;
+ GL_PACK_IMAGE_HEIGHT_EXT = $806C;
+ GL_UNPACK_SKIP_IMAGES_EXT = $806D;
+ GL_UNPACK_IMAGE_HEIGHT_EXT = $806E;
+ // GL_TEXTURE_3D_EXT { already defined }
+ // GL_PROXY_TEXTURE_3D_EXT { already defined }
+ GL_TEXTURE_DEPTH_EXT = $8071;
+ GL_TEXTURE_WRAP_R_EXT = $8072;
+ GL_MAX_3D_TEXTURE_SIZE_EXT = $8073;
+var
+ glTexImage3DEXT: procedure(target: GLenum; level: GLint; internalformat: GLenum; width: GLsizei; height: GLsizei; depth: GLsizei; border: GLint; format: GLenum; _type: GLenum; const pixels: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_texture3D: Boolean;
+
+//***** GL_EXT_texture_compression_s3tc *****//
+const
+ GL_COMPRESSED_RGB_S3TC_DXT1_EXT = $83F0;
+ GL_COMPRESSED_RGBA_S3TC_DXT1_EXT = $83F1;
+ GL_COMPRESSED_RGBA_S3TC_DXT3_EXT = $83F2;
+ GL_COMPRESSED_RGBA_S3TC_DXT5_EXT = $83F3;
+
+function Load_GL_EXT_texture_compression_s3tc: Boolean;
+
+//***** GL_EXT_texture_env_add *****//
+
+function Load_GL_EXT_texture_env_add: Boolean;
+
+//***** GL_EXT_texture_env_combine *****//
+const
+ GL_COMBINE_EXT = $8570;
+ GL_COMBINE_RGB_EXT = $8571;
+ GL_COMBINE_ALPHA_EXT = $8572;
+ GL_SOURCE0_RGB_EXT = $8580;
+ GL_SOURCE1_RGB_EXT = $8581;
+ GL_SOURCE2_RGB_EXT = $8582;
+ GL_SOURCE0_ALPHA_EXT = $8588;
+ GL_SOURCE1_ALPHA_EXT = $8589;
+ GL_SOURCE2_ALPHA_EXT = $858A;
+ GL_OPERAND0_RGB_EXT = $8590;
+ GL_OPERAND1_RGB_EXT = $8591;
+ GL_OPERAND2_RGB_EXT = $8592;
+ GL_OPERAND0_ALPHA_EXT = $8598;
+ GL_OPERAND1_ALPHA_EXT = $8599;
+ GL_OPERAND2_ALPHA_EXT = $859A;
+ GL_RGB_SCALE_EXT = $8573;
+ GL_ADD_SIGNED_EXT = $8574;
+ GL_INTERPOLATE_EXT = $8575;
+ GL_CONSTANT_EXT = $8576;
+ GL_PRIMARY_COLOR_EXT = $8577;
+ GL_PREVIOUS_EXT = $8578;
+
+function Load_GL_EXT_texture_env_combine: Boolean;
+
+//***** GL_EXT_texture_env_dot3 *****//
+const
+ GL_DOT3_RGB_EXT = $8740;
+ GL_DOT3_RGBA_EXT = $8741;
+
+function Load_GL_EXT_texture_env_dot3: Boolean;
+
+//***** GL_EXT_texture_filter_anisotropic *****//
+const
+ GL_TEXTURE_MAX_ANISOTROPY_EXT = $84FE;
+ GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT = $84FF;
+
+function Load_GL_EXT_texture_filter_anisotropic: Boolean;
+
+//***** GL_EXT_texture_lod_bias *****//
+const
+ GL_TEXTURE_FILTER_CONTROL_EXT = $8500;
+ GL_TEXTURE_LOD_BIAS_EXT = $8501;
+ GL_MAX_TEXTURE_LOD_BIAS_EXT = $84FD;
+
+function Load_GL_EXT_texture_lod_bias: Boolean;
+
+//***** GL_EXT_texture_object *****//
+const
+ GL_TEXTURE_PRIORITY_EXT = $8066;
+ GL_TEXTURE_RESIDENT_EXT = $8067;
+ GL_TEXTURE_1D_BINDING_EXT = $8068;
+ GL_TEXTURE_2D_BINDING_EXT = $8069;
+ GL_TEXTURE_3D_BINDING_EXT = $806A;
+var
+ glGenTexturesEXT: procedure(n: GLsizei; textures: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDeleteTexturesEXT: procedure(n: GLsizei; const textures: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBindTextureEXT: procedure(target: GLenum; texture: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPrioritizeTexturesEXT: procedure(n: GLsizei; const textures: PGLuint; const priorities: PGLclampf); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glAreTexturesResidentEXT: function(n: GLsizei; const textures: PGLuint; residences: PGLboolean): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIsTextureEXT: function(texture: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_texture_object: Boolean;
+
+//***** GL_EXT_vertex_array *****//
+const
+ GL_VERTEX_ARRAY_EXT = $8074;
+ GL_NORMAL_ARRAY_EXT = $8075;
+ GL_COLOR_ARRAY_EXT = $8076;
+ GL_INDEX_ARRAY_EXT = $8077;
+ GL_TEXTURE_COORD_ARRAY_EXT = $8078;
+ GL_EDGE_FLAG_ARRAY_EXT = $8079;
+ GL_DOUBLE_EXT = $140A;
+ GL_VERTEX_ARRAY_SIZE_EXT = $807A;
+ GL_VERTEX_ARRAY_TYPE_EXT = $807B;
+ GL_VERTEX_ARRAY_STRIDE_EXT = $807C;
+ GL_VERTEX_ARRAY_COUNT_EXT = $807D;
+ GL_NORMAL_ARRAY_TYPE_EXT = $807E;
+ GL_NORMAL_ARRAY_STRIDE_EXT = $807F;
+ GL_NORMAL_ARRAY_COUNT_EXT = $8080;
+ GL_COLOR_ARRAY_SIZE_EXT = $8081;
+ GL_COLOR_ARRAY_TYPE_EXT = $8082;
+ GL_COLOR_ARRAY_STRIDE_EXT = $8083;
+ GL_COLOR_ARRAY_COUNT_EXT = $8084;
+ GL_INDEX_ARRAY_TYPE_EXT = $8085;
+ GL_INDEX_ARRAY_STRIDE_EXT = $8086;
+ GL_INDEX_ARRAY_COUNT_EXT = $8087;
+ GL_TEXTURE_COORD_ARRAY_SIZE_EXT = $8088;
+ GL_TEXTURE_COORD_ARRAY_TYPE_EXT = $8089;
+ GL_TEXTURE_COORD_ARRAY_STRIDE_EXT = $808A;
+ GL_TEXTURE_COORD_ARRAY_COUNT_EXT = $808B;
+ GL_EDGE_FLAG_ARRAY_STRIDE_EXT = $808C;
+ GL_EDGE_FLAG_ARRAY_COUNT_EXT = $808D;
+ GL_VERTEX_ARRAY_POINTER_EXT = $808E;
+ GL_NORMAL_ARRAY_POINTER_EXT = $808F;
+ GL_COLOR_ARRAY_POINTER_EXT = $8090;
+ GL_INDEX_ARRAY_POINTER_EXT = $8091;
+ GL_TEXTURE_COORD_ARRAY_POINTER_EXT = $8092;
+ GL_EDGE_FLAG_ARRAY_POINTER_EXT = $8093;
+var
+ glArrayElementEXT: procedure(i: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDrawArraysEXT: procedure(mode: GLenum; first: GLint; count: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexPointerEXT: procedure(size: GLint; _type: GLenum; stride: GLsizei; count: GLsizei; const pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormalPointerEXT: procedure(_type: GLenum; stride: GLsizei; count: GLsizei; const pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColorPointerEXT: procedure(size: GLint; _type: GLenum; stride: GLsizei; count: GLsizei; const pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIndexPointerEXT: procedure(_type: GLenum; stride: GLsizei; count: GLsizei; const pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoordPointerEXT: procedure(size: GLint; _type: GLenum; stride: GLsizei; count: GLsizei; const pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEdgeFlagPointerEXT: procedure(stride: GLsizei; count: GLsizei; const pointer: PGLboolean); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetPointervEXT: procedure(pname: GLenum; params: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_vertex_array: Boolean;
+
+//***** GL_EXT_vertex_shader *****//
+const
+ GL_VERTEX_SHADER_EXT = $8780;
+ GL_VARIANT_VALUE_EXT = $87E4;
+ GL_VARIANT_DATATYPE_EXT = $87E5;
+ GL_VARIANT_ARRAY_STRIDE_EXT = $87E6;
+ GL_VARIANT_ARRAY_TYPE_EXT = $87E7;
+ GL_VARIANT_ARRAY_EXT = $87E8;
+ GL_VARIANT_ARRAY_POINTER_EXT = $87E9;
+ GL_INVARIANT_VALUE_EXT = $87EA;
+ GL_INVARIANT_DATATYPE_EXT = $87EB;
+ GL_LOCAL_CONSTANT_VALUE_EXT = $87EC;
+ GL_LOCAL_CONSTANT_DATATYPE_EXT = $87ED;
+ GL_OP_INDEX_EXT = $8782;
+ GL_OP_NEGATE_EXT = $8783;
+ GL_OP_DOT3_EXT = $8784;
+ GL_OP_DOT4_EXT = $8785;
+ GL_OP_MUL_EXT = $8786;
+ GL_OP_ADD_EXT = $8787;
+ GL_OP_MADD_EXT = $8788;
+ GL_OP_FRAC_EXT = $8789;
+ GL_OP_MAX_EXT = $878A;
+ GL_OP_MIN_EXT = $878B;
+ GL_OP_SET_GE_EXT = $878C;
+ GL_OP_SET_LT_EXT = $878D;
+ GL_OP_CLAMP_EXT = $878E;
+ GL_OP_FLOOR_EXT = $878F;
+ GL_OP_ROUND_EXT = $8790;
+ GL_OP_EXP_BASE_2_EXT = $8791;
+ GL_OP_LOG_BASE_2_EXT = $8792;
+ GL_OP_POWER_EXT = $8793;
+ GL_OP_RECIP_EXT = $8794;
+ GL_OP_RECIP_SQRT_EXT = $8795;
+ GL_OP_SUB_EXT = $8796;
+ GL_OP_CROSS_PRODUCT_EXT = $8797;
+ GL_OP_MULTIPLY_MATRIX_EXT = $8798;
+ GL_OP_MOV_EXT = $8799;
+ GL_OUTPUT_VERTEX_EXT = $879A;
+ GL_OUTPUT_COLOR0_EXT = $879B;
+ GL_OUTPUT_COLOR1_EXT = $879C;
+ GL_OUTPUT_TEXTURE_COORD0_EXT = $879D;
+ GL_OUTPUT_TEXTURE_COORD1_EXT = $879E;
+ GL_OUTPUT_TEXTURE_COORD2_EXT = $879F;
+ GL_OUTPUT_TEXTURE_COORD3_EXT = $87A0;
+ GL_OUTPUT_TEXTURE_COORD4_EXT = $87A1;
+ GL_OUTPUT_TEXTURE_COORD5_EXT = $87A2;
+ GL_OUTPUT_TEXTURE_COORD6_EXT = $87A3;
+ GL_OUTPUT_TEXTURE_COORD7_EXT = $87A4;
+ GL_OUTPUT_TEXTURE_COORD8_EXT = $87A5;
+ GL_OUTPUT_TEXTURE_COORD9_EXT = $87A6;
+ GL_OUTPUT_TEXTURE_COORD10_EXT = $87A7;
+ GL_OUTPUT_TEXTURE_COORD11_EXT = $87A8;
+ GL_OUTPUT_TEXTURE_COORD12_EXT = $87A9;
+ GL_OUTPUT_TEXTURE_COORD13_EXT = $87AA;
+ GL_OUTPUT_TEXTURE_COORD14_EXT = $87AB;
+ GL_OUTPUT_TEXTURE_COORD15_EXT = $87AC;
+ GL_OUTPUT_TEXTURE_COORD16_EXT = $87AD;
+ GL_OUTPUT_TEXTURE_COORD17_EXT = $87AE;
+ GL_OUTPUT_TEXTURE_COORD18_EXT = $87AF;
+ GL_OUTPUT_TEXTURE_COORD19_EXT = $87B0;
+ GL_OUTPUT_TEXTURE_COORD20_EXT = $87B1;
+ GL_OUTPUT_TEXTURE_COORD21_EXT = $87B2;
+ GL_OUTPUT_TEXTURE_COORD22_EXT = $87B3;
+ GL_OUTPUT_TEXTURE_COORD23_EXT = $87B4;
+ GL_OUTPUT_TEXTURE_COORD24_EXT = $87B5;
+ GL_OUTPUT_TEXTURE_COORD25_EXT = $87B6;
+ GL_OUTPUT_TEXTURE_COORD26_EXT = $87B7;
+ GL_OUTPUT_TEXTURE_COORD27_EXT = $87B8;
+ GL_OUTPUT_TEXTURE_COORD28_EXT = $87B9;
+ GL_OUTPUT_TEXTURE_COORD29_EXT = $87BA;
+ GL_OUTPUT_TEXTURE_COORD30_EXT = $87BB;
+ GL_OUTPUT_TEXTURE_COORD31_EXT = $87BC;
+ GL_OUTPUT_FOG_EXT = $87BD;
+ GL_SCALAR_EXT = $87BE;
+ GL_VECTOR_EXT = $87BF;
+ GL_MATRIX_EXT = $87C0;
+ GL_VARIANT_EXT = $87C1;
+ GL_INVARIANT_EXT = $87C2;
+ GL_LOCAL_CONSTANT_EXT = $87C3;
+ GL_LOCAL_EXT = $87C4;
+ GL_MAX_VERTEX_SHADER_INSTRUCTIONS_EXT = $87C5;
+ GL_MAX_VERTEX_SHADER_VARIANTS_EXT = $87C6;
+ GL_MAX_VERTEX_SHADER_INVARIANTS_EXT = $87C7;
+ GL_MAX_VERTEX_SHADER_LOCAL_CONSTANTS_EXT = $87C8;
+ GL_MAX_VERTEX_SHADER_LOCALS_EXT = $87C9;
+ GL_MAX_OPTIMIZED_VERTEX_SHADER_INSTRUCTIONS_EXT = $87CA;
+ GL_MAX_OPTIMIZED_VERTEX_SHADER_VARIANTS_EXT = $87CB;
+ GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCAL_CONSTANTS_EXT = $87CC;
+ GL_MAX_OPTIMIZED_VERTEX_SHADER_INVARIANTS_EXT = $87CD;
+ GL_MAX_OPTIMIZED_VERTEX_SHADER_LOCALS_EXT = $87CE;
+ GL_VERTEX_SHADER_INSTRUCTIONS_EXT = $87CF;
+ GL_VERTEX_SHADER_VARIANTS_EXT = $87D0;
+ GL_VERTEX_SHADER_INVARIANTS_EXT = $87D1;
+ GL_VERTEX_SHADER_LOCAL_CONSTANTS_EXT = $87D2;
+ GL_VERTEX_SHADER_LOCALS_EXT = $87D3;
+ GL_VERTEX_SHADER_BINDING_EXT = $8781;
+ GL_VERTEX_SHADER_OPTIMIZED_EXT = $87D4;
+ GL_X_EXT = $87D5;
+ GL_Y_EXT = $87D6;
+ GL_Z_EXT = $87D7;
+ GL_W_EXT = $87D8;
+ GL_NEGATIVE_X_EXT = $87D9;
+ GL_NEGATIVE_Y_EXT = $87DA;
+ GL_NEGATIVE_Z_EXT = $87DB;
+ GL_NEGATIVE_W_EXT = $87DC;
+ GL_ZERO_EXT = $87DD;
+ GL_ONE_EXT = $87DE;
+ GL_NEGATIVE_ONE_EXT = $87DF;
+ GL_NORMALIZED_RANGE_EXT = $87E0;
+ GL_FULL_RANGE_EXT = $87E1;
+ GL_CURRENT_VERTEX_EXT = $87E2;
+ GL_MVP_MATRIX_EXT = $87E3;
+var
+ glBeginVertexShaderEXT: procedure(); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEndVertexShaderEXT: procedure(); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBindVertexShaderEXT: procedure(id: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGenVertexShadersEXT: function(range: GLuint): GLuint; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDeleteVertexShaderEXT: procedure(id: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glShaderOp1EXT: procedure(op: GLenum; res: GLuint; arg1: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glShaderOp2EXT: procedure(op: GLenum; res: GLuint; arg1: GLuint; arg2: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glShaderOp3EXT: procedure(op: GLenum; res: GLuint; arg1: GLuint; arg2: GLuint; arg3: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSwizzleEXT: procedure(res: GLuint; _in: GLuint; outX: GLenum; outY: GLenum; outZ: GLenum; outW: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWriteMaskEXT: procedure(res: GLuint; _in: GLuint; outX: GLenum; outY: GLenum; outZ: GLenum; outW: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glInsertComponentEXT: procedure(res: GLuint; src: GLuint; num: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glExtractComponentEXT: procedure(res: GLuint; src: GLuint; num: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGenSymbolsEXT: function(datatype: GLenum; storagetype: GLenum; range: GLenum; components: GLuint): GLuint; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSetInvariantEXT: procedure(id: GLuint; _type: GLenum; addr: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSetLocalConstantEXT: procedure(id: GLuint; _type: GLenum; addr: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVariantbvEXT: procedure(id: GLuint; addr: PGLbyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVariantsvEXT: procedure(id: GLuint; addr: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVariantivEXT: procedure(id: GLuint; addr: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVariantfvEXT: procedure(id: GLuint; addr: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVariantdvEXT: procedure(id: GLuint; addr: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVariantubvEXT: procedure(id: GLuint; addr: PGLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVariantusvEXT: procedure(id: GLuint; addr: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVariantuivEXT: procedure(id: GLuint; addr: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVariantPointerEXT: procedure(id: GLuint; _type: GLenum; stride: GLuint; addr: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEnableVariantClientStateEXT: procedure(id: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDisableVariantClientStateEXT: procedure(id: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBindLightParameterEXT: function(light: GLenum; value: GLenum): GLuint; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBindMaterialParameterEXT: function(face: GLenum; value: GLenum): GLuint; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBindTexGenParameterEXT: function(_unit: GLenum; coord: GLenum; value: GLenum): GLuint; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBindTextureUnitParameterEXT: function(_unit: GLenum; value: GLenum): GLuint; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBindParameterEXT: function(value: GLenum): GLuint; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIsVariantEnabledEXT: function(id: GLuint; cap: GLenum): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetVariantBooleanvEXT: procedure(id: GLuint; value: GLenum; data: PGLboolean); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetVariantIntegervEXT: procedure(id: GLuint; value: GLenum; data: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetVariantFloatvEXT: procedure(id: GLuint; value: GLenum; data: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetVariantPointervEXT: procedure(id: GLuint; value: GLenum; data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetInvariantBooleanvEXT: procedure(id: GLuint; value: GLenum; data: PGLboolean); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetInvariantIntegervEXT: procedure(id: GLuint; value: GLenum; data: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetInvariantFloatvEXT: procedure(id: GLuint; value: GLenum; data: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetLocalConstantBooleanvEXT: procedure(id: GLuint; value: GLenum; data: PGLboolean); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetLocalConstantIntegervEXT: procedure(id: GLuint; value: GLenum; data: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetLocalConstantFloatvEXT: procedure(id: GLuint; value: GLenum; data: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_vertex_shader: Boolean;
+
+//***** GL_EXT_vertex_weighting *****//
+const
+ GL_VERTEX_WEIGHTING_EXT = $8509;
+ GL_MODELVIEW0_EXT = $1700;
+ GL_MODELVIEW1_EXT = $850A;
+ GL_MODELVIEW0_MATRIX_EXT = $0BA6;
+ GL_MODELVIEW1_MATRIX_EXT = $8506;
+ GL_CURRENT_VERTEX_WEIGHT_EXT = $850B;
+ GL_VERTEX_WEIGHT_ARRAY_EXT = $850C;
+ GL_VERTEX_WEIGHT_ARRAY_SIZE_EXT = $850D;
+ GL_VERTEX_WEIGHT_ARRAY_TYPE_EXT = $850E;
+ GL_VERTEX_WEIGHT_ARRAY_STRIDE_EXT = $850F;
+ GL_MODELVIEW0_STACK_DEPTH_EXT = $0BA3;
+ GL_MODELVIEW1_STACK_DEPTH_EXT = $8502;
+ GL_VERTEX_WEIGHT_ARRAY_POINTER_EXT = $8510;
+var
+ glVertexWeightfEXT: procedure(weight: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexWeightfvEXT: procedure(weight: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexWeightPointerEXT: procedure(size: GLint; _type: GLenum; stride: GLsizei; pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_vertex_weighting: Boolean;
+
+//***** GL_HP_occlusion_test *****//
+const
+ GL_OCCLUSION_TEST_HP = $8165;
+ GL_OCCLUSION_TEST_RESULT_HP = $8166;
+
+function Load_GL_HP_occlusion_test: Boolean;
+
+//***** GL_NV_blend_square *****//
+
+function Load_GL_NV_blend_square: Boolean;
+
+//***** GL_NV_copy_depth_to_color *****//
+const
+ GL_DEPTH_STENCIL_TO_RGBA_NV = $886E;
+ GL_DEPTH_STENCIL_TO_BGRA_NV = $886F;
+
+function Load_GL_NV_copy_depth_to_color: Boolean;
+
+//***** GL_NV_depth_clamp *****//
+const
+ GL_DEPTH_CLAMP_NV = $864F;
+
+function Load_GL_NV_depth_clamp: Boolean;
+
+//***** GL_NV_evaluators *****//
+const
+ GL_EVAL_2D_NV = $86C0;
+ GL_EVAL_TRIANGULAR_2D_NV = $86C1;
+ GL_MAP_TESSELLATION_NV = $86C2;
+ GL_MAP_ATTRIB_U_ORDER_NV = $86C3;
+ GL_MAP_ATTRIB_V_ORDER_NV = $86C4;
+ GL_EVAL_FRACTIONAL_TESSELLATION_NV = $86C5;
+ GL_EVAL_VERTEX_ATTRIB0_NV = $86C6;
+ GL_EVAL_VERTEX_ATTRIB1_NV = $86C7;
+ GL_EVAL_VERTEX_ATTRIB2_NV = $86C8;
+ GL_EVAL_VERTEX_ATTRIB3_NV = $86C9;
+ GL_EVAL_VERTEX_ATTRIB4_NV = $86CA;
+ GL_EVAL_VERTEX_ATTRIB5_NV = $86CB;
+ GL_EVAL_VERTEX_ATTRIB6_NV = $86CC;
+ GL_EVAL_VERTEX_ATTRIB7_NV = $86CD;
+ GL_EVAL_VERTEX_ATTRIB8_NV = $86CE;
+ GL_EVAL_VERTEX_ATTRIB9_NV = $86CF;
+ GL_EVAL_VERTEX_ATTRIB10_NV = $86D0;
+ GL_EVAL_VERTEX_ATTRIB11_NV = $86D1;
+ GL_EVAL_VERTEX_ATTRIB12_NV = $86D2;
+ GL_EVAL_VERTEX_ATTRIB13_NV = $86D3;
+ GL_EVAL_VERTEX_ATTRIB14_NV = $86D4;
+ GL_EVAL_VERTEX_ATTRIB15_NV = $86D5;
+ GL_MAX_MAP_TESSELLATION_NV = $86D6;
+ GL_MAX_RATIONAL_EVAL_ORDER_NV = $86D7;
+var
+ glMapControlPointsNV: procedure(target: GLenum; index: GLuint; _type: GLenum; ustride: GLsizei; vstride: GLsizei; uorder: GLint; vorder: GLint; _packed: GLboolean; const points: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMapParameterivNV: procedure(target: GLenum; pname: GLenum; const params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMapParameterfvNV: procedure(target: GLenum; pname: GLenum; const params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetMapControlPointsNV: procedure(target: GLenum; index: GLuint; _type: GLenum; ustride: GLsizei; vstride: GLsizei; _packed: GLboolean; points: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetMapParameterivNV: procedure(target: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetMapParameterfvNV: procedure(target: GLenum; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetMapAttribParameterivNV: procedure(target: GLenum; index: GLuint; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetMapAttribParameterfvNV: procedure(target: GLenum; index: GLuint; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEvalMapsNV: procedure(target: GLenum; mode: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_NV_evaluators: Boolean;
+
+//***** GL_NV_fence *****//
+const
+ GL_ALL_COMPLETED_NV = $84F2;
+ GL_FENCE_STATUS_NV = $84F3;
+ GL_FENCE_CONDITION_NV = $84F4;
+var
+ glGenFencesNV: procedure(n: GLsizei; fences: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDeleteFencesNV: procedure(n: GLsizei; const fences: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSetFenceNV: procedure(fence: GLuint; condition: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTestFenceNV: function(fence: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFinishFenceNV: procedure(fence: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIsFenceNV: function(fence: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetFenceivNV: procedure(fence: GLuint; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_NV_fence: Boolean;
+
+//***** GL_NV_fog_distance *****//
+const
+ GL_FOG_DISTANCE_MODE_NV = $855A;
+ GL_EYE_RADIAL_NV = $855B;
+ GL_EYE_PLANE_ABSOLUTE_NV = $855C;
+
+function Load_GL_NV_fog_distance: Boolean;
+
+//***** GL_NV_light_max_exponent *****//
+const
+ GL_MAX_SHININESS_NV = $8504;
+ GL_MAX_SPOT_EXPONENT_NV = $8505;
+
+function Load_GL_NV_light_max_exponent: Boolean;
+
+//***** GL_NV_multisample_filter_hint *****//
+const
+ GL_MULTISAMPLE_FILTER_HINT_NV = $8534;
+
+function Load_GL_NV_multisample_filter_hint: Boolean;
+
+//***** GL_NV_occlusion_query *****//
+ // GL_OCCLUSION_TEST_HP { already defined }
+ // GL_OCCLUSION_TEST_RESULT_HP { already defined }
+const
+ GL_PIXEL_COUNTER_BITS_NV = $8864;
+ GL_CURRENT_OCCLUSION_QUERY_ID_NV = $8865;
+ GL_PIXEL_COUNT_NV = $8866;
+ GL_PIXEL_COUNT_AVAILABLE_NV = $8867;
+var
+ glGenOcclusionQueriesNV: procedure(n: GLsizei; ids: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDeleteOcclusionQueriesNV: procedure(n: GLsizei; const ids: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIsOcclusionQueryNV: function(id: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBeginOcclusionQueryNV: procedure(id: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEndOcclusionQueryNV: procedure(); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetOcclusionQueryivNV: procedure(id: GLuint; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetOcclusionQueryuivNV: procedure(id: GLuint; pname: GLenum; params: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_NV_occlusion_query: Boolean;
+
+//***** GL_NV_packed_depth_stencil *****//
+const
+ GL_DEPTH_STENCIL_NV = $84F9;
+ GL_UNSIGNED_INT_24_8_NV = $84FA;
+
+function Load_GL_NV_packed_depth_stencil: Boolean;
+
+//***** GL_NV_point_sprite *****//
+const
+ GL_POINT_SPRITE_NV = $8861;
+ GL_COORD_REPLACE_NV = $8862;
+ GL_POINT_SPRITE_R_MODE_NV = $8863;
+var
+ glPointParameteriNV: procedure(pname: GLenum; param: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPointParameterivNV: procedure(pname: GLenum; const params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_NV_point_sprite: Boolean;
+
+//***** GL_NV_register_combiners *****//
+const
+ GL_REGISTER_COMBINERS_NV = $8522;
+ GL_COMBINER0_NV = $8550;
+ GL_COMBINER1_NV = $8551;
+ GL_COMBINER2_NV = $8552;
+ GL_COMBINER3_NV = $8553;
+ GL_COMBINER4_NV = $8554;
+ GL_COMBINER5_NV = $8555;
+ GL_COMBINER6_NV = $8556;
+ GL_COMBINER7_NV = $8557;
+ GL_VARIABLE_A_NV = $8523;
+ GL_VARIABLE_B_NV = $8524;
+ GL_VARIABLE_C_NV = $8525;
+ GL_VARIABLE_D_NV = $8526;
+ GL_VARIABLE_E_NV = $8527;
+ GL_VARIABLE_F_NV = $8528;
+ GL_VARIABLE_G_NV = $8529;
+ GL_CONSTANT_COLOR0_NV = $852A;
+ GL_CONSTANT_COLOR1_NV = $852B;
+ GL_PRIMARY_COLOR_NV = $852C;
+ GL_SECONDARY_COLOR_NV = $852D;
+ GL_SPARE0_NV = $852E;
+ GL_SPARE1_NV = $852F;
+ GL_UNSIGNED_IDENTITY_NV = $8536;
+ GL_UNSIGNED_INVERT_NV = $8537;
+ GL_EXPAND_NORMAL_NV = $8538;
+ GL_EXPAND_NEGATE_NV = $8539;
+ GL_HALF_BIAS_NORMAL_NV = $853A;
+ GL_HALF_BIAS_NEGATE_NV = $853B;
+ GL_SIGNED_IDENTITY_NV = $853C;
+ GL_SIGNED_NEGATE_NV = $853D;
+ GL_E_TIMES_F_NV = $8531;
+ GL_SPARE0_PLUS_SECONDARY_COLOR_NV = $8532;
+ GL_SCALE_BY_TWO_NV = $853E;
+ GL_SCALE_BY_FOUR_NV = $853F;
+ GL_SCALE_BY_ONE_HALF_NV = $8540;
+ GL_BIAS_BY_NEGATIVE_ONE_HALF_NV = $8541;
+ GL_DISCARD_NV = $8530;
+ GL_COMBINER_INPUT_NV = $8542;
+ GL_COMBINER_MAPPING_NV = $8543;
+ GL_COMBINER_COMPONENT_USAGE_NV = $8544;
+ GL_COMBINER_AB_DOT_PRODUCT_NV = $8545;
+ GL_COMBINER_CD_DOT_PRODUCT_NV = $8546;
+ GL_COMBINER_MUX_SUM_NV = $8547;
+ GL_COMBINER_SCALE_NV = $8548;
+ GL_COMBINER_BIAS_NV = $8549;
+ GL_COMBINER_AB_OUTPUT_NV = $854A;
+ GL_COMBINER_CD_OUTPUT_NV = $854B;
+ GL_COMBINER_SUM_OUTPUT_NV = $854C;
+ GL_NUM_GENERAL_COMBINERS_NV = $854E;
+ GL_COLOR_SUM_CLAMP_NV = $854F;
+ GL_MAX_GENERAL_COMBINERS_NV = $854D;
+var
+ glCombinerParameterfvNV: procedure(pname: GLenum; const params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCombinerParameterivNV: procedure(pname: GLenum; const params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCombinerParameterfNV: procedure(pname: GLenum; param: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCombinerParameteriNV: procedure(pname: GLenum; param: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCombinerInputNV: procedure(stage: GLenum; portion: GLenum; variable: GLenum; input: GLenum; mapping: GLenum; componentUsage: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCombinerOutputNV: procedure(stage: GLenum; portion: GLenum; abOutput: GLenum; cdOutput: GLenum; sumOutput: GLenum; scale: GLenum; bias: GLenum; abDotProduct: GLboolean; cdDotProduct: GLboolean; muxSum: GLboolean); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFinalCombinerInputNV: procedure(variable: GLenum; input: GLenum; mapping: GLenum; componentUsage: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetCombinerInputParameterfvNV: procedure(stage: GLenum; portion: GLenum; variable: GLenum; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetCombinerInputParameterivNV: procedure(stage: GLenum; portion: GLenum; variable: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetCombinerOutputParameterfvNV: procedure(stage: GLenum; portion: GLenum; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetCombinerOutputParameterivNV: procedure(stage: GLenum; portion: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetFinalCombinerInputParameterfvNV: procedure(variable: GLenum; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetFinalCombinerInputParameterivNV: procedure(variable: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_NV_register_combiners: Boolean;
+
+//***** GL_NV_register_combiners2 *****//
+const
+ GL_PER_STAGE_CONSTANTS_NV = $8535;
+var
+ glCombinerStageParameterfvNV: procedure(stage: GLenum; pname: GLenum; const params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetCombinerStageParameterfvNV: procedure(stage: GLenum; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_NV_register_combiners2: Boolean;
+
+//***** GL_NV_texgen_emboss *****//
+const
+ GL_EMBOSS_MAP_NV = $855F;
+ GL_EMBOSS_LIGHT_NV = $855D;
+ GL_EMBOSS_CONSTANT_NV = $855E;
+
+function Load_GL_NV_texgen_emboss: Boolean;
+
+//***** GL_NV_texgen_reflection *****//
+const
+ GL_NORMAL_MAP_NV = $8511;
+ GL_REFLECTION_MAP_NV = $8512;
+
+function Load_GL_NV_texgen_reflection: Boolean;
+
+//***** GL_NV_texture_compression_vtc *****//
+ // GL_COMPRESSED_RGB_S3TC_DXT1_EXT { already defined }
+ // GL_COMPRESSED_RGBA_S3TC_DXT1_EXT { already defined }
+ // GL_COMPRESSED_RGBA_S3TC_DXT3_EXT { already defined }
+ // GL_COMPRESSED_RGBA_S3TC_DXT5_EXT { already defined }
+
+function Load_GL_NV_texture_compression_vtc: Boolean;
+
+//***** GL_NV_texture_env_combine4 *****//
+const
+ GL_COMBINE4_NV = $8503;
+ GL_SOURCE3_RGB_NV = $8583;
+ GL_SOURCE3_ALPHA_NV = $858B;
+ GL_OPERAND3_RGB_NV = $8593;
+ GL_OPERAND3_ALPHA_NV = $859B;
+
+function Load_GL_NV_texture_env_combine4: Boolean;
+
+//***** GL_NV_texture_rectangle *****//
+const
+ GL_TEXTURE_RECTANGLE_NV = $84F5;
+ GL_TEXTURE_BINDING_RECTANGLE_NV = $84F6;
+ GL_PROXY_TEXTURE_RECTANGLE_NV = $84F7;
+ GL_MAX_RECTANGLE_TEXTURE_SIZE_NV = $84F8;
+
+function Load_GL_NV_texture_rectangle: Boolean;
+
+//***** GL_NV_texture_shader *****//
+const
+ GL_TEXTURE_SHADER_NV = $86DE;
+ GL_RGBA_UNSIGNED_DOT_PRODUCT_MAPPING_NV = $86D9;
+ GL_SHADER_OPERATION_NV = $86DF;
+ GL_CULL_MODES_NV = $86E0;
+ GL_OFFSET_TEXTURE_MATRIX_NV = $86E1;
+ GL_OFFSET_TEXTURE_SCALE_NV = $86E2;
+ GL_OFFSET_TEXTURE_BIAS_NV = $86E3;
+ GL_PREVIOUS_TEXTURE_INPUT_NV = $86E4;
+ GL_CONST_EYE_NV = $86E5;
+ GL_SHADER_CONSISTENT_NV = $86DD;
+ GL_PASS_THROUGH_NV = $86E6;
+ GL_CULL_FRAGMENT_NV = $86E7;
+ GL_OFFSET_TEXTURE_2D_NV = $86E8;
+ GL_OFFSET_TEXTURE_RECTANGLE_NV = $864C;
+ GL_OFFSET_TEXTURE_RECTANGLE_SCALE_NV = $864D;
+ GL_DEPENDENT_AR_TEXTURE_2D_NV = $86E9;
+ GL_DEPENDENT_GB_TEXTURE_2D_NV = $86EA;
+ GL_DOT_PRODUCT_NV = $86EC;
+ GL_DOT_PRODUCT_DEPTH_REPLACE_NV = $86ED;
+ GL_DOT_PRODUCT_TEXTURE_2D_NV = $86EE;
+ GL_DOT_PRODUCT_TEXTURE_RECTANGLE_NV = $864E;
+ GL_DOT_PRODUCT_TEXTURE_CUBE_MAP_NV = $86F0;
+ GL_DOT_PRODUCT_DIFFUSE_CUBE_MAP_NV = $86F1;
+ GL_DOT_PRODUCT_REFLECT_CUBE_MAP_NV = $86F2;
+ GL_DOT_PRODUCT_CONST_EYE_REFLECT_CUBE_MAP_NV = $86F3;
+ GL_HILO_NV = $86F4;
+ GL_DSDT_NV = $86F5;
+ GL_DSDT_MAG_NV = $86F6;
+ GL_DSDT_MAG_VIB_NV = $86F7;
+ GL_UNSIGNED_INT_S8_S8_8_8_NV = $86DA;
+ GL_UNSIGNED_INT_8_8_S8_S8_REV_NV = $86DB;
+ GL_SIGNED_RGBA_NV = $86FB;
+ GL_SIGNED_RGBA8_NV = $86FC;
+ GL_SIGNED_RGB_NV = $86FE;
+ GL_SIGNED_RGB8_NV = $86FF;
+ GL_SIGNED_LUMINANCE_NV = $8701;
+ GL_SIGNED_LUMINANCE8_NV = $8702;
+ GL_SIGNED_LUMINANCE_ALPHA_NV = $8703;
+ GL_SIGNED_LUMINANCE8_ALPHA8_NV = $8704;
+ GL_SIGNED_ALPHA_NV = $8705;
+ GL_SIGNED_ALPHA8_NV = $8706;
+ GL_SIGNED_INTENSITY_NV = $8707;
+ GL_SIGNED_INTENSITY8_NV = $8708;
+ GL_SIGNED_RGB_UNSIGNED_ALPHA_NV = $870C;
+ GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV = $870D;
+ GL_HILO16_NV = $86F8;
+ GL_SIGNED_HILO_NV = $86F9;
+ GL_SIGNED_HILO16_NV = $86FA;
+ GL_DSDT8_NV = $8709;
+ GL_DSDT8_MAG8_NV = $870A;
+ GL_DSDT_MAG_INTENSITY_NV = $86DC;
+ GL_DSDT8_MAG8_INTENSITY8_NV = $870B;
+ GL_HI_SCALE_NV = $870E;
+ GL_LO_SCALE_NV = $870F;
+ GL_DS_SCALE_NV = $8710;
+ GL_DT_SCALE_NV = $8711;
+ GL_MAGNITUDE_SCALE_NV = $8712;
+ GL_VIBRANCE_SCALE_NV = $8713;
+ GL_HI_BIAS_NV = $8714;
+ GL_LO_BIAS_NV = $8715;
+ GL_DS_BIAS_NV = $8716;
+ GL_DT_BIAS_NV = $8717;
+ GL_MAGNITUDE_BIAS_NV = $8718;
+ GL_VIBRANCE_BIAS_NV = $8719;
+ GL_TEXTURE_BORDER_VALUES_NV = $871A;
+ GL_TEXTURE_HI_SIZE_NV = $871B;
+ GL_TEXTURE_LO_SIZE_NV = $871C;
+ GL_TEXTURE_DS_SIZE_NV = $871D;
+ GL_TEXTURE_DT_SIZE_NV = $871E;
+ GL_TEXTURE_MAG_SIZE_NV = $871F;
+
+function Load_GL_NV_texture_shader: Boolean;
+
+//***** GL_NV_texture_shader2 *****//
+const
+ GL_DOT_PRODUCT_TEXTURE_3D_NV = $86EF;
+ // GL_HILO_NV { already defined }
+ // GL_DSDT_NV { already defined }
+ // GL_DSDT_MAG_NV { already defined }
+ // GL_DSDT_MAG_VIB_NV { already defined }
+ // GL_UNSIGNED_INT_S8_S8_8_8_NV { already defined }
+ // GL_UNSIGNED_INT_8_8_S8_S8_REV_NV { already defined }
+ // GL_SIGNED_RGBA_NV { already defined }
+ // GL_SIGNED_RGBA8_NV { already defined }
+ // GL_SIGNED_RGB_NV { already defined }
+ // GL_SIGNED_RGB8_NV { already defined }
+ // GL_SIGNED_LUMINANCE_NV { already defined }
+ // GL_SIGNED_LUMINANCE8_NV { already defined }
+ // GL_SIGNED_LUMINANCE_ALPHA_NV { already defined }
+ // GL_SIGNED_LUMINANCE8_ALPHA8_NV { already defined }
+ // GL_SIGNED_ALPHA_NV { already defined }
+ // GL_SIGNED_ALPHA8_NV { already defined }
+ // GL_SIGNED_INTENSITY_NV { already defined }
+ // GL_SIGNED_INTENSITY8_NV { already defined }
+ // GL_SIGNED_RGB_UNSIGNED_ALPHA_NV { already defined }
+ // GL_SIGNED_RGB8_UNSIGNED_ALPHA8_NV { already defined }
+ // GL_HILO16_NV { already defined }
+ // GL_SIGNED_HILO_NV { already defined }
+ // GL_SIGNED_HILO16_NV { already defined }
+ // GL_DSDT8_NV { already defined }
+ // GL_DSDT8_MAG8_NV { already defined }
+ // GL_DSDT_MAG_INTENSITY_NV { already defined }
+ // GL_DSDT8_MAG8_INTENSITY8_NV { already defined }
+
+function Load_GL_NV_texture_shader2: Boolean;
+
+//***** GL_NV_texture_shader3 *****//
+const
+ GL_OFFSET_PROJECTIVE_TEXTURE_2D_NV = $8850;
+ GL_OFFSET_PROJECTIVE_TEXTURE_2D_SCALE_NV = $8851;
+ GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_NV = $8852;
+ GL_OFFSET_PROJECTIVE_TEXTURE_RECTANGLE_SCALE_NV = $8853;
+ GL_OFFSET_HILO_TEXTURE_2D_NV = $8854;
+ GL_OFFSET_HILO_TEXTURE_RECTANGLE_NV = $8855;
+ GL_OFFSET_HILO_PROJECTIVE_TEXTURE_2D_NV = $8856;
+ GL_OFFSET_HILO_PROJECTIVE_TEXTURE_RECTANGLE_NV = $8857;
+ GL_DEPENDENT_HILO_TEXTURE_2D_NV = $8858;
+ GL_DEPENDENT_RGB_TEXTURE_3D_NV = $8859;
+ GL_DEPENDENT_RGB_TEXTURE_CUBE_MAP_NV = $885A;
+ GL_DOT_PRODUCT_PASS_THROUGH_NV = $885B;
+ GL_DOT_PRODUCT_TEXTURE_1D_NV = $885C;
+ GL_DOT_PRODUCT_AFFINE_DEPTH_REPLACE_NV = $885D;
+ GL_HILO8_NV = $885E;
+ GL_SIGNED_HILO8_NV = $885F;
+ GL_FORCE_BLUE_TO_ONE_NV = $8860;
+
+function Load_GL_NV_texture_shader3: Boolean;
+
+//***** GL_NV_vertex_array_range *****//
+const
+ GL_VERTEX_ARRAY_RANGE_NV = $851D;
+ GL_VERTEX_ARRAY_RANGE_LENGTH_NV = $851E;
+ GL_VERTEX_ARRAY_RANGE_VALID_NV = $851F;
+ GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_NV = $8520;
+ GL_VERTEX_ARRAY_RANGE_POINTER_NV = $8521;
+var
+ glVertexArrayRangeNV: procedure(length: GLsizei; pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFlushVertexArrayRangeNV: procedure(); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+{$IFDEF WINDOWS}
+ wglAllocateMemoryNV: function(size: GLsizei; readFrequency: GLfloat; writeFrequency: GLfloat; priority: GLfloat): PGLvoid; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglFreeMemoryNV: procedure(pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+{$ENDIF}
+
+function Load_GL_NV_vertex_array_range: Boolean;
+
+//***** GL_NV_vertex_array_range2 *****//
+const
+ GL_VERTEX_ARRAY_RANGE_WITHOUT_FLUSH_NV = $8533;
+
+function Load_GL_NV_vertex_array_range2: Boolean;
+
+//***** GL_NV_vertex_program *****//
+const
+ GL_VERTEX_PROGRAM_NV = $8620;
+ GL_VERTEX_PROGRAM_POINT_SIZE_NV = $8642;
+ GL_VERTEX_PROGRAM_TWO_SIDE_NV = $8643;
+ GL_VERTEX_STATE_PROGRAM_NV = $8621;
+ GL_ATTRIB_ARRAY_SIZE_NV = $8623;
+ GL_ATTRIB_ARRAY_STRIDE_NV = $8624;
+ GL_ATTRIB_ARRAY_TYPE_NV = $8625;
+ GL_CURRENT_ATTRIB_NV = $8626;
+ GL_PROGRAM_PARAMETER_NV = $8644;
+ GL_ATTRIB_ARRAY_POINTER_NV = $8645;
+ GL_PROGRAM_TARGET_NV = $8646;
+ GL_PROGRAM_LENGTH_NV = $8627;
+ GL_PROGRAM_RESIDENT_NV = $8647;
+ GL_PROGRAM_STRING_NV = $8628;
+ GL_TRACK_MATRIX_NV = $8648;
+ GL_TRACK_MATRIX_TRANSFORM_NV = $8649;
+ GL_MAX_TRACK_MATRIX_STACK_DEPTH_NV = $862E;
+ GL_MAX_TRACK_MATRICES_NV = $862F;
+ GL_CURRENT_MATRIX_STACK_DEPTH_NV = $8640;
+ GL_CURRENT_MATRIX_NV = $8641;
+ GL_VERTEX_PROGRAM_BINDING_NV = $864A;
+ GL_PROGRAM_ERROR_POSITION_NV = $864B;
+ GL_MODELVIEW_PROJECTION_NV = $8629;
+ GL_MATRIX0_NV = $8630;
+ GL_MATRIX1_NV = $8631;
+ GL_MATRIX2_NV = $8632;
+ GL_MATRIX3_NV = $8633;
+ GL_MATRIX4_NV = $8634;
+ GL_MATRIX5_NV = $8635;
+ GL_MATRIX6_NV = $8636;
+ GL_MATRIX7_NV = $8637;
+ GL_IDENTITY_NV = $862A;
+ GL_INVERSE_NV = $862B;
+ GL_TRANSPOSE_NV = $862C;
+ GL_INVERSE_TRANSPOSE_NV = $862D;
+ GL_VERTEX_ATTRIB_ARRAY0_NV = $8650;
+ GL_VERTEX_ATTRIB_ARRAY1_NV = $8651;
+ GL_VERTEX_ATTRIB_ARRAY2_NV = $8652;
+ GL_VERTEX_ATTRIB_ARRAY3_NV = $8653;
+ GL_VERTEX_ATTRIB_ARRAY4_NV = $8654;
+ GL_VERTEX_ATTRIB_ARRAY5_NV = $8655;
+ GL_VERTEX_ATTRIB_ARRAY6_NV = $8656;
+ GL_VERTEX_ATTRIB_ARRAY7_NV = $8657;
+ GL_VERTEX_ATTRIB_ARRAY8_NV = $8658;
+ GL_VERTEX_ATTRIB_ARRAY9_NV = $8659;
+ GL_VERTEX_ATTRIB_ARRAY10_NV = $865A;
+ GL_VERTEX_ATTRIB_ARRAY11_NV = $865B;
+ GL_VERTEX_ATTRIB_ARRAY12_NV = $865C;
+ GL_VERTEX_ATTRIB_ARRAY13_NV = $865D;
+ GL_VERTEX_ATTRIB_ARRAY14_NV = $865E;
+ GL_VERTEX_ATTRIB_ARRAY15_NV = $865F;
+ GL_MAP1_VERTEX_ATTRIB0_4_NV = $8660;
+ GL_MAP1_VERTEX_ATTRIB1_4_NV = $8661;
+ GL_MAP1_VERTEX_ATTRIB2_4_NV = $8662;
+ GL_MAP1_VERTEX_ATTRIB3_4_NV = $8663;
+ GL_MAP1_VERTEX_ATTRIB4_4_NV = $8664;
+ GL_MAP1_VERTEX_ATTRIB5_4_NV = $8665;
+ GL_MAP1_VERTEX_ATTRIB6_4_NV = $8666;
+ GL_MAP1_VERTEX_ATTRIB7_4_NV = $8667;
+ GL_MAP1_VERTEX_ATTRIB8_4_NV = $8668;
+ GL_MAP1_VERTEX_ATTRIB9_4_NV = $8669;
+ GL_MAP1_VERTEX_ATTRIB10_4_NV = $866A;
+ GL_MAP1_VERTEX_ATTRIB11_4_NV = $866B;
+ GL_MAP1_VERTEX_ATTRIB12_4_NV = $866C;
+ GL_MAP1_VERTEX_ATTRIB13_4_NV = $866D;
+ GL_MAP1_VERTEX_ATTRIB14_4_NV = $866E;
+ GL_MAP1_VERTEX_ATTRIB15_4_NV = $866F;
+ GL_MAP2_VERTEX_ATTRIB0_4_NV = $8670;
+ GL_MAP2_VERTEX_ATTRIB1_4_NV = $8671;
+ GL_MAP2_VERTEX_ATTRIB2_4_NV = $8672;
+ GL_MAP2_VERTEX_ATTRIB3_4_NV = $8673;
+ GL_MAP2_VERTEX_ATTRIB4_4_NV = $8674;
+ GL_MAP2_VERTEX_ATTRIB5_4_NV = $8675;
+ GL_MAP2_VERTEX_ATTRIB6_4_NV = $8676;
+ GL_MAP2_VERTEX_ATTRIB7_4_NV = $8677;
+ GL_MAP2_VERTEX_ATTRIB8_4_NV = $8678;
+ GL_MAP2_VERTEX_ATTRIB9_4_NV = $8679;
+ GL_MAP2_VERTEX_ATTRIB10_4_NV = $867A;
+ GL_MAP2_VERTEX_ATTRIB11_4_NV = $867B;
+ GL_MAP2_VERTEX_ATTRIB12_4_NV = $867C;
+ GL_MAP2_VERTEX_ATTRIB13_4_NV = $867D;
+ GL_MAP2_VERTEX_ATTRIB14_4_NV = $867E;
+ GL_MAP2_VERTEX_ATTRIB15_4_NV = $867F;
+var
+ glBindProgramNV: procedure(target: GLenum; id: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDeleteProgramsNV: procedure(n: GLsizei; const ids: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glExecuteProgramNV: procedure(target: GLenum; id: GLuint; const params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGenProgramsNV: procedure(n: GLsizei; ids: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glAreProgramsResidentNV: function(n: GLsizei; const ids: PGLuint; residences: PGLboolean): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRequestResidentProgramsNV: procedure(n: GLsizei; ids: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetProgramParameterfvNV: procedure(target: GLenum; index: GLuint; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetProgramParameterdvNV: procedure(target: GLenum; index: GLuint; pname: GLenum; params: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetProgramivNV: procedure(id: GLuint; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetProgramStringNV: procedure(id: GLuint; pname: GLenum; _program: PGLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetTrackMatrixivNV: procedure(target: GLenum; address: GLuint; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetVertexAttribdvNV: procedure(index: GLuint; pname: GLenum; params: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetVertexAttribfvNV: procedure(index: GLuint; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetVertexAttribivNV: procedure(index: GLuint; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetVertexAttribPointervNV: procedure(index: GLuint; pname: GLenum; pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIsProgramNV: function(id: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLoadProgramNV: procedure(target: GLenum; id: GLuint; len: GLsizei; const _program: PGLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glProgramParameter4fNV: procedure(target: GLenum; index: GLuint; x: GLfloat; y: GLfloat; z: GLfloat; w: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glProgramParameter4fvNV: procedure(target: GLenum; index: GLuint; const params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glProgramParameters4dvNV: procedure(target: GLenum; index: GLuint; num: GLuint; const params: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glProgramParameters4fvNV: procedure(target: GLenum; index: GLuint; num: GLuint; const params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTrackMatrixNV: procedure(target: GLenum; address: GLuint; matrix: GLenum; transform: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttribPointerNV: procedure(index: GLuint; size: GLint; _type: GLenum; stride: GLsizei; const pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib1sNV: procedure(index: GLuint; x: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib1fNV: procedure(index: GLuint; x: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib1dNV: procedure(index: GLuint; x: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib2sNV: procedure(index: GLuint; x: GLshort; y: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib2fNV: procedure(index: GLuint; x: GLfloat; y: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib2dNV: procedure(index: GLuint; x: GLdouble; y: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib3sNV: procedure(index: GLuint; x: GLshort; y: GLshort; z: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib3fNV: procedure(index: GLuint; x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib3dNV: procedure(index: GLuint; x: GLdouble; y: GLdouble; z: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4sNV: procedure(index: GLuint; x: GLshort; y: GLshort; z: GLshort; w: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4fNV: procedure(index: GLuint; x: GLfloat; y: GLfloat; z: GLfloat; w: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4dNV: procedure(index: GLuint; x: GLdouble; y: GLdouble; z: GLdouble; w: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4ubNV: procedure(index: GLuint; x: GLubyte; y: GLubyte; z: GLubyte; w: GLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib1svNV: procedure(index: GLuint; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib1fvNV: procedure(index: GLuint; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib1dvNV: procedure(index: GLuint; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib2svNV: procedure(index: GLuint; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib2fvNV: procedure(index: GLuint; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib2dvNV: procedure(index: GLuint; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib3svNV: procedure(index: GLuint; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib3fvNV: procedure(index: GLuint; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib3dvNV: procedure(index: GLuint; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4svNV: procedure(index: GLuint; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4fvNV: procedure(index: GLuint; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4dvNV: procedure(index: GLuint; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4ubvNV: procedure(index: GLuint; const v: PGLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttribs1svNV: procedure(index: GLuint; n: GLsizei; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttribs1fvNV: procedure(index: GLuint; n: GLsizei; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttribs1dvNV: procedure(index: GLuint; n: GLsizei; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttribs2svNV: procedure(index: GLuint; n: GLsizei; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttribs2fvNV: procedure(index: GLuint; n: GLsizei; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttribs2dvNV: procedure(index: GLuint; n: GLsizei; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttribs3svNV: procedure(index: GLuint; n: GLsizei; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttribs3fvNV: procedure(index: GLuint; n: GLsizei; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttribs3dvNV: procedure(index: GLuint; n: GLsizei; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttribs4svNV: procedure(index: GLuint; n: GLsizei; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttribs4fvNV: procedure(index: GLuint; n: GLsizei; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttribs4dvNV: procedure(index: GLuint; n: GLsizei; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttribs4ubvNV: procedure(index: GLuint; n: GLsizei; const v: PGLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_NV_vertex_program: Boolean;
+
+//***** GL_NV_vertex_program1_1 *****//
+
+function Load_GL_NV_vertex_program1_1: Boolean;
+
+//***** GL_ATI_element_array *****//
+const
+ GL_ELEMENT_ARRAY_ATI = $8768;
+ GL_ELEMENT_ARRAY_TYPE_ATI = $8769;
+ GL_ELEMENT_ARRAY_POINTER_ATI = $876A;
+var
+ glElementPointerATI: procedure(_type: GLenum; const pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDrawElementArrayATI: procedure(mode: GLenum; count: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDrawRangeElementArrayATI: procedure(mode: GLenum; start: GLuint; _end: GLuint; count: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ATI_element_array: Boolean;
+
+//***** GL_ATI_envmap_bumpmap *****//
+const
+ GL_BUMP_ROT_MATRIX_ATI = $8775;
+ GL_BUMP_ROT_MATRIX_SIZE_ATI = $8776;
+ GL_BUMP_NUM_TEX_UNITS_ATI = $8777;
+ GL_BUMP_TEX_UNITS_ATI = $8778;
+ GL_DUDV_ATI = $8779;
+ GL_DU8DV8_ATI = $877A;
+ GL_BUMP_ENVMAP_ATI = $877B;
+ GL_BUMP_TARGET_ATI = $877C;
+var
+ glTexBumpParameterivATI: procedure(pname: GLenum; param: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexBumpParameterfvATI: procedure(pname: GLenum; param: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetTexBumpParameterivATI: procedure(pname: GLenum; param: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetTexBumpParameterfvATI: procedure(pname: GLenum; param: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ATI_envmap_bumpmap: Boolean;
+
+//***** GL_ATI_fragment_shader *****//
+const
+ GL_FRAGMENT_SHADER_ATI = $8920;
+ GL_REG_0_ATI = $8921;
+ GL_REG_1_ATI = $8922;
+ GL_REG_2_ATI = $8923;
+ GL_REG_3_ATI = $8924;
+ GL_REG_4_ATI = $8925;
+ GL_REG_5_ATI = $8926;
+ GL_CON_0_ATI = $8941;
+ GL_CON_1_ATI = $8942;
+ GL_CON_2_ATI = $8943;
+ GL_CON_3_ATI = $8944;
+ GL_CON_4_ATI = $8945;
+ GL_CON_5_ATI = $8946;
+ GL_CON_6_ATI = $8947;
+ GL_CON_7_ATI = $8948;
+ GL_MOV_ATI = $8961;
+ GL_ADD_ATI = $8963;
+ GL_MUL_ATI = $8964;
+ GL_SUB_ATI = $8965;
+ GL_DOT3_ATI = $8966;
+ GL_DOT4_ATI = $8967;
+ GL_MAD_ATI = $8968;
+ GL_LERP_ATI = $8969;
+ GL_CND_ATI = $896A;
+ GL_CND0_ATI = $896B;
+ GL_DOT2_ADD_ATI = $896C;
+ GL_SECONDARY_INTERPOLATOR_ATI = $896D;
+ GL_SWIZZLE_STR_ATI = $8976;
+ GL_SWIZZLE_STQ_ATI = $8977;
+ GL_SWIZZLE_STR_DR_ATI = $8978;
+ GL_SWIZZLE_STQ_DQ_ATI = $8979;
+ GL_RED_BIT_ATI = $0001;
+ GL_GREEN_BIT_ATI = $0002;
+ GL_BLUE_BIT_ATI = $0004;
+ GL_2X_BIT_ATI = $0001;
+ GL_4X_BIT_ATI = $0002;
+ GL_8X_BIT_ATI = $0004;
+ GL_HALF_BIT_ATI = $0008;
+ GL_QUARTER_BIT_ATI = $0010;
+ GL_EIGHTH_BIT_ATI = $0020;
+ GL_SATURATE_BIT_ATI = $0040;
+ // GL_2X_BIT_ATI { already defined }
+ GL_COMP_BIT_ATI = $0002;
+ GL_NEGATE_BIT_ATI = $0004;
+ GL_BIAS_BIT_ATI = $0008;
+var
+ glGenFragmentShadersATI: function(range: GLuint): GLuint; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBindFragmentShaderATI: procedure(id: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDeleteFragmentShaderATI: procedure(id: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBeginFragmentShaderATI: procedure(); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEndFragmentShaderATI: procedure(); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPassTexCoordATI: procedure(dst: GLuint; coord: GLuint; swizzle: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSampleMapATI: procedure(dst: GLuint; interp: GLuint; swizzle: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColorFragmentOp1ATI: procedure(op: GLenum; dst: GLuint; dstMask: GLuint; dstMod: GLuint; arg1: GLuint; arg1Rep: GLuint; arg1Mod: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColorFragmentOp2ATI: procedure(op: GLenum; dst: GLuint; dstMask: GLuint; dstMod: GLuint; arg1: GLuint; arg1Rep: GLuint; arg1Mod: GLuint; arg2: GLuint; arg2Rep: GLuint; arg2Mod: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColorFragmentOp3ATI: procedure(op: GLenum; dst: GLuint; dstMask: GLuint; dstMod: GLuint; arg1: GLuint; arg1Rep: GLuint; arg1Mod: GLuint; arg2: GLuint; arg2Rep: GLuint; arg2Mod: GLuint; arg3: GLuint; arg3Rep: GLuint; arg3Mod: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glAlphaFragmentOp1ATI: procedure(op: GLenum; dst: GLuint; dstMod: GLuint; arg1: GLuint; arg1Rep: GLuint; arg1Mod: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glAlphaFragmentOp2ATI: procedure(op: GLenum; dst: GLuint; dstMod: GLuint; arg1: GLuint; arg1Rep: GLuint; arg1Mod: GLuint; arg2: GLuint; arg2Rep: GLuint; arg2Mod: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glAlphaFragmentOp3ATI: procedure(op: GLenum; dst: GLuint; dstMod: GLuint; arg1: GLuint; arg1Rep: GLuint; arg1Mod: GLuint; arg2: GLuint; arg2Rep: GLuint; arg2Mod: GLuint; arg3: GLuint; arg3Rep: GLuint; arg3Mod: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSetFragmentShaderConstantATI: procedure(dst: GLuint; const value: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ATI_fragment_shader: Boolean;
+
+//***** GL_ATI_pn_triangles *****//
+const
+ GL_PN_TRIANGLES_ATI = $87F0;
+ GL_MAX_PN_TRIANGLES_TESSELATION_LEVEL_ATI = $87F1;
+ GL_PN_TRIANGLES_POINT_MODE_ATI = $87F2;
+ GL_PN_TRIANGLES_NORMAL_MODE_ATI = $87F3;
+ GL_PN_TRIANGLES_TESSELATION_LEVEL_ATI = $87F4;
+ GL_PN_TRIANGLES_POINT_MODE_LINEAR_ATI = $87F5;
+ GL_PN_TRIANGLES_POINT_MODE_CUBIC_ATI = $87F6;
+ GL_PN_TRIANGLES_NORMAL_MODE_LINEAR_ATI = $87F7;
+ GL_PN_TRIANGLES_NORMAL_MODE_QUADRATIC_ATI = $87F8;
+var
+ glPNTrianglesiATI: procedure(pname: GLenum; param: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPNTrianglesfATI: procedure(pname: GLenum; param: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ATI_pn_triangles: Boolean;
+
+//***** GL_ATI_texture_mirror_once *****//
+const
+ GL_MIRROR_CLAMP_ATI = $8742;
+ GL_MIRROR_CLAMP_TO_EDGE_ATI = $8743;
+
+function Load_GL_ATI_texture_mirror_once: Boolean;
+
+//***** GL_ATI_vertex_array_object *****//
+const
+ GL_STATIC_ATI = $8760;
+ GL_DYNAMIC_ATI = $8761;
+ GL_PRESERVE_ATI = $8762;
+ GL_DISCARD_ATI = $8763;
+ GL_OBJECT_BUFFER_SIZE_ATI = $8764;
+ GL_OBJECT_BUFFER_USAGE_ATI = $8765;
+ GL_ARRAY_OBJECT_BUFFER_ATI = $8766;
+ GL_ARRAY_OBJECT_OFFSET_ATI = $8767;
+var
+ glNewObjectBufferATI: function(size: GLsizei; const pointer: PGLvoid; usage: GLenum): GLuint; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIsObjectBufferATI: function(buffer: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUpdateObjectBufferATI: procedure(buffer: GLuint; offset: GLuint; size: GLsizei; const pointer: PGLvoid; preserve: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetObjectBufferfvATI: procedure(buffer: GLuint; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetObjectBufferivATI: procedure(buffer: GLuint; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDeleteObjectBufferATI: procedure(buffer: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glArrayObjectATI: procedure(_array: GLenum; size: GLint; _type: GLenum; stride: GLsizei; buffer: GLuint; offset: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetArrayObjectfvATI: procedure(_array: GLenum; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetArrayObjectivATI: procedure(_array: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVariantArrayObjectATI: procedure(id: GLuint; _type: GLenum; stride: GLsizei; buffer: GLuint; offset: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetVariantArrayObjectfvATI: procedure(id: GLuint; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetVariantArrayObjectivATI: procedure(id: GLuint; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ATI_vertex_array_object: Boolean;
+
+//***** GL_ATI_vertex_streams *****//
+const
+ GL_MAX_VERTEX_STREAMS_ATI = $876B;
+ GL_VERTEX_STREAM0_ATI = $876C;
+ GL_VERTEX_STREAM1_ATI = $876D;
+ GL_VERTEX_STREAM2_ATI = $876E;
+ GL_VERTEX_STREAM3_ATI = $876F;
+ GL_VERTEX_STREAM4_ATI = $8770;
+ GL_VERTEX_STREAM5_ATI = $8771;
+ GL_VERTEX_STREAM6_ATI = $8772;
+ GL_VERTEX_STREAM7_ATI = $8773;
+ GL_VERTEX_SOURCE_ATI = $8774;
+var
+ glVertexStream1s: procedure(stream: GLenum; coords: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream1i: procedure(stream: GLenum; coords: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream1f: procedure(stream: GLenum; coords: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream1d: procedure(stream: GLenum; coords: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream1sv: procedure(stream: GLenum; coords: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream1iv: procedure(stream: GLenum; coords: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream1fv: procedure(stream: GLenum; coords: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream1dv: procedure(stream: GLenum; coords: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream2s: procedure(stream: GLenum; coords: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream2i: procedure(stream: GLenum; coords: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream2f: procedure(stream: GLenum; coords: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream2d: procedure(stream: GLenum; coords: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream2sv: procedure(stream: GLenum; coords: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream2iv: procedure(stream: GLenum; coords: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream2fv: procedure(stream: GLenum; coords: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream2dv: procedure(stream: GLenum; coords: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream3s: procedure(stream: GLenum; coords: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream3i: procedure(stream: GLenum; coords: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream3f: procedure(stream: GLenum; coords: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream3d: procedure(stream: GLenum; coords: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream3sv: procedure(stream: GLenum; coords: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream3iv: procedure(stream: GLenum; coords: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream3fv: procedure(stream: GLenum; coords: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream3dv: procedure(stream: GLenum; coords: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream4s: procedure(stream: GLenum; coords: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream4i: procedure(stream: GLenum; coords: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream4f: procedure(stream: GLenum; coords: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream4d: procedure(stream: GLenum; coords: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream4sv: procedure(stream: GLenum; coords: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream4iv: procedure(stream: GLenum; coords: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream4fv: procedure(stream: GLenum; coords: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexStream4dv: procedure(stream: GLenum; coords: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormalStream3b: procedure(stream: GLenum; coords: GLbyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormalStream3s: procedure(stream: GLenum; coords: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormalStream3i: procedure(stream: GLenum; coords: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormalStream3f: procedure(stream: GLenum; coords: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormalStream3d: procedure(stream: GLenum; coords: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormalStream3bv: procedure(stream: GLenum; coords: GLbyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormalStream3sv: procedure(stream: GLenum; coords: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormalStream3iv: procedure(stream: GLenum; coords: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormalStream3fv: procedure(stream: GLenum; coords: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormalStream3dv: procedure(stream: GLenum; coords: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glClientActiveVertexStream: procedure(stream: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexBlendEnvi: procedure(pname: GLenum; param: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexBlendEnvf: procedure(pname: GLenum; param: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ATI_vertex_streams: Boolean;
+
+{$IFDEF WINDOWS}
+//***** WGL_I3D_image_buffer *****//
+const
+ WGL_IMAGE_BUFFER_MIN_ACCESS_I3D = $0001;
+ WGL_IMAGE_BUFFER_LOCK_I3D = $0002;
+var
+ wglCreateImageBufferI3D: function(hDC: HDC; dwSize: DWORD; uFlags: UINT): PGLvoid; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglDestroyImageBufferI3D: function(hDC: HDC; pAddress: PGLvoid): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglAssociateImageBufferEventsI3D: function(hdc: HDC; pEvent: PHandle; pAddress: PGLvoid; pSize: PDWORD; count: UINT): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglReleaseImageBufferEventsI3D: function(hdc: HDC; pAddress: PGLvoid; count: UINT): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_WGL_I3D_image_buffer: Boolean;
+
+//***** WGL_I3D_swap_frame_lock *****//
+var
+ wglEnableFrameLockI3D: function(): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglDisableFrameLockI3D: function(): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglIsEnabledFrameLockI3D: function(pFlag: PBOOL): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglQueryFrameLockMasterI3D: function(pFlag: PBOOL): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_WGL_I3D_swap_frame_lock: Boolean;
+
+//***** WGL_I3D_swap_frame_usage *****//
+var
+ wglGetFrameUsageI3D: function(pUsage: PGLfloat): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglBeginFrameTrackingI3D: function(): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglEndFrameTrackingI3D: function(): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglQueryFrameTrackingI3D: function(pFrameCount: PDWORD; pMissedFrames: PDWORD; pLastMissedUsage: PGLfloat): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_WGL_I3D_swap_frame_usage: Boolean;
+{$ENDIF}
+
+//***** GL_3DFX_texture_compression_FXT1 *****//
+const
+ GL_COMPRESSED_RGB_FXT1_3DFX = $86B0;
+ GL_COMPRESSED_RGBA_FXT1_3DFX = $86B1;
+
+function Load_GL_3DFX_texture_compression_FXT1: Boolean;
+
+//***** GL_IBM_cull_vertex *****//
+const
+ GL_CULL_VERTEX_IBM = $1928A;
+
+function Load_GL_IBM_cull_vertex: Boolean;
+
+//***** GL_IBM_multimode_draw_arrays *****//
+var
+ glMultiModeDrawArraysIBM: procedure(mode: PGLenum; first: PGLint; count: PGLsizei; primcount: GLsizei; modestride: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiModeDrawElementsIBM: procedure(mode: PGLenum; count: PGLsizei; _type: GLenum; const indices: PGLvoid; primcount: GLsizei; modestride: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_IBM_multimode_draw_arrays: Boolean;
+
+//***** GL_IBM_raster_pos_clip *****//
+const
+ GL_RASTER_POSITION_UNCLIPPED_IBM = $19262;
+
+function Load_GL_IBM_raster_pos_clip: Boolean;
+
+//***** GL_IBM_texture_mirrored_repeat *****//
+const
+ GL_MIRRORED_REPEAT_IBM = $8370;
+
+function Load_GL_IBM_texture_mirrored_repeat: Boolean;
+
+//***** GL_IBM_vertex_array_lists *****//
+const
+ GL_VERTEX_ARRAY_LIST_IBM = $1929E;
+ GL_NORMAL_ARRAY_LIST_IBM = $1929F;
+ GL_COLOR_ARRAY_LIST_IBM = $192A0;
+ GL_INDEX_ARRAY_LIST_IBM = $192A1;
+ GL_TEXTURE_COORD_ARRAY_LIST_IBM = $192A2;
+ GL_EDGE_FLAG_ARRAY_LIST_IBM = $192A3;
+ GL_FOG_COORDINATE_ARRAY_LIST_IBM = $192A4;
+ GL_SECONDARY_COLOR_ARRAY_LIST_IBM = $192A5;
+ GL_VERTEX_ARRAY_LIST_STRIDE_IBM = $192A8;
+ GL_NORMAL_ARRAY_LIST_STRIDE_IBM = $192A9;
+ GL_COLOR_ARRAY_LIST_STRIDE_IBM = $192AA;
+ GL_INDEX_ARRAY_LIST_STRIDE_IBM = $192AB;
+ GL_TEXTURE_COORD_ARRAY_LIST_STRIDE_IBM = $192AC;
+ GL_EDGE_FLAG_ARRAY_LIST_STRIDE_IBM = $192AD;
+ GL_FOG_COORDINATE_ARRAY_LIST_STRIDE_IBM = $192AE;
+ GL_SECONDARY_COLOR_ARRAY_LIST_STRIDE_IBM = $192AF;
+var
+ glColorPointerListIBM: procedure(size: GLint; _type: GLenum; stride: GLint; const pointer: PGLvoid; ptrstride: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColorPointerListIBM: procedure(size: GLint; _type: GLenum; stride: GLint; const pointer: PGLvoid; ptrstride: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEdgeFlagPointerListIBM: procedure(stride: GLint; const pointer: PGLboolean; ptrstride: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFogCoordPointerListIBM: procedure(_type: GLenum; stride: GLint; const pointer: PGLvoid; ptrstride: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormalPointerListIBM: procedure(_type: GLenum; stride: GLint; const pointer: PGLvoid; ptrstride: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoordPointerListIBM: procedure(size: GLint; _type: GLenum; stride: GLint; const pointer: PGLvoid; ptrstride: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexPointerListIBM: procedure(size: GLint; _type: GLenum; stride: GLint; const pointer: PGLvoid; ptrstride: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_IBM_vertex_array_lists: Boolean;
+
+//***** GL_MESA_resize_buffers *****//
+var
+ glResizeBuffersMESA: procedure(); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_MESA_resize_buffers: Boolean;
+
+//***** GL_MESA_window_pos *****//
+var
+ glWindowPos2dMESA: procedure(x: GLdouble; y: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2fMESA: procedure(x: GLfloat; y: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2iMESA: procedure(x: GLint; y: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2sMESA: procedure(x: GLshort; y: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2ivMESA: procedure(const p: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2svMESA: procedure(const p: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2fvMESA: procedure(const p: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2dvMESA: procedure(const p: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3iMESA: procedure(x: GLint; y: GLint; z: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3sMESA: procedure(x: GLshort; y: GLshort; z: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3fMESA: procedure(x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3dMESA: procedure(x: GLdouble; y: GLdouble; z: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3ivMESA: procedure(const p: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3svMESA: procedure(const p: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3fvMESA: procedure(const p: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3dvMESA: procedure(const p: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos4iMESA: procedure(x: GLint; y: GLint; z: GLint; w: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos4sMESA: procedure(x: GLshort; y: GLshort; z: GLshort; w: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos4fMESA: procedure(x: GLfloat; y: GLfloat; z: GLfloat; w: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos4dMESA: procedure(x: GLdouble; y: GLdouble; z: GLdouble; w: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos4ivMESA: procedure(const p: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos4svMESA: procedure(const p: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos4fvMESA: procedure(const p: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos4dvMESA: procedure(const p: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_MESA_window_pos: Boolean;
+
+//***** GL_OML_interlace *****//
+const
+ GL_INTERLACE_OML = $8980;
+ GL_INTERLACE_READ_OML = $8981;
+
+function Load_GL_OML_interlace: Boolean;
+
+//***** GL_OML_resample *****//
+const
+ GL_PACK_RESAMPLE_OML = $8984;
+ GL_UNPACK_RESAMPLE_OML = $8985;
+ GL_RESAMPLE_REPLICATE_OML = $8986;
+ GL_RESAMPLE_ZERO_FILL_OML = $8987;
+ GL_RESAMPLE_AVERAGE_OML = $8988;
+ GL_RESAMPLE_DECIMATE_OML = $8989;
+ // GL_RESAMPLE_AVERAGE_OML { already defined }
+
+function Load_GL_OML_resample: Boolean;
+
+//***** GL_OML_subsample *****//
+const
+ GL_FORMAT_SUBSAMPLE_24_24_OML = $8982;
+ GL_FORMAT_SUBSAMPLE_244_244_OML = $8983;
+
+function Load_GL_OML_subsample: Boolean;
+
+//***** GL_SGIS_generate_mipmap *****//
+const
+ GL_GENERATE_MIPMAP_SGIS = $8191;
+ GL_GENERATE_MIPMAP_HINT_SGIS = $8192;
+
+function Load_GL_SGIS_generate_mipmap: Boolean;
+
+//***** GL_SGIS_multisample *****//
+const
+ GLX_SAMPLE_BUFFERS_SGIS = $186A0;
+ GLX_SAMPLES_SGIS = $186A1;
+ GL_MULTISAMPLE_SGIS = $809D;
+ GL_SAMPLE_ALPHA_TO_MASK_SGIS = $809E;
+ GL_SAMPLE_ALPHA_TO_ONE_SGIS = $809F;
+ GL_SAMPLE_MASK_SGIS = $80A0;
+ GL_MULTISAMPLE_BIT_EXT = $20000000;
+ GL_1PASS_SGIS = $80A1;
+ GL_2PASS_0_SGIS = $80A2;
+ GL_2PASS_1_SGIS = $80A3;
+ GL_4PASS_0_SGIS = $80A4;
+ GL_4PASS_1_SGIS = $80A5;
+ GL_4PASS_2_SGIS = $80A6;
+ GL_4PASS_3_SGIS = $80A7;
+ GL_SAMPLE_BUFFERS_SGIS = $80A8;
+ GL_SAMPLES_SGIS = $80A9;
+ GL_SAMPLE_MASK_VALUE_SGIS = $80AA;
+ GL_SAMPLE_MASK_INVERT_SGIS = $80AB;
+ GL_SAMPLE_PATTERN_SGIS = $80AC;
+var
+ glSampleMaskSGIS: procedure(value: GLclampf; invert: GLboolean); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSamplePatternSGIS: procedure(pattern: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_SGIS_multisample: Boolean;
+
+//***** GL_SGIS_pixel_texture *****//
+const
+ GL_PIXEL_TEXTURE_SGIS = $8353;
+ GL_PIXEL_FRAGMENT_RGB_SOURCE_SGIS = $8354;
+ GL_PIXEL_FRAGMENT_ALPHA_SOURCE_SGIS = $8355;
+ GL_PIXEL_GROUP_COLOR_SGIS = $8356;
+var
+ glPixelTexGenParameteriSGIS: procedure(pname: GLenum; param: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPixelTexGenParameterfSGIS: procedure(pname: GLenum; param: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetPixelTexGenParameterivSGIS: procedure(pname: GLenum; params: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetPixelTexGenParameterfvSGIS: procedure(pname: GLenum; params: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_SGIS_pixel_texture: Boolean;
+
+//***** GL_SGIS_texture_border_clamp *****//
+ // GL_CLAMP_TO_BORDER_SGIS { already defined }
+
+function Load_GL_SGIS_texture_border_clamp: Boolean;
+
+//***** GL_SGIS_texture_color_mask *****//
+const
+ GL_TEXTURE_COLOR_WRITEMASK_SGIS = $81EF;
+var
+ glTextureColorMaskSGIS: procedure(r: GLboolean; g: GLboolean; b: GLboolean; a: GLboolean); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_SGIS_texture_color_mask: Boolean;
+
+//***** GL_SGIS_texture_edge_clamp *****//
+const
+ GL_CLAMP_TO_EDGE_SGIS = $812F;
+
+function Load_GL_SGIS_texture_edge_clamp: Boolean;
+
+//***** GL_SGIS_texture_lod *****//
+const
+ GL_TEXTURE_MIN_LOD_SGIS = $813A;
+ GL_TEXTURE_MAX_LOD_SGIS = $813B;
+ GL_TEXTURE_BASE_LEVEL_SGIS = $813C;
+ GL_TEXTURE_MAX_LEVEL_SGIS = $813D;
+
+function Load_GL_SGIS_texture_lod: Boolean;
+
+//***** GL_SGIS_depth_texture *****//
+const
+ GL_DEPTH_COMPONENT16_SGIX = $81A5;
+ GL_DEPTH_COMPONENT24_SGIX = $81A6;
+ GL_DEPTH_COMPONENT32_SGIX = $81A7;
+
+function Load_GL_SGIS_depth_texture: Boolean;
+
+//***** GL_SGIX_fog_offset *****//
+const
+ GL_FOG_OFFSET_SGIX = $8198;
+ GL_FOG_OFFSET_VALUE_SGIX = $8199;
+
+function Load_GL_SGIX_fog_offset: Boolean;
+
+//***** GL_SGIX_interlace *****//
+const
+ GL_INTERLACE_SGIX = $8094;
+
+function Load_GL_SGIX_interlace: Boolean;
+
+//***** GL_SGIX_shadow_ambient *****//
+const
+ GL_SHADOW_AMBIENT_SGIX = $80BF;
+
+function Load_GL_SGIX_shadow_ambient: Boolean;
+
+//***** GL_SGI_color_matrix *****//
+const
+ GL_COLOR_MATRIX_SGI = $80B1;
+ GL_COLOR_MATRIX_STACK_DEPTH_SGI = $80B2;
+ GL_MAX_COLOR_MATRIX_STACK_DEPTH_SGI = $80B3;
+ GL_POST_COLOR_MATRIX_RED_SCALE_SGI = $80B4;
+ GL_POST_COLOR_MATRIX_GREEN_SCALE_SGI = $80B5;
+ GL_POST_COLOR_MATRIX_BLUE_SCALE_SGI = $80B6;
+ GL_POST_COLOR_MATRIX_ALPHA_SCALE_SGI = $80B7;
+ GL_POST_COLOR_MATRIX_RED_BIAS_SGI = $80B8;
+ GL_POST_COLOR_MATRIX_GREEN_BIAS_SGI = $80B9;
+ GL_POST_COLOR_MATRIX_BLUE_BIAS_SGI = $80BA;
+ GL_POST_COLOR_MATRIX_ALPHA_BIAS_SGI = $80BB;
+
+function Load_GL_SGI_color_matrix: Boolean;
+
+//***** GL_SGI_color_table *****//
+const
+ GL_COLOR_TABLE_SGI = $80D0;
+ GL_POST_CONVOLUTION_COLOR_TABLE_SGI = $80D1;
+ GL_POST_COLOR_MATRIX_COLOR_TABLE_SGI = $80D2;
+ GL_PROXY_COLOR_TABLE_SGI = $80D3;
+ GL_PROXY_POST_CONVOLUTION_COLOR_TABLE_SGI = $80D4;
+ GL_PROXY_POST_COLOR_MATRIX_COLOR_TABLE_SGI = $80D5;
+ GL_COLOR_TABLE_SCALE_SGI = $80D6;
+ GL_COLOR_TABLE_BIAS_SGI = $80D7;
+ GL_COLOR_TABLE_FORMAT_SGI = $80D8;
+ GL_COLOR_TABLE_WIDTH_SGI = $80D9;
+ GL_COLOR_TABLE_RED_SIZE_SGI = $80DA;
+ GL_COLOR_TABLE_GREEN_SIZE_SGI = $80DB;
+ GL_COLOR_TABLE_BLUE_SIZE_SGI = $80DC;
+ GL_COLOR_TABLE_ALPHA_SIZE_SGI = $80DD;
+ GL_COLOR_TABLE_LUMINANCE_SIZE_SGI = $80DE;
+ GL_COLOR_TABLE_INTENSITY_SIZE_SGI = $80DF;
+var
+ glColorTableSGI: procedure(target: GLenum; internalformat: GLenum; width: GLsizei; format: GLenum; _type: GLenum; const table: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCopyColorTableSGI: procedure(target: GLenum; internalformat: GLenum; x: GLint; y: GLint; width: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColorTableParameterivSGI: procedure(target: GLenum; pname: GLenum; const params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColorTableParameterfvSGI: procedure(target: GLenum; pname: GLenum; const params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetColorTableSGI: procedure(target: GLenum; format: GLenum; _type: GLenum; table: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetColorTableParameterivSGI: procedure(target: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetColorTableParameterfvSGI: procedure(target: GLenum; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_SGI_color_table: Boolean;
+
+//***** GL_SGI_texture_color_table *****//
+const
+ GL_TEXTURE_COLOR_TABLE_SGI = $80BC;
+ GL_PROXY_TEXTURE_COLOR_TABLE_SGI = $80BD;
+
+function Load_GL_SGI_texture_color_table: Boolean;
+
+//***** GL_SUN_vertex *****//
+var
+ glColor4ubVertex2fSUN: procedure(r: GLubyte; g: GLubyte; b: GLubyte; a: GLubyte; x: GLfloat; y: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4ubVertex2fvSUN: procedure(const c: PGLubyte; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4ubVertex3fSUN: procedure(r: GLubyte; g: GLubyte; b: GLubyte; a: GLubyte; x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4ubVertex3fvSUN: procedure(const c: PGLubyte; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor3fVertex3fSUN: procedure(r: GLfloat; g: GLfloat; b: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor3fVertex3fvSUN: procedure(const c: PGLfloat; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormal3fVertex3fSUN: procedure(nx: GLfloat; ny: GLfloat; nz: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormal3fVertex3fvSUN: procedure(const n: PGLfloat; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4fNormal3fVertex3fSUN: procedure(r: GLfloat; g: GLfloat; b: GLfloat; a: GLfloat; nx: GLfloat; ny: GLfloat; nz: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4fNormal3fVertex3fvSUN: procedure(const c: PGLfloat; const n: PGLfloat; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord2fVertex3fSUN: procedure(s: GLfloat; t: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord2fVertex3fvSUN: procedure(const tc: PGLfloat; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord4fVertex4fSUN: procedure(s: GLfloat; t: GLfloat; p: GLfloat; q: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat; w: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord4fVertex4fvSUN: procedure(const tc: PGLfloat; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord2fColor4ubVertex3fSUN: procedure(s: GLfloat; t: GLfloat; r: GLubyte; g: GLubyte; b: GLubyte; a: GLubyte; x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord2fColor4ubVertex3fvSUN: procedure(const tc: PGLfloat; const c: PGLubyte; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord2fColor3fVertex3fSUN: procedure(s: GLfloat; t: GLfloat; r: GLfloat; g: GLfloat; b: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord2fColor3fVertex3fvSUN: procedure(const tc: PGLfloat; const c: PGLfloat; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord2fNormal3fVertex3fSUN: procedure(s: GLfloat; t: GLfloat; nx: GLfloat; ny: GLfloat; nz: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord2fNormal3fVertex3fvSUN: procedure(const tc: PGLfloat; const n: PGLfloat; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord2fColor4fNormal3fVertex3fSUN: procedure(s: GLfloat; t: GLfloat; r: GLfloat; g: GLfloat; b: GLfloat; a: GLfloat; nx: GLfloat; ny: GLfloat; nz: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord2fColor4fNormal3fVertex3fvSUN: procedure(const tc: PGLfloat; const c: PGLfloat; const n: PGLfloat; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord4fColor4fNormal3fVertex4fSUN: procedure(s: GLfloat; t: GLfloat; p: GLfloat; q: GLfloat; r: GLfloat; g: GLfloat; b: GLfloat; a: GLfloat; nx: GLfloat; ny: GLfloat; nz: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat; w: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord4fColor4fNormal3fVertex4fvSUN: procedure(const tc: PGLfloat; const c: PGLfloat; const n: PGLfloat; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glReplacementCodeuiVertex3fSUN: procedure(rc: GLuint; x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glReplacementCodeuiVertex3fvSUN: procedure(const rc: PGLuint; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glReplacementCodeuiColor4ubVertex3fSUN: procedure(rc: GLuint; r: GLubyte; g: GLubyte; b: GLubyte; a: GLubyte; x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glReplacementCodeuiColor4ubVertex3fvSUN: procedure(const rc: PGLuint; const c: PGLubyte; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glReplacementCodeuiColor3fVertex3fSUN: procedure(rc: GLuint; r: GLfloat; g: GLfloat; b: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glReplacementCodeuiColor3fVertex3fvSUN: procedure(const rc: PGLuint; const c: PGLfloat; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glReplacementCodeuiNormal3fVertex3fSUN: procedure(rc: GLuint; nx: GLfloat; ny: GLfloat; nz: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glReplacementCodeuiNormal3fVertex3fvSUN: procedure(const rc: PGLuint; const n: PGLfloat; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glReplacementCodeuiColor4fNormal3fVertex3fSUN: procedure(rc: GLuint; r: GLfloat; g: GLfloat; b: GLfloat; a: GLfloat; nx: GLfloat; ny: GLfloat; nz: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glReplacementCodeuiColor4fNormal3fVertex3fvSUN: procedure(const rc: PGLuint; const c: PGLfloat; const n: PGLfloat; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glReplacementCodeuiTexCoord2fVertex3fSUN: procedure(rc: GLuint; s: GLfloat; t: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glReplacementCodeuiTexCoord2fVertex3fvSUN: procedure(const rc: PGLuint; const tc: PGLfloat; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN: procedure(rc: GLuint; s: GLfloat; t: GLfloat; nx: GLfloat; ny: GLfloat; nz: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN: procedure(const rc: PGLuint; const tc: PGLfloat; const n: PGLfloat; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN: procedure(rc: GLuint; s: GLfloat; t: GLfloat; r: GLfloat; g: GLfloat; b: GLfloat; a: GLfloat; nx: GLfloat; ny: GLfloat; nz: GLfloat; x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN: procedure(const rc: PGLuint; const tc: PGLfloat; const c: PGLfloat; const n: PGLfloat; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_SUN_vertex: Boolean;
+
+//***** GL_ARB_fragment_program *****//
+const
+ GL_FRAGMENT_PROGRAM_ARB = $8804;
+ // GL_PROGRAM_FORMAT_ASCII_ARB { already defined }
+ // GL_PROGRAM_LENGTH_ARB { already defined }
+ // GL_PROGRAM_FORMAT_ARB { already defined }
+ // GL_PROGRAM_BINDING_ARB { already defined }
+ // GL_PROGRAM_INSTRUCTIONS_ARB { already defined }
+ // GL_MAX_PROGRAM_INSTRUCTIONS_ARB { already defined }
+ // GL_PROGRAM_NATIVE_INSTRUCTIONS_ARB { already defined }
+ // GL_MAX_PROGRAM_NATIVE_INSTRUCTIONS_ARB { already defined }
+ // GL_PROGRAM_TEMPORARIES_ARB { already defined }
+ // GL_MAX_PROGRAM_TEMPORARIES_ARB { already defined }
+ // GL_PROGRAM_NATIVE_TEMPORARIES_ARB { already defined }
+ // GL_MAX_PROGRAM_NATIVE_TEMPORARIES_ARB { already defined }
+ // GL_PROGRAM_PARAMETERS_ARB { already defined }
+ // GL_MAX_PROGRAM_PARAMETERS_ARB { already defined }
+ // GL_PROGRAM_NATIVE_PARAMETERS_ARB { already defined }
+ // GL_MAX_PROGRAM_NATIVE_PARAMETERS_ARB { already defined }
+ // GL_PROGRAM_ATTRIBS_ARB { already defined }
+ // GL_MAX_PROGRAM_ATTRIBS_ARB { already defined }
+ // GL_PROGRAM_NATIVE_ATTRIBS_ARB { already defined }
+ // GL_MAX_PROGRAM_NATIVE_ATTRIBS_ARB { already defined }
+ // GL_MAX_PROGRAM_LOCAL_PARAMETERS_ARB { already defined }
+ // GL_MAX_PROGRAM_ENV_PARAMETERS_ARB { already defined }
+ // GL_PROGRAM_UNDER_NATIVE_LIMITS_ARB { already defined }
+ GL_PROGRAM_ALU_INSTRUCTIONS_ARB = $8805;
+ GL_PROGRAM_TEX_INSTRUCTIONS_ARB = $8806;
+ GL_PROGRAM_TEX_INDIRECTIONS_ARB = $8807;
+ GL_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB = $8808;
+ GL_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB = $8809;
+ GL_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB = $880A;
+ GL_MAX_PROGRAM_ALU_INSTRUCTIONS_ARB = $880B;
+ GL_MAX_PROGRAM_TEX_INSTRUCTIONS_ARB = $880C;
+ GL_MAX_PROGRAM_TEX_INDIRECTIONS_ARB = $880D;
+ GL_MAX_PROGRAM_NATIVE_ALU_INSTRUCTIONS_ARB = $880E;
+ GL_MAX_PROGRAM_NATIVE_TEX_INSTRUCTIONS_ARB = $880F;
+ GL_MAX_PROGRAM_NATIVE_TEX_INDIRECTIONS_ARB = $8810;
+ // GL_PROGRAM_STRING_ARB { already defined }
+ // GL_PROGRAM_ERROR_POSITION_ARB { already defined }
+ // GL_CURRENT_MATRIX_ARB { already defined }
+ // GL_TRANSPOSE_CURRENT_MATRIX_ARB { already defined }
+ // GL_CURRENT_MATRIX_STACK_DEPTH_ARB { already defined }
+ // GL_MAX_PROGRAM_MATRICES_ARB { already defined }
+ // GL_MAX_PROGRAM_MATRIX_STACK_DEPTH_ARB { already defined }
+ GL_MAX_TEXTURE_COORDS_ARB = $8871;
+ GL_MAX_TEXTURE_IMAGE_UNITS_ARB = $8872;
+ // GL_PROGRAM_ERROR_STRING_ARB { already defined }
+ // GL_MATRIX0_ARB { already defined }
+ // GL_MATRIX1_ARB { already defined }
+ // GL_MATRIX2_ARB { already defined }
+ // GL_MATRIX3_ARB { already defined }
+ // GL_MATRIX4_ARB { already defined }
+ // GL_MATRIX5_ARB { already defined }
+ // GL_MATRIX6_ARB { already defined }
+ // GL_MATRIX7_ARB { already defined }
+ // GL_MATRIX8_ARB { already defined }
+ // GL_MATRIX9_ARB { already defined }
+ // GL_MATRIX10_ARB { already defined }
+ // GL_MATRIX11_ARB { already defined }
+ // GL_MATRIX12_ARB { already defined }
+ // GL_MATRIX13_ARB { already defined }
+ // GL_MATRIX14_ARB { already defined }
+ // GL_MATRIX15_ARB { already defined }
+ // GL_MATRIX16_ARB { already defined }
+ // GL_MATRIX17_ARB { already defined }
+ // GL_MATRIX18_ARB { already defined }
+ // GL_MATRIX19_ARB { already defined }
+ // GL_MATRIX20_ARB { already defined }
+ // GL_MATRIX21_ARB { already defined }
+ // GL_MATRIX22_ARB { already defined }
+ // GL_MATRIX23_ARB { already defined }
+ // GL_MATRIX24_ARB { already defined }
+ // GL_MATRIX25_ARB { already defined }
+ // GL_MATRIX26_ARB { already defined }
+ // GL_MATRIX27_ARB { already defined }
+ // GL_MATRIX28_ARB { already defined }
+ // GL_MATRIX29_ARB { already defined }
+ // GL_MATRIX30_ARB { already defined }
+ // GL_MATRIX31_ARB { already defined }
+ // glProgramStringARB { already defined }
+ // glBindProgramARB { already defined }
+ // glDeleteProgramsARB { already defined }
+ // glGenProgramsARB { already defined }
+ // glProgramEnvParameter4dARB { already defined }
+ // glProgramEnvParameter4dvARB { already defined }
+ // glProgramEnvParameter4fARB { already defined }
+ // glProgramEnvParameter4fvARB { already defined }
+ // glProgramLocalParameter4dARB { already defined }
+ // glProgramLocalParameter4dvARB { already defined }
+ // glProgramLocalParameter4fARB { already defined }
+ // glProgramLocalParameter4fvARB { already defined }
+ // glGetProgramEnvParameterdvARB { already defined }
+ // glGetProgramEnvParameterfvARB { already defined }
+ // glGetProgramLocalParameterdvARB { already defined }
+ // glGetProgramLocalParameterfvARB { already defined }
+ // glGetProgramivARB { already defined }
+ // glGetProgramStringARB { already defined }
+ // glIsProgramARB { already defined }
+
+function Load_GL_ARB_fragment_program: Boolean;
+
+//***** GL_ATI_text_fragment_shader *****//
+const
+ GL_TEXT_FRAGMENT_SHADER_ATI = $8200;
+
+function Load_GL_ATI_text_fragment_shader: Boolean;
+
+//***** GL_APPLE_client_storage *****//
+const
+ GL_UNPACK_CLIENT_STORAGE_APPLE = $85B2;
+
+function Load_GL_APPLE_client_storage: Boolean;
+
+//***** GL_APPLE_element_array *****//
+const
+ GL_ELEMENT_ARRAY_APPLE = $8768;
+ GL_ELEMENT_ARRAY_TYPE_APPLE = $8769;
+ GL_ELEMENT_ARRAY_POINTER_APPLE = $876A;
+var
+ glElementPointerAPPLE: procedure(_type: GLenum; const pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDrawElementArrayAPPLE: procedure(mode: GLenum; first: GLint; count: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDrawRangeElementArrayAPPLE: procedure(mode: GLenum; start: GLuint; _end: GLuint; first: GLint; count: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiDrawElementArrayAPPLE: procedure(mode: GLenum; const first: PGLint; const count: PGLsizei; primcount: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiDrawRangeElementArrayAPPLE: procedure(mode: GLenum; start: GLuint; _end: GLuint; const first: PGLint; const count: PGLsizei; primcount: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_APPLE_element_array: Boolean;
+
+//***** GL_APPLE_fence *****//
+const
+ GL_DRAW_PIXELS_APPLE = $8A0A;
+ GL_FENCE_APPLE = $8A0B;
+var
+ glGenFencesAPPLE: procedure(n: GLsizei; fences: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDeleteFencesAPPLE: procedure(n: GLsizei; const fences: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSetFenceAPPLE: procedure(fence: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIsFenceAPPLE: function(fence: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTestFenceAPPLE: function(fence: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFinishFenceAPPLE: procedure(fence: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTestObjectAPPLE: function(_object: GLenum; name: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFinishObjectAPPLE: procedure(_object: GLenum; name: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_APPLE_fence: Boolean;
+
+//***** GL_APPLE_vertex_array_object *****//
+const
+ GL_VERTEX_ARRAY_BINDING_APPLE = $85B5;
+var
+ glBindVertexArrayAPPLE: procedure(_array: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDeleteVertexArraysAPPLE: procedure(n: GLsizei; const arrays: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGenVertexArraysAPPLE: procedure(n: GLsizei; const arrays: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIsVertexArrayAPPLE: function(_array: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_APPLE_vertex_array_object: Boolean;
+
+//***** GL_APPLE_vertex_array_range *****//
+const
+ GL_VERTEX_ARRAY_RANGE_APPLE = $851D;
+ GL_VERTEX_ARRAY_RANGE_LENGTH_APPLE = $851E;
+ GL_MAX_VERTEX_ARRAY_RANGE_ELEMENT_APPLE = $8520;
+ GL_VERTEX_ARRAY_RANGE_POINTER_APPLE = $8521;
+ GL_VERTEX_ARRAY_STORAGE_HINT_APPLE = $851F;
+ GL_STORAGE_CACHED_APPLE = $85BE;
+ GL_STORAGE_SHARED_APPLE = $85BF;
+var
+ glVertexArrayRangeAPPLE: procedure(length: GLsizei; pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFlushVertexArrayRangeAPPLE: procedure(length: GLsizei; pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexArrayParameteriAPPLE: procedure(pname: GLenum; param: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_APPLE_vertex_array_range: Boolean;
+
+{$IFDEF WINDOWS}
+//***** WGL_ARB_pixel_format *****//
+const
+ WGL_NUMBER_PIXEL_FORMATS_ARB = $2000;
+ WGL_DRAW_TO_WINDOW_ARB = $2001;
+ WGL_DRAW_TO_BITMAP_ARB = $2002;
+ WGL_ACCELERATION_ARB = $2003;
+ WGL_NEED_PALETTE_ARB = $2004;
+ WGL_NEED_SYSTEM_PALETTE_ARB = $2005;
+ WGL_SWAP_LAYER_BUFFERS_ARB = $2006;
+ WGL_SWAP_METHOD_ARB = $2007;
+ WGL_NUMBER_OVERLAYS_ARB = $2008;
+ WGL_NUMBER_UNDERLAYS_ARB = $2009;
+ WGL_TRANSPARENT_ARB = $200A;
+ WGL_TRANSPARENT_RED_VALUE_ARB = $2037;
+ WGL_TRANSPARENT_GREEN_VALUE_ARB = $2038;
+ WGL_TRANSPARENT_BLUE_VALUE_ARB = $2039;
+ WGL_TRANSPARENT_ALPHA_VALUE_ARB = $203A;
+ WGL_TRANSPARENT_INDEX_VALUE_ARB = $203B;
+ WGL_SHARE_DEPTH_ARB = $200C;
+ WGL_SHARE_STENCIL_ARB = $200D;
+ WGL_SHARE_ACCUM_ARB = $200E;
+ WGL_SUPPORT_GDI_ARB = $200F;
+ WGL_SUPPORT_OPENGL_ARB = $2010;
+ WGL_DOUBLE_BUFFER_ARB = $2011;
+ WGL_STEREO_ARB = $2012;
+ WGL_PIXEL_TYPE_ARB = $2013;
+ WGL_COLOR_BITS_ARB = $2014;
+ WGL_RED_BITS_ARB = $2015;
+ WGL_RED_SHIFT_ARB = $2016;
+ WGL_GREEN_BITS_ARB = $2017;
+ WGL_GREEN_SHIFT_ARB = $2018;
+ WGL_BLUE_BITS_ARB = $2019;
+ WGL_BLUE_SHIFT_ARB = $201A;
+ WGL_ALPHA_BITS_ARB = $201B;
+ WGL_ALPHA_SHIFT_ARB = $201C;
+ WGL_ACCUM_BITS_ARB = $201D;
+ WGL_ACCUM_RED_BITS_ARB = $201E;
+ WGL_ACCUM_GREEN_BITS_ARB = $201F;
+ WGL_ACCUM_BLUE_BITS_ARB = $2020;
+ WGL_ACCUM_ALPHA_BITS_ARB = $2021;
+ WGL_DEPTH_BITS_ARB = $2022;
+ WGL_STENCIL_BITS_ARB = $2023;
+ WGL_AUX_BUFFERS_ARB = $2024;
+ WGL_NO_ACCELERATION_ARB = $2025;
+ WGL_GENERIC_ACCELERATION_ARB = $2026;
+ WGL_FULL_ACCELERATION_ARB = $2027;
+ WGL_SWAP_EXCHANGE_ARB = $2028;
+ WGL_SWAP_COPY_ARB = $2029;
+ WGL_SWAP_UNDEFINED_ARB = $202A;
+ WGL_TYPE_RGBA_ARB = $202B;
+ WGL_TYPE_COLORINDEX_ARB = $202C;
+var
+ wglGetPixelFormatAttribivARB: function(hdc: HDC; iPixelFormat: GLint; iLayerPlane: GLint; nAttributes: GLuint; const piAttributes: PGLint; piValues: PGLint): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglGetPixelFormatAttribfvARB: function(hdc: HDC; iPixelFormat: GLint; iLayerPlane: GLint; nAttributes: GLuint; const piAttributes: PGLint; pfValues: PGLfloat): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglChoosePixelFormatARB: function(hdc: HDC; const piAttribIList: PGLint; const pfAttribFList: PGLfloat; nMaxFormats: GLuint; piFormats: PGLint; nNumFormats: PGLuint): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_WGL_ARB_pixel_format: Boolean;
+
+//***** WGL_ARB_make_current_read *****//
+const
+ WGL_ERROR_INVALID_PIXEL_TYPE_ARB = $2043;
+ WGL_ERROR_INCOMPATIBLE_DEVICE_CONTEXTS_ARB = $2054;
+var
+ wglMakeContextCurrentARB: function(hDrawDC: HDC; hReadDC: HDC; hglrc: HGLRC): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglGetCurrentReadDCARB: function(): HDC; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_WGL_ARB_make_current_read: Boolean;
+
+//***** WGL_ARB_pbuffer *****//
+const
+ WGL_DRAW_TO_PBUFFER_ARB = $202D;
+ // WGL_DRAW_TO_PBUFFER_ARB { already defined }
+ WGL_MAX_PBUFFER_PIXELS_ARB = $202E;
+ WGL_MAX_PBUFFER_WIDTH_ARB = $202F;
+ WGL_MAX_PBUFFER_HEIGHT_ARB = $2030;
+ WGL_PBUFFER_LARGEST_ARB = $2033;
+ WGL_PBUFFER_WIDTH_ARB = $2034;
+ WGL_PBUFFER_HEIGHT_ARB = $2035;
+ WGL_PBUFFER_LOST_ARB = $2036;
+var
+ wglCreatePbufferARB: function(hDC: HDC; iPixelFormat: GLint; iWidth: GLint; iHeight: GLint; const piAttribList: PGLint): THandle; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglGetPbufferDCARB: function(hPbuffer: THandle): HDC; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglReleasePbufferDCARB: function(hPbuffer: THandle; hDC: HDC): GLint; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglDestroyPbufferARB: function(hPbuffer: THandle): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglQueryPbufferARB: function(hPbuffer: THandle; iAttribute: GLint; piValue: PGLint): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_WGL_ARB_pbuffer: Boolean;
+
+//***** WGL_EXT_swap_control *****//
+var
+ wglSwapIntervalEXT: function(interval: GLint): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglGetSwapIntervalEXT: function(): GLint; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_WGL_EXT_swap_control: Boolean;
+
+//***** WGL_ARB_render_texture *****//
+const
+ WGL_BIND_TO_TEXTURE_RGB_ARB = $2070;
+ WGL_BIND_TO_TEXTURE_RGBA_ARB = $2071;
+ WGL_TEXTURE_FORMAT_ARB = $2072;
+ WGL_TEXTURE_TARGET_ARB = $2073;
+ WGL_MIPMAP_TEXTURE_ARB = $2074;
+ WGL_TEXTURE_RGB_ARB = $2075;
+ WGL_TEXTURE_RGBA_ARB = $2076;
+ WGL_NO_TEXTURE_ARB = $2077;
+ WGL_TEXTURE_CUBE_MAP_ARB = $2078;
+ WGL_TEXTURE_1D_ARB = $2079;
+ WGL_TEXTURE_2D_ARB = $207A;
+ // WGL_NO_TEXTURE_ARB { already defined }
+ WGL_MIPMAP_LEVEL_ARB = $207B;
+ WGL_CUBE_MAP_FACE_ARB = $207C;
+ WGL_TEXTURE_CUBE_MAP_POSITIVE_X_ARB = $207D;
+ WGL_TEXTURE_CUBE_MAP_NEGATIVE_X_ARB = $207E;
+ WGL_TEXTURE_CUBE_MAP_POSITIVE_Y_ARB = $207F;
+ WGL_TEXTURE_CUBE_MAP_NEGATIVE_Y_ARB = $2080;
+ WGL_TEXTURE_CUBE_MAP_POSITIVE_Z_ARB = $2081;
+ WGL_TEXTURE_CUBE_MAP_NEGATIVE_Z_ARB = $2082;
+ WGL_FRONT_LEFT_ARB = $2083;
+ WGL_FRONT_RIGHT_ARB = $2084;
+ WGL_BACK_LEFT_ARB = $2085;
+ WGL_BACK_RIGHT_ARB = $2086;
+ WGL_AUX0_ARB = $2087;
+ WGL_AUX1_ARB = $2088;
+ WGL_AUX2_ARB = $2089;
+ WGL_AUX3_ARB = $208A;
+ WGL_AUX4_ARB = $208B;
+ WGL_AUX5_ARB = $208C;
+ WGL_AUX6_ARB = $208D;
+ WGL_AUX7_ARB = $208E;
+ WGL_AUX8_ARB = $208F;
+ WGL_AUX9_ARB = $2090;
+var
+ wglBindTexImageARB: function(hPbuffer: THandle; iBuffer: GLint): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglReleaseTexImageARB: function(hPbuffer: THandle; iBuffer: GLint): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglSetPbufferAttribARB: function(hPbuffer: THandle; const piAttribList: PGLint): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_WGL_ARB_render_texture: Boolean;
+
+//***** WGL_EXT_extensions_string *****//
+var
+ wglGetExtensionsStringEXT: function(): Pchar; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_WGL_EXT_extensions_string: Boolean;
+
+//***** WGL_EXT_make_current_read *****//
+var
+ wglMakeContextCurrentEXT: function(hDrawDC: HDC; hReadDC: HDC; hglrc: HGLRC): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglGetCurrentReadDCEXT: function(): HDC; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_WGL_EXT_make_current_read: Boolean;
+
+//***** WGL_EXT_pbuffer *****//
+const
+ WGL_DRAW_TO_PBUFFER_EXT = $202D;
+ WGL_MAX_PBUFFER_PIXELS_EXT = $202E;
+ WGL_MAX_PBUFFER_WIDTH_EXT = $202F;
+ WGL_MAX_PBUFFER_HEIGHT_EXT = $2030;
+ WGL_OPTIMAL_PBUFFER_WIDTH_EXT = $2031;
+ WGL_OPTIMAL_PBUFFER_HEIGHT_EXT = $2032;
+ WGL_PBUFFER_LARGEST_EXT = $2033;
+ WGL_PBUFFER_WIDTH_EXT = $2034;
+ WGL_PBUFFER_HEIGHT_EXT = $2035;
+var
+ wglCreatePbufferEXT: function(hDC: HDC; iPixelFormat: GLint; iWidth: GLint; iHeight: GLint; const piAttribList: PGLint): THandle; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglGetPbufferDCEXT: function(hPbuffer: THandle): HDC; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglReleasePbufferDCEXT: function(hPbuffer: THandle; hDC: HDC): GLint; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglDestroyPbufferEXT: function(hPbuffer: THandle): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglQueryPbufferEXT: function(hPbuffer: THandle; iAttribute: GLint; piValue: PGLint): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_WGL_EXT_pbuffer: Boolean;
+
+//***** WGL_EXT_pixel_format *****//
+const
+ WGL_NUMBER_PIXEL_FORMATS_EXT = $2000;
+ WGL_DRAW_TO_WINDOW_EXT = $2001;
+ WGL_DRAW_TO_BITMAP_EXT = $2002;
+ WGL_ACCELERATION_EXT = $2003;
+ WGL_NEED_PALETTE_EXT = $2004;
+ WGL_NEED_SYSTEM_PALETTE_EXT = $2005;
+ WGL_SWAP_LAYER_BUFFERS_EXT = $2006;
+ WGL_SWAP_METHOD_EXT = $2007;
+ WGL_NUMBER_OVERLAYS_EXT = $2008;
+ WGL_NUMBER_UNDERLAYS_EXT = $2009;
+ WGL_TRANSPARENT_EXT = $200A;
+ WGL_TRANSPARENT_VALUE_EXT = $200B;
+ WGL_SHARE_DEPTH_EXT = $200C;
+ WGL_SHARE_STENCIL_EXT = $200D;
+ WGL_SHARE_ACCUM_EXT = $200E;
+ WGL_SUPPORT_GDI_EXT = $200F;
+ WGL_SUPPORT_OPENGL_EXT = $2010;
+ WGL_DOUBLE_BUFFER_EXT = $2011;
+ WGL_STEREO_EXT = $2012;
+ WGL_PIXEL_TYPE_EXT = $2013;
+ WGL_COLOR_BITS_EXT = $2014;
+ WGL_RED_BITS_EXT = $2015;
+ WGL_RED_SHIFT_EXT = $2016;
+ WGL_GREEN_BITS_EXT = $2017;
+ WGL_GREEN_SHIFT_EXT = $2018;
+ WGL_BLUE_BITS_EXT = $2019;
+ WGL_BLUE_SHIFT_EXT = $201A;
+ WGL_ALPHA_BITS_EXT = $201B;
+ WGL_ALPHA_SHIFT_EXT = $201C;
+ WGL_ACCUM_BITS_EXT = $201D;
+ WGL_ACCUM_RED_BITS_EXT = $201E;
+ WGL_ACCUM_GREEN_BITS_EXT = $201F;
+ WGL_ACCUM_BLUE_BITS_EXT = $2020;
+ WGL_ACCUM_ALPHA_BITS_EXT = $2021;
+ WGL_DEPTH_BITS_EXT = $2022;
+ WGL_STENCIL_BITS_EXT = $2023;
+ WGL_AUX_BUFFERS_EXT = $2024;
+ WGL_NO_ACCELERATION_EXT = $2025;
+ WGL_GENERIC_ACCELERATION_EXT = $2026;
+ WGL_FULL_ACCELERATION_EXT = $2027;
+ WGL_SWAP_EXCHANGE_EXT = $2028;
+ WGL_SWAP_COPY_EXT = $2029;
+ WGL_SWAP_UNDEFINED_EXT = $202A;
+ WGL_TYPE_RGBA_EXT = $202B;
+ WGL_TYPE_COLORINDEX_EXT = $202C;
+var
+ wglGetPixelFormatAttribivEXT: function(hdc: HDC; iPixelFormat: GLint; iLayerPlane: GLint; nAttributes: GLuint; piAttributes: PGLint; piValues: PGLint): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglGetPixelFormatAttribfvEXT: function(hdc: HDC; iPixelFormat: GLint; iLayerPlane: GLint; nAttributes: GLuint; piAttributes: PGLint; pfValues: PGLfloat): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglChoosePixelFormatEXT: function(hdc: HDC; const piAttribIList: PGLint; const pfAttribFList: PGLfloat; nMaxFormats: GLuint; piFormats: PGLint; nNumFormats: PGLuint): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_WGL_EXT_pixel_format: Boolean;
+
+//***** WGL_I3D_digital_video_control *****//
+const
+ WGL_DIGITAL_VIDEO_CURSOR_ALPHA_FRAMEBUFFER_I3D = $2050;
+ WGL_DIGITAL_VIDEO_CURSOR_ALPHA_VALUE_I3D = $2051;
+ WGL_DIGITAL_VIDEO_CURSOR_INCLUDED_I3D = $2052;
+ WGL_DIGITAL_VIDEO_GAMMA_CORRECTED_I3D = $2053;
+var
+ wglGetDigitalVideoParametersI3D: function(hDC: HDC; iAttribute: GLint; piValue: PGLint): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglSetDigitalVideoParametersI3D: function(hDC: HDC; iAttribute: GLint; const piValue: PGLint): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_WGL_I3D_digital_video_control: Boolean;
+
+//***** WGL_I3D_gamma *****//
+const
+ WGL_GAMMA_TABLE_SIZE_I3D = $204E;
+ WGL_GAMMA_EXCLUDE_DESKTOP_I3D = $204F;
+ // WGL_GAMMA_EXCLUDE_DESKTOP_I3D { already defined }
+var
+ wglGetGammaTableParametersI3D: function(hDC: HDC; iAttribute: GLint; piValue: PGLint): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglSetGammaTableParametersI3D: function(hDC: HDC; iAttribute: GLint; const piValue: PGLint): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglGetGammaTableI3D: function(hDC: HDC; iEntries: GLint; puRed: PGLUSHORT; puGreen: PGLUSHORT; puBlue: PGLUSHORT): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglSetGammaTableI3D: function(hDC: HDC; iEntries: GLint; const puRed: PGLUSHORT; const puGreen: PGLUSHORT; const puBlue: PGLUSHORT): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_WGL_I3D_gamma: Boolean;
+
+//***** WGL_I3D_genlock *****//
+const
+ WGL_GENLOCK_SOURCE_MULTIVIEW_I3D = $2044;
+ WGL_GENLOCK_SOURCE_EXTERNAL_SYNC_I3D = $2045;
+ WGL_GENLOCK_SOURCE_EXTERNAL_FIELD_I3D = $2046;
+ WGL_GENLOCK_SOURCE_EXTERNAL_TTL_I3D = $2047;
+ WGL_GENLOCK_SOURCE_DIGITAL_SYNC_I3D = $2048;
+ WGL_GENLOCK_SOURCE_DIGITAL_FIELD_I3D = $2049;
+ WGL_GENLOCK_SOURCE_EDGE_FALLING_I3D = $204A;
+ WGL_GENLOCK_SOURCE_EDGE_RISING_I3D = $204B;
+ WGL_GENLOCK_SOURCE_EDGE_BOTH_I3D = $204C;
+var
+ wglEnableGenlockI3D: function(hDC: HDC): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglDisableGenlockI3D: function(hDC: HDC): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglIsEnabledGenlockI3D: function(hDC: HDC; pFlag: PBOOL): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglGenlockSourceI3D: function(hDC: HDC; uSource: GLUINT): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglGetGenlockSourceI3D: function(hDC: HDC; uSource: PGLUINT): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglGenlockSourceEdgeI3D: function(hDC: HDC; uEdge: GLUINT): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglGetGenlockSourceEdgeI3D: function(hDC: HDC; uEdge: PGLUINT): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglGenlockSampleRateI3D: function(hDC: HDC; uRate: GLUINT): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglGetGenlockSampleRateI3D: function(hDC: HDC; uRate: PGLUINT): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglGenlockSourceDelayI3D: function(hDC: HDC; uDelay: GLUINT): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglGetGenlockSourceDelayI3D: function(hDC: HDC; uDelay: PGLUINT): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ wglQueryGenlockMaxSourceDelayI3D: function(hDC: HDC; uMaxLineDelay: PGLUINT; uMaxPixelDelay: PGLUINT): BOOL; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_WGL_I3D_genlock: Boolean;
+{$ENDIF}
+
+//***** GL_ARB_matrix_palette *****//
+const
+ GL_MATRIX_PALETTE_ARB = $8840;
+ GL_MAX_MATRIX_PALETTE_STACK_DEPTH_ARB = $8841;
+ GL_MAX_PALETTE_MATRICES_ARB = $8842;
+ GL_CURRENT_PALETTE_MATRIX_ARB = $8843;
+ GL_MATRIX_INDEX_ARRAY_ARB = $8844;
+ GL_CURRENT_MATRIX_INDEX_ARB = $8845;
+ GL_MATRIX_INDEX_ARRAY_SIZE_ARB = $8846;
+ GL_MATRIX_INDEX_ARRAY_TYPE_ARB = $8847;
+ GL_MATRIX_INDEX_ARRAY_STRIDE_ARB = $8848;
+ GL_MATRIX_INDEX_ARRAY_POINTER_ARB = $8849;
+var
+ glCurrentPaletteMatrixARB: procedure(index: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMatrixIndexubvARB: procedure(size: GLint; indices: PGLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMatrixIndexusvARB: procedure(size: GLint; indices: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMatrixIndexuivARB: procedure(size: GLint; indices: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMatrixIndexPointerARB: procedure(size: GLint; _type: GLenum; stride: GLsizei; pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ARB_matrix_palette: Boolean;
+
+//***** GL_NV_element_array *****//
+const
+ GL_ELEMENT_ARRAY_TYPE_NV = $8769;
+ GL_ELEMENT_ARRAY_POINTER_NV = $876A;
+var
+ glElementPointerNV: procedure(_type: GLenum; const pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDrawElementArrayNV: procedure(mode: GLenum; first: GLint; count: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDrawRangeElementArrayNV: procedure(mode: GLenum; start: GLuint; _end: GLuint; first: GLint; count: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiDrawElementArrayNV: procedure(mode: GLenum; const first: PGLint; const count: PGLsizei; primcount: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiDrawRangeElementArrayNV: procedure(mode: GLenum; start: GLuint; _end: GLuint; const first: PGLint; const count: PGLsizei; primcount: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_NV_element_array: Boolean;
+
+//***** GL_NV_float_buffer *****//
+const
+ GL_FLOAT_R_NV = $8880;
+ GL_FLOAT_RG_NV = $8881;
+ GL_FLOAT_RGB_NV = $8882;
+ GL_FLOAT_RGBA_NV = $8883;
+ GL_FLOAT_R16_NV = $8884;
+ GL_FLOAT_R32_NV = $8885;
+ GL_FLOAT_RG16_NV = $8886;
+ GL_FLOAT_RG32_NV = $8887;
+ GL_FLOAT_RGB16_NV = $8888;
+ GL_FLOAT_RGB32_NV = $8889;
+ GL_FLOAT_RGBA16_NV = $888A;
+ GL_FLOAT_RGBA32_NV = $888B;
+ GL_TEXTURE_FLOAT_COMPONENTS_NV = $888C;
+ GL_FLOAT_CLEAR_COLOR_VALUE_NV = $888D;
+ GL_FLOAT_RGBA_MODE_NV = $888E;
+{$IFDEF WINDOWS}
+ WGL_FLOAT_COMPONENTS_NV = $20B0;
+ WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_R_NV = $20B1;
+ WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RG_NV = $20B2;
+ WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGB_NV = $20B3;
+ WGL_BIND_TO_TEXTURE_RECTANGLE_FLOAT_RGBA_NV = $20B4;
+ WGL_TEXTURE_FLOAT_R_NV = $20B5;
+ WGL_TEXTURE_FLOAT_RG_NV = $20B6;
+ WGL_TEXTURE_FLOAT_RGB_NV = $20B7;
+ WGL_TEXTURE_FLOAT_RGBA_NV = $20B8;
+{$ENDIF}
+
+function Load_GL_NV_float_buffer: Boolean;
+
+//***** GL_NV_fragment_program *****//
+const
+ GL_FRAGMENT_PROGRAM_NV = $8870;
+ GL_MAX_TEXTURE_COORDS_NV = $8871;
+ GL_MAX_TEXTURE_IMAGE_UNITS_NV = $8872;
+ GL_FRAGMENT_PROGRAM_BINDING_NV = $8873;
+ GL_MAX_FRAGMENT_PROGRAM_LOCAL_PARAMETERS_NV = $8868;
+ GL_PROGRAM_ERROR_STRING_NV = $8874;
+var
+ glProgramNamedParameter4fNV: procedure(id: GLuint; len: GLsizei; const name: PGLubyte; x: GLfloat; y: GLfloat; z: GLfloat; w: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glProgramNamedParameter4dNV: procedure(id: GLuint; len: GLsizei; const name: PGLubyte; x: GLdouble; y: GLdouble; z: GLdouble; w: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetProgramNamedParameterfvNV: procedure(id: GLuint; len: GLsizei; const name: PGLubyte; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetProgramNamedParameterdvNV: procedure(id: GLuint; len: GLsizei; const name: PGLubyte; params: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ // glProgramLocalParameter4dARB { already defined }
+ // glProgramLocalParameter4dvARB { already defined }
+ // glProgramLocalParameter4fARB { already defined }
+ // glProgramLocalParameter4fvARB { already defined }
+ // glGetProgramLocalParameterdvARB { already defined }
+ // glGetProgramLocalParameterfvARB { already defined }
+
+function Load_GL_NV_fragment_program: Boolean;
+
+//***** GL_NV_primitive_restart *****//
+const
+ GL_PRIMITIVE_RESTART_NV = $8558;
+ GL_PRIMITIVE_RESTART_INDEX_NV = $8559;
+var
+ glPrimitiveRestartNV: procedure(); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPrimitiveRestartIndexNV: procedure(index: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_NV_primitive_restart: Boolean;
+
+//***** GL_NV_vertex_program2 *****//
+
+function Load_GL_NV_vertex_program2: Boolean;
+
+{$IFDEF WINDOWS}
+//***** WGL_NV_render_texture_rectangle *****//
+const
+ WGL_BIND_TO_TEXTURE_RECTANGLE_RGB_NV = $20A0;
+ WGL_BIND_TO_TEXTURE_RECTANGLE_RGBA_NV = $20A1;
+ WGL_TEXTURE_RECTANGLE_NV = $20A2;
+
+function Load_WGL_NV_render_texture_rectangle: Boolean;
+{$ENDIF}
+
+//***** GL_NV_pixel_data_range *****//
+const
+ GL_WRITE_PIXEL_DATA_RANGE_NV = $8878;
+ GL_READ_PIXEL_DATA_RANGE_NV = $8879;
+ GL_WRITE_PIXEL_DATA_RANGE_LENGTH_NV = $887A;
+ GL_READ_PIXEL_DATA_RANGE_LENGTH_NV = $887B;
+ GL_WRITE_PIXEL_DATA_RANGE_POINTER_NV = $887C;
+ GL_READ_PIXEL_DATA_RANGE_POINTER_NV = $887D;
+var
+ glPixelDataRangeNV: procedure(target: GLenum; length: GLsizei; pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFlushPixelDataRangeNV: procedure(target: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ // wglAllocateMemoryNV { already defined }
+ // wglFreeMemoryNV { already defined }
+
+function Load_GL_NV_pixel_data_range: Boolean;
+
+//***** GL_EXT_texture_rectangle *****//
+const
+ GL_TEXTURE_RECTANGLE_EXT = $84F5;
+ GL_TEXTURE_BINDING_RECTANGLE_EXT = $84F6;
+ GL_PROXY_TEXTURE_RECTANGLE_EXT = $84F7;
+ GL_MAX_RECTANGLE_TEXTURE_SIZE_EXT = $84F8;
+
+function Load_GL_EXT_texture_rectangle: Boolean;
+
+//***** GL_S3_s3tc *****//
+const
+ GL_RGB_S3TC = $83A0;
+ GL_RGB4_S3TC = $83A1;
+ GL_RGBA_S3TC = $83A2;
+ GL_RGBA4_S3TC = $83A3;
+
+function Load_GL_S3_s3tc: Boolean;
+
+//***** GL_ATI_draw_buffers *****//
+const
+ GL_MAX_DRAW_BUFFERS_ATI = $8824;
+ GL_DRAW_BUFFER0_ATI = $8825;
+ GL_DRAW_BUFFER1_ATI = $8826;
+ GL_DRAW_BUFFER2_ATI = $8827;
+ GL_DRAW_BUFFER3_ATI = $8828;
+ GL_DRAW_BUFFER4_ATI = $8829;
+ GL_DRAW_BUFFER5_ATI = $882A;
+ GL_DRAW_BUFFER6_ATI = $882B;
+ GL_DRAW_BUFFER7_ATI = $882C;
+ GL_DRAW_BUFFER8_ATI = $882D;
+ GL_DRAW_BUFFER9_ATI = $882E;
+ GL_DRAW_BUFFER10_ATI = $882F;
+ GL_DRAW_BUFFER11_ATI = $8830;
+ GL_DRAW_BUFFER12_ATI = $8831;
+ GL_DRAW_BUFFER13_ATI = $8832;
+ GL_DRAW_BUFFER14_ATI = $8833;
+ GL_DRAW_BUFFER15_ATI = $8834;
+var
+ glDrawBuffersATI: procedure(n: GLsizei; const bufs: PGLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ATI_draw_buffers: Boolean;
+
+{$IFDEF WINDOWS}
+//***** WGL_ATI_pixel_format_float *****//
+const
+ WGL_RGBA_FLOAT_MODE_ATI = $8820;
+ WGL_COLOR_CLEAR_UNCLAMPED_VALUE_ATI = $8835;
+ WGL_TYPE_RGBA_FLOAT_ATI = $21A0;
+
+function Load_WGL_ATI_pixel_format_float: Boolean;
+{$ENDIF}
+
+//***** GL_ATI_texture_env_combine3 *****//
+const
+ GL_MODULATE_ADD_ATI = $8744;
+ GL_MODULATE_SIGNED_ADD_ATI = $8745;
+ GL_MODULATE_SUBTRACT_ATI = $8746;
+
+function Load_GL_ATI_texture_env_combine3: Boolean;
+
+//***** GL_ATI_texture_float *****//
+const
+ GL_RGBA_FLOAT32_ATI = $8814;
+ GL_RGB_FLOAT32_ATI = $8815;
+ GL_ALPHA_FLOAT32_ATI = $8816;
+ GL_INTENSITY_FLOAT32_ATI = $8817;
+ GL_LUMINANCE_FLOAT32_ATI = $8818;
+ GL_LUMINANCE_ALPHA_FLOAT32_ATI = $8819;
+ GL_RGBA_FLOAT16_ATI = $881A;
+ GL_RGB_FLOAT16_ATI = $881B;
+ GL_ALPHA_FLOAT16_ATI = $881C;
+ GL_INTENSITY_FLOAT16_ATI = $881D;
+ GL_LUMINANCE_FLOAT16_ATI = $881E;
+ GL_LUMINANCE_ALPHA_FLOAT16_ATI = $881F;
+
+function Load_GL_ATI_texture_float: Boolean;
+
+//***** GL_NV_texture_expand_normal *****//
+const
+ GL_TEXTURE_UNSIGNED_REMAP_MODE_NV = $888F;
+
+function Load_GL_NV_texture_expand_normal: Boolean;
+
+//***** GL_NV_half_float *****//
+const
+ GL_HALF_FLOAT_NV = $140B;
+var
+ glVertex2hNV: procedure(x: GLushort; y: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex2hvNV: procedure(const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex3hNV: procedure(x: GLushort; y: GLushort; z: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex3hvNV: procedure(const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex4hNV: procedure(x: GLushort; y: GLushort; z: GLushort; w: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertex4hvNV: procedure(const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormal3hNV: procedure(nx: GLushort; ny: GLushort; nz: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glNormal3hvNV: procedure(const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor3hNV: procedure(red: GLushort; green: GLushort; blue: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor3hvNV: procedure(const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4hNV: procedure(red: GLushort; green: GLushort; blue: GLushort; alpha: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glColor4hvNV: procedure(const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord1hNV: procedure(s: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord1hvNV: procedure(const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord2hNV: procedure(s: GLushort; t: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord2hvNV: procedure(const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord3hNV: procedure(s: GLushort; t: GLushort; r: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord3hvNV: procedure(const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord4hNV: procedure(s: GLushort; t: GLushort; r: GLushort; q: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glTexCoord4hvNV: procedure(const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord1hNV: procedure(target: GLenum; s: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord1hvNV: procedure(target: GLenum; const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord2hNV: procedure(target: GLenum; s: GLushort; t: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord2hvNV: procedure(target: GLenum; const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord3hNV: procedure(target: GLenum; s: GLushort; t: GLushort; r: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord3hvNV: procedure(target: GLenum; const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord4hNV: procedure(target: GLenum; s: GLushort; t: GLushort; r: GLushort; q: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiTexCoord4hvNV: procedure(target: GLenum; const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFogCoordhNV: procedure(fog: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFogCoordhvNV: procedure(const fog: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3hNV: procedure(red: GLushort; green: GLushort; blue: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3hvNV: procedure(const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexWeighthNV: procedure(weight: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexWeighthvNV: procedure(const weight: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib1hNV: procedure(index: GLuint; x: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib1hvNV: procedure(index: GLuint; const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib2hNV: procedure(index: GLuint; x: GLushort; y: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib2hvNV: procedure(index: GLuint; const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib3hNV: procedure(index: GLuint; x: GLushort; y: GLushort; z: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib3hvNV: procedure(index: GLuint; const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4hNV: procedure(index: GLuint; x: GLushort; y: GLushort; z: GLushort; w: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4hvNV: procedure(index: GLuint; const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttribs1hvNV: procedure(index: GLuint; n: GLsizei; const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttribs2hvNV: procedure(index: GLuint; n: GLsizei; const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttribs3hvNV: procedure(index: GLuint; n: GLsizei; const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttribs4hvNV: procedure(index: GLuint; n: GLsizei; const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_NV_half_float: Boolean;
+
+//***** GL_ATI_map_object_buffer *****//
+var
+ glMapObjectBufferATI: function(buffer: GLuint): PGLvoid; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUnmapObjectBufferATI: procedure(buffer: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ATI_map_object_buffer: Boolean;
+
+//***** GL_ATI_separate_stencil *****//
+const
+ GL_KEEP = $1E00;
+ GL_ZERO = $0000;
+ GL_REPLACE = $1E01;
+ GL_INCR = $1E02;
+ GL_DECR = $1E03;
+ GL_INVERT = $150A;
+ GL_NEVER = $0200;
+ GL_LESS = $0201;
+ GL_LEQUAL = $0203;
+ GL_GREATER = $0204;
+ GL_GEQUAL = $0206;
+ GL_EQUAL = $0202;
+ GL_NOTEQUAL = $0205;
+ GL_ALWAYS = $0207;
+ GL_FRONT = $0404;
+ GL_BACK = $0405;
+ GL_FRONT_AND_BACK = $0408;
+ GL_STENCIL_BACK_FUNC_ATI = $8800;
+ GL_STENCIL_BACK_FAIL_ATI = $8801;
+ GL_STENCIL_BACK_PASS_DEPTH_FAIL_ATI = $8802;
+ GL_STENCIL_BACK_PASS_DEPTH_PASS_ATI = $8803;
+var
+ glStencilOpSeparateATI: procedure(face: GLenum; sfail: GLenum; dpfail: GLenum; dppass: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glStencilFuncSeparateATI: procedure(frontfunc: GLenum; backfunc: GLenum; ref: GLint; mask: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ATI_separate_stencil: Boolean;
+
+//***** GL_ATI_vertex_attrib_array_object *****//
+var
+ glVertexAttribArrayObjectATI: procedure(index: GLuint; size: GLint; _type: GLenum; normalized: GLboolean; stride: GLsizei; buffer: GLuint; offset: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetVertexAttribArrayObjectfvATI: procedure(index: GLuint; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetVertexAttribArrayObjectivATI: procedure(index: GLuint; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ATI_vertex_attrib_array_object: Boolean;
+
+//***** GL_ARB_vertex_buffer_object *****//
+const
+ GL_ARRAY_BUFFER_ARB = $8892;
+ GL_ELEMENT_ARRAY_BUFFER_ARB = $8893;
+ GL_ARRAY_BUFFER_BINDING_ARB = $8894;
+ GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB = $8895;
+ GL_VERTEX_ARRAY_BUFFER_BINDING_ARB = $8896;
+ GL_NORMAL_ARRAY_BUFFER_BINDING_ARB = $8897;
+ GL_COLOR_ARRAY_BUFFER_BINDING_ARB = $8898;
+ GL_INDEX_ARRAY_BUFFER_BINDING_ARB = $8899;
+ GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING_ARB = $889A;
+ GL_EDGE_FLAG_ARRAY_BUFFER_BINDING_ARB = $889B;
+ GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING_ARB = $889C;
+ GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING_ARB = $889D;
+ GL_WEIGHT_ARRAY_BUFFER_BINDING_ARB = $889E;
+ GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING_ARB = $889F;
+ GL_STREAM_DRAW_ARB = $88E0;
+ GL_STREAM_READ_ARB = $88E1;
+ GL_STREAM_COPY_ARB = $88E2;
+ GL_STATIC_DRAW_ARB = $88E4;
+ GL_STATIC_READ_ARB = $88E5;
+ GL_STATIC_COPY_ARB = $88E6;
+ GL_DYNAMIC_DRAW_ARB = $88E8;
+ GL_DYNAMIC_READ_ARB = $88E9;
+ GL_DYNAMIC_COPY_ARB = $88EA;
+ GL_READ_ONLY_ARB = $88B8;
+ GL_WRITE_ONLY_ARB = $88B9;
+ GL_READ_WRITE_ARB = $88BA;
+ GL_BUFFER_SIZE_ARB = $8764;
+ GL_BUFFER_USAGE_ARB = $8765;
+ GL_BUFFER_ACCESS_ARB = $88BB;
+ GL_BUFFER_MAPPED_ARB = $88BC;
+ GL_BUFFER_MAP_POINTER_ARB = $88BD;
+var
+ glBindBufferARB: procedure(target: GLenum; buffer: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDeleteBuffersARB: procedure(n: GLsizei; const buffers: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGenBuffersARB: procedure(n: GLsizei; buffers: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIsBufferARB: function(buffer: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBufferDataARB: procedure(target: GLenum; size: GLsizeiptrARB; const data: PGLvoid; usage: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBufferSubDataARB: procedure(target: GLenum; offset: GLintptrARB; size: GLsizeiptrARB; const data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetBufferSubDataARB: procedure(target: GLenum; offset: GLintptrARB; size: GLsizeiptrARB; data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMapBufferARB: function(target: GLenum; access: GLenum): PGLvoid; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUnmapBufferARB: function(target: GLenum): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetBufferParameterivARB: procedure(target: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetBufferPointervARB: procedure(target: GLenum; pname: GLenum; params: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ARB_vertex_buffer_object: Boolean;
+
+//***** GL_ARB_occlusion_query *****//
+const
+ GL_SAMPLES_PASSED_ARB = $8914;
+ GL_QUERY_COUNTER_BITS_ARB = $8864;
+ GL_CURRENT_QUERY_ARB = $8865;
+ GL_QUERY_RESULT_ARB = $8866;
+ GL_QUERY_RESULT_AVAILABLE_ARB = $8867;
+var
+ glGenQueriesARB: procedure(n: GLsizei; ids: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDeleteQueriesARB: procedure(n: GLsizei; const ids: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIsQueryARB: function(id: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBeginQueryARB: procedure(target: GLenum; id: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEndQueryARB: procedure(target: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetQueryivARB: procedure(target: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetQueryObjectivARB: procedure(id: GLuint; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetQueryObjectuivARB: procedure(id: GLuint; pname: GLenum; params: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ARB_occlusion_query: Boolean;
+
+//***** GL_ARB_shader_objects *****//
+const
+ GL_PROGRAM_OBJECT_ARB = $8B40;
+ GL_OBJECT_TYPE_ARB = $8B4E;
+ GL_OBJECT_SUBTYPE_ARB = $8B4F;
+ GL_OBJECT_DELETE_STATUS_ARB = $8B80;
+ GL_OBJECT_COMPILE_STATUS_ARB = $8B81;
+ GL_OBJECT_LINK_STATUS_ARB = $8B82;
+ GL_OBJECT_VALIDATE_STATUS_ARB = $8B83;
+ GL_OBJECT_INFO_LOG_LENGTH_ARB = $8B84;
+ GL_OBJECT_ATTACHED_OBJECTS_ARB = $8B85;
+ GL_OBJECT_ACTIVE_UNIFORMS_ARB = $8B86;
+ GL_OBJECT_ACTIVE_UNIFORM_MAX_LENGTH_ARB = $8B87;
+ GL_OBJECT_SHADER_SOURCE_LENGTH_ARB = $8B88;
+ GL_SHADER_OBJECT_ARB = $8B48;
+ GL_FLOAT = $1406;
+ GL_FLOAT_VEC2_ARB = $8B50;
+ GL_FLOAT_VEC3_ARB = $8B51;
+ GL_FLOAT_VEC4_ARB = $8B52;
+ GL_INT = $1404;
+ GL_INT_VEC2_ARB = $8B53;
+ GL_INT_VEC3_ARB = $8B54;
+ GL_INT_VEC4_ARB = $8B55;
+ GL_BOOL_ARB = $8B56;
+ GL_BOOL_VEC2_ARB = $8B57;
+ GL_BOOL_VEC3_ARB = $8B58;
+ GL_BOOL_VEC4_ARB = $8B59;
+ GL_FLOAT_MAT2_ARB = $8B5A;
+ GL_FLOAT_MAT3_ARB = $8B5B;
+ GL_FLOAT_MAT4_ARB = $8B5C;
+var
+ glDeleteObjectARB: procedure(obj: GLhandleARB); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetHandleARB: function(pname: GLenum): GLhandleARB; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDetachObjectARB: procedure(containerObj: GLhandleARB; attachedObj: GLhandleARB); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCreateShaderObjectARB: function(shaderType: GLenum): GLhandleARB; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glShaderSourceARB: procedure(shaderObj: GLhandleARB; count: GLsizei; const _string: PGLvoid; const length: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCompileShaderARB: procedure(shaderObj: GLhandleARB); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCreateProgramObjectARB: function(): GLhandleARB; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glAttachObjectARB: procedure(containerObj: GLhandleARB; obj: GLhandleARB); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLinkProgramARB: procedure(programObj: GLhandleARB); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUseProgramObjectARB: procedure(programObj: GLhandleARB); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glValidateProgramARB: procedure(programObj: GLhandleARB); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform1fARB: procedure(location: GLint; v0: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform2fARB: procedure(location: GLint; v0: GLfloat; v1: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform3fARB: procedure(location: GLint; v0: GLfloat; v1: GLfloat; v2: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform4fARB: procedure(location: GLint; v0: GLfloat; v1: GLfloat; v2: GLfloat; v3: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform1iARB: procedure(location: GLint; v0: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform2iARB: procedure(location: GLint; v0: GLint; v1: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform3iARB: procedure(location: GLint; v0: GLint; v1: GLint; v2: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform4iARB: procedure(location: GLint; v0: GLint; v1: GLint; v2: GLint; v3: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform1fvARB: procedure(location: GLint; count: GLsizei; value: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform2fvARB: procedure(location: GLint; count: GLsizei; value: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform3fvARB: procedure(location: GLint; count: GLsizei; value: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform4fvARB: procedure(location: GLint; count: GLsizei; value: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform1ivARB: procedure(location: GLint; count: GLsizei; value: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform2ivARB: procedure(location: GLint; count: GLsizei; value: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform3ivARB: procedure(location: GLint; count: GLsizei; value: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform4ivARB: procedure(location: GLint; count: GLsizei; value: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniformMatrix2fvARB: procedure(location: GLint; count: GLsizei; transpose: GLboolean; value: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniformMatrix3fvARB: procedure(location: GLint; count: GLsizei; transpose: GLboolean; value: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniformMatrix4fvARB: procedure(location: GLint; count: GLsizei; transpose: GLboolean; value: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetObjectParameterfvARB: procedure(obj: GLhandleARB; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetObjectParameterivARB: procedure(obj: GLhandleARB; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetInfoLogARB: procedure(obj: GLhandleARB; maxLength: GLsizei; length: PGLsizei; infoLog: PGLcharARB); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetAttachedObjectsARB: procedure(containerObj: GLhandleARB; maxCount: GLsizei; count: PGLsizei; obj: PGLhandleARB); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetUniformLocationARB: function(programObj: GLhandleARB; const name: PGLcharARB): GLint; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetActiveUniformARB: procedure(programObj: GLhandleARB; index: GLuint; maxLength: GLsizei; length: PGLsizei; size: PGLint; _type: PGLenum; name: PGLcharARB); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetUniformfvARB: procedure(programObj: GLhandleARB; location: GLint; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetUniformivARB: procedure(programObj: GLhandleARB; location: GLint; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetShaderSourceARB: procedure(obj: GLhandleARB; maxLength: GLsizei; length: PGLsizei; source: PGLcharARB); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ARB_shader_objects: Boolean;
+
+//***** GL_ARB_vertex_shader *****//
+const
+ GL_VERTEX_SHADER_ARB = $8B31;
+ GL_MAX_VERTEX_UNIFORM_COMPONENTS_ARB = $8B4A;
+ GL_MAX_VARYING_FLOATS_ARB = $8B4B;
+ // GL_MAX_VERTEX_ATTRIBS_ARB { already defined }
+ // GL_MAX_TEXTURE_IMAGE_UNITS_ARB { already defined }
+ GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB = $8B4C;
+ GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS_ARB = $8B4D;
+ // GL_MAX_TEXTURE_COORDS_ARB { already defined }
+ // GL_VERTEX_PROGRAM_POINT_SIZE_ARB { already defined }
+ // GL_VERTEX_PROGRAM_TWO_SIDE_ARB { already defined }
+ // GL_OBJECT_TYPE_ARB { already defined }
+ // GL_OBJECT_SUBTYPE_ARB { already defined }
+ GL_OBJECT_ACTIVE_ATTRIBUTES_ARB = $8B89;
+ GL_OBJECT_ACTIVE_ATTRIBUTE_MAX_LENGTH_ARB = $8B8A;
+ // GL_SHADER_OBJECT_ARB { already defined }
+ // GL_VERTEX_ATTRIB_ARRAY_ENABLED_ARB { already defined }
+ // GL_VERTEX_ATTRIB_ARRAY_SIZE_ARB { already defined }
+ // GL_VERTEX_ATTRIB_ARRAY_STRIDE_ARB { already defined }
+ // GL_VERTEX_ATTRIB_ARRAY_TYPE_ARB { already defined }
+ // GL_VERTEX_ATTRIB_ARRAY_NORMALIZED_ARB { already defined }
+ // GL_CURRENT_VERTEX_ATTRIB_ARB { already defined }
+ // GL_VERTEX_ATTRIB_ARRAY_POINTER_ARB { already defined }
+ // GL_FLOAT { already defined }
+ // GL_FLOAT_VEC2_ARB { already defined }
+ // GL_FLOAT_VEC3_ARB { already defined }
+ // GL_FLOAT_VEC4_ARB { already defined }
+ // GL_FLOAT_MAT2_ARB { already defined }
+ // GL_FLOAT_MAT3_ARB { already defined }
+ // GL_FLOAT_MAT4_ARB { already defined }
+ // glVertexAttrib1fARB { already defined }
+ // glVertexAttrib1sARB { already defined }
+ // glVertexAttrib1dARB { already defined }
+ // glVertexAttrib2fARB { already defined }
+ // glVertexAttrib2sARB { already defined }
+ // glVertexAttrib2dARB { already defined }
+ // glVertexAttrib3fARB { already defined }
+ // glVertexAttrib3sARB { already defined }
+ // glVertexAttrib3dARB { already defined }
+ // glVertexAttrib4fARB { already defined }
+ // glVertexAttrib4sARB { already defined }
+ // glVertexAttrib4dARB { already defined }
+ // glVertexAttrib4NubARB { already defined }
+ // glVertexAttrib1fvARB { already defined }
+ // glVertexAttrib1svARB { already defined }
+ // glVertexAttrib1dvARB { already defined }
+ // glVertexAttrib2fvARB { already defined }
+ // glVertexAttrib2svARB { already defined }
+ // glVertexAttrib2dvARB { already defined }
+ // glVertexAttrib3fvARB { already defined }
+ // glVertexAttrib3svARB { already defined }
+ // glVertexAttrib3dvARB { already defined }
+ // glVertexAttrib4fvARB { already defined }
+ // glVertexAttrib4svARB { already defined }
+ // glVertexAttrib4dvARB { already defined }
+ // glVertexAttrib4ivARB { already defined }
+ // glVertexAttrib4bvARB { already defined }
+ // glVertexAttrib4ubvARB { already defined }
+ // glVertexAttrib4usvARB { already defined }
+ // glVertexAttrib4uivARB { already defined }
+ // glVertexAttrib4NbvARB { already defined }
+ // glVertexAttrib4NsvARB { already defined }
+ // glVertexAttrib4NivARB { already defined }
+ // glVertexAttrib4NubvARB { already defined }
+ // glVertexAttrib4NusvARB { already defined }
+ // glVertexAttrib4NuivARB { already defined }
+ // glVertexAttribPointerARB { already defined }
+ // glEnableVertexAttribArrayARB { already defined }
+ // glDisableVertexAttribArrayARB { already defined }
+var
+ glBindAttribLocationARB: procedure(programObj: GLhandleARB; index: GLuint; const name: PGLcharARB); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetActiveAttribARB: procedure(programObj: GLhandleARB; index: GLuint; maxLength: GLsizei; length: PGLsizei; size: PGLint; _type: PGLenum; name: PGLcharARB); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetAttribLocationARB: function(programObj: GLhandleARB; const name: PGLcharARB): GLint; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ // glGetVertexAttribdvARB { already defined }
+ // glGetVertexAttribfvARB { already defined }
+ // glGetVertexAttribivARB { already defined }
+ // glGetVertexAttribPointervARB { already defined }
+
+function Load_GL_ARB_vertex_shader: Boolean;
+
+//***** GL_ARB_fragment_shader *****//
+const
+ GL_FRAGMENT_SHADER_ARB = $8B30;
+ GL_MAX_FRAGMENT_UNIFORM_COMPONENTS_ARB = $8B49;
+ // GL_MAX_TEXTURE_COORDS_ARB { already defined }
+ // GL_MAX_TEXTURE_IMAGE_UNITS_ARB { already defined }
+ // GL_OBJECT_TYPE_ARB { already defined }
+ // GL_OBJECT_SUBTYPE_ARB { already defined }
+ // GL_SHADER_OBJECT_ARB { already defined }
+
+function Load_GL_ARB_fragment_shader: Boolean;
+
+//***** GL_ARB_shading_language_100 *****//
+
+function Load_GL_ARB_shading_language_100: Boolean;
+
+//***** GL_ARB_texture_non_power_of_two *****//
+
+function Load_GL_ARB_texture_non_power_of_two: Boolean;
+
+//***** GL_ARB_point_sprite *****//
+const
+ GL_POINT_SPRITE_ARB = $8861;
+ GL_COORD_REPLACE_ARB = $8862;
+
+function Load_GL_ARB_point_sprite: Boolean;
+
+//***** GL_EXT_depth_bounds_test *****//
+const
+ GL_DEPTH_BOUNDS_TEST_EXT = $8890;
+ GL_DEPTH_BOUNDS_EXT = $8891;
+var
+ glDepthBoundsEXT: procedure(zmin: GLclampd; zmax: GLclampd); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_depth_bounds_test: Boolean;
+
+//***** GL_EXT_secondary_color *****//
+const
+ GL_COLOR_SUM_EXT = $8458;
+ GL_CURRENT_SECONDARY_COLOR_EXT = $8459;
+ GL_SECONDARY_COLOR_ARRAY_SIZE_EXT = $845A;
+ GL_SECONDARY_COLOR_ARRAY_TYPE_EXT = $845B;
+ GL_SECONDARY_COLOR_ARRAY_STRIDE_EXT = $845C;
+ GL_SECONDARY_COLOR_ARRAY_POINTER_EXT = $845D;
+ GL_SECONDARY_COLOR_ARRAY_EXT = $845E;
+var
+ glSecondaryColor3bEXT: procedure(r: GLbyte; g: GLbyte; b: GLbyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3sEXT: procedure(r: GLshort; g: GLshort; b: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3iEXT: procedure(r: GLint; g: GLint; b: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3fEXT: procedure(r: GLfloat; g: GLfloat; b: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3dEXT: procedure(r: GLdouble; g: GLdouble; b: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3ubEXT: procedure(r: GLubyte; g: GLubyte; b: GLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3usEXT: procedure(r: GLushort; g: GLushort; b: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3uiEXT: procedure(r: GLuint; g: GLuint; b: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3bvEXT: procedure(components: PGLbyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3svEXT: procedure(components: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3ivEXT: procedure(components: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3fvEXT: procedure(components: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3dvEXT: procedure(components: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3ubvEXT: procedure(components: PGLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3usvEXT: procedure(components: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3uivEXT: procedure(components: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColorPointerEXT: procedure(size: GLint; _type: GLenum; stride: GLsizei; pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_secondary_color: Boolean;
+
+//***** GL_EXT_texture_mirror_clamp *****//
+const
+ GL_MIRROR_CLAMP_EXT = $8742;
+ GL_MIRROR_CLAMP_TO_EDGE_EXT = $8743;
+ GL_MIRROR_CLAMP_TO_BORDER_EXT = $8912;
+
+function Load_GL_EXT_texture_mirror_clamp: Boolean;
+
+//***** GL_EXT_blend_equation_separate *****//
+const
+ GL_BLEND_EQUATION_RGB_EXT = $8009;
+ GL_BLEND_EQUATION_ALPHA_EXT = $883D;
+var
+ glBlendEquationSeparateEXT: procedure(modeRGB: GLenum; modeAlpha: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_blend_equation_separate: Boolean;
+
+//***** GL_MESA_pack_invert *****//
+const
+ GL_PACK_INVERT_MESA = $8758;
+
+function Load_GL_MESA_pack_invert: Boolean;
+
+//***** GL_MESA_ycbcr_texture *****//
+const
+ GL_YCBCR_MESA = $8757;
+ GL_UNSIGNED_SHORT_8_8_MESA = $85BA;
+ GL_UNSIGNED_SHORT_8_8_REV_MESA = $85BB;
+
+function Load_GL_MESA_ycbcr_texture: Boolean;
+
+//***** GL_ARB_fragment_program_shadow *****//
+
+function Load_GL_ARB_fragment_program_shadow: Boolean;
+
+//***** GL_EXT_fog_coord *****//
+const
+ GL_FOG_COORDINATE_SOURCE_EXT = $8450;
+ GL_FOG_COORDINATE_EXT = $8451;
+ GL_FRAGMENT_DEPTH_EXT = $8452;
+ GL_CURRENT_FOG_COORDINATE_EXT = $8453;
+ GL_FOG_COORDINATE_ARRAY_TYPE_EXT = $8454;
+ GL_FOG_COORDINATE_ARRAY_STRIDE_EXT = $8455;
+ GL_FOG_COORDINATE_ARRAY_POINTER_EXT = $8456;
+ GL_FOG_COORDINATE_ARRAY_EXT = $8457;
+var
+ glFogCoordfEXT: procedure(coord: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFogCoorddEXT: procedure(coord: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFogCoordfvEXT: procedure(coord: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFogCoorddvEXT: procedure(coord: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFogCoordPointerEXT: procedure(_type: GLenum; stride: GLsizei; pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_fog_coord: Boolean;
+
+//***** GL_NV_fragment_program_option *****//
+
+function Load_GL_NV_fragment_program_option: Boolean;
+
+//***** GL_EXT_pixel_buffer_object *****//
+const
+ GL_PIXEL_PACK_BUFFER_EXT = $88EB;
+ GL_PIXEL_UNPACK_BUFFER_EXT = $88EC;
+ GL_PIXEL_PACK_BUFFER_BINDING_EXT = $88ED;
+ GL_PIXEL_UNPACK_BUFFER_BINDING_EXT = $88EF;
+
+function Load_GL_EXT_pixel_buffer_object: Boolean;
+
+//***** GL_NV_fragment_program2 *****//
+const
+ GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV = $88F4;
+ GL_MAX_PROGRAM_CALL_DEPTH_NV = $88F5;
+ GL_MAX_PROGRAM_IF_DEPTH_NV = $88F6;
+ GL_MAX_PROGRAM_LOOP_DEPTH_NV = $88F7;
+ GL_MAX_PROGRAM_LOOP_COUNT_NV = $88F8;
+
+function Load_GL_NV_fragment_program2: Boolean;
+
+//***** GL_NV_vertex_program2_option *****//
+ // GL_MAX_PROGRAM_EXEC_INSTRUCTIONS_NV { already defined }
+ // GL_MAX_PROGRAM_CALL_DEPTH_NV { already defined }
+
+function Load_GL_NV_vertex_program2_option: Boolean;
+
+//***** GL_NV_vertex_program3 *****//
+ // GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS_ARB { already defined }
+
+function Load_GL_NV_vertex_program3: Boolean;
+
+//***** GL_ARB_draw_buffers *****//
+const
+ GL_MAX_DRAW_BUFFERS_ARB = $8824;
+ GL_DRAW_BUFFER0_ARB = $8825;
+ GL_DRAW_BUFFER1_ARB = $8826;
+ GL_DRAW_BUFFER2_ARB = $8827;
+ GL_DRAW_BUFFER3_ARB = $8828;
+ GL_DRAW_BUFFER4_ARB = $8829;
+ GL_DRAW_BUFFER5_ARB = $882A;
+ GL_DRAW_BUFFER6_ARB = $882B;
+ GL_DRAW_BUFFER7_ARB = $882C;
+ GL_DRAW_BUFFER8_ARB = $882D;
+ GL_DRAW_BUFFER9_ARB = $882E;
+ GL_DRAW_BUFFER10_ARB = $882F;
+ GL_DRAW_BUFFER11_ARB = $8830;
+ GL_DRAW_BUFFER12_ARB = $8831;
+ GL_DRAW_BUFFER13_ARB = $8832;
+ GL_DRAW_BUFFER14_ARB = $8833;
+ GL_DRAW_BUFFER15_ARB = $8834;
+var
+ glDrawBuffersARB: procedure(n: GLsizei; const bufs: PGLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ARB_draw_buffers: Boolean;
+
+//***** GL_ARB_texture_rectangle *****//
+const
+ GL_TEXTURE_RECTANGLE_ARB = $84F5;
+ GL_TEXTURE_BINDING_RECTANGLE_ARB = $84F6;
+ GL_PROXY_TEXTURE_RECTANGLE_ARB = $84F7;
+ GL_MAX_RECTANGLE_TEXTURE_SIZE_ARB = $84F8;
+
+function Load_GL_ARB_texture_rectangle: Boolean;
+
+//***** GL_ARB_color_buffer_float *****//
+const
+ GL_RGBA_FLOAT_MODE_ARB = $8820;
+ GL_CLAMP_VERTEX_COLOR_ARB = $891A;
+ GL_CLAMP_FRAGMENT_COLOR_ARB = $891B;
+ GL_CLAMP_READ_COLOR_ARB = $891C;
+ GL_FIXED_ONLY_ARB = $891D;
+ WGL_TYPE_RGBA_FLOAT_ARB = $21A0;
+var
+ glClampColorARB: procedure(target: GLenum; clamp: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_ARB_color_buffer_float: Boolean;
+
+//***** GL_ARB_half_float_pixel *****//
+const
+ GL_HALF_FLOAT_ARB = $140B;
+
+function Load_GL_ARB_half_float_pixel: Boolean;
+
+//***** GL_ARB_texture_float *****//
+const
+ GL_TEXTURE_RED_TYPE_ARB = $8C10;
+ GL_TEXTURE_GREEN_TYPE_ARB = $8C11;
+ GL_TEXTURE_BLUE_TYPE_ARB = $8C12;
+ GL_TEXTURE_ALPHA_TYPE_ARB = $8C13;
+ GL_TEXTURE_LUMINANCE_TYPE_ARB = $8C14;
+ GL_TEXTURE_INTENSITY_TYPE_ARB = $8C15;
+ GL_TEXTURE_DEPTH_TYPE_ARB = $8C16;
+ GL_UNSIGNED_NORMALIZED_ARB = $8C17;
+ GL_RGBA32F_ARB = $8814;
+ GL_RGB32F_ARB = $8815;
+ GL_ALPHA32F_ARB = $8816;
+ GL_INTENSITY32F_ARB = $8817;
+ GL_LUMINANCE32F_ARB = $8818;
+ GL_LUMINANCE_ALPHA32F_ARB = $8819;
+ GL_RGBA16F_ARB = $881A;
+ GL_RGB16F_ARB = $881B;
+ GL_ALPHA16F_ARB = $881C;
+ GL_INTENSITY16F_ARB = $881D;
+ GL_LUMINANCE16F_ARB = $881E;
+ GL_LUMINANCE_ALPHA16F_ARB = $881F;
+
+function Load_GL_ARB_texture_float: Boolean;
+
+//***** GL_EXT_texture_compression_dxt1 *****//
+ // GL_COMPRESSED_RGB_S3TC_DXT1_EXT { already defined }
+ // GL_COMPRESSED_RGBA_S3TC_DXT1_EXT { already defined }
+
+function Load_GL_EXT_texture_compression_dxt1: Boolean;
+
+//***** GL_ARB_pixel_buffer_object *****//
+const
+ GL_PIXEL_PACK_BUFFER_ARB = $88EB;
+ GL_PIXEL_UNPACK_BUFFER_ARB = $88EC;
+ GL_PIXEL_PACK_BUFFER_BINDING_ARB = $88ED;
+ GL_PIXEL_UNPACK_BUFFER_BINDING_ARB = $88EF;
+
+function Load_GL_ARB_pixel_buffer_object: Boolean;
+
+//***** GL_EXT_framebuffer_object *****//
+const
+ GL_FRAMEBUFFER_EXT = $8D40;
+ GL_RENDERBUFFER_EXT = $8D41;
+ GL_STENCIL_INDEX_EXT = $8D45;
+ GL_STENCIL_INDEX1_EXT = $8D46;
+ GL_STENCIL_INDEX4_EXT = $8D47;
+ GL_STENCIL_INDEX8_EXT = $8D48;
+ GL_STENCIL_INDEX16_EXT = $8D49;
+ GL_RENDERBUFFER_WIDTH_EXT = $8D42;
+ GL_RENDERBUFFER_HEIGHT_EXT = $8D43;
+ GL_RENDERBUFFER_INTERNAL_FORMAT_EXT = $8D44;
+ GL_FRAMEBUFFER_ATTACHMENT_OBJECT_TYPE_EXT = $8CD0;
+ GL_FRAMEBUFFER_ATTACHMENT_OBJECT_NAME_EXT = $8CD1;
+ GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_LEVEL_EXT = $8CD2;
+ GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_CUBE_MAP_FACE_EXT = $8CD3;
+ GL_FRAMEBUFFER_ATTACHMENT_TEXTURE_3D_ZOFFSET_EXT = $8CD4;
+ GL_COLOR_ATTACHMENT0_EXT = $8CE0;
+ GL_COLOR_ATTACHMENT1_EXT = $8CE1;
+ GL_COLOR_ATTACHMENT2_EXT = $8CE2;
+ GL_COLOR_ATTACHMENT3_EXT = $8CE3;
+ GL_COLOR_ATTACHMENT4_EXT = $8CE4;
+ GL_COLOR_ATTACHMENT5_EXT = $8CE5;
+ GL_COLOR_ATTACHMENT6_EXT = $8CE6;
+ GL_COLOR_ATTACHMENT7_EXT = $8CE7;
+ GL_COLOR_ATTACHMENT8_EXT = $8CE8;
+ GL_COLOR_ATTACHMENT9_EXT = $8CE9;
+ GL_COLOR_ATTACHMENT10_EXT = $8CEA;
+ GL_COLOR_ATTACHMENT11_EXT = $8CEB;
+ GL_COLOR_ATTACHMENT12_EXT = $8CEC;
+ GL_COLOR_ATTACHMENT13_EXT = $8CED;
+ GL_COLOR_ATTACHMENT14_EXT = $8CEE;
+ GL_COLOR_ATTACHMENT15_EXT = $8CEF;
+ GL_DEPTH_ATTACHMENT_EXT = $8D00;
+ GL_STENCIL_ATTACHMENT_EXT = $8D20;
+ GL_FRAMEBUFFER_COMPLETE_EXT = $8CD5;
+ GL_FRAMEBUFFER_INCOMPLETE_ATTACHMENT_EXT = $8CD6;
+ GL_FRAMEBUFFER_INCOMPLETE_MISSING_ATTACHMENT_EXT = $8CD7;
+ GL_FRAMEBUFFER_INCOMPLETE_DUPLICATE_ATTACHMENT_EXT = $8CD8;
+ GL_FRAMEBUFFER_INCOMPLETE_DIMENSIONS_EXT = $8CD9;
+ GL_FRAMEBUFFER_INCOMPLETE_FORMATS_EXT = $8CDA;
+ GL_FRAMEBUFFER_INCOMPLETE_DRAW_BUFFER_EXT = $8CDB;
+ GL_FRAMEBUFFER_INCOMPLETE_READ_BUFFER_EXT = $8CDC;
+ GL_FRAMEBUFFER_UNSUPPORTED_EXT = $8CDD;
+ GL_FRAMEBUFFER_STATUS_ERROR_EXT = $8CDE;
+ GL_FRAMEBUFFER_BINDING_EXT = $8CA6;
+ GL_RENDERBUFFER_BINDING_EXT = $8CA7;
+ GL_MAX_COLOR_ATTACHMENTS_EXT = $8CDF;
+ GL_MAX_RENDERBUFFER_SIZE_EXT = $84E8;
+ GL_INVALID_FRAMEBUFFER_OPERATION_EXT = $0506;
+var
+ glIsRenderbufferEXT: function(renderbuffer: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBindRenderbufferEXT: procedure(target: GLenum; renderbuffer: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDeleteRenderbuffersEXT: procedure(n: GLsizei; const renderbuffers: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGenRenderbuffersEXT: procedure(n: GLsizei; renderbuffers: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glRenderbufferStorageEXT: procedure(target: GLenum; internalformat: GLenum; width: GLsizei; height: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetRenderbufferParameterivEXT: procedure(target: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIsFramebufferEXT: function(framebuffer: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBindFramebufferEXT: procedure(target: GLenum; framebuffer: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDeleteFramebuffersEXT: procedure(n: GLsizei; const framebuffers: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGenFramebuffersEXT: procedure(n: GLsizei; framebuffers: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCheckFramebufferStatusEXT: function(target: GLenum): GLenum; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFramebufferTexture1DEXT: procedure(target: GLenum; attachment: GLenum; textarget: GLenum; texture: GLuint; level: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFramebufferTexture2DEXT: procedure(target: GLenum; attachment: GLenum; textarget: GLenum; texture: GLuint; level: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFramebufferTexture3DEXT: procedure(target: GLenum; attachment: GLenum; textarget: GLenum; texture: GLuint; level: GLint; zoffset: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFramebufferRenderbufferEXT: procedure(target: GLenum; attachment: GLenum; renderbuffertarget: GLenum; renderbuffer: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetFramebufferAttachmentParameterivEXT: procedure(target: GLenum; attachment: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGenerateMipmapEXT: procedure(target: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_EXT_framebuffer_object: Boolean;
+
+//***** GL_version_1_4 *****//
+const
+ GL_BLEND_DST_RGB = $80C8;
+ GL_BLEND_SRC_RGB = $80C9;
+ GL_BLEND_DST_ALPHA = $80CA;
+ GL_BLEND_SRC_ALPHA = $80CB;
+ GL_POINT_SIZE_MIN = $8126;
+ GL_POINT_SIZE_MAX = $8127;
+ GL_POINT_FADE_THRESHOLD_SIZE = $8128;
+ GL_POINT_DISTANCE_ATTENUATION = $8129;
+ GL_GENERATE_MIPMAP = $8191;
+ GL_GENERATE_MIPMAP_HINT = $8192;
+ GL_DEPTH_COMPONENT16 = $81A5;
+ GL_DEPTH_COMPONENT24 = $81A6;
+ GL_DEPTH_COMPONENT32 = $81A7;
+ GL_MIRRORED_REPEAT = $8370;
+ GL_FOG_COORDINATE_SOURCE = $8450;
+ GL_FOG_COORDINATE = $8451;
+ GL_FRAGMENT_DEPTH = $8452;
+ GL_CURRENT_FOG_COORDINATE = $8453;
+ GL_FOG_COORDINATE_ARRAY_TYPE = $8454;
+ GL_FOG_COORDINATE_ARRAY_STRIDE = $8455;
+ GL_FOG_COORDINATE_ARRAY_POINTER = $8456;
+ GL_FOG_COORDINATE_ARRAY = $8457;
+ GL_COLOR_SUM = $8458;
+ GL_CURRENT_SECONDARY_COLOR = $8459;
+ GL_SECONDARY_COLOR_ARRAY_SIZE = $845A;
+ GL_SECONDARY_COLOR_ARRAY_TYPE = $845B;
+ GL_SECONDARY_COLOR_ARRAY_STRIDE = $845C;
+ GL_SECONDARY_COLOR_ARRAY_POINTER = $845D;
+ GL_SECONDARY_COLOR_ARRAY = $845E;
+ GL_MAX_TEXTURE_LOD_BIAS = $84FD;
+ GL_TEXTURE_FILTER_CONTROL = $8500;
+ GL_TEXTURE_LOD_BIAS = $8501;
+ GL_INCR_WRAP = $8507;
+ GL_DECR_WRAP = $8508;
+ GL_TEXTURE_DEPTH_SIZE = $884A;
+ GL_DEPTH_TEXTURE_MODE = $884B;
+ GL_TEXTURE_COMPARE_MODE = $884C;
+ GL_TEXTURE_COMPARE_FUNC = $884D;
+ GL_COMPARE_R_TO_TEXTURE = $884E;
+var
+ glBlendFuncSeparate: procedure(sfactorRGB: GLenum; dfactorRGB: GLenum; sfactorAlpha: GLenum; dfactorAlpha: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFogCoordf: procedure(coord: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFogCoordfv: procedure(const coord: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFogCoordd: procedure(coord: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFogCoorddv: procedure(const coord: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glFogCoordPointer: procedure(_type: GLenum; stride: GLsizei; const pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiDrawArrays: procedure(mode: GLenum; first: PGLint; count: PGLsizei; primcount: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMultiDrawElements: procedure(mode: GLenum; const count: PGLsizei; _type: GLenum; const indices: PGLvoid; primcount: GLsizei); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPointParameterf: procedure(pname: GLenum; param: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPointParameterfv: procedure(pname: GLenum; const params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPointParameteri: procedure(pname: GLenum; param: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glPointParameteriv: procedure(pname: GLenum; const params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3b: procedure(red: GLbyte; green: GLbyte; blue: GLbyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3bv: procedure(const v: PGLbyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3d: procedure(red: GLdouble; green: GLdouble; blue: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3dv: procedure(const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3f: procedure(red: GLfloat; green: GLfloat; blue: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3fv: procedure(const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3i: procedure(red: GLint; green: GLint; blue: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3iv: procedure(const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3s: procedure(red: GLshort; green: GLshort; blue: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3sv: procedure(const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3ub: procedure(red: GLubyte; green: GLubyte; blue: GLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3ubv: procedure(const v: PGLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3ui: procedure(red: GLuint; green: GLuint; blue: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3uiv: procedure(const v: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3us: procedure(red: GLushort; green: GLushort; blue: GLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColor3usv: procedure(const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glSecondaryColorPointer: procedure(size: GLint; _type: GLenum; stride: GLsizei; const pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2d: procedure(x: GLdouble; y: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2dv: procedure(const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2f: procedure(x: GLfloat; y: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2fv: procedure(const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2i: procedure(x: GLint; y: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2iv: procedure(const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2s: procedure(x: GLshort; y: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos2sv: procedure(const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3d: procedure(x: GLdouble; y: GLdouble; z: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3dv: procedure(const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3f: procedure(x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3fv: procedure(const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3i: procedure(x: GLint; y: GLint; z: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3iv: procedure(const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3s: procedure(x: GLshort; y: GLshort; z: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glWindowPos3sv: procedure(const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_version_1_4: Boolean;
+
+//***** GL_version_1_5 *****//
+const
+ GL_BUFFER_SIZE = $8764;
+ GL_BUFFER_USAGE = $8765;
+ GL_QUERY_COUNTER_BITS = $8864;
+ GL_CURRENT_QUERY = $8865;
+ GL_QUERY_RESULT = $8866;
+ GL_QUERY_RESULT_AVAILABLE = $8867;
+ GL_ARRAY_BUFFER = $8892;
+ GL_ELEMENT_ARRAY_BUFFER = $8893;
+ GL_ARRAY_BUFFER_BINDING = $8894;
+ GL_ELEMENT_ARRAY_BUFFER_BINDING = $8895;
+ GL_VERTEX_ARRAY_BUFFER_BINDING = $8896;
+ GL_NORMAL_ARRAY_BUFFER_BINDING = $8897;
+ GL_COLOR_ARRAY_BUFFER_BINDING = $8898;
+ GL_INDEX_ARRAY_BUFFER_BINDING = $8899;
+ GL_TEXTURE_COORD_ARRAY_BUFFER_BINDING = $889A;
+ GL_EDGE_FLAG_ARRAY_BUFFER_BINDING = $889B;
+ GL_SECONDARY_COLOR_ARRAY_BUFFER_BINDING = $889C;
+ GL_FOG_COORDINATE_ARRAY_BUFFER_BINDING = $889D;
+ GL_WEIGHT_ARRAY_BUFFER_BINDING = $889E;
+ GL_VERTEX_ATTRIB_ARRAY_BUFFER_BINDING = $889F;
+ GL_READ_ONLY = $88B8;
+ GL_WRITE_ONLY = $88B9;
+ GL_READ_WRITE = $88BA;
+ GL_BUFFER_ACCESS = $88BB;
+ GL_BUFFER_MAPPED = $88BC;
+ GL_BUFFER_MAP_POINTER = $88BD;
+ GL_STREAM_DRAW = $88E0;
+ GL_STREAM_READ = $88E1;
+ GL_STREAM_COPY = $88E2;
+ GL_STATIC_DRAW = $88E4;
+ GL_STATIC_READ = $88E5;
+ GL_STATIC_COPY = $88E6;
+ GL_DYNAMIC_DRAW = $88E8;
+ GL_DYNAMIC_READ = $88E9;
+ GL_DYNAMIC_COPY = $88EA;
+ GL_SAMPLES_PASSED = $8914;
+ GL_FOG_COORD_SRC = $8450;
+ GL_FOG_COORD = $8451;
+ GL_CURRENT_FOG_COORD = $8453;
+ GL_FOG_COORD_ARRAY_TYPE = $8454;
+ GL_FOG_COORD_ARRAY_STRIDE = $8455;
+ GL_FOG_COORD_ARRAY_POINTER = $8456;
+ GL_FOG_COORD_ARRAY = $8457;
+ GL_FOG_COORD_ARRAY_BUFFER_BINDING = $889D;
+ GL_SRC0_RGB = $8580;
+ GL_SRC1_RGB = $8581;
+ GL_SRC2_RGB = $8582;
+ GL_SRC0_ALPHA = $8588;
+ GL_SRC1_ALPHA = $8589;
+ GL_SRC2_ALPHA = $858A;
+var
+ glGenQueries: procedure(n: GLsizei; ids: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDeleteQueries: procedure(n: GLsizei; const ids: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIsQuery: function(id: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBeginQuery: procedure(target: GLenum; id: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEndQuery: procedure(target: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetQueryiv: procedure(target: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetQueryObjectiv: procedure(id: GLuint; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetQueryObjectuiv: procedure(id: GLuint; pname: GLenum; params: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBindBuffer: procedure(target: GLenum; buffer: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDeleteBuffers: procedure(n: GLsizei; const buffers: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGenBuffers: procedure(n: GLsizei; buffers: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIsBuffer: function(buffer: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBufferData: procedure(target: GLenum; size: GLsizeiptr; const data: PGLvoid; usage: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBufferSubData: procedure(target: GLenum; offset: GLintptr; size: GLsizeiptr; const data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetBufferSubData: procedure(target: GLenum; offset: GLintptr; size: GLsizeiptr; data: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glMapBuffer: function(target: GLenum; access: GLenum): PGLvoid; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUnmapBuffer: function(target: GLenum): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetBufferParameteriv: procedure(target: GLenum; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetBufferPointerv: procedure(target: GLenum; pname: GLenum; params: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_version_1_5: Boolean;
+
+//***** GL_version_2_0 *****//
+const
+ GL_BLEND_EQUATION_RGB = $8009;
+ GL_VERTEX_ATTRIB_ARRAY_ENABLED = $8622;
+ GL_VERTEX_ATTRIB_ARRAY_SIZE = $8623;
+ GL_VERTEX_ATTRIB_ARRAY_STRIDE = $8624;
+ GL_VERTEX_ATTRIB_ARRAY_TYPE = $8625;
+ GL_CURRENT_VERTEX_ATTRIB = $8626;
+ GL_VERTEX_PROGRAM_POINT_SIZE = $8642;
+ GL_VERTEX_PROGRAM_TWO_SIDE = $8643;
+ GL_VERTEX_ATTRIB_ARRAY_POINTER = $8645;
+ GL_STENCIL_BACK_FUNC = $8800;
+ GL_STENCIL_BACK_FAIL = $8801;
+ GL_STENCIL_BACK_PASS_DEPTH_FAIL = $8802;
+ GL_STENCIL_BACK_PASS_DEPTH_PASS = $8803;
+ GL_MAX_DRAW_BUFFERS = $8824;
+ GL_DRAW_BUFFER0 = $8825;
+ GL_DRAW_BUFFER1 = $8826;
+ GL_DRAW_BUFFER2 = $8827;
+ GL_DRAW_BUFFER3 = $8828;
+ GL_DRAW_BUFFER4 = $8829;
+ GL_DRAW_BUFFER5 = $882A;
+ GL_DRAW_BUFFER6 = $882B;
+ GL_DRAW_BUFFER7 = $882C;
+ GL_DRAW_BUFFER8 = $882D;
+ GL_DRAW_BUFFER9 = $882E;
+ GL_DRAW_BUFFER10 = $882F;
+ GL_DRAW_BUFFER11 = $8830;
+ GL_DRAW_BUFFER12 = $8831;
+ GL_DRAW_BUFFER13 = $8832;
+ GL_DRAW_BUFFER14 = $8833;
+ GL_DRAW_BUFFER15 = $8834;
+ GL_BLEND_EQUATION_ALPHA = $883D;
+ GL_POINT_SPRITE = $8861;
+ GL_COORD_REPLACE = $8862;
+ GL_MAX_VERTEX_ATTRIBS = $8869;
+ GL_VERTEX_ATTRIB_ARRAY_NORMALIZED = $886A;
+ GL_MAX_TEXTURE_COORDS = $8871;
+ GL_MAX_TEXTURE_IMAGE_UNITS = $8872;
+ GL_FRAGMENT_SHADER = $8B30;
+ GL_VERTEX_SHADER = $8B31;
+ GL_MAX_FRAGMENT_UNIFORM_COMPONENTS = $8B49;
+ GL_MAX_VERTEX_UNIFORM_COMPONENTS = $8B4A;
+ GL_MAX_VARYING_FLOATS = $8B4B;
+ GL_MAX_VERTEX_TEXTURE_IMAGE_UNITS = $8B4C;
+ GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS = $8B4D;
+ GL_SHADER_TYPE = $8B4F;
+ GL_FLOAT_VEC2 = $8B50;
+ GL_FLOAT_VEC3 = $8B51;
+ GL_FLOAT_VEC4 = $8B52;
+ GL_INT_VEC2 = $8B53;
+ GL_INT_VEC3 = $8B54;
+ GL_INT_VEC4 = $8B55;
+ GL_BOOL = $8B56;
+ GL_BOOL_VEC2 = $8B57;
+ GL_BOOL_VEC3 = $8B58;
+ GL_BOOL_VEC4 = $8B59;
+ GL_FLOAT_MAT2 = $8B5A;
+ GL_FLOAT_MAT3 = $8B5B;
+ GL_FLOAT_MAT4 = $8B5C;
+ GL_SAMPLER_1D = $8B5D;
+ GL_SAMPLER_2D = $8B5E;
+ GL_SAMPLER_3D = $8B5F;
+ GL_SAMPLER_CUBE = $8B60;
+ GL_SAMPLER_1D_SHADOW = $8B61;
+ GL_SAMPLER_2D_SHADOW = $8B62;
+ GL_DELETE_STATUS = $8B80;
+ GL_COMPILE_STATUS = $8B81;
+ GL_LINK_STATUS = $8B82;
+ GL_VALIDATE_STATUS = $8B83;
+ GL_INFO_LOG_LENGTH = $8B84;
+ GL_ATTACHED_SHADERS = $8B85;
+ GL_ACTIVE_UNIFORMS = $8B86;
+ GL_ACTIVE_UNIFORM_MAX_LENGTH = $8B87;
+ GL_SHADER_SOURCE_LENGTH = $8B88;
+ GL_ACTIVE_ATTRIBUTES = $8B89;
+ GL_ACTIVE_ATTRIBUTE_MAX_LENGTH = $8B8A;
+ GL_FRAGMENT_SHADER_DERIVATIVE_HINT = $8B8B;
+ GL_SHADING_LANGUAGE_VERSION = $8B8C;
+ GL_CURRENT_PROGRAM = $8B8D;
+ GL_POINT_SPRITE_COORD_ORIGIN = $8CA0;
+ GL_LOWER_LEFT = $8CA1;
+ GL_UPPER_LEFT = $8CA2;
+ GL_STENCIL_BACK_REF = $8CA3;
+ GL_STENCIL_BACK_VALUE_MASK = $8CA4;
+ GL_STENCIL_BACK_WRITEMASK = $8CA5;
+var
+ glBlendEquationSeparate: procedure(modeRGB: GLenum; modeAlpha: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDrawBuffers: procedure(n: GLsizei; const bufs: PGLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glStencilOpSeparate: procedure(face: GLenum; sfail: GLenum; dpfail: GLenum; dppass: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glStencilFuncSeparate: procedure(frontfunc: GLenum; backfunc: GLenum; ref: GLint; mask: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glStencilMaskSeparate: procedure(face: GLenum; mask: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glAttachShader: procedure(_program: GLuint; shader: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glBindAttribLocation: procedure(_program: GLuint; index: GLuint; const name: PGLchar); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCompileShader: procedure(shader: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCreateProgram: function(): GLuint; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glCreateShader: function(_type: GLenum): GLuint; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDeleteProgram: procedure(_program: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDeleteShader: procedure(shader: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDetachShader: procedure(_program: GLuint; shader: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glDisableVertexAttribArray: procedure(index: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glEnableVertexAttribArray: procedure(index: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetActiveAttrib: procedure(_program: GLuint; index: GLuint; bufSize: GLsizei; length: PGLsizei; size: PGLint; _type: PGLenum; name: PGLchar); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetActiveUniform: procedure(_program: GLuint; index: GLuint; bufSize: GLsizei; length: PGLsizei; size: PGLint; _type: PGLenum; name: PGLchar); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetAttachedShaders: procedure(_program: GLuint; maxCount: GLsizei; count: PGLsizei; obj: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetAttribLocation: function(_program: GLuint; const name: PGLchar): GLint; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetProgramiv: procedure(_program: GLuint; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetProgramInfoLog: procedure(_program: GLuint; bufSize: GLsizei; length: PGLsizei; infoLog: PGLchar); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetShaderiv: procedure(shader: GLuint; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetShaderInfoLog: procedure(shader: GLuint; bufSize: GLsizei; length: PGLsizei; infoLog: PGLchar); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetShaderSource: procedure(shader: GLuint; bufSize: GLsizei; length: PGLsizei; source: PGLchar); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetUniformLocation: function(_program: GLuint; const name: PGLchar): GLint; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetUniformfv: procedure(_program: GLuint; location: GLint; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetUniformiv: procedure(_program: GLuint; location: GLint; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetVertexAttribdv: procedure(index: GLuint; pname: GLenum; params: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetVertexAttribfv: procedure(index: GLuint; pname: GLenum; params: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetVertexAttribiv: procedure(index: GLuint; pname: GLenum; params: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glGetVertexAttribPointerv: procedure(index: GLuint; pname: GLenum; pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIsProgram: function(_program: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glIsShader: function(shader: GLuint): GLboolean; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glLinkProgram: procedure(_program: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glShaderSource: procedure(shader: GLuint; count: GLsizei; const _string: PGLchar; const length: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUseProgram: procedure(_program: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform1f: procedure(location: GLint; v0: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform2f: procedure(location: GLint; v0: GLfloat; v1: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform3f: procedure(location: GLint; v0: GLfloat; v1: GLfloat; v2: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform4f: procedure(location: GLint; v0: GLfloat; v1: GLfloat; v2: GLfloat; v3: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform1i: procedure(location: GLint; v0: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform2i: procedure(location: GLint; v0: GLint; v1: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform3i: procedure(location: GLint; v0: GLint; v1: GLint; v2: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform4i: procedure(location: GLint; v0: GLint; v1: GLint; v2: GLint; v3: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform1fv: procedure(location: GLint; count: GLsizei; const value: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform2fv: procedure(location: GLint; count: GLsizei; const value: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform3fv: procedure(location: GLint; count: GLsizei; const value: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform4fv: procedure(location: GLint; count: GLsizei; const value: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform1iv: procedure(location: GLint; count: GLsizei; const value: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform2iv: procedure(location: GLint; count: GLsizei; const value: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform3iv: procedure(location: GLint; count: GLsizei; const value: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniform4iv: procedure(location: GLint; count: GLsizei; const value: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniformMatrix2fv: procedure(location: GLint; count: GLsizei; transpose: GLboolean; const value: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniformMatrix3fv: procedure(location: GLint; count: GLsizei; transpose: GLboolean; const value: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glUniformMatrix4fv: procedure(location: GLint; count: GLsizei; transpose: GLboolean; const value: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glValidateProgram: procedure(_program: GLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib1d: procedure(index: GLuint; x: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib1dv: procedure(index: GLuint; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib1f: procedure(index: GLuint; x: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib1fv: procedure(index: GLuint; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib1s: procedure(index: GLuint; x: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib1sv: procedure(index: GLuint; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib2d: procedure(index: GLuint; x: GLdouble; y: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib2dv: procedure(index: GLuint; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib2f: procedure(index: GLuint; x: GLfloat; y: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib2fv: procedure(index: GLuint; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib2s: procedure(index: GLuint; x: GLshort; y: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib2sv: procedure(index: GLuint; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib3d: procedure(index: GLuint; x: GLdouble; y: GLdouble; z: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib3dv: procedure(index: GLuint; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib3f: procedure(index: GLuint; x: GLfloat; y: GLfloat; z: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib3fv: procedure(index: GLuint; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib3s: procedure(index: GLuint; x: GLshort; y: GLshort; z: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib3sv: procedure(index: GLuint; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4Nbv: procedure(index: GLuint; const v: PGLbyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4Niv: procedure(index: GLuint; const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4Nsv: procedure(index: GLuint; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4Nub: procedure(index: GLuint; x: GLubyte; y: GLubyte; z: GLubyte; w: GLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4Nubv: procedure(index: GLuint; const v: PGLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4Nuiv: procedure(index: GLuint; const v: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4Nusv: procedure(index: GLuint; const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4bv: procedure(index: GLuint; const v: PGLbyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4d: procedure(index: GLuint; x: GLdouble; y: GLdouble; z: GLdouble; w: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4dv: procedure(index: GLuint; const v: PGLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4f: procedure(index: GLuint; x: GLfloat; y: GLfloat; z: GLfloat; w: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4fv: procedure(index: GLuint; const v: PGLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4iv: procedure(index: GLuint; const v: PGLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4s: procedure(index: GLuint; x: GLshort; y: GLshort; z: GLshort; w: GLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4sv: procedure(index: GLuint; const v: PGLshort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4ubv: procedure(index: GLuint; const v: PGLubyte); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4uiv: procedure(index: GLuint; const v: PGLuint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttrib4usv: procedure(index: GLuint; const v: PGLushort); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glVertexAttribPointer: procedure(index: GLuint; size: GLint; _type: GLenum; normalized: GLboolean; stride: GLsizei; const pointer: PGLvoid); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+function Load_GL_version_2_0: Boolean;
+
+implementation
+
+uses
+ sdl;
+
+function glext_ExtensionSupported(const extension: PChar; const searchIn: PChar): Boolean;
+var
+ extensions: PChar;
+ start: PChar;
+ where, terminator: PChar;
+begin
+
+ if (Pos(' ', extension) <> 0) or (extension = '') then
+ begin
+ Result := FALSE;
+ Exit;
+ end;
+
+ if searchIn = '' then
+ extensions := glGetString(GL_EXTENSIONS)
+ else
+ //StrLCopy( extensions, searchIn, StrLen(searchIn)+1 );
+ extensions := searchIn;
+ start := extensions;
+ while TRUE do
+ begin
+ where := StrPos(start, extension );
+ if where = nil then Break;
+ terminator := Pointer(Integer(where) + Integer( strlen( extension ) ) );
+ if (where = start) or (PChar(Integer(where) - 1)^ = ' ') then
+ begin
+ if (terminator^ = ' ') or (terminator^ = #0) then
+ begin
+ Result := TRUE;
+ Exit;
+ end;
+ end;
+ start := terminator;
+ end;
+ Result := FALSE;
+
+end;
+
+function Load_GL_version_1_2: Boolean;
+{var
+ extstring : PChar;}
+begin
+
+ Result := FALSE;
+ //extstring := glGetString( GL_EXTENSIONS );
+
+ @glCopyTexSubImage3D := SDL_GL_GetProcAddress('glCopyTexSubImage3D');
+ if not Assigned(glCopyTexSubImage3D) then Exit;
+ @glDrawRangeElements := SDL_GL_GetProcAddress('glDrawRangeElements');
+ if not Assigned(glDrawRangeElements) then Exit;
+ @glTexImage3D := SDL_GL_GetProcAddress('glTexImage3D');
+ if not Assigned(glTexImage3D) then Exit;
+ @glTexSubImage3D := SDL_GL_GetProcAddress('glTexSubImage3D');
+ if not Assigned(glTexSubImage3D) then Exit;
+
+ Result := TRUE;
+
+end;
+
+function Load_GL_ARB_imaging: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_imaging', extstring) then
+ begin
+ @glColorTable := SDL_GL_GetProcAddress('glColorTable');
+ if not Assigned(glColorTable) then Exit;
+ @glColorTableParameterfv := SDL_GL_GetProcAddress('glColorTableParameterfv');
+ if not Assigned(glColorTableParameterfv) then Exit;
+ @glColorTableParameteriv := SDL_GL_GetProcAddress('glColorTableParameteriv');
+ if not Assigned(glColorTableParameteriv) then Exit;
+ @glCopyColorTable := SDL_GL_GetProcAddress('glCopyColorTable');
+ if not Assigned(glCopyColorTable) then Exit;
+ @glGetColorTable := SDL_GL_GetProcAddress('glGetColorTable');
+ if not Assigned(glGetColorTable) then Exit;
+ @glGetColorTableParameterfv := SDL_GL_GetProcAddress('glGetColorTableParameterfv');
+ if not Assigned(glGetColorTableParameterfv) then Exit;
+ @glGetColorTableParameteriv := SDL_GL_GetProcAddress('glGetColorTableParameteriv');
+ if not Assigned(glGetColorTableParameteriv) then Exit;
+ @glColorSubTable := SDL_GL_GetProcAddress('glColorSubTable');
+ if not Assigned(glColorSubTable) then Exit;
+ @glCopyColorSubTable := SDL_GL_GetProcAddress('glCopyColorSubTable');
+ if not Assigned(glCopyColorSubTable) then Exit;
+ @glConvolutionFilter1D := SDL_GL_GetProcAddress('glConvolutionFilter1D');
+ if not Assigned(glConvolutionFilter1D) then Exit;
+ @glConvolutionFilter2D := SDL_GL_GetProcAddress('glConvolutionFilter2D');
+ if not Assigned(glConvolutionFilter2D) then Exit;
+ @glConvolutionParameterf := SDL_GL_GetProcAddress('glConvolutionParameterf');
+ if not Assigned(glConvolutionParameterf) then Exit;
+ @glConvolutionParameterfv := SDL_GL_GetProcAddress('glConvolutionParameterfv');
+ if not Assigned(glConvolutionParameterfv) then Exit;
+ @glConvolutionParameteri := SDL_GL_GetProcAddress('glConvolutionParameteri');
+ if not Assigned(glConvolutionParameteri) then Exit;
+ @glConvolutionParameteriv := SDL_GL_GetProcAddress('glConvolutionParameteriv');
+ if not Assigned(glConvolutionParameteriv) then Exit;
+ @glCopyConvolutionFilter1D := SDL_GL_GetProcAddress('glCopyConvolutionFilter1D');
+ if not Assigned(glCopyConvolutionFilter1D) then Exit;
+ @glCopyConvolutionFilter2D := SDL_GL_GetProcAddress('glCopyConvolutionFilter2D');
+ if not Assigned(glCopyConvolutionFilter2D) then Exit;
+ @glGetConvolutionFilter := SDL_GL_GetProcAddress('glGetConvolutionFilter');
+ if not Assigned(glGetConvolutionFilter) then Exit;
+ @glGetConvolutionParameterfv := SDL_GL_GetProcAddress('glGetConvolutionParameterfv');
+ if not Assigned(glGetConvolutionParameterfv) then Exit;
+ @glGetConvolutionParameteriv := SDL_GL_GetProcAddress('glGetConvolutionParameteriv');
+ if not Assigned(glGetConvolutionParameteriv) then Exit;
+ @glGetSeparableFilter := SDL_GL_GetProcAddress('glGetSeparableFilter');
+ if not Assigned(glGetSeparableFilter) then Exit;
+ @glSeparableFilter2D := SDL_GL_GetProcAddress('glSeparableFilter2D');
+ if not Assigned(glSeparableFilter2D) then Exit;
+ @glGetHistogram := SDL_GL_GetProcAddress('glGetHistogram');
+ if not Assigned(glGetHistogram) then Exit;
+ @glGetHistogramParameterfv := SDL_GL_GetProcAddress('glGetHistogramParameterfv');
+ if not Assigned(glGetHistogramParameterfv) then Exit;
+ @glGetHistogramParameteriv := SDL_GL_GetProcAddress('glGetHistogramParameteriv');
+ if not Assigned(glGetHistogramParameteriv) then Exit;
+ @glGetMinmax := SDL_GL_GetProcAddress('glGetMinmax');
+ if not Assigned(glGetMinmax) then Exit;
+ @glGetMinmaxParameterfv := SDL_GL_GetProcAddress('glGetMinmaxParameterfv');
+ if not Assigned(glGetMinmaxParameterfv) then Exit;
+ @glGetMinmaxParameteriv := SDL_GL_GetProcAddress('glGetMinmaxParameteriv');
+ if not Assigned(glGetMinmaxParameteriv) then Exit;
+ @glHistogram := SDL_GL_GetProcAddress('glHistogram');
+ if not Assigned(glHistogram) then Exit;
+ @glMinmax := SDL_GL_GetProcAddress('glMinmax');
+ if not Assigned(glMinmax) then Exit;
+ @glResetHistogram := SDL_GL_GetProcAddress('glResetHistogram');
+ if not Assigned(glResetHistogram) then Exit;
+ @glResetMinmax := SDL_GL_GetProcAddress('glResetMinmax');
+ if not Assigned(glResetMinmax) then Exit;
+ @glBlendEquation := SDL_GL_GetProcAddress('glBlendEquation');
+ if not Assigned(glBlendEquation) then Exit;
+ @glBlendColor := SDL_GL_GetProcAddress('glBlendColor');
+ if not Assigned(glBlendColor) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_version_1_3: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ @glActiveTexture := SDL_GL_GetProcAddress('glActiveTexture');
+ if not Assigned(glActiveTexture) then Exit;
+ @glClientActiveTexture := SDL_GL_GetProcAddress('glClientActiveTexture');
+ if not Assigned(glClientActiveTexture) then Exit;
+ @glMultiTexCoord1d := SDL_GL_GetProcAddress('glMultiTexCoord1d');
+ if not Assigned(glMultiTexCoord1d) then Exit;
+ @glMultiTexCoord1dv := SDL_GL_GetProcAddress('glMultiTexCoord1dv');
+ if not Assigned(glMultiTexCoord1dv) then Exit;
+ @glMultiTexCoord1f := SDL_GL_GetProcAddress('glMultiTexCoord1f');
+ if not Assigned(glMultiTexCoord1f) then Exit;
+ @glMultiTexCoord1fv := SDL_GL_GetProcAddress('glMultiTexCoord1fv');
+ if not Assigned(glMultiTexCoord1fv) then Exit;
+ @glMultiTexCoord1i := SDL_GL_GetProcAddress('glMultiTexCoord1i');
+ if not Assigned(glMultiTexCoord1i) then Exit;
+ @glMultiTexCoord1iv := SDL_GL_GetProcAddress('glMultiTexCoord1iv');
+ if not Assigned(glMultiTexCoord1iv) then Exit;
+ @glMultiTexCoord1s := SDL_GL_GetProcAddress('glMultiTexCoord1s');
+ if not Assigned(glMultiTexCoord1s) then Exit;
+ @glMultiTexCoord1sv := SDL_GL_GetProcAddress('glMultiTexCoord1sv');
+ if not Assigned(glMultiTexCoord1sv) then Exit;
+ @glMultiTexCoord2d := SDL_GL_GetProcAddress('glMultiTexCoord2d');
+ if not Assigned(glMultiTexCoord2d) then Exit;
+ @glMultiTexCoord2dv := SDL_GL_GetProcAddress('glMultiTexCoord2dv');
+ if not Assigned(glMultiTexCoord2dv) then Exit;
+ @glMultiTexCoord2f := SDL_GL_GetProcAddress('glMultiTexCoord2f');
+ if not Assigned(glMultiTexCoord2f) then Exit;
+ @glMultiTexCoord2fv := SDL_GL_GetProcAddress('glMultiTexCoord2fv');
+ if not Assigned(glMultiTexCoord2fv) then Exit;
+ @glMultiTexCoord2i := SDL_GL_GetProcAddress('glMultiTexCoord2i');
+ if not Assigned(glMultiTexCoord2i) then Exit;
+ @glMultiTexCoord2iv := SDL_GL_GetProcAddress('glMultiTexCoord2iv');
+ if not Assigned(glMultiTexCoord2iv) then Exit;
+ @glMultiTexCoord2s := SDL_GL_GetProcAddress('glMultiTexCoord2s');
+ if not Assigned(glMultiTexCoord2s) then Exit;
+ @glMultiTexCoord2sv := SDL_GL_GetProcAddress('glMultiTexCoord2sv');
+ if not Assigned(glMultiTexCoord2sv) then Exit;
+ @glMultiTexCoord3d := SDL_GL_GetProcAddress('glMultiTexCoord3d');
+ if not Assigned(glMultiTexCoord3d) then Exit;
+ @glMultiTexCoord3dv := SDL_GL_GetProcAddress('glMultiTexCoord3dv');
+ if not Assigned(glMultiTexCoord3dv) then Exit;
+ @glMultiTexCoord3f := SDL_GL_GetProcAddress('glMultiTexCoord3f');
+ if not Assigned(glMultiTexCoord3f) then Exit;
+ @glMultiTexCoord3fv := SDL_GL_GetProcAddress('glMultiTexCoord3fv');
+ if not Assigned(glMultiTexCoord3fv) then Exit;
+ @glMultiTexCoord3i := SDL_GL_GetProcAddress('glMultiTexCoord3i');
+ if not Assigned(glMultiTexCoord3i) then Exit;
+ @glMultiTexCoord3iv := SDL_GL_GetProcAddress('glMultiTexCoord3iv');
+ if not Assigned(glMultiTexCoord3iv) then Exit;
+ @glMultiTexCoord3s := SDL_GL_GetProcAddress('glMultiTexCoord3s');
+ if not Assigned(glMultiTexCoord3s) then Exit;
+ @glMultiTexCoord3sv := SDL_GL_GetProcAddress('glMultiTexCoord3sv');
+ if not Assigned(glMultiTexCoord3sv) then Exit;
+ @glMultiTexCoord4d := SDL_GL_GetProcAddress('glMultiTexCoord4d');
+ if not Assigned(glMultiTexCoord4d) then Exit;
+ @glMultiTexCoord4dv := SDL_GL_GetProcAddress('glMultiTexCoord4dv');
+ if not Assigned(glMultiTexCoord4dv) then Exit;
+ @glMultiTexCoord4f := SDL_GL_GetProcAddress('glMultiTexCoord4f');
+ if not Assigned(glMultiTexCoord4f) then Exit;
+ @glMultiTexCoord4fv := SDL_GL_GetProcAddress('glMultiTexCoord4fv');
+ if not Assigned(glMultiTexCoord4fv) then Exit;
+ @glMultiTexCoord4i := SDL_GL_GetProcAddress('glMultiTexCoord4i');
+ if not Assigned(glMultiTexCoord4i) then Exit;
+ @glMultiTexCoord4iv := SDL_GL_GetProcAddress('glMultiTexCoord4iv');
+ if not Assigned(glMultiTexCoord4iv) then Exit;
+ @glMultiTexCoord4s := SDL_GL_GetProcAddress('glMultiTexCoord4s');
+ if not Assigned(glMultiTexCoord4s) then Exit;
+ @glMultiTexCoord4sv := SDL_GL_GetProcAddress('glMultiTexCoord4sv');
+ if not Assigned(glMultiTexCoord4sv) then Exit;
+ @glLoadTransposeMatrixf := SDL_GL_GetProcAddress('glLoadTransposeMatrixf');
+ if not Assigned(glLoadTransposeMatrixf) then Exit;
+ @glLoadTransposeMatrixd := SDL_GL_GetProcAddress('glLoadTransposeMatrixd');
+ if not Assigned(glLoadTransposeMatrixd) then Exit;
+ @glMultTransposeMatrixf := SDL_GL_GetProcAddress('glMultTransposeMatrixf');
+ if not Assigned(glMultTransposeMatrixf) then Exit;
+ @glMultTransposeMatrixd := SDL_GL_GetProcAddress('glMultTransposeMatrixd');
+ if not Assigned(glMultTransposeMatrixd) then Exit;
+ @glSampleCoverage := SDL_GL_GetProcAddress('glSampleCoverage');
+ if not Assigned(glSampleCoverage) then Exit;
+ @glCompressedTexImage3D := SDL_GL_GetProcAddress('glCompressedTexImage3D');
+ if not Assigned(glCompressedTexImage3D) then Exit;
+ @glCompressedTexImage2D := SDL_GL_GetProcAddress('glCompressedTexImage2D');
+ if not Assigned(glCompressedTexImage2D) then Exit;
+ @glCompressedTexImage1D := SDL_GL_GetProcAddress('glCompressedTexImage1D');
+ if not Assigned(glCompressedTexImage1D) then Exit;
+ @glCompressedTexSubImage3D := SDL_GL_GetProcAddress('glCompressedTexSubImage3D');
+ if not Assigned(glCompressedTexSubImage3D) then Exit;
+ @glCompressedTexSubImage2D := SDL_GL_GetProcAddress('glCompressedTexSubImage2D');
+ if not Assigned(glCompressedTexSubImage2D) then Exit;
+ @glCompressedTexSubImage1D := SDL_GL_GetProcAddress('glCompressedTexSubImage1D');
+ if not Assigned(glCompressedTexSubImage1D) then Exit;
+ @glGetCompressedTexImage := SDL_GL_GetProcAddress('glGetCompressedTexImage');
+ if not Assigned(glGetCompressedTexImage) then Exit;
+ Result := TRUE;
+
+end;
+
+function Load_GL_ARB_multitexture: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_multitexture', extstring) then
+ begin
+ @glActiveTextureARB := SDL_GL_GetProcAddress('glActiveTextureARB');
+ if not Assigned(glActiveTextureARB) then Exit;
+ @glClientActiveTextureARB := SDL_GL_GetProcAddress('glClientActiveTextureARB');
+ if not Assigned(glClientActiveTextureARB) then Exit;
+ @glMultiTexCoord1dARB := SDL_GL_GetProcAddress('glMultiTexCoord1dARB');
+ if not Assigned(glMultiTexCoord1dARB) then Exit;
+ @glMultiTexCoord1dvARB := SDL_GL_GetProcAddress('glMultiTexCoord1dvARB');
+ if not Assigned(glMultiTexCoord1dvARB) then Exit;
+ @glMultiTexCoord1fARB := SDL_GL_GetProcAddress('glMultiTexCoord1fARB');
+ if not Assigned(glMultiTexCoord1fARB) then Exit;
+ @glMultiTexCoord1fvARB := SDL_GL_GetProcAddress('glMultiTexCoord1fvARB');
+ if not Assigned(glMultiTexCoord1fvARB) then Exit;
+ @glMultiTexCoord1iARB := SDL_GL_GetProcAddress('glMultiTexCoord1iARB');
+ if not Assigned(glMultiTexCoord1iARB) then Exit;
+ @glMultiTexCoord1ivARB := SDL_GL_GetProcAddress('glMultiTexCoord1ivARB');
+ if not Assigned(glMultiTexCoord1ivARB) then Exit;
+ @glMultiTexCoord1sARB := SDL_GL_GetProcAddress('glMultiTexCoord1sARB');
+ if not Assigned(glMultiTexCoord1sARB) then Exit;
+ @glMultiTexCoord1svARB := SDL_GL_GetProcAddress('glMultiTexCoord1svARB');
+ if not Assigned(glMultiTexCoord1svARB) then Exit;
+ @glMultiTexCoord2dARB := SDL_GL_GetProcAddress('glMultiTexCoord2dARB');
+ if not Assigned(glMultiTexCoord2dARB) then Exit;
+ @glMultiTexCoord2dvARB := SDL_GL_GetProcAddress('glMultiTexCoord2dvARB');
+ if not Assigned(glMultiTexCoord2dvARB) then Exit;
+ @glMultiTexCoord2fARB := SDL_GL_GetProcAddress('glMultiTexCoord2fARB');
+ if not Assigned(glMultiTexCoord2fARB) then Exit;
+ @glMultiTexCoord2fvARB := SDL_GL_GetProcAddress('glMultiTexCoord2fvARB');
+ if not Assigned(glMultiTexCoord2fvARB) then Exit;
+ @glMultiTexCoord2iARB := SDL_GL_GetProcAddress('glMultiTexCoord2iARB');
+ if not Assigned(glMultiTexCoord2iARB) then Exit;
+ @glMultiTexCoord2ivARB := SDL_GL_GetProcAddress('glMultiTexCoord2ivARB');
+ if not Assigned(glMultiTexCoord2ivARB) then Exit;
+ @glMultiTexCoord2sARB := SDL_GL_GetProcAddress('glMultiTexCoord2sARB');
+ if not Assigned(glMultiTexCoord2sARB) then Exit;
+ @glMultiTexCoord2svARB := SDL_GL_GetProcAddress('glMultiTexCoord2svARB');
+ if not Assigned(glMultiTexCoord2svARB) then Exit;
+ @glMultiTexCoord3dARB := SDL_GL_GetProcAddress('glMultiTexCoord3dARB');
+ if not Assigned(glMultiTexCoord3dARB) then Exit;
+ @glMultiTexCoord3dvARB := SDL_GL_GetProcAddress('glMultiTexCoord3dvARB');
+ if not Assigned(glMultiTexCoord3dvARB) then Exit;
+ @glMultiTexCoord3fARB := SDL_GL_GetProcAddress('glMultiTexCoord3fARB');
+ if not Assigned(glMultiTexCoord3fARB) then Exit;
+ @glMultiTexCoord3fvARB := SDL_GL_GetProcAddress('glMultiTexCoord3fvARB');
+ if not Assigned(glMultiTexCoord3fvARB) then Exit;
+ @glMultiTexCoord3iARB := SDL_GL_GetProcAddress('glMultiTexCoord3iARB');
+ if not Assigned(glMultiTexCoord3iARB) then Exit;
+ @glMultiTexCoord3ivARB := SDL_GL_GetProcAddress('glMultiTexCoord3ivARB');
+ if not Assigned(glMultiTexCoord3ivARB) then Exit;
+ @glMultiTexCoord3sARB := SDL_GL_GetProcAddress('glMultiTexCoord3sARB');
+ if not Assigned(glMultiTexCoord3sARB) then Exit;
+ @glMultiTexCoord3svARB := SDL_GL_GetProcAddress('glMultiTexCoord3svARB');
+ if not Assigned(glMultiTexCoord3svARB) then Exit;
+ @glMultiTexCoord4dARB := SDL_GL_GetProcAddress('glMultiTexCoord4dARB');
+ if not Assigned(glMultiTexCoord4dARB) then Exit;
+ @glMultiTexCoord4dvARB := SDL_GL_GetProcAddress('glMultiTexCoord4dvARB');
+ if not Assigned(glMultiTexCoord4dvARB) then Exit;
+ @glMultiTexCoord4fARB := SDL_GL_GetProcAddress('glMultiTexCoord4fARB');
+ if not Assigned(glMultiTexCoord4fARB) then Exit;
+ @glMultiTexCoord4fvARB := SDL_GL_GetProcAddress('glMultiTexCoord4fvARB');
+ if not Assigned(glMultiTexCoord4fvARB) then Exit;
+ @glMultiTexCoord4iARB := SDL_GL_GetProcAddress('glMultiTexCoord4iARB');
+ if not Assigned(glMultiTexCoord4iARB) then Exit;
+ @glMultiTexCoord4ivARB := SDL_GL_GetProcAddress('glMultiTexCoord4ivARB');
+ if not Assigned(glMultiTexCoord4ivARB) then Exit;
+ @glMultiTexCoord4sARB := SDL_GL_GetProcAddress('glMultiTexCoord4sARB');
+ if not Assigned(glMultiTexCoord4sARB) then Exit;
+ @glMultiTexCoord4svARB := SDL_GL_GetProcAddress('glMultiTexCoord4svARB');
+ if not Assigned(glMultiTexCoord4svARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_transpose_matrix: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_transpose_matrix', extstring) then
+ begin
+ @glLoadTransposeMatrixfARB := SDL_GL_GetProcAddress('glLoadTransposeMatrixfARB');
+ if not Assigned(glLoadTransposeMatrixfARB) then Exit;
+ @glLoadTransposeMatrixdARB := SDL_GL_GetProcAddress('glLoadTransposeMatrixdARB');
+ if not Assigned(glLoadTransposeMatrixdARB) then Exit;
+ @glMultTransposeMatrixfARB := SDL_GL_GetProcAddress('glMultTransposeMatrixfARB');
+ if not Assigned(glMultTransposeMatrixfARB) then Exit;
+ @glMultTransposeMatrixdARB := SDL_GL_GetProcAddress('glMultTransposeMatrixdARB');
+ if not Assigned(glMultTransposeMatrixdARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_multisample: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_multisample', extstring) then
+ begin
+ @glSampleCoverageARB := SDL_GL_GetProcAddress('glSampleCoverageARB');
+ if not Assigned(glSampleCoverageARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_texture_env_add: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_texture_env_add', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+{$IFDEF WINDOWS}
+function Load_WGL_ARB_extensions_string: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ @wglGetExtensionsStringARB := SDL_GL_GetProcAddress('wglGetExtensionsStringARB');
+ if not Assigned(wglGetExtensionsStringARB) then Exit;
+ extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+ if glext_ExtensionSupported('WGL_ARB_extensions_string', extstring) then
+ begin
+ @wglGetExtensionsStringARB := SDL_GL_GetProcAddress('wglGetExtensionsStringARB');
+ if not Assigned(wglGetExtensionsStringARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_WGL_ARB_buffer_region: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ @wglGetExtensionsStringARB := SDL_GL_GetProcAddress('wglGetExtensionsStringARB');
+ if not Assigned(wglGetExtensionsStringARB) then Exit;
+ extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+ if glext_ExtensionSupported('WGL_ARB_buffer_region', extstring) then
+ begin
+ @wglCreateBufferRegionARB := SDL_GL_GetProcAddress('wglCreateBufferRegionARB');
+ if not Assigned(wglCreateBufferRegionARB) then Exit;
+ @wglDeleteBufferRegionARB := SDL_GL_GetProcAddress('wglDeleteBufferRegionARB');
+ if not Assigned(wglDeleteBufferRegionARB) then Exit;
+ @wglSaveBufferRegionARB := SDL_GL_GetProcAddress('wglSaveBufferRegionARB');
+ if not Assigned(wglSaveBufferRegionARB) then Exit;
+ @wglRestoreBufferRegionARB := SDL_GL_GetProcAddress('wglRestoreBufferRegionARB');
+ if not Assigned(wglRestoreBufferRegionARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+{$ENDIF}
+
+function Load_GL_ARB_texture_cube_map: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_texture_cube_map', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_depth_texture: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_depth_texture', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_point_parameters: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_point_parameters', extstring) then
+ begin
+ @glPointParameterfARB := SDL_GL_GetProcAddress('glPointParameterfARB');
+ if not Assigned(glPointParameterfARB) then Exit;
+ @glPointParameterfvARB := SDL_GL_GetProcAddress('glPointParameterfvARB');
+ if not Assigned(glPointParameterfvARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_shadow: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_shadow', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_shadow_ambient: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_shadow_ambient', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_texture_border_clamp: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_texture_border_clamp', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_texture_compression: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_texture_compression', extstring) then
+ begin
+ @glCompressedTexImage3DARB := SDL_GL_GetProcAddress('glCompressedTexImage3DARB');
+ if not Assigned(glCompressedTexImage3DARB) then Exit;
+ @glCompressedTexImage2DARB := SDL_GL_GetProcAddress('glCompressedTexImage2DARB');
+ if not Assigned(glCompressedTexImage2DARB) then Exit;
+ @glCompressedTexImage1DARB := SDL_GL_GetProcAddress('glCompressedTexImage1DARB');
+ if not Assigned(glCompressedTexImage1DARB) then Exit;
+ @glCompressedTexSubImage3DARB := SDL_GL_GetProcAddress('glCompressedTexSubImage3DARB');
+ if not Assigned(glCompressedTexSubImage3DARB) then Exit;
+ @glCompressedTexSubImage2DARB := SDL_GL_GetProcAddress('glCompressedTexSubImage2DARB');
+ if not Assigned(glCompressedTexSubImage2DARB) then Exit;
+ @glCompressedTexSubImage1DARB := SDL_GL_GetProcAddress('glCompressedTexSubImage1DARB');
+ if not Assigned(glCompressedTexSubImage1DARB) then Exit;
+ @glGetCompressedTexImageARB := SDL_GL_GetProcAddress('glGetCompressedTexImageARB');
+ if not Assigned(glGetCompressedTexImageARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_texture_env_combine: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_texture_env_combine', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_texture_env_crossbar: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_texture_env_crossbar', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_texture_env_dot3: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_texture_env_dot3', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_texture_mirrored_repeat: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_texture_mirrored_repeat', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_vertex_blend: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_vertex_blend', extstring) then
+ begin
+ @glWeightbvARB := SDL_GL_GetProcAddress('glWeightbvARB');
+ if not Assigned(glWeightbvARB) then Exit;
+ @glWeightsvARB := SDL_GL_GetProcAddress('glWeightsvARB');
+ if not Assigned(glWeightsvARB) then Exit;
+ @glWeightivARB := SDL_GL_GetProcAddress('glWeightivARB');
+ if not Assigned(glWeightivARB) then Exit;
+ @glWeightfvARB := SDL_GL_GetProcAddress('glWeightfvARB');
+ if not Assigned(glWeightfvARB) then Exit;
+ @glWeightdvARB := SDL_GL_GetProcAddress('glWeightdvARB');
+ if not Assigned(glWeightdvARB) then Exit;
+ @glWeightvARB := SDL_GL_GetProcAddress('glWeightvARB');
+ if not Assigned(glWeightvARB) then Exit;
+ @glWeightubvARB := SDL_GL_GetProcAddress('glWeightubvARB');
+ if not Assigned(glWeightubvARB) then Exit;
+ @glWeightusvARB := SDL_GL_GetProcAddress('glWeightusvARB');
+ if not Assigned(glWeightusvARB) then Exit;
+ @glWeightuivARB := SDL_GL_GetProcAddress('glWeightuivARB');
+ if not Assigned(glWeightuivARB) then Exit;
+ @glWeightPointerARB := SDL_GL_GetProcAddress('glWeightPointerARB');
+ if not Assigned(glWeightPointerARB) then Exit;
+ @glVertexBlendARB := SDL_GL_GetProcAddress('glVertexBlendARB');
+ if not Assigned(glVertexBlendARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_vertex_program: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_vertex_program', extstring) then
+ begin
+ @glVertexAttrib1sARB := SDL_GL_GetProcAddress('glVertexAttrib1sARB');
+ if not Assigned(glVertexAttrib1sARB) then Exit;
+ @glVertexAttrib1fARB := SDL_GL_GetProcAddress('glVertexAttrib1fARB');
+ if not Assigned(glVertexAttrib1fARB) then Exit;
+ @glVertexAttrib1dARB := SDL_GL_GetProcAddress('glVertexAttrib1dARB');
+ if not Assigned(glVertexAttrib1dARB) then Exit;
+ @glVertexAttrib2sARB := SDL_GL_GetProcAddress('glVertexAttrib2sARB');
+ if not Assigned(glVertexAttrib2sARB) then Exit;
+ @glVertexAttrib2fARB := SDL_GL_GetProcAddress('glVertexAttrib2fARB');
+ if not Assigned(glVertexAttrib2fARB) then Exit;
+ @glVertexAttrib2dARB := SDL_GL_GetProcAddress('glVertexAttrib2dARB');
+ if not Assigned(glVertexAttrib2dARB) then Exit;
+ @glVertexAttrib3sARB := SDL_GL_GetProcAddress('glVertexAttrib3sARB');
+ if not Assigned(glVertexAttrib3sARB) then Exit;
+ @glVertexAttrib3fARB := SDL_GL_GetProcAddress('glVertexAttrib3fARB');
+ if not Assigned(glVertexAttrib3fARB) then Exit;
+ @glVertexAttrib3dARB := SDL_GL_GetProcAddress('glVertexAttrib3dARB');
+ if not Assigned(glVertexAttrib3dARB) then Exit;
+ @glVertexAttrib4sARB := SDL_GL_GetProcAddress('glVertexAttrib4sARB');
+ if not Assigned(glVertexAttrib4sARB) then Exit;
+ @glVertexAttrib4fARB := SDL_GL_GetProcAddress('glVertexAttrib4fARB');
+ if not Assigned(glVertexAttrib4fARB) then Exit;
+ @glVertexAttrib4dARB := SDL_GL_GetProcAddress('glVertexAttrib4dARB');
+ if not Assigned(glVertexAttrib4dARB) then Exit;
+ @glVertexAttrib4NubARB := SDL_GL_GetProcAddress('glVertexAttrib4NubARB');
+ if not Assigned(glVertexAttrib4NubARB) then Exit;
+ @glVertexAttrib1svARB := SDL_GL_GetProcAddress('glVertexAttrib1svARB');
+ if not Assigned(glVertexAttrib1svARB) then Exit;
+ @glVertexAttrib1fvARB := SDL_GL_GetProcAddress('glVertexAttrib1fvARB');
+ if not Assigned(glVertexAttrib1fvARB) then Exit;
+ @glVertexAttrib1dvARB := SDL_GL_GetProcAddress('glVertexAttrib1dvARB');
+ if not Assigned(glVertexAttrib1dvARB) then Exit;
+ @glVertexAttrib2svARB := SDL_GL_GetProcAddress('glVertexAttrib2svARB');
+ if not Assigned(glVertexAttrib2svARB) then Exit;
+ @glVertexAttrib2fvARB := SDL_GL_GetProcAddress('glVertexAttrib2fvARB');
+ if not Assigned(glVertexAttrib2fvARB) then Exit;
+ @glVertexAttrib2dvARB := SDL_GL_GetProcAddress('glVertexAttrib2dvARB');
+ if not Assigned(glVertexAttrib2dvARB) then Exit;
+ @glVertexAttrib3svARB := SDL_GL_GetProcAddress('glVertexAttrib3svARB');
+ if not Assigned(glVertexAttrib3svARB) then Exit;
+ @glVertexAttrib3fvARB := SDL_GL_GetProcAddress('glVertexAttrib3fvARB');
+ if not Assigned(glVertexAttrib3fvARB) then Exit;
+ @glVertexAttrib3dvARB := SDL_GL_GetProcAddress('glVertexAttrib3dvARB');
+ if not Assigned(glVertexAttrib3dvARB) then Exit;
+ @glVertexAttrib4bvARB := SDL_GL_GetProcAddress('glVertexAttrib4bvARB');
+ if not Assigned(glVertexAttrib4bvARB) then Exit;
+ @glVertexAttrib4svARB := SDL_GL_GetProcAddress('glVertexAttrib4svARB');
+ if not Assigned(glVertexAttrib4svARB) then Exit;
+ @glVertexAttrib4ivARB := SDL_GL_GetProcAddress('glVertexAttrib4ivARB');
+ if not Assigned(glVertexAttrib4ivARB) then Exit;
+ @glVertexAttrib4ubvARB := SDL_GL_GetProcAddress('glVertexAttrib4ubvARB');
+ if not Assigned(glVertexAttrib4ubvARB) then Exit;
+ @glVertexAttrib4usvARB := SDL_GL_GetProcAddress('glVertexAttrib4usvARB');
+ if not Assigned(glVertexAttrib4usvARB) then Exit;
+ @glVertexAttrib4uivARB := SDL_GL_GetProcAddress('glVertexAttrib4uivARB');
+ if not Assigned(glVertexAttrib4uivARB) then Exit;
+ @glVertexAttrib4fvARB := SDL_GL_GetProcAddress('glVertexAttrib4fvARB');
+ if not Assigned(glVertexAttrib4fvARB) then Exit;
+ @glVertexAttrib4dvARB := SDL_GL_GetProcAddress('glVertexAttrib4dvARB');
+ if not Assigned(glVertexAttrib4dvARB) then Exit;
+ @glVertexAttrib4NbvARB := SDL_GL_GetProcAddress('glVertexAttrib4NbvARB');
+ if not Assigned(glVertexAttrib4NbvARB) then Exit;
+ @glVertexAttrib4NsvARB := SDL_GL_GetProcAddress('glVertexAttrib4NsvARB');
+ if not Assigned(glVertexAttrib4NsvARB) then Exit;
+ @glVertexAttrib4NivARB := SDL_GL_GetProcAddress('glVertexAttrib4NivARB');
+ if not Assigned(glVertexAttrib4NivARB) then Exit;
+ @glVertexAttrib4NubvARB := SDL_GL_GetProcAddress('glVertexAttrib4NubvARB');
+ if not Assigned(glVertexAttrib4NubvARB) then Exit;
+ @glVertexAttrib4NusvARB := SDL_GL_GetProcAddress('glVertexAttrib4NusvARB');
+ if not Assigned(glVertexAttrib4NusvARB) then Exit;
+ @glVertexAttrib4NuivARB := SDL_GL_GetProcAddress('glVertexAttrib4NuivARB');
+ if not Assigned(glVertexAttrib4NuivARB) then Exit;
+ @glVertexAttribPointerARB := SDL_GL_GetProcAddress('glVertexAttribPointerARB');
+ if not Assigned(glVertexAttribPointerARB) then Exit;
+ @glEnableVertexAttribArrayARB := SDL_GL_GetProcAddress('glEnableVertexAttribArrayARB');
+ if not Assigned(glEnableVertexAttribArrayARB) then Exit;
+ @glDisableVertexAttribArrayARB := SDL_GL_GetProcAddress('glDisableVertexAttribArrayARB');
+ if not Assigned(glDisableVertexAttribArrayARB) then Exit;
+ @glProgramStringARB := SDL_GL_GetProcAddress('glProgramStringARB');
+ if not Assigned(glProgramStringARB) then Exit;
+ @glBindProgramARB := SDL_GL_GetProcAddress('glBindProgramARB');
+ if not Assigned(glBindProgramARB) then Exit;
+ @glDeleteProgramsARB := SDL_GL_GetProcAddress('glDeleteProgramsARB');
+ if not Assigned(glDeleteProgramsARB) then Exit;
+ @glGenProgramsARB := SDL_GL_GetProcAddress('glGenProgramsARB');
+ if not Assigned(glGenProgramsARB) then Exit;
+ @glProgramEnvParameter4dARB := SDL_GL_GetProcAddress('glProgramEnvParameter4dARB');
+ if not Assigned(glProgramEnvParameter4dARB) then Exit;
+ @glProgramEnvParameter4dvARB := SDL_GL_GetProcAddress('glProgramEnvParameter4dvARB');
+ if not Assigned(glProgramEnvParameter4dvARB) then Exit;
+ @glProgramEnvParameter4fARB := SDL_GL_GetProcAddress('glProgramEnvParameter4fARB');
+ if not Assigned(glProgramEnvParameter4fARB) then Exit;
+ @glProgramEnvParameter4fvARB := SDL_GL_GetProcAddress('glProgramEnvParameter4fvARB');
+ if not Assigned(glProgramEnvParameter4fvARB) then Exit;
+ @glProgramLocalParameter4dARB := SDL_GL_GetProcAddress('glProgramLocalParameter4dARB');
+ if not Assigned(glProgramLocalParameter4dARB) then Exit;
+ @glProgramLocalParameter4dvARB := SDL_GL_GetProcAddress('glProgramLocalParameter4dvARB');
+ if not Assigned(glProgramLocalParameter4dvARB) then Exit;
+ @glProgramLocalParameter4fARB := SDL_GL_GetProcAddress('glProgramLocalParameter4fARB');
+ if not Assigned(glProgramLocalParameter4fARB) then Exit;
+ @glProgramLocalParameter4fvARB := SDL_GL_GetProcAddress('glProgramLocalParameter4fvARB');
+ if not Assigned(glProgramLocalParameter4fvARB) then Exit;
+ @glGetProgramEnvParameterdvARB := SDL_GL_GetProcAddress('glGetProgramEnvParameterdvARB');
+ if not Assigned(glGetProgramEnvParameterdvARB) then Exit;
+ @glGetProgramEnvParameterfvARB := SDL_GL_GetProcAddress('glGetProgramEnvParameterfvARB');
+ if not Assigned(glGetProgramEnvParameterfvARB) then Exit;
+ @glGetProgramLocalParameterdvARB := SDL_GL_GetProcAddress('glGetProgramLocalParameterdvARB');
+ if not Assigned(glGetProgramLocalParameterdvARB) then Exit;
+ @glGetProgramLocalParameterfvARB := SDL_GL_GetProcAddress('glGetProgramLocalParameterfvARB');
+ if not Assigned(glGetProgramLocalParameterfvARB) then Exit;
+ @glGetProgramivARB := SDL_GL_GetProcAddress('glGetProgramivARB');
+ if not Assigned(glGetProgramivARB) then Exit;
+ @glGetProgramStringARB := SDL_GL_GetProcAddress('glGetProgramStringARB');
+ if not Assigned(glGetProgramStringARB) then Exit;
+ @glGetVertexAttribdvARB := SDL_GL_GetProcAddress('glGetVertexAttribdvARB');
+ if not Assigned(glGetVertexAttribdvARB) then Exit;
+ @glGetVertexAttribfvARB := SDL_GL_GetProcAddress('glGetVertexAttribfvARB');
+ if not Assigned(glGetVertexAttribfvARB) then Exit;
+ @glGetVertexAttribivARB := SDL_GL_GetProcAddress('glGetVertexAttribivARB');
+ if not Assigned(glGetVertexAttribivARB) then Exit;
+ @glGetVertexAttribPointervARB := SDL_GL_GetProcAddress('glGetVertexAttribPointervARB');
+ if not Assigned(glGetVertexAttribPointervARB) then Exit;
+ @glIsProgramARB := SDL_GL_GetProcAddress('glIsProgramARB');
+ if not Assigned(glIsProgramARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_window_pos: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_window_pos', extstring) then
+ begin
+ @glWindowPos2dARB := SDL_GL_GetProcAddress('glWindowPos2dARB');
+ if not Assigned(glWindowPos2dARB) then Exit;
+ @glWindowPos2fARB := SDL_GL_GetProcAddress('glWindowPos2fARB');
+ if not Assigned(glWindowPos2fARB) then Exit;
+ @glWindowPos2iARB := SDL_GL_GetProcAddress('glWindowPos2iARB');
+ if not Assigned(glWindowPos2iARB) then Exit;
+ @glWindowPos2sARB := SDL_GL_GetProcAddress('glWindowPos2sARB');
+ if not Assigned(glWindowPos2sARB) then Exit;
+ @glWindowPos2dvARB := SDL_GL_GetProcAddress('glWindowPos2dvARB');
+ if not Assigned(glWindowPos2dvARB) then Exit;
+ @glWindowPos2fvARB := SDL_GL_GetProcAddress('glWindowPos2fvARB');
+ if not Assigned(glWindowPos2fvARB) then Exit;
+ @glWindowPos2ivARB := SDL_GL_GetProcAddress('glWindowPos2ivARB');
+ if not Assigned(glWindowPos2ivARB) then Exit;
+ @glWindowPos2svARB := SDL_GL_GetProcAddress('glWindowPos2svARB');
+ if not Assigned(glWindowPos2svARB) then Exit;
+ @glWindowPos3dARB := SDL_GL_GetProcAddress('glWindowPos3dARB');
+ if not Assigned(glWindowPos3dARB) then Exit;
+ @glWindowPos3fARB := SDL_GL_GetProcAddress('glWindowPos3fARB');
+ if not Assigned(glWindowPos3fARB) then Exit;
+ @glWindowPos3iARB := SDL_GL_GetProcAddress('glWindowPos3iARB');
+ if not Assigned(glWindowPos3iARB) then Exit;
+ @glWindowPos3sARB := SDL_GL_GetProcAddress('glWindowPos3sARB');
+ if not Assigned(glWindowPos3sARB) then Exit;
+ @glWindowPos3dvARB := SDL_GL_GetProcAddress('glWindowPos3dvARB');
+ if not Assigned(glWindowPos3dvARB) then Exit;
+ @glWindowPos3fvARB := SDL_GL_GetProcAddress('glWindowPos3fvARB');
+ if not Assigned(glWindowPos3fvARB) then Exit;
+ @glWindowPos3ivARB := SDL_GL_GetProcAddress('glWindowPos3ivARB');
+ if not Assigned(glWindowPos3ivARB) then Exit;
+ @glWindowPos3svARB := SDL_GL_GetProcAddress('glWindowPos3svARB');
+ if not Assigned(glWindowPos3svARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_422_pixels: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_422_pixels', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_abgr: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_abgr', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_bgra: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_bgra', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_blend_color: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_blend_color', extstring) then
+ begin
+ @glBlendColorEXT := SDL_GL_GetProcAddress('glBlendColorEXT');
+ if not Assigned(glBlendColorEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_blend_func_separate: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_blend_func_separate', extstring) then
+ begin
+ @glBlendFuncSeparateEXT := SDL_GL_GetProcAddress('glBlendFuncSeparateEXT');
+ if not Assigned(glBlendFuncSeparateEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_blend_logic_op: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_blend_logic_op', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_blend_minmax: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_blend_minmax', extstring) then
+ begin
+ @glBlendEquationEXT := SDL_GL_GetProcAddress('glBlendEquationEXT');
+ if not Assigned(glBlendEquationEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_blend_subtract: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_blend_subtract', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_clip_volume_hint: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_clip_volume_hint', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_color_subtable: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_color_subtable', extstring) then
+ begin
+ @glColorSubTableEXT := SDL_GL_GetProcAddress('glColorSubTableEXT');
+ if not Assigned(glColorSubTableEXT) then Exit;
+ @glCopyColorSubTableEXT := SDL_GL_GetProcAddress('glCopyColorSubTableEXT');
+ if not Assigned(glCopyColorSubTableEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_compiled_vertex_array: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_compiled_vertex_array', extstring) then
+ begin
+ @glLockArraysEXT := SDL_GL_GetProcAddress('glLockArraysEXT');
+ if not Assigned(glLockArraysEXT) then Exit;
+ @glUnlockArraysEXT := SDL_GL_GetProcAddress('glUnlockArraysEXT');
+ if not Assigned(glUnlockArraysEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_convolution: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_convolution', extstring) then
+ begin
+ @glConvolutionFilter1DEXT := SDL_GL_GetProcAddress('glConvolutionFilter1DEXT');
+ if not Assigned(glConvolutionFilter1DEXT) then Exit;
+ @glConvolutionFilter2DEXT := SDL_GL_GetProcAddress('glConvolutionFilter2DEXT');
+ if not Assigned(glConvolutionFilter2DEXT) then Exit;
+ @glCopyConvolutionFilter1DEXT := SDL_GL_GetProcAddress('glCopyConvolutionFilter1DEXT');
+ if not Assigned(glCopyConvolutionFilter1DEXT) then Exit;
+ @glCopyConvolutionFilter2DEXT := SDL_GL_GetProcAddress('glCopyConvolutionFilter2DEXT');
+ if not Assigned(glCopyConvolutionFilter2DEXT) then Exit;
+ @glGetConvolutionFilterEXT := SDL_GL_GetProcAddress('glGetConvolutionFilterEXT');
+ if not Assigned(glGetConvolutionFilterEXT) then Exit;
+ @glSeparableFilter2DEXT := SDL_GL_GetProcAddress('glSeparableFilter2DEXT');
+ if not Assigned(glSeparableFilter2DEXT) then Exit;
+ @glGetSeparableFilterEXT := SDL_GL_GetProcAddress('glGetSeparableFilterEXT');
+ if not Assigned(glGetSeparableFilterEXT) then Exit;
+ @glConvolutionParameteriEXT := SDL_GL_GetProcAddress('glConvolutionParameteriEXT');
+ if not Assigned(glConvolutionParameteriEXT) then Exit;
+ @glConvolutionParameterivEXT := SDL_GL_GetProcAddress('glConvolutionParameterivEXT');
+ if not Assigned(glConvolutionParameterivEXT) then Exit;
+ @glConvolutionParameterfEXT := SDL_GL_GetProcAddress('glConvolutionParameterfEXT');
+ if not Assigned(glConvolutionParameterfEXT) then Exit;
+ @glConvolutionParameterfvEXT := SDL_GL_GetProcAddress('glConvolutionParameterfvEXT');
+ if not Assigned(glConvolutionParameterfvEXT) then Exit;
+ @glGetConvolutionParameterivEXT := SDL_GL_GetProcAddress('glGetConvolutionParameterivEXT');
+ if not Assigned(glGetConvolutionParameterivEXT) then Exit;
+ @glGetConvolutionParameterfvEXT := SDL_GL_GetProcAddress('glGetConvolutionParameterfvEXT');
+ if not Assigned(glGetConvolutionParameterfvEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_histogram: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_histogram', extstring) then
+ begin
+ @glHistogramEXT := SDL_GL_GetProcAddress('glHistogramEXT');
+ if not Assigned(glHistogramEXT) then Exit;
+ @glResetHistogramEXT := SDL_GL_GetProcAddress('glResetHistogramEXT');
+ if not Assigned(glResetHistogramEXT) then Exit;
+ @glGetHistogramEXT := SDL_GL_GetProcAddress('glGetHistogramEXT');
+ if not Assigned(glGetHistogramEXT) then Exit;
+ @glGetHistogramParameterivEXT := SDL_GL_GetProcAddress('glGetHistogramParameterivEXT');
+ if not Assigned(glGetHistogramParameterivEXT) then Exit;
+ @glGetHistogramParameterfvEXT := SDL_GL_GetProcAddress('glGetHistogramParameterfvEXT');
+ if not Assigned(glGetHistogramParameterfvEXT) then Exit;
+ @glMinmaxEXT := SDL_GL_GetProcAddress('glMinmaxEXT');
+ if not Assigned(glMinmaxEXT) then Exit;
+ @glResetMinmaxEXT := SDL_GL_GetProcAddress('glResetMinmaxEXT');
+ if not Assigned(glResetMinmaxEXT) then Exit;
+ @glGetMinmaxEXT := SDL_GL_GetProcAddress('glGetMinmaxEXT');
+ if not Assigned(glGetMinmaxEXT) then Exit;
+ @glGetMinmaxParameterivEXT := SDL_GL_GetProcAddress('glGetMinmaxParameterivEXT');
+ if not Assigned(glGetMinmaxParameterivEXT) then Exit;
+ @glGetMinmaxParameterfvEXT := SDL_GL_GetProcAddress('glGetMinmaxParameterfvEXT');
+ if not Assigned(glGetMinmaxParameterfvEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_multi_draw_arrays: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_multi_draw_arrays', extstring) then
+ begin
+ @glMultiDrawArraysEXT := SDL_GL_GetProcAddress('glMultiDrawArraysEXT');
+ if not Assigned(glMultiDrawArraysEXT) then Exit;
+ @glMultiDrawElementsEXT := SDL_GL_GetProcAddress('glMultiDrawElementsEXT');
+ if not Assigned(glMultiDrawElementsEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_packed_pixels: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_packed_pixels', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_paletted_texture: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_paletted_texture', extstring) then
+ begin
+ @glColorTableEXT := SDL_GL_GetProcAddress('glColorTableEXT');
+ if not Assigned(glColorTableEXT) then Exit;
+ @glColorSubTableEXT := SDL_GL_GetProcAddress('glColorSubTableEXT');
+ if not Assigned(glColorSubTableEXT) then Exit;
+ @glGetColorTableEXT := SDL_GL_GetProcAddress('glGetColorTableEXT');
+ if not Assigned(glGetColorTableEXT) then Exit;
+ @glGetColorTableParameterivEXT := SDL_GL_GetProcAddress('glGetColorTableParameterivEXT');
+ if not Assigned(glGetColorTableParameterivEXT) then Exit;
+ @glGetColorTableParameterfvEXT := SDL_GL_GetProcAddress('glGetColorTableParameterfvEXT');
+ if not Assigned(glGetColorTableParameterfvEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_point_parameters: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_point_parameters', extstring) then
+ begin
+ @glPointParameterfEXT := SDL_GL_GetProcAddress('glPointParameterfEXT');
+ if not Assigned(glPointParameterfEXT) then Exit;
+ @glPointParameterfvEXT := SDL_GL_GetProcAddress('glPointParameterfvEXT');
+ if not Assigned(glPointParameterfvEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_polygon_offset: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_polygon_offset', extstring) then
+ begin
+ @glPolygonOffsetEXT := SDL_GL_GetProcAddress('glPolygonOffsetEXT');
+ if not Assigned(glPolygonOffsetEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_separate_specular_color: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_separate_specular_color', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_shadow_funcs: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_shadow_funcs', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_shared_texture_palette: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_shared_texture_palette', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_stencil_two_side: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_stencil_two_side', extstring) then
+ begin
+ @glActiveStencilFaceEXT := SDL_GL_GetProcAddress('glActiveStencilFaceEXT');
+ if not Assigned(glActiveStencilFaceEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_stencil_wrap: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_stencil_wrap', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_subtexture: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_subtexture', extstring) then
+ begin
+ @glTexSubImage1DEXT := SDL_GL_GetProcAddress('glTexSubImage1DEXT');
+ if not Assigned(glTexSubImage1DEXT) then Exit;
+ @glTexSubImage2DEXT := SDL_GL_GetProcAddress('glTexSubImage2DEXT');
+ if not Assigned(glTexSubImage2DEXT) then Exit;
+ @glTexSubImage3DEXT := SDL_GL_GetProcAddress('glTexSubImage3DEXT');
+ if not Assigned(glTexSubImage3DEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_texture3D: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_texture3D', extstring) then
+ begin
+ glTexImage3DEXT := SDL_GL_GetProcAddress('glTexImage3DEXT');
+ if not Assigned(glTexImage3DEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_texture_compression_s3tc: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_texture_compression_s3tc', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_texture_env_add: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_texture_env_add', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_texture_env_combine: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_texture_env_combine', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_texture_env_dot3: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_texture_env_dot3', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_texture_filter_anisotropic: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_texture_filter_anisotropic', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_texture_lod_bias: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_texture_lod_bias', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_texture_object: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_texture_object', extstring) then
+ begin
+ @glGenTexturesEXT := SDL_GL_GetProcAddress('glGenTexturesEXT');
+ if not Assigned(glGenTexturesEXT) then Exit;
+ @glDeleteTexturesEXT := SDL_GL_GetProcAddress('glDeleteTexturesEXT');
+ if not Assigned(glDeleteTexturesEXT) then Exit;
+ @glBindTextureEXT := SDL_GL_GetProcAddress('glBindTextureEXT');
+ if not Assigned(glBindTextureEXT) then Exit;
+ @glPrioritizeTexturesEXT := SDL_GL_GetProcAddress('glPrioritizeTexturesEXT');
+ if not Assigned(glPrioritizeTexturesEXT) then Exit;
+ @glAreTexturesResidentEXT := SDL_GL_GetProcAddress('glAreTexturesResidentEXT');
+ if not Assigned(glAreTexturesResidentEXT) then Exit;
+ @glIsTextureEXT := SDL_GL_GetProcAddress('glIsTextureEXT');
+ if not Assigned(glIsTextureEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_vertex_array: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_vertex_array', extstring) then
+ begin
+ @glArrayElementEXT := SDL_GL_GetProcAddress('glArrayElementEXT');
+ if not Assigned(glArrayElementEXT) then Exit;
+ @glDrawArraysEXT := SDL_GL_GetProcAddress('glDrawArraysEXT');
+ if not Assigned(glDrawArraysEXT) then Exit;
+ @glVertexPointerEXT := SDL_GL_GetProcAddress('glVertexPointerEXT');
+ if not Assigned(glVertexPointerEXT) then Exit;
+ @glNormalPointerEXT := SDL_GL_GetProcAddress('glNormalPointerEXT');
+ if not Assigned(glNormalPointerEXT) then Exit;
+ @glColorPointerEXT := SDL_GL_GetProcAddress('glColorPointerEXT');
+ if not Assigned(glColorPointerEXT) then Exit;
+ @glIndexPointerEXT := SDL_GL_GetProcAddress('glIndexPointerEXT');
+ if not Assigned(glIndexPointerEXT) then Exit;
+ @glTexCoordPointerEXT := SDL_GL_GetProcAddress('glTexCoordPointerEXT');
+ if not Assigned(glTexCoordPointerEXT) then Exit;
+ @glEdgeFlagPointerEXT := SDL_GL_GetProcAddress('glEdgeFlagPointerEXT');
+ if not Assigned(glEdgeFlagPointerEXT) then Exit;
+ @glGetPointervEXT := SDL_GL_GetProcAddress('glGetPointervEXT');
+ if not Assigned(glGetPointervEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_vertex_shader: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_vertex_shader', extstring) then
+ begin
+ @glBeginVertexShaderEXT := SDL_GL_GetProcAddress('glBeginVertexShaderEXT');
+ if not Assigned(glBeginVertexShaderEXT) then Exit;
+ @glEndVertexShaderEXT := SDL_GL_GetProcAddress('glEndVertexShaderEXT');
+ if not Assigned(glEndVertexShaderEXT) then Exit;
+ @glBindVertexShaderEXT := SDL_GL_GetProcAddress('glBindVertexShaderEXT');
+ if not Assigned(glBindVertexShaderEXT) then Exit;
+ @glGenVertexShadersEXT := SDL_GL_GetProcAddress('glGenVertexShadersEXT');
+ if not Assigned(glGenVertexShadersEXT) then Exit;
+ @glDeleteVertexShaderEXT := SDL_GL_GetProcAddress('glDeleteVertexShaderEXT');
+ if not Assigned(glDeleteVertexShaderEXT) then Exit;
+ @glShaderOp1EXT := SDL_GL_GetProcAddress('glShaderOp1EXT');
+ if not Assigned(glShaderOp1EXT) then Exit;
+ @glShaderOp2EXT := SDL_GL_GetProcAddress('glShaderOp2EXT');
+ if not Assigned(glShaderOp2EXT) then Exit;
+ @glShaderOp3EXT := SDL_GL_GetProcAddress('glShaderOp3EXT');
+ if not Assigned(glShaderOp3EXT) then Exit;
+ @glSwizzleEXT := SDL_GL_GetProcAddress('glSwizzleEXT');
+ if not Assigned(glSwizzleEXT) then Exit;
+ @glWriteMaskEXT := SDL_GL_GetProcAddress('glWriteMaskEXT');
+ if not Assigned(glWriteMaskEXT) then Exit;
+ @glInsertComponentEXT := SDL_GL_GetProcAddress('glInsertComponentEXT');
+ if not Assigned(glInsertComponentEXT) then Exit;
+ @glExtractComponentEXT := SDL_GL_GetProcAddress('glExtractComponentEXT');
+ if not Assigned(glExtractComponentEXT) then Exit;
+ @glGenSymbolsEXT := SDL_GL_GetProcAddress('glGenSymbolsEXT');
+ if not Assigned(glGenSymbolsEXT) then Exit;
+ @glSetInvariantEXT := SDL_GL_GetProcAddress('glSetInvariantEXT');
+ if not Assigned(glSetInvariantEXT) then Exit;
+ @glSetLocalConstantEXT := SDL_GL_GetProcAddress('glSetLocalConstantEXT');
+ if not Assigned(glSetLocalConstantEXT) then Exit;
+ @glVariantbvEXT := SDL_GL_GetProcAddress('glVariantbvEXT');
+ if not Assigned(glVariantbvEXT) then Exit;
+ @glVariantsvEXT := SDL_GL_GetProcAddress('glVariantsvEXT');
+ if not Assigned(glVariantsvEXT) then Exit;
+ @glVariantivEXT := SDL_GL_GetProcAddress('glVariantivEXT');
+ if not Assigned(glVariantivEXT) then Exit;
+ @glVariantfvEXT := SDL_GL_GetProcAddress('glVariantfvEXT');
+ if not Assigned(glVariantfvEXT) then Exit;
+ @glVariantdvEXT := SDL_GL_GetProcAddress('glVariantdvEXT');
+ if not Assigned(glVariantdvEXT) then Exit;
+ @glVariantubvEXT := SDL_GL_GetProcAddress('glVariantubvEXT');
+ if not Assigned(glVariantubvEXT) then Exit;
+ @glVariantusvEXT := SDL_GL_GetProcAddress('glVariantusvEXT');
+ if not Assigned(glVariantusvEXT) then Exit;
+ @glVariantuivEXT := SDL_GL_GetProcAddress('glVariantuivEXT');
+ if not Assigned(glVariantuivEXT) then Exit;
+ @glVariantPointerEXT := SDL_GL_GetProcAddress('glVariantPointerEXT');
+ if not Assigned(glVariantPointerEXT) then Exit;
+ @glEnableVariantClientStateEXT := SDL_GL_GetProcAddress('glEnableVariantClientStateEXT');
+ if not Assigned(glEnableVariantClientStateEXT) then Exit;
+ @glDisableVariantClientStateEXT := SDL_GL_GetProcAddress('glDisableVariantClientStateEXT');
+ if not Assigned(glDisableVariantClientStateEXT) then Exit;
+ @glBindLightParameterEXT := SDL_GL_GetProcAddress('glBindLightParameterEXT');
+ if not Assigned(glBindLightParameterEXT) then Exit;
+ @glBindMaterialParameterEXT := SDL_GL_GetProcAddress('glBindMaterialParameterEXT');
+ if not Assigned(glBindMaterialParameterEXT) then Exit;
+ @glBindTexGenParameterEXT := SDL_GL_GetProcAddress('glBindTexGenParameterEXT');
+ if not Assigned(glBindTexGenParameterEXT) then Exit;
+ @glBindTextureUnitParameterEXT := SDL_GL_GetProcAddress('glBindTextureUnitParameterEXT');
+ if not Assigned(glBindTextureUnitParameterEXT) then Exit;
+ @glBindParameterEXT := SDL_GL_GetProcAddress('glBindParameterEXT');
+ if not Assigned(glBindParameterEXT) then Exit;
+ @glIsVariantEnabledEXT := SDL_GL_GetProcAddress('glIsVariantEnabledEXT');
+ if not Assigned(glIsVariantEnabledEXT) then Exit;
+ @glGetVariantBooleanvEXT := SDL_GL_GetProcAddress('glGetVariantBooleanvEXT');
+ if not Assigned(glGetVariantBooleanvEXT) then Exit;
+ @glGetVariantIntegervEXT := SDL_GL_GetProcAddress('glGetVariantIntegervEXT');
+ if not Assigned(glGetVariantIntegervEXT) then Exit;
+ @glGetVariantFloatvEXT := SDL_GL_GetProcAddress('glGetVariantFloatvEXT');
+ if not Assigned(glGetVariantFloatvEXT) then Exit;
+ @glGetVariantPointervEXT := SDL_GL_GetProcAddress('glGetVariantPointervEXT');
+ if not Assigned(glGetVariantPointervEXT) then Exit;
+ @glGetInvariantBooleanvEXT := SDL_GL_GetProcAddress('glGetInvariantBooleanvEXT');
+ if not Assigned(glGetInvariantBooleanvEXT) then Exit;
+ @glGetInvariantIntegervEXT := SDL_GL_GetProcAddress('glGetInvariantIntegervEXT');
+ if not Assigned(glGetInvariantIntegervEXT) then Exit;
+ @glGetInvariantFloatvEXT := SDL_GL_GetProcAddress('glGetInvariantFloatvEXT');
+ if not Assigned(glGetInvariantFloatvEXT) then Exit;
+ @glGetLocalConstantBooleanvEXT := SDL_GL_GetProcAddress('glGetLocalConstantBooleanvEXT');
+ if not Assigned(glGetLocalConstantBooleanvEXT) then Exit;
+ @glGetLocalConstantIntegervEXT := SDL_GL_GetProcAddress('glGetLocalConstantIntegervEXT');
+ if not Assigned(glGetLocalConstantIntegervEXT) then Exit;
+ @glGetLocalConstantFloatvEXT := SDL_GL_GetProcAddress('glGetLocalConstantFloatvEXT');
+ if not Assigned(glGetLocalConstantFloatvEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_vertex_weighting: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_vertex_weighting', extstring) then
+ begin
+ @glVertexWeightfEXT := SDL_GL_GetProcAddress('glVertexWeightfEXT');
+ if not Assigned(glVertexWeightfEXT) then Exit;
+ @glVertexWeightfvEXT := SDL_GL_GetProcAddress('glVertexWeightfvEXT');
+ if not Assigned(glVertexWeightfvEXT) then Exit;
+ @glVertexWeightPointerEXT := SDL_GL_GetProcAddress('glVertexWeightPointerEXT');
+ if not Assigned(glVertexWeightPointerEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_HP_occlusion_test: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_HP_occlusion_test', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_blend_square: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_blend_square', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_copy_depth_to_color: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_copy_depth_to_color', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_depth_clamp: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_depth_clamp', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_evaluators: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_evaluators', extstring) then
+ begin
+ @glMapControlPointsNV := SDL_GL_GetProcAddress('glMapControlPointsNV');
+ if not Assigned(glMapControlPointsNV) then Exit;
+ @glMapParameterivNV := SDL_GL_GetProcAddress('glMapParameterivNV');
+ if not Assigned(glMapParameterivNV) then Exit;
+ @glMapParameterfvNV := SDL_GL_GetProcAddress('glMapParameterfvNV');
+ if not Assigned(glMapParameterfvNV) then Exit;
+ @glGetMapControlPointsNV := SDL_GL_GetProcAddress('glGetMapControlPointsNV');
+ if not Assigned(glGetMapControlPointsNV) then Exit;
+ @glGetMapParameterivNV := SDL_GL_GetProcAddress('glGetMapParameterivNV');
+ if not Assigned(glGetMapParameterivNV) then Exit;
+ @glGetMapParameterfvNV := SDL_GL_GetProcAddress('glGetMapParameterfvNV');
+ if not Assigned(glGetMapParameterfvNV) then Exit;
+ @glGetMapAttribParameterivNV := SDL_GL_GetProcAddress('glGetMapAttribParameterivNV');
+ if not Assigned(glGetMapAttribParameterivNV) then Exit;
+ @glGetMapAttribParameterfvNV := SDL_GL_GetProcAddress('glGetMapAttribParameterfvNV');
+ if not Assigned(glGetMapAttribParameterfvNV) then Exit;
+ @glEvalMapsNV := SDL_GL_GetProcAddress('glEvalMapsNV');
+ if not Assigned(glEvalMapsNV) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_fence: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_fence', extstring) then
+ begin
+ @glGenFencesNV := SDL_GL_GetProcAddress('glGenFencesNV');
+ if not Assigned(glGenFencesNV) then Exit;
+ @glDeleteFencesNV := SDL_GL_GetProcAddress('glDeleteFencesNV');
+ if not Assigned(glDeleteFencesNV) then Exit;
+ @glSetFenceNV := SDL_GL_GetProcAddress('glSetFenceNV');
+ if not Assigned(glSetFenceNV) then Exit;
+ @glTestFenceNV := SDL_GL_GetProcAddress('glTestFenceNV');
+ if not Assigned(glTestFenceNV) then Exit;
+ @glFinishFenceNV := SDL_GL_GetProcAddress('glFinishFenceNV');
+ if not Assigned(glFinishFenceNV) then Exit;
+ @glIsFenceNV := SDL_GL_GetProcAddress('glIsFenceNV');
+ if not Assigned(glIsFenceNV) then Exit;
+ @glGetFenceivNV := SDL_GL_GetProcAddress('glGetFenceivNV');
+ if not Assigned(glGetFenceivNV) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_fog_distance: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_fog_distance', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_light_max_exponent: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_light_max_exponent', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_multisample_filter_hint: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_multisample_filter_hint', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_occlusion_query: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_occlusion_query', extstring) then
+ begin
+ @glGenOcclusionQueriesNV := SDL_GL_GetProcAddress('glGenOcclusionQueriesNV');
+ if not Assigned(glGenOcclusionQueriesNV) then Exit;
+ @glDeleteOcclusionQueriesNV := SDL_GL_GetProcAddress('glDeleteOcclusionQueriesNV');
+ if not Assigned(glDeleteOcclusionQueriesNV) then Exit;
+ @glIsOcclusionQueryNV := SDL_GL_GetProcAddress('glIsOcclusionQueryNV');
+ if not Assigned(glIsOcclusionQueryNV) then Exit;
+ @glBeginOcclusionQueryNV := SDL_GL_GetProcAddress('glBeginOcclusionQueryNV');
+ if not Assigned(glBeginOcclusionQueryNV) then Exit;
+ @glEndOcclusionQueryNV := SDL_GL_GetProcAddress('glEndOcclusionQueryNV');
+ if not Assigned(glEndOcclusionQueryNV) then Exit;
+ @glGetOcclusionQueryivNV := SDL_GL_GetProcAddress('glGetOcclusionQueryivNV');
+ if not Assigned(glGetOcclusionQueryivNV) then Exit;
+ @glGetOcclusionQueryuivNV := SDL_GL_GetProcAddress('glGetOcclusionQueryuivNV');
+ if not Assigned(glGetOcclusionQueryuivNV) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_packed_depth_stencil: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_packed_depth_stencil', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_point_sprite: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_point_sprite', extstring) then
+ begin
+ @glPointParameteriNV := SDL_GL_GetProcAddress('glPointParameteriNV');
+ if not Assigned(glPointParameteriNV) then Exit;
+ @glPointParameterivNV := SDL_GL_GetProcAddress('glPointParameterivNV');
+ if not Assigned(glPointParameterivNV) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_register_combiners: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_register_combiners', extstring) then
+ begin
+ @glCombinerParameterfvNV := SDL_GL_GetProcAddress('glCombinerParameterfvNV');
+ if not Assigned(glCombinerParameterfvNV) then Exit;
+ @glCombinerParameterivNV := SDL_GL_GetProcAddress('glCombinerParameterivNV');
+ if not Assigned(glCombinerParameterivNV) then Exit;
+ @glCombinerParameterfNV := SDL_GL_GetProcAddress('glCombinerParameterfNV');
+ if not Assigned(glCombinerParameterfNV) then Exit;
+ @glCombinerParameteriNV := SDL_GL_GetProcAddress('glCombinerParameteriNV');
+ if not Assigned(glCombinerParameteriNV) then Exit;
+ @glCombinerInputNV := SDL_GL_GetProcAddress('glCombinerInputNV');
+ if not Assigned(glCombinerInputNV) then Exit;
+ @glCombinerOutputNV := SDL_GL_GetProcAddress('glCombinerOutputNV');
+ if not Assigned(glCombinerOutputNV) then Exit;
+ @glFinalCombinerInputNV := SDL_GL_GetProcAddress('glFinalCombinerInputNV');
+ if not Assigned(glFinalCombinerInputNV) then Exit;
+ @glGetCombinerInputParameterfvNV := SDL_GL_GetProcAddress('glGetCombinerInputParameterfvNV');
+ if not Assigned(glGetCombinerInputParameterfvNV) then Exit;
+ @glGetCombinerInputParameterivNV := SDL_GL_GetProcAddress('glGetCombinerInputParameterivNV');
+ if not Assigned(glGetCombinerInputParameterivNV) then Exit;
+ @glGetCombinerOutputParameterfvNV := SDL_GL_GetProcAddress('glGetCombinerOutputParameterfvNV');
+ if not Assigned(glGetCombinerOutputParameterfvNV) then Exit;
+ @glGetCombinerOutputParameterivNV := SDL_GL_GetProcAddress('glGetCombinerOutputParameterivNV');
+ if not Assigned(glGetCombinerOutputParameterivNV) then Exit;
+ @glGetFinalCombinerInputParameterfvNV := SDL_GL_GetProcAddress('glGetFinalCombinerInputParameterfvNV');
+ if not Assigned(glGetFinalCombinerInputParameterfvNV) then Exit;
+ @glGetFinalCombinerInputParameterivNV := SDL_GL_GetProcAddress('glGetFinalCombinerInputParameterivNV');
+ if not Assigned(glGetFinalCombinerInputParameterivNV) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_register_combiners2: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_register_combiners2', extstring) then
+ begin
+ @glCombinerStageParameterfvNV := SDL_GL_GetProcAddress('glCombinerStageParameterfvNV');
+ if not Assigned(glCombinerStageParameterfvNV) then Exit;
+ @glGetCombinerStageParameterfvNV := SDL_GL_GetProcAddress('glGetCombinerStageParameterfvNV');
+ if not Assigned(glGetCombinerStageParameterfvNV) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_texgen_emboss: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_texgen_emboss', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_texgen_reflection: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_texgen_reflection', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_texture_compression_vtc: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_texture_compression_vtc', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_texture_env_combine4: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_texture_env_combine4', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_texture_rectangle: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_texture_rectangle', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_texture_shader: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_texture_shader', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_texture_shader2: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_texture_shader2', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_texture_shader3: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_texture_shader3', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_vertex_array_range: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_vertex_array_range', extstring) then
+ begin
+ @glVertexArrayRangeNV := SDL_GL_GetProcAddress('glVertexArrayRangeNV');
+ if not Assigned(glVertexArrayRangeNV) then Exit;
+ @glFlushVertexArrayRangeNV := SDL_GL_GetProcAddress('glFlushVertexArrayRangeNV');
+ if not Assigned(glFlushVertexArrayRangeNV) then Exit;
+ {$IFDEF WINDOWS}
+ @wglAllocateMemoryNV := SDL_GL_GetProcAddress('wglAllocateMemoryNV');
+ if not Assigned(wglAllocateMemoryNV) then Exit;
+ @wglFreeMemoryNV := SDL_GL_GetProcAddress('wglFreeMemoryNV');
+ if not Assigned(wglFreeMemoryNV) then Exit;
+ {$ENDIF}
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_vertex_array_range2: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_vertex_array_range2', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_vertex_program: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_vertex_program', extstring) then
+ begin
+ @glBindProgramNV := SDL_GL_GetProcAddress('glBindProgramNV');
+ if not Assigned(glBindProgramNV) then Exit;
+ @glDeleteProgramsNV := SDL_GL_GetProcAddress('glDeleteProgramsNV');
+ if not Assigned(glDeleteProgramsNV) then Exit;
+ @glExecuteProgramNV := SDL_GL_GetProcAddress('glExecuteProgramNV');
+ if not Assigned(glExecuteProgramNV) then Exit;
+ @glGenProgramsNV := SDL_GL_GetProcAddress('glGenProgramsNV');
+ if not Assigned(glGenProgramsNV) then Exit;
+ @glAreProgramsResidentNV := SDL_GL_GetProcAddress('glAreProgramsResidentNV');
+ if not Assigned(glAreProgramsResidentNV) then Exit;
+ @glRequestResidentProgramsNV := SDL_GL_GetProcAddress('glRequestResidentProgramsNV');
+ if not Assigned(glRequestResidentProgramsNV) then Exit;
+ @glGetProgramParameterfvNV := SDL_GL_GetProcAddress('glGetProgramParameterfvNV');
+ if not Assigned(glGetProgramParameterfvNV) then Exit;
+ @glGetProgramParameterdvNV := SDL_GL_GetProcAddress('glGetProgramParameterdvNV');
+ if not Assigned(glGetProgramParameterdvNV) then Exit;
+ @glGetProgramivNV := SDL_GL_GetProcAddress('glGetProgramivNV');
+ if not Assigned(glGetProgramivNV) then Exit;
+ @glGetProgramStringNV := SDL_GL_GetProcAddress('glGetProgramStringNV');
+ if not Assigned(glGetProgramStringNV) then Exit;
+ @glGetTrackMatrixivNV := SDL_GL_GetProcAddress('glGetTrackMatrixivNV');
+ if not Assigned(glGetTrackMatrixivNV) then Exit;
+ @glGetVertexAttribdvNV := SDL_GL_GetProcAddress('glGetVertexAttribdvNV');
+ if not Assigned(glGetVertexAttribdvNV) then Exit;
+ @glGetVertexAttribfvNV := SDL_GL_GetProcAddress('glGetVertexAttribfvNV');
+ if not Assigned(glGetVertexAttribfvNV) then Exit;
+ @glGetVertexAttribivNV := SDL_GL_GetProcAddress('glGetVertexAttribivNV');
+ if not Assigned(glGetVertexAttribivNV) then Exit;
+ @glGetVertexAttribPointervNV := SDL_GL_GetProcAddress('glGetVertexAttribPointervNV');
+ if not Assigned(glGetVertexAttribPointervNV) then Exit;
+ @glIsProgramNV := SDL_GL_GetProcAddress('glIsProgramNV');
+ if not Assigned(glIsProgramNV) then Exit;
+ @glLoadProgramNV := SDL_GL_GetProcAddress('glLoadProgramNV');
+ if not Assigned(glLoadProgramNV) then Exit;
+ @glProgramParameter4fNV := SDL_GL_GetProcAddress('glProgramParameter4fNV');
+ if not Assigned(glProgramParameter4fNV) then Exit;
+ @glProgramParameter4fvNV := SDL_GL_GetProcAddress('glProgramParameter4fvNV');
+ if not Assigned(glProgramParameter4fvNV) then Exit;
+ @glProgramParameters4dvNV := SDL_GL_GetProcAddress('glProgramParameters4dvNV');
+ if not Assigned(glProgramParameters4dvNV) then Exit;
+ @glProgramParameters4fvNV := SDL_GL_GetProcAddress('glProgramParameters4fvNV');
+ if not Assigned(glProgramParameters4fvNV) then Exit;
+ @glTrackMatrixNV := SDL_GL_GetProcAddress('glTrackMatrixNV');
+ if not Assigned(glTrackMatrixNV) then Exit;
+ @glVertexAttribPointerNV := SDL_GL_GetProcAddress('glVertexAttribPointerNV');
+ if not Assigned(glVertexAttribPointerNV) then Exit;
+ @glVertexAttrib1sNV := SDL_GL_GetProcAddress('glVertexAttrib1sNV');
+ if not Assigned(glVertexAttrib1sNV) then Exit;
+ @glVertexAttrib1fNV := SDL_GL_GetProcAddress('glVertexAttrib1fNV');
+ if not Assigned(glVertexAttrib1fNV) then Exit;
+ @glVertexAttrib1dNV := SDL_GL_GetProcAddress('glVertexAttrib1dNV');
+ if not Assigned(glVertexAttrib1dNV) then Exit;
+ @glVertexAttrib2sNV := SDL_GL_GetProcAddress('glVertexAttrib2sNV');
+ if not Assigned(glVertexAttrib2sNV) then Exit;
+ @glVertexAttrib2fNV := SDL_GL_GetProcAddress('glVertexAttrib2fNV');
+ if not Assigned(glVertexAttrib2fNV) then Exit;
+ @glVertexAttrib2dNV := SDL_GL_GetProcAddress('glVertexAttrib2dNV');
+ if not Assigned(glVertexAttrib2dNV) then Exit;
+ @glVertexAttrib3sNV := SDL_GL_GetProcAddress('glVertexAttrib3sNV');
+ if not Assigned(glVertexAttrib3sNV) then Exit;
+ @glVertexAttrib3fNV := SDL_GL_GetProcAddress('glVertexAttrib3fNV');
+ if not Assigned(glVertexAttrib3fNV) then Exit;
+ @glVertexAttrib3dNV := SDL_GL_GetProcAddress('glVertexAttrib3dNV');
+ if not Assigned(glVertexAttrib3dNV) then Exit;
+ @glVertexAttrib4sNV := SDL_GL_GetProcAddress('glVertexAttrib4sNV');
+ if not Assigned(glVertexAttrib4sNV) then Exit;
+ @glVertexAttrib4fNV := SDL_GL_GetProcAddress('glVertexAttrib4fNV');
+ if not Assigned(glVertexAttrib4fNV) then Exit;
+ @glVertexAttrib4dNV := SDL_GL_GetProcAddress('glVertexAttrib4dNV');
+ if not Assigned(glVertexAttrib4dNV) then Exit;
+ @glVertexAttrib4ubNV := SDL_GL_GetProcAddress('glVertexAttrib4ubNV');
+ if not Assigned(glVertexAttrib4ubNV) then Exit;
+ @glVertexAttrib1svNV := SDL_GL_GetProcAddress('glVertexAttrib1svNV');
+ if not Assigned(glVertexAttrib1svNV) then Exit;
+ @glVertexAttrib1fvNV := SDL_GL_GetProcAddress('glVertexAttrib1fvNV');
+ if not Assigned(glVertexAttrib1fvNV) then Exit;
+ @glVertexAttrib1dvNV := SDL_GL_GetProcAddress('glVertexAttrib1dvNV');
+ if not Assigned(glVertexAttrib1dvNV) then Exit;
+ @glVertexAttrib2svNV := SDL_GL_GetProcAddress('glVertexAttrib2svNV');
+ if not Assigned(glVertexAttrib2svNV) then Exit;
+ @glVertexAttrib2fvNV := SDL_GL_GetProcAddress('glVertexAttrib2fvNV');
+ if not Assigned(glVertexAttrib2fvNV) then Exit;
+ @glVertexAttrib2dvNV := SDL_GL_GetProcAddress('glVertexAttrib2dvNV');
+ if not Assigned(glVertexAttrib2dvNV) then Exit;
+ @glVertexAttrib3svNV := SDL_GL_GetProcAddress('glVertexAttrib3svNV');
+ if not Assigned(glVertexAttrib3svNV) then Exit;
+ @glVertexAttrib3fvNV := SDL_GL_GetProcAddress('glVertexAttrib3fvNV');
+ if not Assigned(glVertexAttrib3fvNV) then Exit;
+ @glVertexAttrib3dvNV := SDL_GL_GetProcAddress('glVertexAttrib3dvNV');
+ if not Assigned(glVertexAttrib3dvNV) then Exit;
+ @glVertexAttrib4svNV := SDL_GL_GetProcAddress('glVertexAttrib4svNV');
+ if not Assigned(glVertexAttrib4svNV) then Exit;
+ @glVertexAttrib4fvNV := SDL_GL_GetProcAddress('glVertexAttrib4fvNV');
+ if not Assigned(glVertexAttrib4fvNV) then Exit;
+ @glVertexAttrib4dvNV := SDL_GL_GetProcAddress('glVertexAttrib4dvNV');
+ if not Assigned(glVertexAttrib4dvNV) then Exit;
+ @glVertexAttrib4ubvNV := SDL_GL_GetProcAddress('glVertexAttrib4ubvNV');
+ if not Assigned(glVertexAttrib4ubvNV) then Exit;
+ @glVertexAttribs1svNV := SDL_GL_GetProcAddress('glVertexAttribs1svNV');
+ if not Assigned(glVertexAttribs1svNV) then Exit;
+ @glVertexAttribs1fvNV := SDL_GL_GetProcAddress('glVertexAttribs1fvNV');
+ if not Assigned(glVertexAttribs1fvNV) then Exit;
+ @glVertexAttribs1dvNV := SDL_GL_GetProcAddress('glVertexAttribs1dvNV');
+ if not Assigned(glVertexAttribs1dvNV) then Exit;
+ @glVertexAttribs2svNV := SDL_GL_GetProcAddress('glVertexAttribs2svNV');
+ if not Assigned(glVertexAttribs2svNV) then Exit;
+ @glVertexAttribs2fvNV := SDL_GL_GetProcAddress('glVertexAttribs2fvNV');
+ if not Assigned(glVertexAttribs2fvNV) then Exit;
+ @glVertexAttribs2dvNV := SDL_GL_GetProcAddress('glVertexAttribs2dvNV');
+ if not Assigned(glVertexAttribs2dvNV) then Exit;
+ @glVertexAttribs3svNV := SDL_GL_GetProcAddress('glVertexAttribs3svNV');
+ if not Assigned(glVertexAttribs3svNV) then Exit;
+ @glVertexAttribs3fvNV := SDL_GL_GetProcAddress('glVertexAttribs3fvNV');
+ if not Assigned(glVertexAttribs3fvNV) then Exit;
+ @glVertexAttribs3dvNV := SDL_GL_GetProcAddress('glVertexAttribs3dvNV');
+ if not Assigned(glVertexAttribs3dvNV) then Exit;
+ @glVertexAttribs4svNV := SDL_GL_GetProcAddress('glVertexAttribs4svNV');
+ if not Assigned(glVertexAttribs4svNV) then Exit;
+ @glVertexAttribs4fvNV := SDL_GL_GetProcAddress('glVertexAttribs4fvNV');
+ if not Assigned(glVertexAttribs4fvNV) then Exit;
+ @glVertexAttribs4dvNV := SDL_GL_GetProcAddress('glVertexAttribs4dvNV');
+ if not Assigned(glVertexAttribs4dvNV) then Exit;
+ @glVertexAttribs4ubvNV := SDL_GL_GetProcAddress('glVertexAttribs4ubvNV');
+ if not Assigned(glVertexAttribs4ubvNV) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_vertex_program1_1: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_vertex_program1_1', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ATI_element_array: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ATI_element_array', extstring) then
+ begin
+ @glElementPointerATI := SDL_GL_GetProcAddress('glElementPointerATI');
+ if not Assigned(glElementPointerATI) then Exit;
+ @glDrawElementArrayATI := SDL_GL_GetProcAddress('glDrawElementArrayATI');
+ if not Assigned(glDrawElementArrayATI) then Exit;
+ @glDrawRangeElementArrayATI := SDL_GL_GetProcAddress('glDrawRangeElementArrayATI');
+ if not Assigned(glDrawRangeElementArrayATI) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ATI_envmap_bumpmap: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ATI_envmap_bumpmap', extstring) then
+ begin
+ @glTexBumpParameterivATI := SDL_GL_GetProcAddress('glTexBumpParameterivATI');
+ if not Assigned(glTexBumpParameterivATI) then Exit;
+ @glTexBumpParameterfvATI := SDL_GL_GetProcAddress('glTexBumpParameterfvATI');
+ if not Assigned(glTexBumpParameterfvATI) then Exit;
+ @glGetTexBumpParameterivATI := SDL_GL_GetProcAddress('glGetTexBumpParameterivATI');
+ if not Assigned(glGetTexBumpParameterivATI) then Exit;
+ @glGetTexBumpParameterfvATI := SDL_GL_GetProcAddress('glGetTexBumpParameterfvATI');
+ if not Assigned(glGetTexBumpParameterfvATI) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ATI_fragment_shader: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ATI_fragment_shader', extstring) then
+ begin
+ @glGenFragmentShadersATI := SDL_GL_GetProcAddress('glGenFragmentShadersATI');
+ if not Assigned(glGenFragmentShadersATI) then Exit;
+ @glBindFragmentShaderATI := SDL_GL_GetProcAddress('glBindFragmentShaderATI');
+ if not Assigned(glBindFragmentShaderATI) then Exit;
+ @glDeleteFragmentShaderATI := SDL_GL_GetProcAddress('glDeleteFragmentShaderATI');
+ if not Assigned(glDeleteFragmentShaderATI) then Exit;
+ @glBeginFragmentShaderATI := SDL_GL_GetProcAddress('glBeginFragmentShaderATI');
+ if not Assigned(glBeginFragmentShaderATI) then Exit;
+ @glEndFragmentShaderATI := SDL_GL_GetProcAddress('glEndFragmentShaderATI');
+ if not Assigned(glEndFragmentShaderATI) then Exit;
+ @glPassTexCoordATI := SDL_GL_GetProcAddress('glPassTexCoordATI');
+ if not Assigned(glPassTexCoordATI) then Exit;
+ @glSampleMapATI := SDL_GL_GetProcAddress('glSampleMapATI');
+ if not Assigned(glSampleMapATI) then Exit;
+ @glColorFragmentOp1ATI := SDL_GL_GetProcAddress('glColorFragmentOp1ATI');
+ if not Assigned(glColorFragmentOp1ATI) then Exit;
+ @glColorFragmentOp2ATI := SDL_GL_GetProcAddress('glColorFragmentOp2ATI');
+ if not Assigned(glColorFragmentOp2ATI) then Exit;
+ @glColorFragmentOp3ATI := SDL_GL_GetProcAddress('glColorFragmentOp3ATI');
+ if not Assigned(glColorFragmentOp3ATI) then Exit;
+ @glAlphaFragmentOp1ATI := SDL_GL_GetProcAddress('glAlphaFragmentOp1ATI');
+ if not Assigned(glAlphaFragmentOp1ATI) then Exit;
+ @glAlphaFragmentOp2ATI := SDL_GL_GetProcAddress('glAlphaFragmentOp2ATI');
+ if not Assigned(glAlphaFragmentOp2ATI) then Exit;
+ @glAlphaFragmentOp3ATI := SDL_GL_GetProcAddress('glAlphaFragmentOp3ATI');
+ if not Assigned(glAlphaFragmentOp3ATI) then Exit;
+ @glSetFragmentShaderConstantATI := SDL_GL_GetProcAddress('glSetFragmentShaderConstantATI');
+ if not Assigned(glSetFragmentShaderConstantATI) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ATI_pn_triangles: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ATI_pn_triangles', extstring) then
+ begin
+ @glPNTrianglesiATI := SDL_GL_GetProcAddress('glPNTrianglesiATI');
+ if not Assigned(glPNTrianglesiATI) then Exit;
+ @glPNTrianglesfATI := SDL_GL_GetProcAddress('glPNTrianglesfATI');
+ if not Assigned(glPNTrianglesfATI) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ATI_texture_mirror_once: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ATI_texture_mirror_once', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ATI_vertex_array_object: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ATI_vertex_array_object', extstring) then
+ begin
+ @glNewObjectBufferATI := SDL_GL_GetProcAddress('glNewObjectBufferATI');
+ if not Assigned(glNewObjectBufferATI) then Exit;
+ @glIsObjectBufferATI := SDL_GL_GetProcAddress('glIsObjectBufferATI');
+ if not Assigned(glIsObjectBufferATI) then Exit;
+ @glUpdateObjectBufferATI := SDL_GL_GetProcAddress('glUpdateObjectBufferATI');
+ if not Assigned(glUpdateObjectBufferATI) then Exit;
+ @glGetObjectBufferfvATI := SDL_GL_GetProcAddress('glGetObjectBufferfvATI');
+ if not Assigned(glGetObjectBufferfvATI) then Exit;
+ @glGetObjectBufferivATI := SDL_GL_GetProcAddress('glGetObjectBufferivATI');
+ if not Assigned(glGetObjectBufferivATI) then Exit;
+ @glDeleteObjectBufferATI := SDL_GL_GetProcAddress('glDeleteObjectBufferATI');
+ if not Assigned(glDeleteObjectBufferATI) then Exit;
+ @glArrayObjectATI := SDL_GL_GetProcAddress('glArrayObjectATI');
+ if not Assigned(glArrayObjectATI) then Exit;
+ @glGetArrayObjectfvATI := SDL_GL_GetProcAddress('glGetArrayObjectfvATI');
+ if not Assigned(glGetArrayObjectfvATI) then Exit;
+ @glGetArrayObjectivATI := SDL_GL_GetProcAddress('glGetArrayObjectivATI');
+ if not Assigned(glGetArrayObjectivATI) then Exit;
+ @glVariantArrayObjectATI := SDL_GL_GetProcAddress('glVariantArrayObjectATI');
+ if not Assigned(glVariantArrayObjectATI) then Exit;
+ @glGetVariantArrayObjectfvATI := SDL_GL_GetProcAddress('glGetVariantArrayObjectfvATI');
+ if not Assigned(glGetVariantArrayObjectfvATI) then Exit;
+ @glGetVariantArrayObjectivATI := SDL_GL_GetProcAddress('glGetVariantArrayObjectivATI');
+ if not Assigned(glGetVariantArrayObjectivATI) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ATI_vertex_streams: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ATI_vertex_streams', extstring) then
+ begin
+ @glVertexStream1s := SDL_GL_GetProcAddress('glVertexStream1s');
+ if not Assigned(glVertexStream1s) then Exit;
+ @glVertexStream1i := SDL_GL_GetProcAddress('glVertexStream1i');
+ if not Assigned(glVertexStream1i) then Exit;
+ @glVertexStream1f := SDL_GL_GetProcAddress('glVertexStream1f');
+ if not Assigned(glVertexStream1f) then Exit;
+ @glVertexStream1d := SDL_GL_GetProcAddress('glVertexStream1d');
+ if not Assigned(glVertexStream1d) then Exit;
+ @glVertexStream1sv := SDL_GL_GetProcAddress('glVertexStream1sv');
+ if not Assigned(glVertexStream1sv) then Exit;
+ @glVertexStream1iv := SDL_GL_GetProcAddress('glVertexStream1iv');
+ if not Assigned(glVertexStream1iv) then Exit;
+ @glVertexStream1fv := SDL_GL_GetProcAddress('glVertexStream1fv');
+ if not Assigned(glVertexStream1fv) then Exit;
+ @glVertexStream1dv := SDL_GL_GetProcAddress('glVertexStream1dv');
+ if not Assigned(glVertexStream1dv) then Exit;
+ @glVertexStream2s := SDL_GL_GetProcAddress('glVertexStream2s');
+ if not Assigned(glVertexStream2s) then Exit;
+ @glVertexStream2i := SDL_GL_GetProcAddress('glVertexStream2i');
+ if not Assigned(glVertexStream2i) then Exit;
+ @glVertexStream2f := SDL_GL_GetProcAddress('glVertexStream2f');
+ if not Assigned(glVertexStream2f) then Exit;
+ @glVertexStream2d := SDL_GL_GetProcAddress('glVertexStream2d');
+ if not Assigned(glVertexStream2d) then Exit;
+ @glVertexStream2sv := SDL_GL_GetProcAddress('glVertexStream2sv');
+ if not Assigned(glVertexStream2sv) then Exit;
+ @glVertexStream2iv := SDL_GL_GetProcAddress('glVertexStream2iv');
+ if not Assigned(glVertexStream2iv) then Exit;
+ @glVertexStream2fv := SDL_GL_GetProcAddress('glVertexStream2fv');
+ if not Assigned(glVertexStream2fv) then Exit;
+ @glVertexStream2dv := SDL_GL_GetProcAddress('glVertexStream2dv');
+ if not Assigned(glVertexStream2dv) then Exit;
+ @glVertexStream3s := SDL_GL_GetProcAddress('glVertexStream3s');
+ if not Assigned(glVertexStream3s) then Exit;
+ @glVertexStream3i := SDL_GL_GetProcAddress('glVertexStream3i');
+ if not Assigned(glVertexStream3i) then Exit;
+ @glVertexStream3f := SDL_GL_GetProcAddress('glVertexStream3f');
+ if not Assigned(glVertexStream3f) then Exit;
+ @glVertexStream3d := SDL_GL_GetProcAddress('glVertexStream3d');
+ if not Assigned(glVertexStream3d) then Exit;
+ @glVertexStream3sv := SDL_GL_GetProcAddress('glVertexStream3sv');
+ if not Assigned(glVertexStream3sv) then Exit;
+ @glVertexStream3iv := SDL_GL_GetProcAddress('glVertexStream3iv');
+ if not Assigned(glVertexStream3iv) then Exit;
+ @glVertexStream3fv := SDL_GL_GetProcAddress('glVertexStream3fv');
+ if not Assigned(glVertexStream3fv) then Exit;
+ @glVertexStream3dv := SDL_GL_GetProcAddress('glVertexStream3dv');
+ if not Assigned(glVertexStream3dv) then Exit;
+ @glVertexStream4s := SDL_GL_GetProcAddress('glVertexStream4s');
+ if not Assigned(glVertexStream4s) then Exit;
+ @glVertexStream4i := SDL_GL_GetProcAddress('glVertexStream4i');
+ if not Assigned(glVertexStream4i) then Exit;
+ @glVertexStream4f := SDL_GL_GetProcAddress('glVertexStream4f');
+ if not Assigned(glVertexStream4f) then Exit;
+ @glVertexStream4d := SDL_GL_GetProcAddress('glVertexStream4d');
+ if not Assigned(glVertexStream4d) then Exit;
+ @glVertexStream4sv := SDL_GL_GetProcAddress('glVertexStream4sv');
+ if not Assigned(glVertexStream4sv) then Exit;
+ @glVertexStream4iv := SDL_GL_GetProcAddress('glVertexStream4iv');
+ if not Assigned(glVertexStream4iv) then Exit;
+ @glVertexStream4fv := SDL_GL_GetProcAddress('glVertexStream4fv');
+ if not Assigned(glVertexStream4fv) then Exit;
+ @glVertexStream4dv := SDL_GL_GetProcAddress('glVertexStream4dv');
+ if not Assigned(glVertexStream4dv) then Exit;
+ @glNormalStream3b := SDL_GL_GetProcAddress('glNormalStream3b');
+ if not Assigned(glNormalStream3b) then Exit;
+ @glNormalStream3s := SDL_GL_GetProcAddress('glNormalStream3s');
+ if not Assigned(glNormalStream3s) then Exit;
+ @glNormalStream3i := SDL_GL_GetProcAddress('glNormalStream3i');
+ if not Assigned(glNormalStream3i) then Exit;
+ @glNormalStream3f := SDL_GL_GetProcAddress('glNormalStream3f');
+ if not Assigned(glNormalStream3f) then Exit;
+ @glNormalStream3d := SDL_GL_GetProcAddress('glNormalStream3d');
+ if not Assigned(glNormalStream3d) then Exit;
+ @glNormalStream3bv := SDL_GL_GetProcAddress('glNormalStream3bv');
+ if not Assigned(glNormalStream3bv) then Exit;
+ @glNormalStream3sv := SDL_GL_GetProcAddress('glNormalStream3sv');
+ if not Assigned(glNormalStream3sv) then Exit;
+ @glNormalStream3iv := SDL_GL_GetProcAddress('glNormalStream3iv');
+ if not Assigned(glNormalStream3iv) then Exit;
+ @glNormalStream3fv := SDL_GL_GetProcAddress('glNormalStream3fv');
+ if not Assigned(glNormalStream3fv) then Exit;
+ @glNormalStream3dv := SDL_GL_GetProcAddress('glNormalStream3dv');
+ if not Assigned(glNormalStream3dv) then Exit;
+ @glClientActiveVertexStream := SDL_GL_GetProcAddress('glClientActiveVertexStream');
+ if not Assigned(glClientActiveVertexStream) then Exit;
+ @glVertexBlendEnvi := SDL_GL_GetProcAddress('glVertexBlendEnvi');
+ if not Assigned(glVertexBlendEnvi) then Exit;
+ @glVertexBlendEnvf := SDL_GL_GetProcAddress('glVertexBlendEnvf');
+ if not Assigned(glVertexBlendEnvf) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+{$IFDEF WINDOWS}
+function Load_WGL_I3D_image_buffer: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ @wglGetExtensionsStringARB := SDL_GL_GetProcAddress('wglGetExtensionsStringARB');
+ if not Assigned(wglGetExtensionsStringARB) then Exit;
+ extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+ if glext_ExtensionSupported('WGL_I3D_image_buffer', extstring) then
+ begin
+ @wglCreateImageBufferI3D := SDL_GL_GetProcAddress('wglCreateImageBufferI3D');
+ if not Assigned(wglCreateImageBufferI3D) then Exit;
+ @wglDestroyImageBufferI3D := SDL_GL_GetProcAddress('wglDestroyImageBufferI3D');
+ if not Assigned(wglDestroyImageBufferI3D) then Exit;
+ @wglAssociateImageBufferEventsI3D := SDL_GL_GetProcAddress('wglAssociateImageBufferEventsI3D');
+ if not Assigned(wglAssociateImageBufferEventsI3D) then Exit;
+ @wglReleaseImageBufferEventsI3D := SDL_GL_GetProcAddress('wglReleaseImageBufferEventsI3D');
+ if not Assigned(wglReleaseImageBufferEventsI3D) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_WGL_I3D_swap_frame_lock: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ @wglGetExtensionsStringARB := SDL_GL_GetProcAddress('wglGetExtensionsStringARB');
+ if not Assigned(wglGetExtensionsStringARB) then Exit;
+ extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+ if glext_ExtensionSupported('WGL_I3D_swap_frame_lock', extstring) then
+ begin
+ @wglEnableFrameLockI3D := SDL_GL_GetProcAddress('wglEnableFrameLockI3D');
+ if not Assigned(wglEnableFrameLockI3D) then Exit;
+ @wglDisableFrameLockI3D := SDL_GL_GetProcAddress('wglDisableFrameLockI3D');
+ if not Assigned(wglDisableFrameLockI3D) then Exit;
+ @wglIsEnabledFrameLockI3D := SDL_GL_GetProcAddress('wglIsEnabledFrameLockI3D');
+ if not Assigned(wglIsEnabledFrameLockI3D) then Exit;
+ @wglQueryFrameLockMasterI3D := SDL_GL_GetProcAddress('wglQueryFrameLockMasterI3D');
+ if not Assigned(wglQueryFrameLockMasterI3D) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_WGL_I3D_swap_frame_usage: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ @wglGetExtensionsStringARB := SDL_GL_GetProcAddress('wglGetExtensionsStringARB');
+ if not Assigned(wglGetExtensionsStringARB) then Exit;
+ extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+ if glext_ExtensionSupported('WGL_I3D_swap_frame_usage', extstring) then
+ begin
+ @wglGetFrameUsageI3D := SDL_GL_GetProcAddress('wglGetFrameUsageI3D');
+ if not Assigned(wglGetFrameUsageI3D) then Exit;
+ @wglBeginFrameTrackingI3D := SDL_GL_GetProcAddress('wglBeginFrameTrackingI3D');
+ if not Assigned(wglBeginFrameTrackingI3D) then Exit;
+ @wglEndFrameTrackingI3D := SDL_GL_GetProcAddress('wglEndFrameTrackingI3D');
+ if not Assigned(wglEndFrameTrackingI3D) then Exit;
+ @wglQueryFrameTrackingI3D := SDL_GL_GetProcAddress('wglQueryFrameTrackingI3D');
+ if not Assigned(wglQueryFrameTrackingI3D) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+{$ENDIF}
+
+function Load_GL_3DFX_texture_compression_FXT1: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_3DFX_texture_compression_FXT1', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_IBM_cull_vertex: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_IBM_cull_vertex', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_IBM_multimode_draw_arrays: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_IBM_multimode_draw_arrays', extstring) then
+ begin
+ @glMultiModeDrawArraysIBM := SDL_GL_GetProcAddress('glMultiModeDrawArraysIBM');
+ if not Assigned(glMultiModeDrawArraysIBM) then Exit;
+ @glMultiModeDrawElementsIBM := SDL_GL_GetProcAddress('glMultiModeDrawElementsIBM');
+ if not Assigned(glMultiModeDrawElementsIBM) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_IBM_raster_pos_clip: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_IBM_raster_pos_clip', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_IBM_texture_mirrored_repeat: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_IBM_texture_mirrored_repeat', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_IBM_vertex_array_lists: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_IBM_vertex_array_lists', extstring) then
+ begin
+ @glColorPointerListIBM := SDL_GL_GetProcAddress('glColorPointerListIBM');
+ if not Assigned(glColorPointerListIBM) then Exit;
+ @glSecondaryColorPointerListIBM := SDL_GL_GetProcAddress('glSecondaryColorPointerListIBM');
+ if not Assigned(glSecondaryColorPointerListIBM) then Exit;
+ @glEdgeFlagPointerListIBM := SDL_GL_GetProcAddress('glEdgeFlagPointerListIBM');
+ if not Assigned(glEdgeFlagPointerListIBM) then Exit;
+ @glFogCoordPointerListIBM := SDL_GL_GetProcAddress('glFogCoordPointerListIBM');
+ if not Assigned(glFogCoordPointerListIBM) then Exit;
+ @glNormalPointerListIBM := SDL_GL_GetProcAddress('glNormalPointerListIBM');
+ if not Assigned(glNormalPointerListIBM) then Exit;
+ @glTexCoordPointerListIBM := SDL_GL_GetProcAddress('glTexCoordPointerListIBM');
+ if not Assigned(glTexCoordPointerListIBM) then Exit;
+ @glVertexPointerListIBM := SDL_GL_GetProcAddress('glVertexPointerListIBM');
+ if not Assigned(glVertexPointerListIBM) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_MESA_resize_buffers: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_MESA_resize_buffers', extstring) then
+ begin
+ @glResizeBuffersMESA := SDL_GL_GetProcAddress('glResizeBuffersMESA');
+ if not Assigned(glResizeBuffersMESA) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_MESA_window_pos: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_MESA_window_pos', extstring) then
+ begin
+ @glWindowPos2dMESA := SDL_GL_GetProcAddress('glWindowPos2dMESA');
+ if not Assigned(glWindowPos2dMESA) then Exit;
+ @glWindowPos2fMESA := SDL_GL_GetProcAddress('glWindowPos2fMESA');
+ if not Assigned(glWindowPos2fMESA) then Exit;
+ @glWindowPos2iMESA := SDL_GL_GetProcAddress('glWindowPos2iMESA');
+ if not Assigned(glWindowPos2iMESA) then Exit;
+ @glWindowPos2sMESA := SDL_GL_GetProcAddress('glWindowPos2sMESA');
+ if not Assigned(glWindowPos2sMESA) then Exit;
+ @glWindowPos2ivMESA := SDL_GL_GetProcAddress('glWindowPos2ivMESA');
+ if not Assigned(glWindowPos2ivMESA) then Exit;
+ @glWindowPos2svMESA := SDL_GL_GetProcAddress('glWindowPos2svMESA');
+ if not Assigned(glWindowPos2svMESA) then Exit;
+ @glWindowPos2fvMESA := SDL_GL_GetProcAddress('glWindowPos2fvMESA');
+ if not Assigned(glWindowPos2fvMESA) then Exit;
+ @glWindowPos2dvMESA := SDL_GL_GetProcAddress('glWindowPos2dvMESA');
+ if not Assigned(glWindowPos2dvMESA) then Exit;
+ @glWindowPos3iMESA := SDL_GL_GetProcAddress('glWindowPos3iMESA');
+ if not Assigned(glWindowPos3iMESA) then Exit;
+ @glWindowPos3sMESA := SDL_GL_GetProcAddress('glWindowPos3sMESA');
+ if not Assigned(glWindowPos3sMESA) then Exit;
+ @glWindowPos3fMESA := SDL_GL_GetProcAddress('glWindowPos3fMESA');
+ if not Assigned(glWindowPos3fMESA) then Exit;
+ @glWindowPos3dMESA := SDL_GL_GetProcAddress('glWindowPos3dMESA');
+ if not Assigned(glWindowPos3dMESA) then Exit;
+ @glWindowPos3ivMESA := SDL_GL_GetProcAddress('glWindowPos3ivMESA');
+ if not Assigned(glWindowPos3ivMESA) then Exit;
+ @glWindowPos3svMESA := SDL_GL_GetProcAddress('glWindowPos3svMESA');
+ if not Assigned(glWindowPos3svMESA) then Exit;
+ @glWindowPos3fvMESA := SDL_GL_GetProcAddress('glWindowPos3fvMESA');
+ if not Assigned(glWindowPos3fvMESA) then Exit;
+ @glWindowPos3dvMESA := SDL_GL_GetProcAddress('glWindowPos3dvMESA');
+ if not Assigned(glWindowPos3dvMESA) then Exit;
+ @glWindowPos4iMESA := SDL_GL_GetProcAddress('glWindowPos4iMESA');
+ if not Assigned(glWindowPos4iMESA) then Exit;
+ @glWindowPos4sMESA := SDL_GL_GetProcAddress('glWindowPos4sMESA');
+ if not Assigned(glWindowPos4sMESA) then Exit;
+ @glWindowPos4fMESA := SDL_GL_GetProcAddress('glWindowPos4fMESA');
+ if not Assigned(glWindowPos4fMESA) then Exit;
+ @glWindowPos4dMESA := SDL_GL_GetProcAddress('glWindowPos4dMESA');
+ if not Assigned(glWindowPos4dMESA) then Exit;
+ @glWindowPos4ivMESA := SDL_GL_GetProcAddress('glWindowPos4ivMESA');
+ if not Assigned(glWindowPos4ivMESA) then Exit;
+ @glWindowPos4svMESA := SDL_GL_GetProcAddress('glWindowPos4svMESA');
+ if not Assigned(glWindowPos4svMESA) then Exit;
+ @glWindowPos4fvMESA := SDL_GL_GetProcAddress('glWindowPos4fvMESA');
+ if not Assigned(glWindowPos4fvMESA) then Exit;
+ @glWindowPos4dvMESA := SDL_GL_GetProcAddress('glWindowPos4dvMESA');
+ if not Assigned(glWindowPos4dvMESA) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_OML_interlace: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_OML_interlace', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_OML_resample: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_OML_resample', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_OML_subsample: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_OML_subsample', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_SGIS_generate_mipmap: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_SGIS_generate_mipmap', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_SGIS_multisample: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_SGIS_multisample', extstring) then
+ begin
+ @glSampleMaskSGIS := SDL_GL_GetProcAddress('glSampleMaskSGIS');
+ if not Assigned(glSampleMaskSGIS) then Exit;
+ @glSamplePatternSGIS := SDL_GL_GetProcAddress('glSamplePatternSGIS');
+ if not Assigned(glSamplePatternSGIS) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_SGIS_pixel_texture: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_SGIS_pixel_texture', extstring) then
+ begin
+ @glPixelTexGenParameteriSGIS := SDL_GL_GetProcAddress('glPixelTexGenParameteriSGIS');
+ if not Assigned(glPixelTexGenParameteriSGIS) then Exit;
+ @glPixelTexGenParameterfSGIS := SDL_GL_GetProcAddress('glPixelTexGenParameterfSGIS');
+ if not Assigned(glPixelTexGenParameterfSGIS) then Exit;
+ @glGetPixelTexGenParameterivSGIS := SDL_GL_GetProcAddress('glGetPixelTexGenParameterivSGIS');
+ if not Assigned(glGetPixelTexGenParameterivSGIS) then Exit;
+ @glGetPixelTexGenParameterfvSGIS := SDL_GL_GetProcAddress('glGetPixelTexGenParameterfvSGIS');
+ if not Assigned(glGetPixelTexGenParameterfvSGIS) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_SGIS_texture_border_clamp: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_SGIS_texture_border_clamp', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_SGIS_texture_color_mask: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_SGIS_texture_color_mask', extstring) then
+ begin
+ @glTextureColorMaskSGIS := SDL_GL_GetProcAddress('glTextureColorMaskSGIS');
+ if not Assigned(glTextureColorMaskSGIS) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_SGIS_texture_edge_clamp: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_SGIS_texture_edge_clamp', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_SGIS_texture_lod: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_SGIS_texture_lod', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_SGIS_depth_texture: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_SGIS_depth_texture', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_SGIX_fog_offset: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_SGIX_fog_offset', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_SGIX_interlace: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_SGIX_interlace', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_SGIX_shadow_ambient: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_SGIX_shadow_ambient', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_SGI_color_matrix: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_SGI_color_matrix', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_SGI_color_table: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_SGI_color_table', extstring) then
+ begin
+ @glColorTableSGI := SDL_GL_GetProcAddress('glColorTableSGI');
+ if not Assigned(glColorTableSGI) then Exit;
+ @glCopyColorTableSGI := SDL_GL_GetProcAddress('glCopyColorTableSGI');
+ if not Assigned(glCopyColorTableSGI) then Exit;
+ @glColorTableParameterivSGI := SDL_GL_GetProcAddress('glColorTableParameterivSGI');
+ if not Assigned(glColorTableParameterivSGI) then Exit;
+ @glColorTableParameterfvSGI := SDL_GL_GetProcAddress('glColorTableParameterfvSGI');
+ if not Assigned(glColorTableParameterfvSGI) then Exit;
+ @glGetColorTableSGI := SDL_GL_GetProcAddress('glGetColorTableSGI');
+ if not Assigned(glGetColorTableSGI) then Exit;
+ @glGetColorTableParameterivSGI := SDL_GL_GetProcAddress('glGetColorTableParameterivSGI');
+ if not Assigned(glGetColorTableParameterivSGI) then Exit;
+ @glGetColorTableParameterfvSGI := SDL_GL_GetProcAddress('glGetColorTableParameterfvSGI');
+ if not Assigned(glGetColorTableParameterfvSGI) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_SGI_texture_color_table: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_SGI_texture_color_table', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_SUN_vertex: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_SUN_vertex', extstring) then
+ begin
+ @glColor4ubVertex2fSUN := SDL_GL_GetProcAddress('glColor4ubVertex2fSUN');
+ if not Assigned(glColor4ubVertex2fSUN) then Exit;
+ @glColor4ubVertex2fvSUN := SDL_GL_GetProcAddress('glColor4ubVertex2fvSUN');
+ if not Assigned(glColor4ubVertex2fvSUN) then Exit;
+ @glColor4ubVertex3fSUN := SDL_GL_GetProcAddress('glColor4ubVertex3fSUN');
+ if not Assigned(glColor4ubVertex3fSUN) then Exit;
+ @glColor4ubVertex3fvSUN := SDL_GL_GetProcAddress('glColor4ubVertex3fvSUN');
+ if not Assigned(glColor4ubVertex3fvSUN) then Exit;
+ @glColor3fVertex3fSUN := SDL_GL_GetProcAddress('glColor3fVertex3fSUN');
+ if not Assigned(glColor3fVertex3fSUN) then Exit;
+ @glColor3fVertex3fvSUN := SDL_GL_GetProcAddress('glColor3fVertex3fvSUN');
+ if not Assigned(glColor3fVertex3fvSUN) then Exit;
+ @glNormal3fVertex3fSUN := SDL_GL_GetProcAddress('glNormal3fVertex3fSUN');
+ if not Assigned(glNormal3fVertex3fSUN) then Exit;
+ @glNormal3fVertex3fvSUN := SDL_GL_GetProcAddress('glNormal3fVertex3fvSUN');
+ if not Assigned(glNormal3fVertex3fvSUN) then Exit;
+ @glColor4fNormal3fVertex3fSUN := SDL_GL_GetProcAddress('glColor4fNormal3fVertex3fSUN');
+ if not Assigned(glColor4fNormal3fVertex3fSUN) then Exit;
+ @glColor4fNormal3fVertex3fvSUN := SDL_GL_GetProcAddress('glColor4fNormal3fVertex3fvSUN');
+ if not Assigned(glColor4fNormal3fVertex3fvSUN) then Exit;
+ @glTexCoord2fVertex3fSUN := SDL_GL_GetProcAddress('glTexCoord2fVertex3fSUN');
+ if not Assigned(glTexCoord2fVertex3fSUN) then Exit;
+ @glTexCoord2fVertex3fvSUN := SDL_GL_GetProcAddress('glTexCoord2fVertex3fvSUN');
+ if not Assigned(glTexCoord2fVertex3fvSUN) then Exit;
+ @glTexCoord4fVertex4fSUN := SDL_GL_GetProcAddress('glTexCoord4fVertex4fSUN');
+ if not Assigned(glTexCoord4fVertex4fSUN) then Exit;
+ @glTexCoord4fVertex4fvSUN := SDL_GL_GetProcAddress('glTexCoord4fVertex4fvSUN');
+ if not Assigned(glTexCoord4fVertex4fvSUN) then Exit;
+ @glTexCoord2fColor4ubVertex3fSUN := SDL_GL_GetProcAddress('glTexCoord2fColor4ubVertex3fSUN');
+ if not Assigned(glTexCoord2fColor4ubVertex3fSUN) then Exit;
+ @glTexCoord2fColor4ubVertex3fvSUN := SDL_GL_GetProcAddress('glTexCoord2fColor4ubVertex3fvSUN');
+ if not Assigned(glTexCoord2fColor4ubVertex3fvSUN) then Exit;
+ @glTexCoord2fColor3fVertex3fSUN := SDL_GL_GetProcAddress('glTexCoord2fColor3fVertex3fSUN');
+ if not Assigned(glTexCoord2fColor3fVertex3fSUN) then Exit;
+ @glTexCoord2fColor3fVertex3fvSUN := SDL_GL_GetProcAddress('glTexCoord2fColor3fVertex3fvSUN');
+ if not Assigned(glTexCoord2fColor3fVertex3fvSUN) then Exit;
+ @glTexCoord2fNormal3fVertex3fSUN := SDL_GL_GetProcAddress('glTexCoord2fNormal3fVertex3fSUN');
+ if not Assigned(glTexCoord2fNormal3fVertex3fSUN) then Exit;
+ @glTexCoord2fNormal3fVertex3fvSUN := SDL_GL_GetProcAddress('glTexCoord2fNormal3fVertex3fvSUN');
+ if not Assigned(glTexCoord2fNormal3fVertex3fvSUN) then Exit;
+ @glTexCoord2fColor4fNormal3fVertex3fSUN := SDL_GL_GetProcAddress('glTexCoord2fColor4fNormal3fVertex3fSUN');
+ if not Assigned(glTexCoord2fColor4fNormal3fVertex3fSUN) then Exit;
+ @glTexCoord2fColor4fNormal3fVertex3fvSUN := SDL_GL_GetProcAddress('glTexCoord2fColor4fNormal3fVertex3fvSUN');
+ if not Assigned(glTexCoord2fColor4fNormal3fVertex3fvSUN) then Exit;
+ @glTexCoord4fColor4fNormal3fVertex4fSUN := SDL_GL_GetProcAddress('glTexCoord4fColor4fNormal3fVertex4fSUN');
+ if not Assigned(glTexCoord4fColor4fNormal3fVertex4fSUN) then Exit;
+ @glTexCoord4fColor4fNormal3fVertex4fvSUN := SDL_GL_GetProcAddress('glTexCoord4fColor4fNormal3fVertex4fvSUN');
+ if not Assigned(glTexCoord4fColor4fNormal3fVertex4fvSUN) then Exit;
+ @glReplacementCodeuiVertex3fSUN := SDL_GL_GetProcAddress('glReplacementCodeuiVertex3fSUN');
+ if not Assigned(glReplacementCodeuiVertex3fSUN) then Exit;
+ @glReplacementCodeuiVertex3fvSUN := SDL_GL_GetProcAddress('glReplacementCodeuiVertex3fvSUN');
+ if not Assigned(glReplacementCodeuiVertex3fvSUN) then Exit;
+ @glReplacementCodeuiColor4ubVertex3fSUN := SDL_GL_GetProcAddress('glReplacementCodeuiColor4ubVertex3fSUN');
+ if not Assigned(glReplacementCodeuiColor4ubVertex3fSUN) then Exit;
+ @glReplacementCodeuiColor4ubVertex3fvSUN := SDL_GL_GetProcAddress('glReplacementCodeuiColor4ubVertex3fvSUN');
+ if not Assigned(glReplacementCodeuiColor4ubVertex3fvSUN) then Exit;
+ @glReplacementCodeuiColor3fVertex3fSUN := SDL_GL_GetProcAddress('glReplacementCodeuiColor3fVertex3fSUN');
+ if not Assigned(glReplacementCodeuiColor3fVertex3fSUN) then Exit;
+ @glReplacementCodeuiColor3fVertex3fvSUN := SDL_GL_GetProcAddress('glReplacementCodeuiColor3fVertex3fvSUN');
+ if not Assigned(glReplacementCodeuiColor3fVertex3fvSUN) then Exit;
+ @glReplacementCodeuiNormal3fVertex3fSUN := SDL_GL_GetProcAddress('glReplacementCodeuiNormal3fVertex3fSUN');
+ if not Assigned(glReplacementCodeuiNormal3fVertex3fSUN) then Exit;
+ @glReplacementCodeuiNormal3fVertex3fvSUN := SDL_GL_GetProcAddress('glReplacementCodeuiNormal3fVertex3fvSUN');
+ if not Assigned(glReplacementCodeuiNormal3fVertex3fvSUN) then Exit;
+ @glReplacementCodeuiColor4fNormal3fVertex3fSUN := SDL_GL_GetProcAddress('glReplacementCodeuiColor4fNormal3fVertex3fSUN');
+ if not Assigned(glReplacementCodeuiColor4fNormal3fVertex3fSUN) then Exit;
+ @glReplacementCodeuiColor4fNormal3fVertex3fvSUN := SDL_GL_GetProcAddress('glReplacementCodeuiColor4fNormal3fVertex3fvSUN');
+ if not Assigned(glReplacementCodeuiColor4fNormal3fVertex3fvSUN) then Exit;
+ @glReplacementCodeuiTexCoord2fVertex3fSUN := SDL_GL_GetProcAddress('glReplacementCodeuiTexCoord2fVertex3fSUN');
+ if not Assigned(glReplacementCodeuiTexCoord2fVertex3fSUN) then Exit;
+ @glReplacementCodeuiTexCoord2fVertex3fvSUN := SDL_GL_GetProcAddress('glReplacementCodeuiTexCoord2fVertex3fvSUN');
+ if not Assigned(glReplacementCodeuiTexCoord2fVertex3fvSUN) then Exit;
+ @glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN := SDL_GL_GetProcAddress('glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN');
+ if not Assigned(glReplacementCodeuiTexCoord2fNormal3fVertex3fSUN) then Exit;
+ @glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN := SDL_GL_GetProcAddress('glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN');
+ if not Assigned(glReplacementCodeuiTexCoord2fNormal3fVertex3fvSUN) then Exit;
+ @glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN := SDL_GL_GetProcAddress('glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN');
+ if not Assigned(glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fSUN) then Exit;
+ @glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN := SDL_GL_GetProcAddress('glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN');
+ if not Assigned(glReplacementCodeuiTexCoord2fColor4fNormal3fVertex3fvSUN) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_fragment_program: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_fragment_program', extstring) then
+ begin
+ @glProgramStringARB := SDL_GL_GetProcAddress('glProgramStringARB');
+ if not Assigned(glProgramStringARB) then Exit;
+ @glBindProgramARB := SDL_GL_GetProcAddress('glBindProgramARB');
+ if not Assigned(glBindProgramARB) then Exit;
+ @glDeleteProgramsARB := SDL_GL_GetProcAddress('glDeleteProgramsARB');
+ if not Assigned(glDeleteProgramsARB) then Exit;
+ @glGenProgramsARB := SDL_GL_GetProcAddress('glGenProgramsARB');
+ if not Assigned(glGenProgramsARB) then Exit;
+ @glProgramEnvParameter4dARB := SDL_GL_GetProcAddress('glProgramEnvParameter4dARB');
+ if not Assigned(glProgramEnvParameter4dARB) then Exit;
+ @glProgramEnvParameter4dvARB := SDL_GL_GetProcAddress('glProgramEnvParameter4dvARB');
+ if not Assigned(glProgramEnvParameter4dvARB) then Exit;
+ @glProgramEnvParameter4fARB := SDL_GL_GetProcAddress('glProgramEnvParameter4fARB');
+ if not Assigned(glProgramEnvParameter4fARB) then Exit;
+ @glProgramEnvParameter4fvARB := SDL_GL_GetProcAddress('glProgramEnvParameter4fvARB');
+ if not Assigned(glProgramEnvParameter4fvARB) then Exit;
+ @glProgramLocalParameter4dARB := SDL_GL_GetProcAddress('glProgramLocalParameter4dARB');
+ if not Assigned(glProgramLocalParameter4dARB) then Exit;
+ @glProgramLocalParameter4dvARB := SDL_GL_GetProcAddress('glProgramLocalParameter4dvARB');
+ if not Assigned(glProgramLocalParameter4dvARB) then Exit;
+ @glProgramLocalParameter4fARB := SDL_GL_GetProcAddress('glProgramLocalParameter4fARB');
+ if not Assigned(glProgramLocalParameter4fARB) then Exit;
+ @glProgramLocalParameter4fvARB := SDL_GL_GetProcAddress('glProgramLocalParameter4fvARB');
+ if not Assigned(glProgramLocalParameter4fvARB) then Exit;
+ @glGetProgramEnvParameterdvARB := SDL_GL_GetProcAddress('glGetProgramEnvParameterdvARB');
+ if not Assigned(glGetProgramEnvParameterdvARB) then Exit;
+ @glGetProgramEnvParameterfvARB := SDL_GL_GetProcAddress('glGetProgramEnvParameterfvARB');
+ if not Assigned(glGetProgramEnvParameterfvARB) then Exit;
+ @glGetProgramLocalParameterdvARB := SDL_GL_GetProcAddress('glGetProgramLocalParameterdvARB');
+ if not Assigned(glGetProgramLocalParameterdvARB) then Exit;
+ @glGetProgramLocalParameterfvARB := SDL_GL_GetProcAddress('glGetProgramLocalParameterfvARB');
+ if not Assigned(glGetProgramLocalParameterfvARB) then Exit;
+ @glGetProgramivARB := SDL_GL_GetProcAddress('glGetProgramivARB');
+ if not Assigned(glGetProgramivARB) then Exit;
+ @glGetProgramStringARB := SDL_GL_GetProcAddress('glGetProgramStringARB');
+ if not Assigned(glGetProgramStringARB) then Exit;
+ @glIsProgramARB := SDL_GL_GetProcAddress('glIsProgramARB');
+ if not Assigned(glIsProgramARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ATI_text_fragment_shader: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ATI_text_fragment_shader', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_APPLE_client_storage: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_APPLE_client_storage', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_APPLE_element_array: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_APPLE_element_array', extstring) then
+ begin
+ @glElementPointerAPPLE := SDL_GL_GetProcAddress('glElementPointerAPPLE');
+ if not Assigned(glElementPointerAPPLE) then Exit;
+ @glDrawElementArrayAPPLE := SDL_GL_GetProcAddress('glDrawElementArrayAPPLE');
+ if not Assigned(glDrawElementArrayAPPLE) then Exit;
+ @glDrawRangeElementArrayAPPLE := SDL_GL_GetProcAddress('glDrawRangeElementArrayAPPLE');
+ if not Assigned(glDrawRangeElementArrayAPPLE) then Exit;
+ @glMultiDrawElementArrayAPPLE := SDL_GL_GetProcAddress('glMultiDrawElementArrayAPPLE');
+ if not Assigned(glMultiDrawElementArrayAPPLE) then Exit;
+ @glMultiDrawRangeElementArrayAPPLE := SDL_GL_GetProcAddress('glMultiDrawRangeElementArrayAPPLE');
+ if not Assigned(glMultiDrawRangeElementArrayAPPLE) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_APPLE_fence: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_APPLE_fence', extstring) then
+ begin
+ @glGenFencesAPPLE := SDL_GL_GetProcAddress('glGenFencesAPPLE');
+ if not Assigned(glGenFencesAPPLE) then Exit;
+ @glDeleteFencesAPPLE := SDL_GL_GetProcAddress('glDeleteFencesAPPLE');
+ if not Assigned(glDeleteFencesAPPLE) then Exit;
+ @glSetFenceAPPLE := SDL_GL_GetProcAddress('glSetFenceAPPLE');
+ if not Assigned(glSetFenceAPPLE) then Exit;
+ @glIsFenceAPPLE := SDL_GL_GetProcAddress('glIsFenceAPPLE');
+ if not Assigned(glIsFenceAPPLE) then Exit;
+ @glTestFenceAPPLE := SDL_GL_GetProcAddress('glTestFenceAPPLE');
+ if not Assigned(glTestFenceAPPLE) then Exit;
+ @glFinishFenceAPPLE := SDL_GL_GetProcAddress('glFinishFenceAPPLE');
+ if not Assigned(glFinishFenceAPPLE) then Exit;
+ @glTestObjectAPPLE := SDL_GL_GetProcAddress('glTestObjectAPPLE');
+ if not Assigned(glTestObjectAPPLE) then Exit;
+ @glFinishObjectAPPLE := SDL_GL_GetProcAddress('glFinishObjectAPPLE');
+ if not Assigned(glFinishObjectAPPLE) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_APPLE_vertex_array_object: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_APPLE_vertex_array_object', extstring) then
+ begin
+ @glBindVertexArrayAPPLE := SDL_GL_GetProcAddress('glBindVertexArrayAPPLE');
+ if not Assigned(glBindVertexArrayAPPLE) then Exit;
+ @glDeleteVertexArraysAPPLE := SDL_GL_GetProcAddress('glDeleteVertexArraysAPPLE');
+ if not Assigned(glDeleteVertexArraysAPPLE) then Exit;
+ @glGenVertexArraysAPPLE := SDL_GL_GetProcAddress('glGenVertexArraysAPPLE');
+ if not Assigned(glGenVertexArraysAPPLE) then Exit;
+ @glIsVertexArrayAPPLE := SDL_GL_GetProcAddress('glIsVertexArrayAPPLE');
+ if not Assigned(glIsVertexArrayAPPLE) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_APPLE_vertex_array_range: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_APPLE_vertex_array_range', extstring) then
+ begin
+ @glVertexArrayRangeAPPLE := SDL_GL_GetProcAddress('glVertexArrayRangeAPPLE');
+ if not Assigned(glVertexArrayRangeAPPLE) then Exit;
+ @glFlushVertexArrayRangeAPPLE := SDL_GL_GetProcAddress('glFlushVertexArrayRangeAPPLE');
+ if not Assigned(glFlushVertexArrayRangeAPPLE) then Exit;
+ @glVertexArrayParameteriAPPLE := SDL_GL_GetProcAddress('glVertexArrayParameteriAPPLE');
+ if not Assigned(glVertexArrayParameteriAPPLE) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+{$IFDEF WINDOWS}
+function Load_WGL_ARB_pixel_format: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ @wglGetExtensionsStringARB := SDL_GL_GetProcAddress('wglGetExtensionsStringARB');
+ if not Assigned(wglGetExtensionsStringARB) then Exit;
+ extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+ if glext_ExtensionSupported('WGL_ARB_pixel_format', extstring) then
+ begin
+ @wglGetPixelFormatAttribivARB := SDL_GL_GetProcAddress('wglGetPixelFormatAttribivARB');
+ if not Assigned(wglGetPixelFormatAttribivARB) then Exit;
+ @wglGetPixelFormatAttribfvARB := SDL_GL_GetProcAddress('wglGetPixelFormatAttribfvARB');
+ if not Assigned(wglGetPixelFormatAttribfvARB) then Exit;
+ @wglChoosePixelFormatARB := SDL_GL_GetProcAddress('wglChoosePixelFormatARB');
+ if not Assigned(wglChoosePixelFormatARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_WGL_ARB_make_current_read: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ @wglGetExtensionsStringARB := SDL_GL_GetProcAddress('wglGetExtensionsStringARB');
+ if not Assigned(wglGetExtensionsStringARB) then Exit;
+ extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+ if glext_ExtensionSupported('WGL_ARB_make_current_read', extstring) then
+ begin
+ @wglMakeContextCurrentARB := SDL_GL_GetProcAddress('wglMakeContextCurrentARB');
+ if not Assigned(wglMakeContextCurrentARB) then Exit;
+ @wglGetCurrentReadDCARB := SDL_GL_GetProcAddress('wglGetCurrentReadDCARB');
+ if not Assigned(wglGetCurrentReadDCARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_WGL_ARB_pbuffer: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ @wglGetExtensionsStringARB := SDL_GL_GetProcAddress('wglGetExtensionsStringARB');
+ if not Assigned(wglGetExtensionsStringARB) then Exit;
+ extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+ if glext_ExtensionSupported('WGL_ARB_pbuffer', extstring) then
+ begin
+ @wglCreatePbufferARB := SDL_GL_GetProcAddress('wglCreatePbufferARB');
+ if not Assigned(wglCreatePbufferARB) then Exit;
+ @wglGetPbufferDCARB := SDL_GL_GetProcAddress('wglGetPbufferDCARB');
+ if not Assigned(wglGetPbufferDCARB) then Exit;
+ @wglReleasePbufferDCARB := SDL_GL_GetProcAddress('wglReleasePbufferDCARB');
+ if not Assigned(wglReleasePbufferDCARB) then Exit;
+ @wglDestroyPbufferARB := SDL_GL_GetProcAddress('wglDestroyPbufferARB');
+ if not Assigned(wglDestroyPbufferARB) then Exit;
+ @wglQueryPbufferARB := SDL_GL_GetProcAddress('wglQueryPbufferARB');
+ if not Assigned(wglQueryPbufferARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_WGL_EXT_swap_control: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ @wglGetExtensionsStringARB := SDL_GL_GetProcAddress('wglGetExtensionsStringARB');
+ if not Assigned(wglGetExtensionsStringARB) then Exit;
+ extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+ if glext_ExtensionSupported('WGL_EXT_swap_control', extstring) then
+ begin
+ @wglSwapIntervalEXT := SDL_GL_GetProcAddress('wglSwapIntervalEXT');
+ if not Assigned(wglSwapIntervalEXT) then Exit;
+ @wglGetSwapIntervalEXT := SDL_GL_GetProcAddress('wglGetSwapIntervalEXT');
+ if not Assigned(wglGetSwapIntervalEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_WGL_ARB_render_texture: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ @wglGetExtensionsStringARB := SDL_GL_GetProcAddress('wglGetExtensionsStringARB');
+ if not Assigned(wglGetExtensionsStringARB) then Exit;
+ extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+ if glext_ExtensionSupported('WGL_ARB_render_texture', extstring) then
+ begin
+ @wglBindTexImageARB := SDL_GL_GetProcAddress('wglBindTexImageARB');
+ if not Assigned(wglBindTexImageARB) then Exit;
+ @wglReleaseTexImageARB := SDL_GL_GetProcAddress('wglReleaseTexImageARB');
+ if not Assigned(wglReleaseTexImageARB) then Exit;
+ @wglSetPbufferAttribARB := SDL_GL_GetProcAddress('wglSetPbufferAttribARB');
+ if not Assigned(wglSetPbufferAttribARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_WGL_EXT_extensions_string: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ @wglGetExtensionsStringARB := SDL_GL_GetProcAddress('wglGetExtensionsStringARB');
+ if not Assigned(wglGetExtensionsStringARB) then Exit;
+ extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+ if glext_ExtensionSupported('WGL_EXT_extensions_string', extstring) then
+ begin
+ @wglGetExtensionsStringEXT := SDL_GL_GetProcAddress('wglGetExtensionsStringEXT');
+ if not Assigned(wglGetExtensionsStringEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_WGL_EXT_make_current_read: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ @wglGetExtensionsStringARB := SDL_GL_GetProcAddress('wglGetExtensionsStringARB');
+ if not Assigned(wglGetExtensionsStringARB) then Exit;
+ extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+ if glext_ExtensionSupported('WGL_EXT_make_current_read', extstring) then
+ begin
+ @wglMakeContextCurrentEXT := SDL_GL_GetProcAddress('wglMakeContextCurrentEXT');
+ if not Assigned(wglMakeContextCurrentEXT) then Exit;
+ @wglGetCurrentReadDCEXT := SDL_GL_GetProcAddress('wglGetCurrentReadDCEXT');
+ if not Assigned(wglGetCurrentReadDCEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_WGL_EXT_pbuffer: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ @wglGetExtensionsStringARB := SDL_GL_GetProcAddress('wglGetExtensionsStringARB');
+ if not Assigned(wglGetExtensionsStringARB) then Exit;
+ extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+ if glext_ExtensionSupported('WGL_EXT_pbuffer', extstring) then
+ begin
+ @wglCreatePbufferEXT := SDL_GL_GetProcAddress('wglCreatePbufferEXT');
+ if not Assigned(wglCreatePbufferEXT) then Exit;
+ @wglGetPbufferDCEXT := SDL_GL_GetProcAddress('wglGetPbufferDCEXT');
+ if not Assigned(wglGetPbufferDCEXT) then Exit;
+ @wglReleasePbufferDCEXT := SDL_GL_GetProcAddress('wglReleasePbufferDCEXT');
+ if not Assigned(wglReleasePbufferDCEXT) then Exit;
+ @wglDestroyPbufferEXT := SDL_GL_GetProcAddress('wglDestroyPbufferEXT');
+ if not Assigned(wglDestroyPbufferEXT) then Exit;
+ @wglQueryPbufferEXT := SDL_GL_GetProcAddress('wglQueryPbufferEXT');
+ if not Assigned(wglQueryPbufferEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_WGL_EXT_pixel_format: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ @wglGetExtensionsStringARB := SDL_GL_GetProcAddress('wglGetExtensionsStringARB');
+ if not Assigned(wglGetExtensionsStringARB) then Exit;
+ extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+ if glext_ExtensionSupported('WGL_EXT_pixel_format', extstring) then
+ begin
+ @wglGetPixelFormatAttribivEXT := SDL_GL_GetProcAddress('wglGetPixelFormatAttribivEXT');
+ if not Assigned(wglGetPixelFormatAttribivEXT) then Exit;
+ @wglGetPixelFormatAttribfvEXT := SDL_GL_GetProcAddress('wglGetPixelFormatAttribfvEXT');
+ if not Assigned(wglGetPixelFormatAttribfvEXT) then Exit;
+ @wglChoosePixelFormatEXT := SDL_GL_GetProcAddress('wglChoosePixelFormatEXT');
+ if not Assigned(wglChoosePixelFormatEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_WGL_I3D_digital_video_control: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ @wglGetExtensionsStringARB := SDL_GL_GetProcAddress('wglGetExtensionsStringARB');
+ if not Assigned(wglGetExtensionsStringARB) then Exit;
+ extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+ if glext_ExtensionSupported('WGL_I3D_digital_video_control', extstring) then
+ begin
+ @wglGetDigitalVideoParametersI3D := SDL_GL_GetProcAddress('wglGetDigitalVideoParametersI3D');
+ if not Assigned(wglGetDigitalVideoParametersI3D) then Exit;
+ @wglSetDigitalVideoParametersI3D := SDL_GL_GetProcAddress('wglSetDigitalVideoParametersI3D');
+ if not Assigned(wglSetDigitalVideoParametersI3D) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_WGL_I3D_gamma: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ @wglGetExtensionsStringARB := SDL_GL_GetProcAddress('wglGetExtensionsStringARB');
+ if not Assigned(wglGetExtensionsStringARB) then Exit;
+ extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+ if glext_ExtensionSupported('WGL_I3D_gamma', extstring) then
+ begin
+ @wglGetGammaTableParametersI3D := SDL_GL_GetProcAddress('wglGetGammaTableParametersI3D');
+ if not Assigned(wglGetGammaTableParametersI3D) then Exit;
+ @wglSetGammaTableParametersI3D := SDL_GL_GetProcAddress('wglSetGammaTableParametersI3D');
+ if not Assigned(wglSetGammaTableParametersI3D) then Exit;
+ @wglGetGammaTableI3D := SDL_GL_GetProcAddress('wglGetGammaTableI3D');
+ if not Assigned(wglGetGammaTableI3D) then Exit;
+ @wglSetGammaTableI3D := SDL_GL_GetProcAddress('wglSetGammaTableI3D');
+ if not Assigned(wglSetGammaTableI3D) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_WGL_I3D_genlock: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ @wglGetExtensionsStringARB := SDL_GL_GetProcAddress('wglGetExtensionsStringARB');
+ if not Assigned(wglGetExtensionsStringARB) then Exit;
+ extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+ if glext_ExtensionSupported('WGL_I3D_genlock', extstring) then
+ begin
+ @wglEnableGenlockI3D := SDL_GL_GetProcAddress('wglEnableGenlockI3D');
+ if not Assigned(wglEnableGenlockI3D) then Exit;
+ @wglDisableGenlockI3D := SDL_GL_GetProcAddress('wglDisableGenlockI3D');
+ if not Assigned(wglDisableGenlockI3D) then Exit;
+ @wglIsEnabledGenlockI3D := SDL_GL_GetProcAddress('wglIsEnabledGenlockI3D');
+ if not Assigned(wglIsEnabledGenlockI3D) then Exit;
+ @wglGenlockSourceI3D := SDL_GL_GetProcAddress('wglGenlockSourceI3D');
+ if not Assigned(wglGenlockSourceI3D) then Exit;
+ @wglGetGenlockSourceI3D := SDL_GL_GetProcAddress('wglGetGenlockSourceI3D');
+ if not Assigned(wglGetGenlockSourceI3D) then Exit;
+ @wglGenlockSourceEdgeI3D := SDL_GL_GetProcAddress('wglGenlockSourceEdgeI3D');
+ if not Assigned(wglGenlockSourceEdgeI3D) then Exit;
+ @wglGetGenlockSourceEdgeI3D := SDL_GL_GetProcAddress('wglGetGenlockSourceEdgeI3D');
+ if not Assigned(wglGetGenlockSourceEdgeI3D) then Exit;
+ @wglGenlockSampleRateI3D := SDL_GL_GetProcAddress('wglGenlockSampleRateI3D');
+ if not Assigned(wglGenlockSampleRateI3D) then Exit;
+ @wglGetGenlockSampleRateI3D := SDL_GL_GetProcAddress('wglGetGenlockSampleRateI3D');
+ if not Assigned(wglGetGenlockSampleRateI3D) then Exit;
+ @wglGenlockSourceDelayI3D := SDL_GL_GetProcAddress('wglGenlockSourceDelayI3D');
+ if not Assigned(wglGenlockSourceDelayI3D) then Exit;
+ @wglGetGenlockSourceDelayI3D := SDL_GL_GetProcAddress('wglGetGenlockSourceDelayI3D');
+ if not Assigned(wglGetGenlockSourceDelayI3D) then Exit;
+ @wglQueryGenlockMaxSourceDelayI3D := SDL_GL_GetProcAddress('wglQueryGenlockMaxSourceDelayI3D');
+ if not Assigned(wglQueryGenlockMaxSourceDelayI3D) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+{$ENDIF}
+
+function Load_GL_ARB_matrix_palette: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_matrix_palette', extstring) then
+ begin
+ @glCurrentPaletteMatrixARB := SDL_GL_GetProcAddress('glCurrentPaletteMatrixARB');
+ if not Assigned(glCurrentPaletteMatrixARB) then Exit;
+ @glMatrixIndexubvARB := SDL_GL_GetProcAddress('glMatrixIndexubvARB');
+ if not Assigned(glMatrixIndexubvARB) then Exit;
+ @glMatrixIndexusvARB := SDL_GL_GetProcAddress('glMatrixIndexusvARB');
+ if not Assigned(glMatrixIndexusvARB) then Exit;
+ @glMatrixIndexuivARB := SDL_GL_GetProcAddress('glMatrixIndexuivARB');
+ if not Assigned(glMatrixIndexuivARB) then Exit;
+ @glMatrixIndexPointerARB := SDL_GL_GetProcAddress('glMatrixIndexPointerARB');
+ if not Assigned(glMatrixIndexPointerARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_element_array: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_element_array', extstring) then
+ begin
+ @glElementPointerNV := SDL_GL_GetProcAddress('glElementPointerNV');
+ if not Assigned(glElementPointerNV) then Exit;
+ @glDrawElementArrayNV := SDL_GL_GetProcAddress('glDrawElementArrayNV');
+ if not Assigned(glDrawElementArrayNV) then Exit;
+ @glDrawRangeElementArrayNV := SDL_GL_GetProcAddress('glDrawRangeElementArrayNV');
+ if not Assigned(glDrawRangeElementArrayNV) then Exit;
+ @glMultiDrawElementArrayNV := SDL_GL_GetProcAddress('glMultiDrawElementArrayNV');
+ if not Assigned(glMultiDrawElementArrayNV) then Exit;
+ @glMultiDrawRangeElementArrayNV := SDL_GL_GetProcAddress('glMultiDrawRangeElementArrayNV');
+ if not Assigned(glMultiDrawRangeElementArrayNV) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_float_buffer: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_float_buffer', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_fragment_program: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_fragment_program', extstring) then
+ begin
+ @glProgramNamedParameter4fNV := SDL_GL_GetProcAddress('glProgramNamedParameter4fNV');
+ if not Assigned(glProgramNamedParameter4fNV) then Exit;
+ @glProgramNamedParameter4dNV := SDL_GL_GetProcAddress('glProgramNamedParameter4dNV');
+ if not Assigned(glProgramNamedParameter4dNV) then Exit;
+ @glGetProgramNamedParameterfvNV := SDL_GL_GetProcAddress('glGetProgramNamedParameterfvNV');
+ if not Assigned(glGetProgramNamedParameterfvNV) then Exit;
+ @glGetProgramNamedParameterdvNV := SDL_GL_GetProcAddress('glGetProgramNamedParameterdvNV');
+ if not Assigned(glGetProgramNamedParameterdvNV) then Exit;
+ @glProgramLocalParameter4dARB := SDL_GL_GetProcAddress('glProgramLocalParameter4dARB');
+ if not Assigned(glProgramLocalParameter4dARB) then Exit;
+ @glProgramLocalParameter4dvARB := SDL_GL_GetProcAddress('glProgramLocalParameter4dvARB');
+ if not Assigned(glProgramLocalParameter4dvARB) then Exit;
+ @glProgramLocalParameter4fARB := SDL_GL_GetProcAddress('glProgramLocalParameter4fARB');
+ if not Assigned(glProgramLocalParameter4fARB) then Exit;
+ @glProgramLocalParameter4fvARB := SDL_GL_GetProcAddress('glProgramLocalParameter4fvARB');
+ if not Assigned(glProgramLocalParameter4fvARB) then Exit;
+ @glGetProgramLocalParameterdvARB := SDL_GL_GetProcAddress('glGetProgramLocalParameterdvARB');
+ if not Assigned(glGetProgramLocalParameterdvARB) then Exit;
+ @glGetProgramLocalParameterfvARB := SDL_GL_GetProcAddress('glGetProgramLocalParameterfvARB');
+ if not Assigned(glGetProgramLocalParameterfvARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_primitive_restart: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_primitive_restart', extstring) then
+ begin
+ @glPrimitiveRestartNV := SDL_GL_GetProcAddress('glPrimitiveRestartNV');
+ if not Assigned(glPrimitiveRestartNV) then Exit;
+ @glPrimitiveRestartIndexNV := SDL_GL_GetProcAddress('glPrimitiveRestartIndexNV');
+ if not Assigned(glPrimitiveRestartIndexNV) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_vertex_program2: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_vertex_program2', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+{$IFDEF WINDOWS}
+function Load_WGL_NV_render_texture_rectangle: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ @wglGetExtensionsStringARB := SDL_GL_GetProcAddress('wglGetExtensionsStringARB');
+ if not Assigned(wglGetExtensionsStringARB) then Exit;
+ extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+ if glext_ExtensionSupported('WGL_NV_render_texture_rectangle', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+{$ENDIF}
+
+function Load_GL_NV_pixel_data_range: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_pixel_data_range', extstring) then
+ begin
+ @glPixelDataRangeNV := SDL_GL_GetProcAddress('glPixelDataRangeNV');
+ if not Assigned(glPixelDataRangeNV) then Exit;
+ @glFlushPixelDataRangeNV := SDL_GL_GetProcAddress('glFlushPixelDataRangeNV');
+ if not Assigned(glFlushPixelDataRangeNV) then Exit;
+ {$IFDEF WINDOWS}
+ @wglAllocateMemoryNV := SDL_GL_GetProcAddress('wglAllocateMemoryNV');
+ if not Assigned(wglAllocateMemoryNV) then Exit;
+ @wglFreeMemoryNV := SDL_GL_GetProcAddress('wglFreeMemoryNV');
+ if not Assigned(wglFreeMemoryNV) then Exit;
+ {$ENDIF}
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_texture_rectangle: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_texture_rectangle', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_S3_s3tc: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_S3_s3tc', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ATI_draw_buffers: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ATI_draw_buffers', extstring) then
+ begin
+ @glDrawBuffersATI := SDL_GL_GetProcAddress('glDrawBuffersATI');
+ if not Assigned(glDrawBuffersATI) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+{$IFDEF WINDOWS}
+function Load_WGL_ATI_pixel_format_float: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ @wglGetExtensionsStringARB := SDL_GL_GetProcAddress('wglGetExtensionsStringARB');
+ if not Assigned(wglGetExtensionsStringARB) then Exit;
+ extstring := wglGetExtensionsStringARB(wglGetCurrentDC);
+
+ if glext_ExtensionSupported('WGL_ATI_pixel_format_float', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+{$ENDIF}
+
+function Load_GL_ATI_texture_env_combine3: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ATI_texture_env_combine3', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ATI_texture_float: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ATI_texture_float', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_texture_expand_normal: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_texture_expand_normal', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_half_float: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_half_float', extstring) then
+ begin
+ @glVertex2hNV := SDL_GL_GetProcAddress('glVertex2hNV');
+ if not Assigned(glVertex2hNV) then Exit;
+ @glVertex2hvNV := SDL_GL_GetProcAddress('glVertex2hvNV');
+ if not Assigned(glVertex2hvNV) then Exit;
+ @glVertex3hNV := SDL_GL_GetProcAddress('glVertex3hNV');
+ if not Assigned(glVertex3hNV) then Exit;
+ @glVertex3hvNV := SDL_GL_GetProcAddress('glVertex3hvNV');
+ if not Assigned(glVertex3hvNV) then Exit;
+ @glVertex4hNV := SDL_GL_GetProcAddress('glVertex4hNV');
+ if not Assigned(glVertex4hNV) then Exit;
+ @glVertex4hvNV := SDL_GL_GetProcAddress('glVertex4hvNV');
+ if not Assigned(glVertex4hvNV) then Exit;
+ @glNormal3hNV := SDL_GL_GetProcAddress('glNormal3hNV');
+ if not Assigned(glNormal3hNV) then Exit;
+ @glNormal3hvNV := SDL_GL_GetProcAddress('glNormal3hvNV');
+ if not Assigned(glNormal3hvNV) then Exit;
+ @glColor3hNV := SDL_GL_GetProcAddress('glColor3hNV');
+ if not Assigned(glColor3hNV) then Exit;
+ @glColor3hvNV := SDL_GL_GetProcAddress('glColor3hvNV');
+ if not Assigned(glColor3hvNV) then Exit;
+ @glColor4hNV := SDL_GL_GetProcAddress('glColor4hNV');
+ if not Assigned(glColor4hNV) then Exit;
+ @glColor4hvNV := SDL_GL_GetProcAddress('glColor4hvNV');
+ if not Assigned(glColor4hvNV) then Exit;
+ @glTexCoord1hNV := SDL_GL_GetProcAddress('glTexCoord1hNV');
+ if not Assigned(glTexCoord1hNV) then Exit;
+ @glTexCoord1hvNV := SDL_GL_GetProcAddress('glTexCoord1hvNV');
+ if not Assigned(glTexCoord1hvNV) then Exit;
+ @glTexCoord2hNV := SDL_GL_GetProcAddress('glTexCoord2hNV');
+ if not Assigned(glTexCoord2hNV) then Exit;
+ @glTexCoord2hvNV := SDL_GL_GetProcAddress('glTexCoord2hvNV');
+ if not Assigned(glTexCoord2hvNV) then Exit;
+ @glTexCoord3hNV := SDL_GL_GetProcAddress('glTexCoord3hNV');
+ if not Assigned(glTexCoord3hNV) then Exit;
+ @glTexCoord3hvNV := SDL_GL_GetProcAddress('glTexCoord3hvNV');
+ if not Assigned(glTexCoord3hvNV) then Exit;
+ @glTexCoord4hNV := SDL_GL_GetProcAddress('glTexCoord4hNV');
+ if not Assigned(glTexCoord4hNV) then Exit;
+ @glTexCoord4hvNV := SDL_GL_GetProcAddress('glTexCoord4hvNV');
+ if not Assigned(glTexCoord4hvNV) then Exit;
+ @glMultiTexCoord1hNV := SDL_GL_GetProcAddress('glMultiTexCoord1hNV');
+ if not Assigned(glMultiTexCoord1hNV) then Exit;
+ @glMultiTexCoord1hvNV := SDL_GL_GetProcAddress('glMultiTexCoord1hvNV');
+ if not Assigned(glMultiTexCoord1hvNV) then Exit;
+ @glMultiTexCoord2hNV := SDL_GL_GetProcAddress('glMultiTexCoord2hNV');
+ if not Assigned(glMultiTexCoord2hNV) then Exit;
+ @glMultiTexCoord2hvNV := SDL_GL_GetProcAddress('glMultiTexCoord2hvNV');
+ if not Assigned(glMultiTexCoord2hvNV) then Exit;
+ @glMultiTexCoord3hNV := SDL_GL_GetProcAddress('glMultiTexCoord3hNV');
+ if not Assigned(glMultiTexCoord3hNV) then Exit;
+ @glMultiTexCoord3hvNV := SDL_GL_GetProcAddress('glMultiTexCoord3hvNV');
+ if not Assigned(glMultiTexCoord3hvNV) then Exit;
+ @glMultiTexCoord4hNV := SDL_GL_GetProcAddress('glMultiTexCoord4hNV');
+ if not Assigned(glMultiTexCoord4hNV) then Exit;
+ @glMultiTexCoord4hvNV := SDL_GL_GetProcAddress('glMultiTexCoord4hvNV');
+ if not Assigned(glMultiTexCoord4hvNV) then Exit;
+ @glFogCoordhNV := SDL_GL_GetProcAddress('glFogCoordhNV');
+ if not Assigned(glFogCoordhNV) then Exit;
+ @glFogCoordhvNV := SDL_GL_GetProcAddress('glFogCoordhvNV');
+ if not Assigned(glFogCoordhvNV) then Exit;
+ @glSecondaryColor3hNV := SDL_GL_GetProcAddress('glSecondaryColor3hNV');
+ if not Assigned(glSecondaryColor3hNV) then Exit;
+ @glSecondaryColor3hvNV := SDL_GL_GetProcAddress('glSecondaryColor3hvNV');
+ if not Assigned(glSecondaryColor3hvNV) then Exit;
+ @glVertexWeighthNV := SDL_GL_GetProcAddress('glVertexWeighthNV');
+ if not Assigned(glVertexWeighthNV) then Exit;
+ @glVertexWeighthvNV := SDL_GL_GetProcAddress('glVertexWeighthvNV');
+ if not Assigned(glVertexWeighthvNV) then Exit;
+ @glVertexAttrib1hNV := SDL_GL_GetProcAddress('glVertexAttrib1hNV');
+ if not Assigned(glVertexAttrib1hNV) then Exit;
+ @glVertexAttrib1hvNV := SDL_GL_GetProcAddress('glVertexAttrib1hvNV');
+ if not Assigned(glVertexAttrib1hvNV) then Exit;
+ @glVertexAttrib2hNV := SDL_GL_GetProcAddress('glVertexAttrib2hNV');
+ if not Assigned(glVertexAttrib2hNV) then Exit;
+ @glVertexAttrib2hvNV := SDL_GL_GetProcAddress('glVertexAttrib2hvNV');
+ if not Assigned(glVertexAttrib2hvNV) then Exit;
+ @glVertexAttrib3hNV := SDL_GL_GetProcAddress('glVertexAttrib3hNV');
+ if not Assigned(glVertexAttrib3hNV) then Exit;
+ @glVertexAttrib3hvNV := SDL_GL_GetProcAddress('glVertexAttrib3hvNV');
+ if not Assigned(glVertexAttrib3hvNV) then Exit;
+ @glVertexAttrib4hNV := SDL_GL_GetProcAddress('glVertexAttrib4hNV');
+ if not Assigned(glVertexAttrib4hNV) then Exit;
+ @glVertexAttrib4hvNV := SDL_GL_GetProcAddress('glVertexAttrib4hvNV');
+ if not Assigned(glVertexAttrib4hvNV) then Exit;
+ @glVertexAttribs1hvNV := SDL_GL_GetProcAddress('glVertexAttribs1hvNV');
+ if not Assigned(glVertexAttribs1hvNV) then Exit;
+ @glVertexAttribs2hvNV := SDL_GL_GetProcAddress('glVertexAttribs2hvNV');
+ if not Assigned(glVertexAttribs2hvNV) then Exit;
+ @glVertexAttribs3hvNV := SDL_GL_GetProcAddress('glVertexAttribs3hvNV');
+ if not Assigned(glVertexAttribs3hvNV) then Exit;
+ @glVertexAttribs4hvNV := SDL_GL_GetProcAddress('glVertexAttribs4hvNV');
+ if not Assigned(glVertexAttribs4hvNV) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ATI_map_object_buffer: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ATI_map_object_buffer', extstring) then
+ begin
+ @glMapObjectBufferATI := SDL_GL_GetProcAddress('glMapObjectBufferATI');
+ if not Assigned(glMapObjectBufferATI) then Exit;
+ @glUnmapObjectBufferATI := SDL_GL_GetProcAddress('glUnmapObjectBufferATI');
+ if not Assigned(glUnmapObjectBufferATI) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ATI_separate_stencil: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ATI_separate_stencil', extstring) then
+ begin
+ @glStencilOpSeparateATI := SDL_GL_GetProcAddress('glStencilOpSeparateATI');
+ if not Assigned(glStencilOpSeparateATI) then Exit;
+ @glStencilFuncSeparateATI := SDL_GL_GetProcAddress('glStencilFuncSeparateATI');
+ if not Assigned(glStencilFuncSeparateATI) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ATI_vertex_attrib_array_object: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ATI_vertex_attrib_array_object', extstring) then
+ begin
+ @glVertexAttribArrayObjectATI := SDL_GL_GetProcAddress('glVertexAttribArrayObjectATI');
+ if not Assigned(glVertexAttribArrayObjectATI) then Exit;
+ @glGetVertexAttribArrayObjectfvATI := SDL_GL_GetProcAddress('glGetVertexAttribArrayObjectfvATI');
+ if not Assigned(glGetVertexAttribArrayObjectfvATI) then Exit;
+ @glGetVertexAttribArrayObjectivATI := SDL_GL_GetProcAddress('glGetVertexAttribArrayObjectivATI');
+ if not Assigned(glGetVertexAttribArrayObjectivATI) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_vertex_buffer_object: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_vertex_buffer_object', extstring) then
+ begin
+ @glBindBufferARB := SDL_GL_GetProcAddress('glBindBufferARB');
+ if not Assigned(glBindBufferARB) then Exit;
+ @glDeleteBuffersARB := SDL_GL_GetProcAddress('glDeleteBuffersARB');
+ if not Assigned(glDeleteBuffersARB) then Exit;
+ @glGenBuffersARB := SDL_GL_GetProcAddress('glGenBuffersARB');
+ if not Assigned(glGenBuffersARB) then Exit;
+ @glIsBufferARB := SDL_GL_GetProcAddress('glIsBufferARB');
+ if not Assigned(glIsBufferARB) then Exit;
+ @glBufferDataARB := SDL_GL_GetProcAddress('glBufferDataARB');
+ if not Assigned(glBufferDataARB) then Exit;
+ @glBufferSubDataARB := SDL_GL_GetProcAddress('glBufferSubDataARB');
+ if not Assigned(glBufferSubDataARB) then Exit;
+ @glGetBufferSubDataARB := SDL_GL_GetProcAddress('glGetBufferSubDataARB');
+ if not Assigned(glGetBufferSubDataARB) then Exit;
+ @glMapBufferARB := SDL_GL_GetProcAddress('glMapBufferARB');
+ if not Assigned(glMapBufferARB) then Exit;
+ @glUnmapBufferARB := SDL_GL_GetProcAddress('glUnmapBufferARB');
+ if not Assigned(glUnmapBufferARB) then Exit;
+ @glGetBufferParameterivARB := SDL_GL_GetProcAddress('glGetBufferParameterivARB');
+ if not Assigned(glGetBufferParameterivARB) then Exit;
+ @glGetBufferPointervARB := SDL_GL_GetProcAddress('glGetBufferPointervARB');
+ if not Assigned(glGetBufferPointervARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_occlusion_query: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_occlusion_query', extstring) then
+ begin
+ @glGenQueriesARB := SDL_GL_GetProcAddress('glGenQueriesARB');
+ if not Assigned(glGenQueriesARB) then Exit;
+ @glDeleteQueriesARB := SDL_GL_GetProcAddress('glDeleteQueriesARB');
+ if not Assigned(glDeleteQueriesARB) then Exit;
+ @glIsQueryARB := SDL_GL_GetProcAddress('glIsQueryARB');
+ if not Assigned(glIsQueryARB) then Exit;
+ @glBeginQueryARB := SDL_GL_GetProcAddress('glBeginQueryARB');
+ if not Assigned(glBeginQueryARB) then Exit;
+ @glEndQueryARB := SDL_GL_GetProcAddress('glEndQueryARB');
+ if not Assigned(glEndQueryARB) then Exit;
+ @glGetQueryivARB := SDL_GL_GetProcAddress('glGetQueryivARB');
+ if not Assigned(glGetQueryivARB) then Exit;
+ @glGetQueryObjectivARB := SDL_GL_GetProcAddress('glGetQueryObjectivARB');
+ if not Assigned(glGetQueryObjectivARB) then Exit;
+ @glGetQueryObjectuivARB := SDL_GL_GetProcAddress('glGetQueryObjectuivARB');
+ if not Assigned(glGetQueryObjectuivARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_shader_objects: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_shader_objects', extstring) then
+ begin
+ @glDeleteObjectARB := SDL_GL_GetProcAddress('glDeleteObjectARB');
+ if not Assigned(glDeleteObjectARB) then Exit;
+ @glGetHandleARB := SDL_GL_GetProcAddress('glGetHandleARB');
+ if not Assigned(glGetHandleARB) then Exit;
+ @glDetachObjectARB := SDL_GL_GetProcAddress('glDetachObjectARB');
+ if not Assigned(glDetachObjectARB) then Exit;
+ @glCreateShaderObjectARB := SDL_GL_GetProcAddress('glCreateShaderObjectARB');
+ if not Assigned(glCreateShaderObjectARB) then Exit;
+ @glShaderSourceARB := SDL_GL_GetProcAddress('glShaderSourceARB');
+ if not Assigned(glShaderSourceARB) then Exit;
+ @glCompileShaderARB := SDL_GL_GetProcAddress('glCompileShaderARB');
+ if not Assigned(glCompileShaderARB) then Exit;
+ @glCreateProgramObjectARB := SDL_GL_GetProcAddress('glCreateProgramObjectARB');
+ if not Assigned(glCreateProgramObjectARB) then Exit;
+ @glAttachObjectARB := SDL_GL_GetProcAddress('glAttachObjectARB');
+ if not Assigned(glAttachObjectARB) then Exit;
+ @glLinkProgramARB := SDL_GL_GetProcAddress('glLinkProgramARB');
+ if not Assigned(glLinkProgramARB) then Exit;
+ @glUseProgramObjectARB := SDL_GL_GetProcAddress('glUseProgramObjectARB');
+ if not Assigned(glUseProgramObjectARB) then Exit;
+ @glValidateProgramARB := SDL_GL_GetProcAddress('glValidateProgramARB');
+ if not Assigned(glValidateProgramARB) then Exit;
+ @glUniform1fARB := SDL_GL_GetProcAddress('glUniform1fARB');
+ if not Assigned(glUniform1fARB) then Exit;
+ @glUniform2fARB := SDL_GL_GetProcAddress('glUniform2fARB');
+ if not Assigned(glUniform2fARB) then Exit;
+ @glUniform3fARB := SDL_GL_GetProcAddress('glUniform3fARB');
+ if not Assigned(glUniform3fARB) then Exit;
+ @glUniform4fARB := SDL_GL_GetProcAddress('glUniform4fARB');
+ if not Assigned(glUniform4fARB) then Exit;
+ @glUniform1iARB := SDL_GL_GetProcAddress('glUniform1iARB');
+ if not Assigned(glUniform1iARB) then Exit;
+ @glUniform2iARB := SDL_GL_GetProcAddress('glUniform2iARB');
+ if not Assigned(glUniform2iARB) then Exit;
+ @glUniform3iARB := SDL_GL_GetProcAddress('glUniform3iARB');
+ if not Assigned(glUniform3iARB) then Exit;
+ @glUniform4iARB := SDL_GL_GetProcAddress('glUniform4iARB');
+ if not Assigned(glUniform4iARB) then Exit;
+ @glUniform1fvARB := SDL_GL_GetProcAddress('glUniform1fvARB');
+ if not Assigned(glUniform1fvARB) then Exit;
+ @glUniform2fvARB := SDL_GL_GetProcAddress('glUniform2fvARB');
+ if not Assigned(glUniform2fvARB) then Exit;
+ @glUniform3fvARB := SDL_GL_GetProcAddress('glUniform3fvARB');
+ if not Assigned(glUniform3fvARB) then Exit;
+ @glUniform4fvARB := SDL_GL_GetProcAddress('glUniform4fvARB');
+ if not Assigned(glUniform4fvARB) then Exit;
+ @glUniform1ivARB := SDL_GL_GetProcAddress('glUniform1ivARB');
+ if not Assigned(glUniform1ivARB) then Exit;
+ @glUniform2ivARB := SDL_GL_GetProcAddress('glUniform2ivARB');
+ if not Assigned(glUniform2ivARB) then Exit;
+ @glUniform3ivARB := SDL_GL_GetProcAddress('glUniform3ivARB');
+ if not Assigned(glUniform3ivARB) then Exit;
+ @glUniform4ivARB := SDL_GL_GetProcAddress('glUniform4ivARB');
+ if not Assigned(glUniform4ivARB) then Exit;
+ @glUniformMatrix2fvARB := SDL_GL_GetProcAddress('glUniformMatrix2fvARB');
+ if not Assigned(glUniformMatrix2fvARB) then Exit;
+ @glUniformMatrix3fvARB := SDL_GL_GetProcAddress('glUniformMatrix3fvARB');
+ if not Assigned(glUniformMatrix3fvARB) then Exit;
+ @glUniformMatrix4fvARB := SDL_GL_GetProcAddress('glUniformMatrix4fvARB');
+ if not Assigned(glUniformMatrix4fvARB) then Exit;
+ @glGetObjectParameterfvARB := SDL_GL_GetProcAddress('glGetObjectParameterfvARB');
+ if not Assigned(glGetObjectParameterfvARB) then Exit;
+ @glGetObjectParameterivARB := SDL_GL_GetProcAddress('glGetObjectParameterivARB');
+ if not Assigned(glGetObjectParameterivARB) then Exit;
+ @glGetInfoLogARB := SDL_GL_GetProcAddress('glGetInfoLogARB');
+ if not Assigned(glGetInfoLogARB) then Exit;
+ @glGetAttachedObjectsARB := SDL_GL_GetProcAddress('glGetAttachedObjectsARB');
+ if not Assigned(glGetAttachedObjectsARB) then Exit;
+ @glGetUniformLocationARB := SDL_GL_GetProcAddress('glGetUniformLocationARB');
+ if not Assigned(glGetUniformLocationARB) then Exit;
+ @glGetActiveUniformARB := SDL_GL_GetProcAddress('glGetActiveUniformARB');
+ if not Assigned(glGetActiveUniformARB) then Exit;
+ @glGetUniformfvARB := SDL_GL_GetProcAddress('glGetUniformfvARB');
+ if not Assigned(glGetUniformfvARB) then Exit;
+ @glGetUniformivARB := SDL_GL_GetProcAddress('glGetUniformivARB');
+ if not Assigned(glGetUniformivARB) then Exit;
+ @glGetShaderSourceARB := SDL_GL_GetProcAddress('glGetShaderSourceARB');
+ if not Assigned(glGetShaderSourceARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_vertex_shader: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_vertex_shader', extstring) then
+ begin
+ @glVertexAttrib1fARB := SDL_GL_GetProcAddress('glVertexAttrib1fARB');
+ if not Assigned(glVertexAttrib1fARB) then Exit;
+ @glVertexAttrib1sARB := SDL_GL_GetProcAddress('glVertexAttrib1sARB');
+ if not Assigned(glVertexAttrib1sARB) then Exit;
+ @glVertexAttrib1dARB := SDL_GL_GetProcAddress('glVertexAttrib1dARB');
+ if not Assigned(glVertexAttrib1dARB) then Exit;
+ @glVertexAttrib2fARB := SDL_GL_GetProcAddress('glVertexAttrib2fARB');
+ if not Assigned(glVertexAttrib2fARB) then Exit;
+ @glVertexAttrib2sARB := SDL_GL_GetProcAddress('glVertexAttrib2sARB');
+ if not Assigned(glVertexAttrib2sARB) then Exit;
+ @glVertexAttrib2dARB := SDL_GL_GetProcAddress('glVertexAttrib2dARB');
+ if not Assigned(glVertexAttrib2dARB) then Exit;
+ @glVertexAttrib3fARB := SDL_GL_GetProcAddress('glVertexAttrib3fARB');
+ if not Assigned(glVertexAttrib3fARB) then Exit;
+ @glVertexAttrib3sARB := SDL_GL_GetProcAddress('glVertexAttrib3sARB');
+ if not Assigned(glVertexAttrib3sARB) then Exit;
+ @glVertexAttrib3dARB := SDL_GL_GetProcAddress('glVertexAttrib3dARB');
+ if not Assigned(glVertexAttrib3dARB) then Exit;
+ @glVertexAttrib4fARB := SDL_GL_GetProcAddress('glVertexAttrib4fARB');
+ if not Assigned(glVertexAttrib4fARB) then Exit;
+ @glVertexAttrib4sARB := SDL_GL_GetProcAddress('glVertexAttrib4sARB');
+ if not Assigned(glVertexAttrib4sARB) then Exit;
+ @glVertexAttrib4dARB := SDL_GL_GetProcAddress('glVertexAttrib4dARB');
+ if not Assigned(glVertexAttrib4dARB) then Exit;
+ @glVertexAttrib4NubARB := SDL_GL_GetProcAddress('glVertexAttrib4NubARB');
+ if not Assigned(glVertexAttrib4NubARB) then Exit;
+ @glVertexAttrib1fvARB := SDL_GL_GetProcAddress('glVertexAttrib1fvARB');
+ if not Assigned(glVertexAttrib1fvARB) then Exit;
+ @glVertexAttrib1svARB := SDL_GL_GetProcAddress('glVertexAttrib1svARB');
+ if not Assigned(glVertexAttrib1svARB) then Exit;
+ @glVertexAttrib1dvARB := SDL_GL_GetProcAddress('glVertexAttrib1dvARB');
+ if not Assigned(glVertexAttrib1dvARB) then Exit;
+ @glVertexAttrib2fvARB := SDL_GL_GetProcAddress('glVertexAttrib2fvARB');
+ if not Assigned(glVertexAttrib2fvARB) then Exit;
+ @glVertexAttrib2svARB := SDL_GL_GetProcAddress('glVertexAttrib2svARB');
+ if not Assigned(glVertexAttrib2svARB) then Exit;
+ @glVertexAttrib2dvARB := SDL_GL_GetProcAddress('glVertexAttrib2dvARB');
+ if not Assigned(glVertexAttrib2dvARB) then Exit;
+ @glVertexAttrib3fvARB := SDL_GL_GetProcAddress('glVertexAttrib3fvARB');
+ if not Assigned(glVertexAttrib3fvARB) then Exit;
+ @glVertexAttrib3svARB := SDL_GL_GetProcAddress('glVertexAttrib3svARB');
+ if not Assigned(glVertexAttrib3svARB) then Exit;
+ @glVertexAttrib3dvARB := SDL_GL_GetProcAddress('glVertexAttrib3dvARB');
+ if not Assigned(glVertexAttrib3dvARB) then Exit;
+ @glVertexAttrib4fvARB := SDL_GL_GetProcAddress('glVertexAttrib4fvARB');
+ if not Assigned(glVertexAttrib4fvARB) then Exit;
+ @glVertexAttrib4svARB := SDL_GL_GetProcAddress('glVertexAttrib4svARB');
+ if not Assigned(glVertexAttrib4svARB) then Exit;
+ @glVertexAttrib4dvARB := SDL_GL_GetProcAddress('glVertexAttrib4dvARB');
+ if not Assigned(glVertexAttrib4dvARB) then Exit;
+ @glVertexAttrib4ivARB := SDL_GL_GetProcAddress('glVertexAttrib4ivARB');
+ if not Assigned(glVertexAttrib4ivARB) then Exit;
+ @glVertexAttrib4bvARB := SDL_GL_GetProcAddress('glVertexAttrib4bvARB');
+ if not Assigned(glVertexAttrib4bvARB) then Exit;
+ @glVertexAttrib4ubvARB := SDL_GL_GetProcAddress('glVertexAttrib4ubvARB');
+ if not Assigned(glVertexAttrib4ubvARB) then Exit;
+ @glVertexAttrib4usvARB := SDL_GL_GetProcAddress('glVertexAttrib4usvARB');
+ if not Assigned(glVertexAttrib4usvARB) then Exit;
+ @glVertexAttrib4uivARB := SDL_GL_GetProcAddress('glVertexAttrib4uivARB');
+ if not Assigned(glVertexAttrib4uivARB) then Exit;
+ @glVertexAttrib4NbvARB := SDL_GL_GetProcAddress('glVertexAttrib4NbvARB');
+ if not Assigned(glVertexAttrib4NbvARB) then Exit;
+ @glVertexAttrib4NsvARB := SDL_GL_GetProcAddress('glVertexAttrib4NsvARB');
+ if not Assigned(glVertexAttrib4NsvARB) then Exit;
+ @glVertexAttrib4NivARB := SDL_GL_GetProcAddress('glVertexAttrib4NivARB');
+ if not Assigned(glVertexAttrib4NivARB) then Exit;
+ @glVertexAttrib4NubvARB := SDL_GL_GetProcAddress('glVertexAttrib4NubvARB');
+ if not Assigned(glVertexAttrib4NubvARB) then Exit;
+ @glVertexAttrib4NusvARB := SDL_GL_GetProcAddress('glVertexAttrib4NusvARB');
+ if not Assigned(glVertexAttrib4NusvARB) then Exit;
+ @glVertexAttrib4NuivARB := SDL_GL_GetProcAddress('glVertexAttrib4NuivARB');
+ if not Assigned(glVertexAttrib4NuivARB) then Exit;
+ @glVertexAttribPointerARB := SDL_GL_GetProcAddress('glVertexAttribPointerARB');
+ if not Assigned(glVertexAttribPointerARB) then Exit;
+ @glEnableVertexAttribArrayARB := SDL_GL_GetProcAddress('glEnableVertexAttribArrayARB');
+ if not Assigned(glEnableVertexAttribArrayARB) then Exit;
+ @glDisableVertexAttribArrayARB := SDL_GL_GetProcAddress('glDisableVertexAttribArrayARB');
+ if not Assigned(glDisableVertexAttribArrayARB) then Exit;
+ @glBindAttribLocationARB := SDL_GL_GetProcAddress('glBindAttribLocationARB');
+ if not Assigned(glBindAttribLocationARB) then Exit;
+ @glGetActiveAttribARB := SDL_GL_GetProcAddress('glGetActiveAttribARB');
+ if not Assigned(glGetActiveAttribARB) then Exit;
+ @glGetAttribLocationARB := SDL_GL_GetProcAddress('glGetAttribLocationARB');
+ if not Assigned(glGetAttribLocationARB) then Exit;
+ @glGetVertexAttribdvARB := SDL_GL_GetProcAddress('glGetVertexAttribdvARB');
+ if not Assigned(glGetVertexAttribdvARB) then Exit;
+ @glGetVertexAttribfvARB := SDL_GL_GetProcAddress('glGetVertexAttribfvARB');
+ if not Assigned(glGetVertexAttribfvARB) then Exit;
+ @glGetVertexAttribivARB := SDL_GL_GetProcAddress('glGetVertexAttribivARB');
+ if not Assigned(glGetVertexAttribivARB) then Exit;
+ @glGetVertexAttribPointervARB := SDL_GL_GetProcAddress('glGetVertexAttribPointervARB');
+ if not Assigned(glGetVertexAttribPointervARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_fragment_shader: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_fragment_shader', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_shading_language_100: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_shading_language_100', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_texture_non_power_of_two: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_texture_non_power_of_two', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_point_sprite: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_point_sprite', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_depth_bounds_test: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_depth_bounds_test', extstring) then
+ begin
+ @glDepthBoundsEXT := SDL_GL_GetProcAddress('glDepthBoundsEXT');
+ if not Assigned(glDepthBoundsEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_secondary_color: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_secondary_color', extstring) then
+ begin
+ @glSecondaryColor3bEXT := SDL_GL_GetProcAddress('glSecondaryColor3bEXT');
+ if not Assigned(glSecondaryColor3bEXT) then Exit;
+ @glSecondaryColor3sEXT := SDL_GL_GetProcAddress('glSecondaryColor3sEXT');
+ if not Assigned(glSecondaryColor3sEXT) then Exit;
+ @glSecondaryColor3iEXT := SDL_GL_GetProcAddress('glSecondaryColor3iEXT');
+ if not Assigned(glSecondaryColor3iEXT) then Exit;
+ @glSecondaryColor3fEXT := SDL_GL_GetProcAddress('glSecondaryColor3fEXT');
+ if not Assigned(glSecondaryColor3fEXT) then Exit;
+ @glSecondaryColor3dEXT := SDL_GL_GetProcAddress('glSecondaryColor3dEXT');
+ if not Assigned(glSecondaryColor3dEXT) then Exit;
+ @glSecondaryColor3ubEXT := SDL_GL_GetProcAddress('glSecondaryColor3ubEXT');
+ if not Assigned(glSecondaryColor3ubEXT) then Exit;
+ @glSecondaryColor3usEXT := SDL_GL_GetProcAddress('glSecondaryColor3usEXT');
+ if not Assigned(glSecondaryColor3usEXT) then Exit;
+ @glSecondaryColor3uiEXT := SDL_GL_GetProcAddress('glSecondaryColor3uiEXT');
+ if not Assigned(glSecondaryColor3uiEXT) then Exit;
+ @glSecondaryColor3bvEXT := SDL_GL_GetProcAddress('glSecondaryColor3bvEXT');
+ if not Assigned(glSecondaryColor3bvEXT) then Exit;
+ @glSecondaryColor3svEXT := SDL_GL_GetProcAddress('glSecondaryColor3svEXT');
+ if not Assigned(glSecondaryColor3svEXT) then Exit;
+ @glSecondaryColor3ivEXT := SDL_GL_GetProcAddress('glSecondaryColor3ivEXT');
+ if not Assigned(glSecondaryColor3ivEXT) then Exit;
+ @glSecondaryColor3fvEXT := SDL_GL_GetProcAddress('glSecondaryColor3fvEXT');
+ if not Assigned(glSecondaryColor3fvEXT) then Exit;
+ @glSecondaryColor3dvEXT := SDL_GL_GetProcAddress('glSecondaryColor3dvEXT');
+ if not Assigned(glSecondaryColor3dvEXT) then Exit;
+ @glSecondaryColor3ubvEXT := SDL_GL_GetProcAddress('glSecondaryColor3ubvEXT');
+ if not Assigned(glSecondaryColor3ubvEXT) then Exit;
+ @glSecondaryColor3usvEXT := SDL_GL_GetProcAddress('glSecondaryColor3usvEXT');
+ if not Assigned(glSecondaryColor3usvEXT) then Exit;
+ @glSecondaryColor3uivEXT := SDL_GL_GetProcAddress('glSecondaryColor3uivEXT');
+ if not Assigned(glSecondaryColor3uivEXT) then Exit;
+ @glSecondaryColorPointerEXT := SDL_GL_GetProcAddress('glSecondaryColorPointerEXT');
+ if not Assigned(glSecondaryColorPointerEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_texture_mirror_clamp: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_texture_mirror_clamp', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_blend_equation_separate: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_blend_equation_separate', extstring) then
+ begin
+ @glBlendEquationSeparateEXT := SDL_GL_GetProcAddress('glBlendEquationSeparateEXT');
+ if not Assigned(glBlendEquationSeparateEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_MESA_pack_invert: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_MESA_pack_invert', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_MESA_ycbcr_texture: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_MESA_ycbcr_texture', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_fragment_program_shadow: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_ARB_fragment_program_shadow', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_fog_coord: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_fog_coord', extstring) then
+ begin
+ @glFogCoordfEXT := SDL_GL_GetProcAddress('glFogCoordfEXT');
+ if not Assigned(glFogCoordfEXT) then Exit;
+ @glFogCoorddEXT := SDL_GL_GetProcAddress('glFogCoorddEXT');
+ if not Assigned(glFogCoorddEXT) then Exit;
+ @glFogCoordfvEXT := SDL_GL_GetProcAddress('glFogCoordfvEXT');
+ if not Assigned(glFogCoordfvEXT) then Exit;
+ @glFogCoorddvEXT := SDL_GL_GetProcAddress('glFogCoorddvEXT');
+ if not Assigned(glFogCoorddvEXT) then Exit;
+ @glFogCoordPointerEXT := SDL_GL_GetProcAddress('glFogCoordPointerEXT');
+ if not Assigned(glFogCoordPointerEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_fragment_program_option: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_fragment_program_option', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_pixel_buffer_object: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_EXT_pixel_buffer_object', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_fragment_program2: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_fragment_program2', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_vertex_program2_option: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_vertex_program2_option', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_NV_vertex_program3: Boolean;
+var
+ extstring : PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString( GL_EXTENSIONS );
+
+ if glext_ExtensionSupported('GL_NV_vertex_program3', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_draw_buffers: Boolean;
+var
+ extstring: PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString(GL_EXTENSIONS);
+
+ if glext_ExtensionSupported('GL_ARB_draw_buffers', extstring) then
+ begin
+ glDrawBuffersARB := SDL_GL_GetProcAddress('glDrawBuffersARB');
+ if not Assigned(glDrawBuffersARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_texture_rectangle: Boolean;
+var
+ extstring: PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString(GL_EXTENSIONS);
+
+ if glext_ExtensionSupported('GL_ARB_texture_rectangle', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_color_buffer_float: Boolean;
+var
+ extstring: PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString(GL_EXTENSIONS);
+
+ if glext_ExtensionSupported('GL_ARB_color_buffer_float', extstring) then
+ begin
+ glClampColorARB := SDL_GL_GetProcAddress('glClampColorARB');
+ if not Assigned(glClampColorARB) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_half_float_pixel: Boolean;
+var
+ extstring: PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString(GL_EXTENSIONS);
+
+ if glext_ExtensionSupported('GL_ARB_half_float_pixel', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_texture_float: Boolean;
+var
+ extstring: PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString(GL_EXTENSIONS);
+
+ if glext_ExtensionSupported('GL_ARB_texture_float', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_texture_compression_dxt1: Boolean;
+var
+ extstring: PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString(GL_EXTENSIONS);
+
+ if glext_ExtensionSupported('GL_EXT_texture_compression_dxt1', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_ARB_pixel_buffer_object: Boolean;
+var
+ extstring: PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString(GL_EXTENSIONS);
+
+ if glext_ExtensionSupported('GL_ARB_pixel_buffer_object', extstring) then
+ begin
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_EXT_framebuffer_object: Boolean;
+var
+ extstring: PChar;
+begin
+
+ Result := FALSE;
+ extstring := glGetString(GL_EXTENSIONS);
+
+ if glext_ExtensionSupported('GL_EXT_framebuffer_object', extstring) then
+ begin
+ glIsRenderbufferEXT := SDL_GL_GetProcAddress('glIsRenderbufferEXT');
+ if not Assigned(glIsRenderbufferEXT) then Exit;
+ glBindRenderbufferEXT := SDL_GL_GetProcAddress('glBindRenderbufferEXT');
+ if not Assigned(glBindRenderbufferEXT) then Exit;
+ glDeleteRenderbuffersEXT := SDL_GL_GetProcAddress('glDeleteRenderbuffersEXT');
+ if not Assigned(glDeleteRenderbuffersEXT) then Exit;
+ glGenRenderbuffersEXT := SDL_GL_GetProcAddress('glGenRenderbuffersEXT');
+ if not Assigned(glGenRenderbuffersEXT) then Exit;
+ glRenderbufferStorageEXT := SDL_GL_GetProcAddress('glRenderbufferStorageEXT');
+ if not Assigned(glRenderbufferStorageEXT) then Exit;
+ glGetRenderbufferParameterivEXT := SDL_GL_GetProcAddress('glGetRenderbufferParameterivEXT');
+ if not Assigned(glGetRenderbufferParameterivEXT) then Exit;
+ glIsFramebufferEXT := SDL_GL_GetProcAddress('glIsFramebufferEXT');
+ if not Assigned(glIsFramebufferEXT) then Exit;
+ glBindFramebufferEXT := SDL_GL_GetProcAddress('glBindFramebufferEXT');
+ if not Assigned(glBindFramebufferEXT) then Exit;
+ glDeleteFramebuffersEXT := SDL_GL_GetProcAddress('glDeleteFramebuffersEXT');
+ if not Assigned(glDeleteFramebuffersEXT) then Exit;
+ glGenFramebuffersEXT := SDL_GL_GetProcAddress('glGenFramebuffersEXT');
+ if not Assigned(glGenFramebuffersEXT) then Exit;
+ glCheckFramebufferStatusEXT := SDL_GL_GetProcAddress('glCheckFramebufferStatusEXT');
+ if not Assigned(glCheckFramebufferStatusEXT) then Exit;
+ glFramebufferTexture1DEXT := SDL_GL_GetProcAddress('glFramebufferTexture1DEXT');
+ if not Assigned(glFramebufferTexture1DEXT) then Exit;
+ glFramebufferTexture2DEXT := SDL_GL_GetProcAddress('glFramebufferTexture2DEXT');
+ if not Assigned(glFramebufferTexture2DEXT) then Exit;
+ glFramebufferTexture3DEXT := SDL_GL_GetProcAddress('glFramebufferTexture3DEXT');
+ if not Assigned(glFramebufferTexture3DEXT) then Exit;
+ glFramebufferRenderbufferEXT := SDL_GL_GetProcAddress('glFramebufferRenderbufferEXT');
+ if not Assigned(glFramebufferRenderbufferEXT) then Exit;
+ glGetFramebufferAttachmentParameterivEXT := SDL_GL_GetProcAddress('glGetFramebufferAttachmentParameterivEXT');
+ if not Assigned(glGetFramebufferAttachmentParameterivEXT) then Exit;
+ glGenerateMipmapEXT := SDL_GL_GetProcAddress('glGenerateMipmapEXT');
+ if not Assigned(glGenerateMipmapEXT) then Exit;
+ Result := TRUE;
+ end;
+
+end;
+
+function Load_GL_version_1_4: Boolean;
+var
+ extstring: String;
+begin
+
+ Result := FALSE;
+ extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+ glBlendFuncSeparate := SDL_GL_GetProcAddress('glBlendFuncSeparate');
+ if not Assigned(glBlendFuncSeparate) then Exit;
+ glFogCoordf := SDL_GL_GetProcAddress('glFogCoordf');
+ if not Assigned(glFogCoordf) then Exit;
+ glFogCoordfv := SDL_GL_GetProcAddress('glFogCoordfv');
+ if not Assigned(glFogCoordfv) then Exit;
+ glFogCoordd := SDL_GL_GetProcAddress('glFogCoordd');
+ if not Assigned(glFogCoordd) then Exit;
+ glFogCoorddv := SDL_GL_GetProcAddress('glFogCoorddv');
+ if not Assigned(glFogCoorddv) then Exit;
+ glFogCoordPointer := SDL_GL_GetProcAddress('glFogCoordPointer');
+ if not Assigned(glFogCoordPointer) then Exit;
+ glMultiDrawArrays := SDL_GL_GetProcAddress('glMultiDrawArrays');
+ if not Assigned(glMultiDrawArrays) then Exit;
+ glMultiDrawElements := SDL_GL_GetProcAddress('glMultiDrawElements');
+ if not Assigned(glMultiDrawElements) then Exit;
+ glPointParameterf := SDL_GL_GetProcAddress('glPointParameterf');
+ if not Assigned(glPointParameterf) then Exit;
+ glPointParameterfv := SDL_GL_GetProcAddress('glPointParameterfv');
+ if not Assigned(glPointParameterfv) then Exit;
+ glPointParameteri := SDL_GL_GetProcAddress('glPointParameteri');
+ if not Assigned(glPointParameteri) then Exit;
+ glPointParameteriv := SDL_GL_GetProcAddress('glPointParameteriv');
+ if not Assigned(glPointParameteriv) then Exit;
+ glSecondaryColor3b := SDL_GL_GetProcAddress('glSecondaryColor3b');
+ if not Assigned(glSecondaryColor3b) then Exit;
+ glSecondaryColor3bv := SDL_GL_GetProcAddress('glSecondaryColor3bv');
+ if not Assigned(glSecondaryColor3bv) then Exit;
+ glSecondaryColor3d := SDL_GL_GetProcAddress('glSecondaryColor3d');
+ if not Assigned(glSecondaryColor3d) then Exit;
+ glSecondaryColor3dv := SDL_GL_GetProcAddress('glSecondaryColor3dv');
+ if not Assigned(glSecondaryColor3dv) then Exit;
+ glSecondaryColor3f := SDL_GL_GetProcAddress('glSecondaryColor3f');
+ if not Assigned(glSecondaryColor3f) then Exit;
+ glSecondaryColor3fv := SDL_GL_GetProcAddress('glSecondaryColor3fv');
+ if not Assigned(glSecondaryColor3fv) then Exit;
+ glSecondaryColor3i := SDL_GL_GetProcAddress('glSecondaryColor3i');
+ if not Assigned(glSecondaryColor3i) then Exit;
+ glSecondaryColor3iv := SDL_GL_GetProcAddress('glSecondaryColor3iv');
+ if not Assigned(glSecondaryColor3iv) then Exit;
+ glSecondaryColor3s := SDL_GL_GetProcAddress('glSecondaryColor3s');
+ if not Assigned(glSecondaryColor3s) then Exit;
+ glSecondaryColor3sv := SDL_GL_GetProcAddress('glSecondaryColor3sv');
+ if not Assigned(glSecondaryColor3sv) then Exit;
+ glSecondaryColor3ub := SDL_GL_GetProcAddress('glSecondaryColor3ub');
+ if not Assigned(glSecondaryColor3ub) then Exit;
+ glSecondaryColor3ubv := SDL_GL_GetProcAddress('glSecondaryColor3ubv');
+ if not Assigned(glSecondaryColor3ubv) then Exit;
+ glSecondaryColor3ui := SDL_GL_GetProcAddress('glSecondaryColor3ui');
+ if not Assigned(glSecondaryColor3ui) then Exit;
+ glSecondaryColor3uiv := SDL_GL_GetProcAddress('glSecondaryColor3uiv');
+ if not Assigned(glSecondaryColor3uiv) then Exit;
+ glSecondaryColor3us := SDL_GL_GetProcAddress('glSecondaryColor3us');
+ if not Assigned(glSecondaryColor3us) then Exit;
+ glSecondaryColor3usv := SDL_GL_GetProcAddress('glSecondaryColor3usv');
+ if not Assigned(glSecondaryColor3usv) then Exit;
+ glSecondaryColorPointer := SDL_GL_GetProcAddress('glSecondaryColorPointer');
+ if not Assigned(glSecondaryColorPointer) then Exit;
+ glWindowPos2d := SDL_GL_GetProcAddress('glWindowPos2d');
+ if not Assigned(glWindowPos2d) then Exit;
+ glWindowPos2dv := SDL_GL_GetProcAddress('glWindowPos2dv');
+ if not Assigned(glWindowPos2dv) then Exit;
+ glWindowPos2f := SDL_GL_GetProcAddress('glWindowPos2f');
+ if not Assigned(glWindowPos2f) then Exit;
+ glWindowPos2fv := SDL_GL_GetProcAddress('glWindowPos2fv');
+ if not Assigned(glWindowPos2fv) then Exit;
+ glWindowPos2i := SDL_GL_GetProcAddress('glWindowPos2i');
+ if not Assigned(glWindowPos2i) then Exit;
+ glWindowPos2iv := SDL_GL_GetProcAddress('glWindowPos2iv');
+ if not Assigned(glWindowPos2iv) then Exit;
+ glWindowPos2s := SDL_GL_GetProcAddress('glWindowPos2s');
+ if not Assigned(glWindowPos2s) then Exit;
+ glWindowPos2sv := SDL_GL_GetProcAddress('glWindowPos2sv');
+ if not Assigned(glWindowPos2sv) then Exit;
+ glWindowPos3d := SDL_GL_GetProcAddress('glWindowPos3d');
+ if not Assigned(glWindowPos3d) then Exit;
+ glWindowPos3dv := SDL_GL_GetProcAddress('glWindowPos3dv');
+ if not Assigned(glWindowPos3dv) then Exit;
+ glWindowPos3f := SDL_GL_GetProcAddress('glWindowPos3f');
+ if not Assigned(glWindowPos3f) then Exit;
+ glWindowPos3fv := SDL_GL_GetProcAddress('glWindowPos3fv');
+ if not Assigned(glWindowPos3fv) then Exit;
+ glWindowPos3i := SDL_GL_GetProcAddress('glWindowPos3i');
+ if not Assigned(glWindowPos3i) then Exit;
+ glWindowPos3iv := SDL_GL_GetProcAddress('glWindowPos3iv');
+ if not Assigned(glWindowPos3iv) then Exit;
+ glWindowPos3s := SDL_GL_GetProcAddress('glWindowPos3s');
+ if not Assigned(glWindowPos3s) then Exit;
+ glWindowPos3sv := SDL_GL_GetProcAddress('glWindowPos3sv');
+ if not Assigned(glWindowPos3sv) then Exit;
+ Result := TRUE;
+
+end;
+
+function Load_GL_version_1_5: Boolean;
+var
+ extstring: String;
+begin
+
+ Result := FALSE;
+ extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+ glGenQueries := SDL_GL_GetProcAddress('glGenQueries');
+ if not Assigned(glGenQueries) then Exit;
+ glDeleteQueries := SDL_GL_GetProcAddress('glDeleteQueries');
+ if not Assigned(glDeleteQueries) then Exit;
+ glIsQuery := SDL_GL_GetProcAddress('glIsQuery');
+ if not Assigned(glIsQuery) then Exit;
+ glBeginQuery := SDL_GL_GetProcAddress('glBeginQuery');
+ if not Assigned(glBeginQuery) then Exit;
+ glEndQuery := SDL_GL_GetProcAddress('glEndQuery');
+ if not Assigned(glEndQuery) then Exit;
+ glGetQueryiv := SDL_GL_GetProcAddress('glGetQueryiv');
+ if not Assigned(glGetQueryiv) then Exit;
+ glGetQueryObjectiv := SDL_GL_GetProcAddress('glGetQueryObjectiv');
+ if not Assigned(glGetQueryObjectiv) then Exit;
+ glGetQueryObjectuiv := SDL_GL_GetProcAddress('glGetQueryObjectuiv');
+ if not Assigned(glGetQueryObjectuiv) then Exit;
+ glBindBuffer := SDL_GL_GetProcAddress('glBindBuffer');
+ if not Assigned(glBindBuffer) then Exit;
+ glDeleteBuffers := SDL_GL_GetProcAddress('glDeleteBuffers');
+ if not Assigned(glDeleteBuffers) then Exit;
+ glGenBuffers := SDL_GL_GetProcAddress('glGenBuffers');
+ if not Assigned(glGenBuffers) then Exit;
+ glIsBuffer := SDL_GL_GetProcAddress('glIsBuffer');
+ if not Assigned(glIsBuffer) then Exit;
+ glBufferData := SDL_GL_GetProcAddress('glBufferData');
+ if not Assigned(glBufferData) then Exit;
+ glBufferSubData := SDL_GL_GetProcAddress('glBufferSubData');
+ if not Assigned(glBufferSubData) then Exit;
+ glGetBufferSubData := SDL_GL_GetProcAddress('glGetBufferSubData');
+ if not Assigned(glGetBufferSubData) then Exit;
+ glMapBuffer := SDL_GL_GetProcAddress('glMapBuffer');
+ if not Assigned(glMapBuffer) then Exit;
+ glUnmapBuffer := SDL_GL_GetProcAddress('glUnmapBuffer');
+ if not Assigned(glUnmapBuffer) then Exit;
+ glGetBufferParameteriv := SDL_GL_GetProcAddress('glGetBufferParameteriv');
+ if not Assigned(glGetBufferParameteriv) then Exit;
+ glGetBufferPointerv := SDL_GL_GetProcAddress('glGetBufferPointerv');
+ if not Assigned(glGetBufferPointerv) then Exit;
+ Result := TRUE;
+
+end;
+
+function Load_GL_version_2_0: Boolean;
+var
+ extstring: String;
+begin
+
+ Result := FALSE;
+ extstring := String(PChar(glGetString(GL_EXTENSIONS)));
+
+ glBlendEquationSeparate := SDL_GL_GetProcAddress('glBlendEquationSeparate');
+ if not Assigned(glBlendEquationSeparate) then Exit;
+ glDrawBuffers := SDL_GL_GetProcAddress('glDrawBuffers');
+ if not Assigned(glDrawBuffers) then Exit;
+ glStencilOpSeparate := SDL_GL_GetProcAddress('glStencilOpSeparate');
+ if not Assigned(glStencilOpSeparate) then Exit;
+ glStencilFuncSeparate := SDL_GL_GetProcAddress('glStencilFuncSeparate');
+ if not Assigned(glStencilFuncSeparate) then Exit;
+ glStencilMaskSeparate := SDL_GL_GetProcAddress('glStencilMaskSeparate');
+ if not Assigned(glStencilMaskSeparate) then Exit;
+ glAttachShader := SDL_GL_GetProcAddress('glAttachShader');
+ if not Assigned(glAttachShader) then Exit;
+ glBindAttribLocation := SDL_GL_GetProcAddress('glBindAttribLocation');
+ if not Assigned(glBindAttribLocation) then Exit;
+ glCompileShader := SDL_GL_GetProcAddress('glCompileShader');
+ if not Assigned(glCompileShader) then Exit;
+ glCreateProgram := SDL_GL_GetProcAddress('glCreateProgram');
+ if not Assigned(glCreateProgram) then Exit;
+ glCreateShader := SDL_GL_GetProcAddress('glCreateShader');
+ if not Assigned(glCreateShader) then Exit;
+ glDeleteProgram := SDL_GL_GetProcAddress('glDeleteProgram');
+ if not Assigned(glDeleteProgram) then Exit;
+ glDeleteShader := SDL_GL_GetProcAddress('glDeleteShader');
+ if not Assigned(glDeleteShader) then Exit;
+ glDetachShader := SDL_GL_GetProcAddress('glDetachShader');
+ if not Assigned(glDetachShader) then Exit;
+ glDisableVertexAttribArray := SDL_GL_GetProcAddress('glDisableVertexAttribArray');
+ if not Assigned(glDisableVertexAttribArray) then Exit;
+ glEnableVertexAttribArray := SDL_GL_GetProcAddress('glEnableVertexAttribArray');
+ if not Assigned(glEnableVertexAttribArray) then Exit;
+ glGetActiveAttrib := SDL_GL_GetProcAddress('glGetActiveAttrib');
+ if not Assigned(glGetActiveAttrib) then Exit;
+ glGetActiveUniform := SDL_GL_GetProcAddress('glGetActiveUniform');
+ if not Assigned(glGetActiveUniform) then Exit;
+ glGetAttachedShaders := SDL_GL_GetProcAddress('glGetAttachedShaders');
+ if not Assigned(glGetAttachedShaders) then Exit;
+ glGetAttribLocation := SDL_GL_GetProcAddress('glGetAttribLocation');
+ if not Assigned(glGetAttribLocation) then Exit;
+ glGetProgramiv := SDL_GL_GetProcAddress('glGetProgramiv');
+ if not Assigned(glGetProgramiv) then Exit;
+ glGetProgramInfoLog := SDL_GL_GetProcAddress('glGetProgramInfoLog');
+ if not Assigned(glGetProgramInfoLog) then Exit;
+ glGetShaderiv := SDL_GL_GetProcAddress('glGetShaderiv');
+ if not Assigned(glGetShaderiv) then Exit;
+ glGetShaderInfoLog := SDL_GL_GetProcAddress('glGetShaderInfoLog');
+ if not Assigned(glGetShaderInfoLog) then Exit;
+ glGetShaderSource := SDL_GL_GetProcAddress('glGetShaderSource');
+ if not Assigned(glGetShaderSource) then Exit;
+ glGetUniformLocation := SDL_GL_GetProcAddress('glGetUniformLocation');
+ if not Assigned(glGetUniformLocation) then Exit;
+ glGetUniformfv := SDL_GL_GetProcAddress('glGetUniformfv');
+ if not Assigned(glGetUniformfv) then Exit;
+ glGetUniformiv := SDL_GL_GetProcAddress('glGetUniformiv');
+ if not Assigned(glGetUniformiv) then Exit;
+ glGetVertexAttribdv := SDL_GL_GetProcAddress('glGetVertexAttribdv');
+ if not Assigned(glGetVertexAttribdv) then Exit;
+ glGetVertexAttribfv := SDL_GL_GetProcAddress('glGetVertexAttribfv');
+ if not Assigned(glGetVertexAttribfv) then Exit;
+ glGetVertexAttribiv := SDL_GL_GetProcAddress('glGetVertexAttribiv');
+ if not Assigned(glGetVertexAttribiv) then Exit;
+ glGetVertexAttribPointerv := SDL_GL_GetProcAddress('glGetVertexAttribPointerv');
+ if not Assigned(glGetVertexAttribPointerv) then Exit;
+ glIsProgram := SDL_GL_GetProcAddress('glIsProgram');
+ if not Assigned(glIsProgram) then Exit;
+ glIsShader := SDL_GL_GetProcAddress('glIsShader');
+ if not Assigned(glIsShader) then Exit;
+ glLinkProgram := SDL_GL_GetProcAddress('glLinkProgram');
+ if not Assigned(glLinkProgram) then Exit;
+ glShaderSource := SDL_GL_GetProcAddress('glShaderSource');
+ if not Assigned(glShaderSource) then Exit;
+ glUseProgram := SDL_GL_GetProcAddress('glUseProgram');
+ if not Assigned(glUseProgram) then Exit;
+ glUniform1f := SDL_GL_GetProcAddress('glUniform1f');
+ if not Assigned(glUniform1f) then Exit;
+ glUniform2f := SDL_GL_GetProcAddress('glUniform2f');
+ if not Assigned(glUniform2f) then Exit;
+ glUniform3f := SDL_GL_GetProcAddress('glUniform3f');
+ if not Assigned(glUniform3f) then Exit;
+ glUniform4f := SDL_GL_GetProcAddress('glUniform4f');
+ if not Assigned(glUniform4f) then Exit;
+ glUniform1i := SDL_GL_GetProcAddress('glUniform1i');
+ if not Assigned(glUniform1i) then Exit;
+ glUniform2i := SDL_GL_GetProcAddress('glUniform2i');
+ if not Assigned(glUniform2i) then Exit;
+ glUniform3i := SDL_GL_GetProcAddress('glUniform3i');
+ if not Assigned(glUniform3i) then Exit;
+ glUniform4i := SDL_GL_GetProcAddress('glUniform4i');
+ if not Assigned(glUniform4i) then Exit;
+ glUniform1fv := SDL_GL_GetProcAddress('glUniform1fv');
+ if not Assigned(glUniform1fv) then Exit;
+ glUniform2fv := SDL_GL_GetProcAddress('glUniform2fv');
+ if not Assigned(glUniform2fv) then Exit;
+ glUniform3fv := SDL_GL_GetProcAddress('glUniform3fv');
+ if not Assigned(glUniform3fv) then Exit;
+ glUniform4fv := SDL_GL_GetProcAddress('glUniform4fv');
+ if not Assigned(glUniform4fv) then Exit;
+ glUniform1iv := SDL_GL_GetProcAddress('glUniform1iv');
+ if not Assigned(glUniform1iv) then Exit;
+ glUniform2iv := SDL_GL_GetProcAddress('glUniform2iv');
+ if not Assigned(glUniform2iv) then Exit;
+ glUniform3iv := SDL_GL_GetProcAddress('glUniform3iv');
+ if not Assigned(glUniform3iv) then Exit;
+ glUniform4iv := SDL_GL_GetProcAddress('glUniform4iv');
+ if not Assigned(glUniform4iv) then Exit;
+ glUniformMatrix2fv := SDL_GL_GetProcAddress('glUniformMatrix2fv');
+ if not Assigned(glUniformMatrix2fv) then Exit;
+ glUniformMatrix3fv := SDL_GL_GetProcAddress('glUniformMatrix3fv');
+ if not Assigned(glUniformMatrix3fv) then Exit;
+ glUniformMatrix4fv := SDL_GL_GetProcAddress('glUniformMatrix4fv');
+ if not Assigned(glUniformMatrix4fv) then Exit;
+ glValidateProgram := SDL_GL_GetProcAddress('glValidateProgram');
+ if not Assigned(glValidateProgram) then Exit;
+ glVertexAttrib1d := SDL_GL_GetProcAddress('glVertexAttrib1d');
+ if not Assigned(glVertexAttrib1d) then Exit;
+ glVertexAttrib1dv := SDL_GL_GetProcAddress('glVertexAttrib1dv');
+ if not Assigned(glVertexAttrib1dv) then Exit;
+ glVertexAttrib1f := SDL_GL_GetProcAddress('glVertexAttrib1f');
+ if not Assigned(glVertexAttrib1f) then Exit;
+ glVertexAttrib1fv := SDL_GL_GetProcAddress('glVertexAttrib1fv');
+ if not Assigned(glVertexAttrib1fv) then Exit;
+ glVertexAttrib1s := SDL_GL_GetProcAddress('glVertexAttrib1s');
+ if not Assigned(glVertexAttrib1s) then Exit;
+ glVertexAttrib1sv := SDL_GL_GetProcAddress('glVertexAttrib1sv');
+ if not Assigned(glVertexAttrib1sv) then Exit;
+ glVertexAttrib2d := SDL_GL_GetProcAddress('glVertexAttrib2d');
+ if not Assigned(glVertexAttrib2d) then Exit;
+ glVertexAttrib2dv := SDL_GL_GetProcAddress('glVertexAttrib2dv');
+ if not Assigned(glVertexAttrib2dv) then Exit;
+ glVertexAttrib2f := SDL_GL_GetProcAddress('glVertexAttrib2f');
+ if not Assigned(glVertexAttrib2f) then Exit;
+ glVertexAttrib2fv := SDL_GL_GetProcAddress('glVertexAttrib2fv');
+ if not Assigned(glVertexAttrib2fv) then Exit;
+ glVertexAttrib2s := SDL_GL_GetProcAddress('glVertexAttrib2s');
+ if not Assigned(glVertexAttrib2s) then Exit;
+ glVertexAttrib2sv := SDL_GL_GetProcAddress('glVertexAttrib2sv');
+ if not Assigned(glVertexAttrib2sv) then Exit;
+ glVertexAttrib3d := SDL_GL_GetProcAddress('glVertexAttrib3d');
+ if not Assigned(glVertexAttrib3d) then Exit;
+ glVertexAttrib3dv := SDL_GL_GetProcAddress('glVertexAttrib3dv');
+ if not Assigned(glVertexAttrib3dv) then Exit;
+ glVertexAttrib3f := SDL_GL_GetProcAddress('glVertexAttrib3f');
+ if not Assigned(glVertexAttrib3f) then Exit;
+ glVertexAttrib3fv := SDL_GL_GetProcAddress('glVertexAttrib3fv');
+ if not Assigned(glVertexAttrib3fv) then Exit;
+ glVertexAttrib3s := SDL_GL_GetProcAddress('glVertexAttrib3s');
+ if not Assigned(glVertexAttrib3s) then Exit;
+ glVertexAttrib3sv := SDL_GL_GetProcAddress('glVertexAttrib3sv');
+ if not Assigned(glVertexAttrib3sv) then Exit;
+ glVertexAttrib4Nbv := SDL_GL_GetProcAddress('glVertexAttrib4Nbv');
+ if not Assigned(glVertexAttrib4Nbv) then Exit;
+ glVertexAttrib4Niv := SDL_GL_GetProcAddress('glVertexAttrib4Niv');
+ if not Assigned(glVertexAttrib4Niv) then Exit;
+ glVertexAttrib4Nsv := SDL_GL_GetProcAddress('glVertexAttrib4Nsv');
+ if not Assigned(glVertexAttrib4Nsv) then Exit;
+ glVertexAttrib4Nub := SDL_GL_GetProcAddress('glVertexAttrib4Nub');
+ if not Assigned(glVertexAttrib4Nub) then Exit;
+ glVertexAttrib4Nubv := SDL_GL_GetProcAddress('glVertexAttrib4Nubv');
+ if not Assigned(glVertexAttrib4Nubv) then Exit;
+ glVertexAttrib4Nuiv := SDL_GL_GetProcAddress('glVertexAttrib4Nuiv');
+ if not Assigned(glVertexAttrib4Nuiv) then Exit;
+ glVertexAttrib4Nusv := SDL_GL_GetProcAddress('glVertexAttrib4Nusv');
+ if not Assigned(glVertexAttrib4Nusv) then Exit;
+ glVertexAttrib4bv := SDL_GL_GetProcAddress('glVertexAttrib4bv');
+ if not Assigned(glVertexAttrib4bv) then Exit;
+ glVertexAttrib4d := SDL_GL_GetProcAddress('glVertexAttrib4d');
+ if not Assigned(glVertexAttrib4d) then Exit;
+ glVertexAttrib4dv := SDL_GL_GetProcAddress('glVertexAttrib4dv');
+ if not Assigned(glVertexAttrib4dv) then Exit;
+ glVertexAttrib4f := SDL_GL_GetProcAddress('glVertexAttrib4f');
+ if not Assigned(glVertexAttrib4f) then Exit;
+ glVertexAttrib4fv := SDL_GL_GetProcAddress('glVertexAttrib4fv');
+ if not Assigned(glVertexAttrib4fv) then Exit;
+ glVertexAttrib4iv := SDL_GL_GetProcAddress('glVertexAttrib4iv');
+ if not Assigned(glVertexAttrib4iv) then Exit;
+ glVertexAttrib4s := SDL_GL_GetProcAddress('glVertexAttrib4s');
+ if not Assigned(glVertexAttrib4s) then Exit;
+ glVertexAttrib4sv := SDL_GL_GetProcAddress('glVertexAttrib4sv');
+ if not Assigned(glVertexAttrib4sv) then Exit;
+ glVertexAttrib4ubv := SDL_GL_GetProcAddress('glVertexAttrib4ubv');
+ if not Assigned(glVertexAttrib4ubv) then Exit;
+ glVertexAttrib4uiv := SDL_GL_GetProcAddress('glVertexAttrib4uiv');
+ if not Assigned(glVertexAttrib4uiv) then Exit;
+ glVertexAttrib4usv := SDL_GL_GetProcAddress('glVertexAttrib4usv');
+ if not Assigned(glVertexAttrib4usv) then Exit;
+ glVertexAttribPointer := SDL_GL_GetProcAddress('glVertexAttribPointer');
+ if not Assigned(glVertexAttribPointer) then Exit;
+ Result := TRUE;
+
+end;
+
+function glext_LoadExtension(ext: String): Boolean;
+begin
+
+ Result := FALSE;
+
+ if ext = 'GL_version_1_2' then Result := Load_GL_version_1_2
+ else if ext = 'GL_ARB_imaging' then Result := Load_GL_ARB_imaging
+ else if ext = 'GL_version_1_3' then Result := Load_GL_version_1_3
+ else if ext = 'GL_ARB_multitexture' then Result := Load_GL_ARB_multitexture
+ else if ext = 'GL_ARB_transpose_matrix' then Result := Load_GL_ARB_transpose_matrix
+ else if ext = 'GL_ARB_multisample' then Result := Load_GL_ARB_multisample
+ else if ext = 'GL_ARB_texture_env_add' then Result := Load_GL_ARB_texture_env_add
+ {$IFDEF WINDOWS}
+ else if ext = 'WGL_ARB_extensions_string' then Result := Load_WGL_ARB_extensions_string
+ else if ext = 'WGL_ARB_buffer_region' then Result := Load_WGL_ARB_buffer_region
+ {$ENDIF}
+ else if ext = 'GL_ARB_texture_cube_map' then Result := Load_GL_ARB_texture_cube_map
+ else if ext = 'GL_ARB_depth_texture' then Result := Load_GL_ARB_depth_texture
+ else if ext = 'GL_ARB_point_parameters' then Result := Load_GL_ARB_point_parameters
+ else if ext = 'GL_ARB_shadow' then Result := Load_GL_ARB_shadow
+ else if ext = 'GL_ARB_shadow_ambient' then Result := Load_GL_ARB_shadow_ambient
+ else if ext = 'GL_ARB_texture_border_clamp' then Result := Load_GL_ARB_texture_border_clamp
+ else if ext = 'GL_ARB_texture_compression' then Result := Load_GL_ARB_texture_compression
+ else if ext = 'GL_ARB_texture_env_combine' then Result := Load_GL_ARB_texture_env_combine
+ else if ext = 'GL_ARB_texture_env_crossbar' then Result := Load_GL_ARB_texture_env_crossbar
+ else if ext = 'GL_ARB_texture_env_dot3' then Result := Load_GL_ARB_texture_env_dot3
+ else if ext = 'GL_ARB_texture_mirrored_repeat' then Result := Load_GL_ARB_texture_mirrored_repeat
+ else if ext = 'GL_ARB_vertex_blend' then Result := Load_GL_ARB_vertex_blend
+ else if ext = 'GL_ARB_vertex_program' then Result := Load_GL_ARB_vertex_program
+ else if ext = 'GL_ARB_window_pos' then Result := Load_GL_ARB_window_pos
+ else if ext = 'GL_EXT_422_pixels' then Result := Load_GL_EXT_422_pixels
+ else if ext = 'GL_EXT_abgr' then Result := Load_GL_EXT_abgr
+ else if ext = 'GL_EXT_bgra' then Result := Load_GL_EXT_bgra
+ else if ext = 'GL_EXT_blend_color' then Result := Load_GL_EXT_blend_color
+ else if ext = 'GL_EXT_blend_func_separate' then Result := Load_GL_EXT_blend_func_separate
+ else if ext = 'GL_EXT_blend_logic_op' then Result := Load_GL_EXT_blend_logic_op
+ else if ext = 'GL_EXT_blend_minmax' then Result := Load_GL_EXT_blend_minmax
+ else if ext = 'GL_EXT_blend_subtract' then Result := Load_GL_EXT_blend_subtract
+ else if ext = 'GL_EXT_clip_volume_hint' then Result := Load_GL_EXT_clip_volume_hint
+ else if ext = 'GL_EXT_color_subtable' then Result := Load_GL_EXT_color_subtable
+ else if ext = 'GL_EXT_compiled_vertex_array' then Result := Load_GL_EXT_compiled_vertex_array
+ else if ext = 'GL_EXT_convolution' then Result := Load_GL_EXT_convolution
+ else if ext = 'GL_EXT_histogram' then Result := Load_GL_EXT_histogram
+ else if ext = 'GL_EXT_multi_draw_arrays' then Result := Load_GL_EXT_multi_draw_arrays
+ else if ext = 'GL_EXT_packed_pixels' then Result := Load_GL_EXT_packed_pixels
+ else if ext = 'GL_EXT_paletted_texture' then Result := Load_GL_EXT_paletted_texture
+ else if ext = 'GL_EXT_point_parameters' then Result := Load_GL_EXT_point_parameters
+ else if ext = 'GL_EXT_polygon_offset' then Result := Load_GL_EXT_polygon_offset
+ else if ext = 'GL_EXT_separate_specular_color' then Result := Load_GL_EXT_separate_specular_color
+ else if ext = 'GL_EXT_shadow_funcs' then Result := Load_GL_EXT_shadow_funcs
+ else if ext = 'GL_EXT_shared_texture_palette' then Result := Load_GL_EXT_shared_texture_palette
+ else if ext = 'GL_EXT_stencil_two_side' then Result := Load_GL_EXT_stencil_two_side
+ else if ext = 'GL_EXT_stencil_wrap' then Result := Load_GL_EXT_stencil_wrap
+ else if ext = 'GL_EXT_subtexture' then Result := Load_GL_EXT_subtexture
+ else if ext = 'GL_EXT_texture3D' then Result := Load_GL_EXT_texture3D
+ else if ext = 'GL_EXT_texture_compression_s3tc' then Result := Load_GL_EXT_texture_compression_s3tc
+ else if ext = 'GL_EXT_texture_env_add' then Result := Load_GL_EXT_texture_env_add
+ else if ext = 'GL_EXT_texture_env_combine' then Result := Load_GL_EXT_texture_env_combine
+ else if ext = 'GL_EXT_texture_env_dot3' then Result := Load_GL_EXT_texture_env_dot3
+ else if ext = 'GL_EXT_texture_filter_anisotropic' then Result := Load_GL_EXT_texture_filter_anisotropic
+ else if ext = 'GL_EXT_texture_lod_bias' then Result := Load_GL_EXT_texture_lod_bias
+ else if ext = 'GL_EXT_texture_object' then Result := Load_GL_EXT_texture_object
+ else if ext = 'GL_EXT_vertex_array' then Result := Load_GL_EXT_vertex_array
+ else if ext = 'GL_EXT_vertex_shader' then Result := Load_GL_EXT_vertex_shader
+ else if ext = 'GL_EXT_vertex_weighting' then Result := Load_GL_EXT_vertex_weighting
+ else if ext = 'GL_HP_occlusion_test' then Result := Load_GL_HP_occlusion_test
+ else if ext = 'GL_NV_blend_square' then Result := Load_GL_NV_blend_square
+ else if ext = 'GL_NV_copy_depth_to_color' then Result := Load_GL_NV_copy_depth_to_color
+ else if ext = 'GL_NV_depth_clamp' then Result := Load_GL_NV_depth_clamp
+ else if ext = 'GL_NV_evaluators' then Result := Load_GL_NV_evaluators
+ else if ext = 'GL_NV_fence' then Result := Load_GL_NV_fence
+ else if ext = 'GL_NV_fog_distance' then Result := Load_GL_NV_fog_distance
+ else if ext = 'GL_NV_light_max_exponent' then Result := Load_GL_NV_light_max_exponent
+ else if ext = 'GL_NV_multisample_filter_hint' then Result := Load_GL_NV_multisample_filter_hint
+ else if ext = 'GL_NV_occlusion_query' then Result := Load_GL_NV_occlusion_query
+ else if ext = 'GL_NV_packed_depth_stencil' then Result := Load_GL_NV_packed_depth_stencil
+ else if ext = 'GL_NV_point_sprite' then Result := Load_GL_NV_point_sprite
+ else if ext = 'GL_NV_register_combiners' then Result := Load_GL_NV_register_combiners
+ else if ext = 'GL_NV_register_combiners2' then Result := Load_GL_NV_register_combiners2
+ else if ext = 'GL_NV_texgen_emboss' then Result := Load_GL_NV_texgen_emboss
+ else if ext = 'GL_NV_texgen_reflection' then Result := Load_GL_NV_texgen_reflection
+ else if ext = 'GL_NV_texture_compression_vtc' then Result := Load_GL_NV_texture_compression_vtc
+ else if ext = 'GL_NV_texture_env_combine4' then Result := Load_GL_NV_texture_env_combine4
+ else if ext = 'GL_NV_texture_rectangle' then Result := Load_GL_NV_texture_rectangle
+ else if ext = 'GL_NV_texture_shader' then Result := Load_GL_NV_texture_shader
+ else if ext = 'GL_NV_texture_shader2' then Result := Load_GL_NV_texture_shader2
+ else if ext = 'GL_NV_texture_shader3' then Result := Load_GL_NV_texture_shader3
+ else if ext = 'GL_NV_vertex_array_range' then Result := Load_GL_NV_vertex_array_range
+ else if ext = 'GL_NV_vertex_array_range2' then Result := Load_GL_NV_vertex_array_range2
+ else if ext = 'GL_NV_vertex_program' then Result := Load_GL_NV_vertex_program
+ else if ext = 'GL_NV_vertex_program1_1' then Result := Load_GL_NV_vertex_program1_1
+ else if ext = 'GL_ATI_element_array' then Result := Load_GL_ATI_element_array
+ else if ext = 'GL_ATI_envmap_bumpmap' then Result := Load_GL_ATI_envmap_bumpmap
+ else if ext = 'GL_ATI_fragment_shader' then Result := Load_GL_ATI_fragment_shader
+ else if ext = 'GL_ATI_pn_triangles' then Result := Load_GL_ATI_pn_triangles
+ else if ext = 'GL_ATI_texture_mirror_once' then Result := Load_GL_ATI_texture_mirror_once
+ else if ext = 'GL_ATI_vertex_array_object' then Result := Load_GL_ATI_vertex_array_object
+ else if ext = 'GL_ATI_vertex_streams' then Result := Load_GL_ATI_vertex_streams
+ {$IFDEF WINDOWS}
+ else if ext = 'WGL_I3D_image_buffer' then Result := Load_WGL_I3D_image_buffer
+ else if ext = 'WGL_I3D_swap_frame_lock' then Result := Load_WGL_I3D_swap_frame_lock
+ else if ext = 'WGL_I3D_swap_frame_usage' then Result := Load_WGL_I3D_swap_frame_usage
+ {$ENDIF}
+ else if ext = 'GL_3DFX_texture_compression_FXT1' then Result := Load_GL_3DFX_texture_compression_FXT1
+ else if ext = 'GL_IBM_cull_vertex' then Result := Load_GL_IBM_cull_vertex
+ else if ext = 'GL_IBM_multimode_draw_arrays' then Result := Load_GL_IBM_multimode_draw_arrays
+ else if ext = 'GL_IBM_raster_pos_clip' then Result := Load_GL_IBM_raster_pos_clip
+ else if ext = 'GL_IBM_texture_mirrored_repeat' then Result := Load_GL_IBM_texture_mirrored_repeat
+ else if ext = 'GL_IBM_vertex_array_lists' then Result := Load_GL_IBM_vertex_array_lists
+ else if ext = 'GL_MESA_resize_buffers' then Result := Load_GL_MESA_resize_buffers
+ else if ext = 'GL_MESA_window_pos' then Result := Load_GL_MESA_window_pos
+ else if ext = 'GL_OML_interlace' then Result := Load_GL_OML_interlace
+ else if ext = 'GL_OML_resample' then Result := Load_GL_OML_resample
+ else if ext = 'GL_OML_subsample' then Result := Load_GL_OML_subsample
+ else if ext = 'GL_SGIS_generate_mipmap' then Result := Load_GL_SGIS_generate_mipmap
+ else if ext = 'GL_SGIS_multisample' then Result := Load_GL_SGIS_multisample
+ else if ext = 'GL_SGIS_pixel_texture' then Result := Load_GL_SGIS_pixel_texture
+ else if ext = 'GL_SGIS_texture_border_clamp' then Result := Load_GL_SGIS_texture_border_clamp
+ else if ext = 'GL_SGIS_texture_color_mask' then Result := Load_GL_SGIS_texture_color_mask
+ else if ext = 'GL_SGIS_texture_edge_clamp' then Result := Load_GL_SGIS_texture_edge_clamp
+ else if ext = 'GL_SGIS_texture_lod' then Result := Load_GL_SGIS_texture_lod
+ else if ext = 'GL_SGIS_depth_texture' then Result := Load_GL_SGIS_depth_texture
+ else if ext = 'GL_SGIX_fog_offset' then Result := Load_GL_SGIX_fog_offset
+ else if ext = 'GL_SGIX_interlace' then Result := Load_GL_SGIX_interlace
+ else if ext = 'GL_SGIX_shadow_ambient' then Result := Load_GL_SGIX_shadow_ambient
+ else if ext = 'GL_SGI_color_matrix' then Result := Load_GL_SGI_color_matrix
+ else if ext = 'GL_SGI_color_table' then Result := Load_GL_SGI_color_table
+ else if ext = 'GL_SGI_texture_color_table' then Result := Load_GL_SGI_texture_color_table
+ else if ext = 'GL_SUN_vertex' then Result := Load_GL_SUN_vertex
+ else if ext = 'GL_ARB_fragment_program' then Result := Load_GL_ARB_fragment_program
+ else if ext = 'GL_ATI_text_fragment_shader' then Result := Load_GL_ATI_text_fragment_shader
+ else if ext = 'GL_APPLE_client_storage' then Result := Load_GL_APPLE_client_storage
+ else if ext = 'GL_APPLE_element_array' then Result := Load_GL_APPLE_element_array
+ else if ext = 'GL_APPLE_fence' then Result := Load_GL_APPLE_fence
+ else if ext = 'GL_APPLE_vertex_array_object' then Result := Load_GL_APPLE_vertex_array_object
+ else if ext = 'GL_APPLE_vertex_array_range' then Result := Load_GL_APPLE_vertex_array_range
+ {$IFDEF WINDOWS}
+ else if ext = 'WGL_ARB_pixel_format' then Result := Load_WGL_ARB_pixel_format
+ else if ext = 'WGL_ARB_make_current_read' then Result := Load_WGL_ARB_make_current_read
+ else if ext = 'WGL_ARB_pbuffer' then Result := Load_WGL_ARB_pbuffer
+ else if ext = 'WGL_EXT_swap_control' then Result := Load_WGL_EXT_swap_control
+ else if ext = 'WGL_ARB_render_texture' then Result := Load_WGL_ARB_render_texture
+ else if ext = 'WGL_EXT_extensions_string' then Result := Load_WGL_EXT_extensions_string
+ else if ext = 'WGL_EXT_make_current_read' then Result := Load_WGL_EXT_make_current_read
+ else if ext = 'WGL_EXT_pbuffer' then Result := Load_WGL_EXT_pbuffer
+ else if ext = 'WGL_EXT_pixel_format' then Result := Load_WGL_EXT_pixel_format
+ else if ext = 'WGL_I3D_digital_video_control' then Result := Load_WGL_I3D_digital_video_control
+ else if ext = 'WGL_I3D_gamma' then Result := Load_WGL_I3D_gamma
+ else if ext = 'WGL_I3D_genlock' then Result := Load_WGL_I3D_genlock
+ {$ENDIF}
+ else if ext = 'GL_ARB_matrix_palette' then Result := Load_GL_ARB_matrix_palette
+ else if ext = 'GL_NV_element_array' then Result := Load_GL_NV_element_array
+ else if ext = 'GL_NV_float_buffer' then Result := Load_GL_NV_float_buffer
+ else if ext = 'GL_NV_fragment_program' then Result := Load_GL_NV_fragment_program
+ else if ext = 'GL_NV_primitive_restart' then Result := Load_GL_NV_primitive_restart
+ else if ext = 'GL_NV_vertex_program2' then Result := Load_GL_NV_vertex_program2
+ {$IFDEF WINDOWS}
+ else if ext = 'WGL_NV_render_texture_rectangle' then Result := Load_WGL_NV_render_texture_rectangle
+ {$ENDIF}
+ else if ext = 'GL_NV_pixel_data_range' then Result := Load_GL_NV_pixel_data_range
+ else if ext = 'GL_EXT_texture_rectangle' then Result := Load_GL_EXT_texture_rectangle
+ else if ext = 'GL_S3_s3tc' then Result := Load_GL_S3_s3tc
+ else if ext = 'GL_ATI_draw_buffers' then Result := Load_GL_ATI_draw_buffers
+ {$IFDEF WINDOWS}
+ else if ext = 'WGL_ATI_pixel_format_float' then Result := Load_WGL_ATI_pixel_format_float
+ {$ENDIF}
+ else if ext = 'GL_ATI_texture_env_combine3' then Result := Load_GL_ATI_texture_env_combine3
+ else if ext = 'GL_ATI_texture_float' then Result := Load_GL_ATI_texture_float
+ else if ext = 'GL_NV_texture_expand_normal' then Result := Load_GL_NV_texture_expand_normal
+ else if ext = 'GL_NV_half_float' then Result := Load_GL_NV_half_float
+ else if ext = 'GL_ATI_map_object_buffer' then Result := Load_GL_ATI_map_object_buffer
+ else if ext = 'GL_ATI_separate_stencil' then Result := Load_GL_ATI_separate_stencil
+ else if ext = 'GL_ATI_vertex_attrib_array_object' then Result := Load_GL_ATI_vertex_attrib_array_object
+ else if ext = 'GL_ARB_vertex_buffer_object' then Result := Load_GL_ARB_vertex_buffer_object
+ else if ext = 'GL_ARB_occlusion_query' then Result := Load_GL_ARB_occlusion_query
+ else if ext = 'GL_ARB_shader_objects' then Result := Load_GL_ARB_shader_objects
+ else if ext = 'GL_ARB_vertex_shader' then Result := Load_GL_ARB_vertex_shader
+ else if ext = 'GL_ARB_fragment_shader' then Result := Load_GL_ARB_fragment_shader
+ else if ext = 'GL_ARB_shading_language_100' then Result := Load_GL_ARB_shading_language_100
+ else if ext = 'GL_ARB_texture_non_power_of_two' then Result := Load_GL_ARB_texture_non_power_of_two
+ else if ext = 'GL_ARB_point_sprite' then Result := Load_GL_ARB_point_sprite
+ else if ext = 'GL_EXT_depth_bounds_test' then Result := Load_GL_EXT_depth_bounds_test
+ else if ext = 'GL_EXT_secondary_color' then Result := Load_GL_EXT_secondary_color
+ else if ext = 'GL_EXT_texture_mirror_clamp' then Result := Load_GL_EXT_texture_mirror_clamp
+ else if ext = 'GL_EXT_blend_equation_separate' then Result := Load_GL_EXT_blend_equation_separate
+ else if ext = 'GL_MESA_pack_invert' then Result := Load_GL_MESA_pack_invert
+ else if ext = 'GL_MESA_ycbcr_texture' then Result := Load_GL_MESA_ycbcr_texture
+ else if ext = 'GL_ARB_fragment_program_shadow' then Result := Load_GL_ARB_fragment_program_shadow
+ else if ext = 'GL_EXT_fog_coord' then Result := Load_GL_EXT_fog_coord
+ else if ext = 'GL_NV_fragment_program_option' then Result := Load_GL_NV_fragment_program_option
+ else if ext = 'GL_EXT_pixel_buffer_object' then Result := Load_GL_EXT_pixel_buffer_object
+ else if ext = 'GL_NV_fragment_program2' then Result := Load_GL_NV_fragment_program2
+ else if ext = 'GL_NV_vertex_program2_option' then Result := Load_GL_NV_vertex_program2_option
+ else if ext = 'GL_NV_vertex_program3' then Result := Load_GL_NV_vertex_program3
+ else if ext = 'GL_ARB_draw_buffers' then Result := Load_GL_ARB_draw_buffers
+ else if ext = 'GL_ARB_texture_rectangle' then Result := Load_GL_ARB_texture_rectangle
+ else if ext = 'GL_ARB_color_buffer_float' then Result := Load_GL_ARB_color_buffer_float
+ else if ext = 'GL_ARB_half_float_pixel' then Result := Load_GL_ARB_half_float_pixel
+ else if ext = 'GL_ARB_texture_float' then Result := Load_GL_ARB_texture_float
+ else if ext = 'GL_EXT_texture_compression_dxt1' then Result := Load_GL_EXT_texture_compression_dxt1
+ else if ext = 'GL_ARB_pixel_buffer_object' then Result := Load_GL_ARB_pixel_buffer_object
+ else if ext = 'GL_EXT_framebuffer_object' then Result := Load_GL_EXT_framebuffer_object
+ else if ext = 'GL_version_1_4' then Result := Load_GL_version_1_4
+ else if ext = 'GL_version_1_5' then Result := Load_GL_version_1_5
+ else if ext = 'GL_version_2_0' then Result := Load_GL_version_2_0
+
+end;
+
+end.
diff --git a/Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/glu.pas b/Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/glu.pas
new file mode 100644
index 00000000..371ccdda
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/glu.pas
@@ -0,0 +1,582 @@
+unit glu;
+{
+ $Id: glu.pas,v 1.8 2007/05/20 20:28:31 savage Exp $
+
+ Adaption of the delphi3d.net OpenGL units to FreePascal
+ Sebastian Guenther (sg@freepascal.org) in 2002
+ These units are free to use
+}
+
+(*++ BUILD Version: 0004 // Increment this if a change has global effects
+
+Copyright (c) 1985-95, Microsoft Corporation
+
+Module Name:
+
+ glu.h
+
+Abstract:
+
+ Procedure declarations, constant definitions and macros for the OpenGL
+ Utility Library.
+
+--*)
+
+(*
+** Copyright 1991-1993, Silicon Graphics, Inc.
+** All Rights Reserved.
+**
+** This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
+** the contents of this file may not be disclosed to third parties, copied or
+** duplicated in any form, in whole or in part, without the prior written
+** permission of Silicon Graphics, Inc.
+**
+** RESTRICTED RIGHTS LEGEND:
+** Use, duplication or disclosure by the Government is subject to restrictions
+** as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
+** and Computer Software clause at DFARS 252.227-7013, and/or in similar or
+** successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
+** rights reserved under the Copyright Laws of the United States.
+*)
+
+(*
+** Return the error string associated with a particular error code.
+** This will return 0 for an invalid error code.
+**
+** The generic function prototype that can be compiled for ANSI or Unicode
+** is defined as follows:
+**
+** LPCTSTR APIENTRY gluErrorStringWIN (GLenum errCode);
+*)
+
+{******************************************************************************}
+{ }
+{ Converted to Delphi by Tom Nuydens (tom@delphi3d.net) }
+{ For the latest updates, visit Delphi3D: http://www.delphi3d.net }
+{ }
+{ Modified for Delphi/Kylix and FreePascal }
+{ by Dominique Louis ( Dominique@Savagesoftware.com.au) }
+{ For the latest updates, visit JEDI-SDL : http://www.sf.net/projects/jedi-sdl }
+{ }
+{******************************************************************************}
+
+{
+ $Log: glu.pas,v $
+ Revision 1.8 2007/05/20 20:28:31 savage
+ Initial Changes to Handle 64 Bits
+
+ Revision 1.7 2006/11/26 16:35:49 savage
+ Messed up the last change to GLUtessCombineDataProc, had to reapply it. Thanks Michalis.
+
+ Revision 1.6 2006/11/25 23:38:02 savage
+ Changes as proposed by Michalis Kamburelis for better FPC support
+
+ Revision 1.5 2006/11/20 21:20:59 savage
+ Updated to work in MacOS X
+
+ Revision 1.4 2005/05/22 18:52:09 savage
+ Changes as suggested by Michalis Kamburelis. Thanks again.
+
+ Revision 1.3 2004/10/07 21:01:29 savage
+ Fix for FPC
+
+ Revision 1.2 2004/08/14 22:54:30 savage
+ Updated so that Library name defines are correctly defined for MacOS X.
+
+ Revision 1.1 2004/03/30 21:53:54 savage
+ Moved to it's own folder.
+
+ Revision 1.4 2004/02/20 17:09:55 savage
+ Code tidied up in gl, glu and glut, while extensions in glext.pas are now loaded using SDL_GL_GetProcAddress, thus making it more cross-platform compatible, but now more tied to SDL.
+
+ Revision 1.3 2004/02/14 00:23:39 savage
+ As UNIX is defined in jedi-sdl.inc this will be used to check linux compatability as well. Units have been changed to reflect this change.
+
+ Revision 1.2 2004/02/14 00:09:19 savage
+ Changed uses to now make use of moduleloader.pas rather than dllfuncs.pas
+
+ Revision 1.1 2004/02/05 00:08:19 savage
+ Module 1.0 release
+
+ Revision 1.4 2003/06/02 12:32:13 savage
+ Modified Sources to avoid warnings with Delphi by moving CVS Logging to the top of the header files. Hopefully CVS Logging still works.
+
+ Revision 1.3 2003/05/29 22:55:00 savage
+ Make use of new DLLFunctions
+
+ Revision 1.2 2003/05/27 09:39:53 savage
+ Added better Gnu Pascal support.
+
+ Revision 1.1 2003/05/11 13:18:03 savage
+ Newest OpenGL Headers For Delphi, Kylix and FPC
+
+ Revision 1.2 2002/10/13 14:36:47 sg
+ * Win32 fix: The OS symbol is called "Win32", not "Windows"
+
+ Revision 1.1 2002/10/13 13:57:31 sg
+ * Finally, the new units are available: Match the C headers more closely;
+ support for OpenGL extensions, and much more. Based on the Delphi units
+ by Tom Nuydens of delphi3d.net
+
+}
+
+interface
+
+{$I jedi-sdl.inc}
+
+uses
+{$IFDEF __GPC__}
+ gpc,
+{$ENDIF}
+ moduleloader,
+ gl;
+
+const
+{$IFDEF WINDOWS}
+ GLuLibName = 'glu32.dll';
+{$ENDIF}
+
+{$IFDEF UNIX}
+{$IFDEF DARWIN}
+ GLuLibName = '/System/Library/Frameworks/OpenGL.framework/Libraries/libGLU.dylib';
+{$ELSE}
+ GLuLibName = 'libGLU.so';
+{$ENDIF}
+{$ENDIF}
+
+type
+ TViewPortArray = array[ 0..3 ] of GLint;
+ T16dArray = array[ 0..15 ] of GLdouble;
+ TCallBack = procedure;
+ T3dArray = array[ 0..2 ] of GLdouble;
+ T4pArray = array[ 0..3 ] of Pointer;
+ T4fArray = array[ 0..3 ] of GLfloat;
+{$IFNDEF __GPC__}
+ PPointer = ^Pointer;
+{$ENDIF}
+
+var
+ gluErrorString : function( errCode : GLenum ) : PChar; {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluErrorUnicodeStringEXT : function( errCode : GLenum ) : PWideChar; {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluGetString : function( name : GLenum ) : PChar; {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluOrtho2D : procedure( left, right, bottom, top : GLdouble ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluPerspective : procedure( fovy, aspect, zNear, zFar : GLdouble ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluPickMatrix : procedure( x, y, width, height : GLdouble; var viewport : TViewPortArray ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluLookAt : procedure( eyex, eyey, eyez, centerx, centery, centerz, upx, upy, upz : GLdouble ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluProject : function( objx, objy, objz : GLdouble; var modelMatrix, projMatrix : T16dArray; var viewport : TViewPortArray; winx, winy, winz : PGLdouble ) : Integer; {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluUnProject : function( winx, winy, winz : GLdouble; var modelMatrix, projMatrix : T16dArray; var viewport : TViewPortArray; objx, objy, objz : PGLdouble ) : Integer; {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluScaleImage : function( format : GLenum; widthin, heightin : GLint; typein : GLenum; const datain : Pointer; widthout, heightout : GLint; typeout : GLenum; dataout : Pointer ) : Integer; {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluBuild1DMipmaps : function( target : GLenum; components, width : GLint; format, atype : GLenum; const data : Pointer ) : Integer; {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluBuild2DMipmaps : function( target : GLenum; components, width, height : GLint; format, atype : GLenum; const data : Pointer ) : Integer; {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+
+type
+ GLUnurbs = record
+ end; PGLUnurbs = ^GLUnurbs;
+ GLUquadric = record
+ end; PGLUquadric = ^GLUquadric;
+ GLUtesselator = record
+ end; PGLUtesselator = ^GLUtesselator;
+
+ // backwards compatibility:
+ GLUnurbsObj = GLUnurbs; PGLUnurbsObj = PGLUnurbs;
+ GLUquadricObj = GLUquadric; PGLUquadricObj = PGLUquadric;
+ GLUtesselatorObj = GLUtesselator; PGLUtesselatorObj = PGLUtesselator;
+ GLUtriangulatorObj = GLUtesselator; PGLUtriangulatorObj = PGLUtesselator;
+
+var
+ gluNewQuadric : function : PGLUquadric; {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluDeleteQuadric : procedure( state : PGLUquadric ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluQuadricNormals : procedure( quadObject : PGLUquadric; normals : GLenum ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluQuadricTexture : procedure( quadObject : PGLUquadric; textureCoords : GLboolean ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluQuadricOrientation : procedure( quadObject : PGLUquadric; orientation : GLenum ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluQuadricDrawStyle : procedure( quadObject : PGLUquadric; drawStyle : GLenum ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluCylinder : procedure( qobj : PGLUquadric; baseRadius, topRadius, height : GLdouble; slices, stacks : GLint ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluDisk : procedure( qobj : PGLUquadric; innerRadius, outerRadius : GLdouble; slices, loops : GLint ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluPartialDisk : procedure( qobj : PGLUquadric; innerRadius, outerRadius : GLdouble; slices, loops : GLint; startAngle, sweepAngle : GLdouble ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluSphere : procedure( qobj : PGLuquadric; radius : GLdouble; slices, stacks : GLint ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluQuadricCallback : procedure( qobj : PGLUquadric; which : GLenum; fn : TCallBack ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluNewTess : function : PGLUtesselator; {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluDeleteTess : procedure( tess : PGLUtesselator ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluTessBeginPolygon : procedure( tess : PGLUtesselator; polygon_data : Pointer ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluTessBeginContour : procedure( tess : PGLUtesselator ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluTessVertex : procedure( tess : PGLUtesselator; var coords : T3dArray; data : Pointer ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluTessEndContour : procedure( tess : PGLUtesselator ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluTessEndPolygon : procedure( tess : PGLUtesselator ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluTessProperty : procedure( tess : PGLUtesselator; which : GLenum; value : GLdouble ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluTessNormal : procedure( tess : PGLUtesselator; x, y, z : GLdouble ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluTessCallback : procedure( tess : PGLUtesselator; which : GLenum; fn : TCallBack ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluGetTessProperty : procedure( tess : PGLUtesselator; which : GLenum; value : PGLdouble ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluNewNurbsRenderer : function : PGLUnurbs; {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluDeleteNurbsRenderer : procedure( nobj : PGLUnurbs ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluBeginSurface : procedure( nobj : PGLUnurbs ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluBeginCurve : procedure( nobj : PGLUnurbs ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluEndCurve : procedure( nobj : PGLUnurbs ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluEndSurface : procedure( nobj : PGLUnurbs ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluBeginTrim : procedure( nobj : PGLUnurbs ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluEndTrim : procedure( nobj : PGLUnurbs ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluPwlCurve : procedure( nobj : PGLUnurbs; count : GLint; aarray : PGLfloat; stride : GLint; atype : GLenum ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluNurbsCurve : procedure( nobj : PGLUnurbs; nknots : GLint; knot : PGLfloat; stride : GLint; ctlarray : PGLfloat; order : GLint; atype : GLenum ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluNurbsSurface : procedure( nobj : PGLUnurbs; sknot_count : GLint; sknot : PGLfloat; tknot_count : GLint; tknot : PGLfloat; s_stride, t_stride : GLint; ctlarray : PGLfloat; sorder, torder : GLint; atype : GLenum ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluLoadSamplingMatrices : procedure( nobj : PGLUnurbs; var modelMatrix, projMatrix : T16dArray; var viewport : TViewPortArray ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluNurbsProperty : procedure( nobj : PGLUnurbs; aproperty : GLenum; value : GLfloat ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluGetNurbsProperty : procedure( nobj : PGLUnurbs; aproperty : GLenum; value : PGLfloat ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluNurbsCallback : procedure( nobj : PGLUnurbs; which : GLenum; fn : TCallBack ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+
+(**** Callback function prototypes ****)
+
+type
+ // gluQuadricCallback
+ GLUquadricErrorProc = procedure( p : GLenum ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+
+ // gluTessCallback
+ GLUtessBeginProc = procedure( p : GLenum ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ GLUtessEdgeFlagProc = procedure( p : GLboolean ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ GLUtessVertexProc = procedure( p : Pointer ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ GLUtessEndProc = procedure; {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ GLUtessErrorProc = procedure( p : GLenum ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ GLUtessCombineProc = procedure( var p1 : T3dArray; p2 : T4pArray; p3 : T4fArray; p4 : PPointer ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ GLUtessBeginDataProc = procedure( p1 : GLenum; p2 : Pointer ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ GLUtessEdgeFlagDataProc = procedure( p1 : GLboolean; p2 : Pointer ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ GLUtessVertexDataProc = procedure( p1, p2 : Pointer ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ GLUtessEndDataProc = procedure( p : Pointer ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ GLUtessErrorDataProc = procedure( p1 : GLenum; p2 : Pointer ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ GLUtessCombineDataProc = procedure( var p1 : T3dArray; var p2 : T4pArray; var p3 : T4fArray;
+ p4 : PPointer; p5 : Pointer ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+
+ // gluNurbsCallback
+ GLUnurbsErrorProc = procedure( p : GLenum ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+
+
+//*** Generic constants ****/
+
+const
+ // Version
+ GLU_VERSION_1_1 = 1;
+ GLU_VERSION_1_2 = 1;
+
+ // Errors: (return value 0 = no error)
+ GLU_INVALID_ENUM = 100900;
+ GLU_INVALID_VALUE = 100901;
+ GLU_OUT_OF_MEMORY = 100902;
+ GLU_INCOMPATIBLE_GL_VERSION = 100903;
+
+ // StringName
+ GLU_VERSION = 100800;
+ GLU_EXTENSIONS = 100801;
+
+ // Boolean
+ GLU_TRUE = GL_TRUE;
+ GLU_FALSE = GL_FALSE;
+
+
+ //*** Quadric constants ****/
+
+ // QuadricNormal
+ GLU_SMOOTH = 100000;
+ GLU_FLAT = 100001;
+ GLU_NONE = 100002;
+
+ // QuadricDrawStyle
+ GLU_POINT = 100010;
+ GLU_LINE = 100011;
+ GLU_FILL = 100012;
+ GLU_SILHOUETTE = 100013;
+
+ // QuadricOrientation
+ GLU_OUTSIDE = 100020;
+ GLU_INSIDE = 100021;
+
+ // Callback types:
+ // GLU_ERROR = 100103;
+
+
+ //*** Tesselation constants ****/
+
+ GLU_TESS_MAX_COORD = 1.0E150;
+
+ // TessProperty
+ GLU_TESS_WINDING_RULE = 100140;
+ GLU_TESS_BOUNDARY_ONLY = 100141;
+ GLU_TESS_TOLERANCE = 100142;
+
+ // TessWinding
+ GLU_TESS_WINDING_ODD = 100130;
+ GLU_TESS_WINDING_NONZERO = 100131;
+ GLU_TESS_WINDING_POSITIVE = 100132;
+ GLU_TESS_WINDING_NEGATIVE = 100133;
+ GLU_TESS_WINDING_ABS_GEQ_TWO = 100134;
+
+ // TessCallback
+ GLU_TESS_BEGIN = 100100; // void (CALLBACK*)(GLenum type)
+ GLU_TESS_VERTEX = 100101; // void (CALLBACK*)(void *data)
+ GLU_TESS_END = 100102; // void (CALLBACK*)(void)
+ GLU_TESS_ERROR = 100103; // void (CALLBACK*)(GLenum errno)
+ GLU_TESS_EDGE_FLAG = 100104; // void (CALLBACK*)(GLboolean boundaryEdge)
+ GLU_TESS_COMBINE = 100105; { void (CALLBACK*)(GLdouble coords[3],
+ void *data[4],
+ GLfloat weight[4],
+ void **dataOut) }
+ GLU_TESS_BEGIN_DATA = 100106; { void (CALLBACK*)(GLenum type,
+ void *polygon_data) }
+ GLU_TESS_VERTEX_DATA = 100107; { void (CALLBACK*)(void *data,
+ void *polygon_data) }
+ GLU_TESS_END_DATA = 100108; // void (CALLBACK*)(void *polygon_data)
+ GLU_TESS_ERROR_DATA = 100109; { void (CALLBACK*)(GLenum errno,
+ void *polygon_data) }
+ GLU_TESS_EDGE_FLAG_DATA = 100110; { void (CALLBACK*)(GLboolean boundaryEdge,
+ void *polygon_data) }
+ GLU_TESS_COMBINE_DATA = 100111; { void (CALLBACK*)(GLdouble coords[3],
+ void *data[4],
+ GLfloat weight[4],
+ void **dataOut,
+ void *polygon_data) }
+
+ // TessError
+ GLU_TESS_ERROR1 = 100151;
+ GLU_TESS_ERROR2 = 100152;
+ GLU_TESS_ERROR3 = 100153;
+ GLU_TESS_ERROR4 = 100154;
+ GLU_TESS_ERROR5 = 100155;
+ GLU_TESS_ERROR6 = 100156;
+ GLU_TESS_ERROR7 = 100157;
+ GLU_TESS_ERROR8 = 100158;
+
+ GLU_TESS_MISSING_BEGIN_POLYGON = GLU_TESS_ERROR1;
+ GLU_TESS_MISSING_BEGIN_CONTOUR = GLU_TESS_ERROR2;
+ GLU_TESS_MISSING_END_POLYGON = GLU_TESS_ERROR3;
+ GLU_TESS_MISSING_END_CONTOUR = GLU_TESS_ERROR4;
+ GLU_TESS_COORD_TOO_LARGE = GLU_TESS_ERROR5;
+ GLU_TESS_NEED_COMBINE_CALLBACK = GLU_TESS_ERROR6;
+
+ //*** NURBS constants ****/
+
+ // NurbsProperty
+ GLU_AUTO_LOAD_MATRIX = 100200;
+ GLU_CULLING = 100201;
+ GLU_SAMPLING_TOLERANCE = 100203;
+ GLU_DISPLAY_MODE = 100204;
+ GLU_PARAMETRIC_TOLERANCE = 100202;
+ GLU_SAMPLING_METHOD = 100205;
+ GLU_U_STEP = 100206;
+ GLU_V_STEP = 100207;
+
+ // NurbsSampling
+ GLU_PATH_LENGTH = 100215;
+ GLU_PARAMETRIC_ERROR = 100216;
+ GLU_DOMAIN_DISTANCE = 100217;
+
+
+ // NurbsTrim
+ GLU_MAP1_TRIM_2 = 100210;
+ GLU_MAP1_TRIM_3 = 100211;
+
+ // NurbsDisplay
+ // GLU_FILL = 100012;
+ GLU_OUTLINE_POLYGON = 100240;
+ GLU_OUTLINE_PATCH = 100241;
+
+ // NurbsCallback
+ // GLU_ERROR = 100103;
+
+ // NurbsErrors
+ GLU_NURBS_ERROR1 = 100251;
+ GLU_NURBS_ERROR2 = 100252;
+ GLU_NURBS_ERROR3 = 100253;
+ GLU_NURBS_ERROR4 = 100254;
+ GLU_NURBS_ERROR5 = 100255;
+ GLU_NURBS_ERROR6 = 100256;
+ GLU_NURBS_ERROR7 = 100257;
+ GLU_NURBS_ERROR8 = 100258;
+ GLU_NURBS_ERROR9 = 100259;
+ GLU_NURBS_ERROR10 = 100260;
+ GLU_NURBS_ERROR11 = 100261;
+ GLU_NURBS_ERROR12 = 100262;
+ GLU_NURBS_ERROR13 = 100263;
+ GLU_NURBS_ERROR14 = 100264;
+ GLU_NURBS_ERROR15 = 100265;
+ GLU_NURBS_ERROR16 = 100266;
+ GLU_NURBS_ERROR17 = 100267;
+ GLU_NURBS_ERROR18 = 100268;
+ GLU_NURBS_ERROR19 = 100269;
+ GLU_NURBS_ERROR20 = 100270;
+ GLU_NURBS_ERROR21 = 100271;
+ GLU_NURBS_ERROR22 = 100272;
+ GLU_NURBS_ERROR23 = 100273;
+ GLU_NURBS_ERROR24 = 100274;
+ GLU_NURBS_ERROR25 = 100275;
+ GLU_NURBS_ERROR26 = 100276;
+ GLU_NURBS_ERROR27 = 100277;
+ GLU_NURBS_ERROR28 = 100278;
+ GLU_NURBS_ERROR29 = 100279;
+ GLU_NURBS_ERROR30 = 100280;
+ GLU_NURBS_ERROR31 = 100281;
+ GLU_NURBS_ERROR32 = 100282;
+ GLU_NURBS_ERROR33 = 100283;
+ GLU_NURBS_ERROR34 = 100284;
+ GLU_NURBS_ERROR35 = 100285;
+ GLU_NURBS_ERROR36 = 100286;
+ GLU_NURBS_ERROR37 = 100287;
+
+//*** Backwards compatibility for old tesselator ****/
+
+var
+ gluBeginPolygon : procedure( tess : PGLUtesselator ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluNextContour : procedure( tess : PGLUtesselator; atype : GLenum ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+ gluEndPolygon : procedure( tess : PGLUtesselator ); {$IFDEF WINDOWS}stdcall; {$ELSE}cdecl; {$ENDIF}
+
+const
+ // Contours types -- obsolete!
+ GLU_CW = 100120;
+ GLU_CCW = 100121;
+ GLU_INTERIOR = 100122;
+ GLU_EXTERIOR = 100123;
+ GLU_UNKNOWN = 100124;
+
+ // Names without "TESS_" prefix
+ GLU_BEGIN = GLU_TESS_BEGIN;
+ GLU_VERTEX = GLU_TESS_VERTEX;
+ GLU_END = GLU_TESS_END;
+ GLU_ERROR = GLU_TESS_ERROR;
+ GLU_EDGE_FLAG = GLU_TESS_EDGE_FLAG;
+
+procedure LoadGLu( const dll : PChar );
+procedure FreeGLu;
+
+implementation
+
+var
+ LibGlu : TModuleHandle;
+
+procedure FreeGLu;
+begin
+
+ @gluErrorString := nil;
+ @gluErrorUnicodeStringEXT := nil;
+ @gluGetString := nil;
+ @gluOrtho2D := nil;
+ @gluPerspective := nil;
+ @gluPickMatrix := nil;
+ @gluLookAt := nil;
+ @gluProject := nil;
+ @gluUnProject := nil;
+ @gluScaleImage := nil;
+ @gluBuild1DMipmaps := nil;
+ @gluBuild2DMipmaps := nil;
+ @gluNewQuadric := nil;
+ @gluDeleteQuadric := nil;
+ @gluQuadricNormals := nil;
+ @gluQuadricTexture := nil;
+ @gluQuadricOrientation := nil;
+ @gluQuadricDrawStyle := nil;
+ @gluCylinder := nil;
+ @gluDisk := nil;
+ @gluPartialDisk := nil;
+ @gluSphere := nil;
+ @gluQuadricCallback := nil;
+ @gluNewTess := nil;
+ @gluDeleteTess := nil;
+ @gluTessBeginPolygon := nil;
+ @gluTessBeginContour := nil;
+ @gluTessVertex := nil;
+ @gluTessEndContour := nil;
+ @gluTessEndPolygon := nil;
+ @gluTessProperty := nil;
+ @gluTessNormal := nil;
+ @gluTessCallback := nil;
+ @gluGetTessProperty := nil;
+ @gluNewNurbsRenderer := nil;
+ @gluDeleteNurbsRenderer := nil;
+ @gluBeginSurface := nil;
+ @gluBeginCurve := nil;
+ @gluEndCurve := nil;
+ @gluEndSurface := nil;
+ @gluBeginTrim := nil;
+ @gluEndTrim := nil;
+ @gluPwlCurve := nil;
+ @gluNurbsCurve := nil;
+ @gluNurbsSurface := nil;
+ @gluLoadSamplingMatrices := nil;
+ @gluNurbsProperty := nil;
+ @gluGetNurbsProperty := nil;
+ @gluNurbsCallback := nil;
+ @gluBeginPolygon := nil;
+ @gluNextContour := nil;
+ @gluEndPolygon := nil;
+
+ UnLoadModule( LibGlu );
+
+end;
+
+procedure LoadGLu( const dll : PChar );
+begin
+
+ FreeGLu;
+
+ if LoadModule( LibGlu, dll ) then
+ begin
+ @gluErrorString := GetModuleSymbol( LibGlu, 'gluErrorString' );
+ @gluErrorUnicodeStringEXT := GetModuleSymbol( LibGlu, 'gluErrorUnicodeStringEXT' );
+ @gluGetString := GetModuleSymbol( LibGlu, 'gluGetString' );
+ @gluOrtho2D := GetModuleSymbol( LibGlu, 'gluOrtho2D' );
+ @gluPerspective := GetModuleSymbol( LibGlu, 'gluPerspective' );
+ @gluPickMatrix := GetModuleSymbol( LibGlu, 'gluPickMatrix' );
+ @gluLookAt := GetModuleSymbol( LibGlu, 'gluLookAt' );
+ @gluProject := GetModuleSymbol( LibGlu, 'gluProject' );
+ @gluUnProject := GetModuleSymbol( LibGlu, 'gluUnProject' );
+ @gluScaleImage := GetModuleSymbol( LibGlu, 'gluScaleImage' );
+ @gluBuild1DMipmaps := GetModuleSymbol( LibGlu, 'gluBuild1DMipmaps' );
+ @gluBuild2DMipmaps := GetModuleSymbol( LibGlu, 'gluBuild2DMipmaps' );
+ @gluNewQuadric := GetModuleSymbol( LibGlu, 'gluNewQuadric' );
+ @gluDeleteQuadric := GetModuleSymbol( LibGlu, 'gluDeleteQuadric' );
+ @gluQuadricNormals := GetModuleSymbol( LibGlu, 'gluQuadricNormals' );
+ @gluQuadricTexture := GetModuleSymbol( LibGlu, 'gluQuadricTexture' );
+ @gluQuadricOrientation := GetModuleSymbol( LibGlu, 'gluQuadricOrientation' );
+ @gluQuadricDrawStyle := GetModuleSymbol( LibGlu, 'gluQuadricDrawStyle' );
+ @gluCylinder := GetModuleSymbol( LibGlu, 'gluCylinder' );
+ @gluDisk := GetModuleSymbol( LibGlu, 'gluDisk' );
+ @gluPartialDisk := GetModuleSymbol( LibGlu, 'gluPartialDisk' );
+ @gluSphere := GetModuleSymbol( LibGlu, 'gluSphere' );
+ @gluQuadricCallback := GetModuleSymbol( LibGlu, 'gluQuadricCallback' );
+ @gluNewTess := GetModuleSymbol( LibGlu, 'gluNewTess' );
+ @gluDeleteTess := GetModuleSymbol( LibGlu, 'gluDeleteTess' );
+ @gluTessBeginPolygon := GetModuleSymbol( LibGlu, 'gluTessBeginPolygon' );
+ @gluTessBeginContour := GetModuleSymbol( LibGlu, 'gluTessBeginContour' );
+ @gluTessVertex := GetModuleSymbol( LibGlu, 'gluTessVertex' );
+ @gluTessEndContour := GetModuleSymbol( LibGlu, 'gluTessEndContour' );
+ @gluTessEndPolygon := GetModuleSymbol( LibGlu, 'gluTessEndPolygon' );
+ @gluTessProperty := GetModuleSymbol( LibGlu, 'gluTessProperty' );
+ @gluTessNormal := GetModuleSymbol( LibGlu, 'gluTessNormal' );
+ @gluTessCallback := GetModuleSymbol( LibGlu, 'gluTessCallback' );
+ @gluGetTessProperty := GetModuleSymbol( LibGlu, 'gluGetTessProperty' );
+ @gluNewNurbsRenderer := GetModuleSymbol( LibGlu, 'gluNewNurbsRenderer' );
+ @gluDeleteNurbsRenderer := GetModuleSymbol( LibGlu, 'gluDeleteNurbsRenderer' );
+ @gluBeginSurface := GetModuleSymbol( LibGlu, 'gluBeginSurface' );
+ @gluBeginCurve := GetModuleSymbol( LibGlu, 'gluBeginCurve' );
+ @gluEndCurve := GetModuleSymbol( LibGlu, 'gluEndCurve' );
+ @gluEndSurface := GetModuleSymbol( LibGlu, 'gluEndSurface' );
+ @gluBeginTrim := GetModuleSymbol( LibGlu, 'gluBeginTrim' );
+ @gluEndTrim := GetModuleSymbol( LibGlu, 'gluEndTrim' );
+ @gluPwlCurve := GetModuleSymbol( LibGlu, 'gluPwlCurve' );
+ @gluNurbsCurve := GetModuleSymbol( LibGlu, 'gluNurbsCurve' );
+ @gluNurbsSurface := GetModuleSymbol( LibGlu, 'gluNurbsSurface' );
+ @gluLoadSamplingMatrices := GetModuleSymbol( LibGlu, 'gluLoadSamplingMatrices' );
+ @gluNurbsProperty := GetModuleSymbol( LibGlu, 'gluNurbsProperty' );
+ @gluGetNurbsProperty := GetModuleSymbol( LibGlu, 'gluGetNurbsProperty' );
+ @gluNurbsCallback := GetModuleSymbol( LibGlu, 'gluNurbsCallback' );
+
+ @gluBeginPolygon := GetModuleSymbol( LibGlu, 'gluBeginPolygon' );
+ @gluNextContour := GetModuleSymbol( LibGlu, 'gluNextContour' );
+ @gluEndPolygon := GetModuleSymbol( LibGlu, 'gluEndPolygon' );
+ end;
+end;
+
+initialization
+
+ LoadGLu( GLuLibName );
+
+finalization
+
+ FreeGLu;
+
+end.
+
diff --git a/Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/glut.pas b/Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/glut.pas
new file mode 100644
index 00000000..3bea3499
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/glut.pas
@@ -0,0 +1,688 @@
+unit glut;
+{
+ $Id: glut.pas,v 1.4 2007/05/20 20:28:31 savage Exp $
+
+ Adaption of the delphi3d.net OpenGL units to FreePascal
+ Sebastian Guenther (sg@freepascal.org) in 2002
+ These units are free to use
+}
+
+// Copyright (c) Mark J. Kilgard, 1994, 1995, 1996. */
+
+(* This program is freely distributable without licensing fees and is
+ provided without guarantee or warrantee expressed or implied. This
+ program is -not- in the public domain. *)
+
+{******************************************************************************}
+{ }
+{ Converted to Delphi by Tom Nuydens (tom@delphi3d.net) }
+{ For the latest updates, visit Delphi3D: http://www.delphi3d.net }
+{ }
+{ Modified for Delphi/Kylix and FreePascal }
+{ by Dominique Louis ( Dominique@Savagesoftware.com.au) }
+{ For the latest updates, visit JEDI-SDL : http://www.sf.net/projects/jedi-sdl }
+{ }
+{******************************************************************************}
+
+{
+ $Log: glut.pas,v $
+ Revision 1.4 2007/05/20 20:28:31 savage
+ Initial Changes to Handle 64 Bits
+
+ Revision 1.3 2006/11/20 21:20:59 savage
+ Updated to work in MacOS X
+
+ Revision 1.2 2004/08/14 22:54:30 savage
+ Updated so that Library name defines are correctly defined for MacOS X.
+
+ Revision 1.1 2004/03/30 21:53:54 savage
+ Moved to it's own folder.
+
+ Revision 1.5 2004/02/20 17:09:55 savage
+ Code tidied up in gl, glu and glut, while extensions in glext.pas are now loaded using SDL_GL_GetProcAddress, thus making it more cross-platform compatible, but now more tied to SDL.
+
+ Revision 1.4 2004/02/14 22:36:29 savage
+ Fixed inconsistencies of using LoadLibrary and LoadModule.
+ Now all units make use of LoadModule rather than LoadLibrary and other dynamic proc procedures.
+
+ Revision 1.3 2004/02/14 00:23:39 savage
+ As UNIX is defined in jedi-sdl.inc this will be used to check linux compatability as well. Units have been changed to reflect this change.
+
+ Revision 1.2 2004/02/14 00:09:19 savage
+ Changed uses to now make use of moduleloader.pas rather than dllfuncs.pas
+
+ Revision 1.1 2004/02/05 00:08:19 savage
+ Module 1.0 release
+
+ Revision 1.4 2003/06/02 12:32:13 savage
+ Modified Sources to avoid warnings with Delphi by moving CVS Logging to the top of the header files. Hopefully CVS Logging still works.
+
+}
+
+interface
+
+{$I jedi-sdl.inc}
+
+uses
+{$IFDEF __GPC__}
+ system,
+ gpc,
+{$ENDIF}
+
+{$IFDEF WINDOWS}
+ Windows,
+{$ENDIF}
+ moduleloader,
+ gl;
+
+type
+ {$IFNDEF __GPC__}
+ PInteger = ^Integer;
+ PPChar = ^PChar;
+ {$ENDIF}
+ TGlutVoidCallback = procedure; {$IFNDEF __GPC__}{$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}{$ENDIF}
+ TGlut1IntCallback = procedure(value: Integer); {$IFNDEF __GPC__}{$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}{$ENDIF}
+ TGlut2IntCallback = procedure(v1, v2: Integer); {$IFNDEF __GPC__}{$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}{$ENDIF}
+ TGlut3IntCallback = procedure(v1, v2, v3: Integer); {$IFNDEF __GPC__}{$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}{$ENDIF}
+ TGlut4IntCallback = procedure(v1, v2, v3, v4: Integer); {$IFNDEF __GPC__}{$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}{$ENDIF}
+ TGlut1Char2IntCallback = procedure(c: Byte; v1, v2: Integer); {$IFNDEF __GPC__}{$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}{$ENDIF}
+
+const
+{$IFDEF WINDOWS}
+ GlutLibName = 'glut32.dll';
+{$ENDIF}
+
+{$IFDEF UNIX}
+{$IFDEF DARWIN}
+ GlutLibName = '/System/Library/Frameworks/GLUT.framework/Libraries/libglut.dylib';
+{$ELSE}
+ GlutLibName = 'libglut.so';
+{$ENDIF}
+{$ENDIF}
+
+ GLUT_API_VERSION = 3;
+ GLUT_XLIB_IMPLEMENTATION = 12;
+ // Display mode bit masks.
+ GLUT_RGB = 0;
+ GLUT_RGBA = GLUT_RGB;
+ GLUT_INDEX = 1;
+ GLUT_SINGLE = 0;
+ GLUT_DOUBLE = 2;
+ GLUT_ACCUM = 4;
+ GLUT_ALPHA = 8;
+ GLUT_DEPTH = 16;
+ GLUT_STENCIL = 32;
+ GLUT_MULTISAMPLE = 128;
+ GLUT_STEREO = 256;
+ GLUT_LUMINANCE = 512;
+
+ // Mouse buttons.
+ GLUT_LEFT_BUTTON = 0;
+ GLUT_MIDDLE_BUTTON = 1;
+ GLUT_RIGHT_BUTTON = 2;
+
+ // Mouse button state.
+ GLUT_DOWN = 0;
+ GLUT_UP = 1;
+
+ // function keys
+ GLUT_KEY_F1 = 1;
+ GLUT_KEY_F2 = 2;
+ GLUT_KEY_F3 = 3;
+ GLUT_KEY_F4 = 4;
+ GLUT_KEY_F5 = 5;
+ GLUT_KEY_F6 = 6;
+ GLUT_KEY_F7 = 7;
+ GLUT_KEY_F8 = 8;
+ GLUT_KEY_F9 = 9;
+ GLUT_KEY_F10 = 10;
+ GLUT_KEY_F11 = 11;
+ GLUT_KEY_F12 = 12;
+ // directional keys
+ GLUT_KEY_LEFT = 100;
+ GLUT_KEY_UP = 101;
+ GLUT_KEY_RIGHT = 102;
+ GLUT_KEY_DOWN = 103;
+ GLUT_KEY_PAGE_UP = 104;
+ GLUT_KEY_PAGE_DOWN = 105;
+ GLUT_KEY_HOME = 106;
+ GLUT_KEY_END = 107;
+ GLUT_KEY_INSERT = 108;
+
+ // Entry/exit state.
+ GLUT_LEFT = 0;
+ GLUT_ENTERED = 1;
+
+ // Menu usage state.
+ GLUT_MENU_NOT_IN_USE = 0;
+ GLUT_MENU_IN_USE = 1;
+
+ // Visibility state.
+ GLUT_NOT_VISIBLE = 0;
+ GLUT_VISIBLE = 1;
+
+ // Window status state.
+ GLUT_HIDDEN = 0;
+ GLUT_FULLY_RETAINED = 1;
+ GLUT_PARTIALLY_RETAINED = 2;
+ GLUT_FULLY_COVERED = 3;
+
+ // Color index component selection values.
+ GLUT_RED = 0;
+ GLUT_GREEN = 1;
+ GLUT_BLUE = 2;
+
+ // Layers for use.
+ GLUT_NORMAL = 0;
+ GLUT_OVERLAY = 1;
+
+ // Stroke font constants (use these in GLUT program).
+ GLUT_STROKE_ROMAN = Pointer(0);
+ GLUT_STROKE_MONO_ROMAN = Pointer(1);
+
+ // Bitmap font constants (use these in GLUT program).
+ GLUT_BITMAP_9_BY_15 = Pointer(2);
+ GLUT_BITMAP_8_BY_13 = Pointer(3);
+ GLUT_BITMAP_TIMES_ROMAN_10 = Pointer(4);
+ GLUT_BITMAP_TIMES_ROMAN_24 = Pointer(5);
+ GLUT_BITMAP_HELVETICA_10 = Pointer(6);
+ GLUT_BITMAP_HELVETICA_12 = Pointer(7);
+ GLUT_BITMAP_HELVETICA_18 = Pointer(8);
+
+ // glutGet parameters.
+ GLUT_WINDOW_X = 100;
+ GLUT_WINDOW_Y = 101;
+ GLUT_WINDOW_WIDTH = 102;
+ GLUT_WINDOW_HEIGHT = 103;
+ GLUT_WINDOW_BUFFER_SIZE = 104;
+ GLUT_WINDOW_STENCIL_SIZE = 105;
+ GLUT_WINDOW_DEPTH_SIZE = 106;
+ GLUT_WINDOW_RED_SIZE = 107;
+ GLUT_WINDOW_GREEN_SIZE = 108;
+ GLUT_WINDOW_BLUE_SIZE = 109;
+ GLUT_WINDOW_ALPHA_SIZE = 110;
+ GLUT_WINDOW_ACCUM_RED_SIZE = 111;
+ GLUT_WINDOW_ACCUM_GREEN_SIZE = 112;
+ GLUT_WINDOW_ACCUM_BLUE_SIZE = 113;
+ GLUT_WINDOW_ACCUM_ALPHA_SIZE = 114;
+ GLUT_WINDOW_DOUBLEBUFFER = 115;
+ GLUT_WINDOW_RGBA = 116;
+ GLUT_WINDOW_PARENT = 117;
+ GLUT_WINDOW_NUM_CHILDREN = 118;
+ GLUT_WINDOW_COLORMAP_SIZE = 119;
+ GLUT_WINDOW_NUM_SAMPLES = 120;
+ GLUT_WINDOW_STEREO = 121;
+ GLUT_WINDOW_CURSOR = 122;
+ GLUT_SCREEN_WIDTH = 200;
+ GLUT_SCREEN_HEIGHT = 201;
+ GLUT_SCREEN_WIDTH_MM = 202;
+ GLUT_SCREEN_HEIGHT_MM = 203;
+ GLUT_MENU_NUM_ITEMS = 300;
+ GLUT_DISPLAY_MODE_POSSIBLE = 400;
+ GLUT_INIT_WINDOW_X = 500;
+ GLUT_INIT_WINDOW_Y = 501;
+ GLUT_INIT_WINDOW_WIDTH = 502;
+ GLUT_INIT_WINDOW_HEIGHT = 503;
+ GLUT_INIT_DISPLAY_MODE = 504;
+ GLUT_ELAPSED_TIME = 700;
+
+ // glutDeviceGet parameters.
+ GLUT_HAS_KEYBOARD = 600;
+ GLUT_HAS_MOUSE = 601;
+ GLUT_HAS_SPACEBALL = 602;
+ GLUT_HAS_DIAL_AND_BUTTON_BOX = 603;
+ GLUT_HAS_TABLET = 604;
+ GLUT_NUM_MOUSE_BUTTONS = 605;
+ GLUT_NUM_SPACEBALL_BUTTONS = 606;
+ GLUT_NUM_BUTTON_BOX_BUTTONS = 607;
+ GLUT_NUM_DIALS = 608;
+ GLUT_NUM_TABLET_BUTTONS = 609;
+
+ // glutLayerGet parameters.
+ GLUT_OVERLAY_POSSIBLE = 800;
+ GLUT_LAYER_IN_USE = 801;
+ GLUT_HAS_OVERLAY = 802;
+ GLUT_TRANSPARENT_INDEX = 803;
+ GLUT_NORMAL_DAMAGED = 804;
+ GLUT_OVERLAY_DAMAGED = 805;
+
+ // glutVideoResizeGet parameters.
+ GLUT_VIDEO_RESIZE_POSSIBLE = 900;
+ GLUT_VIDEO_RESIZE_IN_USE = 901;
+ GLUT_VIDEO_RESIZE_X_DELTA = 902;
+ GLUT_VIDEO_RESIZE_Y_DELTA = 903;
+ GLUT_VIDEO_RESIZE_WIDTH_DELTA = 904;
+ GLUT_VIDEO_RESIZE_HEIGHT_DELTA = 905;
+ GLUT_VIDEO_RESIZE_X = 906;
+ GLUT_VIDEO_RESIZE_Y = 907;
+ GLUT_VIDEO_RESIZE_WIDTH = 908;
+ GLUT_VIDEO_RESIZE_HEIGHT = 909;
+
+ // glutGetModifiers return mask.
+ GLUT_ACTIVE_SHIFT = 1;
+ GLUT_ACTIVE_CTRL = 2;
+ GLUT_ACTIVE_ALT = 4;
+
+ // glutSetCursor parameters.
+ // Basic arrows.
+ GLUT_CURSOR_RIGHT_ARROW = 0;
+ GLUT_CURSOR_LEFT_ARROW = 1;
+ // Symbolic cursor shapes.
+ GLUT_CURSOR_INFO = 2;
+ GLUT_CURSOR_DESTROY = 3;
+ GLUT_CURSOR_HELP = 4;
+ GLUT_CURSOR_CYCLE = 5;
+ GLUT_CURSOR_SPRAY = 6;
+ GLUT_CURSOR_WAIT = 7;
+ GLUT_CURSOR_TEXT = 8;
+ GLUT_CURSOR_CROSSHAIR = 9;
+ // Directional cursors.
+ GLUT_CURSOR_UP_DOWN = 10;
+ GLUT_CURSOR_LEFT_RIGHT = 11;
+ // Sizing cursors.
+ GLUT_CURSOR_TOP_SIDE = 12;
+ GLUT_CURSOR_BOTTOM_SIDE = 13;
+ GLUT_CURSOR_LEFT_SIDE = 14;
+ GLUT_CURSOR_RIGHT_SIDE = 15;
+ GLUT_CURSOR_TOP_LEFT_CORNER = 16;
+ GLUT_CURSOR_TOP_RIGHT_CORNER = 17;
+ GLUT_CURSOR_BOTTOM_RIGHT_CORNER = 18;
+ GLUT_CURSOR_BOTTOM_LEFT_CORNER = 19;
+ // Inherit from parent window.
+ GLUT_CURSOR_INHERIT = 100;
+ // Blank cursor.
+ GLUT_CURSOR_NONE = 101;
+ // Fullscreen crosshair (if available).
+ GLUT_CURSOR_FULL_CROSSHAIR = 102;
+
+ // GLUT game mode sub-API.
+ // glutGameModeGet.
+ GLUT_GAME_MODE_ACTIVE = 0;
+ GLUT_GAME_MODE_POSSIBLE = 1;
+ GLUT_GAME_MODE_WIDTH = 2;
+ GLUT_GAME_MODE_HEIGHT = 3;
+ GLUT_GAME_MODE_PIXEL_DEPTH = 4;
+ GLUT_GAME_MODE_REFRESH_RATE = 5;
+ GLUT_GAME_MODE_DISPLAY_CHANGED = 6;
+
+var
+// GLUT initialization sub-API.
+ glutInit: procedure(argcp: PInteger; argv: PPChar); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutInitDisplayMode: procedure(mode: Word); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutInitDisplayString: procedure(const str: PChar); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutInitWindowPosition: procedure(x, y: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutInitWindowSize: procedure(width, height: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutMainLoop: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+// GLUT window sub-API.
+ glutCreateWindow: function(const title: PChar): Integer; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutCreateSubWindow: function(win, x, y, width, height: Integer): Integer; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutDestroyWindow: procedure(win: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutPostRedisplay: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutPostWindowRedisplay: procedure(win: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutSwapBuffers: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutGetWindow: function: Integer; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutSetWindow: procedure(win: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutSetWindowTitle: procedure(const title: PChar); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutSetIconTitle: procedure(const title: PChar); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutPositionWindow: procedure(x, y: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutReshapeWindow: procedure(width, height: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutPopWindow: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutPushWindow: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutIconifyWindow: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutShowWindow: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutHideWindow: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutFullScreen: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutSetCursor: procedure(cursor: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutWarpPointer: procedure(x, y: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+// GLUT overlay sub-API.
+ glutEstablishOverlay: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutRemoveOverlay: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutUseLayer: procedure(layer: GLenum); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutPostOverlayRedisplay: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutPostWindowOverlayRedisplay: procedure(win: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutShowOverlay: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutHideOverlay: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+// GLUT menu sub-API.
+ glutCreateMenu: function(callback: TGlut1IntCallback): Integer; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutDestroyMenu: procedure(menu: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutGetMenu: function: Integer; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutSetMenu: procedure(menu: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutAddMenuEntry: procedure(const caption: PChar; value: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutAddSubMenu: procedure(const caption: PChar; submenu: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutChangeToMenuEntry: procedure(item: Integer; const caption: PChar; value: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutChangeToSubMenu: procedure(item: Integer; const caption: PChar; submenu: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutRemoveMenuItem: procedure(item: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutAttachMenu: procedure(button: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutDetachMenu: procedure(button: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+// GLUTsub-API.
+ glutDisplayFunc: procedure(f: TGlutVoidCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutReshapeFunc: procedure(f: TGlut2IntCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutKeyboardFunc: procedure(f: TGlut1Char2IntCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutMouseFunc: procedure(f: TGlut4IntCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutMotionFunc: procedure(f: TGlut2IntCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutPassiveMotionFunc: procedure(f: TGlut2IntCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutEntryFunc: procedure(f: TGlut1IntCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutVisibilityFunc: procedure(f: TGlut1IntCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutIdleFunc: procedure(f: TGlutVoidCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutTimerFunc: procedure(millis: Word; f: TGlut1IntCallback; value: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutMenuStateFunc: procedure(f: TGlut1IntCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutSpecialFunc: procedure(f: TGlut3IntCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutSpaceballMotionFunc: procedure(f: TGlut3IntCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutSpaceballRotateFunc: procedure(f: TGlut3IntCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutSpaceballButtonFunc: procedure(f: TGlut2IntCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutButtonBoxFunc: procedure(f: TGlut2IntCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutDialsFunc: procedure(f: TGlut2IntCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutTabletMotionFunc: procedure(f: TGlut2IntCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutTabletButtonFunc: procedure(f: TGlut4IntCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutMenuStatusFunc: procedure(f: TGlut3IntCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutOverlayDisplayFunc: procedure(f:TGlutVoidCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutWindowStatusFunc: procedure(f: TGlut1IntCallback); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+// GLUT color index sub-API.
+ glutSetColor: procedure(cell: Integer; red, green, blue: GLfloat); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutGetColor: function(ndx, component: Integer): GLfloat; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutCopyColormap: procedure(win: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+// GLUT state retrieval sub-API.
+ glutGet: function(t: GLenum): Integer; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutDeviceGet: function(t: GLenum): Integer; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+// GLUT extension support sub-API
+ glutExtensionSupported: function(const name: PChar): Integer; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutGetModifiers: function: Integer; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutLayerGet: function(t: GLenum): Integer; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+// GLUT font sub-API
+ glutBitmapCharacter: procedure(font : pointer; character: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutBitmapWidth: function(font : pointer; character: Integer): Integer; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutStrokeCharacter: procedure(font : pointer; character: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutStrokeWidth: function(font : pointer; character: Integer): Integer; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutBitmapLength: function(font: pointer; const str: PChar): Integer; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutStrokeLength: function(font: pointer; const str: PChar): Integer; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+// GLUT pre-built models sub-API
+ glutWireSphere: procedure(radius: GLdouble; slices, stacks: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutSolidSphere: procedure(radius: GLdouble; slices, stacks: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutWireCone: procedure(base, height: GLdouble; slices, stacks: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutSolidCone: procedure(base, height: GLdouble; slices, stacks: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutWireCube: procedure(size: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutSolidCube: procedure(size: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutWireTorus: procedure(innerRadius, outerRadius: GLdouble; sides, rings: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutSolidTorus: procedure(innerRadius, outerRadius: GLdouble; sides, rings: GLint); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutWireDodecahedron: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutSolidDodecahedron: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutWireTeapot: procedure(size: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutSolidTeapot: procedure(size: GLdouble); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutWireOctahedron: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutSolidOctahedron: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutWireTetrahedron: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutSolidTetrahedron: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutWireIcosahedron: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutSolidIcosahedron: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+// GLUT video resize sub-API.
+ glutVideoResizeGet: function(param: GLenum): Integer; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutSetupVideoResizing: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutStopVideoResizing: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutVideoResize: procedure(x, y, width, height: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutVideoPan: procedure(x, y, width, height: Integer); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+// GLUT debugging sub-API.
+ glutReportErrors: procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+var
+ //example glutGameModeString('1280x1024:32@75');
+ glutGameModeString : procedure (const AString : PChar); {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutEnterGameMode : function : integer; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutLeaveGameMode : procedure; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+ glutGameModeGet : function (mode : GLenum) : integer; {$IFDEF WINDOWS}stdcall;{$ELSE}cdecl;{$ENDIF}
+
+procedure LoadGlut(const dll: PChar);
+procedure FreeGlut;
+
+implementation
+
+var
+ LibGLUT : TModuleHandle;
+
+procedure FreeGlut;
+begin
+
+ UnLoadModule( LibGLUT );
+
+ @glutInit := nil;
+ @glutInitDisplayMode := nil;
+ @glutInitDisplayString := nil;
+ @glutInitWindowPosition := nil;
+ @glutInitWindowSize := nil;
+ @glutMainLoop := nil;
+ @glutCreateWindow := nil;
+ @glutCreateSubWindow := nil;
+ @glutDestroyWindow := nil;
+ @glutPostRedisplay := nil;
+ @glutPostWindowRedisplay := nil;
+ @glutSwapBuffers := nil;
+ @glutGetWindow := nil;
+ @glutSetWindow := nil;
+ @glutSetWindowTitle := nil;
+ @glutSetIconTitle := nil;
+ @glutPositionWindow := nil;
+ @glutReshapeWindow := nil;
+ @glutPopWindow := nil;
+ @glutPushWindow := nil;
+ @glutIconifyWindow := nil;
+ @glutShowWindow := nil;
+ @glutHideWindow := nil;
+ @glutFullScreen := nil;
+ @glutSetCursor := nil;
+ @glutWarpPointer := nil;
+ @glutEstablishOverlay := nil;
+ @glutRemoveOverlay := nil;
+ @glutUseLayer := nil;
+ @glutPostOverlayRedisplay := nil;
+ @glutPostWindowOverlayRedisplay := nil;
+ @glutShowOverlay := nil;
+ @glutHideOverlay := nil;
+ @glutCreateMenu := nil;
+ @glutDestroyMenu := nil;
+ @glutGetMenu := nil;
+ @glutSetMenu := nil;
+ @glutAddMenuEntry := nil;
+ @glutAddSubMenu := nil;
+ @glutChangeToMenuEntry := nil;
+ @glutChangeToSubMenu := nil;
+ @glutRemoveMenuItem := nil;
+ @glutAttachMenu := nil;
+ @glutDetachMenu := nil;
+ @glutDisplayFunc := nil;
+ @glutReshapeFunc := nil;
+ @glutKeyboardFunc := nil;
+ @glutMouseFunc := nil;
+ @glutMotionFunc := nil;
+ @glutPassiveMotionFunc := nil;
+ @glutEntryFunc := nil;
+ @glutVisibilityFunc := nil;
+ @glutIdleFunc := nil;
+ @glutTimerFunc := nil;
+ @glutMenuStateFunc := nil;
+ @glutSpecialFunc := nil;
+ @glutSpaceballMotionFunc := nil;
+ @glutSpaceballRotateFunc := nil;
+ @glutSpaceballButtonFunc := nil;
+ @glutButtonBoxFunc := nil;
+ @glutDialsFunc := nil;
+ @glutTabletMotionFunc := nil;
+ @glutTabletButtonFunc := nil;
+ @glutMenuStatusFunc := nil;
+ @glutOverlayDisplayFunc := nil;
+ @glutWindowStatusFunc := nil;
+ @glutSetColor := nil;
+ @glutGetColor := nil;
+ @glutCopyColormap := nil;
+ @glutGet := nil;
+ @glutDeviceGet := nil;
+ @glutExtensionSupported := nil;
+ @glutGetModifiers := nil;
+ @glutLayerGet := nil;
+ @glutBitmapCharacter := nil;
+ @glutBitmapWidth := nil;
+ @glutStrokeCharacter := nil;
+ @glutStrokeWidth := nil;
+ @glutBitmapLength := nil;
+ @glutStrokeLength := nil;
+ @glutWireSphere := nil;
+ @glutSolidSphere := nil;
+ @glutWireCone := nil;
+ @glutSolidCone := nil;
+ @glutWireCube := nil;
+ @glutSolidCube := nil;
+ @glutWireTorus := nil;
+ @glutSolidTorus := nil;
+ @glutWireDodecahedron := nil;
+ @glutSolidDodecahedron := nil;
+ @glutWireTeapot := nil;
+ @glutSolidTeapot := nil;
+ @glutWireOctahedron := nil;
+ @glutSolidOctahedron := nil;
+ @glutWireTetrahedron := nil;
+ @glutSolidTetrahedron := nil;
+ @glutWireIcosahedron := nil;
+ @glutSolidIcosahedron := nil;
+ @glutVideoResizeGet := nil;
+ @glutSetupVideoResizing := nil;
+ @glutStopVideoResizing := nil;
+ @glutVideoResize := nil;
+ @glutVideoPan := nil;
+ @glutReportErrors := nil;
+
+end;
+
+procedure LoadGlut(const dll: PChar);
+begin
+
+ FreeGlut;
+
+ if LoadModule( LibGLUT, dll ) then
+ begin
+ @glutInit := GetModuleSymbol(LibGLUT, 'glutInit');
+ @glutInitDisplayMode := GetModuleSymbol(LibGLUT, 'glutInitDisplayMode');
+ @glutInitDisplayString := GetModuleSymbol(LibGLUT, 'glutInitDisplayString');
+ @glutInitWindowPosition := GetModuleSymbol(LibGLUT, 'glutInitWindowPosition');
+ @glutInitWindowSize := GetModuleSymbol(LibGLUT, 'glutInitWindowSize');
+ @glutMainLoop := GetModuleSymbol(LibGLUT, 'glutMainLoop');
+ @glutCreateWindow := GetModuleSymbol(LibGLUT, 'glutCreateWindow');
+ @glutCreateSubWindow := GetModuleSymbol(LibGLUT, 'glutCreateSubWindow');
+ @glutDestroyWindow := GetModuleSymbol(LibGLUT, 'glutDestroyWindow');
+ @glutPostRedisplay := GetModuleSymbol(LibGLUT, 'glutPostRedisplay');
+ @glutPostWindowRedisplay := GetModuleSymbol(LibGLUT, 'glutPostWindowRedisplay');
+ @glutSwapBuffers := GetModuleSymbol(LibGLUT, 'glutSwapBuffers');
+ @glutGetWindow := GetModuleSymbol(LibGLUT, 'glutGetWindow');
+ @glutSetWindow := GetModuleSymbol(LibGLUT, 'glutSetWindow');
+ @glutSetWindowTitle := GetModuleSymbol(LibGLUT, 'glutSetWindowTitle');
+ @glutSetIconTitle := GetModuleSymbol(LibGLUT, 'glutSetIconTitle');
+ @glutPositionWindow := GetModuleSymbol(LibGLUT, 'glutPositionWindow');
+ @glutReshapeWindow := GetModuleSymbol(LibGLUT, 'glutReshapeWindow');
+ @glutPopWindow := GetModuleSymbol(LibGLUT, 'glutPopWindow');
+ @glutPushWindow := GetModuleSymbol(LibGLUT, 'glutPushWindow');
+ @glutIconifyWindow := GetModuleSymbol(LibGLUT, 'glutIconifyWindow');
+ @glutShowWindow := GetModuleSymbol(LibGLUT, 'glutShowWindow');
+ @glutHideWindow := GetModuleSymbol(LibGLUT, 'glutHideWindow');
+ @glutFullScreen := GetModuleSymbol(LibGLUT, 'glutFullScreen');
+ @glutSetCursor := GetModuleSymbol(LibGLUT, 'glutSetCursor');
+ @glutWarpPointer := GetModuleSymbol(LibGLUT, 'glutWarpPointer');
+ @glutEstablishOverlay := GetModuleSymbol(LibGLUT, 'glutEstablishOverlay');
+ @glutRemoveOverlay := GetModuleSymbol(LibGLUT, 'glutRemoveOverlay');
+ @glutUseLayer := GetModuleSymbol(LibGLUT, 'glutUseLayer');
+ @glutPostOverlayRedisplay := GetModuleSymbol(LibGLUT, 'glutPostOverlayRedisplay');
+ @glutPostWindowOverlayRedisplay := GetModuleSymbol(LibGLUT, 'glutPostWindowOverlayRedisplay');
+ @glutShowOverlay := GetModuleSymbol(LibGLUT, 'glutShowOverlay');
+ @glutHideOverlay := GetModuleSymbol(LibGLUT, 'glutHideOverlay');
+ @glutCreateMenu := GetModuleSymbol(LibGLUT, 'glutCreateMenu');
+ @glutDestroyMenu := GetModuleSymbol(LibGLUT, 'glutDestroyMenu');
+ @glutGetMenu := GetModuleSymbol(LibGLUT, 'glutGetMenu');
+ @glutSetMenu := GetModuleSymbol(LibGLUT, 'glutSetMenu');
+ @glutAddMenuEntry := GetModuleSymbol(LibGLUT, 'glutAddMenuEntry');
+ @glutAddSubMenu := GetModuleSymbol(LibGLUT, 'glutAddSubMenu');
+ @glutChangeToMenuEntry := GetModuleSymbol(LibGLUT, 'glutChangeToMenuEntry');
+ @glutChangeToSubMenu := GetModuleSymbol(LibGLUT, 'glutChangeToSubMenu');
+ @glutRemoveMenuItem := GetModuleSymbol(LibGLUT, 'glutRemoveMenuItem');
+ @glutAttachMenu := GetModuleSymbol(LibGLUT, 'glutAttachMenu');
+ @glutDetachMenu := GetModuleSymbol(LibGLUT, 'glutDetachMenu');
+ @glutDisplayFunc := GetModuleSymbol(LibGLUT, 'glutDisplayFunc');
+ @glutReshapeFunc := GetModuleSymbol(LibGLUT, 'glutReshapeFunc');
+ @glutKeyboardFunc := GetModuleSymbol(LibGLUT, 'glutKeyboardFunc');
+ @glutMouseFunc := GetModuleSymbol(LibGLUT, 'glutMouseFunc');
+ @glutMotionFunc := GetModuleSymbol(LibGLUT, 'glutMotionFunc');
+ @glutPassiveMotionFunc := GetModuleSymbol(LibGLUT, 'glutPassiveMotionFunc');
+ @glutEntryFunc := GetModuleSymbol(LibGLUT, 'glutEntryFunc');
+ @glutVisibilityFunc := GetModuleSymbol(LibGLUT, 'glutVisibilityFunc');
+ @glutIdleFunc := GetModuleSymbol(LibGLUT, 'glutIdleFunc');
+ @glutTimerFunc := GetModuleSymbol(LibGLUT, 'glutTimerFunc');
+ @glutMenuStateFunc := GetModuleSymbol(LibGLUT, 'glutMenuStateFunc');
+ @glutSpecialFunc := GetModuleSymbol(LibGLUT, 'glutSpecialFunc');
+ @glutSpaceballMotionFunc := GetModuleSymbol(LibGLUT, 'glutSpaceballMotionFunc');
+ @glutSpaceballRotateFunc := GetModuleSymbol(LibGLUT, 'glutSpaceballRotateFunc');
+ @glutSpaceballButtonFunc := GetModuleSymbol(LibGLUT, 'glutSpaceballButtonFunc');
+ @glutButtonBoxFunc := GetModuleSymbol(LibGLUT, 'glutButtonBoxFunc');
+ @glutDialsFunc := GetModuleSymbol(LibGLUT, 'glutDialsFunc');
+ @glutTabletMotionFunc := GetModuleSymbol(LibGLUT, 'glutTabletMotionFunc');
+ @glutTabletButtonFunc := GetModuleSymbol(LibGLUT, 'glutTabletButtonFunc');
+ @glutMenuStatusFunc := GetModuleSymbol(LibGLUT, 'glutMenuStatusFunc');
+ @glutOverlayDisplayFunc := GetModuleSymbol(LibGLUT, 'glutOverlayDisplayFunc');
+ @glutWindowStatusFunc := GetModuleSymbol(LibGLUT, 'glutWindowStatusFunc');
+ @glutSetColor := GetModuleSymbol(LibGLUT, 'glutSetColor');
+ @glutGetColor := GetModuleSymbol(LibGLUT, 'glutGetColor');
+ @glutCopyColormap := GetModuleSymbol(LibGLUT, 'glutCopyColormap');
+ @glutGet := GetModuleSymbol(LibGLUT, 'glutGet');
+ @glutDeviceGet := GetModuleSymbol(LibGLUT, 'glutDeviceGet');
+ @glutExtensionSupported := GetModuleSymbol(LibGLUT, 'glutExtensionSupported');
+ @glutGetModifiers := GetModuleSymbol(LibGLUT, 'glutGetModifiers');
+ @glutLayerGet := GetModuleSymbol(LibGLUT, 'glutLayerGet');
+ @glutBitmapCharacter := GetModuleSymbol(LibGLUT, 'glutBitmapCharacter');
+ @glutBitmapWidth := GetModuleSymbol(LibGLUT, 'glutBitmapWidth');
+ @glutStrokeCharacter := GetModuleSymbol(LibGLUT, 'glutStrokeCharacter');
+ @glutStrokeWidth := GetModuleSymbol(LibGLUT, 'glutStrokeWidth');
+ @glutBitmapLength := GetModuleSymbol(LibGLUT, 'glutBitmapLength');
+ @glutStrokeLength := GetModuleSymbol(LibGLUT, 'glutStrokeLength');
+ @glutWireSphere := GetModuleSymbol(LibGLUT, 'glutWireSphere');
+ @glutSolidSphere := GetModuleSymbol(LibGLUT, 'glutSolidSphere');
+ @glutWireCone := GetModuleSymbol(LibGLUT, 'glutWireCone');
+ @glutSolidCone := GetModuleSymbol(LibGLUT, 'glutSolidCone');
+ @glutWireCube := GetModuleSymbol(LibGLUT, 'glutWireCube');
+ @glutSolidCube := GetModuleSymbol(LibGLUT, 'glutSolidCube');
+ @glutWireTorus := GetModuleSymbol(LibGLUT, 'glutWireTorus');
+ @glutSolidTorus := GetModuleSymbol(LibGLUT, 'glutSolidTorus');
+ @glutWireDodecahedron := GetModuleSymbol(LibGLUT, 'glutWireDodecahedron');
+ @glutSolidDodecahedron := GetModuleSymbol(LibGLUT, 'glutSolidDodecahedron');
+ @glutWireTeapot := GetModuleSymbol(LibGLUT, 'glutWireTeapot');
+ @glutSolidTeapot := GetModuleSymbol(LibGLUT, 'glutSolidTeapot');
+ @glutWireOctahedron := GetModuleSymbol(LibGLUT, 'glutWireOctahedron');
+ @glutSolidOctahedron := GetModuleSymbol(LibGLUT, 'glutSolidOctahedron');
+ @glutWireTetrahedron := GetModuleSymbol(LibGLUT, 'glutWireTetrahedron');
+ @glutSolidTetrahedron := GetModuleSymbol(LibGLUT, 'glutSolidTetrahedron');
+ @glutWireIcosahedron := GetModuleSymbol(LibGLUT, 'glutWireIcosahedron');
+ @glutSolidIcosahedron := GetModuleSymbol(LibGLUT, 'glutSolidIcosahedron');
+ @glutVideoResizeGet := GetModuleSymbol(LibGLUT, 'glutVideoResizeGet');
+ @glutSetupVideoResizing := GetModuleSymbol(LibGLUT, 'glutSetupVideoResizing');
+ @glutStopVideoResizing := GetModuleSymbol(LibGLUT, 'glutStopVideoResizing');
+ @glutVideoResize := GetModuleSymbol(LibGLUT, 'glutVideoResize');
+ @glutVideoPan := GetModuleSymbol(LibGLUT, 'glutVideoPan');
+ @glutReportErrors := GetModuleSymbol(LibGLUT, 'glutReportErrors');
+ @glutGameModeString := GetModuleSymbol(LibGLUT, 'glutGameModeString');
+ @glutEnterGameMode := GetModuleSymbol(LibGLUT, 'glutEnterGameMode');
+ @glutLeaveGameMode := GetModuleSymbol(LibGLUT, 'glutLeaveGameMode');
+ @glutGameModeGet := GetModuleSymbol(LibGLUT, 'glutGameModeGet');
+ end;
+end;
+
+initialization
+ LoadGlut( GlutLibName );
+
+finalization
+ FreeGlut;
+
+end.
diff --git a/Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/glx.pas b/Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/glx.pas
new file mode 100644
index 00000000..125e3e39
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/OpenGL/Pas/glx.pas
@@ -0,0 +1,280 @@
+unit glx;
+{
+ $Id: glx.pas,v 1.3 2006/11/20 21:20:59 savage Exp $
+
+ Translation of the Mesa GLX headers for FreePascal
+ Copyright (C) 1999 Sebastian Guenther
+
+
+ Mesa 3-D graphics library
+ Version: 3.0
+ Copyright (C) 1995-1998 Brian Paul
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
+}
+
+// {$MODE delphi} // objfpc would not work because of direct proc var assignments
+
+{You have to enable Macros (compiler switch "-Sm") for compiling this unit!
+ This is necessary for supporting different platforms with different calling
+ conventions via a single unit.}
+
+{
+ $Log: glx.pas,v $
+ Revision 1.3 2006/11/20 21:20:59 savage
+ Updated to work in MacOS X
+
+ Revision 1.2 2006/04/18 18:38:33 savage
+ fixed boolean test - thanks grudzio
+
+ Revision 1.1 2004/03/30 21:53:55 savage
+ Moved to it's own folder.
+
+ Revision 1.5 2004/02/15 22:48:35 savage
+ More FPC and FreeBSD support changes.
+
+ Revision 1.4 2004/02/14 22:36:29 savage
+ Fixed inconsistencies of using LoadLibrary and LoadModule.
+ Now all units make use of LoadModule rather than LoadLibrary and other dynamic proc procedures.
+
+ Revision 1.3 2004/02/14 00:23:39 savage
+ As UNIX is defined in jedi-sdl.inc this will be used to check linux compatability as well. Units have been changed to reflect this change.
+
+ Revision 1.2 2004/02/14 00:09:19 savage
+ Changed uses to now make use of moduleloader.pas rather than dllfuncs.pas
+
+ Revision 1.1 2004/02/05 00:08:19 savage
+ Module 1.0 release
+
+ Revision 1.1 2003/05/11 13:18:03 savage
+ Newest OpenGL Headers For Delphi, Kylix and FPC
+
+ Revision 1.1 2002/10/13 13:57:31 sg
+ * Finally, the new units are available: Match the C headers more closely;
+ support for OpenGL extensions, and much more. Based on the Delphi units
+ by Tom Nuydens of delphi3d.net
+
+}
+
+interface
+
+{$I jedi-sdl.inc}
+
+{$IFDEF UNIX}
+ uses
+ {$IFDEF FPC}
+ x,
+ xlib,
+ xutil;
+ {$ELSE}
+ xlib;
+ {$ENDIF}
+ {$DEFINE HasGLX} // Activate GLX stuff
+{$ELSE}
+ {$MESSAGE Unsupported platform.}
+{$ENDIF}
+
+{$IFNDEF HasGLX}
+ {$MESSAGE GLX not present on this platform.}
+{$ENDIF}
+
+
+// =======================================================
+// Unit specific extensions
+// =======================================================
+
+// Note: Requires that the GL library has already been initialized
+function InitGLX: Boolean;
+
+var
+ GLXDumpUnresolvedFunctions,
+ GLXInitialized: Boolean;
+
+
+// =======================================================
+// GLX consts, types and functions
+// =======================================================
+
+// Tokens for glXChooseVisual and glXGetConfig:
+const
+ GLX_USE_GL = 1;
+ GLX_BUFFER_SIZE = 2;
+ GLX_LEVEL = 3;
+ GLX_RGBA = 4;
+ GLX_DOUBLEBUFFER = 5;
+ GLX_STEREO = 6;
+ GLX_AUX_BUFFERS = 7;
+ GLX_RED_SIZE = 8;
+ GLX_GREEN_SIZE = 9;
+ GLX_BLUE_SIZE = 10;
+ GLX_ALPHA_SIZE = 11;
+ GLX_DEPTH_SIZE = 12;
+ GLX_STENCIL_SIZE = 13;
+ GLX_ACCUM_RED_SIZE = 14;
+ GLX_ACCUM_GREEN_SIZE = 15;
+ GLX_ACCUM_BLUE_SIZE = 16;
+ GLX_ACCUM_ALPHA_SIZE = 17;
+
+ // GLX_EXT_visual_info extension
+ GLX_X_VISUAL_TYPE_EXT = $22;
+ GLX_TRANSPARENT_TYPE_EXT = $23;
+ GLX_TRANSPARENT_INDEX_VALUE_EXT = $24;
+ GLX_TRANSPARENT_RED_VALUE_EXT = $25;
+ GLX_TRANSPARENT_GREEN_VALUE_EXT = $26;
+ GLX_TRANSPARENT_BLUE_VALUE_EXT = $27;
+ GLX_TRANSPARENT_ALPHA_VALUE_EXT = $28;
+
+
+ // Error codes returned by glXGetConfig:
+ GLX_BAD_SCREEN = 1;
+ GLX_BAD_ATTRIBUTE = 2;
+ GLX_NO_EXTENSION = 3;
+ GLX_BAD_VISUAL = 4;
+ GLX_BAD_CONTEXT = 5;
+ GLX_BAD_VALUE = 6;
+ GLX_BAD_ENUM = 7;
+
+ // GLX 1.1 and later:
+ GLX_VENDOR = 1;
+ GLX_VERSION = 2;
+ GLX_EXTENSIONS = 3;
+
+ // GLX_visual_info extension
+ GLX_TRUE_COLOR_EXT = $8002;
+ GLX_DIRECT_COLOR_EXT = $8003;
+ GLX_PSEUDO_COLOR_EXT = $8004;
+ GLX_STATIC_COLOR_EXT = $8005;
+ GLX_GRAY_SCALE_EXT = $8006;
+ GLX_STATIC_GRAY_EXT = $8007;
+ GLX_NONE_EXT = $8000;
+ GLX_TRANSPARENT_RGB_EXT = $8008;
+ GLX_TRANSPARENT_INDEX_EXT = $8009;
+
+type
+ // From XLib:
+ {$IFNDEF FPC}
+ TXID = XID;
+ {$ENDIF}
+ XPixmap = TXID;
+ XFont = TXID;
+ XColormap = TXID;
+
+ GLXContext = Pointer;
+ GLXPixmap = TXID;
+ GLXDrawable = TXID;
+ GLXContextID = TXID;
+
+var
+ glXChooseVisual: function(dpy: PDisplay; screen: Integer; var attribList: Integer): PXVisualInfo; cdecl;
+ glXCreateContext: function(dpy: PDisplay; vis: PXVisualInfo; shareList: GLXContext; direct: Boolean): GLXContext; cdecl;
+ glXDestroyContext: procedure(dpy: PDisplay; ctx: GLXContext); cdecl;
+ glXMakeCurrent: function(dpy: PDisplay; drawable: GLXDrawable; ctx: GLXContext): Boolean; cdecl;
+ glXCopyContext: procedure(dpy: PDisplay; src, dst: GLXContext; mask: LongWord); cdecl;
+ glXSwapBuffers: procedure(dpy: PDisplay; drawable: GLXDrawable); cdecl;
+ glXCreateGLXPixmap: function(dpy: PDisplay; visual: PXVisualInfo; pixmap: XPixmap): GLXPixmap; cdecl;
+ glXDestroyGLXPixmap: procedure(dpy: PDisplay; pixmap: GLXPixmap); cdecl;
+ glXQueryExtension: function(dpy: PDisplay; var errorb, event: Integer): Boolean; cdecl;
+ glXQueryVersion: function(dpy: PDisplay; var maj, min: Integer): Boolean; cdecl;
+ glXIsDirect: function(dpy: PDisplay; ctx: GLXContext): Boolean; cdecl;
+ glXGetConfig: function(dpy: PDisplay; visual: PXVisualInfo; attrib: Integer; var value: Integer): Integer; cdecl;
+ glXGetCurrentContext: function: GLXContext; cdecl;
+ glXGetCurrentDrawable: function: GLXDrawable; cdecl;
+ glXWaitGL: procedure; cdecl;
+ glXWaitX: procedure; cdecl;
+ glXUseXFont: procedure(font: XFont; first, count, list: Integer); cdecl;
+
+ // GLX 1.1 and later
+ glXQueryExtensionsString: function(dpy: PDisplay; screen: Integer): PChar; cdecl;
+ glXQueryServerString: function(dpy: PDisplay; screen, name: Integer): PChar; cdecl;
+ glXGetClientString: function(dpy: PDisplay; name: Integer): PChar; cdecl;
+
+ // Mesa GLX Extensions
+ glXCreateGLXPixmapMESA: function(dpy: PDisplay; visual: PXVisualInfo; pixmap: XPixmap; cmap: XColormap): GLXPixmap; cdecl;
+ glXReleaseBufferMESA: function(dpy: PDisplay; d: GLXDrawable): Boolean; cdecl;
+ glXCopySubBufferMESA: procedure(dpy: PDisplay; drawbale: GLXDrawable; x, y, width, height: Integer); cdecl;
+ glXGetVideoSyncSGI: function(var counter: LongWord): Integer; cdecl;
+ glXWaitVideoSyncSGI: function(divisor, remainder: Integer; var count: LongWord): Integer; cdecl;
+
+
+// =======================================================
+//
+// =======================================================
+
+implementation
+
+uses
+ {$IFNDEF __GPC__}
+ SysUtils,
+ {$ENDIF}
+ moduleloader;
+
+(* {$LINKLIB m} *)
+
+var
+ libGLX: TModuleHandle;
+
+function InitGLXFromLibrary( dll : PChar ): Boolean;
+begin
+ Result := False;
+
+ if not LoadModule( libGLX, dll ) then
+ exit;
+
+ glXChooseVisual := GetModuleSymbol(libglx, 'glXChooseVisual');
+ glXCreateContext := GetModuleSymbol(libglx, 'glXCreateContext');
+ glXDestroyContext := GetModuleSymbol(libglx, 'glXDestroyContext');
+ glXMakeCurrent := GetModuleSymbol(libglx, 'glXMakeCurrent');
+ glXCopyContext := GetModuleSymbol(libglx, 'glXCopyContext');
+ glXSwapBuffers := GetModuleSymbol(libglx, 'glXSwapBuffers');
+ glXCreateGLXPixmap := GetModuleSymbol(libglx, 'glXCreateGLXPixmap');
+ glXDestroyGLXPixmap := GetModuleSymbol(libglx, 'glXDestroyGLXPixmap');
+ glXQueryExtension := GetModuleSymbol(libglx, 'glXQueryExtension');
+ glXQueryVersion := GetModuleSymbol(libglx, 'glXQueryVersion');
+ glXIsDirect := GetModuleSymbol(libglx, 'glXIsDirect');
+ glXGetConfig := GetModuleSymbol(libglx, 'glXGetConfig');
+ glXGetCurrentContext := GetModuleSymbol(libglx, 'glXGetCurrentContext');
+ glXGetCurrentDrawable := GetModuleSymbol(libglx, 'glXGetCurrentDrawable');
+ glXWaitGL := GetModuleSymbol(libglx, 'glXWaitGL');
+ glXWaitX := GetModuleSymbol(libglx, 'glXWaitX');
+ glXUseXFont := GetModuleSymbol(libglx, 'glXUseXFont');
+ // GLX 1.1 and later
+ glXQueryExtensionsString := GetModuleSymbol(libglx, 'glXQueryExtensionsString');
+ glXQueryServerString := GetModuleSymbol(libglx, 'glXQueryServerString');
+ glXGetClientString := GetModuleSymbol(libglx, 'glXGetClientString');
+ // Mesa GLX Extensions
+ glXCreateGLXPixmapMESA := GetModuleSymbol(libglx, 'glXCreateGLXPixmapMESA');
+ glXReleaseBufferMESA := GetModuleSymbol(libglx, 'glXReleaseBufferMESA');
+ glXCopySubBufferMESA := GetModuleSymbol(libglx, 'glXCopySubBufferMESA');
+ glXGetVideoSyncSGI := GetModuleSymbol(libglx, 'glXGetVideoSyncSGI');
+ glXWaitVideoSyncSGI := GetModuleSymbol(libglx, 'glXWaitVideoSyncSGI');
+
+ GLXInitialized := True;
+ Result := True;
+end;
+
+function InitGLX: Boolean;
+begin
+ Result := InitGLXFromLibrary('libGL.so') or
+ InitGLXFromLibrary('libGL.so.1') or
+ InitGLXFromLibrary('libMesaGL.so') or
+ InitGLXFromLibrary('libMesaGL.so.3');
+end;
+
+
+initialization
+ InitGLX;
+finalization
+ UnloadModule(libGLX);
+end.
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/fastevents.pas b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/fastevents.pas
new file mode 100644
index 00000000..656a7e00
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/fastevents.pas
@@ -0,0 +1,201 @@
+unit fastevents;
+{
+ FastEvents is a high-performance event queue manager for SDL.
+ Copyright (C) 2002 Bob Pendleton
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public License
+ as published by the Free Software Foundation; either version 2.1
+ of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free
+ Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+ 02111-1307 USA
+
+ If you do not wish to comply with the terms of the LGPL please
+ contact the author as other terms are available for a fee.
+
+ Bob Pendleton
+ Bob@Pendleton.com
+}
+{
+ Translated to Object Pascal by Mason Wheeler.
+ masonwheeler@yahoo.com
+
+ The original C library can be found at
+ http://www.gameprogrammer.com/fastevents/fastevents.zip
+}
+
+interface
+
+uses
+ sdl;
+
+function FE_Init: integer; // Initialize FE
+procedure FE_Quit; // shutdown FE
+procedure FE_PumpEvents; // replacement for SDL_PumpEvents
+function FE_PollEvent(event: PSDL_Event): integer; // replacement for SDL_PollEvent
+procedure FE_WaitEvent(event: PSDL_Event); // replacement for SDL_WaitEvent
+procedure FE_PushEvent(event: PSDL_Event); // replacement for SDL_PushEvent
+function FE_GetError: string; // returns the last FastEvents error
+
+implementation
+//----------------------------------------
+//
+// error handling code
+//
+
+var
+ errorString: string = '';
+
+procedure setError(err: string); inline;
+begin
+ errorString := err;
+end;
+
+function FE_GetError: string;
+begin
+ result := errorString;
+end;
+
+//----------------------------------------
+//
+// Threads, mutexs, thread utils, and
+// thread safe wrappers
+//
+var
+ eventLock: PSDL_Mutex = nil;
+ eventWait: PSDL_Cond = nil;
+ eventTimer: PSDL_TimerID = nil;
+
+//----------------------------------------
+//
+// Timer callback
+//
+
+function timerCallback(interval: Uint32; param: pointer): Uint32; {$IFNDEF __GPC__} cdecl; {$ENDIF}
+begin
+ SDL_CondBroadcast(eventWait);
+ result := interval;
+end;
+
+//----------------------------------------
+// Initialization and
+// cleanup routines
+//
+
+function FE_Init: integer;
+begin
+ result := -1;
+ if (SDL_INIT_TIMER and SDL_WasInit(SDL_INIT_TIMER)) = 0 then
+ SDL_InitSubSystem(SDL_INIT_TIMER);
+
+ eventLock := SDL_CreateMutex();
+ if eventLock = nil then
+ begin
+ setError('FE: can''t create a mutex');
+ Exit;
+ end;
+
+ eventWait := SDL_CreateCond();
+ if eventWait = nil then
+ begin
+ setError('FE: can''t create a condition variable');
+ Exit;
+ end;
+
+ eventTimer := SDL_AddTimer(10, timerCallback, nil);
+ if eventTimer = nil then
+ begin
+ setError('FE: can''t add a timer');
+ Exit;
+ end;
+
+ result := 0;
+end;
+
+procedure FE_Quit;
+begin
+ SDL_DestroyMutex(eventLock);
+ eventLock := nil;
+
+ SDL_DestroyCond(eventWait);
+ eventWait := nil;
+
+ SDL_RemoveTimer(eventTimer);
+ eventTimer := nil;
+end;
+
+//----------------------------------------
+//
+// replacement for SDL_PushEvent();
+//
+// This was originally an int function; I changed it to a
+// procedure because it only had one possible return value: 1.
+// This seemed a bit pointless. -- Mason Wheeler
+//
+
+procedure FE_PushEvent(event: PSDL_Event);
+begin
+ SDL_LockMutex(eventLock);
+ while SDL_PushEvent(event) = -1 do
+ SDL_CondWait(eventWait, eventLock);
+ SDL_UnlockMutex(eventLock);
+ SDL_CondSignal(eventWait);
+end;
+
+//----------------------------------------
+//
+// replacement for SDL_PumpEvents();
+//
+
+procedure FE_PumpEvents;
+begin
+ SDL_LockMutex(eventLock);
+ SDL_PumpEvents();
+ SDL_UnlockMutex(eventLock);
+end;
+
+//----------------------------------------
+//
+// replacement for SDL_PollEvent();
+//
+
+function FE_PollEvent(event: PSDL_Event): integer;
+var
+ val: integer;
+begin
+ SDL_LockMutex(eventLock);
+ val := SDL_PollEvent(event);
+ SDL_UnlockMutex(eventLock);
+
+ if val > 0 then
+ SDL_CondSignal(eventWait);
+ result := val;
+end;
+
+//----------------------------------------
+//
+// Replacement for SDL_WaitEvent();
+//
+// This was originally an int function; I changed it to a
+// procedure because it only had one possible return value: 1.
+// This seemed a bit pointless. -- Mason Wheeler
+//
+
+procedure FE_WaitEvent(event: PSDL_Event);
+begin
+ SDL_LockMutex(eventLock);
+ while SDL_PollEvent(event) <= 0 do
+ SDL_CondWait(eventWait, eventLock);
+ SDL_UnlockMutex(eventLock);
+ SDL_CondSignal(eventWait);
+end;
+
+end.
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/jedi-sdl.inc b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/jedi-sdl.inc
new file mode 100644
index 00000000..31283d40
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/jedi-sdl.inc
@@ -0,0 +1,438 @@
+{
+ $Id: jedi-sdl.inc,v 1.15 2007/05/29 21:30:48 savage Exp $
+}
+{******************************************************************************}
+{ }
+{ Borland Delphi SDL - Simple DirectMedia Layer }
+{ Global Conditional Definitions for JEDI-SDL cross-compilation }
+{ }
+{ }
+{ The initial developer of this Pascal code was : }
+{ Prof. Abimbola Olowofoyeku <http://www.bigfoot.com/~African_Chief/> }
+{ }
+{ Portions created by Prof. Abimbola Olowofoyeku are }
+{ Copyright (C) 2000 - 2100 Prof. Abimbola Olowofoyeku. }
+{ }
+{ }
+{ Contributor(s) }
+{ -------------- }
+{ Prof. Abimbola Olowofoyeku <http://www.bigfoot.com/~African_Chief/> }
+{ Dominqiue Louis <Dominique@SavageSoftware.com.au> }
+{ }
+{ Obtained through: }
+{ Joint Endeavour of Delphi Innovators ( Project JEDI ) }
+{ }
+{ You may retrieve the latest version of this file at the Project }
+{ JEDI home page, located at http://delphi-jedi.org }
+{ }
+{ The contents of this file are used with permission, subject to }
+{ the Mozilla Public License Version 1.1 (the "License"); you may }
+{ not use this file except in compliance with the License. You may }
+{ obtain a copy of the License at }
+{ http://www.mozilla.org/MPL/MPL-1.1.html }
+{ }
+{ Software distributed under the License is distributed on an }
+{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
+{ implied. See the License for the specific language governing }
+{ rights and limitations under the License. }
+{ }
+{ Description }
+{ ----------- }
+{ This code has been copied from... }
+{ Global Conditional Definitions for Chief's UNZIP package }
+{ By Prof. Abimbola Olowofoyeku (The African Chief) }
+{ http://www.bigfoot.com/~African_Chief/ }
+{ }
+{ }
+{ Requires }
+{ -------- }
+{ The SDL Runtime libraris on Win32 : SDL.dll on Linux : libSDL.so }
+{ They are available from... }
+{ http://www.libsdl.org . }
+{ }
+{ Programming Notes }
+{ ----------------- }
+{ }
+{ }
+{ }
+{ }
+{ Revision History }
+{ ---------------- }
+{ 2003-04-03 DL - Initial addition }
+{ }
+{ 2003-04-07 DL - Added Macro ON derective for FPC and OpenGL and removed }
+{ WEAKPACKAGE derective. WEAKPACKAGE should be set when }
+{ appropriate. }
+{ }
+{ 2003-04-23 - DL : under instruction from Alexey Barkovoy I have added }
+{ better TMT Pascal support and under instruction }
+{ from Prof. Abimbola Olowofoyeku (The African Chief) }
+{ I have added better Gnu Pascal support }
+{ }
+{ 2004-01-19 - DL : Under instruction from Marco van de Voort, I have added }
+{ Better FPC support for FreeBSD. }
+{ }
+(*
+ $Log: jedi-sdl.inc,v $
+ Revision 1.15 2007/05/29 21:30:48 savage
+ Changes as suggested by Almindor for 64bit compatibility.
+
+ Revision 1.14 2007/05/20 20:29:11 savage
+ Initial Changes to Handle 64 Bits
+
+ Revision 1.13 2007/01/21 15:51:45 savage
+ Added Delphi 2006 support
+
+ Revision 1.12 2006/11/19 18:41:01 savage
+ removed THREADING ON flag as it is no longer needed in latest versions of FPC.
+
+ Revision 1.11 2006/01/04 00:52:41 drellis
+ Updated to include defined for ENDIAN values, SDL_BYTEORDER should now be correctly defined depending onthe platform. Code taken from sdl_mixer
+
+ Revision 1.10 2005/05/22 18:42:31 savage
+ Changes as suggested by Michalis Kamburelis. Thanks again.
+
+ Revision 1.9 2004/12/23 23:42:17 savage
+ Applied Patches supplied by Michalis Kamburelis ( THANKS! ), for greater FreePascal compatability.
+
+ Revision 1.8 2004/10/20 22:43:04 savage
+ Ensure that UNSAFE type warning are off in D9 as well
+
+ Revision 1.7 2004/04/05 09:59:51 savage
+ Changes for FreePacal as suggested by Marco
+
+ Revision 1.6 2004/03/31 22:18:15 savage
+ Small comment for turning off warning under GnuPascal
+
+ Revision 1.5 2004/03/30 22:41:02 savage
+ Added extra commenting due to previous compiler directive
+
+ Revision 1.4 2004/03/30 22:08:33 savage
+ Added Kylix Define
+
+ Revision 1.3 2004/03/30 21:34:40 savage
+ {$H+} needed for FPC compatiblity
+
+ Revision 1.2 2004/02/14 00:23:39 savage
+ As UNIX is defined in jedi-sdl.inc this will be used to check linux compatability as well. Units have been changed to reflect this change.
+
+*)
+{******************************************************************************}
+
+{.$define Debug} { uncomment for debugging }
+
+{$IFNDEF FPC}
+ {$IFDEF __GPC__}
+ {$I-}
+ {$W-} // turn off GPC warnings
+ {$X+}
+ {$ELSE} {__GPC__}
+ {$IFDEF Debug}
+ {$F+,D+,Q-,L+,R+,I-,S+,Y+,A+}
+ {$ELSE}
+ {$F+,Q-,R-,S-,I-,A+}
+ {$ENDIF}
+ {$ENDIF} {__GPC__}
+{$ELSE} {FPC}
+ //{$M+}
+{$ENDIF} {FPC}
+
+{$IFDEF LINUX}
+{$DEFINE UNIX}
+{$ENDIF}
+
+{$IFDEF ver70}
+ {$IFDEF Windows}
+ {$DEFINE Win16}
+ {$ENDIF Windows}
+ {$IFDEF MSDOS}
+ {$DEFINE NO_EXPORTS}
+ {$ENDIF MSDOS}
+ {$IFDEF DPMI}
+ {$DEFINE BP_DPMI}
+ {$ENDIF}
+ {$DEFINE OS_16_BIT}
+ {$DEFINE __OS_DOS__}
+{$ENDIF ver70}
+
+{$IFDEF ver80}
+ {$DEFINE Delphi} {Delphi 1.x}
+ {$DEFINE Delphi16}
+ {$DEFINE Win16}
+ {$DEFINE OS_16_BIT}
+ {$DEFINE __OS_DOS__}
+{$ENDIF ver80}
+
+{$IFDEF ver90}
+ {$DEFINE Delphi} {Delphi 2.x}
+ {$DEFINE Delphi32}
+ {$DEFINE WIN32}
+ {$DEFINE WINDOWS}
+{$ENDIF ver90}
+
+{$IFDEF ver100}
+ {$DEFINE Delphi} {Delphi 3.x}
+ {$DEFINE Delphi32}
+ {$DEFINE WIN32}
+ {$DEFINE WINDOWS}
+{$ENDIF ver100}
+
+{$IFDEF ver93}
+ {$DEFINE Delphi} {C++ Builder 1.x}
+ {$DEFINE Delphi32}
+ {$DEFINE WINDOWS}
+{$ENDIF ver93}
+
+{$IFDEF ver110}
+ {$DEFINE Delphi} {C++ Builder 3.x}
+ {$DEFINE Delphi32}
+ {$DEFINE WINDOWS}
+{$ENDIF ver110}
+
+{$IFDEF ver120}
+ {$DEFINE Delphi} {Delphi 4.x}
+ {$DEFINE Delphi32}
+ {$DEFINE Delphi4UP}
+ {$DEFINE Has_Int64}
+ {$DEFINE WINDOWS}
+{$ENDIF ver120}
+
+{$IFDEF ver130}
+ {$DEFINE Delphi} {Delphi 5.x}
+ {$DEFINE Delphi32}
+ {$DEFINE Delphi4UP}
+ {$DEFINE Delphi5UP}
+ {$DEFINE Has_Int64}
+ {$DEFINE WINDOWS}
+{$ENDIF ver130}
+
+{$IFDEF ver140}
+ {$DEFINE Delphi} {Delphi 6.x}
+ {$DEFINE Delphi32}
+ {$DEFINE Delphi4UP}
+ {$DEFINE Delphi5UP}
+ {$DEFINE Delphi6UP}
+ {$DEFINE Has_Int64}
+ {$DEFINE HAS_TYPES}
+{$ENDIF ver140}
+
+{$IFDEF ver150}
+ {$DEFINE Delphi} {Delphi 7.x}
+ {$DEFINE Delphi32}
+ {$DEFINE Delphi4UP}
+ {$DEFINE Delphi5UP}
+ {$DEFINE Delphi6UP}
+ {$DEFINE Delphi7UP}
+ {$WARN UNSAFE_TYPE OFF} {Disable warning for unsafe types in Delphi 7}
+ {$DEFINE Has_Int64}
+ {$DEFINE HAS_TYPES}
+{$ENDIF ver150}
+
+{$IFDEF ver160}
+ {$DEFINE Delphi} {Delphi 8}
+ {$DEFINE Delphi32}
+ {$DEFINE Delphi4UP}
+ {$DEFINE Delphi5UP}
+ {$DEFINE Delphi6UP}
+ {$DEFINE Delphi7UP}
+ {$DEFINE Delphi8UP}
+ {$DEFINE Has_Int64}
+ {$DEFINE HAS_TYPES}
+{$ENDIF ver160}
+
+{$IFDEF ver170}
+ {$DEFINE Delphi} {Delphi 2005}
+ {$DEFINE Delphi32}
+ {$DEFINE Delphi4UP}
+ {$DEFINE Delphi5UP}
+ {$DEFINE Delphi6UP}
+ {$DEFINE Delphi7UP}
+ {$DEFINE Delphi8UP}
+ {$DEFINE Delphi9UP}
+ {$WARN UNSAFE_TYPE OFF} {Disable warning for unsafe types in Delphi 7}
+ {$DEFINE Has_Int64}
+ {$DEFINE HAS_TYPES}
+{$ENDIF ver170}
+
+{$IFDEF ver180}
+ {$DEFINE Delphi} {Delphi 2006}
+ {$DEFINE Delphi32}
+ {$DEFINE Delphi4UP}
+ {$DEFINE Delphi5UP}
+ {$DEFINE Delphi6UP}
+ {$DEFINE Delphi7UP}
+ {$DEFINE Delphi8UP}
+ {$DEFINE Delphi9UP}
+ {$DEFINE Delphi10UP}
+ {$WARN UNSAFE_TYPE OFF} {Disable warning for unsafe types in Delphi 7}
+ {$DEFINE Has_Int64}
+ {$DEFINE HAS_TYPES}
+{$ENDIF ver180}
+
+{$IFDEF ver185}
+ {$DEFINE Delphi} {Delphi 2007}
+ {$DEFINE Delphi32}
+ {$DEFINE Delphi4UP}
+ {$DEFINE Delphi5UP}
+ {$DEFINE Delphi6UP}
+ {$DEFINE Delphi7UP}
+ {$DEFINE Delphi8UP}
+ {$DEFINE Delphi9UP}
+ {$DEFINE Delphi10UP}
+ {$WARN UNSAFE_TYPE OFF} {Disable warning for unsafe types in Delphi 7}
+ {$DEFINE Has_Int64}
+ {$DEFINE HAS_TYPES}
+{$ENDIF ver180}
+
+{$IFDEF UNIX}
+ {$ifdef VER140} // Kylix 1 & 2
+ {$DEFINE KYLIX}
+ {$DEFINE KYLIX1UP}
+ {$DEFINE KYLIX2UP}
+ {$DEFINE HAS_TYPES}
+ {$endif}
+
+ {$ifdef VER150} // Kylix 3
+ {$DEFINE KYLIX}
+ {$DEFINE KYLIX1UP}
+ {$DEFINE KYLIX2UP}
+ {$DEFINE KYLIX3UP}
+ {$DEFINE HAS_TYPES}
+ {$endif}
+{$ENDIF UNIX}
+
+{$IFDEF VirtualPascal} { Virtual Pascal 2.x }
+ {$DEFINE Delphi} { Use Delphi Syntax }
+ {$DEFINE VP2}
+ {&Delphi+}
+{$ENDIF VirtualPascal}
+
+{$IFDEF Delphi}
+ {$DEFINE Windows}
+ {$DEFINE USE_STDCALL}
+ //{$ALIGN ON}
+{$ENDIF Delphi}
+
+{$IFDEF FPC}
+ {$MODE Delphi} { use Delphi compatibility mode }
+ {$H+}
+ {$PACKRECORDS C} // Added for record
+ {$MACRO ON} // Added For OpenGL
+ {$DEFINE Delphi}
+ {$DEFINE UseAT}
+ {$UNDEF USE_STDCALL}
+ {$DEFINE OS_BigMem}
+ {$DEFINE NO_EXPORTS}
+ {$DEFINE Has_Int64}
+ {$DEFINE NOCRT}
+ {$IFDEF UNIX}
+ {$DEFINE fpc_unix}
+ {$ELSE}
+ {$DEFINE __OS_DOS__}
+ {$ENDIF}
+ {$IFDEF WIN32}
+ {$DEFINE UseWin}
+ {$ENDIF}
+ {$DEFINE HAS_TYPES}
+{$ENDIF FPC}
+
+{$IFDEF Win16}
+ {$K+} {smart callbacks}
+{$ENDIF Win16}
+
+ {$IFDEF OS2}
+ {$UNDEF Windows}
+ {$DEFINE UseWin}
+ {$DEFINE OS_BigMem}
+ {$ENDIF OS2}
+
+{$IFDEF __GPC__}
+ {$UNDEF UseWin}
+ {$UNDEF USE_STDCALL}
+ {$DEFINE OS_BigMem}
+ {$DEFINE NO_EXPORTS}
+ {$DEFINE NOCRT}
+ {$DEFINE cdecl attribute(cdecl)}
+{$ENDIF}
+
+{$IFDEF __TMT__}
+ {$DEFINE OS_BigMem}
+ {$DEFINE NO_EXPORTS}
+ {$DEFINE __OS_DOS__}
+ {$DEFINE UseAT}
+ {$IFNDEF MSDOS}
+ {$DEFINE USE_STDCALL}
+ {$ENDIF}
+
+ {$IFDEF __WIN32__}
+ {$DEFINE Win32}
+ {$DEFINE UseWin}
+ {$DEFINE NOCRT}
+ {$DEFINE Win32}
+ {$IFNDEF __CON__}
+ {$DEFINE Windows}
+ {$ENDIF}
+ {$ENDIF}
+
+ {$A+} // Word alignment data
+ {$OA+} // Objects and structures align
+{$ENDIF}
+
+{$IFDEF Win32}
+ {$DEFINE OS_BigMem}
+{$ELSE Win32}
+ {$IFDEF ver70}
+ {$DEFINE assembler}
+ {$ENDIF} { use 16-bit assembler! }
+{$ENDIF Win32}
+
+{ ************************** dos/dos-like platforms **************}
+{$IFDEF Windows}
+ {$DEFINE __OS_DOS__}
+ {$DEFINE UseWin}
+ {$DEFINE MSWINDOWS}
+{$ENDIF Delphi}
+
+{$IFDEF OS2}
+ {$DEFINE __OS_DOS__}
+ {$DEFINE Can_Use_DLL}
+{$ENDIF Delphi}
+
+{$IFDEF UseWin}
+ {$DEFINE Can_Use_DLL}
+{$ENDIF}
+
+{$IFDEF Win16}
+ {$DEFINE Can_Use_DLL}
+{$ENDIF}
+
+{$IFDEF BP_DPMI}
+ {$DEFINE Can_Use_DLL}
+{$ENDIF}
+
+{$IFDEF USE_STDCALL}
+ {$IFNDEF __TMT__}
+ {$DEFINE BY_NAME}
+ {$ENDIF}
+{$ENDIF}
+
+{$IFNDEF ver70}
+ {$UNDEF assembler}
+{$ENDIF}
+
+{*************** define LITTLE ENDIAN platforms ********************}
+
+
+{$IFDEF Delphi}
+{$DEFINE IA32}
+{$ENDIF}
+
+{$IFDEF KYLIX}
+{$DEFINE IA32}
+{$ENDIF}
+
+{$IFDEF FPC}
+{$IFDEF FPC_LITTLE_ENDIAN}
+{$DEFINE IA32}
+{$ENDIF}
+{$ENDIF}
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/libxmlparser.pas b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/libxmlparser.pas
new file mode 100644
index 00000000..0cdf44c7
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/libxmlparser.pas
@@ -0,0 +1,2688 @@
+(**
+===============================================================================================
+Name : LibXmlParser
+===============================================================================================
+Project : All Projects
+===============================================================================================
+Subject : Progressive XML Parser for all types of XML Files
+===============================================================================================
+Author : Stefan Heymann
+ Eschenweg 3
+ 72076 Tübingen
+ GERMANY
+
+E-Mail: stefan@destructor.de
+URL: www.destructor.de
+===============================================================================================
+Source, Legals ("Licence")
+--------------------------
+The official site to get this parser is http://www.destructor.de/
+
+Usage and Distribution of this Source Code is ruled by the
+"Destructor.de Source code Licence" (DSL) which comes with this file or
+can be downloaded at http://www.destructor.de/
+
+IN SHORT: Usage and distribution of this source code is free.
+ You use it completely on your own risk.
+
+Postcardware
+------------
+If you like this code, please send a postcard of your city to my above address.
+===============================================================================================
+!!! All parts of this code which are not finished or not conforming exactly to
+ the XmlSpec are marked with three exclamation marks
+
+-!- Parts where the parser may be able to detect errors in the document's syntax are
+ marked with the dash-exlamation mark-dash sequence.
+===============================================================================================
+Terminology:
+------------
+- Start: Start of a buffer part
+- Final: End (last character) of a buffer part
+- DTD: Document Type Definition
+- DTDc: Document Type Declaration
+- XMLSpec: The current W3C XML Recommendation (version 1.0 as of 1998-02-10), Chapter No.
+- Cur*: Fields concerning the "Current" part passed back by the "Scan" method
+===============================================================================================
+Scanning the XML document
+-------------------------
+- Create TXmlParser Instance MyXml := TXmlParser.Create;
+- Load XML Document MyXml.LoadFromFile (Filename);
+- Start Scanning MyXml.StartScan;
+- Scan Loop WHILE MyXml.Scan DO
+- Test for Part Type CASE MyXml.CurPartType OF
+- Handle Parts ... : ;;;
+- Handle Parts ... : ;;;
+- Handle Parts ... : ;;;
+ END;
+- Destroy MyXml.Free;
+===============================================================================================
+Loading the XML document
+------------------------
+You can load the XML document from a file with the "LoadFromFile" method.
+It is beyond the scope of this parser to perform HTTP or FTP accesses. If you want your
+application to handle such requests (URLs), you can load the XML via HTTP or FTP or whatever
+protocol and hand over the data buffer using the "LoadFromBuffer" or "SetBuffer" method.
+"LoadFromBuffer" loads the internal buffer of TXmlParser with the given null-terminated
+string, thereby creating a copy of that buffer.
+"SetBuffer" just takes the pointer to another buffer, which means that the given
+buffer pointer must be valid while the document is accessed via TXmlParser.
+===============================================================================================
+Encodings:
+----------
+This XML parser kind of "understands" the following encodings:
+- UTF-8
+- ISO-8859-1
+- Windows-1252
+
+Any flavor of multi-byte characters (and this includes UTF-16) is not supported. Sorry.
+
+Every string which has to be passed to the application passes the virtual method
+"TranslateEncoding" which translates the string from the current encoding (stored in
+"CurEncoding") into the encoding the application wishes to receive.
+The "TranslateEncoding" method that is built into TXmlParser assumes that the application
+wants to receive Windows ANSI (Windows-1252, about the same as ISO-8859-1) and is able
+to convert UTF-8 and ISO-8859-1 encodings.
+For other source and target encodings, you will have to override "TranslateEncoding".
+===============================================================================================
+Buffer Handling
+---------------
+- The document must be loaded completely into a piece of RAM
+- All character positions are referenced by PChar pointers
+- The TXmlParser instance can either "own" the buffer itself (then, FBufferSize is > 0)
+ or reference the buffer of another instance or object (then, FBuffersize is 0 and
+ FBuffer is not NIL)
+- The Property DocBuffer passes back a pointer to the first byte of the document. If there
+ is no document stored (FBuffer is NIL), the DocBuffer returns a pointer to a NULL character.
+===============================================================================================
+Whitespace Handling
+-------------------
+The TXmlParser property "PackSpaces" determines how Whitespace is returned in Text Content:
+While PackSpaces is true, all leading and trailing whitespace characters are trimmed of, all
+Whitespace is converted to Space #x20 characters and contiguous Whitespace characters are
+compressed to one.
+If the "Scan" method reports a ptContent part, the application can get the original text
+with all whitespace characters by extracting the characters from "CurStart" to "CurFinal".
+If the application detects an xml:space attribute, it can set "PackSpaces" accordingly or
+use CurStart/CurFinal.
+Please note that TXmlParser does _not_ normalize Line Breaks to single LineFeed characters
+as the XmlSpec requires (XmlSpec 2.11).
+The xml:space attribute is not handled by TXmlParser. This is on behalf of the application.
+===============================================================================================
+Non-XML-Conforming
+------------------
+TXmlParser does not conform 100 % exactly to the XmlSpec:
+- UTF-16 is not supported (XmlSpec 2.2)
+ (Workaround: Convert UTF-16 to UTF-8 and hand the buffer over to TXmlParser)
+- As the parser only works with single byte strings, all Unicode characters > 255
+ can currently not be handled correctly.
+- Line breaks are not normalized to single Linefeed #x0A characters (XmlSpec 2.11)
+ (Workaround: The Application can access the text contents on its own [CurStart, CurFinal],
+ thereby applying every normalization it wishes to)
+- The attribute value normalization does not work exactly as defined in the
+ Second Edition of the XML 1.0 specification.
+- See also the code parts marked with three consecutive exclamation marks. These are
+ parts which are not finished in the current code release.
+
+This list may be incomplete, so it may grow if I get to know any other points.
+As work on the parser proceeds, this list may also shrink.
+===============================================================================================
+Things Todo
+-----------
+- Introduce a new event/callback which is called when there is an unresolvable
+ entity or character reference
+- Support Unicode
+- Use Streams instead of reading the whole XML into memory
+===============================================================================================
+Change History, Version numbers
+-------------------------------
+The Date is given in ISO Year-Month-Day (YYYY-MM-DD) order.
+Versions are counted from 1.0.0 beginning with the version from 2000-03-16.
+Unreleased versions don't get a version number.
+
+Date Author Version Changes
+-----------------------------------------------------------------------------------------------
+2000-03-16 HeySt 1.0.0 Start
+2000-03-28 HeySt 1.0.1 Initial Publishing of TXmlParser on the destructor.de Web Site
+2000-03-30 HeySt 1.0.2 TXmlParser.AnalyzeCData: Call "TranslateEncoding" for CurContent
+2000-03-31 HeySt 1.0.3 Deleted the StrPosE function (was not needed anyway)
+2000-04-04 HeySt 1.0.4 TDtdElementRec modified: Start/Final for all Elements;
+ Should be backwards compatible.
+ AnalyzeDtdc: Set CurPartType to ptDtdc
+2000-04-23 HeySt 1.0.5 New class TObjectList. Eliminated reference to the Delphi 5
+ "Contnrs" unit so LibXmlParser is Delphi 4 compatible.
+2000-07-03 HeySt 1.0.6 TNvpNode: Added Constructor
+2000-07-11 HeySt 1.0.7 Removed "Windows" from USES clause
+ Added three-exclamation-mark comments for Utf8ToAnsi/AnsiToUtf8
+ Added three-exclamation-mark comments for CHR function calls
+2000-07-23 HeySt 1.0.8 TXmlParser.Clear: CurAttr.Clear; EntityStack.Clear;
+ (This was not a bug; just defensive programming)
+2000-07-29 HeySt 1.0.9 TNvpList: Added methods: Node(Index), Value(Index), Name(Index);
+2000-10-07 HeySt Introduced Conditional Defines
+ Uses Contnrs unit and its TObjectList class again for
+ Delphi 5 and newer versions
+2001-01-30 HeySt Introduced Version Numbering
+ Made LoadFromFile and LoadFromBuffer BOOLEAN functions
+ Introduced FileMode parameter for LoadFromFile
+ BugFix: TAttrList.Analyze: Must add CWhitespace to ExtractName call
+ Comments worked over
+2001-02-28 HeySt 1.0.10 Completely worked over and tested the UTF-8 functions
+ Fixed a bug in TXmlParser.Scan which caused it to start over when it
+ was called after the end of scanning, resulting in an endless loop
+ TEntityStack is now a TObjectList instead of TList
+2001-07-03 HeySt 1.0.11 Updated Compiler Version IFDEFs for Kylix
+2001-07-11 HeySt 1.0.12 New TCustomXmlScanner component (taken over from LibXmlComps.pas)
+2001-07-14 HeySt 1.0.13 Bugfix TCustomXmlScanner.FOnTranslateEncoding
+2001-10-22 HeySt Don't clear CurName anymore when the parser finds a CDATA section.
+2001-12-03 HeySt 1.0.14 TObjectList.Clear: Make call to INHERITED method (fixes a memory leak)
+2001-12-05 HeySt 1.0.15 TObjectList.Clear: removed call to INHERITED method
+ TObjectList.Destroy: Inserted SetCapacity call.
+ Reduces need for frequent re-allocation of pointer buffer
+ Dedicated to my father, Theodor Heymann
+2002-06-26 HeySt 1.0.16 TXmlParser.Scan: Fixed a bug with PIs whose name is beginning
+ with 'xml'. Thanks to Uwe Kamm for submitting this bug.
+ The CurEncoding property is now always in uppercase letters (the XML
+ spec wants it to be treated case independently so when it's uppercase
+ comparisons are faster)
+2002-03-04 HeySt 1.0.17 Included an IFDEF for Delphi 7 (VER150) and Kylix
+ There is a new symbol HAS_CONTNRS_UNIT which is used now to
+ distinguish between IDEs which come with the Contnrs unit and
+ those that don't.
+*)
+
+UNIT libxmlparser;
+
+{$I jedi-sdl.inc}
+
+INTERFACE
+
+USES
+ SysUtils, Classes,
+ (*$IFDEF HAS_CONTNRS_UNIT *) // The Contnrs Unit was introduced in Delphi 5
+ Contnrs,
+ (*$ENDIF*)
+ Math;
+
+CONST
+ CVersion = '1.0.17'; // This variable will be updated for every release
+ // (I hope, I won't forget to do it everytime ...)
+
+TYPE
+ TPartType = // --- Document Part Types
+ (ptNone, // Nothing
+ ptXmlProlog, // XML Prolog XmlSpec 2.8 / 4.3.1
+ ptComment, // Comment XmlSpec 2.5
+ ptPI, // Processing Instruction XmlSpec 2.6
+ ptDtdc, // Document Type Declaration XmlSpec 2.8
+ ptStartTag, // Start Tag XmlSpec 3.1
+ ptEmptyTag, // Empty-Element Tag XmlSpec 3.1
+ ptEndTag, // End Tag XmlSpec 3.1
+ ptContent, // Text Content between Tags
+ ptCData); // CDATA Section XmlSpec 2.7
+
+ TDtdElemType = // --- DTD Elements
+ (deElement, // !ELEMENT declaration
+ deAttList, // !ATTLIST declaration
+ deEntity, // !ENTITY declaration
+ deNotation, // !NOTATION declaration
+ dePI, // PI in DTD
+ deComment, // Comment in DTD
+ deError); // Error found in the DTD
+
+TYPE
+ TAttrList = CLASS;
+ TEntityStack = CLASS;
+ TNvpList = CLASS;
+ TElemDef = CLASS;
+ TElemList = CLASS;
+ TEntityDef = CLASS;
+ TNotationDef = CLASS;
+
+ TDtdElementRec = RECORD // --- This Record is returned by the DTD parser callback function
+ Start, Final : PChar; // Start/End of the Element's Declaration
+ CASE ElementType : TDtdElemType OF // Type of the Element
+ deElement, // <!ELEMENT>
+ deAttList : (ElemDef : TElemDef); // <!ATTLIST>
+ deEntity : (EntityDef : TEntityDef); // <!ENTITY>
+ deNotation : (NotationDef : TNotationDef); // <!NOTATION>
+ dePI : (Target : PChar; // <?PI ?>
+ Content : PChar;
+ AttrList : TAttrList);
+ deError : (Pos : PChar); // Error
+ // deComment : ((No additional fields here)); // <!-- Comment -->
+ END;
+
+ TXmlParser = CLASS // --- Internal Properties and Methods
+ PROTECTED
+ FBuffer : PChar; // NIL if there is no buffer available
+ FBufferSize : INTEGER; // 0 if the buffer is not owned by the Document instance
+ FSource : STRING; // Name of Source of document. Filename for Documents loaded with LoadFromFile
+
+ FXmlVersion : STRING; // XML version from Document header. Default is '1.0'
+ FEncoding : STRING; // Encoding from Document header. Default is 'UTF-8'
+ FStandalone : BOOLEAN; // Standalone declaration from Document header. Default is 'yes'
+ FRootName : STRING; // Name of the Root Element (= DTD name)
+ FDtdcFinal : PChar; // Pointer to the '>' character terminating the DTD declaration
+
+ FNormalize : BOOLEAN; // If true: Pack Whitespace and don't return empty contents
+ EntityStack : TEntityStack; // Entity Stack for Parameter and General Entities
+ FCurEncoding : STRING; // Current Encoding during parsing (always uppercase)
+
+ PROCEDURE AnalyzeProlog; // Analyze XML Prolog or Text Declaration
+ PROCEDURE AnalyzeComment (Start : PChar; VAR Final : PChar); // Analyze Comments
+ PROCEDURE AnalyzePI (Start : PChar; VAR Final : PChar); // Analyze Processing Instructions (PI)
+ PROCEDURE AnalyzeDtdc; // Analyze Document Type Declaration
+ PROCEDURE AnalyzeDtdElements (Start : PChar; VAR Final : PChar); // Analyze DTD declarations
+ PROCEDURE AnalyzeTag; // Analyze Start/End/Empty-Element Tags
+ PROCEDURE AnalyzeCData; // Analyze CDATA Sections
+ PROCEDURE AnalyzeText (VAR IsDone : BOOLEAN); // Analyze Text Content between Tags
+ PROCEDURE AnalyzeElementDecl (Start : PChar; VAR Final : PChar);
+ PROCEDURE AnalyzeAttListDecl (Start : PChar; VAR Final : PChar);
+ PROCEDURE AnalyzeEntityDecl (Start : PChar; VAR Final : PChar);
+ PROCEDURE AnalyzeNotationDecl (Start : PChar; VAR Final : PChar);
+
+ PROCEDURE PushPE (VAR Start : PChar);
+ PROCEDURE ReplaceCharacterEntities (VAR Str : STRING);
+ PROCEDURE ReplaceParameterEntities (VAR Str : STRING);
+ PROCEDURE ReplaceGeneralEntities (VAR Str : STRING);
+
+ FUNCTION GetDocBuffer : PChar; // Returns FBuffer or a pointer to a NUL char if Buffer is empty
+
+ PUBLIC // --- Document Properties
+ PROPERTY XmlVersion : STRING READ FXmlVersion; // XML version from the Document Prolog
+ PROPERTY Encoding : STRING READ FEncoding; // Document Encoding from Prolog
+ PROPERTY Standalone : BOOLEAN READ FStandalone; // Standalone Declaration from Prolog
+ PROPERTY RootName : STRING READ FRootName; // Name of the Root Element
+ PROPERTY Normalize : BOOLEAN READ FNormalize WRITE FNormalize; // True if Content is to be normalized
+ PROPERTY Source : STRING READ FSource; // Name of Document Source (Filename)
+ PROPERTY DocBuffer : PChar READ GetDocBuffer; // Returns document buffer
+ PUBLIC // --- DTD Objects
+ Elements : TElemList; // Elements: List of TElemDef (contains Attribute Definitions)
+ Entities : TNvpList; // General Entities: List of TEntityDef
+ ParEntities : TNvpList; // Parameter Entities: List of TEntityDef
+ Notations : TNvpList; // Notations: List of TNotationDef
+ PUBLIC
+ CONSTRUCTOR Create;
+ DESTRUCTOR Destroy; OVERRIDE;
+
+ // --- Document Handling
+ FUNCTION LoadFromFile (Filename : STRING;
+ FileMode : INTEGER = fmOpenRead OR fmShareDenyNone) : BOOLEAN;
+ // Loads Document from given file
+ FUNCTION LoadFromBuffer (Buffer : PChar) : BOOLEAN; // Loads Document from another buffer
+ PROCEDURE SetBuffer (Buffer : PChar); // References another buffer
+ PROCEDURE Clear; // Clear Document
+
+ PUBLIC
+ // --- Scanning through the document
+ CurPartType : TPartType; // Current Type
+ CurName : STRING; // Current Name
+ CurContent : STRING; // Current Normalized Content
+ CurStart : PChar; // Current First character
+ CurFinal : PChar; // Current Last character
+ CurAttr : TAttrList; // Current Attribute List
+ PROPERTY CurEncoding : STRING READ FCurEncoding; // Current Encoding
+ PROCEDURE StartScan;
+ FUNCTION Scan : BOOLEAN;
+
+ // --- Events / Callbacks
+ FUNCTION LoadExternalEntity (SystemId, PublicId,
+ Notation : STRING) : TXmlParser; VIRTUAL;
+ FUNCTION TranslateEncoding (CONST Source : STRING) : STRING; VIRTUAL;
+ PROCEDURE DtdElementFound (DtdElementRec : TDtdElementRec); VIRTUAL;
+ END;
+
+ TValueType = // --- Attribute Value Type
+ (vtNormal, // Normal specified Attribute
+ vtImplied, // #IMPLIED attribute value
+ vtFixed, // #FIXED attribute value
+ vtDefault); // Attribute value from default value in !ATTLIST declaration
+
+ TAttrDefault = // --- Attribute Default Type
+ (adDefault, // Normal default value
+ adRequired, // #REQUIRED attribute
+ adImplied, // #IMPLIED attribute
+ adFixed); // #FIXED attribute
+
+ TAttrType = // --- Type of attribute
+ (atUnknown, // Unknown type
+ atCData, // Character data only
+ atID, // ID
+ atIdRef, // ID Reference
+ atIdRefs, // Several ID References, separated by Whitespace
+ atEntity, // Name of an unparsed Entity
+ atEntities, // Several unparsed Entity names, separated by Whitespace
+ atNmToken, // Name Token
+ atNmTokens, // Several Name Tokens, separated by Whitespace
+ atNotation, // A selection of Notation names (Unparsed Entity)
+ atEnumeration); // Enumeration
+
+ TElemType = // --- Element content type
+ (etEmpty, // Element is always empty
+ etAny, // Element can have any mixture of PCDATA and any elements
+ etChildren, // Element must contain only elements
+ etMixed); // Mixed PCDATA and elements
+
+ (*$IFDEF HAS_CONTNRS_UNIT *)
+ TObjectList = Contnrs.TObjectList; // Re-Export this identifier
+ (*$ELSE *)
+ TObjectList = CLASS (TList)
+ DESTRUCTOR Destroy; OVERRIDE;
+ PROCEDURE Delete (Index : INTEGER);
+ PROCEDURE Clear; OVERRIDE;
+ END;
+ (*$ENDIF *)
+
+ TNvpNode = CLASS // Name-Value Pair Node
+ Name : STRING;
+ Value : STRING;
+ CONSTRUCTOR Create (TheName : STRING = ''; TheValue : STRING = '');
+ END;
+
+ TNvpList = CLASS (TObjectList) // Name-Value Pair List
+ PROCEDURE Add (Node : TNvpNode);
+ FUNCTION Node (Name : STRING) : TNvpNode; OVERLOAD;
+ FUNCTION Node (Index : INTEGER) : TNvpNode; OVERLOAD;
+ FUNCTION Value (Name : STRING) : STRING; OVERLOAD;
+ FUNCTION Value (Index : INTEGER) : STRING; OVERLOAD;
+ FUNCTION Name (Index : INTEGER) : STRING;
+ END;
+
+ TAttr = CLASS (TNvpNode) // Attribute of a Start-Tag or Empty-Element-Tag
+ ValueType : TValueType;
+ AttrType : TAttrType;
+ END;
+
+ TAttrList = CLASS (TNvpList) // List of Attributes
+ PROCEDURE Analyze (Start : PChar; VAR Final : PChar);
+ END;
+
+ TEntityStack = CLASS (TObjectList) // Stack where current position is stored before parsing entities
+ PROTECTED
+ Owner : TXmlParser;
+ PUBLIC
+ CONSTRUCTOR Create (TheOwner : TXmlParser);
+ PROCEDURE Push (LastPos : PChar); OVERLOAD;
+ PROCEDURE Push (Instance : TObject; LastPos : PChar); OVERLOAD;
+ FUNCTION Pop : PChar; // Returns next char or NIL if EOF is reached. Frees Instance.
+ END;
+
+ TAttrDef = CLASS (TNvpNode) // Represents a <!ATTLIST Definition. "Value" is the default value
+ TypeDef : STRING; // Type definition from the DTD
+ Notations : STRING; // Notation List, separated by pipe symbols '|'
+ AttrType : TAttrType; // Attribute Type
+ DefaultType : TAttrDefault; // Default Type
+ END;
+
+ TElemDef = CLASS (TNvpList) // Represents a <!ELEMENT Definition. Is a list of TAttrDef-Nodes
+ Name : STRING; // Element name
+ ElemType : TElemType; // Element type
+ Definition : STRING; // Element definition from DTD
+ END;
+
+ TElemList = CLASS (TObjectList) // List of TElemDef nodes
+ FUNCTION Node (Name : STRING) : TElemDef;
+ PROCEDURE Add (Node : TElemDef);
+ END;
+
+ TEntityDef = CLASS (TNvpNode) // Represents a <!ENTITY Definition.
+ SystemId : STRING;
+ PublicId : STRING;
+ NotationName : STRING;
+ END;
+
+ TNotationDef = CLASS (TNvpNode) // Represents a <!NOTATION Definition. Value is the System ID
+ PublicId : STRING;
+ END;
+
+ TCharset = SET OF CHAR;
+
+
+CONST
+ CWhitespace = [#32, #9, #13, #10]; // Whitespace characters (XmlSpec 2.3)
+ CLetter = [#$41..#$5A, #$61..#$7A, #$C0..#$D6, #$D8..#$F6, #$F8..#$FF];
+ CDigit = [#$30..#$39];
+ CNameChar = CLetter + CDigit + ['.', '-', '_', ':', #$B7];
+ CNameStart = CLetter + ['_', ':'];
+ CQuoteChar = ['"', ''''];
+ CPubidChar = [#32, ^M, ^J, #9, 'a'..'z', 'A'..'Z', '0'..'9',
+ '-', '''', '(', ')', '+', ',', '.', '/', ':',
+ '=', '?', ';', '!', '*', '#', '@', '$', '_', '%'];
+
+ CDStart = '<![CDATA[';
+ CDEnd = ']]>';
+
+ // --- Name Constants for the above enumeration types
+ CPartType_Name : ARRAY [TPartType] OF STRING =
+ ('', 'XML Prolog', 'Comment', 'PI',
+ 'DTD Declaration', 'Start Tag', 'Empty Tag', 'End Tag',
+ 'Text', 'CDATA');
+ CValueType_Name : ARRAY [TValueType] OF STRING = ('Normal', 'Implied', 'Fixed', 'Default');
+ CAttrDefault_Name : ARRAY [TAttrDefault] OF STRING = ('Default', 'Required', 'Implied', 'Fixed');
+ CElemType_Name : ARRAY [TElemType] OF STRING = ('Empty', 'Any', 'Childs only', 'Mixed');
+ CAttrType_Name : ARRAY [TAttrType] OF STRING = ('Unknown', 'CDATA',
+ 'ID', 'IDREF', 'IDREFS',
+ 'ENTITY', 'ENTITIES',
+ 'NMTOKEN', 'NMTOKENS',
+ 'Notation', 'Enumeration');
+
+FUNCTION ConvertWs (Source: STRING; PackWs: BOOLEAN) : STRING; // Convert WS to spaces #x20
+PROCEDURE SetStringSF (VAR S : STRING; BufferStart, BufferFinal : PChar); // SetString by Start/Final of buffer
+FUNCTION StrSFPas (Start, Finish : PChar) : STRING; // Convert buffer part to Pascal string
+FUNCTION TrimWs (Source : STRING) : STRING; // Trim Whitespace
+
+FUNCTION AnsiToUtf8 (Source : ANSISTRING) : STRING; // Convert Win-1252 to UTF-8
+FUNCTION Utf8ToAnsi (Source : STRING; UnknownChar : CHAR = '¿') : ANSISTRING; // Convert UTF-8 to Win-1252
+
+
+(*
+===============================================================================================
+TCustomXmlScanner event based component wrapper for TXmlParser
+===============================================================================================
+*)
+
+TYPE
+ TCustomXmlScanner = CLASS;
+ TXmlPrologEvent = PROCEDURE (Sender : TObject; XmlVersion, Encoding: STRING; Standalone : BOOLEAN) OF OBJECT;
+ TCommentEvent = PROCEDURE (Sender : TObject; Comment : STRING) OF OBJECT;
+ TPIEvent = PROCEDURE (Sender : TObject; Target, Content: STRING; Attributes : TAttrList) OF OBJECT;
+ TDtdEvent = PROCEDURE (Sender : TObject; RootElementName : STRING) OF OBJECT;
+ TStartTagEvent = PROCEDURE (Sender : TObject; TagName : STRING; Attributes : TAttrList) OF OBJECT;
+ TEndTagEvent = PROCEDURE (Sender : TObject; TagName : STRING) OF OBJECT;
+ TContentEvent = PROCEDURE (Sender : TObject; Content : STRING) OF OBJECT;
+ TElementEvent = PROCEDURE (Sender : TObject; ElemDef : TElemDef) OF OBJECT;
+ TEntityEvent = PROCEDURE (Sender : TObject; EntityDef : TEntityDef) OF OBJECT;
+ TNotationEvent = PROCEDURE (Sender : TObject; NotationDef : TNotationDef) OF OBJECT;
+ TErrorEvent = PROCEDURE (Sender : TObject; ErrorPos : PChar) OF OBJECT;
+ TExternalEvent = PROCEDURE (Sender : TObject; SystemId, PublicId, NotationId : STRING;
+ VAR Result : TXmlParser) OF OBJECT;
+ TEncodingEvent = FUNCTION (Sender : TObject; CurrentEncoding, Source : STRING) : STRING OF OBJECT;
+
+
+ TCustomXmlScanner = CLASS (TComponent)
+ PROTECTED
+ FXmlParser : TXmlParser;
+ FOnXmlProlog : TXmlPrologEvent;
+ FOnComment : TCommentEvent;
+ FOnPI : TPIEvent;
+ FOnDtdRead : TDtdEvent;
+ FOnStartTag : TStartTagEvent;
+ FOnEmptyTag : TStartTagEvent;
+ FOnEndTag : TEndTagEvent;
+ FOnContent : TContentEvent;
+ FOnCData : TContentEvent;
+ FOnElement : TElementEvent;
+ FOnAttList : TElementEvent;
+ FOnEntity : TEntityEvent;
+ FOnNotation : TNotationEvent;
+ FOnDtdError : TErrorEvent;
+ FOnLoadExternal : TExternalEvent;
+ FOnTranslateEncoding : TEncodingEvent;
+ FStopParser : BOOLEAN;
+ FUNCTION GetNormalize : BOOLEAN;
+ PROCEDURE SetNormalize (Value : BOOLEAN);
+
+ PROCEDURE WhenXmlProlog(XmlVersion, Encoding: STRING; Standalone : BOOLEAN); VIRTUAL;
+ PROCEDURE WhenComment (Comment : STRING); VIRTUAL;
+ PROCEDURE WhenPI (Target, Content: STRING; Attributes : TAttrList); VIRTUAL;
+ PROCEDURE WhenDtdRead (RootElementName : STRING); VIRTUAL;
+ PROCEDURE WhenStartTag (TagName : STRING; Attributes : TAttrList); VIRTUAL;
+ PROCEDURE WhenEmptyTag (TagName : STRING; Attributes : TAttrList); VIRTUAL;
+ PROCEDURE WhenEndTag (TagName : STRING); VIRTUAL;
+ PROCEDURE WhenContent (Content : STRING); VIRTUAL;
+ PROCEDURE WhenCData (Content : STRING); VIRTUAL;
+ PROCEDURE WhenElement (ElemDef : TElemDef); VIRTUAL;
+ PROCEDURE WhenAttList (ElemDef : TElemDef); VIRTUAL;
+ PROCEDURE WhenEntity (EntityDef : TEntityDef); VIRTUAL;
+ PROCEDURE WhenNotation (NotationDef : TNotationDef); VIRTUAL;
+ PROCEDURE WhenDtdError (ErrorPos : PChar); VIRTUAL;
+
+ PUBLIC
+ CONSTRUCTOR Create (AOwner: TComponent); OVERRIDE;
+ DESTRUCTOR Destroy; OVERRIDE;
+
+ PROCEDURE LoadFromFile (Filename : TFilename); // Load XML Document from file
+ PROCEDURE LoadFromBuffer (Buffer : PChar); // Load XML Document from buffer
+ PROCEDURE SetBuffer (Buffer : PChar); // Refer to Buffer
+ FUNCTION GetFilename : TFilename;
+
+ PROCEDURE Execute; // Perform scanning
+
+ PROTECTED
+ PROPERTY XmlParser : TXmlParser READ FXmlParser;
+ PROPERTY StopParser : BOOLEAN READ FStopParser WRITE FStopParser;
+ PROPERTY Filename : TFilename READ GetFilename WRITE LoadFromFile;
+ PROPERTY Normalize : BOOLEAN READ GetNormalize WRITE SetNormalize;
+ PROPERTY OnXmlProlog : TXmlPrologEvent READ FOnXmlProlog WRITE FOnXmlProlog;
+ PROPERTY OnComment : TCommentEvent READ FOnComment WRITE FOnComment;
+ PROPERTY OnPI : TPIEvent READ FOnPI WRITE FOnPI;
+ PROPERTY OnDtdRead : TDtdEvent READ FOnDtdRead WRITE FOnDtdRead;
+ PROPERTY OnStartTag : TStartTagEvent READ FOnStartTag WRITE FOnStartTag;
+ PROPERTY OnEmptyTag : TStartTagEvent READ FOnEmptyTag WRITE FOnEmptyTag;
+ PROPERTY OnEndTag : TEndTagEvent READ FOnEndTag WRITE FOnEndTag;
+ PROPERTY OnContent : TContentEvent READ FOnContent WRITE FOnContent;
+ PROPERTY OnCData : TContentEvent READ FOnCData WRITE FOnCData;
+ PROPERTY OnElement : TElementEvent READ FOnElement WRITE FOnElement;
+ PROPERTY OnAttList : TElementEvent READ FOnAttList WRITE FOnAttList;
+ PROPERTY OnEntity : TEntityEvent READ FOnEntity WRITE FOnEntity;
+ PROPERTY OnNotation : TNotationEvent READ FOnNotation WRITE FOnNotation;
+ PROPERTY OnDtdError : TErrorEvent READ FOnDtdError WRITE FOnDtdError;
+ PROPERTY OnLoadExternal : TExternalEvent READ FOnLoadExternal WRITE FOnLoadExternal;
+ PROPERTY OnTranslateEncoding : TEncodingEvent READ FOnTranslateEncoding WRITE FOnTranslateEncoding;
+ END;
+
+(*
+===============================================================================================
+IMPLEMENTATION
+===============================================================================================
+*)
+
+IMPLEMENTATION
+
+
+(*
+===============================================================================================
+Unicode and UTF-8 stuff
+===============================================================================================
+*)
+
+CONST
+ // --- Character Translation Table for Unicode <-> Win-1252
+ WIN1252_UNICODE : ARRAY [$00..$FF] OF WORD = (
+ $0000, $0001, $0002, $0003, $0004, $0005, $0006, $0007, $0008, $0009,
+ $000A, $000B, $000C, $000D, $000E, $000F, $0010, $0011, $0012, $0013,
+ $0014, $0015, $0016, $0017, $0018, $0019, $001A, $001B, $001C, $001D,
+ $001E, $001F, $0020, $0021, $0022, $0023, $0024, $0025, $0026, $0027,
+ $0028, $0029, $002A, $002B, $002C, $002D, $002E, $002F, $0030, $0031,
+ $0032, $0033, $0034, $0035, $0036, $0037, $0038, $0039, $003A, $003B,
+ $003C, $003D, $003E, $003F, $0040, $0041, $0042, $0043, $0044, $0045,
+ $0046, $0047, $0048, $0049, $004A, $004B, $004C, $004D, $004E, $004F,
+ $0050, $0051, $0052, $0053, $0054, $0055, $0056, $0057, $0058, $0059,
+ $005A, $005B, $005C, $005D, $005E, $005F, $0060, $0061, $0062, $0063,
+ $0064, $0065, $0066, $0067, $0068, $0069, $006A, $006B, $006C, $006D,
+ $006E, $006F, $0070, $0071, $0072, $0073, $0074, $0075, $0076, $0077,
+ $0078, $0079, $007A, $007B, $007C, $007D, $007E, $007F,
+
+ $20AC, $0081, $201A, $0192, $201E, $2026, $2020, $2021, $02C6, $2030,
+ $0160, $2039, $0152, $008D, $017D, $008F, $0090, $2018, $2019, $201C,
+ $201D, $2022, $2013, $2014, $02DC, $2122, $0161, $203A, $0153, $009D,
+ $017E, $0178, $00A0, $00A1, $00A2, $00A3, $00A4, $00A5, $00A6, $00A7,
+ $00A8, $00A9, $00AA, $00AB, $00AC, $00AD, $00AE, $00AF, $00B0, $00B1,
+ $00B2, $00B3, $00B4, $00B5, $00B6, $00B7, $00B8, $00B9, $00BA, $00BB,
+ $00BC, $00BD, $00BE, $00BF, $00C0, $00C1, $00C2, $00C3, $00C4, $00C5,
+ $00C6, $00C7, $00C8, $00C9, $00CA, $00CB, $00CC, $00CD, $00CE, $00CF,
+ $00D0, $00D1, $00D2, $00D3, $00D4, $00D5, $00D6, $00D7, $00D8, $00D9,
+ $00DA, $00DB, $00DC, $00DD, $00DE, $00DF, $00E0, $00E1, $00E2, $00E3,
+ $00E4, $00E5, $00E6, $00E7, $00E8, $00E9, $00EA, $00EB, $00EC, $00ED,
+ $00EE, $00EF, $00F0, $00F1, $00F2, $00F3, $00F4, $00F5, $00F6, $00F7,
+ $00F8, $00F9, $00FA, $00FB, $00FC, $00FD, $00FE, $00FF);
+
+(* UTF-8 (somewhat simplified)
+ -----
+ Character Range Byte sequence
+ --------------- -------------------------- (x=Bits from original character)
+ $0000..$007F 0xxxxxxx
+ $0080..$07FF 110xxxxx 10xxxxxx
+ $8000..$FFFF 1110xxxx 10xxxxxx 10xxxxxx
+
+ Example
+ --------
+ Transforming the Unicode character U+00E4 LATIN SMALL LETTER A WITH DIAERESIS ("ä"):
+
+ ISO-8859-1, Decimal 228
+ Win1252, Hex $E4
+ ANSI Bin 1110 0100
+ abcd efgh
+
+ UTF-8 Binary 1100xxab 10cdefgh
+ Binary 11000011 10100100
+ Hex $C3 $A4
+ Decimal 195 164
+ ANSI Ã ¤ *)
+
+
+FUNCTION AnsiToUtf8 (Source : ANSISTRING) : STRING;
+ (* Converts the given Windows ANSI (Win1252) String to UTF-8. *)
+VAR
+ I : INTEGER; // Loop counter
+ U : WORD; // Current Unicode value
+ Len : INTEGER; // Current real length of "Result" string
+BEGIN
+ SetLength (Result, Length (Source) * 3); // Worst case
+ Len := 0;
+ FOR I := 1 TO Length (Source) DO BEGIN
+ U := WIN1252_UNICODE [ORD (Source [I])];
+ CASE U OF
+ $0000..$007F : BEGIN
+ INC (Len);
+ Result [Len] := CHR (U);
+ END;
+ $0080..$07FF : BEGIN
+ INC (Len);
+ Result [Len] := CHR ($C0 OR (U SHR 6));
+ INC (Len);
+ Result [Len] := CHR ($80 OR (U AND $3F));
+ END;
+ $0800..$FFFF : BEGIN
+ INC (Len);
+ Result [Len] := CHR ($E0 OR (U SHR 12));
+ INC (Len);
+ Result [Len] := CHR ($80 OR ((U SHR 6) AND $3F));
+ INC (Len);
+ Result [Len] := CHR ($80 OR (U AND $3F));
+ END;
+ END;
+ END;
+ SetLength (Result, Len);
+END;
+
+
+FUNCTION Utf8ToAnsi (Source : STRING; UnknownChar : CHAR = '¿') : ANSISTRING;
+ (* Converts the given UTF-8 String to Windows ANSI (Win-1252).
+ If a character can not be converted, the "UnknownChar" is inserted. *)
+VAR
+ SourceLen : INTEGER; // Length of Source string
+ I, K : INTEGER;
+ A : BYTE; // Current ANSI character value
+ U : WORD;
+ Ch : CHAR; // Dest char
+ Len : INTEGER; // Current real length of "Result" string
+BEGIN
+ SourceLen := Length (Source);
+ SetLength (Result, SourceLen); // Enough room to live
+ Len := 0;
+ I := 1;
+ WHILE I <= SourceLen DO BEGIN
+ A := ORD (Source [I]);
+ IF A < $80 THEN BEGIN // Range $0000..$007F
+ INC (Len);
+ Result [Len] := Source [I];
+ INC (I);
+ END
+ ELSE BEGIN // Determine U, Inc I
+ IF (A AND $E0 = $C0) AND (I < SourceLen) THEN BEGIN // Range $0080..$07FF
+ U := (WORD (A AND $1F) SHL 6) OR (ORD (Source [I+1]) AND $3F);
+ INC (I, 2);
+ END
+ ELSE IF (A AND $F0 = $E0) AND (I < SourceLen-1) THEN BEGIN // Range $0800..$FFFF
+ U := (WORD (A AND $0F) SHL 12) OR
+ (WORD (ORD (Source [I+1]) AND $3F) SHL 6) OR
+ ( ORD (Source [I+2]) AND $3F);
+ INC (I, 3);
+ END
+ ELSE BEGIN // Unknown/unsupported
+ INC (I);
+ FOR K := 7 DOWNTO 0 DO
+ IF A AND (1 SHL K) = 0 THEN BEGIN
+ INC (I, (A SHR (K+1))-1);
+ BREAK;
+ END;
+ U := WIN1252_UNICODE [ORD (UnknownChar)];
+ END;
+ Ch := UnknownChar; // Retrieve ANSI char
+ FOR A := $00 TO $FF DO
+ IF WIN1252_UNICODE [A] = U THEN BEGIN
+ Ch := CHR (A);
+ BREAK;
+ END;
+ INC (Len);
+ Result [Len] := Ch;
+ END;
+ END;
+ SetLength (Result, Len);
+END;
+
+
+(*
+===============================================================================================
+"Special" Helper Functions
+
+Don't ask me why. But including these functions makes the parser *DRAMATICALLY* faster
+on my K6-233 machine. You can test it yourself just by commenting them out.
+They do exactly the same as the Assembler routines defined in SysUtils.
+(This is where you can see how great the Delphi compiler really is. The compiled code is
+faster than hand-coded assembler!)
+===============================================================================================
+--> Just move this line below the StrScan function --> *)
+
+
+FUNCTION StrPos (CONST Str, SearchStr : PChar) : PChar;
+ // Same functionality as SysUtils.StrPos
+VAR
+ First : CHAR;
+ Len : INTEGER;
+BEGIN
+ First := SearchStr^;
+ Len := StrLen (SearchStr);
+ Result := Str;
+ REPEAT
+ IF Result^ = First THEN
+ IF StrLComp (Result, SearchStr, Len) = 0 THEN BREAK;
+ IF Result^ = #0 THEN BEGIN
+ Result := NIL;
+ BREAK;
+ END;
+ INC (Result);
+ UNTIL FALSE;
+END;
+
+
+FUNCTION StrScan (CONST Start : PChar; CONST Ch : CHAR) : PChar;
+ // Same functionality as SysUtils.StrScan
+BEGIN
+ Result := Start;
+ WHILE Result^ <> Ch DO BEGIN
+ IF Result^ = #0 THEN BEGIN
+ Result := NIL;
+ EXIT;
+ END;
+ INC (Result);
+ END;
+END;
+
+
+(*
+===============================================================================================
+Helper Functions
+===============================================================================================
+*)
+
+FUNCTION DelChars (Source : STRING; CharsToDelete : TCharset) : STRING;
+ // Delete all "CharsToDelete" from the string
+VAR
+ I : INTEGER;
+BEGIN
+ Result := Source;
+ FOR I := Length (Result) DOWNTO 1 DO
+ IF Result [I] IN CharsToDelete THEN
+ Delete (Result, I, 1);
+END;
+
+
+FUNCTION TrimWs (Source : STRING) : STRING;
+ // Trimms off Whitespace characters from both ends of the string
+VAR
+ I : INTEGER;
+BEGIN
+ // --- Trim Left
+ I := 1;
+ WHILE (I <= Length (Source)) AND (Source [I] IN CWhitespace) DO
+ INC (I);
+ Result := Copy (Source, I, MaxInt);
+
+ // --- Trim Right
+ I := Length (Result);
+ WHILE (I > 1) AND (Result [I] IN CWhitespace) DO
+ DEC (I);
+ Delete (Result, I+1, Length (Result)-I);
+END;
+
+
+FUNCTION ConvertWs (Source: STRING; PackWs: BOOLEAN) : STRING;
+ // Converts all Whitespace characters to the Space #x20 character
+ // If "PackWs" is true, contiguous Whitespace characters are packed to one
+VAR
+ I : INTEGER;
+BEGIN
+ Result := Source;
+ FOR I := Length (Result) DOWNTO 1 DO
+ IF (Result [I] IN CWhitespace) THEN
+ IF PackWs AND (I > 1) AND (Result [I-1] IN CWhitespace)
+ THEN Delete (Result, I, 1)
+ ELSE Result [I] := #32;
+END;
+
+
+PROCEDURE SetStringSF (VAR S : STRING; BufferStart, BufferFinal : PChar);
+BEGIN
+ SetString (S, BufferStart, BufferFinal-BufferStart+1);
+END;
+
+
+FUNCTION StrLPas (Start : PChar; Len : INTEGER) : STRING;
+BEGIN
+ SetString (Result, Start, Len);
+END;
+
+
+FUNCTION StrSFPas (Start, Finish : PChar) : STRING;
+BEGIN
+ SetString (Result, Start, Finish-Start+1);
+END;
+
+
+FUNCTION StrScanE (CONST Source : PChar; CONST CharToScanFor : CHAR) : PChar;
+ // If "CharToScanFor" is not found, StrScanE returns the last char of the
+ // buffer instead of NIL
+BEGIN
+ Result := StrScan (Source, CharToScanFor);
+ IF Result = NIL THEN
+ Result := StrEnd (Source)-1;
+END;
+
+
+PROCEDURE ExtractName (Start : PChar; Terminators : TCharset; VAR Final : PChar);
+ (* Extracts the complete Name beginning at "Start".
+ It is assumed that the name is contained in Markup, so the '>' character is
+ always a Termination.
+ Start: IN Pointer to first char of name. Is always considered to be valid
+ Terminators: IN Characters which terminate the name
+ Final: OUT Pointer to last char of name *)
+BEGIN
+ Final := Start+1;
+ Include (Terminators, #0);
+ Include (Terminators, '>');
+ WHILE NOT (Final^ IN Terminators) DO
+ INC (Final);
+ DEC (Final);
+END;
+
+
+PROCEDURE ExtractQuote (Start : PChar; VAR Content : STRING; VAR Final : PChar);
+ (* Extract a string which is contained in single or double Quotes.
+ Start: IN Pointer to opening quote
+ Content: OUT The quoted string
+ Final: OUT Pointer to closing quote *)
+BEGIN
+ Final := StrScan (Start+1, Start^);
+ IF Final = NIL THEN BEGIN
+ Final := StrEnd (Start+1)-1;
+ SetString (Content, Start+1, Final-Start);
+ END
+ ELSE
+ SetString (Content, Start+1, Final-1-Start);
+END;
+
+
+(*
+===============================================================================================
+TEntityStackNode
+This Node is pushed to the "Entity Stack" whenever the parser parses entity replacement text.
+The "Instance" field holds the Instance pointer of an External Entity buffer. When it is
+popped, the Instance is freed.
+The "Encoding" field holds the name of the Encoding. External Parsed Entities may have
+another encoding as the document entity (XmlSpec 4.3.3). So when there is an "<?xml" PI
+found in the stream (= Text Declaration at the beginning of external parsed entities), the
+Encoding found there is used for the External Entity (is assigned to TXmlParser.CurEncoding)
+Default Encoding is for the Document Entity is UTF-8. It is assumed that External Entities
+have the same Encoding as the Document Entity, unless they carry a Text Declaration.
+===============================================================================================
+*)
+
+TYPE
+ TEntityStackNode = CLASS
+ Instance : TObject;
+ Encoding : STRING;
+ LastPos : PChar;
+ END;
+
+(*
+===============================================================================================
+TEntityStack
+For nesting of Entities.
+When there is an entity reference found in the data stream, the corresponding entity
+definition is searched and the current position is pushed to this stack.
+From then on, the program scans the entitiy replacement text as if it were normal content.
+When the parser reaches the end of an entity, the current position is popped off the
+stack again.
+===============================================================================================
+*)
+
+CONSTRUCTOR TEntityStack.Create (TheOwner : TXmlParser);
+BEGIN
+ INHERITED Create;
+ Owner := TheOwner;
+END;
+
+
+PROCEDURE TEntityStack.Push (LastPos : PChar);
+BEGIN
+ Push (NIL, LastPos);
+END;
+
+
+PROCEDURE TEntityStack.Push (Instance : TObject; LastPos : PChar);
+VAR
+ ESN : TEntityStackNode;
+BEGIN
+ ESN := TEntityStackNode.Create;
+ ESN.Instance := Instance;
+ ESN.Encoding := Owner.FCurEncoding; // Save current Encoding
+ ESN.LastPos := LastPos;
+ Add (ESN);
+END;
+
+
+FUNCTION TEntityStack.Pop : PChar;
+VAR
+ ESN : TEntityStackNode;
+BEGIN
+ IF Count > 0 THEN BEGIN
+ ESN := TEntityStackNode (Items [Count-1]);
+ Result := ESN.LastPos;
+ IF ESN.Instance <> NIL THEN
+ ESN.Instance.Free;
+ IF ESN.Encoding <> '' THEN
+ Owner.FCurEncoding := ESN.Encoding; // Restore current Encoding
+ Delete (Count-1);
+ END
+ ELSE
+ Result := NIL;
+END;
+
+
+(*
+===============================================================================================
+TExternalID
+-----------
+XmlSpec 4.2.2: ExternalID ::= 'SYSTEM' S SystemLiteral |
+ 'PUBLIC' S PubidLiteral S SystemLiteral
+XmlSpec 4.7: PublicID ::= 'PUBLIC' S PubidLiteral
+SystemLiteral and PubidLiteral are quoted
+===============================================================================================
+*)
+
+TYPE
+ TExternalID = CLASS
+ PublicId : STRING;
+ SystemId : STRING;
+ Final : PChar;
+ CONSTRUCTOR Create (Start : PChar);
+ END;
+
+CONSTRUCTOR TExternalID.Create (Start : PChar);
+BEGIN
+ INHERITED Create;
+ Final := Start;
+ IF StrLComp (Start, 'SYSTEM', 6) = 0 THEN BEGIN
+ WHILE NOT (Final^ IN (CQuoteChar + [#0, '>', '['])) DO INC (Final);
+ IF NOT (Final^ IN CQuoteChar) THEN EXIT;
+ ExtractQuote (Final, SystemID, Final);
+ END
+ ELSE IF StrLComp (Start, 'PUBLIC', 6) = 0 THEN BEGIN
+ WHILE NOT (Final^ IN (CQuoteChar + [#0, '>', '['])) DO INC (Final);
+ IF NOT (Final^ IN CQuoteChar) THEN EXIT;
+ ExtractQuote (Final, PublicID, Final);
+ INC (Final);
+ WHILE NOT (Final^ IN (CQuoteChar + [#0, '>', '['])) DO INC (Final);
+ IF NOT (Final^ IN CQuoteChar) THEN EXIT;
+ ExtractQuote (Final, SystemID, Final);
+ END;
+END;
+
+
+(*
+===============================================================================================
+TXmlParser
+===============================================================================================
+*)
+
+CONSTRUCTOR TXmlParser.Create;
+BEGIN
+ INHERITED Create;
+ FBuffer := NIL;
+ FBufferSize := 0;
+ Elements := TElemList.Create;
+ Entities := TNvpList.Create;
+ ParEntities := TNvpList.Create;
+ Notations := TNvpList.Create;
+ CurAttr := TAttrList.Create;
+ EntityStack := TEntityStack.Create (Self);
+ Clear;
+END;
+
+
+DESTRUCTOR TXmlParser.Destroy;
+BEGIN
+ Clear;
+ Elements.Free;
+ Entities.Free;
+ ParEntities.Free;
+ Notations.Free;
+ CurAttr.Free;
+ EntityStack.Free;
+ INHERITED Destroy;
+END;
+
+
+PROCEDURE TXmlParser.Clear;
+ // Free Buffer and clear all object attributes
+BEGIN
+ IF (FBufferSize > 0) AND (FBuffer <> NIL) THEN
+ FreeMem (FBuffer);
+ FBuffer := NIL;
+ FBufferSize := 0;
+ FSource := '';
+ FXmlVersion := '';
+ FEncoding := '';
+ FStandalone := FALSE;
+ FRootName := '';
+ FDtdcFinal := NIL;
+ FNormalize := TRUE;
+ Elements.Clear;
+ Entities.Clear;
+ ParEntities.Clear;
+ Notations.Clear;
+ CurAttr.Clear;
+ EntityStack.Clear;
+END;
+
+
+FUNCTION TXmlParser.LoadFromFile (Filename : STRING; FileMode : INTEGER = fmOpenRead OR fmShareDenyNone) : BOOLEAN;
+ // Loads Document from given file
+ // Returns TRUE if successful
+VAR
+ f : FILE;
+ ReadIn : INTEGER;
+ OldFileMode : INTEGER;
+BEGIN
+ Result := FALSE;
+ Clear;
+
+ // --- Open File
+ OldFileMode := SYSTEM.FileMode;
+ TRY
+ SYSTEM.FileMode := FileMode;
+ TRY
+ AssignFile (f, Filename);
+ Reset (f, 1);
+ EXCEPT
+ EXIT;
+ END;
+
+ TRY
+ // --- Allocate Memory
+ TRY
+ FBufferSize := Filesize (f) + 1;
+ GetMem (FBuffer, FBufferSize);
+ EXCEPT
+ Clear;
+ EXIT;
+ END;
+
+ // --- Read File
+ TRY
+ BlockRead (f, FBuffer^, FBufferSize, ReadIn);
+ (FBuffer+ReadIn)^ := #0; // NULL termination
+ EXCEPT
+ Clear;
+ EXIT;
+ END;
+ FINALLY
+ CloseFile (f);
+ END;
+
+ FSource := Filename;
+ Result := TRUE;
+
+ FINALLY
+ SYSTEM.FileMode := OldFileMode;
+ END;
+END;
+
+
+FUNCTION TXmlParser.LoadFromBuffer (Buffer : PChar) : BOOLEAN;
+ // Loads Document from another buffer
+ // Returns TRUE if successful
+ // The "Source" property becomes '<MEM>' if successful
+BEGIN
+ Result := FALSE;
+ Clear;
+ FBufferSize := StrLen (Buffer) + 1;
+ TRY
+ GetMem (FBuffer, FBufferSize);
+ EXCEPT
+ Clear;
+ EXIT;
+ END;
+ StrCopy (FBuffer, Buffer);
+ FSource := '<MEM>';
+ Result := TRUE;
+END;
+
+
+PROCEDURE TXmlParser.SetBuffer (Buffer : PChar); // References another buffer
+BEGIN
+ Clear;
+ FBuffer := Buffer;
+ FBufferSize := 0;
+ FSource := '<REFERENCE>';
+END;
+
+
+//-----------------------------------------------------------------------------------------------
+// Scanning through the document
+//-----------------------------------------------------------------------------------------------
+
+PROCEDURE TXmlParser.StartScan;
+BEGIN
+ CurPartType := ptNone;
+ CurName := '';
+ CurContent := '';
+ CurStart := NIL;
+ CurFinal := NIL;
+ CurAttr.Clear;
+ EntityStack.Clear;
+END;
+
+
+FUNCTION TXmlParser.Scan : BOOLEAN;
+ // Scans the next Part
+ // Returns TRUE if a part could be found, FALSE if there is no part any more
+ //
+ // "IsDone" can be set to FALSE by AnalyzeText in order to go to the next part
+ // if there is no Content due to normalization
+VAR
+ IsDone : BOOLEAN;
+BEGIN
+ REPEAT
+ IsDone := TRUE;
+
+ // --- Start of next Part
+ IF CurStart = NIL
+ THEN CurStart := DocBuffer
+ ELSE CurStart := CurFinal+1;
+ CurFinal := CurStart;
+
+ // --- End of Document of Pop off a new part from the Entity stack?
+ IF CurStart^ = #0 THEN
+ CurStart := EntityStack.Pop;
+
+ // --- No Document or End Of Document: Terminate Scan
+ IF (CurStart = NIL) OR (CurStart^ = #0) THEN BEGIN
+ CurStart := StrEnd (DocBuffer);
+ CurFinal := CurStart-1;
+ EntityStack.Clear;
+ Result := FALSE;
+ EXIT;
+ END;
+
+ IF (StrLComp (CurStart, '<?xml', 5) = 0) AND
+ ((CurStart+5)^ IN CWhitespace) THEN AnalyzeProlog // XML Declaration, Text Declaration
+ ELSE IF StrLComp (CurStart, '<?', 2) = 0 THEN AnalyzePI (CurStart, CurFinal) // PI
+ ELSE IF StrLComp (CurStart, '<!--', 4) = 0 THEN AnalyzeComment (CurStart, CurFinal) // Comment
+ ELSE IF StrLComp (CurStart, '<!DOCTYPE', 9) = 0 THEN AnalyzeDtdc // DTDc
+ ELSE IF StrLComp (CurStart, CDStart, Length (CDStart)) = 0 THEN AnalyzeCdata // CDATA Section
+ ELSE IF StrLComp (CurStart, '<', 1) = 0 THEN AnalyzeTag // Start-Tag, End-Tag, Empty-Element-Tag
+ ELSE AnalyzeText (IsDone); // Text Content
+ UNTIL IsDone;
+ Result := TRUE;
+END;
+
+
+PROCEDURE TXmlParser.AnalyzeProlog;
+ // Analyze XML Prolog or Text Declaration
+VAR
+ F : PChar;
+BEGIN
+ CurAttr.Analyze (CurStart+5, F);
+ IF EntityStack.Count = 0 THEN BEGIN
+ FXmlVersion := CurAttr.Value ('version');
+ FEncoding := CurAttr.Value ('encoding');
+ FStandalone := CurAttr.Value ('standalone') = 'yes';
+ END;
+ CurFinal := StrPos (F, '?>');
+ IF CurFinal <> NIL
+ THEN INC (CurFinal)
+ ELSE CurFinal := StrEnd (CurStart)-1;
+ FCurEncoding := AnsiUpperCase (CurAttr.Value ('encoding'));
+ IF FCurEncoding = '' THEN
+ FCurEncoding := 'UTF-8'; // Default XML Encoding is UTF-8
+ CurPartType := ptXmlProlog;
+ CurName := '';
+ CurContent := '';
+END;
+
+
+PROCEDURE TXmlParser.AnalyzeComment (Start : PChar; VAR Final : PChar);
+ // Analyze Comments
+BEGIN
+ Final := StrPos (Start+4, '-->');
+ IF Final = NIL
+ THEN Final := StrEnd (Start)-1
+ ELSE INC (Final, 2);
+ CurPartType := ptComment;
+END;
+
+
+PROCEDURE TXmlParser.AnalyzePI (Start : PChar; VAR Final : PChar);
+ // Analyze Processing Instructions (PI)
+ // This is also called for Character
+VAR
+ F : PChar;
+BEGIN
+ CurPartType := ptPI;
+ Final := StrPos (Start+2, '?>');
+ IF Final = NIL
+ THEN Final := StrEnd (Start)-1
+ ELSE INC (Final);
+ ExtractName (Start+2, CWhitespace + ['?', '>'], F);
+ SetStringSF (CurName, Start+2, F);
+ SetStringSF (CurContent, F+1, Final-2);
+ CurAttr.Analyze (F+1, F);
+END;
+
+
+PROCEDURE TXmlParser.AnalyzeDtdc;
+ (* Analyze Document Type Declaration
+ doctypedecl ::= '<!DOCTYPE' S Name (S ExternalID)? S? ('[' (markupdecl | PEReference | S)* ']' S?)? '>'
+ markupdecl ::= elementdecl | AttlistDecl | EntityDecl | NotationDecl | PI | Comment
+ PEReference ::= '%' Name ';'
+
+ elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>'
+ AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>'
+ EntityDecl ::= '<!ENTITY' S Name S EntityDef S? '>' |
+ '<!ENTITY' S '%' S Name S PEDef S? '>'
+ NotationDecl ::= '<!NOTATION' S Name S (ExternalID | PublicID) S? '>'
+ PI ::= '<?' PITarget (S (Char* - (Char* '?>' Char* )))? '?>'
+ Comment ::= '<!--' ((Char - '-') | ('-' (Char - '-')))* '-->' *)
+TYPE
+ TPhase = (phName, phDtd, phInternal, phFinishing);
+VAR
+ Phase : TPhase;
+ F : PChar;
+ ExternalID : TExternalID;
+ ExternalDTD : TXmlParser;
+ DER : TDtdElementRec;
+BEGIN
+ DER.Start := CurStart;
+ EntityStack.Clear; // Clear stack for Parameter Entities
+ CurPartType := ptDtdc;
+
+ // --- Don't read DTDc twice
+ IF FDtdcFinal <> NIL THEN BEGIN
+ CurFinal := FDtdcFinal;
+ EXIT;
+ END;
+
+ // --- Scan DTDc
+ CurFinal := CurStart + 9; // First char after '<!DOCTYPE'
+ Phase := phName;
+ REPEAT
+ CASE CurFinal^ OF
+ '%' : BEGIN
+ PushPE (CurFinal);
+ CONTINUE;
+ END;
+ #0 : IF EntityStack.Count = 0 THEN
+ BREAK
+ ELSE BEGIN
+ CurFinal := EntityStack.Pop;
+ CONTINUE;
+ END;
+ '[' : BEGIN
+ Phase := phInternal;
+ AnalyzeDtdElements (CurFinal+1, CurFinal);
+ CONTINUE;
+ END;
+ ']' : Phase := phFinishing;
+ '>' : BREAK;
+ ELSE IF NOT (CurFinal^ IN CWhitespace) THEN BEGIN
+ CASE Phase OF
+ phName : IF (CurFinal^ IN CNameStart) THEN BEGIN
+ ExtractName (CurFinal, CWhitespace + ['[', '>'], F);
+ SetStringSF (FRootName, CurFinal, F);
+ CurFinal := F;
+ Phase := phDtd;
+ END;
+ phDtd : IF (StrLComp (CurFinal, 'SYSTEM', 6) = 0) OR
+ (StrLComp (CurFinal, 'PUBLIC', 6) = 0) THEN BEGIN
+ ExternalID := TExternalID.Create (CurFinal);
+ ExternalDTD := LoadExternalEntity (ExternalId.SystemId, ExternalID.PublicId, '');
+ F := StrPos (ExternalDtd.DocBuffer, '<!');
+ IF F <> NIL THEN
+ AnalyzeDtdElements (F, F);
+ ExternalDTD.Free;
+ CurFinal := ExternalID.Final;
+ ExternalID.Free;
+ END;
+ ELSE BEGIN
+ DER.ElementType := deError;
+ DER.Pos := CurFinal;
+ DER.Final := CurFinal;
+ DtdElementFound (DER);
+ END;
+ END;
+
+ END;
+ END;
+ INC (CurFinal);
+ UNTIL FALSE;
+
+ CurPartType := ptDtdc;
+ CurName := '';
+ CurContent := '';
+
+ // It is an error in the document if "EntityStack" is not empty now
+ IF EntityStack.Count > 0 THEN BEGIN
+ DER.ElementType := deError;
+ DER.Final := CurFinal;
+ DER.Pos := CurFinal;
+ DtdElementFound (DER);
+ END;
+
+ EntityStack.Clear; // Clear stack for General Entities
+ FDtdcFinal := CurFinal;
+END;
+
+
+PROCEDURE TXmlParser.AnalyzeDtdElements (Start : PChar; VAR Final : PChar);
+ // Analyze the "Elements" of a DTD contained in the external or
+ // internal DTD subset.
+VAR
+ DER : TDtdElementRec;
+BEGIN
+ Final := Start;
+ REPEAT
+ CASE Final^ OF
+ '%' : BEGIN
+ PushPE (Final);
+ CONTINUE;
+ END;
+ #0 : IF EntityStack.Count = 0 THEN
+ BREAK
+ ELSE BEGIN
+ CurFinal := EntityStack.Pop;
+ CONTINUE;
+ END;
+ ']',
+ '>' : BREAK;
+ '<' : IF StrLComp (Final, '<!ELEMENT', 9) = 0 THEN AnalyzeElementDecl (Final, Final)
+ ELSE IF StrLComp (Final, '<!ATTLIST', 9) = 0 THEN AnalyzeAttListDecl (Final, Final)
+ ELSE IF StrLComp (Final, '<!ENTITY', 8) = 0 THEN AnalyzeEntityDecl (Final, Final)
+ ELSE IF StrLComp (Final, '<!NOTATION', 10) = 0 THEN AnalyzeNotationDecl (Final, Final)
+ ELSE IF StrLComp (Final, '<?', 2) = 0 THEN BEGIN // PI in DTD
+ DER.ElementType := dePI;
+ DER.Start := Final;
+ AnalyzePI (Final, Final);
+ DER.Target := PChar (CurName);
+ DER.Content := PChar (CurContent);
+ DER.AttrList := CurAttr;
+ DER.Final := Final;
+ DtdElementFound (DER);
+ END
+ ELSE IF StrLComp (Final, '<!--', 4) = 0 THEN BEGIN // Comment in DTD
+ DER.ElementType := deComment;
+ DER.Start := Final;
+ AnalyzeComment (Final, Final);
+ DER.Final := Final;
+ DtdElementFound (DER);
+ END
+ ELSE BEGIN
+ DER.ElementType := deError;
+ DER.Start := Final;
+ DER.Pos := Final;
+ DER.Final := Final;
+ DtdElementFound (DER);
+ END;
+
+ END;
+ INC (Final);
+ UNTIL FALSE;
+END;
+
+
+PROCEDURE TXmlParser.AnalyzeTag;
+ // Analyze Tags
+VAR
+ S, F : PChar;
+ Attr : TAttr;
+ ElemDef : TElemDef;
+ AttrDef : TAttrDef;
+ I : INTEGER;
+BEGIN
+ CurPartType := ptStartTag;
+ S := CurStart+1;
+ IF S^ = '/' THEN BEGIN
+ CurPartType := ptEndTag;
+ INC (S);
+ END;
+ ExtractName (S, CWhitespace + ['/'], F);
+ SetStringSF (CurName, S, F);
+ CurAttr.Analyze (F+1, CurFinal);
+ IF CurFinal^ = '/' THEN BEGIN
+ CurPartType := ptEmptyTag;
+ END;
+ CurFinal := StrScanE (CurFinal, '>');
+
+ // --- Set Default Attribute values for nonexistent attributes
+ IF (CurPartType = ptStartTag) OR (CurPartType = ptEmptyTag) THEN BEGIN
+ ElemDef := Elements.Node (CurName);
+ IF ElemDef <> NIL THEN BEGIN
+ FOR I := 0 TO ElemDef.Count-1 DO BEGIN
+ AttrDef := TAttrDef (ElemDef [I]);
+ Attr := TAttr (CurAttr.Node (AttrDef.Name));
+ IF (Attr = NIL) AND (AttrDef.Value <> '') THEN BEGIN
+ Attr := TAttr.Create (AttrDef.Name, AttrDef.Value);
+ Attr.ValueType := vtDefault;
+ CurAttr.Add (Attr);
+ END;
+ IF Attr <> NIL THEN BEGIN
+ CASE AttrDef.DefaultType OF
+ adDefault : ;
+ adRequired : ; // -!- It is an error in the document if "Attr.Value" is an empty string
+ adImplied : Attr.ValueType := vtImplied;
+ adFixed : BEGIN
+ Attr.ValueType := vtFixed;
+ Attr.Value := AttrDef.Value;
+ END;
+ END;
+ Attr.AttrType := AttrDef.AttrType;
+ END;
+ END;
+ END;
+
+ // --- Normalize Attribute Values. XmlSpec:
+ // - a character reference is processed by appending the referenced character to the attribute value
+ // - an entity reference is processed by recursively processing the replacement text of the entity
+ // - a whitespace character (#x20, #xD, #xA, #x9) is processed by appending #x20 to the normalized value,
+ // except that only a single #x20 is appended for a "#xD#xA" sequence that is part of an external
+ // parsed entity or the literal entity value of an internal parsed entity
+ // - other characters are processed by appending them to the normalized value
+ // If the declared value is not CDATA, then the XML processor must further process the
+ // normalized attribute value by discarding any leading and trailing space (#x20) characters,
+ // and by replacing sequences of space (#x20) characters by a single space (#x20) character.
+ // All attributes for which no declaration has been read should be treated by a
+ // non-validating parser as if declared CDATA.
+ // !!! The XML 1.0 SE specification is somewhat different here
+ // This code does not conform exactly to this specification
+ FOR I := 0 TO CurAttr.Count-1 DO
+ WITH TAttr (CurAttr [I]) DO BEGIN
+ ReplaceGeneralEntities (Value);
+ ReplaceCharacterEntities (Value);
+ IF (AttrType <> atCData) AND (AttrType <> atUnknown)
+ THEN Value := TranslateEncoding (TrimWs (ConvertWs (Value, TRUE)))
+ ELSE Value := TranslateEncoding (ConvertWs (Value, FALSE));
+ END;
+ END;
+END;
+
+
+PROCEDURE TXmlParser.AnalyzeCData;
+ // Analyze CDATA Sections
+BEGIN
+ CurPartType := ptCData;
+ CurFinal := StrPos (CurStart, CDEnd);
+ IF CurFinal = NIL THEN BEGIN
+ CurFinal := StrEnd (CurStart)-1;
+ CurContent := TranslateEncoding (StrPas (CurStart+Length (CDStart)));
+ END
+ ELSE BEGIN
+ SetStringSF (CurContent, CurStart+Length (CDStart), CurFinal-1);
+ INC (CurFinal, Length (CDEnd)-1);
+ CurContent := TranslateEncoding (CurContent);
+ END;
+END;
+
+
+PROCEDURE TXmlParser.AnalyzeText (VAR IsDone : BOOLEAN);
+ (* Analyzes Text Content between Tags. CurFinal will point to the last content character.
+ Content ends at a '<' character or at the end of the document.
+ Entity References and Character Entity references are resolved.
+ If PackSpaces is TRUE, contiguous Whitespace Characters will be compressed to
+ one Space #x20 character, Whitespace at the beginning and end of content will
+ be trimmed off and content which is or becomes empty is not returned to
+ the application (in this case, "IsDone" is set to FALSE which causes the
+ Scan method to proceed directly to the next part. *)
+
+ PROCEDURE ProcessEntity;
+ (* Is called if there is an ampsersand '&' character found in the document.
+ IN "CurFinal" points to the ampersand
+ OUT "CurFinal" points to the first character after the semi-colon ';' *)
+ VAR
+ P : PChar;
+ Name : STRING;
+ EntityDef : TEntityDef;
+ ExternalEntity : TXmlParser;
+ BEGIN
+ P := StrScan (CurFinal , ';');
+ IF P <> NIL THEN BEGIN
+ SetStringSF (Name, CurFinal+1, P-1);
+
+ // Is it a Character Entity?
+ IF (CurFinal+1)^ = '#' THEN BEGIN
+ IF UpCase ((CurFinal+2)^) = 'X' // !!! Can't use "CHR" for Unicode characters > 255:
+ THEN CurContent := CurContent + CHR (StrToIntDef ('$'+Copy (Name, 3, MaxInt), 32))
+ ELSE CurContent := CurContent + CHR (StrToIntDef (Copy (Name, 2, MaxInt), 32));
+ CurFinal := P+1;
+ EXIT;
+ END
+
+ // Is it a Predefined Entity?
+ ELSE IF Name = 'lt' THEN BEGIN CurContent := CurContent + '<'; CurFinal := P+1; EXIT; END
+ ELSE IF Name = 'gt' THEN BEGIN CurContent := CurContent + '>'; CurFinal := P+1; EXIT; END
+ ELSE IF Name = 'amp' THEN BEGIN CurContent := CurContent + '&'; CurFinal := P+1; EXIT; END
+ ELSE IF Name = 'apos' THEN BEGIN CurContent := CurContent + ''''; CurFinal := P+1; EXIT; END
+ ELSE IF Name = 'quot' THEN BEGIN CurContent := CurContent + '"'; CurFinal := P+1; EXIT; END;
+
+ // Replace with Entity from DTD
+ EntityDef := TEntityDef (Entities.Node (Name));
+ IF EntityDef <> NIL THEN BEGIN
+ IF EntityDef.Value <> '' THEN BEGIN
+ EntityStack.Push (P+1);
+ CurFinal := PChar (EntityDef.Value);
+ END
+ ELSE BEGIN
+ ExternalEntity := LoadExternalEntity (EntityDef.SystemId, EntityDef.PublicId, EntityDef.NotationName);
+ EntityStack.Push (ExternalEntity, P+1);
+ CurFinal := ExternalEntity.DocBuffer;
+ END;
+ END
+ ELSE BEGIN
+ CurContent := CurContent + Name;
+ CurFinal := P+1;
+ END;
+ END
+ ELSE BEGIN
+ INC (CurFinal);
+ END;
+ END;
+
+VAR
+ C : INTEGER;
+BEGIN
+ CurFinal := CurStart;
+ CurPartType := ptContent;
+ CurContent := '';
+ C := 0;
+ REPEAT
+ CASE CurFinal^ OF
+ '&' : BEGIN
+ CurContent := CurContent + TranslateEncoding (StrLPas (CurFinal-C, C));
+ C := 0;
+ ProcessEntity;
+ CONTINUE;
+ END;
+ #0 : BEGIN
+ IF EntityStack.Count = 0 THEN
+ BREAK
+ ELSE BEGIN
+ CurContent := CurContent + TranslateEncoding (StrLPas (CurFinal-C, C));
+ C := 0;
+ CurFinal := EntityStack.Pop;
+ CONTINUE;
+ END;
+ END;
+ '<' : BREAK;
+ ELSE INC (C);
+ END;
+ INC (CurFinal);
+ UNTIL FALSE;
+ CurContent := CurContent + TranslateEncoding (StrLPas (CurFinal-C, C));
+ DEC (CurFinal);
+
+ IF FNormalize THEN BEGIN
+ CurContent := ConvertWs (TrimWs (CurContent), TRUE);
+ IsDone := CurContent <> ''; // IsDone will only get FALSE if PackSpaces is TRUE
+ END;
+END;
+
+
+PROCEDURE TXmlParser.AnalyzeElementDecl (Start : PChar; VAR Final : PChar);
+ (* Parse <!ELEMENT declaration starting at "Start"
+ Final must point to the terminating '>' character
+ XmlSpec 3.2:
+ elementdecl ::= '<!ELEMENT' S Name S contentspec S? '>'
+ contentspec ::= 'EMPTY' | 'ANY' | Mixed | children
+ Mixed ::= '(' S? '#PCDATA' (S? '|' S? Name)* S? ')*' |
+ '(' S? '#PCDATA' S? ')'
+ children ::= (choice | seq) ('?' | '*' | '+')?
+ choice ::= '(' S? cp ( S? '|' S? cp )* S? ')'
+ cp ::= (Name | choice | seq) ('?' | '*' | '+')?
+ seq ::= '(' S? cp ( S? ',' S? cp )* S? ')'
+
+ More simply:
+ contentspec ::= EMPTY
+ ANY
+ '(#PCDATA)'
+ '(#PCDATA | A | B)*'
+ '(A, B, C)'
+ '(A | B | C)'
+ '(A?, B*, C+),
+ '(A, (B | C | D)* )' *)
+VAR
+ Element : TElemDef;
+ Elem2 : TElemDef;
+ F : PChar;
+ DER : TDtdElementRec;
+BEGIN
+ Element := TElemDef.Create;
+ Final := Start + 9;
+ DER.Start := Start;
+ REPEAT
+ IF Final^ = '>' THEN BREAK;
+ IF (Final^ IN CNameStart) AND (Element.Name = '') THEN BEGIN
+ ExtractName (Final, CWhitespace, F);
+ SetStringSF (Element.Name, Final, F);
+ Final := F;
+ F := StrScan (Final+1, '>');
+ IF F = NIL THEN BEGIN
+ Element.Definition := STRING (Final);
+ Final := StrEnd (Final);
+ BREAK;
+ END
+ ELSE BEGIN
+ SetStringSF (Element.Definition, Final+1, F-1);
+ Final := F;
+ BREAK;
+ END;
+ END;
+ INC (Final);
+ UNTIL FALSE;
+ Element.Definition := DelChars (Element.Definition, CWhitespace);
+ ReplaceParameterEntities (Element.Definition);
+ IF Element.Definition = 'EMPTY' THEN Element.ElemType := etEmpty
+ ELSE IF Element.Definition = 'ANY' THEN Element.ElemType := etAny
+ ELSE IF Copy (Element.Definition, 1, 8) = '(#PCDATA' THEN Element.ElemType := etMixed
+ ELSE IF Copy (Element.Definition, 1, 1) = '(' THEN Element.ElemType := etChildren
+ ELSE Element.ElemType := etAny;
+
+ Elem2 := Elements.Node (Element.Name);
+ IF Elem2 <> NIL THEN
+ Elements.Delete (Elements.IndexOf (Elem2));
+ Elements.Add (Element);
+ Final := StrScanE (Final, '>');
+ DER.ElementType := deElement;
+ DER.ElemDef := Element;
+ DER.Final := Final;
+ DtdElementFound (DER);
+END;
+
+
+PROCEDURE TXmlParser.AnalyzeAttListDecl (Start : PChar; VAR Final : PChar);
+ (* Parse <!ATTLIST declaration starting at "Start"
+ Final must point to the terminating '>' character
+ XmlSpec 3.3:
+ AttlistDecl ::= '<!ATTLIST' S Name AttDef* S? '>'
+ AttDef ::= S Name S AttType S DefaultDecl
+ AttType ::= StringType | TokenizedType | EnumeratedType
+ StringType ::= 'CDATA'
+ TokenizedType ::= 'ID' | 'IDREF' | 'IDREFS' | 'ENTITY' | 'ENTITIES' | 'NMTOKEN' | 'NMTOKENS'
+ EnumeratedType ::= NotationType | Enumeration
+ NotationType ::= 'NOTATION' S '(' S? Name (S? '|' S? Name)* S? ')'
+ Enumeration ::= '(' S? Nmtoken (S? '|' S? Nmtoken)* S? ')'
+ DefaultDecl ::= '#REQUIRED' | '#IMPLIED' | (('#FIXED' S)? AttValue)
+ AttValue ::= '"' ([^<&"] | Reference)* '"' | "'" ([^<&'] | Reference)* "'"
+ Examples:
+ <!ATTLIST address
+ A1 CDATA "Default"
+ A2 ID #REQUIRED
+ A3 IDREF #IMPLIED
+ A4 IDREFS #IMPLIED
+ A5 ENTITY #FIXED "&at;&#252;"
+ A6 ENTITIES #REQUIRED
+ A7 NOTATION (WMF | DXF) "WMF"
+ A8 (A | B | C) #REQUIRED> *)
+TYPE
+ TPhase = (phElementName, phName, phType, phNotationContent, phDefault);
+VAR
+ Phase : TPhase;
+ F : PChar;
+ ElementName : STRING;
+ ElemDef : TElemDef;
+ AttrDef : TAttrDef;
+ AttrDef2 : TAttrDef;
+ Strg : STRING;
+ DER : TDtdElementRec;
+BEGIN
+ Final := Start + 9; // The character after <!ATTLIST
+ Phase := phElementName;
+ DER.Start := Start;
+ AttrDef := NIL;
+ ElemDef := NIL;
+ REPEAT
+ IF NOT (Final^ IN CWhitespace) THEN
+ CASE Final^ OF
+ '%' : BEGIN
+ PushPE (Final);
+ CONTINUE;
+ END;
+ #0 : IF EntityStack.Count = 0 THEN
+ BREAK
+ ELSE BEGIN
+ Final := EntityStack.Pop;
+ CONTINUE;
+ END;
+ '>' : BREAK;
+ ELSE CASE Phase OF
+ phElementName : BEGIN
+ ExtractName (Final, CWhitespace + CQuoteChar + ['#'], F);
+ SetStringSF (ElementName, Final, F);
+ Final := F;
+ ElemDef := Elements.Node (ElementName);
+ IF ElemDef = NIL THEN BEGIN
+ ElemDef := TElemDef.Create;
+ ElemDef.Name := ElementName;
+ ElemDef.Definition := 'ANY';
+ ElemDef.ElemType := etAny;
+ Elements.Add (ElemDef);
+ END;
+ Phase := phName;
+ END;
+ phName : BEGIN
+ AttrDef := TAttrDef.Create;
+ ExtractName (Final, CWhitespace + CQuoteChar + ['#'], F);
+ SetStringSF (AttrDef.Name, Final, F);
+ Final := F;
+ AttrDef2 := TAttrDef (ElemDef.Node (AttrDef.Name));
+ IF AttrDef2 <> NIL THEN
+ ElemDef.Delete (ElemDef.IndexOf (AttrDef2));
+ ElemDef.Add (AttrDef);
+ Phase := phType;
+ END;
+ phType : BEGIN
+ IF Final^ = '(' THEN BEGIN
+ F := StrScan (Final+1, ')');
+ IF F <> NIL
+ THEN SetStringSF (AttrDef.TypeDef, Final+1, F-1)
+ ELSE AttrDef.TypeDef := STRING (Final+1);
+ AttrDef.TypeDef := DelChars (AttrDef.TypeDef, CWhitespace);
+ AttrDef.AttrType := atEnumeration;
+ ReplaceParameterEntities (AttrDef.TypeDef);
+ ReplaceCharacterEntities (AttrDef.TypeDef);
+ Phase := phDefault;
+ END
+ ELSE IF StrLComp (Final, 'NOTATION', 8) = 0 THEN BEGIN
+ INC (Final, 8);
+ AttrDef.AttrType := atNotation;
+ Phase := phNotationContent;
+ END
+ ELSE BEGIN
+ ExtractName (Final, CWhitespace+CQuoteChar+['#'], F);
+ SetStringSF (AttrDef.TypeDef, Final, F);
+ IF AttrDef.TypeDef = 'CDATA' THEN AttrDef.AttrType := atCData
+ ELSE IF AttrDef.TypeDef = 'ID' THEN AttrDef.AttrType := atId
+ ELSE IF AttrDef.TypeDef = 'IDREF' THEN AttrDef.AttrType := atIdRef
+ ELSE IF AttrDef.TypeDef = 'IDREFS' THEN AttrDef.AttrType := atIdRefs
+ ELSE IF AttrDef.TypeDef = 'ENTITY' THEN AttrDef.AttrType := atEntity
+ ELSE IF AttrDef.TypeDef = 'ENTITIES' THEN AttrDef.AttrType := atEntities
+ ELSE IF AttrDef.TypeDef = 'NMTOKEN' THEN AttrDef.AttrType := atNmToken
+ ELSE IF AttrDef.TypeDef = 'NMTOKENS' THEN AttrDef.AttrType := atNmTokens;
+ Phase := phDefault;
+ END
+ END;
+ phNotationContent : BEGIN
+ F := StrScan (Final, ')');
+ IF F <> NIL THEN
+ SetStringSF (AttrDef.Notations, Final+1, F-1)
+ ELSE BEGIN
+ AttrDef.Notations := STRING (Final+1);
+ Final := StrEnd (Final);
+ END;
+ ReplaceParameterEntities (AttrDef.Notations);
+ AttrDef.Notations := DelChars (AttrDef.Notations, CWhitespace);
+ Phase := phDefault;
+ END;
+ phDefault : BEGIN
+ IF Final^ = '#' THEN BEGIN
+ ExtractName (Final, CWhiteSpace + CQuoteChar, F);
+ SetStringSF (Strg, Final, F);
+ Final := F;
+ ReplaceParameterEntities (Strg);
+ IF Strg = '#REQUIRED' THEN BEGIN AttrDef.DefaultType := adRequired; Phase := phName; END
+ ELSE IF Strg = '#IMPLIED' THEN BEGIN AttrDef.DefaultType := adImplied; Phase := phName; END
+ ELSE IF Strg = '#FIXED' THEN AttrDef.DefaultType := adFixed;
+ END
+ ELSE IF (Final^ IN CQuoteChar) THEN BEGIN
+ ExtractQuote (Final, AttrDef.Value, Final);
+ ReplaceParameterEntities (AttrDef.Value);
+ ReplaceCharacterEntities (AttrDef.Value);
+ Phase := phName;
+ END;
+ IF Phase = phName THEN BEGIN
+ AttrDef := NIL;
+ END;
+ END;
+
+ END;
+ END;
+ INC (Final);
+ UNTIL FALSE;
+
+ Final := StrScan (Final, '>');
+
+ DER.ElementType := deAttList;
+ DER.ElemDef := ElemDef;
+ DER.Final := Final;
+ DtdElementFound (DER);
+END;
+
+
+PROCEDURE TXmlParser.AnalyzeEntityDecl (Start : PChar; VAR Final : PChar);
+ (* Parse <!ENTITY declaration starting at "Start"
+ Final must point to the terminating '>' character
+ XmlSpec 4.2:
+ EntityDecl ::= '<!ENTITY' S Name S EntityDef S? '>' |
+ '<!ENTITY' S '%' S Name S PEDef S? '>'
+ EntityDef ::= EntityValue | (ExternalID NDataDecl?)
+ PEDef ::= EntityValue | ExternalID
+ NDataDecl ::= S 'NDATA' S Name
+ EntityValue ::= '"' ([^%&"] | PEReference | EntityRef | CharRef)* '"' |
+ "'" ([^%&'] | PEReference | EntityRef | CharRef)* "'"
+ PEReference ::= '%' Name ';'
+
+ Examples
+ <!ENTITY test1 "Stefan Heymann"> <!-- Internal, general, parsed -->
+ <!ENTITY test2 SYSTEM "ent2.xml"> <!-- External, general, parsed -->
+ <!ENTITY test2 SYSTEM "ent3.gif" NDATA gif> <!-- External, general, unparsed -->
+ <!ENTITY % test3 "<!ELEMENT q ANY>"> <!-- Internal, parameter -->
+ <!ENTITY % test6 SYSTEM "ent6.xml"> <!-- External, parameter -->
+ <!ENTITY test4 "&test1; ist lieb"> <!-- IGP, Replacement text <> literal value -->
+ <!ENTITY test5 "<p>Dies ist ein Test-Absatz</p>"> <!-- IGP, See XmlSpec 2.4 -->
+ *)
+TYPE
+ TPhase = (phName, phContent, phNData, phNotationName, phFinalGT);
+VAR
+ Phase : TPhase;
+ IsParamEntity : BOOLEAN;
+ F : PChar;
+ ExternalID : TExternalID;
+ EntityDef : TEntityDef;
+ EntityDef2 : TEntityDef;
+ DER : TDtdElementRec;
+BEGIN
+ Final := Start + 8; // First char after <!ENTITY
+ DER.Start := Start;
+ Phase := phName;
+ IsParamEntity := FALSE;
+ EntityDef := TEntityDef.Create;
+ REPEAT
+ IF NOT (Final^ IN CWhitespace) THEN
+ CASE Final^ OF
+ '%' : IsParamEntity := TRUE;
+ '>' : BREAK;
+ ELSE CASE Phase OF
+ phName : IF Final^ IN CNameStart THEN BEGIN
+ ExtractName (Final, CWhitespace + CQuoteChar, F);
+ SetStringSF (EntityDef.Name, Final, F);
+ Final := F;
+ Phase := phContent;
+ END;
+ phContent : IF Final^ IN CQuoteChar THEN BEGIN
+ ExtractQuote (Final, EntityDef.Value, Final);
+ Phase := phFinalGT;
+ END
+ ELSE IF (StrLComp (Final, 'SYSTEM', 6) = 0) OR
+ (StrLComp (Final, 'PUBLIC', 6) = 0) THEN BEGIN
+ ExternalID := TExternalID.Create (Final);
+ EntityDef.SystemId := ExternalID.SystemId;
+ EntityDef.PublicId := ExternalID.PublicId;
+ Final := ExternalID.Final;
+ Phase := phNData;
+ ExternalID.Free;
+ END;
+ phNData : IF StrLComp (Final, 'NDATA', 5) = 0 THEN BEGIN
+ INC (Final, 4);
+ Phase := phNotationName;
+ END;
+ phNotationName : IF Final^ IN CNameStart THEN BEGIN
+ ExtractName (Final, CWhitespace + ['>'], F);
+ SetStringSF (EntityDef.NotationName, Final, F);
+ Final := F;
+ Phase := phFinalGT;
+ END;
+ phFinalGT : ; // -!- There is an error in the document if this branch is called
+ END;
+ END;
+ INC (Final);
+ UNTIL FALSE;
+ IF IsParamEntity THEN BEGIN
+ EntityDef2 := TEntityDef (ParEntities.Node (EntityDef.Name));
+ IF EntityDef2 <> NIL THEN
+ ParEntities.Delete (ParEntities.IndexOf (EntityDef2));
+ ParEntities.Add (EntityDef);
+ ReplaceCharacterEntities (EntityDef.Value);
+ END
+ ELSE BEGIN
+ EntityDef2 := TEntityDef (Entities.Node (EntityDef.Name));
+ IF EntityDef2 <> NIL THEN
+ Entities.Delete (Entities.IndexOf (EntityDef2));
+ Entities.Add (EntityDef);
+ ReplaceParameterEntities (EntityDef.Value); // Create replacement texts (see XmlSpec 4.5)
+ ReplaceCharacterEntities (EntityDef.Value);
+ END;
+ Final := StrScanE (Final, '>');
+
+ DER.ElementType := deEntity;
+ DER.EntityDef := EntityDef;
+ DER.Final := Final;
+ DtdElementFound (DER);
+END;
+
+
+PROCEDURE TXmlParser.AnalyzeNotationDecl (Start : PChar; VAR Final : PChar);
+ // Parse <!NOTATION declaration starting at "Start"
+ // Final must point to the terminating '>' character
+ // XmlSpec 4.7: NotationDecl ::= '<!NOTATION' S Name S (ExternalID | PublicID) S? '>'
+TYPE
+ TPhase = (phName, phExtId, phEnd);
+VAR
+ ExternalID : TExternalID;
+ Phase : TPhase;
+ F : PChar;
+ NotationDef : TNotationDef;
+ DER : TDtdElementRec;
+BEGIN
+ Final := Start + 10; // Character after <!NOTATION
+ DER.Start := Start;
+ Phase := phName;
+ NotationDef := TNotationDef.Create;
+ REPEAT
+ IF NOT (Final^ IN CWhitespace) THEN
+ CASE Final^ OF
+ '>',
+ #0 : BREAK;
+ ELSE CASE Phase OF
+ phName : BEGIN
+ ExtractName (Final, CWhitespace + ['>'], F);
+ SetStringSF (NotationDef.Name, Final, F);
+ Final := F;
+ Phase := phExtId;
+ END;
+ phExtId : BEGIN
+ ExternalID := TExternalID.Create (Final);
+ NotationDef.Value := ExternalID.SystemId;
+ NotationDef.PublicId := ExternalID.PublicId;
+ Final := ExternalId.Final;
+ ExternalId.Free;
+ Phase := phEnd;
+ END;
+ phEnd : ; // -!- There is an error in the document if this branch is called
+ END;
+ END;
+ INC (Final);
+ UNTIL FALSE;
+ Notations.Add (NotationDef);
+ Final := StrScanE (Final, '>');
+
+ DER.ElementType := deNotation;
+ DER.NotationDef := NotationDef;
+ DER.Final := Final;
+ DtdElementFound (DER);
+END;
+
+
+PROCEDURE TXmlParser.PushPE (VAR Start : PChar);
+ (* If there is a parameter entity reference found in the data stream,
+ the current position will be pushed to the entity stack.
+ Start: IN Pointer to the '%' character starting the PE reference
+ OUT Pointer to first character of PE replacement text *)
+VAR
+ P : PChar;
+ EntityDef : TEntityDef;
+BEGIN
+ P := StrScan (Start, ';');
+ IF P <> NIL THEN BEGIN
+ EntityDef := TEntityDef (ParEntities.Node (StrSFPas (Start+1, P-1)));
+ IF EntityDef <> NIL THEN BEGIN
+ EntityStack.Push (P+1);
+ Start := PChar (EntityDef.Value);
+ END
+ ELSE
+ Start := P+1;
+ END;
+END;
+
+
+PROCEDURE TXmlParser.ReplaceCharacterEntities (VAR Str : STRING);
+ // Replaces all Character Entity References in the String
+VAR
+ Start : INTEGER;
+ PAmp : PChar;
+ PSemi : PChar;
+ PosAmp : INTEGER;
+ Len : INTEGER; // Length of Entity Reference
+BEGIN
+ IF Str = '' THEN EXIT;
+ Start := 1;
+ REPEAT
+ PAmp := StrPos (PChar (Str) + Start-1, '&#');
+ IF PAmp = NIL THEN BREAK;
+ PSemi := StrScan (PAmp+2, ';');
+ IF PSemi = NIL THEN BREAK;
+ PosAmp := PAmp - PChar (Str) + 1;
+ Len := PSemi-PAmp+1;
+ IF CompareText (Str [PosAmp+2], 'x') = 0 // !!! Can't use "CHR" for Unicode characters > 255
+ THEN Str [PosAmp] := CHR (StrToIntDef ('$'+Copy (Str, PosAmp+3, Len-4), 0))
+ ELSE Str [PosAmp] := CHR (StrToIntDef (Copy (Str, PosAmp+2, Len-3), 32));
+ Delete (Str, PosAmp+1, Len-1);
+ Start := PosAmp + 1;
+ UNTIL FALSE;
+END;
+
+
+PROCEDURE TXmlParser.ReplaceParameterEntities (VAR Str : STRING);
+ // Recursively replaces all Parameter Entity References in the String
+ PROCEDURE ReplaceEntities (VAR Str : STRING);
+ VAR
+ Start : INTEGER;
+ PAmp : PChar;
+ PSemi : PChar;
+ PosAmp : INTEGER;
+ Len : INTEGER;
+ Entity : TEntityDef;
+ Repl : STRING; // Replacement
+ BEGIN
+ IF Str = '' THEN EXIT;
+ Start := 1;
+ REPEAT
+ PAmp := StrPos (PChar (Str)+Start-1, '%');
+ IF PAmp = NIL THEN BREAK;
+ PSemi := StrScan (PAmp+2, ';');
+ IF PSemi = NIL THEN BREAK;
+ PosAmp := PAmp - PChar (Str) + 1;
+ Len := PSemi-PAmp+1;
+ Entity := TEntityDef (ParEntities.Node (Copy (Str, PosAmp+1, Len-2)));
+ IF Entity <> NIL THEN BEGIN
+ Repl := Entity.Value;
+ ReplaceEntities (Repl); // Recursion
+ END
+ ELSE
+ Repl := Copy (Str, PosAmp, Len);
+ Delete (Str, PosAmp, Len);
+ Insert (Repl, Str, PosAmp);
+ Start := PosAmp + Length (Repl);
+ UNTIL FALSE;
+ END;
+BEGIN
+ ReplaceEntities (Str);
+END;
+
+
+PROCEDURE TXmlParser.ReplaceGeneralEntities (VAR Str : STRING);
+ // Recursively replaces General Entity References in the String
+ PROCEDURE ReplaceEntities (VAR Str : STRING);
+ VAR
+ Start : INTEGER;
+ PAmp : PChar;
+ PSemi : PChar;
+ PosAmp : INTEGER;
+ Len : INTEGER;
+ EntityDef : TEntityDef;
+ EntName : STRING;
+ Repl : STRING; // Replacement
+ ExternalEntity : TXmlParser;
+ BEGIN
+ IF Str = '' THEN EXIT;
+ Start := 1;
+ REPEAT
+ PAmp := StrPos (PChar (Str)+Start-1, '&');
+ IF PAmp = NIL THEN BREAK;
+ PSemi := StrScan (PAmp+2, ';');
+ IF PSemi = NIL THEN BREAK;
+ PosAmp := PAmp - PChar (Str) + 1;
+ Len := PSemi-PAmp+1;
+ EntName := Copy (Str, PosAmp+1, Len-2);
+ IF EntName = 'lt' THEN Repl := '<'
+ ELSE IF EntName = 'gt' THEN Repl := '>'
+ ELSE IF EntName = 'amp' THEN Repl := '&'
+ ELSE IF EntName = 'apos' THEN Repl := ''''
+ ELSE IF EntName = 'quot' THEN Repl := '"'
+ ELSE BEGIN
+ EntityDef := TEntityDef (Entities.Node (EntName));
+ IF EntityDef <> NIL THEN BEGIN
+ IF EntityDef.Value <> '' THEN // Internal Entity
+ Repl := EntityDef.Value
+ ELSE BEGIN // External Entity
+ ExternalEntity := LoadExternalEntity (EntityDef.SystemId, EntityDef.PublicId, EntityDef.NotationName);
+ Repl := StrPas (ExternalEntity.DocBuffer); // !!! What if it contains a Text Declaration?
+ ExternalEntity.Free;
+ END;
+ ReplaceEntities (Repl); // Recursion
+ END
+ ELSE
+ Repl := Copy (Str, PosAmp, Len);
+ END;
+ Delete (Str, PosAmp, Len);
+ Insert (Repl, Str, PosAmp);
+ Start := PosAmp + Length (Repl);
+ UNTIL FALSE;
+ END;
+BEGIN
+ ReplaceEntities (Str);
+END;
+
+
+FUNCTION TXmlParser.LoadExternalEntity (SystemId, PublicId, Notation : STRING) : TXmlParser;
+ // This will be called whenever there is a Parsed External Entity or
+ // the DTD External Subset to be parsed.
+ // It has to create a TXmlParser instance and load the desired Entity.
+ // This instance of LoadExternalEntity assumes that "SystemId" is a valid
+ // file name (relative to the Document source) and loads this file using
+ // the LoadFromFile method.
+VAR
+ Filename : STRING;
+BEGIN
+ // --- Convert System ID to complete filename
+ Filename := StringReplace (SystemId, '/', '\', [rfReplaceAll]);
+ IF Copy (FSource, 1, 1) <> '<' THEN
+ IF (Copy (Filename, 1, 2) = '\\') OR (Copy (Filename, 2, 1) = ':') THEN
+ // Already has an absolute Path
+ ELSE BEGIN
+ Filename := ExtractFilePath (FSource) + Filename;
+ END;
+
+ // --- Load the File
+ Result := TXmlParser.Create;
+ Result.LoadFromFile (Filename);
+END;
+
+
+FUNCTION TXmlParser.TranslateEncoding (CONST Source : STRING) : STRING;
+ // The member variable "CurEncoding" always holds the name of the current
+ // encoding, e.g. 'UTF-8' or 'ISO-8859-1'.
+ // This virtual method "TranslateEncoding" is responsible for translating
+ // the content passed in the "Source" parameter to the Encoding which
+ // is expected by the application.
+ // This instance of "TranlateEncoding" assumes that the Application expects
+ // Windows ANSI (Win1252) strings. It is able to transform UTF-8 or ISO-8859-1
+ // encodings.
+ // If you want your application to understand or create other encodings, you
+ // override this function.
+BEGIN
+ IF CurEncoding = 'UTF-8'
+ THEN Result := Utf8ToAnsi (Source)
+ ELSE Result := Source;
+END;
+
+
+PROCEDURE TXmlParser.DtdElementFound (DtdElementRec : TDtdElementRec);
+ // This method is called for every element which is found in the DTD
+ // declaration. The variant record TDtdElementRec is passed which
+ // holds informations about the element.
+ // You can override this function to handle DTD declarations.
+ // Note that when you parse the same Document instance a second time,
+ // the DTD will not get parsed again.
+BEGIN
+END;
+
+
+FUNCTION TXmlParser.GetDocBuffer: PChar;
+ // Returns FBuffer or a pointer to a NUL char if Buffer is empty
+BEGIN
+ IF FBuffer = NIL
+ THEN Result := #0
+ ELSE Result := FBuffer;
+END;
+
+
+(*$IFNDEF HAS_CONTNRS_UNIT
+===============================================================================================
+TObjectList
+===============================================================================================
+*)
+
+DESTRUCTOR TObjectList.Destroy;
+BEGIN
+ Clear;
+ SetCapacity(0);
+ INHERITED Destroy;
+END;
+
+
+PROCEDURE TObjectList.Delete (Index : INTEGER);
+BEGIN
+ IF (Index < 0) OR (Index >= Count) THEN EXIT;
+ TObject (Items [Index]).Free;
+ INHERITED Delete (Index);
+END;
+
+
+PROCEDURE TObjectList.Clear;
+BEGIN
+ WHILE Count > 0 DO
+ Delete (Count-1);
+END;
+
+(*$ENDIF *)
+
+(*
+===============================================================================================
+TNvpNode
+--------
+Node base class for the TNvpList
+===============================================================================================
+*)
+
+CONSTRUCTOR TNvpNode.Create (TheName, TheValue : STRING);
+BEGIN
+ INHERITED Create;
+ Name := TheName;
+ Value := TheValue;
+END;
+
+
+(*
+===============================================================================================
+TNvpList
+--------
+A generic List of Name-Value Pairs, based on the TObjectList introduced in Delphi 5
+===============================================================================================
+*)
+
+PROCEDURE TNvpList.Add (Node : TNvpNode);
+VAR
+ I : INTEGER;
+BEGIN
+ FOR I := Count-1 DOWNTO 0 DO
+ IF Node.Name > TNvpNode (Items [I]).Name THEN BEGIN
+ Insert (I+1, Node);
+ EXIT;
+ END;
+ Insert (0, Node);
+END;
+
+
+
+FUNCTION TNvpList.Node (Name : STRING) : TNvpNode;
+ // Binary search for Node
+VAR
+ L, H : INTEGER; // Low, High Limit
+ T, C : INTEGER; // Test Index, Comparison result
+ Last : INTEGER; // Last Test Index
+BEGIN
+ IF Count=0 THEN BEGIN
+ Result := NIL;
+ EXIT;
+ END;
+
+ L := 0;
+ H := Count;
+ Last := -1;
+ REPEAT
+ T := (L+H) DIV 2;
+ IF T=Last THEN BREAK;
+ Result := TNvpNode (Items [T]);
+ C := CompareStr (Result.Name, Name);
+ IF C = 0 THEN EXIT
+ ELSE IF C < 0 THEN L := T
+ ELSE H := T;
+ Last := T;
+ UNTIL FALSE;
+ Result := NIL;
+END;
+
+
+FUNCTION TNvpList.Node (Index : INTEGER) : TNvpNode;
+BEGIN
+ IF (Index < 0) OR (Index >= Count)
+ THEN Result := NIL
+ ELSE Result := TNvpNode (Items [Index]);
+END;
+
+
+FUNCTION TNvpList.Value (Name : STRING) : STRING;
+VAR
+ Nvp : TNvpNode;
+BEGIN
+ Nvp := TNvpNode (Node (Name));
+ IF Nvp <> NIL
+ THEN Result := Nvp.Value
+ ELSE Result := '';
+END;
+
+
+FUNCTION TNvpList.Value (Index : INTEGER) : STRING;
+BEGIN
+ IF (Index < 0) OR (Index >= Count)
+ THEN Result := ''
+ ELSE Result := TNvpNode (Items [Index]).Value;
+END;
+
+
+FUNCTION TNvpList.Name (Index : INTEGER) : STRING;
+BEGIN
+ IF (Index < 0) OR (Index >= Count)
+ THEN Result := ''
+ ELSE Result := TNvpNode (Items [Index]).Name;
+END;
+
+
+(*
+===============================================================================================
+TAttrList
+List of Attributes. The "Analyze" method extracts the Attributes from the given Buffer.
+Is used for extraction of Attributes in Start-Tags, Empty-Element Tags and the "pseudo"
+attributes in XML Prologs, Text Declarations and PIs.
+===============================================================================================
+*)
+
+PROCEDURE TAttrList.Analyze (Start : PChar; VAR Final : PChar);
+ // Analyze the Buffer for Attribute=Name pairs.
+ // Terminates when there is a character which is not IN CNameStart
+ // (e.g. '?>' or '>' or '/>')
+TYPE
+ TPhase = (phName, phEq, phValue);
+VAR
+ Phase : TPhase;
+ F : PChar;
+ Name : STRING;
+ Value : STRING;
+ Attr : TAttr;
+BEGIN
+ Clear;
+ Phase := phName;
+ Final := Start;
+ REPEAT
+ IF (Final^ = #0) OR (Final^ = '>') THEN BREAK;
+ IF NOT (Final^ IN CWhitespace) THEN
+ CASE Phase OF
+ phName : BEGIN
+ IF NOT (Final^ IN CNameStart) THEN EXIT;
+ ExtractName (Final, CWhitespace + ['=', '/'], F);
+ SetStringSF (Name, Final, F);
+ Final := F;
+ Phase := phEq;
+ END;
+ phEq : BEGIN
+ IF Final^ = '=' THEN
+ Phase := phValue
+ END;
+ phValue : BEGIN
+ IF Final^ IN CQuoteChar THEN BEGIN
+ ExtractQuote (Final, Value, F);
+ Attr := TAttr.Create;
+ Attr.Name := Name;
+ Attr.Value := Value;
+ Attr.ValueType := vtNormal;
+ Add (Attr);
+ Final := F;
+ Phase := phName;
+ END;
+ END;
+ END;
+ INC (Final);
+ UNTIL FALSE;
+END;
+
+
+(*
+===============================================================================================
+TElemList
+List of TElemDef nodes.
+===============================================================================================
+*)
+
+FUNCTION TElemList.Node (Name : STRING) : TElemDef;
+ // Binary search for the Node with the given Name
+VAR
+ L, H : INTEGER; // Low, High Limit
+ T, C : INTEGER; // Test Index, Comparison result
+ Last : INTEGER; // Last Test Index
+BEGIN
+ IF Count=0 THEN BEGIN
+ Result := NIL;
+ EXIT;
+ END;
+
+ L := 0;
+ H := Count;
+ Last := -1;
+ REPEAT
+ T := (L+H) DIV 2;
+ IF T=Last THEN BREAK;
+ Result := TElemDef (Items [T]);
+ C := CompareStr (Result.Name, Name);
+ IF C = 0 THEN EXIT
+ ELSE IF C < 0 THEN L := T
+ ELSE H := T;
+ Last := T;
+ UNTIL FALSE;
+ Result := NIL;
+END;
+
+
+PROCEDURE TElemList.Add (Node : TElemDef);
+VAR
+ I : INTEGER;
+BEGIN
+ FOR I := Count-1 DOWNTO 0 DO
+ IF Node.Name > TElemDef (Items [I]).Name THEN BEGIN
+ Insert (I+1, Node);
+ EXIT;
+ END;
+ Insert (0, Node);
+END;
+
+
+(*
+===============================================================================================
+TScannerXmlParser
+A TXmlParser descendant for the TCustomXmlScanner component
+===============================================================================================
+*)
+
+TYPE
+ TScannerXmlParser = CLASS (TXmlParser)
+ Scanner : TCustomXmlScanner;
+ CONSTRUCTOR Create (TheScanner : TCustomXmlScanner);
+ FUNCTION LoadExternalEntity (SystemId, PublicId,
+ Notation : STRING) : TXmlParser; OVERRIDE;
+ FUNCTION TranslateEncoding (CONST Source : STRING) : STRING; OVERRIDE;
+ PROCEDURE DtdElementFound (DtdElementRec : TDtdElementRec); OVERRIDE;
+ END;
+
+CONSTRUCTOR TScannerXmlParser.Create (TheScanner : TCustomXmlScanner);
+BEGIN
+ INHERITED Create;
+ Scanner := TheScanner;
+END;
+
+
+FUNCTION TScannerXmlParser.LoadExternalEntity (SystemId, PublicId, Notation : STRING) : TXmlParser;
+BEGIN
+ IF Assigned (Scanner.FOnLoadExternal)
+ THEN Scanner.FOnLoadExternal (Scanner, SystemId, PublicId, Notation, Result)
+ ELSE Result := INHERITED LoadExternalEntity (SystemId, PublicId, Notation);
+END;
+
+
+FUNCTION TScannerXmlParser.TranslateEncoding (CONST Source : STRING) : STRING;
+BEGIN
+ IF Assigned (Scanner.FOnTranslateEncoding)
+ THEN Result := Scanner.FOnTranslateEncoding (Scanner, CurEncoding, Source)
+ ELSE Result := INHERITED TranslateEncoding (Source);
+END;
+
+
+PROCEDURE TScannerXmlParser.DtdElementFound (DtdElementRec : TDtdElementRec);
+BEGIN
+ WITH DtdElementRec DO
+ CASE ElementType OF
+ deElement : Scanner.WhenElement (ElemDef);
+ deAttList : Scanner.WhenAttList (ElemDef);
+ deEntity : Scanner.WhenEntity (EntityDef);
+ deNotation : Scanner.WhenNotation (NotationDef);
+ dePI : Scanner.WhenPI (STRING (Target), STRING (Content), AttrList);
+ deComment : Scanner.WhenComment (StrSFPas (Start, Final));
+ deError : Scanner.WhenDtdError (Pos);
+ END;
+END;
+
+
+(*
+===============================================================================================
+TCustomXmlScanner
+===============================================================================================
+*)
+
+CONSTRUCTOR TCustomXmlScanner.Create (AOwner: TComponent);
+BEGIN
+ INHERITED;
+ FXmlParser := TScannerXmlParser.Create (Self);
+END;
+
+
+DESTRUCTOR TCustomXmlScanner.Destroy;
+BEGIN
+ FXmlParser.Free;
+ INHERITED;
+END;
+
+
+PROCEDURE TCustomXmlScanner.LoadFromFile (Filename : TFilename);
+ // Load XML Document from file
+BEGIN
+ FXmlParser.LoadFromFile (Filename);
+END;
+
+
+PROCEDURE TCustomXmlScanner.LoadFromBuffer (Buffer : PChar);
+ // Load XML Document from buffer
+BEGIN
+ FXmlParser.LoadFromBuffer (Buffer);
+END;
+
+
+PROCEDURE TCustomXmlScanner.SetBuffer (Buffer : PChar);
+ // Refer to Buffer
+BEGIN
+ FXmlParser.SetBuffer (Buffer);
+END;
+
+
+FUNCTION TCustomXmlScanner.GetFilename : TFilename;
+BEGIN
+ Result := FXmlParser.Source;
+END;
+
+
+FUNCTION TCustomXmlScanner.GetNormalize : BOOLEAN;
+BEGIN
+ Result := FXmlParser.Normalize;
+END;
+
+
+PROCEDURE TCustomXmlScanner.SetNormalize (Value : BOOLEAN);
+BEGIN
+ FXmlParser.Normalize := Value;
+END;
+
+
+PROCEDURE TCustomXmlScanner.WhenXmlProlog(XmlVersion, Encoding: STRING; Standalone : BOOLEAN);
+ // Is called when the parser has parsed the <? xml ?> declaration of the prolog
+BEGIN
+ IF Assigned (FOnXmlProlog) THEN FOnXmlProlog (Self, XmlVersion, Encoding, Standalone);
+END;
+
+
+PROCEDURE TCustomXmlScanner.WhenComment (Comment : STRING);
+ // Is called when the parser has parsed a <!-- comment -->
+BEGIN
+ IF Assigned (FOnComment) THEN FOnComment (Self, Comment);
+END;
+
+
+PROCEDURE TCustomXmlScanner.WhenPI (Target, Content: STRING; Attributes : TAttrList);
+ // Is called when the parser has parsed a <?processing instruction ?>
+BEGIN
+ IF Assigned (FOnPI) THEN FOnPI (Self, Target, Content, Attributes);
+END;
+
+
+PROCEDURE TCustomXmlScanner.WhenDtdRead (RootElementName : STRING);
+ // Is called when the parser has completely parsed the DTD
+BEGIN
+ IF Assigned (FOnDtdRead) THEN FOnDtdRead (Self, RootElementName);
+END;
+
+
+PROCEDURE TCustomXmlScanner.WhenStartTag (TagName : STRING; Attributes : TAttrList);
+ // Is called when the parser has parsed a start tag like <p>
+BEGIN
+ IF Assigned (FOnStartTag) THEN FOnStartTag (Self, TagName, Attributes);
+END;
+
+
+PROCEDURE TCustomXmlScanner.WhenEmptyTag (TagName : STRING; Attributes : TAttrList);
+ // Is called when the parser has parsed an Empty Element Tag like <br/>
+BEGIN
+ IF Assigned (FOnEmptyTag) THEN FOnEmptyTag (Self, TagName, Attributes);
+END;
+
+
+PROCEDURE TCustomXmlScanner.WhenEndTag (TagName : STRING);
+ // Is called when the parser has parsed an End Tag like </p>
+BEGIN
+ IF Assigned (FOnEndTag) THEN FOnEndTag (Self, TagName);
+END;
+
+
+PROCEDURE TCustomXmlScanner.WhenContent (Content : STRING);
+ // Is called when the parser has parsed an element's text content
+BEGIN
+ IF Assigned (FOnContent) THEN FOnContent (Self, Content);
+END;
+
+
+PROCEDURE TCustomXmlScanner.WhenCData (Content : STRING);
+ // Is called when the parser has parsed a CDATA section
+BEGIN
+ IF Assigned (FOnCData) THEN FOnCData (Self, Content);
+END;
+
+
+PROCEDURE TCustomXmlScanner.WhenElement (ElemDef : TElemDef);
+ // Is called when the parser has parsed an <!ELEMENT> definition
+ // inside the DTD
+BEGIN
+ IF Assigned (FOnElement) THEN FOnElement (Self, ElemDef);
+END;
+
+
+PROCEDURE TCustomXmlScanner.WhenAttList (ElemDef : TElemDef);
+ // Is called when the parser has parsed an <!ATTLIST> definition
+ // inside the DTD
+BEGIN
+ IF Assigned (FOnAttList) THEN FOnAttList (Self, ElemDef);
+END;
+
+
+PROCEDURE TCustomXmlScanner.WhenEntity (EntityDef : TEntityDef);
+ // Is called when the parser has parsed an <!ENTITY> definition
+ // inside the DTD
+BEGIN
+ IF Assigned (FOnEntity) THEN FOnEntity (Self, EntityDef);
+END;
+
+
+PROCEDURE TCustomXmlScanner.WhenNotation (NotationDef : TNotationDef);
+ // Is called when the parser has parsed a <!NOTATION> definition
+ // inside the DTD
+BEGIN
+ IF Assigned (FOnNotation) THEN FOnNotation (Self, NotationDef);
+END;
+
+
+PROCEDURE TCustomXmlScanner.WhenDtdError (ErrorPos : PChar);
+ // Is called when the parser has found an Error in the DTD
+BEGIN
+ IF Assigned (FOnDtdError) THEN FOnDtdError (Self, ErrorPos);
+END;
+
+
+PROCEDURE TCustomXmlScanner.Execute;
+ // Perform scanning
+ // Scanning is done synchronously, i.e. you can expect events to be triggered
+ // in the order of the XML data stream. Execute will finish when the whole XML
+ // document has been scanned or when the StopParser property has been set to TRUE.
+BEGIN
+ FStopParser := FALSE;
+ FXmlParser.StartScan;
+ WHILE FXmlParser.Scan AND (NOT FStopParser) DO
+ CASE FXmlParser.CurPartType OF
+ ptNone : ;
+ ptXmlProlog : WhenXmlProlog (FXmlParser.XmlVersion, FXmlParser.Encoding, FXmlParser.Standalone);
+ ptComment : WhenComment (StrSFPas (FXmlParser.CurStart, FXmlParser.CurFinal));
+ ptPI : WhenPI (FXmlParser.CurName, FXmlParser.CurContent, FXmlParser.CurAttr);
+ ptDtdc : WhenDtdRead (FXmlParser.RootName);
+ ptStartTag : WhenStartTag (FXmlParser.CurName, FXmlParser.CurAttr);
+ ptEmptyTag : WhenEmptyTag (FXmlParser.CurName, FXmlParser.CurAttr);
+ ptEndTag : WhenEndTag (FXmlParser.CurName);
+ ptContent : WhenContent (FXmlParser.CurContent);
+ ptCData : WhenCData (FXmlParser.CurContent);
+ END;
+END;
+
+
+END.
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/logger.pas b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/logger.pas
new file mode 100644
index 00000000..461fa261
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/logger.pas
@@ -0,0 +1,189 @@
+unit logger;
+{
+ $Id: logger.pas,v 1.2 2006/11/26 16:58:04 savage Exp $
+
+}
+{******************************************************************************}
+{ }
+{ Error Logging Unit }
+{ }
+{ The initial developer of this Pascal code was : }
+{ Dominique Louis <Dominique@SavageSoftware.com.au> }
+{ }
+{ Portions created by Dominique Louis are }
+{ Copyright (C) 2000 - 2001 Dominique Louis. }
+{ }
+{ }
+{ }
+{ Contributor(s) }
+{ -------------- }
+{ }
+{ }
+{ Obtained through: }
+{ Joint Endeavour of Delphi Innovators ( Project JEDI ) }
+{ }
+{ You may retrieve the latest version of this file at the Project }
+{ JEDI home page, located at http://delphi-jedi.org }
+{ }
+{ The contents of this file are used with permission, subject to }
+{ the Mozilla Public License Version 1.1 (the "License"); you may }
+{ not use this file except in compliance with the License. You may }
+{ obtain a copy of the License at }
+{ http://www.mozilla.org/MPL/MPL-1.1.html }
+{ }
+{ Software distributed under the License is distributed on an }
+{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
+{ implied. See the License for the specific language governing }
+{ rights and limitations under the License. }
+{ }
+{ Description }
+{ ----------- }
+{ Logging functions... }
+{ }
+{ }
+{ Requires }
+{ -------- }
+{ SDL.dll on Windows platforms }
+{ libSDL-1.1.so.0 on Linux platform }
+{ }
+{ Programming Notes }
+{ ----------------- }
+{ }
+{ }
+{ }
+{ }
+{ Revision History }
+{ ---------------- }
+{ 2001 - DL : Initial creation }
+{ 25/10/2001 - DRE : Added $M+ directive to allow published }
+{ in classes. Added a compile directive }
+{ around fmShareExclusive as this does not }
+{ exist in Free Pascal }
+{ }
+{******************************************************************************}
+{
+ $Log: logger.pas,v $
+ Revision 1.2 2006/11/26 16:58:04 savage
+ Modifed to create separate log files. Therefore each instance running from the same directory will have their own individual log file, prepended with a number.
+
+ Revision 1.1 2004/02/05 00:08:20 savage
+ Module 1.0 release
+
+
+}
+
+{$I jedi-sdl.inc}
+
+{$WEAKPACKAGEUNIT OFF}
+
+interface
+
+uses
+ Classes,
+ SysUtils;
+
+type
+ TLogger = class
+ private
+ FFileHandle : TextFile;
+ FApplicationName : string;
+ FApplicationPath : string;
+ protected
+
+ public
+ constructor Create;
+ destructor Destroy; override;
+ function GetApplicationName: string;
+ function GetApplicationPath: string;
+ procedure LogError( ErrorMessage : string; Location : string );
+ procedure LogWarning( WarningMessage : string; Location : string );
+ procedure LogStatus( StatusMessage : string; Location : string );
+ published
+ property ApplicationName : string read GetApplicationName;
+ property ApplicationPath : string read GetApplicationPath;
+ end;
+
+var
+ Log : TLogger;
+
+implementation
+
+{ TLogger }
+constructor TLogger.Create;
+var
+ FileName : string;
+ FileNo : integer;
+begin
+ FApplicationName := ExtractFileName( ParamStr(0) );
+ FApplicationPath := ExtractFilePath( ParamStr(0) );
+ FileName := FApplicationPath + ChangeFileExt( FApplicationName, '.log' );
+ FileNo := 0;
+ while FileExists( FileName ) do
+ begin
+ inc( FileNo );
+ FileName := FApplicationPath + IntToStr( FileNo ) + ChangeFileExt( FApplicationName, '.log' )
+ end;
+ AssignFile( FFileHandle, FileName );
+ ReWrite( FFileHandle );
+ (*inherited Create( FApplicationPath + ChangeFileExt( FApplicationName, '.log' ),
+ fmCreate {$IFNDEF FPC}or fmShareExclusive{$ENDIF} );*)
+end;
+
+destructor TLogger.Destroy;
+begin
+ CloseFile( FFileHandle );
+ inherited;
+end;
+
+function TLogger.GetApplicationName: string;
+begin
+ result := FApplicationName;
+end;
+
+function TLogger.GetApplicationPath: string;
+begin
+ result := FApplicationPath;
+end;
+
+procedure TLogger.LogError(ErrorMessage, Location: string);
+var
+ S : string;
+begin
+ S := '*** ERROR *** : @ ' + TimeToStr(Time) + ' MSG : ' + ErrorMessage + ' IN : ' + Location + #13#10;
+ WriteLn( FFileHandle, S );
+ Flush( FFileHandle );
+end;
+
+procedure TLogger.LogStatus(StatusMessage, Location: string);
+var
+ S : string;
+begin
+ S := 'STATUS INFO : @ ' + TimeToStr(Time) + ' MSG : ' + StatusMessage + ' IN : ' + Location + #13#10;
+ WriteLn( FFileHandle, S );
+ Flush( FFileHandle );
+end;
+
+procedure TLogger.LogWarning(WarningMessage, Location: string);
+var
+ S : string;
+begin
+ S := '=== WARNING === : @ ' + TimeToStr(Time) + ' MSG : ' + WarningMessage + ' IN : ' + Location + #13#10;
+ WriteLn( FFileHandle, S );
+ Flush( FFileHandle );
+end;
+
+initialization
+begin
+ Log := TLogger.Create;
+ Log.LogStatus( 'Starting Application', 'Initialization' );
+end;
+
+finalization
+begin
+ Log.LogStatus( 'Terminating Application', 'Finalization' );
+ Log.Free;
+ Log := nil;
+end;
+
+end.
+ \ No newline at end of file
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/moduleloader.pas b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/moduleloader.pas
new file mode 100644
index 00000000..146e4b30
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/moduleloader.pas
@@ -0,0 +1,319 @@
+unit moduleloader;
+{
+ $Id: moduleloader.pas,v 1.4 2004/02/20 17:19:10 savage Exp $
+
+}
+{******************************************************************}
+{ }
+{ Project JEDI }
+{ OS independent Dynamic Loading Helpers }
+{ }
+{ The initial developer of the this code is }
+{ Robert Marquardt <robert_marquardt@gmx.de) }
+{ }
+{ Copyright (C) 2000, 2001 Robert Marquardt. }
+{ }
+{ Obtained through: }
+{ Joint Endeavour of Delphi Innovators (Project JEDI) }
+{ }
+{ You may retrieve the latest version of this file at the Project }
+{ JEDI home page, located at http://delphi-jedi.org }
+{ }
+{ The contents of this file are used with permission, subject to }
+{ the Mozilla Public License Version 1.1 (the "License"); you may }
+{ not use this file except in compliance with the License. You may }
+{ obtain a copy of the License at }
+{ http://www.mozilla.org/NPL/NPL-1_1Final.html }
+{ }
+{ Software distributed under the License is distributed on an }
+{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
+{ implied. See the License for the specific language governing }
+{ rights and limitations under the License. }
+{ }
+{******************************************************************}
+{
+ $Log: moduleloader.pas,v $
+ Revision 1.4 2004/02/20 17:19:10 savage
+ Added Calling convention to Win32 functions just in case.
+
+ Revision 1.3 2004/02/14 22:36:29 savage
+ Fixed inconsistencies of using LoadLibrary and LoadModule.
+ Now all units make use of LoadModule rather than LoadLibrary and other dynamic proc procedures.
+
+ Revision 1.2 2004/02/14 00:23:39 savage
+ As UNIX is defined in jedi-sdl.inc this will be used to check linux compatability as well. Units have been changed to reflect this change.
+
+ Revision 1.1 2004/02/14 00:04:50 savage
+ dllfuncs conflicts with FreePascal so it has been renamed back to the moduleloader.pas
+
+ Revision 1.1 2004/02/05 00:08:19 savage
+ Module 1.0 release
+
+
+}
+
+interface
+
+{$i jedi-sdl.inc}
+{$WEAKPACKAGEUNIT ON}
+
+// each OS gets its own IFDEFed complete code block to make reading easier
+
+{$IFDEF WIN32}
+uses
+ Windows;
+
+type
+ // Handle to a loaded DLL
+ TModuleHandle = HINST;
+
+const
+ // Value designating an unassigned TModuleHandle od a failed loading
+ INVALID_MODULEHANDLE_VALUE = TModuleHandle(0);
+
+function LoadModule(var Module: TModuleHandle; FileName: PChar): Boolean; stdcall;
+function LoadModuleEx(var Module: TModuleHandle; FileName: PChar; Flags: Cardinal): Boolean; stdcall;
+procedure UnloadModule(var Module: TModuleHandle); stdcall;
+function GetModuleSymbol(Module: TModuleHandle; SymbolName: PChar): Pointer; stdcall;
+function GetModuleSymbolEx(Module: TModuleHandle; SymbolName: PChar; var Accu: Boolean): Pointer; stdcall;
+function ReadModuleData(Module: TModuleHandle; SymbolName: PChar; var Buffer; Size: Cardinal): Boolean; stdcall;
+function WriteModuleData(Module: TModuleHandle; SymbolName: PChar; var Buffer; Size: Cardinal): Boolean; stdcall;
+
+implementation
+
+// load the DLL file FileName
+// the rules for FileName are those of LoadLibrary
+// Returns: True = success, False = failure to load
+// Assigns: the handle of the loaded DLL to Module
+// Warning: if Module has any other value than INVALID_MODULEHANDLE_VALUE
+// on entry the function will do nothing but returning success.
+
+function LoadModule(var Module: TModuleHandle; FileName: PChar): Boolean;
+begin
+ if Module = INVALID_MODULEHANDLE_VALUE then
+ Module := LoadLibrary( FileName );
+ Result := Module <> INVALID_MODULEHANDLE_VALUE;
+end;
+
+// load the DLL file FileName
+// LoadLibraryEx is used to get better control of the loading
+// for the allowed values for flags see LoadLibraryEx documentation.
+
+function LoadModuleEx(var Module: TModuleHandle; FileName: PChar; Flags: Cardinal): Boolean;
+begin
+ if Module = INVALID_MODULEHANDLE_VALUE then
+ Module := LoadLibraryEx( FileName, 0, Flags);
+ Result := Module <> INVALID_MODULEHANDLE_VALUE;
+end;
+
+// unload a DLL loaded with LoadModule or LoadModuleEx
+// The procedure will not try to unload a handle with
+// value INVALID_MODULEHANDLE_VALUE and assigns this value
+// to Module after unload.
+
+procedure UnloadModule(var Module: TModuleHandle);
+begin
+ if Module <> INVALID_MODULEHANDLE_VALUE then
+ FreeLibrary(Module);
+ Module := INVALID_MODULEHANDLE_VALUE;
+end;
+
+// returns the pointer to the symbol named SymbolName
+// if it is exported from the DLL Module
+// nil is returned if the symbol is not available
+
+function GetModuleSymbol(Module: TModuleHandle; SymbolName: PChar): Pointer;
+begin
+ Result := nil;
+ if Module <> INVALID_MODULEHANDLE_VALUE then
+ Result := GetProcAddress(Module, SymbolName );
+end;
+
+// returns the pointer to the symbol named SymbolName
+// if it is exported from the DLL Module
+// nil is returned if the symbol is not available.
+// as an extra the boolean variable Accu is updated
+// by anding in the success of the function.
+// This is very handy for rendering a global result
+// when accessing a long list of symbols.
+
+function GetModuleSymbolEx(Module: TModuleHandle; SymbolName: PChar; var Accu: Boolean): Pointer;
+begin
+ Result := nil;
+ if Module <> INVALID_MODULEHANDLE_VALUE then
+ Result := GetProcAddress(Module, SymbolName );
+ Accu := Accu and (Result <> nil);
+end;
+
+// get the value of variables exported from a DLL Module
+// Delphi cannot access variables in a DLL directly, so
+// this function allows to copy the data from the DLL.
+// Beware! You are accessing the DLL memory image directly.
+// Be sure to access a variable not a function and be sure
+// to read the correct amount of data.
+
+function ReadModuleData(Module: TModuleHandle; SymbolName: PChar; var Buffer; Size: Cardinal): Boolean;
+var
+ Sym: Pointer;
+begin
+ Result := True;
+ Sym := GetModuleSymbolEx(Module, SymbolName, Result);
+ if Result then
+ Move(Sym^, Buffer, Size);
+end;
+
+// set the value of variables exported from a DLL Module
+// Delphi cannot access variables in a DLL directly, so
+// this function allows to copy the data to the DLL!
+// BEWARE! You are accessing the DLL memory image directly.
+// Be sure to access a variable not a function and be sure
+// to write the correct amount of data.
+// The changes are not persistent. They get lost when the
+// DLL is unloaded.
+
+function WriteModuleData(Module: TModuleHandle; SymbolName: PChar; var Buffer; Size: Cardinal): Boolean;
+var
+ Sym: Pointer;
+begin
+ Result := True;
+ Sym := GetModuleSymbolEx(Module, SymbolName, Result);
+ if Result then
+ Move(Buffer, Sym^, Size);
+end;
+
+{$ENDIF}
+
+{$IFDEF Unix}
+uses
+{$ifdef Linux}
+ Types,
+ Libc;
+{$else}
+ dl,
+ Types,
+ Baseunix,
+ Unix;
+{$endif}
+type
+ // Handle to a loaded .so
+ TModuleHandle = Pointer;
+
+const
+ // Value designating an unassigned TModuleHandle od a failed loading
+ INVALID_MODULEHANDLE_VALUE = TModuleHandle(nil);
+
+function LoadModule(var Module: TModuleHandle; FileName: PChar): Boolean;
+function LoadModuleEx(var Module: TModuleHandle; FileName: PChar; Flags: Cardinal): Boolean;
+procedure UnloadModule(var Module: TModuleHandle);
+function GetModuleSymbol(Module: TModuleHandle; SymbolName: PChar): Pointer;
+function GetModuleSymbolEx(Module: TModuleHandle; SymbolName: PChar; var Accu: Boolean): Pointer;
+function ReadModuleData(Module: TModuleHandle; SymbolName: PChar; var Buffer; Size: Cardinal): Boolean;
+function WriteModuleData(Module: TModuleHandle; SymbolName: PChar; var Buffer; Size: Cardinal): Boolean;
+
+implementation
+
+// load the .so file FileName
+// the rules for FileName are those of dlopen()
+// Returns: True = success, False = failure to load
+// Assigns: the handle of the loaded .so to Module
+// Warning: if Module has any other value than INVALID_MODULEHANDLE_VALUE
+// on entry the function will do nothing but returning success.
+
+function LoadModule(var Module: TModuleHandle; FileName: PChar): Boolean;
+begin
+ if Module = INVALID_MODULEHANDLE_VALUE then
+ Module := dlopen( FileName, RTLD_NOW);
+ Result := Module <> INVALID_MODULEHANDLE_VALUE;
+end;
+
+// load the .so file FileName
+// dlopen() with flags is used to get better control of the loading
+// for the allowed values for flags see "man dlopen".
+
+function LoadModuleEx(var Module: TModuleHandle; FileName: PChar; Flags: Cardinal): Boolean;
+begin
+ if Module = INVALID_MODULEHANDLE_VALUE then
+ Module := dlopen( FileName, Flags);
+ Result := Module <> INVALID_MODULEHANDLE_VALUE;
+end;
+
+// unload a .so loaded with LoadModule or LoadModuleEx
+// The procedure will not try to unload a handle with
+// value INVALID_MODULEHANDLE_VALUE and assigns this value
+// to Module after unload.
+
+procedure UnloadModule(var Module: TModuleHandle);
+begin
+ if Module <> INVALID_MODULEHANDLE_VALUE then
+ dlclose(Module);
+ Module := INVALID_MODULEHANDLE_VALUE;
+end;
+
+// returns the pointer to the symbol named SymbolName
+// if it is exported from the .so Module
+// nil is returned if the symbol is not available
+
+function GetModuleSymbol(Module: TModuleHandle; SymbolName: PChar): Pointer;
+begin
+ Result := nil;
+ if Module <> INVALID_MODULEHANDLE_VALUE then
+ Result := dlsym(Module, SymbolName );
+end;
+
+// returns the pointer to the symbol named SymbolName
+// if it is exported from the .so Module
+// nil is returned if the symbol is not available.
+// as an extra the boolean variable Accu is updated
+// by anding in the success of the function.
+// This is very handy for rendering a global result
+// when accessing a long list of symbols.
+
+function GetModuleSymbolEx(Module: TModuleHandle; SymbolName: PChar; var Accu: Boolean): Pointer;
+begin
+ Result := nil;
+ if Module <> INVALID_MODULEHANDLE_VALUE then
+ Result := dlsym(Module, SymbolName );
+ Accu := Accu and (Result <> nil);
+end;
+
+// get the value of variables exported from a .so Module
+// Delphi cannot access variables in a .so directly, so
+// this function allows to copy the data from the .so.
+// Beware! You are accessing the .so memory image directly.
+// Be sure to access a variable not a function and be sure
+// to read the correct amount of data.
+
+function ReadModuleData(Module: TModuleHandle; SymbolName: PChar; var Buffer; Size: Cardinal): Boolean;
+var
+ Sym: Pointer;
+begin
+ Result := True;
+ Sym := GetModuleSymbolEx(Module, SymbolName, Result);
+ if Result then
+ Move(Sym^, Buffer, Size);
+end;
+
+// set the value of variables exported from a .so Module
+// Delphi cannot access variables in a .so directly, so
+// this function allows to copy the data to the .so!
+// BEWARE! You are accessing the .so memory image directly.
+// Be sure to access a variable not a function and be sure
+// to write the correct amount of data.
+// The changes are not persistent. They get lost when the
+// .so is unloaded.
+
+function WriteModuleData(Module: TModuleHandle; SymbolName: PChar; var Buffer; Size: Cardinal): Boolean;
+var
+ Sym: Pointer;
+begin
+ Result := True;
+ Sym := GetModuleSymbolEx(Module, SymbolName, Result);
+ if Result then
+ Move(Buffer, Sym^, Size);
+end;
+{$ENDIF}
+
+{$IFDEF __MACH__} // Mach definitions go here
+{$ENDIF}
+
+end.
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/registryuserpreferences.pas b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/registryuserpreferences.pas
new file mode 100644
index 00000000..2d28a222
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/registryuserpreferences.pas
@@ -0,0 +1,229 @@
+unit registryuserpreferences;
+{
+ $Id: registryuserpreferences.pas,v 1.1 2004/09/30 22:35:47 savage Exp $
+
+}
+{******************************************************************************}
+{ }
+{ JEDI-SDL : Pascal units for SDL - Simple DirectMedia Layer }
+{ Wrapper class for Windows Register and INI Files }
+{ }
+{ The initial developer of this Pascal code was : }
+{ Dominqiue Louis <Dominique@SavageSoftware.com.au> }
+{ }
+{ Portions created by Dominqiue Louis are }
+{ Copyright (C) 2000 - 2001 Dominqiue Louis. }
+{ }
+{ }
+{ Contributor(s) }
+{ -------------- }
+{ }
+{ }
+{ Obtained through: }
+{ Joint Endeavour of Delphi Innovators ( Project JEDI ) }
+{ }
+{ You may retrieve the latest version of this file at the Project }
+{ JEDI home page, located at http://delphi-jedi.org }
+{ }
+{ The contents of this file are used with permission, subject to }
+{ the Mozilla Public License Version 1.1 (the "License"); you may }
+{ not use this file except in compliance with the License. You may }
+{ obtain a copy of the License at }
+{ http://www.mozilla.org/MPL/MPL-1.1.html }
+{ }
+{ Software distributed under the License is distributed on an }
+{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
+{ implied. See the License for the specific language governing }
+{ rights and limitations under the License. }
+{ }
+{ Description }
+{ ----------- }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ Requires }
+{ -------- }
+{ The SDL Runtime libraris on Win32 : SDL.dll on Linux : libSDL.so }
+{ They are available from... }
+{ http://www.libsdl.org . }
+{ }
+{ Programming Notes }
+{ ----------------- }
+{ }
+{ }
+{ }
+{ }
+{ Revision History }
+{ ---------------- }
+{ September 23 2004 - DL : Initial Creation }
+{
+ $Log: registryuserpreferences.pas,v $
+ Revision 1.1 2004/09/30 22:35:47 savage
+ Changes, enhancements and additions as required to get SoAoS working.
+
+
+}
+{******************************************************************************}
+
+interface
+
+uses
+ {$IFDEF REG}
+ Registry,
+ {$ELSE}
+ IniFiles,
+ {$ENDIF}
+ Classes,
+ userpreferences;
+
+type
+ TRegistryUserPreferences = class( TUserPreferences )
+ private
+
+ protected
+ function GetSection( const Index : Integer ) : string; virtual; abstract;
+ function GetIdentifier( const Index : Integer ) : string; virtual; abstract;
+ function GetDefaultBoolean( const Index : Integer ) : Boolean; override;
+ function GetBoolean( const Index : Integer ) : Boolean; override;
+ procedure SetBoolean( const Index : Integer; const Value : Boolean ); override;
+ function GetDefaultDateTime( const Index : Integer ) : TDateTime; override;
+ function GetDateTime( const Index : Integer ) : TDateTime; override;
+ procedure SetDateTime( const Index : Integer; const Value : TDateTime ); override;
+ function GetDefaultInteger( const Index : Integer ) : Integer; override;
+ function GetInteger( const Index : Integer ) : Integer; override;
+ procedure SetInteger( const Index : Integer; const Value : Integer ); override;
+ function GetDefaultFloat( const Index : Integer ) : single; override;
+ function GetFloat( const Index : Integer ) : single; override;
+ procedure SetFloat( const Index : Integer; const Value : single ); override;
+ function GetDefaultString( const Index : Integer ) : string; override;
+ function GetString( const Index : Integer ) : string; override;
+ procedure SetString( const Index : Integer; const Value : string ); override;
+ public
+ Registry : {$IFDEF REG}TRegIniFile{$ELSE}TIniFile{$ENDIF};
+ constructor Create( const FileName : string = '' ); reintroduce;
+ destructor Destroy; override;
+ procedure Update; override;
+ end;
+
+implementation
+
+uses
+ SysUtils;
+
+{ TRegistryUserPreferences }
+constructor TRegistryUserPreferences.Create( const FileName : string );
+var
+ defFileName : string;
+begin
+ inherited Create;
+
+ if FileName <> '' then
+ defFileName := FileName
+ else
+ defFileName := ChangeFileExt( ParamStr( 0 ), '.ini' );
+
+ Registry := {$IFDEF REG}TRegIniFile{$ELSE}TIniFile{$ENDIF}.Create( defFileName );
+end;
+
+destructor TRegistryUserPreferences.Destroy;
+begin
+ Update;
+ Registry.Free;
+ Registry := nil;
+ inherited;
+end;
+
+function TRegistryUserPreferences.GetBoolean( const Index : Integer ) : Boolean;
+begin
+ Result := Registry.ReadBool( GetSection( Index ), GetIdentifier( Index ), GetDefaultBoolean( Index ) );
+end;
+
+function TRegistryUserPreferences.GetDateTime( const Index : Integer ): TDateTime;
+begin
+ Result := Registry.ReadDateTime( GetSection( Index ){$IFNDEF REG}, GetIdentifier( Index ), GetDefaultDateTime( Index ){$ENDIF} );
+end;
+
+function TRegistryUserPreferences.GetDefaultBoolean( const Index : Integer ) : Boolean;
+begin
+ result := false;
+end;
+
+function TRegistryUserPreferences.GetDefaultDateTime( const Index: Integer ) : TDateTime;
+begin
+ result := Now;
+end;
+
+function TRegistryUserPreferences.GetDefaultFloat( const Index: Integer ) : single;
+begin
+ result := 0.0;
+end;
+
+function TRegistryUserPreferences.GetDefaultInteger(const Index : Integer ) : Integer;
+begin
+ result := 0;
+end;
+
+function TRegistryUserPreferences.GetDefaultString( const Index : Integer ) : string;
+begin
+ result := '';
+end;
+
+function TRegistryUserPreferences.GetFloat( const Index : Integer ): single;
+begin
+ Result := Registry.ReadFloat( GetSection( Index ){$IFNDEF REG}, GetIdentifier( Index ), GetDefaultFloat( Index ){$ENDIF} );
+end;
+
+function TRegistryUserPreferences.GetInteger( const Index : Integer ) : Integer;
+begin
+ Result := Registry.ReadInteger( GetSection( Index ), GetIdentifier( Index ), GetDefaultInteger( Index ) );
+end;
+
+function TRegistryUserPreferences.GetString( const Index : Integer ): string;
+begin
+ Result := Registry.ReadString( GetSection( Index ), GetIdentifier( Index ), GetDefaultString( Index ) );
+end;
+
+procedure TRegistryUserPreferences.SetBoolean( const Index : Integer; const Value : Boolean );
+begin
+ Registry.WriteBool( GetSection( Index ), GetIdentifier( Index ), Value );
+ inherited;
+end;
+
+procedure TRegistryUserPreferences.SetDateTime( const Index: Integer; const Value: TDateTime );
+begin
+ Registry.WriteDateTime( GetSection( Index ){$IFNDEF REG}, GetIdentifier( Index ){$ENDIF}, Value );
+ inherited;
+end;
+
+procedure TRegistryUserPreferences.SetFloat(const Index: Integer; const Value: single);
+begin
+ Registry.WriteFloat( GetSection( Index ){$IFNDEF REG}, GetIdentifier( Index ){$ENDIF}, Value );
+ inherited;
+end;
+
+procedure TRegistryUserPreferences.SetInteger( const Index, Value : Integer );
+begin
+ Registry.WriteInteger( GetSection( Index ), GetIdentifier( Index ), Value );
+ inherited;
+end;
+
+procedure TRegistryUserPreferences.SetString( const Index : Integer; const Value : string );
+begin
+ Registry.WriteString( GetSection( Index ), GetIdentifier( Index ), Value );
+ inherited;
+end;
+
+procedure TRegistryUserPreferences.Update;
+begin
+ {$IFDEF REG}
+ Registry.CloseKey;
+ {$ELSE}
+ Registry.UpdateFile;
+ {$ENDIF}
+end;
+
+end.
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdl.pas b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdl.pas
new file mode 100644
index 00000000..29bc7123
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdl.pas
@@ -0,0 +1,4321 @@
+unit sdl;
+{
+ $Id: sdl.pas,v 1.38 2008/01/26 10:09:32 savage Exp $
+
+}
+{******************************************************************************}
+{ }
+{ JEDI-SDL : Pascal units for SDL - Simple DirectMedia Layer }
+{ Conversion of the Simple DirectMedia Layer Headers }
+{ }
+{ Portions created by Sam Lantinga <slouken@devolution.com> are }
+{ Copyright (C) 1997-2004 Sam Lantinga }
+{ 5635-34 Springhouse Dr. }
+{ Pleasanton, CA 94588 (USA) }
+{ }
+{ All Rights Reserved. }
+{ }
+{ The original files are : SDL.h }
+{ SDL_main.h }
+{ SDL_types.h }
+{ SDL_rwops.h }
+{ SDL_timer.h }
+{ SDL_audio.h }
+{ SDL_cdrom.h }
+{ SDL_joystick.h }
+{ SDL_mouse.h }
+{ SDL_keyboard.h }
+{ SDL_events.h }
+{ SDL_video.h }
+{ SDL_byteorder.h }
+{ SDL_version.h }
+{ SDL_active.h }
+{ SDL_thread.h }
+{ SDL_mutex .h }
+{ SDL_getenv.h }
+{ SDL_loadso.h }
+{ }
+{ The initial developer of this Pascal code was : }
+{ Dominique Louis <Dominique@SavageSoftware.com.au> }
+{ }
+{ Portions created by Dominique Louis are }
+{ Copyright (C) 2000 - 2004 Dominique Louis. }
+{ }
+{ }
+{ Contributor(s) }
+{ -------------- }
+{ Tom Jones <tigertomjones@gmx.de> His Project inspired this conversion }
+{ Matthias Thoma <ma.thoma@gmx.de> }
+{ }
+{ Obtained through: }
+{ Joint Endeavour of Delphi Innovators ( Project JEDI ) }
+{ }
+{ You may retrieve the latest version of this file at the Project }
+{ JEDI home page, located at http://delphi-jedi.org }
+{ }
+{ The contents of this file are used with permission, subject to }
+{ the Mozilla Public License Version 1.1 (the "License"); you may }
+{ not use this file except in compliance with the License. You may }
+{ obtain a copy of the License at }
+{ http://www.mozilla.org/MPL/MPL-1.1.html }
+{ }
+{ Software distributed under the License is distributed on an }
+{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
+{ implied. See the License for the specific language governing }
+{ rights and limitations under the License. }
+{ }
+{ Description }
+{ ----------- }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ Requires }
+{ -------- }
+{ The SDL Runtime libraris on Win32 : SDL.dll on Linux : libSDL.so }
+{ They are available from... }
+{ http://www.libsdl.org . }
+{ }
+{ Programming Notes }
+{ ----------------- }
+{ }
+{ }
+{ }
+{ }
+{ Revision History }
+{ ---------------- }
+{ May 08 2001 - DL : Added Keyboard State Array ( See demos for how to }
+{ use ) }
+{ PKeyStateArr = ^TKeyStateArr; }
+{ TKeyStateArr = array[0..65000] of UInt8; }
+{ As most games will need it. }
+{ }
+{ April 02 2001 - DL : Added SDL_getenv.h definitions and tested version }
+{ 1.2.0 compatability. }
+{ }
+{ March 13 2001 - MT : Added Linux compatibility. }
+{ }
+{ March 10 2001 - MT : Added externalsyms for DEFINES }
+{ Changed the license header }
+{ }
+{ March 09 2001 - MT : Added Kylix Ifdefs/Deleted the uses mmsystem }
+{ }
+{ March 01 2001 - DL : Update conversion of version 1.1.8 }
+{ }
+{ July 22 2001 - DL : Added TUInt8Array and PUIntArray after suggestions }
+{ from Matthias Thoma and Eric Grange. }
+{ }
+{ October 12 2001 - DL : Various changes as suggested by Matthias Thoma and }
+{ David Acklam }
+{ }
+{ October 24 2001 - DL : Added FreePascal support as per suggestions from }
+{ Dean Ellis. }
+{ }
+{ October 27 2001 - DL : Added SDL_BUTTON macro }
+{ }
+{ November 08 2001 - DL : Bug fix as pointed out by Puthoon. }
+{ }
+{ November 29 2001 - DL : Bug fix of SDL_SetGammaRamp as pointed out by Simon}
+{ Rushton. }
+{ }
+{ November 30 2001 - DL : SDL_NOFRAME added as pointed out by Simon Rushton. }
+{ }
+{ December 11 2001 - DL : Added $WEAKPACKAGEUNIT ON to facilitate useage in }
+{ Components }
+{ }
+{ January 05 2002 - DL : Added SDL_Swap32 function as suggested by Matthias }
+{ Thoma and also made sure the _getenv from }
+{ MSVCRT.DLL uses the right calling convention }
+{ }
+{ January 25 2002 - DL : Updated conversion of SDL_AddTimer & }
+{ SDL_RemoveTimer as per suggestions from Matthias }
+{ Thoma. }
+{ }
+{ January 27 2002 - DL : Commented out exported function putenv and getenv }
+{ So that developers get used to using SDL_putenv }
+{ SDL_getenv, as they are more portable }
+{ }
+{ March 05 2002 - DL : Added FreeAnNil procedure for Delphi 4 users. }
+{ }
+{ October 23 2002 - DL : Added Delphi 3 Define of Win32. }
+{ If you intend to you Delphi 3... }
+{ ( which is officially unsupported ) make sure you }
+{ remove references to $EXTERNALSYM in this and other}
+{ SDL files. }
+{ }
+{ November 29 2002 - DL : Fixed bug in Declaration of SDL_GetRGBA that was }
+{ pointed out by Todd Lang }
+{ }
+{ April 03 2003 - DL : Added jedi-sdl.inc include file to support more }
+{ Pascal compilers. Initial support is now included }
+{ for GnuPascal, VirtualPascal, TMT and obviously }
+{ continue support for Delphi Kylix and FreePascal. }
+{ }
+{ April 08 2003 - MK : Aka Mr Kroket - Added Better FPC support }
+{ }
+{ April 24 2003 - DL : under instruction from Alexey Barkovoy, I have added}
+{ better TMT Pascal support and under instruction }
+{ from Prof. Abimbola Olowofoyeku (The African Chief),}
+{ I have added better Gnu Pascal support }
+{ }
+{ April 30 2003 - DL : under instruction from David Mears AKA }
+{ Jason Siletto, I have added FPC Linux support. }
+{ This was compiled with fpc 1.1, so remember to set }
+{ include file path. ie. -Fi/usr/share/fpcsrc/rtl/* }
+{ }
+{
+ $Log: sdl.pas,v $
+ Revision 1.38 2008/01/26 10:09:32 savage
+ Added SDL_BUTTON_X1 and SDL_BUTTON_X2 constants for extended mouse buttons. Now makes SDL v1.2.13 compliant.
+
+ Revision 1.37 2007/12/20 22:36:56 savage
+ Added SKYOS support, thanks to Sebastian-Torsten Tillmann
+
+ Revision 1.36 2007/12/05 22:52:04 savage
+ Better Mac OS X support for Frameworks.
+
+ Revision 1.35 2007/12/02 22:41:13 savage
+ Change for Mac OS X to link to SDL Framework
+
+ Revision 1.34 2007/08/26 23:50:53 savage
+ Jonas supplied another fix.
+
+ Revision 1.33 2007/08/26 15:59:46 savage
+ Mac OS changes as suggested by Jonas Maebe
+
+ Revision 1.32 2007/08/22 21:18:43 savage
+ Thanks to Dean for his MouseDelta patch.
+
+ Revision 1.31 2007/05/29 21:30:48 savage
+ Changes as suggested by Almindor for 64bit compatibility.
+
+ Revision 1.30 2007/05/29 19:31:03 savage
+ Fix to TSDL_Overlay structure - thanks David Pethes (aka imcold)
+
+ Revision 1.29 2007/05/20 20:29:11 savage
+ Initial Changes to Handle 64 Bits
+
+ Revision 1.26 2007/02/11 13:38:04 savage
+ Added Nintendo DS support - Thanks Dean.
+
+ Revision 1.25 2006/12/02 00:12:52 savage
+ Updated to latest version
+
+ Revision 1.24 2006/05/18 21:10:04 savage
+ Added 1.2.10 Changes
+
+ Revision 1.23 2005/12/04 23:17:52 drellis
+ Added declaration of SInt8 and PSInt8
+
+ Revision 1.22 2005/05/24 21:59:03 savage
+ Re-arranged uses clause to work on Win32 and Linux, Thanks again Michalis.
+
+ Revision 1.21 2005/05/22 18:42:31 savage
+ Changes as suggested by Michalis Kamburelis. Thanks again.
+
+ Revision 1.20 2005/04/10 11:48:33 savage
+ Changes as suggested by Michalis, thanks.
+
+ Revision 1.19 2005/01/05 01:47:06 savage
+ Changed LibName to reflect what MacOS X should have. ie libSDL*-1.2.0.dylib respectively.
+
+ Revision 1.18 2005/01/04 23:14:41 savage
+ Changed LibName to reflect what most Linux distros will have. ie libSDL*-1.2.so.0 respectively.
+
+ Revision 1.17 2005/01/03 18:40:59 savage
+ Updated Version number to reflect latest one
+
+ Revision 1.16 2005/01/01 02:02:06 savage
+ Updated to v1.2.8
+
+ Revision 1.15 2004/12/24 18:57:11 savage
+ forgot to apply Michalis Kamburelis' patch to the implementation section. now fixed
+
+ Revision 1.14 2004/12/23 23:42:18 savage
+ Applied Patches supplied by Michalis Kamburelis ( THANKS! ), for greater FreePascal compatability.
+
+ Revision 1.13 2004/09/30 22:31:59 savage
+ Updated with slightly different header comments
+
+ Revision 1.12 2004/09/12 21:52:58 savage
+ Slight changes to fix some issues with the sdl classes.
+
+ Revision 1.11 2004/08/14 22:54:30 savage
+ Updated so that Library name defines are correctly defined for MacOS X.
+
+ Revision 1.10 2004/07/20 23:57:33 savage
+ Thanks to Paul Toth for spotting an error in the SDL Audio Convertion structures.
+ In TSDL_AudioCVT the filters variable should point to and array of pointers and not what I had there previously.
+
+ Revision 1.9 2004/07/03 22:07:22 savage
+ Added Bitwise Manipulation Functions for TSDL_VideoInfo struct.
+
+ Revision 1.8 2004/05/10 14:10:03 savage
+ Initial MacOS X support. Fixed defines for MACOS ( Classic ) and DARWIN ( MacOS X ).
+
+ Revision 1.7 2004/04/13 09:32:08 savage
+ Changed Shared object names back to just the .so extension to avoid conflicts on various Linux/Unix distros. Therefore developers will need to create Symbolic links to the actual Share Objects if necessary.
+
+ Revision 1.6 2004/04/01 20:53:23 savage
+ Changed Linux Shared Object names so they reflect the Symbolic Links that are created when installing the RPMs from the SDL site.
+
+ Revision 1.5 2004/02/22 15:32:10 savage
+ SDL_GetEnv Fix so it also works on FPC/Linux. Thanks to Rodrigo for pointing this out.
+
+ Revision 1.4 2004/02/21 23:24:29 savage
+ SDL_GetEnv Fix so that it is not define twice for FPC. Thanks to Rene Hugentobler for pointing out this bug,
+
+ Revision 1.3 2004/02/18 22:35:51 savage
+ Brought sdl.pas up to 1.2.7 compatability
+ Thus...
+ Added SDL_GL_STEREO,
+ SDL_GL_MULTISAMPLEBUFFERS,
+ SDL_GL_MULTISAMPLESAMPLES
+
+ Add DLL/Shared object functions
+ function SDL_LoadObject( const sofile : PChar ) : Pointer;
+
+ function SDL_LoadFunction( handle : Pointer; const name : PChar ) : Pointer;
+
+ procedure SDL_UnloadObject( handle : Pointer );
+
+ Added function to create RWops from const memory: SDL_RWFromConstMem()
+ function SDL_RWFromConstMem(const mem: Pointer; size: Integer) : PSDL_RWops;
+
+ Ported SDL_cpuinfo.h so Now you can test for Specific CPU types.
+
+ Revision 1.2 2004/02/17 21:37:12 savage
+ Tidying up of units
+
+ Revision 1.1 2004/02/05 00:08:20 savage
+ Module 1.0 release
+
+}
+{******************************************************************************}
+
+{$I jedi-sdl.inc}
+
+interface
+
+uses
+{$IFDEF __GPC__}
+ system,
+ {$IFDEF WINDOWS}
+ wintypes,
+ {$ELSE}
+ {$ENDIF}
+ gpc;
+{$ENDIF}
+
+{$IFDEF HAS_TYPES}
+ Types{$IFNDEF NDS},{$ELSE};{$ENDIF}
+{$ENDIF}
+
+{$IFDEF WINDOWS}
+ Windows;
+{$ENDIF}
+
+{$IFDEF UNIX}
+ {$IFDEF FPC}
+ {$IFNDEF SKYOS}
+ pthreads,
+ {$ENDIF}
+ baseunix,
+ {$IFNDEF GP2X}
+ {$IFNDEF DARWIN}
+ {$IFNDEF SKYOS}
+ unix,
+ {$ELSE}
+ unix;
+ {$ENDIF}
+ {$ELSE}
+ unix;
+ {$ENDIF}
+ {$ELSE}
+ unix;
+ {$ENDIF}
+ {$IFNDEF GP2X}
+ {$IFNDEF DARWIN}
+ {$IFNDEF SKYOS}
+ x,
+ xlib;
+ {$ENDIF}
+ {$ENDIF}
+ {$ENDIF}
+ {$ELSE}
+ Libc,
+ Xlib;
+ {$ENDIF}
+{$ENDIF}
+
+{$IFDEF __MACH__}
+ GPCMacOSAll;
+{$ENDIF}
+
+const
+{$IFDEF WINDOWS}
+ SDLLibName = 'SDL.dll';
+{$ENDIF}
+
+{$IFDEF UNIX}
+{$IFDEF DARWIN}
+ SDLLibName = 'libSDL-1.2.0.dylib';
+{$ELSE}
+ {$IFDEF FPC}
+ SDLLibName = 'libSDL.so';
+ {$ELSE}
+ SDLLibName = 'libSDL-1.2.so.0';
+ {$ENDIF}
+{$ENDIF}
+{$ENDIF}
+
+{$IFDEF MACOS}
+ SDLLibName = 'SDL';
+ {$linklib libSDL}
+{$ENDIF}
+
+{$IFDEF NDS}
+ SDLLibName = 'libSDL.a';
+ {$linklib libSDL.a}
+ {$linklib libnds9.a}
+ {$linklib libc.a}
+ {$linklib libgcc.a}
+ {$linklib libsysbase.a}
+{$ENDIF}
+
+ // SDL_verion.h constants
+ // Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL
+ SDL_MAJOR_VERSION = 1;
+{$EXTERNALSYM SDL_MAJOR_VERSION}
+ SDL_MINOR_VERSION = 2;
+{$EXTERNALSYM SDL_MINOR_VERSION}
+ SDL_PATCHLEVEL = 13;
+{$EXTERNALSYM SDL_PATCHLEVEL}
+
+ // SDL.h constants
+ SDL_INIT_TIMER = $00000001;
+{$EXTERNALSYM SDL_INIT_TIMER}
+ SDL_INIT_AUDIO = $00000010;
+{$EXTERNALSYM SDL_INIT_AUDIO}
+ SDL_INIT_VIDEO = $00000020;
+{$EXTERNALSYM SDL_INIT_VIDEO}
+ SDL_INIT_CDROM = $00000100;
+{$EXTERNALSYM SDL_INIT_CDROM}
+ SDL_INIT_JOYSTICK = $00000200;
+{$EXTERNALSYM SDL_INIT_JOYSTICK}
+ SDL_INIT_NOPARACHUTE = $00100000; // Don't catch fatal signals
+{$EXTERNALSYM SDL_INIT_NOPARACHUTE}
+ SDL_INIT_EVENTTHREAD = $01000000; // Not supported on all OS's
+{$EXTERNALSYM SDL_INIT_EVENTTHREAD}
+ SDL_INIT_EVERYTHING = $0000FFFF;
+{$EXTERNALSYM SDL_INIT_EVERYTHING}
+
+ // SDL_error.h constants
+ ERR_MAX_STRLEN = 128;
+{$EXTERNALSYM ERR_MAX_STRLEN}
+ ERR_MAX_ARGS = 5;
+{$EXTERNALSYM ERR_MAX_ARGS}
+
+ // SDL_types.h constants
+ SDL_PRESSED = $01;
+{$EXTERNALSYM SDL_PRESSED}
+ SDL_RELEASED = $00;
+{$EXTERNALSYM SDL_RELEASED}
+
+ // SDL_timer.h constants
+ // This is the OS scheduler timeslice, in milliseconds
+ SDL_TIMESLICE = 10;
+{$EXTERNALSYM SDL_TIMESLICE}
+ // This is the maximum resolution of the SDL timer on all platforms
+ TIMER_RESOLUTION = 10; // Experimentally determined
+{$EXTERNALSYM TIMER_RESOLUTION}
+
+ // SDL_audio.h constants
+ AUDIO_U8 = $0008; // Unsigned 8-bit samples
+{$EXTERNALSYM AUDIO_U8}
+ AUDIO_S8 = $8008; // Signed 8-bit samples
+{$EXTERNALSYM AUDIO_S8}
+ AUDIO_U16LSB = $0010; // Unsigned 16-bit samples
+{$EXTERNALSYM AUDIO_U16LSB}
+ AUDIO_S16LSB = $8010; // Signed 16-bit samples
+{$EXTERNALSYM AUDIO_S16LSB}
+ AUDIO_U16MSB = $1010; // As above, but big-endian byte order
+{$EXTERNALSYM AUDIO_U16MSB}
+ AUDIO_S16MSB = $9010; // As above, but big-endian byte order
+{$EXTERNALSYM AUDIO_S16MSB}
+ AUDIO_U16 = AUDIO_U16LSB;
+{$EXTERNALSYM AUDIO_U16}
+ AUDIO_S16 = AUDIO_S16LSB;
+{$EXTERNALSYM AUDIO_S16}
+
+
+ // SDL_cdrom.h constants
+ // The maximum number of CD-ROM tracks on a disk
+ SDL_MAX_TRACKS = 99;
+{$EXTERNALSYM SDL_MAX_TRACKS}
+ // The types of CD-ROM track possible
+ SDL_AUDIO_TRACK = $00;
+{$EXTERNALSYM SDL_AUDIO_TRACK}
+ SDL_DATA_TRACK = $04;
+{$EXTERNALSYM SDL_DATA_TRACK}
+
+ // Conversion functions from frames to Minute/Second/Frames and vice versa
+ CD_FPS = 75;
+{$EXTERNALSYM CD_FPS}
+ // SDL_byteorder.h constants
+ // The two types of endianness
+ SDL_LIL_ENDIAN = 1234;
+{$EXTERNALSYM SDL_LIL_ENDIAN}
+ SDL_BIG_ENDIAN = 4321;
+{$EXTERNALSYM SDL_BIG_ENDIAN}
+
+{$IFDEF IA32}
+
+ SDL_BYTEORDER = SDL_LIL_ENDIAN;
+{$EXTERNALSYM SDL_BYTEORDER}
+ // Native audio byte ordering
+ AUDIO_U16SYS = AUDIO_U16LSB;
+{$EXTERNALSYM AUDIO_U16SYS}
+ AUDIO_S16SYS = AUDIO_S16LSB;
+{$EXTERNALSYM AUDIO_S16SYS}
+
+{$ELSE}
+
+ SDL_BYTEORDER = SDL_BIG_ENDIAN;
+{$EXTERNALSYM SDL_BYTEORDER}
+ // Native audio byte ordering
+ AUDIO_U16SYS = AUDIO_U16MSB;
+{$EXTERNALSYM AUDIO_U16SYS}
+ AUDIO_S16SYS = AUDIO_S16MSB;
+{$EXTERNALSYM AUDIO_S16SYS}
+
+{$ENDIF}
+
+
+ SDL_MIX_MAXVOLUME = 128;
+{$EXTERNALSYM SDL_MIX_MAXVOLUME}
+
+ // SDL_joystick.h constants
+ MAX_JOYSTICKS = 2; // only 2 are supported in the multimedia API
+{$EXTERNALSYM MAX_JOYSTICKS}
+ MAX_AXES = 6; // each joystick can have up to 6 axes
+{$EXTERNALSYM MAX_AXES}
+ MAX_BUTTONS = 32; // and 32 buttons
+{$EXTERNALSYM MAX_BUTTONS}
+ AXIS_MIN = -32768; // minimum value for axis coordinate
+{$EXTERNALSYM AXIS_MIN}
+ AXIS_MAX = 32767; // maximum value for axis coordinate
+{$EXTERNALSYM AXIS_MAX}
+ JOY_AXIS_THRESHOLD = (((AXIS_MAX) - (AXIS_MIN)) / 100); // 1% motion
+{$EXTERNALSYM JOY_AXIS_THRESHOLD}
+ //JOY_BUTTON_FLAG(n) (1<<n)
+ // array to hold joystick ID values
+ //static UInt SYS_JoystickID[MAX_JOYSTICKS];
+ //static JOYCAPS SYS_Joystick[MAX_JOYSTICKS];
+
+ { Get the current state of a POV hat on a joystick
+ The return value is one of the following positions: }
+ SDL_HAT_CENTERED = $00;
+{$EXTERNALSYM SDL_HAT_CENTERED}
+ SDL_HAT_UP = $01;
+{$EXTERNALSYM SDL_HAT_UP}
+ SDL_HAT_RIGHT = $02;
+{$EXTERNALSYM SDL_HAT_RIGHT}
+ SDL_HAT_DOWN = $04;
+{$EXTERNALSYM SDL_HAT_DOWN}
+ SDL_HAT_LEFT = $08;
+{$EXTERNALSYM SDL_HAT_LEFT}
+ SDL_HAT_RIGHTUP = SDL_HAT_RIGHT or SDL_HAT_UP;
+{$EXTERNALSYM SDL_HAT_RIGHTUP}
+ SDL_HAT_RIGHTDOWN = SDL_HAT_RIGHT or SDL_HAT_DOWN;
+{$EXTERNALSYM SDL_HAT_RIGHTDOWN}
+ SDL_HAT_LEFTUP = SDL_HAT_LEFT or SDL_HAT_UP;
+{$EXTERNALSYM SDL_HAT_LEFTUP}
+ SDL_HAT_LEFTDOWN = SDL_HAT_LEFT or SDL_HAT_DOWN;
+{$EXTERNALSYM SDL_HAT_LEFTDOWN}
+
+ // SDL_events.h constants
+ SDL_NOEVENT = 0; // Unused (do not remove)
+{$EXTERNALSYM SDL_NOEVENT}
+ SDL_ACTIVEEVENT = 1; // Application loses/gains visibility
+{$EXTERNALSYM SDL_ACTIVEEVENT}
+ SDL_KEYDOWN = 2; // Keys pressed
+{$EXTERNALSYM SDL_KEYDOWN}
+ SDL_KEYUP = 3; // Keys released
+{$EXTERNALSYM SDL_KEYUP}
+ SDL_MOUSEMOTION = 4; // Mouse moved
+{$EXTERNALSYM SDL_MOUSEMOTION}
+ SDL_MOUSEBUTTONDOWN = 5; // Mouse button pressed
+{$EXTERNALSYM SDL_MOUSEBUTTONDOWN}
+ SDL_MOUSEBUTTONUP = 6; // Mouse button released
+{$EXTERNALSYM SDL_MOUSEBUTTONUP}
+ SDL_JOYAXISMOTION = 7; // Joystick axis motion
+{$EXTERNALSYM SDL_JOYAXISMOTION}
+ SDL_JOYBALLMOTION = 8; // Joystick trackball motion
+{$EXTERNALSYM SDL_JOYBALLMOTION}
+ SDL_JOYHATMOTION = 9; // Joystick hat position change
+{$EXTERNALSYM SDL_JOYHATMOTION}
+ SDL_JOYBUTTONDOWN = 10; // Joystick button pressed
+{$EXTERNALSYM SDL_JOYBUTTONDOWN}
+ SDL_JOYBUTTONUP = 11; // Joystick button released
+{$EXTERNALSYM SDL_JOYBUTTONUP}
+ SDL_QUITEV = 12; // User-requested quit ( Changed due to procedure conflict )
+{$EXTERNALSYM SDL_QUIT}
+ SDL_SYSWMEVENT = 13; // System specific event
+{$EXTERNALSYM SDL_SYSWMEVENT}
+ SDL_EVENT_RESERVEDA = 14; // Reserved for future use..
+{$EXTERNALSYM SDL_EVENT_RESERVEDA}
+ SDL_EVENT_RESERVED = 15; // Reserved for future use..
+{$EXTERNALSYM SDL_EVENT_RESERVED}
+ SDL_VIDEORESIZE = 16; // User resized video mode
+{$EXTERNALSYM SDL_VIDEORESIZE}
+ SDL_VIDEOEXPOSE = 17; // Screen needs to be redrawn
+{$EXTERNALSYM SDL_VIDEOEXPOSE}
+ SDL_EVENT_RESERVED2 = 18; // Reserved for future use..
+{$EXTERNALSYM SDL_EVENT_RESERVED2}
+ SDL_EVENT_RESERVED3 = 19; // Reserved for future use..
+{$EXTERNALSYM SDL_EVENT_RESERVED3}
+ SDL_EVENT_RESERVED4 = 20; // Reserved for future use..
+{$EXTERNALSYM SDL_EVENT_RESERVED4}
+ SDL_EVENT_RESERVED5 = 21; // Reserved for future use..
+{$EXTERNALSYM SDL_EVENT_RESERVED5}
+ SDL_EVENT_RESERVED6 = 22; // Reserved for future use..
+{$EXTERNALSYM SDL_EVENT_RESERVED6}
+ SDL_EVENT_RESERVED7 = 23; // Reserved for future use..
+{$EXTERNALSYM SDL_EVENT_RESERVED7}
+ // Events SDL_USEREVENT through SDL_MAXEVENTS-1 are for your use
+ SDL_USEREVENT = 24;
+{$EXTERNALSYM SDL_USEREVENT}
+ // This last event is only for bounding internal arrays
+ // It is the number of bits in the event mask datatype -- UInt32
+ SDL_NUMEVENTS = 32;
+{$EXTERNALSYM SDL_NUMEVENTS}
+
+ SDL_ALLEVENTS = $FFFFFFFF;
+{$EXTERNALSYM SDL_ALLEVENTS}
+
+ SDL_ACTIVEEVENTMASK = 1 shl SDL_ACTIVEEVENT;
+{$EXTERNALSYM SDL_ACTIVEEVENTMASK}
+ SDL_KEYDOWNMASK = 1 shl SDL_KEYDOWN;
+{$EXTERNALSYM SDL_KEYDOWNMASK}
+ SDL_KEYUPMASK = 1 shl SDL_KEYUP;
+{$EXTERNALSYM SDL_KEYUPMASK}
+ SDL_MOUSEMOTIONMASK = 1 shl SDL_MOUSEMOTION;
+{$EXTERNALSYM SDL_MOUSEMOTIONMASK}
+ SDL_MOUSEBUTTONDOWNMASK = 1 shl SDL_MOUSEBUTTONDOWN;
+{$EXTERNALSYM SDL_MOUSEBUTTONDOWNMASK}
+ SDL_MOUSEBUTTONUPMASK = 1 shl SDL_MOUSEBUTTONUP;
+{$EXTERNALSYM SDL_MOUSEBUTTONUPMASK}
+ SDL_MOUSEEVENTMASK = 1 shl SDL_MOUSEMOTION or
+ 1 shl SDL_MOUSEBUTTONDOWN or
+ 1 shl SDL_MOUSEBUTTONUP;
+{$EXTERNALSYM SDL_MOUSEEVENTMASK}
+ SDL_JOYAXISMOTIONMASK = 1 shl SDL_JOYAXISMOTION;
+{$EXTERNALSYM SDL_JOYAXISMOTIONMASK}
+ SDL_JOYBALLMOTIONMASK = 1 shl SDL_JOYBALLMOTION;
+{$EXTERNALSYM SDL_JOYBALLMOTIONMASK}
+ SDL_JOYHATMOTIONMASK = 1 shl SDL_JOYHATMOTION;
+{$EXTERNALSYM SDL_JOYHATMOTIONMASK}
+ SDL_JOYBUTTONDOWNMASK = 1 shl SDL_JOYBUTTONDOWN;
+{$EXTERNALSYM SDL_JOYBUTTONDOWNMASK}
+ SDL_JOYBUTTONUPMASK = 1 shl SDL_JOYBUTTONUP;
+{$EXTERNALSYM SDL_JOYBUTTONUPMASK}
+ SDL_JOYEVENTMASK = 1 shl SDL_JOYAXISMOTION or
+ 1 shl SDL_JOYBALLMOTION or
+ 1 shl SDL_JOYHATMOTION or
+ 1 shl SDL_JOYBUTTONDOWN or
+ 1 shl SDL_JOYBUTTONUP;
+{$EXTERNALSYM SDL_JOYEVENTMASK}
+ SDL_VIDEORESIZEMASK = 1 shl SDL_VIDEORESIZE;
+{$EXTERNALSYM SDL_VIDEORESIZEMASK}
+ SDL_QUITMASK = 1 shl SDL_QUITEV;
+{$EXTERNALSYM SDL_QUITMASK}
+ SDL_SYSWMEVENTMASK = 1 shl SDL_SYSWMEVENT;
+{$EXTERNALSYM SDL_SYSWMEVENTMASK}
+
+ { This function allows you to set the state of processing certain events.
+ If 'state' is set to SDL_IGNORE, that event will be automatically dropped
+ from the event queue and will not event be filtered.
+ If 'state' is set to SDL_ENABLE, that event will be processed normally.
+ If 'state' is set to SDL_QUERY, SDL_EventState() will return the
+ current processing state of the specified event. }
+
+ SDL_QUERY = -1;
+{$EXTERNALSYM SDL_QUERY}
+ SDL_IGNORE = 0;
+{$EXTERNALSYM SDL_IGNORE}
+ SDL_DISABLE = 0;
+{$EXTERNALSYM SDL_DISABLE}
+ SDL_ENABLE = 1;
+{$EXTERNALSYM SDL_ENABLE}
+
+ //SDL_keyboard.h constants
+ // This is the mask which refers to all hotkey bindings
+ SDL_ALL_HOTKEYS = $FFFFFFFF;
+{$EXTERNALSYM SDL_ALL_HOTKEYS}
+
+{ Enable/Disable keyboard repeat. Keyboard repeat defaults to off.
+ 'delay' is the initial delay in ms between the time when a key is
+ pressed, and keyboard repeat begins.
+ 'interval' is the time in ms between keyboard repeat events. }
+
+ SDL_DEFAULT_REPEAT_DELAY = 500;
+{$EXTERNALSYM SDL_DEFAULT_REPEAT_DELAY}
+ SDL_DEFAULT_REPEAT_INTERVAL = 30;
+{$EXTERNALSYM SDL_DEFAULT_REPEAT_INTERVAL}
+
+ // The keyboard syms have been cleverly chosen to map to ASCII
+ SDLK_UNKNOWN = 0;
+{$EXTERNALSYM SDLK_UNKNOWN}
+ SDLK_FIRST = 0;
+{$EXTERNALSYM SDLK_FIRST}
+ SDLK_BACKSPACE = 8;
+{$EXTERNALSYM SDLK_BACKSPACE}
+ SDLK_TAB = 9;
+{$EXTERNALSYM SDLK_TAB}
+ SDLK_CLEAR = 12;
+{$EXTERNALSYM SDLK_CLEAR}
+ SDLK_RETURN = 13;
+{$EXTERNALSYM SDLK_RETURN}
+ SDLK_PAUSE = 19;
+{$EXTERNALSYM SDLK_PAUSE}
+ SDLK_ESCAPE = 27;
+{$EXTERNALSYM SDLK_ESCAPE}
+ SDLK_SPACE = 32;
+{$EXTERNALSYM SDLK_SPACE}
+ SDLK_EXCLAIM = 33;
+{$EXTERNALSYM SDLK_EXCLAIM}
+ SDLK_QUOTEDBL = 34;
+{$EXTERNALSYM SDLK_QUOTEDBL}
+ SDLK_HASH = 35;
+{$EXTERNALSYM SDLK_HASH}
+ SDLK_DOLLAR = 36;
+{$EXTERNALSYM SDLK_DOLLAR}
+ SDLK_AMPERSAND = 38;
+{$EXTERNALSYM SDLK_AMPERSAND}
+ SDLK_QUOTE = 39;
+{$EXTERNALSYM SDLK_QUOTE}
+ SDLK_LEFTPAREN = 40;
+{$EXTERNALSYM SDLK_LEFTPAREN}
+ SDLK_RIGHTPAREN = 41;
+{$EXTERNALSYM SDLK_RIGHTPAREN}
+ SDLK_ASTERISK = 42;
+{$EXTERNALSYM SDLK_ASTERISK}
+ SDLK_PLUS = 43;
+{$EXTERNALSYM SDLK_PLUS}
+ SDLK_COMMA = 44;
+{$EXTERNALSYM SDLK_COMMA}
+ SDLK_MINUS = 45;
+{$EXTERNALSYM SDLK_MINUS}
+ SDLK_PERIOD = 46;
+{$EXTERNALSYM SDLK_PERIOD}
+ SDLK_SLASH = 47;
+{$EXTERNALSYM SDLK_SLASH}
+ SDLK_0 = 48;
+{$EXTERNALSYM SDLK_0}
+ SDLK_1 = 49;
+{$EXTERNALSYM SDLK_1}
+ SDLK_2 = 50;
+{$EXTERNALSYM SDLK_2}
+ SDLK_3 = 51;
+{$EXTERNALSYM SDLK_3}
+ SDLK_4 = 52;
+{$EXTERNALSYM SDLK_4}
+ SDLK_5 = 53;
+{$EXTERNALSYM SDLK_5}
+ SDLK_6 = 54;
+{$EXTERNALSYM SDLK_6}
+ SDLK_7 = 55;
+{$EXTERNALSYM SDLK_7}
+ SDLK_8 = 56;
+{$EXTERNALSYM SDLK_8}
+ SDLK_9 = 57;
+{$EXTERNALSYM SDLK_9}
+ SDLK_COLON = 58;
+{$EXTERNALSYM SDLK_COLON}
+ SDLK_SEMICOLON = 59;
+{$EXTERNALSYM SDLK_SEMICOLON}
+ SDLK_LESS = 60;
+{$EXTERNALSYM SDLK_LESS}
+ SDLK_EQUALS = 61;
+{$EXTERNALSYM SDLK_EQUALS}
+ SDLK_GREATER = 62;
+{$EXTERNALSYM SDLK_GREATER}
+ SDLK_QUESTION = 63;
+{$EXTERNALSYM SDLK_QUESTION}
+ SDLK_AT = 64;
+{$EXTERNALSYM SDLK_AT}
+
+ { Skip uppercase letters }
+
+ SDLK_LEFTBRACKET = 91;
+{$EXTERNALSYM SDLK_LEFTBRACKET}
+ SDLK_BACKSLASH = 92;
+{$EXTERNALSYM SDLK_BACKSLASH}
+ SDLK_RIGHTBRACKET = 93;
+{$EXTERNALSYM SDLK_RIGHTBRACKET}
+ SDLK_CARET = 94;
+{$EXTERNALSYM SDLK_CARET}
+ SDLK_UNDERSCORE = 95;
+{$EXTERNALSYM SDLK_UNDERSCORE}
+ SDLK_BACKQUOTE = 96;
+{$EXTERNALSYM SDLK_BACKQUOTE}
+ SDLK_a = 97;
+{$EXTERNALSYM SDLK_a}
+ SDLK_b = 98;
+{$EXTERNALSYM SDLK_b}
+ SDLK_c = 99;
+{$EXTERNALSYM SDLK_c}
+ SDLK_d = 100;
+{$EXTERNALSYM SDLK_d}
+ SDLK_e = 101;
+{$EXTERNALSYM SDLK_e}
+ SDLK_f = 102;
+{$EXTERNALSYM SDLK_f}
+ SDLK_g = 103;
+{$EXTERNALSYM SDLK_g}
+ SDLK_h = 104;
+{$EXTERNALSYM SDLK_h}
+ SDLK_i = 105;
+{$EXTERNALSYM SDLK_i}
+ SDLK_j = 106;
+{$EXTERNALSYM SDLK_j}
+ SDLK_k = 107;
+{$EXTERNALSYM SDLK_k}
+ SDLK_l = 108;
+{$EXTERNALSYM SDLK_l}
+ SDLK_m = 109;
+{$EXTERNALSYM SDLK_m}
+ SDLK_n = 110;
+{$EXTERNALSYM SDLK_n}
+ SDLK_o = 111;
+{$EXTERNALSYM SDLK_o}
+ SDLK_p = 112;
+{$EXTERNALSYM SDLK_p}
+ SDLK_q = 113;
+{$EXTERNALSYM SDLK_q}
+ SDLK_r = 114;
+{$EXTERNALSYM SDLK_r}
+ SDLK_s = 115;
+{$EXTERNALSYM SDLK_s}
+ SDLK_t = 116;
+{$EXTERNALSYM SDLK_t}
+ SDLK_u = 117;
+{$EXTERNALSYM SDLK_u}
+ SDLK_v = 118;
+{$EXTERNALSYM SDLK_v}
+ SDLK_w = 119;
+{$EXTERNALSYM SDLK_w}
+ SDLK_x = 120;
+{$EXTERNALSYM SDLK_x}
+ SDLK_y = 121;
+{$EXTERNALSYM SDLK_y}
+ SDLK_z = 122;
+{$EXTERNALSYM SDLK_z}
+ SDLK_DELETE = 127;
+{$EXTERNALSYM SDLK_DELETE}
+ // End of ASCII mapped keysyms
+
+ // International keyboard syms
+ SDLK_WORLD_0 = 160; // 0xA0
+{$EXTERNALSYM SDLK_WORLD_0}
+ SDLK_WORLD_1 = 161;
+{$EXTERNALSYM SDLK_WORLD_1}
+ SDLK_WORLD_2 = 162;
+{$EXTERNALSYM SDLK_WORLD_2}
+ SDLK_WORLD_3 = 163;
+{$EXTERNALSYM SDLK_WORLD_3}
+ SDLK_WORLD_4 = 164;
+{$EXTERNALSYM SDLK_WORLD_4}
+ SDLK_WORLD_5 = 165;
+{$EXTERNALSYM SDLK_WORLD_5}
+ SDLK_WORLD_6 = 166;
+{$EXTERNALSYM SDLK_WORLD_6}
+ SDLK_WORLD_7 = 167;
+{$EXTERNALSYM SDLK_WORLD_7}
+ SDLK_WORLD_8 = 168;
+{$EXTERNALSYM SDLK_WORLD_8}
+ SDLK_WORLD_9 = 169;
+{$EXTERNALSYM SDLK_WORLD_9}
+ SDLK_WORLD_10 = 170;
+{$EXTERNALSYM SDLK_WORLD_10}
+ SDLK_WORLD_11 = 171;
+{$EXTERNALSYM SDLK_WORLD_11}
+ SDLK_WORLD_12 = 172;
+{$EXTERNALSYM SDLK_WORLD_12}
+ SDLK_WORLD_13 = 173;
+{$EXTERNALSYM SDLK_WORLD_13}
+ SDLK_WORLD_14 = 174;
+{$EXTERNALSYM SDLK_WORLD_14}
+ SDLK_WORLD_15 = 175;
+{$EXTERNALSYM SDLK_WORLD_15}
+ SDLK_WORLD_16 = 176;
+{$EXTERNALSYM SDLK_WORLD_16}
+ SDLK_WORLD_17 = 177;
+{$EXTERNALSYM SDLK_WORLD_17}
+ SDLK_WORLD_18 = 178;
+{$EXTERNALSYM SDLK_WORLD_18}
+ SDLK_WORLD_19 = 179;
+{$EXTERNALSYM SDLK_WORLD_19}
+ SDLK_WORLD_20 = 180;
+{$EXTERNALSYM SDLK_WORLD_20}
+ SDLK_WORLD_21 = 181;
+{$EXTERNALSYM SDLK_WORLD_21}
+ SDLK_WORLD_22 = 182;
+{$EXTERNALSYM SDLK_WORLD_22}
+ SDLK_WORLD_23 = 183;
+{$EXTERNALSYM SDLK_WORLD_23}
+ SDLK_WORLD_24 = 184;
+{$EXTERNALSYM SDLK_WORLD_24}
+ SDLK_WORLD_25 = 185;
+{$EXTERNALSYM SDLK_WORLD_25}
+ SDLK_WORLD_26 = 186;
+{$EXTERNALSYM SDLK_WORLD_26}
+ SDLK_WORLD_27 = 187;
+{$EXTERNALSYM SDLK_WORLD_27}
+ SDLK_WORLD_28 = 188;
+{$EXTERNALSYM SDLK_WORLD_28}
+ SDLK_WORLD_29 = 189;
+{$EXTERNALSYM SDLK_WORLD_29}
+ SDLK_WORLD_30 = 190;
+{$EXTERNALSYM SDLK_WORLD_30}
+ SDLK_WORLD_31 = 191;
+{$EXTERNALSYM SDLK_WORLD_31}
+ SDLK_WORLD_32 = 192;
+{$EXTERNALSYM SDLK_WORLD_32}
+ SDLK_WORLD_33 = 193;
+{$EXTERNALSYM SDLK_WORLD_33}
+ SDLK_WORLD_34 = 194;
+{$EXTERNALSYM SDLK_WORLD_34}
+ SDLK_WORLD_35 = 195;
+{$EXTERNALSYM SDLK_WORLD_35}
+ SDLK_WORLD_36 = 196;
+{$EXTERNALSYM SDLK_WORLD_36}
+ SDLK_WORLD_37 = 197;
+{$EXTERNALSYM SDLK_WORLD_37}
+ SDLK_WORLD_38 = 198;
+{$EXTERNALSYM SDLK_WORLD_38}
+ SDLK_WORLD_39 = 199;
+{$EXTERNALSYM SDLK_WORLD_39}
+ SDLK_WORLD_40 = 200;
+{$EXTERNALSYM SDLK_WORLD_40}
+ SDLK_WORLD_41 = 201;
+{$EXTERNALSYM SDLK_WORLD_41}
+ SDLK_WORLD_42 = 202;
+{$EXTERNALSYM SDLK_WORLD_42}
+ SDLK_WORLD_43 = 203;
+{$EXTERNALSYM SDLK_WORLD_43}
+ SDLK_WORLD_44 = 204;
+{$EXTERNALSYM SDLK_WORLD_44}
+ SDLK_WORLD_45 = 205;
+{$EXTERNALSYM SDLK_WORLD_45}
+ SDLK_WORLD_46 = 206;
+{$EXTERNALSYM SDLK_WORLD_46}
+ SDLK_WORLD_47 = 207;
+{$EXTERNALSYM SDLK_WORLD_47}
+ SDLK_WORLD_48 = 208;
+{$EXTERNALSYM SDLK_WORLD_48}
+ SDLK_WORLD_49 = 209;
+{$EXTERNALSYM SDLK_WORLD_49}
+ SDLK_WORLD_50 = 210;
+{$EXTERNALSYM SDLK_WORLD_50}
+ SDLK_WORLD_51 = 211;
+{$EXTERNALSYM SDLK_WORLD_51}
+ SDLK_WORLD_52 = 212;
+{$EXTERNALSYM SDLK_WORLD_52}
+ SDLK_WORLD_53 = 213;
+{$EXTERNALSYM SDLK_WORLD_53}
+ SDLK_WORLD_54 = 214;
+{$EXTERNALSYM SDLK_WORLD_54}
+ SDLK_WORLD_55 = 215;
+{$EXTERNALSYM SDLK_WORLD_55}
+ SDLK_WORLD_56 = 216;
+{$EXTERNALSYM SDLK_WORLD_56}
+ SDLK_WORLD_57 = 217;
+{$EXTERNALSYM SDLK_WORLD_57}
+ SDLK_WORLD_58 = 218;
+{$EXTERNALSYM SDLK_WORLD_58}
+ SDLK_WORLD_59 = 219;
+{$EXTERNALSYM SDLK_WORLD_59}
+ SDLK_WORLD_60 = 220;
+{$EXTERNALSYM SDLK_WORLD_60}
+ SDLK_WORLD_61 = 221;
+{$EXTERNALSYM SDLK_WORLD_61}
+ SDLK_WORLD_62 = 222;
+{$EXTERNALSYM SDLK_WORLD_62}
+ SDLK_WORLD_63 = 223;
+{$EXTERNALSYM SDLK_WORLD_63}
+ SDLK_WORLD_64 = 224;
+{$EXTERNALSYM SDLK_WORLD_64}
+ SDLK_WORLD_65 = 225;
+{$EXTERNALSYM SDLK_WORLD_65}
+ SDLK_WORLD_66 = 226;
+{$EXTERNALSYM SDLK_WORLD_66}
+ SDLK_WORLD_67 = 227;
+{$EXTERNALSYM SDLK_WORLD_67}
+ SDLK_WORLD_68 = 228;
+{$EXTERNALSYM SDLK_WORLD_68}
+ SDLK_WORLD_69 = 229;
+{$EXTERNALSYM SDLK_WORLD_69}
+ SDLK_WORLD_70 = 230;
+{$EXTERNALSYM SDLK_WORLD_70}
+ SDLK_WORLD_71 = 231;
+{$EXTERNALSYM SDLK_WORLD_71}
+ SDLK_WORLD_72 = 232;
+{$EXTERNALSYM SDLK_WORLD_72}
+ SDLK_WORLD_73 = 233;
+{$EXTERNALSYM SDLK_WORLD_73}
+ SDLK_WORLD_74 = 234;
+{$EXTERNALSYM SDLK_WORLD_74}
+ SDLK_WORLD_75 = 235;
+{$EXTERNALSYM SDLK_WORLD_75}
+ SDLK_WORLD_76 = 236;
+{$EXTERNALSYM SDLK_WORLD_76}
+ SDLK_WORLD_77 = 237;
+{$EXTERNALSYM SDLK_WORLD_77}
+ SDLK_WORLD_78 = 238;
+{$EXTERNALSYM SDLK_WORLD_78}
+ SDLK_WORLD_79 = 239;
+{$EXTERNALSYM SDLK_WORLD_79}
+ SDLK_WORLD_80 = 240;
+{$EXTERNALSYM SDLK_WORLD_80}
+ SDLK_WORLD_81 = 241;
+{$EXTERNALSYM SDLK_WORLD_81}
+ SDLK_WORLD_82 = 242;
+{$EXTERNALSYM SDLK_WORLD_82}
+ SDLK_WORLD_83 = 243;
+{$EXTERNALSYM SDLK_WORLD_83}
+ SDLK_WORLD_84 = 244;
+{$EXTERNALSYM SDLK_WORLD_84}
+ SDLK_WORLD_85 = 245;
+{$EXTERNALSYM SDLK_WORLD_85}
+ SDLK_WORLD_86 = 246;
+{$EXTERNALSYM SDLK_WORLD_86}
+ SDLK_WORLD_87 = 247;
+{$EXTERNALSYM SDLK_WORLD_87}
+ SDLK_WORLD_88 = 248;
+{$EXTERNALSYM SDLK_WORLD_88}
+ SDLK_WORLD_89 = 249;
+{$EXTERNALSYM SDLK_WORLD_89}
+ SDLK_WORLD_90 = 250;
+{$EXTERNALSYM SDLK_WORLD_90}
+ SDLK_WORLD_91 = 251;
+{$EXTERNALSYM SDLK_WORLD_91}
+ SDLK_WORLD_92 = 252;
+{$EXTERNALSYM SDLK_WORLD_92}
+ SDLK_WORLD_93 = 253;
+{$EXTERNALSYM SDLK_WORLD_93}
+ SDLK_WORLD_94 = 254;
+{$EXTERNALSYM SDLK_WORLD_94}
+ SDLK_WORLD_95 = 255; // 0xFF
+{$EXTERNALSYM SDLK_WORLD_95}
+
+ // Numeric keypad
+ SDLK_KP0 = 256;
+{$EXTERNALSYM SDLK_KP0}
+ SDLK_KP1 = 257;
+{$EXTERNALSYM SDLK_KP1}
+ SDLK_KP2 = 258;
+{$EXTERNALSYM SDLK_KP2}
+ SDLK_KP3 = 259;
+{$EXTERNALSYM SDLK_KP3}
+ SDLK_KP4 = 260;
+{$EXTERNALSYM SDLK_KP4}
+ SDLK_KP5 = 261;
+{$EXTERNALSYM SDLK_KP5}
+ SDLK_KP6 = 262;
+{$EXTERNALSYM SDLK_KP6}
+ SDLK_KP7 = 263;
+{$EXTERNALSYM SDLK_KP7}
+ SDLK_KP8 = 264;
+{$EXTERNALSYM SDLK_KP8}
+ SDLK_KP9 = 265;
+{$EXTERNALSYM SDLK_KP9}
+ SDLK_KP_PERIOD = 266;
+{$EXTERNALSYM SDLK_KP_PERIOD}
+ SDLK_KP_DIVIDE = 267;
+{$EXTERNALSYM SDLK_KP_DIVIDE}
+ SDLK_KP_MULTIPLY = 268;
+{$EXTERNALSYM SDLK_KP_MULTIPLY}
+ SDLK_KP_MINUS = 269;
+{$EXTERNALSYM SDLK_KP_MINUS}
+ SDLK_KP_PLUS = 270;
+{$EXTERNALSYM SDLK_KP_PLUS}
+ SDLK_KP_ENTER = 271;
+{$EXTERNALSYM SDLK_KP_ENTER}
+ SDLK_KP_EQUALS = 272;
+{$EXTERNALSYM SDLK_KP_EQUALS}
+
+ // Arrows + Home/End pad
+ SDLK_UP = 273;
+{$EXTERNALSYM SDLK_UP}
+ SDLK_DOWN = 274;
+{$EXTERNALSYM SDLK_DOWN}
+ SDLK_RIGHT = 275;
+{$EXTERNALSYM SDLK_RIGHT}
+ SDLK_LEFT = 276;
+{$EXTERNALSYM SDLK_LEFT}
+ SDLK_INSERT = 277;
+{$EXTERNALSYM SDLK_INSERT}
+ SDLK_HOME = 278;
+{$EXTERNALSYM SDLK_HOME}
+ SDLK_END = 279;
+{$EXTERNALSYM SDLK_END}
+ SDLK_PAGEUP = 280;
+{$EXTERNALSYM SDLK_PAGEUP}
+ SDLK_PAGEDOWN = 281;
+{$EXTERNALSYM SDLK_PAGEDOWN}
+
+ // Function keys
+ SDLK_F1 = 282;
+{$EXTERNALSYM SDLK_F1}
+ SDLK_F2 = 283;
+{$EXTERNALSYM SDLK_F2}
+ SDLK_F3 = 284;
+{$EXTERNALSYM SDLK_F3}
+ SDLK_F4 = 285;
+{$EXTERNALSYM SDLK_F4}
+ SDLK_F5 = 286;
+{$EXTERNALSYM SDLK_F5}
+ SDLK_F6 = 287;
+{$EXTERNALSYM SDLK_F6}
+ SDLK_F7 = 288;
+{$EXTERNALSYM SDLK_F7}
+ SDLK_F8 = 289;
+{$EXTERNALSYM SDLK_F8}
+ SDLK_F9 = 290;
+{$EXTERNALSYM SDLK_F9}
+ SDLK_F10 = 291;
+{$EXTERNALSYM SDLK_F10}
+ SDLK_F11 = 292;
+{$EXTERNALSYM SDLK_F11}
+ SDLK_F12 = 293;
+{$EXTERNALSYM SDLK_F12}
+ SDLK_F13 = 294;
+{$EXTERNALSYM SDLK_F13}
+ SDLK_F14 = 295;
+{$EXTERNALSYM SDLK_F14}
+ SDLK_F15 = 296;
+{$EXTERNALSYM SDLK_F15}
+
+ // Key state modifier keys
+ SDLK_NUMLOCK = 300;
+{$EXTERNALSYM SDLK_NUMLOCK}
+ SDLK_CAPSLOCK = 301;
+{$EXTERNALSYM SDLK_CAPSLOCK}
+ SDLK_SCROLLOCK = 302;
+{$EXTERNALSYM SDLK_SCROLLOCK}
+ SDLK_RSHIFT = 303;
+{$EXTERNALSYM SDLK_RSHIFT}
+ SDLK_LSHIFT = 304;
+{$EXTERNALSYM SDLK_LSHIFT}
+ SDLK_RCTRL = 305;
+{$EXTERNALSYM SDLK_RCTRL}
+ SDLK_LCTRL = 306;
+{$EXTERNALSYM SDLK_LCTRL}
+ SDLK_RALT = 307;
+{$EXTERNALSYM SDLK_RALT}
+ SDLK_LALT = 308;
+{$EXTERNALSYM SDLK_LALT}
+ SDLK_RMETA = 309;
+{$EXTERNALSYM SDLK_RMETA}
+ SDLK_LMETA = 310;
+{$EXTERNALSYM SDLK_LMETA}
+ SDLK_LSUPER = 311; // Left "Windows" key
+{$EXTERNALSYM SDLK_LSUPER}
+ SDLK_RSUPER = 312; // Right "Windows" key
+{$EXTERNALSYM SDLK_RSUPER}
+ SDLK_MODE = 313; // "Alt Gr" key
+{$EXTERNALSYM SDLK_MODE}
+ SDLK_COMPOSE = 314; // Multi-key compose key
+{$EXTERNALSYM SDLK_COMPOSE}
+
+ // Miscellaneous function keys
+ SDLK_HELP = 315;
+{$EXTERNALSYM SDLK_HELP}
+ SDLK_PRINT = 316;
+{$EXTERNALSYM SDLK_PRINT}
+ SDLK_SYSREQ = 317;
+{$EXTERNALSYM SDLK_SYSREQ}
+ SDLK_BREAK = 318;
+{$EXTERNALSYM SDLK_BREAK}
+ SDLK_MENU = 319;
+{$EXTERNALSYM SDLK_MENU}
+ SDLK_POWER = 320; // Power Macintosh power key
+{$EXTERNALSYM SDLK_POWER}
+ SDLK_EURO = 321; // Some european keyboards
+{$EXTERNALSYM SDLK_EURO}
+
+{$IFDEF GP2X}
+SDLK_GP2X_UP = 0;
+{$EXTERNALSYM SDLK_GP2X_UP}
+SDLK_GP2X_UPLEFT = 1;
+{$EXTERNALSYM SDLK_GP2X_UPLEFT}
+SDLK_GP2X_LEFT = 2;
+{$EXTERNALSYM SDLK_GP2X_LEFT}
+SDLK_GP2X_DOWNLEFT = 3;
+{$EXTERNALSYM SDLK_GP2X_DOWNLEFT}
+SDLK_GP2X_DOWN = 4;
+{$EXTERNALSYM SDLK_GP2X_DOWN}
+SDLK_GP2X_DOWNRIGHT = 5;
+{$EXTERNALSYM SDLK_GP2X_DOWNRIGHT}
+SDLK_GP2X_RIGHT = 6;
+{$EXTERNALSYM SDLK_GP2X_RIGHT}
+SDLK_GP2X_UPRIGHT = 7;
+{$EXTERNALSYM SDLK_GP2X_UPRIGHT}
+SDLK_GP2X_START = 8;
+{$EXTERNALSYM SDLK_GP2X_START}
+SDLK_GP2X_SELECT = 9;
+{$EXTERNALSYM SDLK_GP2X_SELECT}
+SDLK_GP2X_L = 10;
+{$EXTERNALSYM SDLK_GP2X_L}
+SDLK_GP2X_R = 11;
+{$EXTERNALSYM SDLK_GP2X_R}
+SDLK_GP2X_A = 12;
+{$EXTERNALSYM SDLK_GP2X_A}
+SDLK_GP2X_B = 13;
+{$EXTERNALSYM SDLK_GP2X_B}
+SDLK_GP2X_Y = 14;
+{$EXTERNALSYM SDLK_GP2X_Y}
+SDLK_GP2X_X = 15;
+{$EXTERNALSYM SDLK_GP2X_X}
+SDLK_GP2X_VOLUP = 16;
+{$EXTERNALSYM SDLK_GP2X_VOLUP}
+SDLK_GP2X_VOLDOWN = 17;
+{$EXTERNALSYM SDLK_GP2X_VOLDOWN}
+SDLK_GP2X_CLICK = 18;
+{$EXTERNALSYM SDLK_GP2X_CLICK}
+{$ENDIF}
+
+ // Enumeration of valid key mods (possibly OR'd together)
+ KMOD_NONE = $0000;
+{$EXTERNALSYM KMOD_NONE}
+ KMOD_LSHIFT = $0001;
+{$EXTERNALSYM KMOD_LSHIFT}
+ KMOD_RSHIFT = $0002;
+{$EXTERNALSYM KMOD_RSHIFT}
+ KMOD_LCTRL = $0040;
+{$EXTERNALSYM KMOD_LCTRL}
+ KMOD_RCTRL = $0080;
+{$EXTERNALSYM KMOD_RCTRL}
+ KMOD_LALT = $0100;
+{$EXTERNALSYM KMOD_LALT}
+ KMOD_RALT = $0200;
+{$EXTERNALSYM KMOD_RALT}
+ KMOD_LMETA = $0400;
+{$EXTERNALSYM KMOD_LMETA}
+ KMOD_RMETA = $0800;
+{$EXTERNALSYM KMOD_RMETA}
+ KMOD_NUM = $1000;
+{$EXTERNALSYM KMOD_NUM}
+ KMOD_CAPS = $2000;
+{$EXTERNALSYM KMOD_CAPS}
+ KMOD_MODE = 44000;
+{$EXTERNALSYM KMOD_MODE}
+ KMOD_RESERVED = $8000;
+{$EXTERNALSYM KMOD_RESERVED}
+
+ KMOD_CTRL = (KMOD_LCTRL or KMOD_RCTRL);
+{$EXTERNALSYM KMOD_CTRL}
+ KMOD_SHIFT = (KMOD_LSHIFT or KMOD_RSHIFT);
+{$EXTERNALSYM KMOD_SHIFT}
+ KMOD_ALT = (KMOD_LALT or KMOD_RALT);
+{$EXTERNALSYM KMOD_ALT}
+ KMOD_META = (KMOD_LMETA or KMOD_RMETA);
+{$EXTERNALSYM KMOD_META}
+
+ //SDL_video.h constants
+ // Transparency definitions: These define alpha as the opacity of a surface */
+ SDL_ALPHA_OPAQUE = 255;
+{$EXTERNALSYM SDL_ALPHA_OPAQUE}
+ SDL_ALPHA_TRANSPARENT = 0;
+{$EXTERNALSYM SDL_ALPHA_TRANSPARENT}
+
+ // These are the currently supported flags for the SDL_surface
+ // Available for SDL_CreateRGBSurface() or SDL_SetVideoMode()
+ SDL_SWSURFACE = $00000000; // Surface is in system memory
+{$EXTERNALSYM SDL_SWSURFACE}
+ SDL_HWSURFACE = $00000001; // Surface is in video memory
+{$EXTERNALSYM SDL_HWSURFACE}
+ SDL_ASYNCBLIT = $00000004; // Use asynchronous blits if possible
+{$EXTERNALSYM SDL_ASYNCBLIT}
+ // Available for SDL_SetVideoMode()
+ SDL_ANYFORMAT = $10000000; // Allow any video depth/pixel-format
+{$EXTERNALSYM SDL_ANYFORMAT}
+ SDL_HWPALETTE = $20000000; // Surface has exclusive palette
+{$EXTERNALSYM SDL_HWPALETTE}
+ SDL_DOUBLEBUF = $40000000; // Set up double-buffered video mode
+{$EXTERNALSYM SDL_DOUBLEBUF}
+ SDL_FULLSCREEN = $80000000; // Surface is a full screen display
+{$EXTERNALSYM SDL_FULLSCREEN}
+ SDL_OPENGL = $00000002; // Create an OpenGL rendering context
+{$EXTERNALSYM SDL_OPENGL}
+ SDL_OPENGLBLIT = $00000002; // Create an OpenGL rendering context
+{$EXTERNALSYM SDL_OPENGLBLIT}
+ SDL_RESIZABLE = $00000010; // This video mode may be resized
+{$EXTERNALSYM SDL_RESIZABLE}
+ SDL_NOFRAME = $00000020; // No window caption or edge frame
+{$EXTERNALSYM SDL_NOFRAME}
+ // Used internally (read-only)
+ SDL_HWACCEL = $00000100; // Blit uses hardware acceleration
+{$EXTERNALSYM SDL_HWACCEL}
+ SDL_SRCCOLORKEY = $00001000; // Blit uses a source color key
+{$EXTERNALSYM SDL_SRCCOLORKEY}
+ SDL_RLEACCELOK = $00002000; // Private flag
+{$EXTERNALSYM SDL_RLEACCELOK}
+ SDL_RLEACCEL = $00004000; // Colorkey blit is RLE accelerated
+{$EXTERNALSYM SDL_RLEACCEL}
+ SDL_SRCALPHA = $00010000; // Blit uses source alpha blending
+{$EXTERNALSYM SDL_SRCALPHA}
+ SDL_SRCCLIPPING = $00100000; // Blit uses source clipping
+{$EXTERNALSYM SDL_SRCCLIPPING}
+ SDL_PREALLOC = $01000000; // Surface uses preallocated memory
+{$EXTERNALSYM SDL_PREALLOC}
+
+ { The most common video overlay formats.
+ For an explanation of these pixel formats, see:
+ http://www.webartz.com/fourcc/indexyuv.htm
+
+ For information on the relationship between color spaces, see:
+ http://www.neuro.sfc.keio.ac.jp/~aly/polygon/info/color-space-faq.html }
+
+ SDL_YV12_OVERLAY = $32315659; // Planar mode: Y + V + U (3 planes)
+{$EXTERNALSYM SDL_YV12_OVERLAY}
+ SDL_IYUV_OVERLAY = $56555949; // Planar mode: Y + U + V (3 planes)
+{$EXTERNALSYM SDL_IYUV_OVERLAY}
+ SDL_YUY2_OVERLAY = $32595559; // Packed mode: Y0+U0+Y1+V0 (1 plane)
+{$EXTERNALSYM SDL_YUY2_OVERLAY}
+ SDL_UYVY_OVERLAY = $59565955; // Packed mode: U0+Y0+V0+Y1 (1 plane)
+{$EXTERNALSYM SDL_UYVY_OVERLAY}
+ SDL_YVYU_OVERLAY = $55595659; // Packed mode: Y0+V0+Y1+U0 (1 plane)
+{$EXTERNALSYM SDL_YVYU_OVERLAY}
+
+ // flags for SDL_SetPalette()
+ SDL_LOGPAL = $01;
+{$EXTERNALSYM SDL_LOGPAL}
+ SDL_PHYSPAL = $02;
+{$EXTERNALSYM SDL_PHYSPAL}
+
+ //SDL_mouse.h constants
+ { Used as a mask when testing buttons in buttonstate
+ Button 1: Left mouse button
+ Button 2: Middle mouse button
+ Button 3: Right mouse button
+ Button 4: Mouse Wheel Up (may also be a real button)
+ Button 5: Mouse Wheel Down (may also be a real button)
+ Button 6: Mouse X1 (may also be a real button)
+ Button 7: Mouse X2 (may also be a real button)
+ }
+ SDL_BUTTON_LEFT = 1;
+{$EXTERNALSYM SDL_BUTTON_LEFT}
+ SDL_BUTTON_MIDDLE = 2;
+{$EXTERNALSYM SDL_BUTTON_MIDDLE}
+ SDL_BUTTON_RIGHT = 3;
+{$EXTERNALSYM SDL_BUTTON_RIGHT}
+ SDL_BUTTON_WHEELUP = 4;
+{$EXTERNALSYM SDL_BUTTON_WHEELUP}
+ SDL_BUTTON_WHEELDOWN = 5;
+{$EXTERNALSYM SDL_BUTTON_WHEELDOWN}
+ SDL_BUTTON_X1 = 6;
+{$EXTERNALSYM SDL_BUTTON_X1}
+ SDL_BUTTON_X2 = 7;
+{$EXTERNALSYM SDL_BUTTON_X2}
+
+ SDL_BUTTON_LMASK = SDL_PRESSED shl (SDL_BUTTON_LEFT - 1);
+{$EXTERNALSYM SDL_BUTTON_LMASK}
+ SDL_BUTTON_MMASK = SDL_PRESSED shl (SDL_BUTTON_MIDDLE - 1);
+{$EXTERNALSYM SDL_BUTTON_MMASK}
+ SDL_BUTTON_RMASK = SDL_PRESSED shl (SDL_BUTTON_RIGHT - 1);
+{$EXTERNALSYM SDL_BUTTON_RMASK}
+ SDL_BUTTON_X1MASK = SDL_PRESSED shl (SDL_BUTTON_X1 - 1);
+{$EXTERNALSYM SDL_BUTTON_X1MASK}
+ SDL_BUTTON_X2MASK = SDL_PRESSED shl (SDL_BUTTON_X2 - 1);
+{$EXTERNALSYM SDL_BUTTON_X2MASK}
+
+ // SDL_active.h constants
+ // The available application states
+ SDL_APPMOUSEFOCUS = $01; // The app has mouse coverage
+{$EXTERNALSYM SDL_APPMOUSEFOCUS}
+ SDL_APPINPUTFOCUS = $02; // The app has input focus
+{$EXTERNALSYM SDL_APPINPUTFOCUS}
+ SDL_APPACTIVE = $04; // The application is active
+{$EXTERNALSYM SDL_APPACTIVE}
+
+ // SDL_mutex.h constants
+ // Synchronization functions which can time out return this value
+ // they time out.
+
+ SDL_MUTEX_TIMEDOUT = 1;
+{$EXTERNALSYM SDL_MUTEX_TIMEDOUT}
+
+ // This is the timeout value which corresponds to never time out
+ SDL_MUTEX_MAXWAIT = not Cardinal(0);
+{$EXTERNALSYM SDL_MUTEX_MAXWAIT}
+
+ {TSDL_GrabMode = (
+ SDL_GRAB_QUERY,
+ SDL_GRAB_OFF,
+ SDL_GRAB_ON,
+ SDL_GRAB_FULLSCREEN ); // Used internally}
+ SDL_GRAB_QUERY = -1;
+ SDL_GRAB_OFF = 0;
+ SDL_GRAB_ON = 1;
+ //SDL_GRAB_FULLSCREEN // Used internally
+
+type
+ THandle = Cardinal;
+ //SDL_types.h types
+ // Basic data types
+
+ SDL_Bool = (SDL_FALSE, SDL_TRUE);
+ TSDL_Bool = SDL_Bool;
+
+ PUInt8Array = ^TUInt8Array;
+ PUInt8 = ^UInt8;
+ PPUInt8 = ^PUInt8;
+ UInt8 = Byte;
+{$EXTERNALSYM UInt8}
+ TUInt8Array = array [0..MAXINT shr 1] of UInt8;
+
+ PUInt16 = ^UInt16;
+ UInt16 = word;
+{$EXTERNALSYM UInt16}
+
+ PSInt8 = ^SInt8;
+ SInt8 = Shortint;
+{$EXTERNALSYM SInt8}
+
+ PSInt16 = ^SInt16;
+ SInt16 = smallint;
+{$EXTERNALSYM SInt16}
+
+ PUInt32 = ^UInt32;
+ UInt32 = Cardinal;
+{$EXTERNALSYM UInt32}
+
+ SInt32 = Integer;
+{$EXTERNALSYM SInt32}
+
+ PInt = ^Integer;
+
+ PShortInt = ^ShortInt;
+
+ PUInt64 = ^UInt64;
+ UInt64 = record
+ hi: UInt32;
+ lo: UInt32;
+ end;
+{$EXTERNALSYM UInt64}
+
+ PSInt64 = ^SInt64;
+ SInt64 = record
+ hi: UInt32;
+ lo: UInt32;
+ end;
+{$EXTERNALSYM SInt64}
+
+ TSDL_GrabMode = Integer;
+
+ // SDL_error.h types
+ TSDL_errorcode = (
+ SDL_ENOMEM,
+ SDL_EFREAD,
+ SDL_EFWRITE,
+ SDL_EFSEEK,
+ SDL_LASTERROR);
+
+ SDL_errorcode = TSDL_errorcode;
+{$EXTERNALSYM SDL_errorcode}
+
+ TArg = record
+ case Byte of
+ 0: (value_ptr: Pointer);
+ (* #if 0 means: never
+ 1 : ( value_c : Byte );
+ *)
+ 2: (value_i: Integer);
+ 3: (value_f: double);
+ 4: (buf: array[0..ERR_MAX_STRLEN - 1] of Byte);
+ end;
+
+ PSDL_error = ^TSDL_error;
+ TSDL_error = record
+ { This is a numeric value corresponding to the current error }
+ error: Integer;
+
+ { This is a key used to index into a language hashtable containing
+ internationalized versions of the SDL error messages. If the key
+ is not in the hashtable, or no hashtable is available, the key is
+ used directly as an error message format string. }
+ key: array[0..ERR_MAX_STRLEN - 1] of Byte;
+
+ { These are the arguments for the error functions }
+ argc: Integer;
+ args: array[0..ERR_MAX_ARGS - 1] of TArg;
+ end;
+
+ // SDL_rwops.h types
+ // This is the read/write operation structure -- very basic
+ // some helper types to handle the unions
+ // "packed" is only guessed
+
+ TStdio = record
+ autoclose: Integer;
+ // FILE * is only defined in Kylix so we use a simple Pointer
+ fp: Pointer;
+ end;
+
+ TMem = record
+ base: PUInt8;
+ here: PUInt8;
+ stop: PUInt8;
+ end;
+
+ TUnknown = record
+ data1: Pointer;
+ end;
+
+ // first declare the pointer type
+ PSDL_RWops = ^TSDL_RWops;
+ // now the pointer to function types
+ {$IFNDEF __GPC__}
+ TSeek = function( context: PSDL_RWops; offset: Integer; whence: Integer ): Integer; cdecl;
+ TRead = function( context: PSDL_RWops; Ptr: Pointer; size: Integer; maxnum : Integer ): Integer; cdecl;
+ TWrite = function( context: PSDL_RWops; Ptr: Pointer; size: Integer; num: Integer ): Integer; cdecl;
+ TClose = function( context: PSDL_RWops ): Integer; cdecl;
+ {$ELSE}
+ TSeek = function( context: PSDL_RWops; offset: Integer; whence: Integer ): Integer;
+ TRead = function( context: PSDL_RWops; Ptr: Pointer; size: Integer; maxnum : Integer ): Integer;
+ TWrite = function( context: PSDL_RWops; Ptr: Pointer; size: Integer; num: Integer ): Integer;
+ TClose = function( context: PSDL_RWops ): Integer;
+ {$ENDIF}
+ // the variant record itself
+ TSDL_RWops = record
+ seek: TSeek;
+ read: TRead;
+ write: TWrite;
+ close: TClose;
+ // a keyword as name is not allowed
+ type_: UInt32;
+ // be warned! structure alignment may arise at this point
+ case Integer of
+ 0: (stdio: TStdio);
+ 1: (mem: TMem);
+ 2: (unknown: TUnknown);
+ end;
+
+ SDL_RWops = TSDL_RWops;
+{$EXTERNALSYM SDL_RWops}
+
+
+ // SDL_timer.h types
+ // Function prototype for the timer callback function
+ {$IFNDEF __GPC__}
+ TSDL_TimerCallback = function( interval: UInt32 ): UInt32; cdecl;
+ {$ELSE}
+ TSDL_TimerCallback = function( interval: UInt32 ): UInt32;
+ {$ENDIF}
+
+ { New timer API, supports multiple timers
+ Written by Stephane Peter <megastep@lokigames.com> }
+
+ { Function prototype for the new timer callback function.
+ The callback function is passed the current timer interval and returns
+ the next timer interval. If the returned value is the same as the one
+ passed in, the periodic alarm continues, otherwise a new alarm is
+ scheduled. If the callback returns 0, the periodic alarm is cancelled. }
+ {$IFNDEF __GPC__}
+ TSDL_NewTimerCallback = function( interval: UInt32; param: Pointer ): UInt32; cdecl;
+ {$ELSE}
+ TSDL_NewTimerCallback = function( interval: UInt32; param: Pointer ): UInt32;
+ {$ENDIF}
+
+ // Definition of the timer ID type
+ PSDL_TimerID = ^TSDL_TimerID;
+ TSDL_TimerID = record
+ interval: UInt32;
+ callback: TSDL_NewTimerCallback;
+ param: Pointer;
+ last_alarm: UInt32;
+ next: PSDL_TimerID;
+ end;
+
+ {$IFNDEF __GPC__}
+ TSDL_AudioSpecCallback = procedure( userdata: Pointer; stream: PUInt8; len: Integer ); cdecl;
+ {$ELSE}
+ TSDL_AudioSpecCallback = procedure( userdata: Pointer; stream: PUInt8; len: Integer );
+ {$ENDIF}
+
+ // SDL_audio.h types
+ // The calculated values in this structure are calculated by SDL_OpenAudio()
+ PSDL_AudioSpec = ^TSDL_AudioSpec;
+ TSDL_AudioSpec = record
+ freq: Integer; // DSP frequency -- samples per second
+ format: UInt16; // Audio data format
+ channels: UInt8; // Number of channels: 1 mono, 2 stereo
+ silence: UInt8; // Audio buffer silence value (calculated)
+ samples: UInt16; // Audio buffer size in samples
+ padding: UInt16; // Necessary for some compile environments
+ size: UInt32; // Audio buffer size in bytes (calculated)
+ { This function is called when the audio device needs more data.
+ 'stream' is a pointer to the audio data buffer
+ 'len' is the length of that buffer in bytes.
+ Once the callback returns, the buffer will no longer be valid.
+ Stereo samples are stored in a LRLRLR ordering.}
+ callback: TSDL_AudioSpecCallback;
+ userdata: Pointer;
+ end;
+
+ // A structure to hold a set of audio conversion filters and buffers
+ PSDL_AudioCVT = ^TSDL_AudioCVT;
+
+ PSDL_AudioCVTFilter = ^TSDL_AudioCVTFilter;
+ TSDL_AudioCVTFilter = record
+ cvt: PSDL_AudioCVT;
+ format: UInt16;
+ end;
+
+ PSDL_AudioCVTFilterArray = ^TSDL_AudioCVTFilterArray;
+ TSDL_AudioCVTFilterArray = array[0..9] of PSDL_AudioCVTFilter;
+
+ TSDL_AudioCVT = record
+ needed: Integer; // Set to 1 if conversion possible
+ src_format: UInt16; // Source audio format
+ dst_format: UInt16; // Target audio format
+ rate_incr: double; // Rate conversion increment
+ buf: PUInt8; // Buffer to hold entire audio data
+ len: Integer; // Length of original audio buffer
+ len_cvt: Integer; // Length of converted audio buffer
+ len_mult: Integer; // buffer must be len*len_mult big
+ len_ratio: double; // Given len, final size is len*len_ratio
+ filters: TSDL_AudioCVTFilterArray;
+ filter_index: Integer; // Current audio conversion function
+ end;
+
+ TSDL_Audiostatus = (
+ SDL_AUDIO_STOPPED,
+ SDL_AUDIO_PLAYING,
+ SDL_AUDIO_PAUSED
+ );
+
+ // SDL_cdrom.h types
+ TSDL_CDStatus = (
+ CD_ERROR,
+ CD_TRAYEMPTY,
+ CD_STOPPED,
+ CD_PLAYING,
+ CD_PAUSED );
+
+ PSDL_CDTrack = ^TSDL_CDTrack;
+ TSDL_CDTrack = record
+ id: UInt8; // Track number
+ type_: UInt8; // Data or audio track
+ unused: UInt16;
+ length: UInt32; // Length, in frames, of this track
+ offset: UInt32; // Offset, in frames, from start of disk
+ end;
+
+ // This structure is only current as of the last call to SDL_CDStatus()
+ PSDL_CD = ^TSDL_CD;
+ TSDL_CD = record
+ id: Integer; // Private drive identifier
+ status: TSDL_CDStatus; // Current drive status
+
+ // The rest of this structure is only valid if there's a CD in drive
+ numtracks: Integer; // Number of tracks on disk
+ cur_track: Integer; // Current track position
+ cur_frame: Integer; // Current frame offset within current track
+ track: array[0..SDL_MAX_TRACKS] of TSDL_CDTrack;
+ end;
+
+ //SDL_joystick.h types
+ PTransAxis = ^TTransAxis;
+ TTransAxis = record
+ offset: Integer;
+ scale: single;
+ end;
+
+ // The private structure used to keep track of a joystick
+ PJoystick_hwdata = ^TJoystick_hwdata;
+ TJoystick_hwdata = record
+ // joystick ID
+ id: Integer;
+ // values used to translate device-specific coordinates into SDL-standard ranges
+ transaxis: array[0..5] of TTransAxis;
+ end;
+
+ PBallDelta = ^TBallDelta;
+ TBallDelta = record
+ dx: Integer;
+ dy: Integer;
+ end; // Current ball motion deltas
+
+ // The SDL joystick structure
+ PSDL_Joystick = ^TSDL_Joystick;
+ TSDL_Joystick = record
+ index: UInt8; // Device index
+ name: PChar; // Joystick name - system dependent
+
+ naxes: Integer; // Number of axis controls on the joystick
+ axes: PUInt16; // Current axis states
+
+ nhats: Integer; // Number of hats on the joystick
+ hats: PUInt8; // Current hat states
+
+ nballs: Integer; // Number of trackballs on the joystick
+ balls: PBallDelta; // Current ball motion deltas
+
+ nbuttons: Integer; // Number of buttons on the joystick
+ buttons: PUInt8; // Current button states
+
+ hwdata: PJoystick_hwdata; // Driver dependent information
+
+ ref_count: Integer; // Reference count for multiple opens
+ end;
+
+ // SDL_verion.h types
+ PSDL_version = ^TSDL_version;
+ TSDL_version = record
+ major: UInt8;
+ minor: UInt8;
+ patch: UInt8;
+ end;
+
+ // SDL_keyboard.h types
+ TSDLKey = LongWord;
+
+ TSDLMod = LongWord;
+
+ PSDL_KeySym = ^TSDL_KeySym;
+ TSDL_KeySym = record
+ scancode: UInt8; // hardware specific scancode
+ sym: TSDLKey; // SDL virtual keysym
+ modifier: TSDLMod; // current key modifiers
+ unicode: UInt16; // translated character
+ end;
+
+ // SDL_events.h types
+ {Checks the event queue for messages and optionally returns them.
+ If 'action' is SDL_ADDEVENT, up to 'numevents' events will be added to
+ the back of the event queue.
+ If 'action' is SDL_PEEKEVENT, up to 'numevents' events at the front
+ of the event queue, matching 'mask', will be returned and will not
+ be removed from the queue.
+ If 'action' is SDL_GETEVENT, up to 'numevents' events at the front
+ of the event queue, matching 'mask', will be returned and will be
+ removed from the queue.
+ This function returns the number of events actually stored, or -1
+ if there was an error. This function is thread-safe. }
+
+ TSDL_EventAction = (SDL_ADDEVENT, SDL_PEEKEVENT, SDL_GETEVENT);
+
+ // Application visibility event structure
+ TSDL_ActiveEvent = record
+ type_: UInt8; // SDL_ACTIVEEVENT
+ gain: UInt8; // Whether given states were gained or lost (1/0)
+ state: UInt8; // A mask of the focus states
+ end;
+
+ // Keyboard event structure
+ TSDL_KeyboardEvent = record
+ type_: UInt8; // SDL_KEYDOWN or SDL_KEYUP
+ which: UInt8; // The keyboard device index
+ state: UInt8; // SDL_PRESSED or SDL_RELEASED
+ keysym: TSDL_KeySym;
+ end;
+
+ // Mouse motion event structure
+ TSDL_MouseMotionEvent = record
+ type_: UInt8; // SDL_MOUSEMOTION
+ which: UInt8; // The mouse device index
+ state: UInt8; // The current button state
+ x, y: UInt16; // The X/Y coordinates of the mouse
+ xrel: SInt16; // The relative motion in the X direction
+ yrel: SInt16; // The relative motion in the Y direction
+ end;
+
+ // Mouse button event structure
+ TSDL_MouseButtonEvent = record
+ type_: UInt8; // SDL_MOUSEBUTTONDOWN or SDL_MOUSEBUTTONUP
+ which: UInt8; // The mouse device index
+ button: UInt8; // The mouse button index
+ state: UInt8; // SDL_PRESSED or SDL_RELEASED
+ x: UInt16; // The X coordinates of the mouse at press time
+ y: UInt16; // The Y coordinates of the mouse at press time
+ end;
+
+ // Joystick axis motion event structure
+ TSDL_JoyAxisEvent = record
+ type_: UInt8; // SDL_JOYAXISMOTION
+ which: UInt8; // The joystick device index
+ axis: UInt8; // The joystick axis index
+ value: SInt16; // The axis value (range: -32768 to 32767)
+ end;
+
+ // Joystick trackball motion event structure
+ TSDL_JoyBallEvent = record
+ type_: UInt8; // SDL_JOYAVBALLMOTION
+ which: UInt8; // The joystick device index
+ ball: UInt8; // The joystick trackball index
+ xrel: SInt16; // The relative motion in the X direction
+ yrel: SInt16; // The relative motion in the Y direction
+ end;
+
+ // Joystick hat position change event structure
+ TSDL_JoyHatEvent = record
+ type_: UInt8; // SDL_JOYHATMOTION */
+ which: UInt8; // The joystick device index */
+ hat: UInt8; // The joystick hat index */
+ value: UInt8; { The hat position value:
+ 8 1 2
+ 7 0 3
+ 6 5 4
+
+ Note that zero means the POV is centered. }
+
+ end;
+
+ // Joystick button event structure
+ TSDL_JoyButtonEvent = record
+ type_: UInt8; // SDL_JOYBUTTONDOWN or SDL_JOYBUTTONUP
+ which: UInt8; // The joystick device index
+ button: UInt8; // The joystick button index
+ state: UInt8; // SDL_PRESSED or SDL_RELEASED
+ end;
+
+ { The "window resized" event
+ When you get this event, you are responsible for setting a new video
+ mode with the new width and height. }
+ TSDL_ResizeEvent = record
+ type_: UInt8; // SDL_VIDEORESIZE
+ w: Integer; // New width
+ h: Integer; // New height
+ end;
+
+ // The "quit requested" event
+ PSDL_QuitEvent = ^TSDL_QuitEvent;
+ TSDL_QuitEvent = record
+ type_: UInt8;
+ end;
+
+ // A user-defined event type
+ PSDL_UserEvent = ^TSDL_UserEvent;
+ TSDL_UserEvent = record
+ type_: UInt8; // SDL_USEREVENT through SDL_NUMEVENTS-1
+ code: Integer; // User defined event code */
+ data1: Pointer; // User defined data pointer */
+ data2: Pointer; // User defined data pointer */
+ end;
+
+ // The "screen redraw" event
+ PSDL_ExposeEvent = ^TSDL_ExposeEvent;
+ TSDL_ExposeEvent = record
+ type_ : Uint8; // SDL_VIDEOEXPOSE
+ end;
+
+ {$IFDEF Unix}
+ //These are the various supported subsystems under UNIX
+ TSDL_SysWm = ( SDL_SYSWM_X11 ) ;
+ {$ENDIF}
+
+// The windows custom event structure
+{$IFDEF WINDOWS}
+ PSDL_SysWMmsg = ^TSDL_SysWMmsg;
+ TSDL_SysWMmsg = record
+ version: TSDL_version;
+ h_wnd: HWND; // The window for the message
+ msg: UInt; // The type of message
+ w_Param: WPARAM; // WORD message parameter
+ lParam: LPARAM; // LONG message parameter
+ end;
+{$ELSE}
+
+{$IFDEF Unix}
+{ The Linux custom event structure }
+ PSDL_SysWMmsg = ^TSDL_SysWMmsg;
+ TSDL_SysWMmsg = record
+ version : TSDL_version;
+ subsystem : TSDL_SysWm;
+ {$IFDEF FPC}
+ {$IFNDEF GP2X}
+ {$IFNDEF DARWIN}
+ {$IFNDEF SKYOS}
+ event : TXEvent;
+ {$ENDIF}
+ {$ENDIF}
+ {$ENDIF}
+ {$ELSE}
+ event : XEvent;
+ {$ENDIF}
+ end;
+{$ELSE}
+{ The generic custom event structure }
+ PSDL_SysWMmsg = ^TSDL_SysWMmsg;
+ TSDL_SysWMmsg = record
+ version: TSDL_version;
+ data: Integer;
+ end;
+{$ENDIF}
+
+{$ENDIF}
+
+// The Windows custom window manager information structure
+{$IFDEF WINDOWS}
+ PSDL_SysWMinfo = ^TSDL_SysWMinfo;
+ TSDL_SysWMinfo = record
+ version : TSDL_version;
+ window : HWnd; // The display window
+ end;
+{$ELSE}
+
+// The Linux custom window manager information structure
+{$IFDEF Unix}
+ {$IFNDEF GP2X}
+ {$IFNDEF DARWIN}
+ {$IFNDEF SKYOS}
+ TX11 = record
+ display : PDisplay; // The X11 display
+ window : TWindow ; // The X11 display window */
+ {* These locking functions should be called around
+ any X11 functions using the display variable.
+ They lock the event thread, so should not be
+ called around event functions or from event filters.
+ *}
+ lock_func : Pointer;
+ unlock_func : Pointer;
+
+ // Introduced in SDL 1.0.2
+ fswindow : TWindow ; // The X11 fullscreen window */
+ wmwindow : TWindow ; // The X11 managed input window */
+ end;
+ {$ENDIF}
+ {$ENDIF}
+ {$ENDIF}
+
+ PSDL_SysWMinfo = ^TSDL_SysWMinfo;
+ TSDL_SysWMinfo = record
+ version : TSDL_version ;
+ subsystem : TSDL_SysWm;
+ {$IFNDEF GP2X}
+ {$IFNDEF DARWIN}
+ {$IFNDEF SKYOS}
+ X11 : TX11;
+ {$ENDIF}
+ {$ENDIF}
+ {$ENDIF}
+ end;
+{$ELSE}
+ // The generic custom window manager information structure
+ PSDL_SysWMinfo = ^TSDL_SysWMinfo;
+ TSDL_SysWMinfo = record
+ version : TSDL_version ;
+ data : integer;
+ end;
+{$ENDIF}
+
+{$ENDIF}
+
+ PSDL_SysWMEvent = ^TSDL_SysWMEvent;
+ TSDL_SysWMEvent = record
+ type_: UInt8;
+ msg: PSDL_SysWMmsg;
+ end;
+
+ PSDL_Event = ^TSDL_Event;
+ TSDL_Event = record
+ case UInt8 of
+ SDL_NOEVENT: (type_: byte);
+ SDL_ACTIVEEVENT: (active: TSDL_ActiveEvent);
+ SDL_KEYDOWN, SDL_KEYUP: (key: TSDL_KeyboardEvent);
+ SDL_MOUSEMOTION: (motion: TSDL_MouseMotionEvent);
+ SDL_MOUSEBUTTONDOWN, SDL_MOUSEBUTTONUP: (button: TSDL_MouseButtonEvent );
+ SDL_JOYAXISMOTION: (jaxis: TSDL_JoyAxisEvent );
+ SDL_JOYBALLMOTION: (jball: TSDL_JoyBallEvent );
+ SDL_JOYHATMOTION: (jhat: TSDL_JoyHatEvent );
+ SDL_JOYBUTTONDOWN, SDL_JOYBUTTONUP: (jbutton: TSDL_JoyButtonEvent );
+ SDL_VIDEORESIZE: (resize: TSDL_ResizeEvent );
+ SDL_QUITEV: (quit: TSDL_QuitEvent );
+ SDL_USEREVENT : ( user : TSDL_UserEvent );
+ SDL_SYSWMEVENT: (syswm: TSDL_SysWMEvent );
+ end;
+
+
+{ This function sets up a filter to process all events before they
+ change internal state and are posted to the internal event queue.
+
+ The filter is protypted as: }
+ {$IFNDEF __GPC__}
+ TSDL_EventFilter = function( event : PSDL_Event ): Integer; cdecl;
+ {$ELSE}
+ TSDL_EventFilter = function( event : PSDL_Event ): Integer;
+ {$ENDIF}
+
+ // SDL_video.h types
+ // Useful data types
+ PPSDL_Rect = ^PSDL_Rect;
+ PSDL_Rect = ^TSDL_Rect;
+ TSDL_Rect = record
+ x, y: SInt16;
+ w, h: UInt16;
+ end;
+
+ SDL_Rect = TSDL_Rect;
+{$EXTERNALSYM SDL_Rect}
+
+ PSDL_Color = ^TSDL_Color;
+ TSDL_Color = record
+ r: UInt8;
+ g: UInt8;
+ b: UInt8;
+ unused: UInt8;
+ end;
+
+ PSDL_ColorArray = ^TSDL_ColorArray;
+ TSDL_ColorArray = array[0..65000] of TSDL_Color;
+
+ PSDL_Palette = ^TSDL_Palette;
+ TSDL_Palette = record
+ ncolors: Integer;
+ colors: PSDL_ColorArray;
+ end;
+
+ // Everything in the pixel format structure is read-only
+ PSDL_PixelFormat = ^TSDL_PixelFormat;
+ TSDL_PixelFormat = record
+ palette: PSDL_Palette;
+ BitsPerPixel: UInt8;
+ BytesPerPixel: UInt8;
+ Rloss: UInt8;
+ Gloss: UInt8;
+ Bloss: UInt8;
+ Aloss: UInt8;
+ Rshift: UInt8;
+ Gshift: UInt8;
+ Bshift: UInt8;
+ Ashift: UInt8;
+ RMask: UInt32;
+ GMask: UInt32;
+ BMask: UInt32;
+ AMask: UInt32;
+ colorkey: UInt32; // RGB color key information
+ alpha: UInt8; // Alpha value information (per-surface alpha)
+ end;
+
+{$IFDEF WINDOWS}
+ {PPrivate_hwdata = ^TPrivate_hwdata;
+ TPrivate_hwdata = record
+ dd_surface : IDIRECTDRAWSURFACE3;
+ dd_writebuf : IDIRECTDRAWSURFACE3;
+ end;}
+ {ELSE}
+{$ENDIF}
+
+ // The structure passed to the low level blit functions
+ PSDL_BlitInfo = ^TSDL_BlitInfo;
+ TSDL_BlitInfo = record
+ s_pixels: PUInt8;
+ s_width: Integer;
+ s_height: Integer;
+ s_skip: Integer;
+ d_pixels: PUInt8;
+ d_width: Integer;
+ d_height: Integer;
+ d_skip: Integer;
+ aux_data: Pointer;
+ src: PSDL_PixelFormat;
+ table: PUInt8;
+ dst: PSDL_PixelFormat;
+ end;
+
+ // typedef for private surface blitting functions
+ PSDL_Surface = ^TSDL_Surface;
+
+ {$IFNDEF __GPC__}
+ TSDL_Blit = function( src: PSDL_Surface; srcrect: PSDL_Rect; dst: PSDL_Surface; dstrect: PSDL_Rect ): Integer; cdecl;
+ {$ELSE}
+ TSDL_Blit = function( src: PSDL_Surface; srcrect: PSDL_Rect; dst: PSDL_Surface; dstrect: PSDL_Rect ): Integer;
+ {$ENDIF}
+
+ // The type definition for the low level blit functions
+ //TSDL_LoBlit = procedure( info : PSDL_BlitInfo ); cdecl;
+
+ // This is the private info structure for software accelerated blits
+ {PPrivate_swaccel = ^TPrivate_swaccel;
+ TPrivate_swaccel = record
+ blit : TSDL_LoBlit;
+ aux_data : Pointer;
+ end;}
+
+ // Blit mapping definition
+ {PSDL_BlitMap = ^TSDL_BlitMap;
+ TSDL_BlitMap = record
+ dst : PSDL_Surface;
+ identity : Integer;
+ table : PUInt8;
+ hw_blit : TSDL_Blit;
+ sw_blit : TSDL_Blit;
+ hw_data : PPrivate_hwaccel;
+ sw_data : PPrivate_swaccel;
+
+ // the version count matches the destination; mismatch indicates an invalid mapping
+ format_version : Cardinal;
+ end;}
+
+ TSDL_Surface = record
+ flags: UInt32; // Read-only
+ format: PSDL_PixelFormat; // Read-only
+ w, h: Integer; // Read-only
+ pitch: UInt16; // Read-only
+ pixels: Pointer; // Read-write
+ offset: Integer; // Private
+ hwdata: Pointer; //TPrivate_hwdata; Hardware-specific surface info
+
+ // clipping information:
+ clip_rect: TSDL_Rect; // Read-only
+ unused1: UInt32; // for binary compatibility
+ // Allow recursive locks
+ locked: UInt32; // Private
+ // info for fast blit mapping to other surfaces
+ Blitmap: Pointer; // PSDL_BlitMap; // Private
+ // format version, bumped at every change to invalidate blit maps
+ format_version: Cardinal; // Private
+ refcount: Integer;
+ end;
+
+ // Useful for determining the video hardware capabilities
+ PSDL_VideoInfo = ^TSDL_VideoInfo;
+ TSDL_VideoInfo = record
+ hw_available: UInt8; // Hardware and WindowManager flags in first 2 bits ( see below )
+ {hw_available: 1; // Can you create hardware surfaces
+ wm_available: 1; // Can you talk to a window manager?
+ UnusedBits1: 6;}
+ blit_hw: UInt8; // Blit Hardware flags. See below for which bits do what
+ {UnusedBits2: 1;
+ blit_hw: 1; // Flag:UInt32 Accelerated blits HW --> HW
+ blit_hw_CC: 1; // Flag:UInt32 Accelerated blits with Colorkey
+ blit_hw_A: 1; // Flag:UInt32 Accelerated blits with Alpha
+ blit_sw: 1; // Flag:UInt32 Accelerated blits SW --> HW
+ blit_sw_CC: 1; // Flag:UInt32 Accelerated blits with Colorkey
+ blit_sw_A: 1; // Flag:UInt32 Accelerated blits with Alpha
+ blit_fill: 1; // Flag:UInt32 Accelerated color fill}
+ UnusedBits3: UInt8; // Unused at this point
+ video_mem: UInt32; // The total amount of video memory (in K)
+ vfmt: PSDL_PixelFormat; // Value: The format of the video surface
+ current_w : SInt32; // Value: The current video mode width
+ current_h : SInt32; // Value: The current video mode height
+ end;
+
+ // The YUV hardware video overlay
+ PSDL_Overlay = ^TSDL_Overlay;
+ TSDL_Overlay = record
+ format: UInt32; // Overlay format
+ w, h: Integer; // Width and height of overlay
+ planes: Integer; // Number of planes in the overlay. Usually either 1 or 3
+ pitches: PUInt16;
+ // An array of pitches, one for each plane. Pitch is the length of a row in bytes.
+ pixels: PPUInt8;
+ // An array of pointers to the data of each plane. The overlay should be locked before these pointers are used.
+ hw_overlay: UInt32;
+ // This will be set to 1 if the overlay is hardware accelerated.
+ end;
+
+ // Public enumeration for setting the OpenGL window attributes.
+ TSDL_GLAttr = (
+ SDL_GL_RED_SIZE,
+ SDL_GL_GREEN_SIZE,
+ SDL_GL_BLUE_SIZE,
+ SDL_GL_ALPHA_SIZE,
+ SDL_GL_BUFFER_SIZE,
+ SDL_GL_DOUBLEBUFFER,
+ SDL_GL_DEPTH_SIZE,
+ SDL_GL_STENCIL_SIZE,
+ SDL_GL_ACCUM_RED_SIZE,
+ SDL_GL_ACCUM_GREEN_SIZE,
+ SDL_GL_ACCUM_BLUE_SIZE,
+ SDL_GL_ACCUM_ALPHA_SIZE,
+ SDL_GL_STEREO,
+ SDL_GL_MULTISAMPLEBUFFERS,
+ SDL_GL_MULTISAMPLESAMPLES,
+ SDL_GL_ACCELERATED_VISUAL,
+ SDL_GL_SWAP_CONTROL);
+
+
+
+ PSDL_Cursor = ^TSDL_Cursor;
+ TSDL_Cursor = record
+ area: TSDL_Rect; // The area of the mouse cursor
+ hot_x, hot_y: SInt16; // The "tip" of the cursor
+ data: PUInt8; // B/W cursor data
+ mask: PUInt8; // B/W cursor mask
+ save: array[1..2] of PUInt8; // Place to save cursor area
+ wm_cursor: Pointer; // Window-manager cursor
+ end;
+
+// SDL_mutex.h types
+
+{$IFDEF WINDOWS}
+ PSDL_Mutex = ^TSDL_Mutex;
+ TSDL_Mutex = record
+ id: THANDLE;
+ end;
+{$ENDIF}
+
+{$IFDEF Unix}
+ PSDL_Mutex = ^TSDL_Mutex;
+ TSDL_mutex = record
+ id: pthread_mutex_t;
+{$IFDEF PTHREAD_NO_RECURSIVE_MUTEX}
+ recursive: Integer;
+ owner: pthread_t;
+{$ENDIF}
+ end;
+{$ENDIF}
+
+{$IFDEF NDS}
+ PSDL_mutex = ^TSDL_Mutex;
+ TSDL_Mutex = record
+ recursive: Integer;
+ Owner: UInt32;
+ sem: PSDL_sem;
+ end;
+{$ENDIF}
+
+{$IFDEF __MACH__}
+ {$define USE_NAMED_SEMAPHORES}
+ // Broken sem_getvalue() in MacOS X Public Beta */
+ {$define BROKEN_SEMGETVALUE}
+{$ENDIF}
+
+PSDL_semaphore = ^TSDL_semaphore;
+{$IFDEF WINDOWS}
+ // WINDOWS or Machintosh
+ TSDL_semaphore = record
+ id: THANDLE;
+ count: UInt32;
+ end;
+{$ELSE}
+ {$IFDEF FPC}
+ // This should be semaphore.h
+ __sem_lock_t = {packed} record { Not in header file - anonymous }
+ status: Longint;
+ spinlock: Integer;
+ end;
+
+ sem_t = {packed} record
+ __sem_lock: __sem_lock_t;
+ __sem_value: Integer;
+ __sem_waiting: longint ; {_pthread_queue;}
+ end;
+ {$ENDIF}
+
+ TSDL_semaphore = record
+ sem: Pointer; //PSem_t;
+ {$IFNDEF USE_NAMED_SEMAPHORES}
+ sem_data: Sem_t;
+ {$ENDIF}
+
+ {$IFDEF BROKEN_SEMGETVALUE}
+ { This is a little hack for MacOS X -
+ It's not thread-safe, but it's better than nothing }
+ sem_value: Integer;
+ {$ENDIF}
+ end;
+{$ENDIF}
+
+ PSDL_Sem = ^TSDL_Sem;
+ TSDL_Sem = TSDL_Semaphore;
+
+ PSDL_Cond = ^TSDL_Cond;
+ TSDL_Cond = record
+{$IFDEF Unix}
+ cond: pthread_cond_t;
+{$ELSE}
+ // Generic Cond structure
+ lock: PSDL_mutex;
+ waiting: Integer;
+ signals: Integer;
+ wait_sem: PSDL_Sem;
+ wait_done: PSDL_Sem;
+{$ENDIF}
+ end;
+
+ // SDL_thread.h types
+{$IFDEF WINDOWS}
+ TSYS_ThreadHandle = THandle;
+{$ENDIF}
+
+{$IFDEF Unix}
+ TSYS_ThreadHandle = pthread_t;
+{$ENDIF}
+
+{$IFDEF NDS}
+ TSYS_ThreadHandle = Integer;
+{$ENDIF}
+
+ { This is the system-independent thread info structure }
+ PSDL_Thread = ^TSDL_Thread;
+ TSDL_Thread = record
+ threadid: UInt32;
+ handle: TSYS_ThreadHandle;
+ status: Integer;
+ errbuf: TSDL_Error;
+ data: Pointer;
+ end;
+
+ // Helper Types
+
+ // Keyboard State Array ( See demos for how to use )
+ PKeyStateArr = ^TKeyStateArr;
+ TKeyStateArr = array[0..65000] of UInt8;
+
+ // Types required so we don't need to use Windows.pas
+ PInteger = ^Integer;
+ PByte = ^Byte;
+ PWord = ^Word;
+ PLongWord = ^Longword;
+
+ // General arrays
+ PByteArray = ^TByteArray;
+ TByteArray = array[0..32767] of Byte;
+
+ PWordArray = ^TWordArray;
+ TWordArray = array[0..16383] of Word;
+
+ PPoint = ^TPoint;
+ {$IFDEF HAS_TYPES}
+ TPoint = Types.TPoint;
+ {$ELSE}
+ {$IFDEF WINDOWS}
+ {$IFDEF __GPC__}
+ TPoint = wintypes.TPoint;
+ {$ELSE}
+ TPoint = Windows.TPoint;
+ {$ENDIF}
+ {$ELSE}
+ //Can't define TPoint : neither Types nor Windows unit available.
+ {$ENDIF}
+ {$ENDIF}
+
+ PRect = ^TRect;
+ {$IFDEF HAS_TYPES}
+ TRect = Types.TRect;
+ {$ELSE}
+ {$IFDEF WINDOWS}
+ {$IFDEF __GPC__}
+ TRect = wintypes.TRect;
+ {$ELSE}
+ TRect = Windows.TRect;
+ {$ENDIF}
+ {$ELSE}
+ //Can't define TRect: neither Types nor Windows unit available.
+ {$ENDIF}
+ {$ENDIF}
+
+ { Generic procedure pointer }
+ TProcedure = procedure;
+
+{------------------------------------------------------------------------------}
+{ initialization }
+{------------------------------------------------------------------------------}
+
+{ This function loads the SDL dynamically linked library and initializes
+ the subsystems specified by 'flags' (and those satisfying dependencies)
+ Unless the SDL_INIT_NOPARACHUTE flag is set, it will install cleanup
+ signal handlers for some commonly ignored fatal signals (like SIGSEGV) }
+
+function SDL_Init( flags : UInt32 ) : Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_Init'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_Init}
+
+// This function initializes specific SDL subsystems
+function SDL_InitSubSystem( flags : UInt32 ) : Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_InitSubSystem'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_InitSubSystem}
+
+// This function cleans up specific SDL subsystems
+procedure SDL_QuitSubSystem( flags : UInt32 );
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_QuitSubSystem'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_QuitSubSystem}
+
+{ This function returns mask of the specified subsystems which have
+ been initialized.
+ If 'flags' is 0, it returns a mask of all initialized subsystems. }
+
+function SDL_WasInit( flags : UInt32 ): UInt32;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_WasInit'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_WasInit}
+
+{ This function cleans up all initialized subsystems and unloads the
+ dynamically linked library. You should call it upon all exit conditions. }
+procedure SDL_Quit;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_Quit'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_Quit}
+
+{$IFDEF WINDOWS}
+// This should be called from your WinMain() function, if any
+function SDL_RegisterApp(name: PChar; style: UInt32; h_Inst: Pointer): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_RegisterApp'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_RegisterApp}
+{$ENDIF}
+
+{$IFDEF __MACH__}
+// This should be called from your main() function, if any
+procedure SDL_InitQuickDraw( the_qd: QDGlobals );
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_InitQuickDraw'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_InitQuickDraw}
+{$ENDIF}
+
+
+{------------------------------------------------------------------------------}
+{ types }
+{------------------------------------------------------------------------------}
+// The number of elements in a table
+function SDL_TableSize( table: PChar ): Integer;
+{$EXTERNALSYM SDL_TABLESIZE}
+
+
+{------------------------------------------------------------------------------}
+{ error-handling }
+{------------------------------------------------------------------------------}
+// Public functions
+function SDL_GetError: PChar;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GetError'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GetError}
+procedure SDL_SetError(fmt: PChar);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_SetError'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_SetError}
+procedure SDL_ClearError;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_ClearError'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_ClearError}
+
+{$IFNDEF WINDOWS}
+procedure SDL_Error(Code: TSDL_errorcode);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_Error'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_Error}
+{$ENDIF}
+
+// Private error message function - used internally
+procedure SDL_OutOfMemory;
+
+{------------------------------------------------------------------------------}
+{ io handling }
+{------------------------------------------------------------------------------}
+// Functions to create SDL_RWops structures from various data sources
+
+function SDL_RWFromFile(filename, mode: PChar): PSDL_RWops;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_RWFromFile'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_RWFromFile}
+procedure SDL_FreeRW(area: PSDL_RWops);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_FreeRW'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_FreeRW}
+
+//fp is FILE *fp ???
+function SDL_RWFromFP(fp: Pointer; autoclose: Integer): PSDL_RWops;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_RWFromFP'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_RWFromFP}
+function SDL_RWFromMem(mem: Pointer; size: Integer): PSDL_RWops;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_RWFromMem'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_RWFromMem}
+function SDL_RWFromConstMem(const mem: Pointer; size: Integer) : PSDL_RWops;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_RWFromConstMem'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_RWFromConstMem}
+function SDL_AllocRW: PSDL_RWops;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_AllocRW'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_AllocRW}
+
+function SDL_RWSeek(context: PSDL_RWops; offset: Integer; whence: Integer) : Integer;
+{$EXTERNALSYM SDL_RWSeek}
+function SDL_RWTell(context: PSDL_RWops): Integer;
+{$EXTERNALSYM SDL_RWTell}
+function SDL_RWRead(context: PSDL_RWops; ptr: Pointer; size: Integer; n : Integer): Integer;
+{$EXTERNALSYM SDL_RWRead}
+function SDL_RWWrite(context: PSDL_RWops; ptr: Pointer; size: Integer; n : Integer): Integer;
+{$EXTERNALSYM SDL_RWWrite}
+function SDL_RWClose(context: PSDL_RWops): Integer;
+{$EXTERNALSYM SDL_RWClose}
+
+{------------------------------------------------------------------------------}
+{ time-handling }
+{------------------------------------------------------------------------------}
+
+{ Get the number of milliseconds since the SDL library initialization. }
+{ Note that this value wraps if the program runs for more than ~49 days. }
+function SDL_GetTicks: UInt32;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GetTicks'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GetTicks}
+
+// Wait a specified number of milliseconds before returning
+procedure SDL_Delay(msec: UInt32);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_Delay'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_Delay}
+
+{ Add a new timer to the pool of timers already running. }
+{ Returns a timer ID, or NULL when an error occurs. }
+function SDL_AddTimer(interval: UInt32; callback: TSDL_NewTimerCallback; param : Pointer): PSDL_TimerID;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_AddTimer'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_AddTimer}
+
+{ Remove one of the multiple timers knowing its ID. }
+{ Returns a boolean value indicating success. }
+function SDL_RemoveTimer(t: PSDL_TimerID): TSDL_Bool;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_RemoveTimer'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_RemoveTimer}
+
+function SDL_SetTimer(interval: UInt32; callback: TSDL_TimerCallback): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_SetTimer'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_SetTimer}
+
+{------------------------------------------------------------------------------}
+{ audio-routines }
+{------------------------------------------------------------------------------}
+
+{ These functions are used internally, and should not be used unless you
+ have a specific need to specify the audio driver you want to use.
+ You should normally use SDL_Init() or SDL_InitSubSystem(). }
+
+function SDL_AudioInit(driver_name: PChar): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_AudioInit'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_AudioInit}
+procedure SDL_AudioQuit;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_AudioQuit'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_AudioQuit}
+
+{ This function fills the given character buffer with the name of the
+ current audio driver, and returns a Pointer to it if the audio driver has
+ been initialized. It returns NULL if no driver has been initialized. }
+
+function SDL_AudioDriverName(namebuf: PChar; maxlen: Integer): PChar;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_AudioDriverName'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_AudioDriverName}
+
+{ This function opens the audio device with the desired parameters, and
+ returns 0 if successful, placing the actual hardware parameters in the
+ structure pointed to by 'obtained'. If 'obtained' is NULL, the audio
+ data passed to the callback function will be guaranteed to be in the
+ requested format, and will be automatically converted to the hardware
+ audio format if necessary. This function returns -1 if it failed
+ to open the audio device, or couldn't set up the audio thread.
+
+ When filling in the desired audio spec structure,
+ 'desired->freq' should be the desired audio frequency in samples-per-second.
+ 'desired->format' should be the desired audio format.
+ 'desired->samples' is the desired size of the audio buffer, in samples.
+ This number should be a power of two, and may be adjusted by the audio
+ driver to a value more suitable for the hardware. Good values seem to
+ range between 512 and 8096 inclusive, depending on the application and
+ CPU speed. Smaller values yield faster response time, but can lead
+ to underflow if the application is doing heavy processing and cannot
+ fill the audio buffer in time. A stereo sample consists of both right
+ and left channels in LR ordering.
+ Note that the number of samples is directly related to time by the
+ following formula: ms = (samples*1000)/freq
+ 'desired->size' is the size in bytes of the audio buffer, and is
+ calculated by SDL_OpenAudio().
+ 'desired->silence' is the value used to set the buffer to silence,
+ and is calculated by SDL_OpenAudio().
+ 'desired->callback' should be set to a function that will be called
+ when the audio device is ready for more data. It is passed a pointer
+ to the audio buffer, and the length in bytes of the audio buffer.
+ This function usually runs in a separate thread, and so you should
+ protect data structures that it accesses by calling SDL_LockAudio()
+ and SDL_UnlockAudio() in your code.
+ 'desired->userdata' is passed as the first parameter to your callback
+ function.
+
+ The audio device starts out playing silence when it's opened, and should
+ be enabled for playing by calling SDL_PauseAudio(0) when you are ready
+ for your audio callback function to be called. Since the audio driver
+ may modify the requested size of the audio buffer, you should allocate
+ any local mixing buffers after you open the audio device. }
+
+function SDL_OpenAudio(desired, obtained: PSDL_AudioSpec): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_OpenAudio'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_OpenAudio}
+
+{ Get the current audio state: }
+function SDL_GetAudioStatus: TSDL_Audiostatus;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GetAudioStatus'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GetAudioStatus}
+
+{ This function pauses and unpauses the audio callback processing.
+ It should be called with a parameter of 0 after opening the audio
+ device to start playing sound. This is so you can safely initialize
+ data for your callback function after opening the audio device.
+ Silence will be written to the audio device during the pause. }
+
+procedure SDL_PauseAudio(pause_on: Integer);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_PauseAudio'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_PauseAudio}
+
+{ This function loads a WAVE from the data source, automatically freeing
+ that source if 'freesrc' is non-zero. For example, to load a WAVE file,
+ you could do:
+ SDL_LoadWAV_RW(SDL_RWFromFile("sample.wav", "rb"), 1, ...);
+
+ If this function succeeds, it returns the given SDL_AudioSpec,
+ filled with the audio data format of the wave data, and sets
+ 'audio_buf' to a malloc()'d buffer containing the audio data,
+ and sets 'audio_len' to the length of that audio buffer, in bytes.
+ You need to free the audio buffer with SDL_FreeWAV() when you are
+ done with it.
+
+ This function returns NULL and sets the SDL error message if the
+ wave file cannot be opened, uses an unknown data format, or is
+ corrupt. Currently raw and MS-ADPCM WAVE files are supported. }
+
+function SDL_LoadWAV_RW(src: PSDL_RWops; freesrc: Integer; spec:
+ PSDL_AudioSpec; audio_buf: PUInt8; audiolen: PUInt32): PSDL_AudioSpec;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_LoadWAV_RW'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_LoadWAV_RW}
+
+// Compatibility convenience function -- loads a WAV from a file
+function SDL_LoadWAV(filename: PChar; spec: PSDL_AudioSpec; audio_buf:
+ PUInt8; audiolen: PUInt32): PSDL_AudioSpec;
+{$EXTERNALSYM SDL_LoadWAV}
+
+{ This function frees data previously allocated with SDL_LoadWAV_RW() }
+
+procedure SDL_FreeWAV(audio_buf: PUInt8);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_FreeWAV'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_FreeWAV}
+
+{ This function takes a source format and rate and a destination format
+ and rate, and initializes the 'cvt' structure with information needed
+ by SDL_ConvertAudio() to convert a buffer of audio data from one format
+ to the other.
+ This function returns 0, or -1 if there was an error. }
+function SDL_BuildAudioCVT(cvt: PSDL_AudioCVT; src_format: UInt16;
+ src_channels: UInt8; src_rate: Integer; dst_format: UInt16; dst_channels: UInt8;
+ dst_rate: Integer): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_BuildAudioCVT'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_BuildAudioCVT}
+
+{ Once you have initialized the 'cvt' structure using SDL_BuildAudioCVT(),
+ created an audio buffer cvt->buf, and filled it with cvt->len bytes of
+ audio data in the source format, this function will convert it in-place
+ to the desired format.
+ The data conversion may expand the size of the audio data, so the buffer
+ cvt->buf should be allocated after the cvt structure is initialized by
+ SDL_BuildAudioCVT(), and should be cvt->len*cvt->len_mult bytes long. }
+function SDL_ConvertAudio(cvt: PSDL_AudioCVT): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_ConvertAudio'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_ConvertAudio}
+
+{ This takes two audio buffers of the playing audio format and mixes
+ them, performing addition, volume adjustment, and overflow clipping.
+ The volume ranges from 0 - 128, and should be set to SDL_MIX_MAXVOLUME
+ for full audio volume. Note this does not change hardware volume.
+ This is provided for convenience -- you can mix your own audio data. }
+
+procedure SDL_MixAudio(dst, src: PUInt8; len: UInt32; volume: Integer);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_MixAudio'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_MixAudio}
+
+{ The lock manipulated by these functions protects the callback function.
+ During a LockAudio/UnlockAudio pair, you can be guaranteed that the
+ callback function is not running. Do not call these from the callback
+ function or you will cause deadlock. }
+procedure SDL_LockAudio;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_LockAudio'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_LockAudio}
+procedure SDL_UnlockAudio;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_UnlockAudio'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_UnlockAudio}
+
+{ This function shuts down audio processing and closes the audio device. }
+
+procedure SDL_CloseAudio;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CloseAudio'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CloseAudio}
+
+{------------------------------------------------------------------------------}
+{ CD-routines }
+{------------------------------------------------------------------------------}
+
+{ Returns the number of CD-ROM drives on the system, or -1 if
+ SDL_Init() has not been called with the SDL_INIT_CDROM flag. }
+
+function SDL_CDNumDrives: Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CDNumDrives'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CDNumDrives}
+
+{ Returns a human-readable, system-dependent identifier for the CD-ROM.
+ Example:
+ "/dev/cdrom"
+ "E:"
+ "/dev/disk/ide/1/master" }
+
+function SDL_CDName(drive: Integer): PChar;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CDName'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CDName}
+
+{ Opens a CD-ROM drive for access. It returns a drive handle on success,
+ or NULL if the drive was invalid or busy. This newly opened CD-ROM
+ becomes the default CD used when other CD functions are passed a NULL
+ CD-ROM handle.
+ Drives are numbered starting with 0. Drive 0 is the system default CD-ROM. }
+
+function SDL_CDOpen(drive: Integer): PSDL_CD;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CDOpen'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CDOpen}
+
+{ This function returns the current status of the given drive.
+ If the drive has a CD in it, the table of contents of the CD and current
+ play position of the CD will be stored in the SDL_CD structure. }
+
+function SDL_CDStatus(cdrom: PSDL_CD): TSDL_CDStatus;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CDStatus'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CDStatus}
+
+{ Play the given CD starting at 'start_track' and 'start_frame' for 'ntracks'
+ tracks and 'nframes' frames. If both 'ntrack' and 'nframe' are 0, play
+ until the end of the CD. This function will skip data tracks.
+ This function should only be called after calling SDL_CDStatus() to
+ get track information about the CD.
+
+ For example:
+ // Play entire CD:
+ if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) then
+ SDL_CDPlayTracks(cdrom, 0, 0, 0, 0);
+ // Play last track:
+ if ( CD_INDRIVE(SDL_CDStatus(cdrom)) ) then
+ begin
+ SDL_CDPlayTracks(cdrom, cdrom->numtracks-1, 0, 0, 0);
+ end;
+
+ // Play first and second track and 10 seconds of third track:
+ if ( CD_INDRIVE(SDL_CDStatus(cdrom)) )
+ SDL_CDPlayTracks(cdrom, 0, 0, 2, 10);
+
+ This function returns 0, or -1 if there was an error. }
+
+function SDL_CDPlayTracks(cdrom: PSDL_CD; start_track: Integer; start_frame:
+ Integer; ntracks: Integer; nframes: Integer): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CDPlayTracks'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CDPlayTracks}
+
+
+{ Play the given CD starting at 'start' frame for 'length' frames.
+ It returns 0, or -1 if there was an error. }
+
+function SDL_CDPlay(cdrom: PSDL_CD; start: Integer; length: Integer): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CDPlay'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CDPlay}
+
+// Pause play -- returns 0, or -1 on error
+function SDL_CDPause(cdrom: PSDL_CD): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CDPause'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CDPause}
+
+// Resume play -- returns 0, or -1 on error
+function SDL_CDResume(cdrom: PSDL_CD): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CDResume'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CDResume}
+
+// Stop play -- returns 0, or -1 on error
+function SDL_CDStop(cdrom: PSDL_CD): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CDStop'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CDStop}
+
+// Eject CD-ROM -- returns 0, or -1 on error
+function SDL_CDEject(cdrom: PSDL_CD): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CDEject'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CDEject}
+
+// Closes the handle for the CD-ROM drive
+procedure SDL_CDClose(cdrom: PSDL_CD);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CDClose'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CDClose}
+
+// Given a status, returns true if there's a disk in the drive
+function SDL_CDInDrive( status : TSDL_CDStatus ) : LongBool;
+{$EXTERNALSYM SDL_CDInDrive}
+
+// Conversion functions from frames to Minute/Second/Frames and vice versa
+procedure FRAMES_TO_MSF(frames: Integer; var M: Integer; var S: Integer; var
+ F: Integer);
+{$EXTERNALSYM FRAMES_TO_MSF}
+function MSF_TO_FRAMES(M: Integer; S: Integer; F: Integer): Integer;
+{$EXTERNALSYM MSF_TO_FRAMES}
+
+{------------------------------------------------------------------------------}
+{ JoyStick-routines }
+{------------------------------------------------------------------------------}
+
+{ Count the number of joysticks attached to the system }
+function SDL_NumJoysticks: Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_NumJoysticks'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_NumJoysticks}
+
+{ Get the implementation dependent name of a joystick.
+ This can be called before any joysticks are opened.
+ If no name can be found, this function returns NULL. }
+function SDL_JoystickName(index: Integer): PChar;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_JoystickName'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_JoystickName}
+
+{ Open a joystick for use - the index passed as an argument refers to
+ the N'th joystick on the system. This index is the value which will
+ identify this joystick in future joystick events.
+
+ This function returns a joystick identifier, or NULL if an error occurred. }
+function SDL_JoystickOpen(index: Integer): PSDL_Joystick;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_JoystickOpen'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_JoystickOpen}
+
+{ Returns 1 if the joystick has been opened, or 0 if it has not. }
+function SDL_JoystickOpened(index: Integer): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_JoystickOpened'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_JoystickOpened}
+
+{ Get the device index of an opened joystick. }
+function SDL_JoystickIndex(joystick: PSDL_Joystick): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_JoystickIndex'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_JoystickIndex}
+
+{ Get the number of general axis controls on a joystick }
+function SDL_JoystickNumAxes(joystick: PSDL_Joystick): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_JoystickNumAxes'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_JoystickNumAxes}
+
+{ Get the number of trackballs on a joystick
+ Joystick trackballs have only relative motion events associated
+ with them and their state cannot be polled. }
+function SDL_JoystickNumBalls(joystick: PSDL_Joystick): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_JoystickNumBalls'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_JoystickNumBalls}
+
+
+{ Get the number of POV hats on a joystick }
+function SDL_JoystickNumHats(joystick: PSDL_Joystick): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_JoystickNumHats'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_JoystickNumHats}
+
+{ Get the number of buttons on a joystick }
+function SDL_JoystickNumButtons(joystick: PSDL_Joystick): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_JoystickNumButtons'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_JoystickNumButtons}
+
+{ Update the current state of the open joysticks.
+ This is called automatically by the event loop if any joystick
+ events are enabled. }
+
+procedure SDL_JoystickUpdate;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_JoystickUpdate'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_JoystickUpdate;}
+
+{ Enable/disable joystick event polling.
+ If joystick events are disabled, you must call SDL_JoystickUpdate()
+ yourself and check the state of the joystick when you want joystick
+ information.
+ The state can be one of SDL_QUERY, SDL_ENABLE or SDL_IGNORE. }
+
+function SDL_JoystickEventState(state: Integer): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_JoystickEventState'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_JoystickEventState}
+
+{ Get the current state of an axis control on a joystick
+ The state is a value ranging from -32768 to 32767.
+ The axis indices start at index 0. }
+
+function SDL_JoystickGetAxis(joystick: PSDL_Joystick; axis: Integer) : SInt16;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_JoystickGetAxis'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_JoystickGetAxis}
+
+{ The hat indices start at index 0. }
+
+function SDL_JoystickGetHat(joystick: PSDL_Joystick; hat: Integer): UInt8;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_JoystickGetHat'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_JoystickGetHat}
+
+{ Get the ball axis change since the last poll
+ This returns 0, or -1 if you passed it invalid parameters.
+ The ball indices start at index 0. }
+
+function SDL_JoystickGetBall(joystick: PSDL_Joystick; ball: Integer; var dx: Integer; var dy: Integer): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_JoystickGetBall'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_JoystickGetBall}
+
+{ Get the current state of a button on a joystick
+ The button indices start at index 0. }
+function SDL_JoystickGetButton( joystick: PSDL_Joystick; Button: Integer): UInt8;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_JoystickGetButton'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_JoystickGetButton}
+
+{ Close a joystick previously opened with SDL_JoystickOpen() }
+procedure SDL_JoystickClose(joystick: PSDL_Joystick);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_JoystickClose'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_JoystickClose}
+
+{------------------------------------------------------------------------------}
+{ event-handling }
+{------------------------------------------------------------------------------}
+
+{ Pumps the event loop, gathering events from the input devices.
+ This function updates the event queue and internal input device state.
+ This should only be run in the thread that sets the video mode. }
+
+procedure SDL_PumpEvents;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_PumpEvents'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_PumpEvents;}
+
+{ Checks the event queue for messages and optionally returns them.
+ If 'action' is SDL_ADDEVENT, up to 'numevents' events will be added to
+ the back of the event queue.
+ If 'action' is SDL_PEEKEVENT, up to 'numevents' events at the front
+ of the event queue, matching 'mask', will be returned and will not
+ be removed from the queue.
+ If 'action' is SDL_GETEVENT, up to 'numevents' events at the front
+ of the event queue, matching 'mask', will be returned and will be
+ removed from the queue.
+ This function returns the number of events actually stored, or -1
+ if there was an error. This function is thread-safe. }
+
+function SDL_PeepEvents(events: PSDL_Event; numevents: Integer; action: TSDL_eventaction; mask: UInt32): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_PeepEvents'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_PeepEvents}
+
+{ Polls for currently pending events, and returns 1 if there are any pending
+ events, or 0 if there are none available. If 'event' is not NULL, the next
+ event is removed from the queue and stored in that area. }
+
+function SDL_PollEvent(event: PSDL_Event): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_PollEvent'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_PollEvent}
+
+{ Waits indefinitely for the next available event, returning 1, or 0 if there
+ was an error while waiting for events. If 'event' is not NULL, the next
+ event is removed from the queue and stored in that area. }
+
+function SDL_WaitEvent(event: PSDL_Event): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_WaitEvent'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_WaitEvent}
+
+function SDL_PushEvent( event : PSDL_Event ) : Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_PushEvent'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_PushEvent}
+
+{ If the filter returns 1, then the event will be added to the internal queue.
+ If it returns 0, then the event will be dropped from the queue, but the
+ internal state will still be updated. This allows selective filtering of
+ dynamically arriving events.
+
+ WARNING: Be very careful of what you do in the event filter function, as
+ it may run in a different thread!
+
+ There is one caveat when dealing with the SDL_QUITEVENT event type. The
+ event filter is only called when the window manager desires to close the
+ application window. If the event filter returns 1, then the window will
+ be closed, otherwise the window will remain open if possible.
+ If the quit event is generated by an interrupt signal, it will bypass the
+ internal queue and be delivered to the application at the next event poll. }
+procedure SDL_SetEventFilter( filter : TSDL_EventFilter );
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_SetEventFilter'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_SetEventFilter}
+
+{ Return the current event filter - can be used to "chain" filters.
+ If there is no event filter set, this function returns NULL. }
+
+function SDL_GetEventFilter: TSDL_EventFilter;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GetEventFilter'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GetEventFilter}
+
+{ This function allows you to set the state of processing certain events.
+ If 'state' is set to SDL_IGNORE, that event will be automatically dropped
+ from the event queue and will not event be filtered.
+ If 'state' is set to SDL_ENABLE, that event will be processed normally.
+ If 'state' is set to SDL_QUERY, SDL_EventState() will return the
+ current processing state of the specified event. }
+
+function SDL_EventState(type_: UInt8; state: Integer): UInt8;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_EventState'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_EventState}
+
+{------------------------------------------------------------------------------}
+{ Version Routines }
+{------------------------------------------------------------------------------}
+
+{ This macro can be used to fill a version structure with the compile-time
+ version of the SDL library. }
+procedure SDL_VERSION(var X: TSDL_Version);
+{$EXTERNALSYM SDL_VERSION}
+
+{ This macro turns the version numbers into a numeric value:
+ (1,2,3) -> (1203)
+ This assumes that there will never be more than 100 patchlevels }
+
+function SDL_VERSIONNUM(X, Y, Z: Integer): Integer;
+{$EXTERNALSYM SDL_VERSIONNUM}
+
+// This is the version number macro for the current SDL version
+function SDL_COMPILEDVERSION: Integer;
+{$EXTERNALSYM SDL_COMPILEDVERSION}
+
+// This macro will evaluate to true if compiled with SDL at least X.Y.Z
+function SDL_VERSION_ATLEAST(X: Integer; Y: Integer; Z: Integer) : LongBool;
+{$EXTERNALSYM SDL_VERSION_ATLEAST}
+
+{ This function gets the version of the dynamically linked SDL library.
+ it should NOT be used to fill a version structure, instead you should
+ use the SDL_Version() macro. }
+
+function SDL_Linked_Version: PSDL_version;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_Linked_Version'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_Linked_Version}
+
+{------------------------------------------------------------------------------}
+{ video }
+{------------------------------------------------------------------------------}
+
+{ These functions are used internally, and should not be used unless you
+ have a specific need to specify the video driver you want to use.
+ You should normally use SDL_Init() or SDL_InitSubSystem().
+
+ SDL_VideoInit() initializes the video subsystem -- sets up a connection
+ to the window manager, etc, and determines the current video mode and
+ pixel format, but does not initialize a window or graphics mode.
+ Note that event handling is activated by this routine.
+
+ If you use both sound and video in your application, you need to call
+ SDL_Init() before opening the sound device, otherwise under Win32 DirectX,
+ you won't be able to set full-screen display modes. }
+
+function SDL_VideoInit(driver_name: PChar; flags: UInt32): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_VideoInit'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_VideoInit}
+procedure SDL_VideoQuit;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_VideoQuit'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_VideoQuit}
+
+{ This function fills the given character buffer with the name of the
+ video driver, and returns a pointer to it if the video driver has
+ been initialized. It returns NULL if no driver has been initialized. }
+
+function SDL_VideoDriverName(namebuf: PChar; maxlen: Integer): PChar;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_VideoDriverName'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_VideoDriverName}
+
+{ This function returns a pointer to the current display surface.
+ If SDL is doing format conversion on the display surface, this
+ function returns the publicly visible surface, not the real video
+ surface. }
+
+function SDL_GetVideoSurface: PSDL_Surface;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GetVideoSurface'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GetVideoSurface}
+
+{ This function returns a read-only pointer to information about the
+ video hardware. If this is called before SDL_SetVideoMode(), the 'vfmt'
+ member of the returned structure will contain the pixel format of the
+ "best" video mode. }
+function SDL_GetVideoInfo: PSDL_VideoInfo;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GetVideoInfo'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GetVideoInfo}
+
+{ Check to see if a particular video mode is supported.
+ It returns 0 if the requested mode is not supported under any bit depth,
+ or returns the bits-per-pixel of the closest available mode with the
+ given width and height. If this bits-per-pixel is different from the
+ one used when setting the video mode, SDL_SetVideoMode() will succeed,
+ but will emulate the requested bits-per-pixel with a shadow surface.
+
+ The arguments to SDL_VideoModeOK() are the same ones you would pass to
+ SDL_SetVideoMode() }
+
+function SDL_VideoModeOK(width, height, bpp: Integer; flags: UInt32): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_VideoModeOK'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_VideoModeOK}
+
+{ Return a pointer to an array of available screen dimensions for the
+ given format and video flags, sorted largest to smallest. Returns
+ NULL if there are no dimensions available for a particular format,
+ or (SDL_Rect **)-1 if any dimension is okay for the given format.
+
+ if 'format' is NULL, the mode list will be for the format given
+ by SDL_GetVideoInfo( ) - > vfmt }
+
+function SDL_ListModes(format: PSDL_PixelFormat; flags: UInt32): PPSDL_Rect;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_ListModes'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_ListModes}
+
+
+{ Set up a video mode with the specified width, height and bits-per-pixel.
+
+ If 'bpp' is 0, it is treated as the current display bits per pixel.
+
+ If SDL_ANYFORMAT is set in 'flags', the SDL library will try to set the
+ requested bits-per-pixel, but will return whatever video pixel format is
+ available. The default is to emulate the requested pixel format if it
+ is not natively available.
+
+ If SDL_HWSURFACE is set in 'flags', the video surface will be placed in
+ video memory, if possible, and you may have to call SDL_LockSurface()
+ in order to access the raw framebuffer. Otherwise, the video surface
+ will be created in system memory.
+
+ If SDL_ASYNCBLIT is set in 'flags', SDL will try to perform rectangle
+ updates asynchronously, but you must always lock before accessing pixels.
+ SDL will wait for updates to complete before returning from the lock.
+
+ If SDL_HWPALETTE is set in 'flags', the SDL library will guarantee
+ that the colors set by SDL_SetColors() will be the colors you get.
+ Otherwise, in 8-bit mode, SDL_SetColors() may not be able to set all
+ of the colors exactly the way they are requested, and you should look
+ at the video surface structure to determine the actual palette.
+ If SDL cannot guarantee that the colors you request can be set,
+ i.e. if the colormap is shared, then the video surface may be created
+ under emulation in system memory, overriding the SDL_HWSURFACE flag.
+
+ If SDL_FULLSCREEN is set in 'flags', the SDL library will try to set
+ a fullscreen video mode. The default is to create a windowed mode
+ if the current graphics system has a window manager.
+ If the SDL library is able to set a fullscreen video mode, this flag
+ will be set in the surface that is returned.
+
+ If SDL_DOUBLEBUF is set in 'flags', the SDL library will try to set up
+ two surfaces in video memory and swap between them when you call
+ SDL_Flip(). This is usually slower than the normal single-buffering
+ scheme, but prevents "tearing" artifacts caused by modifying video
+ memory while the monitor is refreshing. It should only be used by
+ applications that redraw the entire screen on every update.
+
+ This function returns the video framebuffer surface, or NULL if it fails. }
+
+function SDL_SetVideoMode(width, height, bpp: Integer; flags: UInt32): PSDL_Surface;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_SetVideoMode'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_SetVideoMode}
+
+
+{ Makes sure the given list of rectangles is updated on the given screen.
+ If 'x', 'y', 'w' and 'h' are all 0, SDL_UpdateRect will update the entire
+ screen.
+ These functions should not be called while 'screen' is locked. }
+
+procedure SDL_UpdateRects(screen: PSDL_Surface; numrects: Integer; rects: PSDL_Rect);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_UpdateRects'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_UpdateRects}
+procedure SDL_UpdateRect(screen: PSDL_Surface; x, y: SInt32; w, h: UInt32);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_UpdateRect'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_UpdateRect}
+
+
+{ On hardware that supports double-buffering, this function sets up a flip
+ and returns. The hardware will wait for vertical retrace, and then swap
+ video buffers before the next video surface blit or lock will return.
+ On hardware that doesn not support double-buffering, this is equivalent
+ to calling SDL_UpdateRect(screen, 0, 0, 0, 0);
+ The SDL_DOUBLEBUF flag must have been passed to SDL_SetVideoMode() when
+ setting the video mode for this function to perform hardware flipping.
+ This function returns 0 if successful, or -1 if there was an error.}
+
+function SDL_Flip(screen: PSDL_Surface): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_Flip'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_Flip}
+
+{ Set the gamma correction for each of the color channels.
+ The gamma values range (approximately) between 0.1 and 10.0
+
+ If this function isn't supported directly by the hardware, it will
+ be emulated using gamma ramps, if available. If successful, this
+ function returns 0, otherwise it returns -1. }
+
+function SDL_SetGamma(redgamma: single; greengamma: single; bluegamma: single ): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_SetGamma'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_SetGamma}
+
+{ Set the gamma translation table for the red, green, and blue channels
+ of the video hardware. Each table is an array of 256 16-bit quantities,
+ representing a mapping between the input and output for that channel.
+ The input is the index into the array, and the output is the 16-bit
+ gamma value at that index, scaled to the output color precision.
+
+ You may pass NULL for any of the channels to leave it unchanged.
+ If the call succeeds, it will return 0. If the display driver or
+ hardware does not support gamma translation, or otherwise fails,
+ this function will return -1. }
+
+function SDL_SetGammaRamp( redtable: PUInt16; greentable: PUInt16; bluetable: PUInt16): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_SetGammaRamp'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_SetGammaRamp}
+
+{ Retrieve the current values of the gamma translation tables.
+
+ You must pass in valid pointers to arrays of 256 16-bit quantities.
+ Any of the pointers may be NULL to ignore that channel.
+ If the call succeeds, it will return 0. If the display driver or
+ hardware does not support gamma translation, or otherwise fails,
+ this function will return -1. }
+
+function SDL_GetGammaRamp( redtable: PUInt16; greentable: PUInt16; bluetable: PUInt16): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GetGammaRamp'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GetGammaRamp}
+
+{ Sets a portion of the colormap for the given 8-bit surface. If 'surface'
+ is not a palettized surface, this function does nothing, returning 0.
+ If all of the colors were set as passed to SDL_SetColors(), it will
+ return 1. If not all the color entries were set exactly as given,
+ it will return 0, and you should look at the surface palette to
+ determine the actual color palette.
+
+ When 'surface' is the surface associated with the current display, the
+ display colormap will be updated with the requested colors. If
+ SDL_HWPALETTE was set in SDL_SetVideoMode() flags, SDL_SetColors()
+ will always return 1, and the palette is guaranteed to be set the way
+ you desire, even if the window colormap has to be warped or run under
+ emulation. }
+
+
+function SDL_SetColors(surface: PSDL_Surface; colors: PSDL_Color; firstcolor : Integer; ncolors: Integer) : Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_SetColors'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_SetColors}
+
+{ Sets a portion of the colormap for a given 8-bit surface.
+ 'flags' is one or both of:
+ SDL_LOGPAL -- set logical palette, which controls how blits are mapped
+ to/from the surface,
+ SDL_PHYSPAL -- set physical palette, which controls how pixels look on
+ the screen
+ Only screens have physical palettes. Separate change of physical/logical
+ palettes is only possible if the screen has SDL_HWPALETTE set.
+
+ The return value is 1 if all colours could be set as requested, and 0
+ otherwise.
+
+ SDL_SetColors() is equivalent to calling this function with
+ flags = (SDL_LOGPAL or SDL_PHYSPAL). }
+
+function SDL_SetPalette(surface: PSDL_Surface; flags: Integer; colors: PSDL_Color; firstcolor: Integer; ncolors: Integer): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_SetPalette'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_SetPalette}
+
+{ Maps an RGB triple to an opaque pixel value for a given pixel format }
+function SDL_MapRGB(format: PSDL_PixelFormat; r: UInt8; g: UInt8; b: UInt8) : UInt32;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_MapRGB'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_MapRGB}
+
+{ Maps an RGBA quadruple to a pixel value for a given pixel format }
+function SDL_MapRGBA(format: PSDL_PixelFormat; r: UInt8; g: UInt8; b: UInt8; a: UInt8): UInt32;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_MapRGBA'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_MapRGBA}
+
+{ Maps a pixel value into the RGB components for a given pixel format }
+procedure SDL_GetRGB(pixel: UInt32; fmt: PSDL_PixelFormat; r: PUInt8; g: PUInt8; b: PUInt8);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GetRGB'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GetRGB}
+
+{ Maps a pixel value into the RGBA components for a given pixel format }
+procedure SDL_GetRGBA(pixel: UInt32; fmt: PSDL_PixelFormat; r: PUInt8; g: PUInt8; b: PUInt8; a: PUInt8);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GetRGBA'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GetRGBA}
+
+{ Allocate and free an RGB surface (must be called after SDL_SetVideoMode)
+ If the depth is 4 or 8 bits, an empty palette is allocated for the surface.
+ If the depth is greater than 8 bits, the pixel format is set using the
+ flags '[RGB]mask'.
+ If the function runs out of memory, it will return NULL.
+
+ The 'flags' tell what kind of surface to create.
+ SDL_SWSURFACE means that the surface should be created in system memory.
+ SDL_HWSURFACE means that the surface should be created in video memory,
+ with the same format as the display surface. This is useful for surfaces
+ that will not change much, to take advantage of hardware acceleration
+ when being blitted to the display surface.
+ SDL_ASYNCBLIT means that SDL will try to perform asynchronous blits with
+ this surface, but you must always lock it before accessing the pixels.
+ SDL will wait for current blits to finish before returning from the lock.
+ SDL_SRCCOLORKEY indicates that the surface will be used for colorkey blits.
+ If the hardware supports acceleration of colorkey blits between
+ two surfaces in video memory, SDL will try to place the surface in
+ video memory. If this isn't possible or if there is no hardware
+ acceleration available, the surface will be placed in system memory.
+ SDL_SRCALPHA means that the surface will be used for alpha blits and
+ if the hardware supports hardware acceleration of alpha blits between
+ two surfaces in video memory, to place the surface in video memory
+ if possible, otherwise it will be placed in system memory.
+ If the surface is created in video memory, blits will be _much_ faster,
+ but the surface format must be identical to the video surface format,
+ and the only way to access the pixels member of the surface is to use
+ the SDL_LockSurface() and SDL_UnlockSurface() calls.
+ If the requested surface actually resides in video memory, SDL_HWSURFACE
+ will be set in the flags member of the returned surface. If for some
+ reason the surface could not be placed in video memory, it will not have
+ the SDL_HWSURFACE flag set, and will be created in system memory instead. }
+
+function SDL_AllocSurface(flags: UInt32; width, height, depth: Integer;
+ RMask, GMask, BMask, AMask: UInt32): PSDL_Surface;
+{$EXTERNALSYM SDL_AllocSurface}
+
+function SDL_CreateRGBSurface(flags: UInt32; width, height, depth: Integer; RMask, GMask, BMask, AMask: UInt32): PSDL_Surface;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CreateRGBSurface'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CreateRGBSurface}
+
+function SDL_CreateRGBSurfaceFrom(pixels: Pointer; width, height, depth, pitch
+ : Integer; RMask, GMask, BMask, AMask: UInt32): PSDL_Surface;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CreateRGBSurfaceFrom'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CreateRGBSurfaceFrom}
+
+procedure SDL_FreeSurface(surface: PSDL_Surface);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_FreeSurface'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_FreeSurface}
+
+function SDL_MustLock(Surface: PSDL_Surface): Boolean;
+{$EXTERNALSYM SDL_MustLock}
+{ SDL_LockSurface() sets up a surface for directly accessing the pixels.
+ Between calls to SDL_LockSurface()/SDL_UnlockSurface(), you can write
+ to and read from 'surface->pixels', using the pixel format stored in
+ 'surface->format'. Once you are done accessing the surface, you should
+ use SDL_UnlockSurface() to release it.
+
+ Not all surfaces require locking. If SDL_MUSTLOCK(surface) evaluates
+ to 0, then you can read and write to the surface at any time, and the
+ pixel format of the surface will not change. In particular, if the
+ SDL_HWSURFACE flag is not given when calling SDL_SetVideoMode(), you
+ will not need to lock the display surface before accessing it.
+
+ No operating system or library calls should be made between lock/unlock
+ pairs, as critical system locks may be held during this time.
+
+ SDL_LockSurface() returns 0, or -1 if the surface couldn't be locked. }
+function SDL_LockSurface(surface: PSDL_Surface): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_LockSurface'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_LockSurface}
+
+procedure SDL_UnlockSurface(surface: PSDL_Surface);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_UnlockSurface'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_UnlockSurface}
+
+{ Load a surface from a seekable SDL data source (memory or file.)
+ If 'freesrc' is non-zero, the source will be closed after being read.
+ Returns the new surface, or NULL if there was an error.
+ The new surface should be freed with SDL_FreeSurface(). }
+function SDL_LoadBMP_RW(src: PSDL_RWops; freesrc: Integer): PSDL_Surface;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_LoadBMP_RW'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_LoadBMP_RW}
+
+// Convenience macro -- load a surface from a file
+function SDL_LoadBMP(filename: PChar): PSDL_Surface;
+{$EXTERNALSYM SDL_LoadBMP}
+
+{ Save a surface to a seekable SDL data source (memory or file.)
+ If 'freedst' is non-zero, the source will be closed after being written.
+ Returns 0 if successful or -1 if there was an error. }
+
+function SDL_SaveBMP_RW(surface: PSDL_Surface; dst: PSDL_RWops; freedst: Integer): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_SaveBMP_RW'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_SaveBMP_RW}
+
+// Convenience macro -- save a surface to a file
+function SDL_SaveBMP(surface: PSDL_Surface; filename: PChar): Integer;
+{$EXTERNALSYM SDL_SaveBMP}
+
+{ Sets the color key (transparent pixel) in a blittable surface.
+ If 'flag' is SDL_SRCCOLORKEY (optionally OR'd with SDL_RLEACCEL),
+ 'key' will be the transparent pixel in the source image of a blit.
+ SDL_RLEACCEL requests RLE acceleration for the surface if present,
+ and removes RLE acceleration if absent.
+ If 'flag' is 0, this function clears any current color key.
+ This function returns 0, or -1 if there was an error. }
+
+function SDL_SetColorKey(surface: PSDL_Surface; flag, key: UInt32) : Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_SetColorKey'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_SetColorKey}
+
+{ This function sets the alpha value for the entire surface, as opposed to
+ using the alpha component of each pixel. This value measures the range
+ of transparency of the surface, 0 being completely transparent to 255
+ being completely opaque. An 'alpha' value of 255 causes blits to be
+ opaque, the source pixels copied to the destination (the default). Note
+ that per-surface alpha can be combined with colorkey transparency.
+
+ If 'flag' is 0, alpha blending is disabled for the surface.
+ If 'flag' is SDL_SRCALPHA, alpha blending is enabled for the surface.
+ OR:ing the flag with SDL_RLEACCEL requests RLE acceleration for the
+ surface; if SDL_RLEACCEL is not specified, the RLE accel will be removed. }
+
+
+function SDL_SetAlpha(surface: PSDL_Surface; flag: UInt32; alpha: UInt8): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_SetAlpha'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_SetAlpha}
+
+{ Sets the clipping rectangle for the destination surface in a blit.
+
+ If the clip rectangle is NULL, clipping will be disabled.
+ If the clip rectangle doesn't intersect the surface, the function will
+ return SDL_FALSE and blits will be completely clipped. Otherwise the
+ function returns SDL_TRUE and blits to the surface will be clipped to
+ the intersection of the surface area and the clipping rectangle.
+
+ Note that blits are automatically clipped to the edges of the source
+ and destination surfaces. }
+procedure SDL_SetClipRect(surface: PSDL_Surface; rect: PSDL_Rect); cdecl;
+external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_SetClipRect'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_SetClipRect}
+
+{ Gets the clipping rectangle for the destination surface in a blit.
+ 'rect' must be a pointer to a valid rectangle which will be filled
+ with the correct values. }
+procedure SDL_GetClipRect(surface: PSDL_Surface; rect: PSDL_Rect); cdecl;
+external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GetClipRect'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GetClipRect}
+
+{ Creates a new surface of the specified format, and then copies and maps
+ the given surface to it so the blit of the converted surface will be as
+ fast as possible. If this function fails, it returns NULL.
+
+ The 'flags' parameter is passed to SDL_CreateRGBSurface() and has those
+ semantics. You can also pass SDL_RLEACCEL in the flags parameter and
+ SDL will try to RLE accelerate colorkey and alpha blits in the resulting
+ surface.
+
+ This function is used internally by SDL_DisplayFormat(). }
+
+function SDL_ConvertSurface(src: PSDL_Surface; fmt: PSDL_PixelFormat; flags: UInt32): PSDL_Surface;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_ConvertSurface'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_ConvertSurface}
+
+{
+ This performs a fast blit from the source surface to the destination
+ surface. It assumes that the source and destination rectangles are
+ the same size. If either 'srcrect' or 'dstrect' are NULL, the entire
+ surface (src or dst) is copied. The final blit rectangles are saved
+ in 'srcrect' and 'dstrect' after all clipping is performed.
+ If the blit is successful, it returns 0, otherwise it returns -1.
+
+ The blit function should not be called on a locked surface.
+
+ The blit semantics for surfaces with and without alpha and colorkey
+ are defined as follows:
+
+ RGBA->RGB:
+ SDL_SRCALPHA set:
+ alpha-blend (using alpha-channel).
+ SDL_SRCCOLORKEY ignored.
+ SDL_SRCALPHA not set:
+ copy RGB.
+ if SDL_SRCCOLORKEY set, only copy the pixels matching the
+ RGB values of the source colour key, ignoring alpha in the
+ comparison.
+
+ RGB->RGBA:
+ SDL_SRCALPHA set:
+ alpha-blend (using the source per-surface alpha value);
+ set destination alpha to opaque.
+ SDL_SRCALPHA not set:
+ copy RGB, set destination alpha to opaque.
+ both:
+ if SDL_SRCCOLORKEY set, only copy the pixels matching the
+ source colour key.
+
+ RGBA->RGBA:
+ SDL_SRCALPHA set:
+ alpha-blend (using the source alpha channel) the RGB values;
+ leave destination alpha untouched. [Note: is this correct?]
+ SDL_SRCCOLORKEY ignored.
+ SDL_SRCALPHA not set:
+ copy all of RGBA to the destination.
+ if SDL_SRCCOLORKEY set, only copy the pixels matching the
+ RGB values of the source colour key, ignoring alpha in the
+ comparison.
+
+ RGB->RGB:
+ SDL_SRCALPHA set:
+ alpha-blend (using the source per-surface alpha value).
+ SDL_SRCALPHA not set:
+ copy RGB.
+ both:
+ if SDL_SRCCOLORKEY set, only copy the pixels matching the
+ source colour key.
+
+ If either of the surfaces were in video memory, and the blit returns -2,
+ the video memory was lost, so it should be reloaded with artwork and
+ re-blitted:
+ while ( SDL_BlitSurface(image, imgrect, screen, dstrect) = -2 ) do
+ begin
+ while ( SDL_LockSurface(image) < 0 ) do
+ Sleep(10);
+ -- Write image pixels to image->pixels --
+ SDL_UnlockSurface(image);
+ end;
+
+ This happens under DirectX 5.0 when the system switches away from your
+ fullscreen application. The lock will also fail until you have access
+ to the video memory again. }
+
+{ You should call SDL_BlitSurface() unless you know exactly how SDL
+ blitting works internally and how to use the other blit functions. }
+
+function SDL_BlitSurface(src: PSDL_Surface; srcrect: PSDL_Rect; dst: PSDL_Surface; dstrect: PSDL_Rect): Integer;
+{$EXTERNALSYM SDL_BlitSurface}
+
+{ This is the public blit function, SDL_BlitSurface(), and it performs
+ rectangle validation and clipping before passing it to SDL_LowerBlit() }
+function SDL_UpperBlit(src: PSDL_Surface; srcrect: PSDL_Rect; dst: PSDL_Surface; dstrect: PSDL_Rect): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_UpperBlit'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_UpperBlit}
+
+{ This is a semi-private blit function and it performs low-level surface
+ blitting only. }
+function SDL_LowerBlit(src: PSDL_Surface; srcrect: PSDL_Rect; dst: PSDL_Surface; dstrect: PSDL_Rect): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_LowerBlit'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_LowerBlit}
+
+{ This function performs a fast fill of the given rectangle with 'color'
+ The given rectangle is clipped to the destination surface clip area
+ and the final fill rectangle is saved in the passed in pointer.
+ If 'dstrect' is NULL, the whole surface will be filled with 'color'
+ The color should be a pixel of the format used by the surface, and
+ can be generated by the SDL_MapRGB() function.
+ This function returns 0 on success, or -1 on error. }
+
+function SDL_FillRect(dst: PSDL_Surface; dstrect: PSDL_Rect; color: UInt32) : Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_FillRect'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_FillRect}
+
+{ This function takes a surface and copies it to a new surface of the
+ pixel format and colors of the video framebuffer, suitable for fast
+ blitting onto the display surface. It calls SDL_ConvertSurface()
+
+ If you want to take advantage of hardware colorkey or alpha blit
+ acceleration, you should set the colorkey and alpha value before
+ calling this function.
+
+ If the conversion fails or runs out of memory, it returns NULL }
+
+function SDL_DisplayFormat(surface: PSDL_Surface): PSDL_Surface; cdecl;
+external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_DisplayFormat'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_DisplayFormat}
+
+{ This function takes a surface and copies it to a new surface of the
+ pixel format and colors of the video framebuffer (if possible),
+ suitable for fast alpha blitting onto the display surface.
+ The new surface will always have an alpha channel.
+
+ If you want to take advantage of hardware colorkey or alpha blit
+ acceleration, you should set the colorkey and alpha value before
+ calling this function.
+
+ If the conversion fails or runs out of memory, it returns NULL }
+
+
+function SDL_DisplayFormatAlpha(surface: PSDL_Surface): PSDL_Surface; cdecl;
+external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_DisplayFormatAlpha'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_DisplayFormatAlpha}
+
+//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+//* YUV video surface overlay functions */
+//* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * */
+
+{ This function creates a video output overlay
+ Calling the returned surface an overlay is something of a misnomer because
+ the contents of the display surface underneath the area where the overlay
+ is shown is undefined - it may be overwritten with the converted YUV data. }
+
+function SDL_CreateYUVOverlay(width: Integer; height: Integer; format: UInt32; display: PSDL_Surface): PSDL_Overlay;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CreateYUVOverlay'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CreateYUVOverlay}
+
+// Lock an overlay for direct access, and unlock it when you are done
+function SDL_LockYUVOverlay(Overlay: PSDL_Overlay): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_LockYUVOverlay'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_LockYUVOverlay}
+
+procedure SDL_UnlockYUVOverlay(Overlay: PSDL_Overlay); cdecl;
+external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_UnlockYUVOverlay'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_UnlockYUVOverlay}
+
+
+{ Blit a video overlay to the display surface.
+ The contents of the video surface underneath the blit destination are
+ not defined.
+ The width and height of the destination rectangle may be different from
+ that of the overlay, but currently only 2x scaling is supported. }
+
+function SDL_DisplayYUVOverlay(Overlay: PSDL_Overlay; dstrect: PSDL_Rect) : Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_DisplayYUVOverlay'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_DisplayYUVOverlay}
+
+// Free a video overlay
+procedure SDL_FreeYUVOverlay(Overlay: PSDL_Overlay);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_FreeYUVOverlay'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_FreeYUVOverlay}
+
+{------------------------------------------------------------------------------}
+{ OpenGL Routines }
+{------------------------------------------------------------------------------}
+
+{ Dynamically load a GL driver, if SDL is built with dynamic GL.
+
+ SDL links normally with the OpenGL library on your system by default,
+ but you can compile it to dynamically load the GL driver at runtime.
+ If you do this, you need to retrieve all of the GL functions used in
+ your program from the dynamic library using SDL_GL_GetProcAddress().
+
+ This is disabled in default builds of SDL. }
+
+
+function SDL_GL_LoadLibrary(filename: PChar): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GL_LoadLibrary'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GL_LoadLibrary}
+
+{ Get the address of a GL function (for extension functions) }
+function SDL_GL_GetProcAddress(procname: PChar) : Pointer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GL_GetProcAddress'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GL_GetProcAddress}
+
+{ Set an attribute of the OpenGL subsystem before intialization. }
+function SDL_GL_SetAttribute(attr: TSDL_GLAttr; value: Integer) : Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GL_SetAttribute'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GL_SetAttribute}
+
+{ Get an attribute of the OpenGL subsystem from the windowing
+ interface, such as glX. This is of course different from getting
+ the values from SDL's internal OpenGL subsystem, which only
+ stores the values you request before initialization.
+
+ Developers should track the values they pass into SDL_GL_SetAttribute
+ themselves if they want to retrieve these values. }
+
+function SDL_GL_GetAttribute(attr: TSDL_GLAttr; var value: Integer): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GL_GetAttribute'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GL_GetAttribute}
+
+{ Swap the OpenGL buffers, if double-buffering is supported. }
+
+procedure SDL_GL_SwapBuffers;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GL_SwapBuffers'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GL_SwapBuffers;}
+
+{ Internal functions that should not be called unless you have read
+ and understood the source code for these functions. }
+
+procedure SDL_GL_UpdateRects(numrects: Integer; rects: PSDL_Rect);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GL_UpdateRects'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GL_UpdateRects}
+procedure SDL_GL_Lock;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GL_Lock'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GL_Lock;}
+procedure SDL_GL_Unlock;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GL_Unlock'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GL_Unlock;}
+
+{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
+{* These functions allow interaction with the window manager, if any. *}
+{* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *}
+
+{ Sets/Gets the title and icon text of the display window }
+procedure SDL_WM_GetCaption(var title : PChar; var icon : PChar);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_WM_GetCaption'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_WM_GetCaption}
+procedure SDL_WM_SetCaption( const title : PChar; const icon : PChar);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_WM_SetCaption'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_WM_SetCaption}
+
+{ Sets the icon for the display window.
+ This function must be called before the first call to SDL_SetVideoMode().
+ It takes an icon surface, and a mask in MSB format.
+ If 'mask' is NULL, the entire icon surface will be used as the icon. }
+procedure SDL_WM_SetIcon(icon: PSDL_Surface; mask: UInt8);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_WM_SetIcon'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_WM_SetIcon}
+
+{ This function iconifies the window, and returns 1 if it succeeded.
+ If the function succeeds, it generates an SDL_APPACTIVE loss event.
+ This function is a noop and returns 0 in non-windowed environments. }
+
+function SDL_WM_IconifyWindow: Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_WM_IconifyWindow'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_WM_IconifyWindow}
+
+{ Toggle fullscreen mode without changing the contents of the screen.
+ If the display surface does not require locking before accessing
+ the pixel information, then the memory pointers will not change.
+
+ If this function was able to toggle fullscreen mode (change from
+ running in a window to fullscreen, or vice-versa), it will return 1.
+ If it is not implemented, or fails, it returns 0.
+
+ The next call to SDL_SetVideoMode() will set the mode fullscreen
+ attribute based on the flags parameter - if SDL_FULLSCREEN is not
+ set, then the display will be windowed by default where supported.
+
+ This is currently only implemented in the X11 video driver. }
+
+function SDL_WM_ToggleFullScreen(surface: PSDL_Surface): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_WM_ToggleFullScreen'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_WM_ToggleFullScreen}
+
+{ Grabbing means that the mouse is confined to the application window,
+ and nearly all keyboard input is passed directly to the application,
+ and not interpreted by a window manager, if any. }
+
+function SDL_WM_GrabInput(mode: TSDL_GrabMode): TSDL_GrabMode;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_WM_GrabInput'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_WM_GrabInput}
+
+{------------------------------------------------------------------------------}
+{ mouse-routines }
+{------------------------------------------------------------------------------}
+
+{ Retrieve the current state of the mouse.
+ The current button state is returned as a button bitmask, which can
+ be tested using the SDL_BUTTON(X) macros, and x and y are set to the
+ current mouse cursor position. You can pass NULL for either x or y. }
+
+function SDL_GetMouseState(var x: Integer; var y: Integer): UInt8;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GetMouseState'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GetMouseState}
+
+{ Retrieve the current state of the mouse.
+ The current button state is returned as a button bitmask, which can
+ be tested using the SDL_BUTTON(X) macros, and x and y are set to the
+ mouse deltas since the last call to SDL_GetRelativeMouseState(). }
+function SDL_GetRelativeMouseState(var x: Integer; var y: Integer): UInt8;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GetRelativeMouseState'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GetRelativeMouseState}
+
+{ Set the position of the mouse cursor (generates a mouse motion event) }
+procedure SDL_WarpMouse(x, y: UInt16);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_WarpMouse'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_WarpMouse}
+
+{ Create a cursor using the specified data and mask (in MSB format).
+ The cursor width must be a multiple of 8 bits.
+
+ The cursor is created in black and white according to the following:
+ data mask resulting pixel on screen
+ 0 1 White
+ 1 1 Black
+ 0 0 Transparent
+ 1 0 Inverted color if possible, black if not.
+
+ Cursors created with this function must be freed with SDL_FreeCursor(). }
+function SDL_CreateCursor(data, mask: PUInt8; w, h, hot_x, hot_y: Integer): PSDL_Cursor;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CreateCursor'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CreateCursor}
+
+{ Set the currently active cursor to the specified one.
+ If the cursor is currently visible, the change will be immediately
+ represented on the display. }
+procedure SDL_SetCursor(cursor: PSDL_Cursor);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_SetCursor'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_SetCursor}
+
+{ Returns the currently active cursor. }
+function SDL_GetCursor: PSDL_Cursor;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GetCursor'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GetCursor}
+
+{ Deallocates a cursor created with SDL_CreateCursor(). }
+procedure SDL_FreeCursor(cursor: PSDL_Cursor);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_FreeCursor'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_FreeCursor}
+
+{ Toggle whether or not the cursor is shown on the screen.
+ The cursor start off displayed, but can be turned off.
+ SDL_ShowCursor() returns 1 if the cursor was being displayed
+ before the call, or 0 if it was not. You can query the current
+ state by passing a 'toggle' value of -1. }
+function SDL_ShowCursor(toggle: Integer): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_ShowCursor'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_ShowCursor}
+
+function SDL_BUTTON( Button : Integer ) : Integer;
+
+{------------------------------------------------------------------------------}
+{ Keyboard-routines }
+{------------------------------------------------------------------------------}
+
+{ Enable/Disable UNICODE translation of keyboard input.
+ This translation has some overhead, so translation defaults off.
+ If 'enable' is 1, translation is enabled.
+ If 'enable' is 0, translation is disabled.
+ If 'enable' is -1, the translation state is not changed.
+ It returns the previous state of keyboard translation. }
+function SDL_EnableUNICODE(enable: Integer): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_EnableUNICODE'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_EnableUNICODE}
+
+{ If 'delay' is set to 0, keyboard repeat is disabled. }
+function SDL_EnableKeyRepeat(delay: Integer; interval: Integer): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_EnableKeyRepeat'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_EnableKeyRepeat}
+
+procedure SDL_GetKeyRepeat(delay : PInteger; interval: PInteger);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GetKeyRepeat'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GetKeyRepeat}
+
+{ Get a snapshot of the current state of the keyboard.
+ Returns an array of keystates, indexed by the SDLK_* syms.
+ Used:
+
+ UInt8 *keystate = SDL_GetKeyState(NULL);
+ if ( keystate[SDLK_RETURN] ) ... <RETURN> is pressed }
+
+function SDL_GetKeyState(numkeys: PInt): PUInt8;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GetKeyState'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GetKeyState}
+
+{ Get the current key modifier state }
+function SDL_GetModState: TSDLMod;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GetModState'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GetModState}
+
+{ Set the current key modifier state
+ This does not change the keyboard state, only the key modifier flags. }
+procedure SDL_SetModState(modstate: TSDLMod);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_SetModState'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_SetModState}
+
+{ Get the name of an SDL virtual keysym }
+function SDL_GetKeyName(key: TSDLKey): PChar;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GetKeyName'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GetKeyName}
+
+{------------------------------------------------------------------------------}
+{ Active Routines }
+{------------------------------------------------------------------------------}
+
+{ This function returns the current state of the application, which is a
+ bitwise combination of SDL_APPMOUSEFOCUS, SDL_APPINPUTFOCUS, and
+ SDL_APPACTIVE. If SDL_APPACTIVE is set, then the user is able to
+ see your application, otherwise it has been iconified or disabled. }
+
+function SDL_GetAppState: UInt8;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GetAppState'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GetAppState}
+
+
+{ Mutex functions }
+
+{ Create a mutex, initialized unlocked }
+
+function SDL_CreateMutex: PSDL_Mutex;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CreateMutex'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CreateMutex}
+
+{ Lock the mutex (Returns 0, or -1 on error) }
+
+ function SDL_mutexP(mutex: PSDL_mutex): Integer;
+ cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_mutexP'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{ $ EXTERNALSYM SDL_mutexP}
+
+function SDL_LockMutex(mutex: PSDL_mutex): Integer;
+{$EXTERNALSYM SDL_LockMutex}
+
+{ Unlock the mutex (Returns 0, or -1 on error) }
+function SDL_mutexV(mutex: PSDL_mutex): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_mutexV'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_mutexV}
+
+function SDL_UnlockMutex(mutex: PSDL_mutex): Integer;
+{$EXTERNALSYM SDL_UnlockMutex}
+
+{ Destroy a mutex }
+procedure SDL_DestroyMutex(mutex: PSDL_mutex);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_DestroyMutex'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_DestroyMutex}
+
+{ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * }
+{ Semaphore functions }
+{ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * }
+{ Create a semaphore, initialized with value, returns NULL on failure. }
+function SDL_CreateSemaphore(initial_value: UInt32): PSDL_Sem;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CreateSemaphore'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CreateSemaphore}
+
+
+{ Destroy a semaphore }
+procedure SDL_DestroySemaphore(sem: PSDL_sem);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_DestroySemaphore'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_DestroySemaphore}
+
+{ This function suspends the calling thread until the semaphore pointed
+ to by sem has a positive count. It then atomically decreases the semaphore
+ count. }
+
+function SDL_SemWait(sem: PSDL_sem): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_SemWait'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_SemWait}
+
+{ Non-blocking variant of SDL_SemWait(), returns 0 if the wait succeeds,
+ SDL_MUTEX_TIMEDOUT if the wait would block, and -1 on error. }
+
+function SDL_SemTryWait(sem: PSDL_sem): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_SemTryWait'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_SemTryWait}
+
+{ Variant of SDL_SemWait() with a timeout in milliseconds, returns 0 if
+ the wait succeeds, SDL_MUTEX_TIMEDOUT if the wait does not succeed in
+ the allotted time, and -1 on error.
+ On some platforms this function is implemented by looping with a delay
+ of 1 ms, and so should be avoided if possible. }
+
+function SDL_SemWaitTimeout(sem: PSDL_sem; ms: UInt32): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_SemWaitTimeout'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_SemTryWait}
+
+{ Atomically increases the semaphore's count (not blocking), returns 0,
+ or -1 on error. }
+
+function SDL_SemPost(sem: PSDL_sem): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_SemPost'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_SemTryWait}
+
+{ Returns the current count of the semaphore }
+
+function SDL_SemValue(sem: PSDL_sem): UInt32;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_SemValue'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_SemValue}
+
+{ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * }
+{ Condition variable functions }
+{ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * }
+{ Create a condition variable }
+function SDL_CreateCond: PSDL_Cond;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CreateCond'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CreateCond}
+
+{ Destroy a condition variable }
+procedure SDL_DestroyCond(cond: PSDL_Cond);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_DestroyCond'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_DestroyCond}
+
+{ Restart one of the threads that are waiting on the condition variable,
+ returns 0 or -1 on error. }
+
+function SDL_CondSignal(cond: PSDL_cond): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CondSignal'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CondSignal}
+
+{ Restart all threads that are waiting on the condition variable,
+ returns 0 or -1 on error. }
+
+function SDL_CondBroadcast(cond: PSDL_cond): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CondBroadcast'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CondBroadcast}
+
+
+{ Wait on the condition variable, unlocking the provided mutex.
+ The mutex must be locked before entering this function!
+ Returns 0 when it is signaled, or -1 on error. }
+
+function SDL_CondWait(cond: PSDL_cond; mut: PSDL_mutex): Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CondWait'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CondWait}
+
+{ Waits for at most 'ms' milliseconds, and returns 0 if the condition
+ variable is signaled, SDL_MUTEX_TIMEDOUT if the condition is not
+ signaled in the allotted time, and -1 on error.
+ On some platforms this function is implemented by looping with a delay
+ of 1 ms, and so should be avoided if possible. }
+
+function SDL_CondWaitTimeout(cond: PSDL_cond; mut: PSDL_mutex; ms: UInt32) : Integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CondWaitTimeout'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CondWaitTimeout}
+
+{ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * }
+{ Condition variable functions }
+{ * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * }
+
+{ Create a thread }
+function SDL_CreateThread(fn: PInt; data: Pointer): PSDL_Thread;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_CreateThread'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_CreateThread}
+
+{ Get the 32-bit thread identifier for the current thread }
+function SDL_ThreadID: UInt32;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_ThreadID'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_ThreadID}
+
+{ Get the 32-bit thread identifier for the specified thread,
+ equivalent to SDL_ThreadID() if the specified thread is NULL. }
+function SDL_GetThreadID(thread: PSDL_Thread): UInt32;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GetThreadID'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GetThreadID}
+
+{ Wait for a thread to finish.
+ The return code for the thread function is placed in the area
+ pointed to by 'status', if 'status' is not NULL. }
+
+procedure SDL_WaitThread(thread: PSDL_Thread; var status: Integer);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_WaitThread'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_WaitThread}
+
+{ Forcefully kill a thread without worrying about its state }
+procedure SDL_KillThread(thread: PSDL_Thread);
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_KillThread'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_KillThread}
+
+{------------------------------------------------------------------------------}
+{ Get Environment Routines }
+{------------------------------------------------------------------------------}
+{$IFDEF WINDOWS}
+function _putenv( const variable : Pchar ): integer;
+cdecl;
+{$ENDIF}
+
+{$IFDEF Unix}
+{$IFDEF FPC}
+function _putenv( const variable : Pchar ): integer;
+cdecl; external 'libc.so' name 'putenv';
+{$ENDIF}
+{$ENDIF}
+
+{ Put a variable of the form "name=value" into the environment }
+//function SDL_putenv(const variable: PChar): integer; cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_Init'{$ELSE} SDLLibName{$ENDIF __GPC__}SDLLibName name '';
+function SDL_putenv(const variable: PChar): integer;
+{$EXTERNALSYM SDL_putenv}
+
+// The following function has been commented out to encourage developers to use
+// SDL_putenv as it it more portable
+//function putenv(const variable: PChar): integer;
+//{$EXTERNALSYM putenv}
+
+{$IFDEF WINDOWS}
+{$IFNDEF __GPC__}
+function getenv( const name : Pchar ): PChar; cdecl;
+{$ENDIF}
+{$ENDIF}
+
+{* Retrieve a variable named "name" from the environment }
+//function SDL_getenv(const name: PChar): PChar; cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_Init'{$ELSE} SDLLibName{$ENDIF __GPC__}SDLLibName name '';
+function SDL_getenv(const name: PChar): PChar;
+{$EXTERNALSYM SDL_getenv}
+
+// The following function has been commented out to encourage developers to use
+// SDL_getenv as it it more portable
+//function getenv(const name: PChar): PChar;
+//{$EXTERNALSYM getenv}
+
+{*
+ * This function gives you custom hooks into the window manager information.
+ * It fills the structure pointed to by 'info' with custom information and
+ * returns 1 if the function is implemented. If it's not implemented, or
+ * the version member of the 'info' structure is invalid, it returns 0.
+ *}
+function SDL_GetWMInfo(info : PSDL_SysWMinfo) : integer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_GetWMInfo'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_GetWMInfo}
+
+{------------------------------------------------------------------------------}
+
+//SDL_loadso.h
+{* This function dynamically loads a shared object and returns a pointer
+ * to the object handle (or NULL if there was an error).
+ * The 'sofile' parameter is a system dependent name of the object file.
+ *}
+function SDL_LoadObject( const sofile : PChar ) : Pointer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_LoadObject'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_LoadObject}
+
+{* Given an object handle, this function looks up the address of the
+ * named function in the shared object and returns it. This address
+ * is no longer valid after calling SDL_UnloadObject().
+ *}
+function SDL_LoadFunction( handle : Pointer; const name : PChar ) : Pointer;
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_LoadFunction'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_LoadFunction}
+
+{* Unload a shared object from memory *}
+procedure SDL_UnloadObject( handle : Pointer );
+cdecl; external {$IFNDEF NDS}{$IFDEF __GPC__}name 'SDL_UnloadObject'{$ELSE} SDLLibName{$ENDIF __GPC__}{$ENDIF};
+{$EXTERNALSYM SDL_UnloadObject}
+
+
+
+{------------------------------------------------------------------------------}
+
+function SDL_Swap32(D: Uint32): Uint32;
+{$EXTERNALSYM SDL_Swap32}
+
+{ FreeAndNil frees the given TObject instance and sets the variable reference
+ to nil. Be careful to only pass TObjects to this routine. }
+procedure FreeAndNil(var Obj);
+
+{ Exit procedure handling }
+
+{ AddExitProc adds the given procedure to the run-time library's exit
+ procedure list. When an application terminates, its exit procedures are
+ executed in reverse order of definition, i.e. the last procedure passed
+ to AddExitProc is the first one to get executed upon termination. }
+procedure AddExitProc(Proc: TProcedure);
+
+// Bitwise Checking functions
+function IsBitOn( value : integer; bit : Byte ) : boolean;
+
+function TurnBitOn( value : integer; bit : Byte ) : integer;
+
+function TurnBitOff( value : integer; bit : Byte ) : integer;
+
+implementation
+
+{$IFDEF __GPC__}
+ {$L 'sdl'} { link sdl.dll.a or libsdl.so or libsdl.a }
+{$ENDIF}
+
+function SDL_TABLESIZE(table: PChar): Integer;
+begin
+ Result := SizeOf(table) div SizeOf(table[0]);
+end;
+
+procedure SDL_OutOfMemory;
+begin
+ {$IFNDEF WINDOWS}
+ SDL_Error(SDL_ENOMEM);
+ {$ENDIF}
+end;
+
+function SDL_RWSeek(context: PSDL_RWops; offset: Integer; whence: Integer) : Integer;
+begin
+ Result := context^.seek(context, offset, whence);
+end;
+
+function SDL_RWTell(context: PSDL_RWops): Integer;
+begin
+ Result := context^.seek(context, 0, 1);
+end;
+
+function SDL_RWRead(context: PSDL_RWops; ptr: Pointer; size: Integer; n: Integer): Integer;
+begin
+ Result := context^.read(context, ptr, size, n);
+end;
+
+function SDL_RWWrite(context: PSDL_RWops; ptr: Pointer; size: Integer; n: Integer): Integer;
+begin
+ Result := context^.write(context, ptr, size, n);
+end;
+
+function SDL_RWClose(context: PSDL_RWops): Integer;
+begin
+ Result := context^.close(context);
+end;
+
+function SDL_LoadWAV(filename: PChar; spec: PSDL_AudioSpec; audio_buf: PUInt8; audiolen: PUInt32): PSDL_AudioSpec;
+begin
+ Result := SDL_LoadWAV_RW(SDL_RWFromFile(filename, 'rb'), 1, spec, audio_buf, audiolen);
+end;
+
+function SDL_CDInDrive( status : TSDL_CDStatus ): LongBool;
+begin
+ Result := ord( status ) > ord( CD_ERROR );
+end;
+
+procedure FRAMES_TO_MSF(frames: Integer; var M: Integer; var S: Integer; var
+ F: Integer);
+var
+ value: Integer;
+begin
+ value := frames;
+ F := value mod CD_FPS;
+ value := value div CD_FPS;
+ S := value mod 60;
+ value := value div 60;
+ M := value;
+end;
+
+function MSF_TO_FRAMES(M: Integer; S: Integer; F: Integer): Integer;
+begin
+ Result := M * 60 * CD_FPS + S * CD_FPS + F;
+end;
+
+procedure SDL_VERSION(var X: TSDL_Version);
+begin
+ X.major := SDL_MAJOR_VERSION;
+ X.minor := SDL_MINOR_VERSION;
+ X.patch := SDL_PATCHLEVEL;
+end;
+
+function SDL_VERSIONNUM(X, Y, Z: Integer): Integer;
+begin
+ Result := X * 1000 + Y * 100 + Z;
+end;
+
+function SDL_COMPILEDVERSION: Integer;
+begin
+ Result := SDL_VERSIONNUM(SDL_MAJOR_VERSION, SDL_MINOR_VERSION, SDL_PATCHLEVEL
+ );
+end;
+
+function SDL_VERSION_ATLEAST(X, Y, Z: Integer): LongBool;
+begin
+ Result := (SDL_COMPILEDVERSION >= SDL_VERSIONNUM(X, Y, Z));
+end;
+
+function SDL_LoadBMP(filename: PChar): PSDL_Surface;
+begin
+ Result := SDL_LoadBMP_RW(SDL_RWFromFile(filename, 'rb'), 1);
+end;
+
+function SDL_SaveBMP(surface: PSDL_Surface; filename: PChar): Integer;
+begin
+ Result := SDL_SaveBMP_RW(surface, SDL_RWFromFile(filename, 'wb'), 1);
+end;
+
+function SDL_BlitSurface(src: PSDL_Surface; srcrect: PSDL_Rect; dst:
+ PSDL_Surface;
+ dstrect: PSDL_Rect): Integer;
+begin
+ Result := SDL_UpperBlit(src, srcrect, dst, dstrect);
+end;
+
+function SDL_AllocSurface(flags: UInt32; width, height, depth: Integer;
+ RMask, GMask, BMask, AMask: UInt32): PSDL_Surface;
+begin
+ Result := SDL_CreateRGBSurface(flags, width, height, depth, RMask, GMask,
+ BMask, AMask);
+end;
+
+function SDL_MustLock(Surface: PSDL_Surface): Boolean;
+begin
+ Result := ( ( surface^.offset <> 0 ) or
+ ( ( surface^.flags and ( SDL_HWSURFACE or SDL_ASYNCBLIT or SDL_RLEACCEL ) ) <> 0 ) );
+end;
+
+function SDL_LockMutex(mutex: PSDL_mutex): Integer;
+begin
+ Result := SDL_mutexP(mutex);
+end;
+
+function SDL_UnlockMutex(mutex: PSDL_mutex): Integer;
+begin
+ Result := SDL_mutexV(mutex);
+end;
+
+{$IFDEF WINDOWS}
+function _putenv( const variable : Pchar ): Integer;
+cdecl; external {$IFDEF __GPC__}name '_putenv'{$ELSE} 'MSVCRT.DLL'{$ENDIF __GPC__};
+{$ENDIF}
+
+
+function SDL_putenv(const variable: PChar): Integer;
+begin
+ {$IFDEF WINDOWS}
+ Result := _putenv(variable);
+ {$ENDIF}
+
+ {$IFDEF UNIX}
+ {$IFDEF FPC}
+ Result := _putenv(variable);
+ {$ELSE}
+ Result := libc.putenv(variable);
+ {$ENDIF}
+ {$ENDIF}
+end;
+
+{$IFDEF WINDOWS}
+{$IFNDEF __GPC__}
+function getenv( const name : Pchar ): PChar;
+cdecl; external {$IFDEF __GPC__}name 'getenv'{$ELSE} 'MSVCRT.DLL'{$ENDIF};
+{$ENDIF}
+{$ENDIF}
+
+function SDL_getenv(const name: PChar): PChar;
+begin
+ {$IFDEF WINDOWS}
+
+ {$IFDEF __GPC__}
+ Result := getenv( string( name ) );
+ {$ELSE}
+ Result := getenv( name );
+ {$ENDIF}
+
+ {$ELSE}
+
+ {$IFDEF UNIX}
+
+ {$IFDEF FPC}
+ Result := fpgetenv(name);
+ {$ELSE}
+ Result := libc.getenv(name);
+ {$ENDIF}
+
+ {$ENDIF}
+
+ {$ENDIF}
+end;
+
+function SDL_BUTTON( Button : Integer ) : Integer;
+begin
+ Result := SDL_PRESSED shl ( Button - 1 );
+end;
+
+function SDL_Swap32(D: Uint32): Uint32;
+begin
+ Result := ((D shl 24) or ((D shl 8) and $00FF0000) or ((D shr 8) and $0000FF00) or (D shr 24));
+end;
+
+procedure FreeAndNil(var Obj);
+{$IFNDEF __GPC__}
+{$IFNDEF __TMT__}
+var
+ Temp: TObject;
+{$ENDIF}
+{$ENDIF}
+begin
+{$IFNDEF __GPC__}
+{$IFNDEF __TMT__}
+ Temp := TObject(Obj);
+ Pointer(Obj) := nil;
+ Temp.Free;
+{$ENDIF}
+{$ENDIF}
+end;
+
+{ Exit procedure handling }
+type
+ PExitProcInfo = ^TExitProcInfo;
+ TExitProcInfo = record
+ Next: PExitProcInfo;
+ SaveExit: Pointer;
+ Proc: TProcedure;
+ end;
+
+var
+ ExitProcList: PExitProcInfo = nil;
+
+procedure DoExitProc;
+var
+ P: PExitProcInfo;
+ Proc: TProcedure;
+begin
+ P := ExitProcList;
+ ExitProcList := P^.Next;
+ ExitProc := P^.SaveExit;
+ Proc := P^.Proc;
+ Dispose(P);
+ Proc;
+end;
+
+procedure AddExitProc(Proc: TProcedure);
+var
+ P: PExitProcInfo;
+begin
+ New(P);
+ P^.Next := ExitProcList;
+ P^.SaveExit := ExitProc;
+ P^.Proc := Proc;
+ ExitProcList := P;
+ ExitProc := @DoExitProc;
+end;
+
+function IsBitOn( value : integer; bit : Byte ) : boolean;
+begin
+ result := ( ( value and ( 1 shl bit ) ) <> 0 );
+end;
+
+function TurnBitOn( value : integer; bit : Byte ) : integer;
+begin
+ result := ( value or ( 1 shl bit ) );
+end;
+
+function TurnBitOff( value : integer; bit : Byte ) : integer;
+begin
+ result := ( value and not ( 1 shl bit ) );
+end;
+
+end.
+
+
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdl_cpuinfo.pas b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdl_cpuinfo.pas
new file mode 100644
index 00000000..bd371c55
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdl_cpuinfo.pas
@@ -0,0 +1,155 @@
+unit sdl_cpuinfo;
+{
+ $Id: sdl_cpuinfo.pas,v 1.2 2004/02/18 22:52:53 savage Exp $
+
+}
+{******************************************************************************}
+{ }
+{ Borland Delphi SDL - Simple DirectMedia Layer }
+{ Conversion of the Simple DirectMedia Layer Headers }
+{ }
+{ Portions created by Sam Lantinga <slouken@devolution.com> are }
+{ Copyright (C) 1997-2004 Sam Lantinga }
+{ 5635-34 Springhouse Dr. }
+{ Pleasanton, CA 94588 (USA) }
+{ }
+{ All Rights Reserved. }
+{ }
+{ The original files are : SDL_cpuinfo.h }
+{ }
+{ The initial developer of this Pascal code was : }
+{ Dominqiue Louis <Dominique@SavageSoftware.com.au> }
+{ }
+{ Portions created by Dominqiue Louis are }
+{ Copyright (C) 2000 - 2004 Dominqiue Louis. }
+{ }
+{ }
+{ Contributor(s) }
+{ -------------- }
+{ Obtained through: }
+{ Joint Endeavour of Delphi Innovators ( Project JEDI ) }
+{ }
+{ You may retrieve the latest version of this file at the Project }
+{ JEDI home page, located at http://delphi-jedi.org }
+{ }
+{ The contents of this file are used with permission, subject to }
+{ the Mozilla Public License Version 1.1 (the "License"); you may }
+{ not use this file except in compliance with the License. You may }
+{ obtain a copy of the License at }
+{ http://www.mozilla.org/MPL/MPL-1.1.html }
+{ }
+{ Software distributed under the License is distributed on an }
+{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
+{ implied. See the License for the specific language governing }
+{ rights and limitations under the License. }
+{ }
+{ Description }
+{ ----------- }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ Requires }
+{ -------- }
+{ The SDL Runtime libraris on Win32 : SDL.dll on Linux : libSDL.so }
+{ They are available from... }
+{ http://www.libsdl.org . }
+{ }
+{ Programming Notes }
+{ ----------------- }
+{ }
+{ }
+{ }
+{ }
+{ Revision History }
+{ ---------------- }
+{
+ $Log: sdl_cpuinfo.pas,v $
+ Revision 1.2 2004/02/18 22:52:53 savage
+ Forgot to add jedi-sdl.inc file. It's there now.
+
+ Revision 1.1 2004/02/18 22:35:54 savage
+ Brought sdl.pas up to 1.2.7 compatability
+ Thus...
+ Added SDL_GL_STEREO,
+ SDL_GL_MULTISAMPLEBUFFERS,
+ SDL_GL_MULTISAMPLESAMPLES
+
+ Add DLL/Shared object functions
+ function SDL_LoadObject( const sofile : PChar ) : Pointer;
+
+ function SDL_LoadFunction( handle : Pointer; const name : PChar ) : Pointer;
+
+ procedure SDL_UnloadObject( handle : Pointer );
+
+ Added function to create RWops from const memory: SDL_RWFromConstMem()
+ function SDL_RWFromConstMem(const mem: Pointer; size: Integer) : PSDL_RWops;
+
+ Ported SDL_cpuinfo.h so Now you can test for Specific CPU types.
+
+
+}
+{******************************************************************************}
+
+interface
+
+{$I jedi-sdl.inc}
+
+uses
+ sdl;
+
+{* This function returns true if the CPU has the RDTSC instruction
+ *}
+function SDL_HasRDTSC : SDL_Bool;
+cdecl; external {$IFDEF __GPC__}name 'SDL_HasRDTSC'{$ELSE} SDLLibName{$ENDIF __GPC__};
+{$EXTERNALSYM SDL_HasRDTSC}
+
+{* This function returns true if the CPU has MMX features
+ *}
+function SDL_HasMMX : SDL_Bool;
+cdecl; external {$IFDEF __GPC__}name 'SDL_HasMMX'{$ELSE} SDLLibName{$ENDIF __GPC__};
+{$EXTERNALSYM SDL_HasMMX}
+
+{* This function returns true if the CPU has MMX Ext. features
+ *}
+function SDL_HasMMXExt : SDL_Bool;
+cdecl; external {$IFDEF __GPC__}name 'SDL_HasMMXExt'{$ELSE} SDLLibName{$ENDIF __GPC__};
+{$EXTERNALSYM SDL_HasMMXExt}
+
+{* This function returns true if the CPU has 3DNow features
+ *}
+function SDL_Has3DNow : SDL_Bool;
+cdecl; external {$IFDEF __GPC__}name 'SDL_Has3DNow'{$ELSE} SDLLibName{$ENDIF __GPC__};
+{$EXTERNALSYM SDL_Has3DNow}
+
+{* This function returns true if the CPU has 3DNow! Ext. features
+ *}
+function SDL_Has3DNowExt : SDL_Bool;
+cdecl; external {$IFDEF __GPC__}name 'SDL_Has3DNowExt'{$ELSE} SDLLibName{$ENDIF __GPC__};
+{$EXTERNALSYM SDL_Has3DNowExt}
+
+{* This function returns true if the CPU has SSE features
+ *}
+function SDL_HasSSE : SDL_Bool;
+cdecl; external {$IFDEF __GPC__}name 'SDL_HasSSE'{$ELSE} SDLLibName{$ENDIF __GPC__};
+{$EXTERNALSYM SDL_HasSSE}
+
+{* This function returns true if the CPU has SSE2 features
+ *}
+function SDL_HasSSE2 : SDL_Bool;
+cdecl; external {$IFDEF __GPC__}name 'SDL_HasSSE2'{$ELSE} SDLLibName{$ENDIF __GPC__};
+{$EXTERNALSYM SDL_HasSSE2}
+
+{* This function returns true if the CPU has AltiVec features
+ *}
+function SDL_HasAltiVec : SDL_Bool;
+cdecl; external {$IFDEF __GPC__}name 'SDL_HasAltiVec'{$ELSE} SDLLibName{$ENDIF __GPC__};
+{$EXTERNALSYM SDL_HasAltiVec}
+
+implementation
+
+end.
+ \ No newline at end of file
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlgameinterface.pas b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlgameinterface.pas
new file mode 100644
index 00000000..cc95751d
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlgameinterface.pas
@@ -0,0 +1,202 @@
+unit sdlgameinterface;
+{
+ $Id: sdlgameinterface.pas,v 1.4 2005/08/03 18:57:31 savage Exp $
+
+}
+{******************************************************************************}
+{ }
+{ JEDI-SDL : Pascal units for SDL - Simple DirectMedia Layer }
+{ Game Interface Base class }
+{ }
+{ The initial developer of this Pascal code was : }
+{ Dominqiue Louis <Dominique@SavageSoftware.com.au> }
+{ }
+{ Portions created by Dominqiue Louis are }
+{ Copyright (C) 2000 - 2001 Dominqiue Louis. }
+{ }
+{ }
+{ Contributor(s) }
+{ -------------- }
+{ }
+{ }
+{ Obtained through: }
+{ Joint Endeavour of Delphi Innovators ( Project JEDI ) }
+{ }
+{ You may retrieve the latest version of this file at the Project }
+{ JEDI home page, located at http://delphi-jedi.org }
+{ }
+{ The contents of this file are used with permission, subject to }
+{ the Mozilla Public License Version 1.1 (the "License"); you may }
+{ not use this file except in compliance with the License. You may }
+{ obtain a copy of the License at }
+{ http://www.mozilla.org/MPL/MPL-1.1.html }
+{ }
+{ Software distributed under the License is distributed on an }
+{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
+{ implied. See the License for the specific language governing }
+{ rights and limitations under the License. }
+{ }
+{ Description }
+{ ----------- }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ Requires }
+{ -------- }
+{ The SDL Runtime libraris on Win32 : SDL.dll on Linux : libSDL.so }
+{ They are available from... }
+{ http://www.libsdl.org . }
+{ }
+{ Programming Notes }
+{ ----------------- }
+{ }
+{ }
+{ }
+{ }
+{ Revision History }
+{ ---------------- }
+{ September 23 2004 - DL : Initial Creation }
+{
+ $Log: sdlgameinterface.pas,v $
+ Revision 1.4 2005/08/03 18:57:31 savage
+ Various updates and additions. Mainly to handle OpenGL 3D Window support and better cursor support for the mouse class
+
+ Revision 1.3 2004/10/17 18:41:49 savage
+ Slight Change to allow Reseting of Input Event handlers
+
+ Revision 1.2 2004/09/30 22:35:47 savage
+ Changes, enhancements and additions as required to get SoAoS working.
+
+
+}
+{******************************************************************************}
+
+interface
+
+uses
+ sdl,
+ sdlwindow;
+
+type
+ TGameInterfaceClass = class of TGameInterface;
+
+ TGameInterface = class( TObject )
+ private
+ FNextGameInterface : TGameInterfaceClass;
+ protected
+ Dragging : Boolean;
+ Loaded : Boolean;
+ procedure FreeSurfaces; virtual;
+ procedure Render; virtual; abstract;
+ procedure Close; virtual;
+ procedure Update( aElapsedTime : single ); virtual;
+ procedure MouseDown( Button : Integer; Shift: TSDLMod; MousePos : TPoint ); virtual;
+ procedure MouseMove( Shift: TSDLMod; CurrentPos : TPoint; RelativePos : TPoint ); virtual;
+ procedure MouseUp( Button : Integer; Shift: TSDLMod; MousePos : TPoint ); virtual;
+ procedure MouseWheelScroll( WheelDelta : Integer; Shift: TSDLMod; MousePos : TPoint ); virtual;
+ procedure KeyDown( var Key: TSDLKey; Shift: TSDLMod; unicode : UInt16 ); virtual;
+ public
+ MainWindow : TSDLCustomWindow;
+ procedure ResetInputManager;
+ procedure LoadSurfaces; virtual;
+ function PointIsInRect( Point : TPoint; x, y, x1, y1 : integer ) : Boolean;
+ constructor Create( const aMainWindow : TSDLCustomWindow );
+ destructor Destroy; override;
+ property NextGameInterface : TGameInterfaceClass read FNextGameInterface write FNextGameInterface;
+ end;
+
+implementation
+
+{ TGameInterface }
+procedure TGameInterface.Close;
+begin
+ FNextGameInterface := nil;
+end;
+
+constructor TGameInterface.Create( const aMainWindow : TSDLCustomWindow );
+begin
+ inherited Create;
+ MainWindow := aMainWindow;
+ FNextGameInterface := TGameInterface;
+ ResetInputManager;
+end;
+
+destructor TGameInterface.Destroy;
+begin
+ if Loaded then
+ FreeSurfaces;
+ inherited;
+end;
+
+procedure TGameInterface.FreeSurfaces;
+begin
+ Loaded := False;
+end;
+
+procedure TGameInterface.KeyDown(var Key: TSDLKey; Shift: TSDLMod; unicode: UInt16);
+begin
+
+end;
+
+procedure TGameInterface.LoadSurfaces;
+begin
+ Loaded := True;
+end;
+
+procedure TGameInterface.MouseDown(Button: Integer; Shift: TSDLMod; MousePos: TPoint);
+begin
+ Dragging := True;
+end;
+
+procedure TGameInterface.MouseMove(Shift: TSDLMod; CurrentPos, RelativePos: TPoint);
+begin
+
+end;
+
+procedure TGameInterface.MouseUp(Button: Integer; Shift: TSDLMod; MousePos: TPoint);
+begin
+ Dragging := True;
+end;
+
+procedure TGameInterface.MouseWheelScroll(WheelDelta: Integer; Shift: TSDLMod; MousePos: TPoint);
+begin
+
+end;
+
+function TGameInterface.PointIsInRect( Point : TPoint; x, y, x1, y1: integer ): Boolean;
+begin
+ if ( Point.x >= x )
+ and ( Point.y >= y )
+ and ( Point.x <= x1 )
+ and ( Point.y <= y1 ) then
+ result := true
+ else
+ result := false;
+end;
+
+procedure TGameInterface.ResetInputManager;
+var
+ temp : TSDLNotifyEvent;
+begin
+ MainWindow.InputManager.Mouse.OnMouseDown := MouseDown;
+ MainWindow.InputManager.Mouse.OnMouseMove := MouseMove;
+ MainWindow.InputManager.Mouse.OnMouseUp := MouseUp;
+ MainWindow.InputManager.Mouse.OnMouseWheel := MouseWheelScroll;
+ MainWindow.InputManager.KeyBoard.OnKeyDown := KeyDown;
+ temp := Render;
+ MainWindow.OnRender := temp;
+ temp := Close;
+ MainWindow.OnClose := temp;
+ MainWindow.OnUpdate := Update;
+end;
+
+procedure TGameInterface.Update(aElapsedTime: single);
+begin
+
+end;
+
+end.
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdli386utils.pas b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdli386utils.pas
new file mode 100644
index 00000000..9151168a
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdli386utils.pas
@@ -0,0 +1,5236 @@
+unit sdli386utils;
+{
+ $Id: sdli386utils.pas,v 1.5 2004/06/02 19:38:53 savage Exp $
+
+}
+{******************************************************************************}
+{ }
+{ Borland Delphi SDL - Simple DirectMedia Layer }
+{ SDL Utility functions }
+{ }
+{ }
+{ The initial developer of this Pascal code was : }
+{ Tom Jones <tigertomjones@gmx.de> }
+{ }
+{ Portions created by Tom Jones are }
+{ Copyright (C) 2000 - 2001 Tom Jones. }
+{ }
+{ }
+{ Contributor(s) }
+{ -------------- }
+{ Dominique Louis <Dominique@SavageSoftware.com.au> }
+{ Róbert Kisnémeth <mikrobi@freemail.hu> }
+{ }
+{ Obtained through: }
+{ Joint Endeavour of Delphi Innovators ( Project JEDI ) }
+{ }
+{ You may retrieve the latest version of this file at the Project }
+{ JEDI home page, located at http://delphi-jedi.org }
+{ }
+{ The contents of this file are used with permission, subject to }
+{ the Mozilla Public License Version 1.1 (the "License"); you may }
+{ not use this file except in compliance with the License. You may }
+{ obtain a copy of the License at }
+{ http://www.mozilla.org/MPL/MPL-1.1.html }
+{ }
+{ Software distributed under the License is distributed on an }
+{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
+{ implied. See the License for the specific language governing }
+{ rights and limitations under the License. }
+{ }
+{ Description }
+{ ----------- }
+{ Helper functions... }
+{ }
+{ }
+{ Requires }
+{ -------- }
+{ SDL.dll on Windows platforms }
+{ libSDL-1.1.so.0 on Linux platform }
+{ }
+{ Programming Notes }
+{ ----------------- }
+{ }
+{ }
+{ }
+{ }
+{ Revision History }
+{ ---------------- }
+{ 2000 - TJ : Initial creation }
+{ }
+{ July 13 2001 - DL : Added PutPixel and GetPixel routines. }
+{ }
+{ Sept 14 2001 - RK : Added flipping routines. }
+{ }
+{ Sept 19 2001 - RK : Added PutPixel & line drawing & blitting with ADD }
+{ effect. Fixed a bug in SDL_PutPixel & SDL_GetPixel }
+{ Added PSDLRect() }
+{ Sept 22 2001 - DL : Removed need for Windows.pas by defining types here}
+{ Also removed by poor attempt or a dialog box }
+{ }
+{ Sept 25 2001 - RK : Added PixelTest, NewPutPixel, SubPixel, SubLine, }
+{ SubSurface, MonoSurface & TexturedSurface }
+{ }
+{ Sept 26 2001 - DL : Made change so that it refers to native Pascal }
+{ types rather that Windows types. This makes it more}
+{ portable to Linix. }
+{ }
+{ Sept 27 2001 - RK : SDLUtils now can be compiled with FreePascal }
+{ }
+{ Oct 27 2001 - JF : Added ScrollY function }
+{ }
+{ Jan 21 2002 - RK : Added SDL_ZoomSurface and SDL_WarpSurface }
+{ }
+{ Mar 28 2002 - JF : Added SDL_RotateSurface }
+{ }
+{ May 13 2002 - RK : Improved SDL_FillRectAdd & SDL_FillRectSub }
+{ }
+{ May 27 2002 - YS : GradientFillRect function }
+{ }
+{ May 30 2002 - RK : Added SDL_2xBlit, SDL_Scanline2xBlit }
+{ & SDL_50Scanline2xBlit }
+{ }
+{ June 12 2002 - RK : Added SDL_PixelTestSurfaceVsRect }
+{ }
+{ June 12 2002 - JF : Updated SDL_PixelTestSurfaceVsRect }
+{ }
+{ November 9 2002 - JF : Added Jason's boolean Surface functions }
+{ }
+{ December 10 2002 - DE : Added Dean's SDL_ClipLine function }
+{ }
+{******************************************************************************}
+{
+ $Log: sdli386utils.pas,v $
+ Revision 1.5 2004/06/02 19:38:53 savage
+ Changes to SDL_GradientFillRect as suggested by
+ Ángel Eduardo García Hernández. Many thanks.
+
+ Revision 1.4 2004/05/29 23:11:53 savage
+ Changes to SDL_ScaleSurfaceRect as suggested by
+ Ángel Eduardo García Hernández to fix a colour issue with the function. Many thanks.
+
+ Revision 1.3 2004/02/20 22:04:11 savage
+ Added Changes as mentioned by Rodrigo "Rui" R. (1/2 RRC2Soft) to facilitate FPC compilation and it also works in Delphi. Also syncronized the funcitons so that they are identical to sdlutils.pas, when no assembly version is available.
+
+ Revision 1.2 2004/02/14 00:23:39 savage
+ As UNIX is defined in jedi-sdl.inc this will be used to check linux compatability as well. Units have been changed to reflect this change.
+
+ Revision 1.1 2004/02/05 00:08:20 savage
+ Module 1.0 release
+
+
+}
+
+interface
+
+{$i jedi-sdl.inc}
+
+uses
+{$IFDEF UNIX}
+ Types,
+ Xlib,
+{$ENDIF}
+ SysUtils,
+ sdl;
+
+type
+ TGradientStyle = ( gsHorizontal, gsVertical );
+
+ // Pixel procedures
+function SDL_PixelTest( SrcSurface1 : PSDL_Surface; SrcRect1 : PSDL_Rect; SrcSurface2 :
+ PSDL_Surface; SrcRect2 : PSDL_Rect; Left1, Top1, Left2, Top2 : integer ) : Boolean;
+
+function SDL_GetPixel( SrcSurface : PSDL_Surface; x : cardinal; y : cardinal ) : Uint32;
+
+procedure SDL_PutPixel( SrcSurface : PSDL_Surface; x : integer; y : integer; Color :
+ cardinal );
+
+procedure SDL_AddPixel( SrcSurface : PSDL_Surface; x : integer; y : integer; Color :
+ cardinal );
+
+procedure SDL_SubPixel( SrcSurface : PSDL_Surface; x : integer; y : integer; Color :
+ cardinal );
+
+// Line procedures
+procedure SDL_DrawLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
+ cardinal );overload;
+
+procedure SDL_DrawLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
+ cardinal ; DashLength, DashSpace : byte ); overload;
+
+procedure SDL_AddLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
+ cardinal );
+
+procedure SDL_SubLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
+ cardinal );
+
+// Surface procedures
+procedure SDL_AddSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DstSurface : PSDL_Surface; DestRect : PSDL_Rect );
+
+procedure SDL_SubSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DstSurface : PSDL_Surface; DestRect : PSDL_Rect );
+
+procedure SDL_MonoSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DstSurface : PSDL_Surface; DestRect : PSDL_Rect; Color : cardinal );
+
+procedure SDL_TexturedSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DstSurface : PSDL_Surface; DestRect : PSDL_Rect; Texture : PSDL_Surface;
+ TextureRect : PSDL_Rect );
+
+procedure SDL_ZoomSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect; DstSurface : PSDL_Surface; DstRect : PSDL_Rect );
+
+procedure SDL_WarpSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect; DstSurface : PSDL_Surface; UL, UR, LR, LL : PPoint );
+
+// Flip procedures
+procedure SDL_FlipRectH( DstSurface : PSDL_Surface; Rect : PSDL_Rect );
+
+procedure SDL_FlipRectV( DstSurface : PSDL_Surface; Rect : PSDL_Rect );
+
+function PSDLRect( aLeft, aTop, aWidth, aHeight : integer ) : PSDL_Rect;
+
+function SDLRect( aLeft, aTop, aWidth, aHeight : integer ) : TSDL_Rect; overload;
+
+function SDLRect( aRect : TRect ) : TSDL_Rect; overload;
+
+function SDL_ScaleSurfaceRect( SrcSurface : PSDL_Surface; SrcX1, SrcY1, SrcW, SrcH,
+ Width, Height : integer ) : PSDL_Surface;
+
+procedure SDL_ScrollY( DstSurface : PSDL_Surface; DifY : integer );
+
+procedure SDL_ScrollX( DstSurface : PSDL_Surface; DifX : integer );
+
+procedure SDL_RotateDeg( DstSurface, SrcSurface : PSDL_Surface; SrcRect :
+ PSDL_Rect; DestX, DestY, OffsetX, OffsetY : Integer; Angle : Integer );
+
+procedure SDL_RotateRad( DstSurface, SrcSurface : PSDL_Surface; SrcRect :
+ PSDL_Rect; DestX, DestY, OffsetX, OffsetY : Integer; Angle : Single );
+
+function ValidateSurfaceRect( DstSurface : PSDL_Surface; dstrect : PSDL_Rect ) : TSDL_Rect;
+
+// Fill Rect routine
+procedure SDL_FillRectAdd( DstSurface : PSDL_Surface; dstrect : PSDL_Rect; color : UInt32 );
+
+procedure SDL_FillRectSub( DstSurface : PSDL_Surface; dstrect : PSDL_Rect; color : UInt32 );
+
+procedure SDL_GradientFillRect( DstSurface : PSDL_Surface; const Rect : PSDL_Rect; const StartColor, EndColor : TSDL_Color; const Style : TGradientStyle );
+
+// NOTE for All SDL_2xblit... function : the dest surface must be 2x of the source surface!
+procedure SDL_2xBlit( Src, Dest : PSDL_Surface );
+
+procedure SDL_Scanline2xBlit( Src, Dest : PSDL_Surface );
+
+procedure SDL_50Scanline2xBlit( Src, Dest : PSDL_Surface );
+
+function SDL_PixelTestSurfaceVsRect( SrcSurface1 : PSDL_Surface; SrcRect1 :
+PSDL_Rect; SrcRect2 : PSDL_Rect; Left1, Top1, Left2, Top2 : integer ) :
+boolean;
+
+// Jason's boolean Surface functions
+procedure SDL_ORSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
+
+procedure SDL_ANDSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
+
+procedure SDL_GTSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
+
+procedure SDL_LTSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
+
+function SDL_ClipLine(var x1,y1,x2,y2: Integer; ClipRect: PSDL_Rect) : boolean;
+
+implementation
+
+uses
+ Math;
+
+function SDL_PixelTest( SrcSurface1 : PSDL_Surface; SrcRect1 : PSDL_Rect; SrcSurface2 :
+ PSDL_Surface; SrcRect2 : PSDL_Rect; Left1, Top1, Left2, Top2 : integer ) : boolean;
+var
+ Src_Rect1, Src_Rect2 : TSDL_Rect;
+ right1, bottom1 : integer;
+ right2, bottom2 : integer;
+ Scan1Start, Scan2Start, ScanWidth, ScanHeight : cardinal;
+ Mod1, Mod2 : cardinal;
+ Addr1, Addr2 : cardinal;
+ BPP : cardinal;
+ Pitch1, Pitch2 : cardinal;
+ TransparentColor1, TransparentColor2 : cardinal;
+ tx, ty : cardinal;
+ StartTick : cardinal;
+ Color1, Color2 : cardinal;
+begin
+ Result := false;
+ if SrcRect1 = nil then
+ begin
+ with Src_Rect1 do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface1.w;
+ h := SrcSurface1.h;
+ end;
+ end
+ else
+ Src_Rect1 := SrcRect1^;
+ if SrcRect2 = nil then
+ begin
+ with Src_Rect2 do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface2.w;
+ h := SrcSurface2.h;
+ end;
+ end
+ else
+ Src_Rect2 := SrcRect2^;
+ with Src_Rect1 do
+ begin
+ Right1 := Left1 + w;
+ Bottom1 := Top1 + h;
+ end;
+ with Src_Rect2 do
+ begin
+ Right2 := Left2 + w;
+ Bottom2 := Top2 + h;
+ end;
+ if ( Left1 >= Right2 ) or ( Right1 <= Left2 ) or ( Top1 >= Bottom2 ) or ( Bottom1 <=
+ Top2 ) then
+ exit;
+ if Left1 <= Left2 then
+ begin
+ // 1. left, 2. right
+ Scan1Start := Src_Rect1.x + Left2 - Left1;
+ Scan2Start := Src_Rect2.x;
+ ScanWidth := Right1 - Left2;
+ with Src_Rect2 do
+ if ScanWidth > w then
+ ScanWidth := w;
+ end
+ else
+ begin
+ // 1. right, 2. left
+ Scan1Start := Src_Rect1.x;
+ Scan2Start := Src_Rect2.x + Left1 - Left2;
+ ScanWidth := Right2 - Left1;
+ with Src_Rect1 do
+ if ScanWidth > w then
+ ScanWidth := w;
+ end;
+ with SrcSurface1^ do
+ begin
+ Pitch1 := Pitch;
+ Addr1 := cardinal( Pixels );
+ inc( Addr1, Pitch1 * UInt32( Src_Rect1.y ) );
+ with format^ do
+ begin
+ BPP := BytesPerPixel;
+ TransparentColor1 := colorkey;
+ end;
+ end;
+ with SrcSurface2^ do
+ begin
+ TransparentColor2 := format.colorkey;
+ Pitch2 := Pitch;
+ Addr2 := cardinal( Pixels );
+ inc( Addr2, Pitch2 * UInt32( Src_Rect2.y ) );
+ end;
+ Mod1 := Pitch1 - ( ScanWidth * BPP );
+ Mod2 := Pitch2 - ( ScanWidth * BPP );
+ inc( Addr1, BPP * Scan1Start );
+ inc( Addr2, BPP * Scan2Start );
+ if Top1 <= Top2 then
+ begin
+ // 1. up, 2. down
+ ScanHeight := Bottom1 - Top2;
+ if ScanHeight > Src_Rect2.h then
+ ScanHeight := Src_Rect2.h;
+ inc( Addr1, Pitch1 * UInt32( Top2 - Top1 ) );
+ end
+ else
+ begin
+ // 1. down, 2. up
+ ScanHeight := Bottom2 - Top1;
+ if ScanHeight > Src_Rect1.h then
+ ScanHeight := Src_Rect1.h;
+ inc( Addr2, Pitch2 * UInt32( Top1 - Top2 ) );
+ end;
+ case BPP of
+ 1 :
+ for ty := 1 to ScanHeight do
+ begin
+ for tx := 1 to ScanWidth do
+ begin
+ if ( PByte( Addr1 )^ <> TransparentColor1 ) and ( PByte( Addr2 )^ <>
+ TransparentColor2 ) then
+ begin
+ Result := true;
+ exit;
+ end;
+ inc( Addr1 );
+ inc( Addr2 );
+ end;
+ inc( Addr1, Mod1 );
+ inc( Addr2, Mod2 );
+ end;
+ 2 :
+ for ty := 1 to ScanHeight do
+ begin
+ for tx := 1 to ScanWidth do
+ begin
+ if ( PWord( Addr1 )^ <> TransparentColor1 ) and ( PWord( Addr2 )^ <>
+ TransparentColor2 ) then
+ begin
+ Result := true;
+ exit;
+ end;
+ inc( Addr1, 2 );
+ inc( Addr2, 2 );
+ end;
+ inc( Addr1, Mod1 );
+ inc( Addr2, Mod2 );
+ end;
+ 3 :
+ for ty := 1 to ScanHeight do
+ begin
+ for tx := 1 to ScanWidth do
+ begin
+ Color1 := PLongWord( Addr1 )^ and $00FFFFFF;
+ Color2 := PLongWord( Addr2 )^ and $00FFFFFF;
+ if ( Color1 <> TransparentColor1 ) and ( Color2 <> TransparentColor2 )
+ then
+ begin
+ Result := true;
+ exit;
+ end;
+ inc( Addr1, 3 );
+ inc( Addr2, 3 );
+ end;
+ inc( Addr1, Mod1 );
+ inc( Addr2, Mod2 );
+ end;
+ 4 :
+ for ty := 1 to ScanHeight do
+ begin
+ for tx := 1 to ScanWidth do
+ begin
+ if ( PLongWord( Addr1 )^ <> TransparentColor1 ) and ( PLongWord( Addr2 )^ <>
+ TransparentColor2 ) then
+ begin
+ Result := true;
+ exit;
+ end;
+ inc( Addr1, 4 );
+ inc( Addr2, 4 );
+ end;
+ inc( Addr1, Mod1 );
+ inc( Addr2, Mod2 );
+ end;
+ end;
+end;
+
+function SDL_GetPixel( SrcSurface : PSDL_Surface; x : cardinal; y : cardinal ) : Uint32;
+var
+ bpp : UInt32;
+ p : PInteger;
+begin
+ bpp := SrcSurface.format.BytesPerPixel;
+ // Here p is the address to the pixel we want to retrieve
+ p := Pointer( Uint32( SrcSurface.pixels ) + UInt32( y ) * SrcSurface.pitch + UInt32( x ) *
+ bpp );
+ case bpp of
+ 1 : result := PUint8( p )^;
+ 2 : result := PUint16( p )^;
+ 3 :
+ if ( SDL_BYTEORDER = SDL_BIG_ENDIAN ) then
+ result := PUInt8Array( p )[ 0 ] shl 16 or PUInt8Array( p )[ 1 ] shl 8 or
+ PUInt8Array( p )[ 2 ]
+ else
+ result := PUInt8Array( p )[ 0 ] or PUInt8Array( p )[ 1 ] shl 8 or
+ PUInt8Array( p )[ 2 ] shl 16;
+ 4 : result := PUint32( p )^;
+ else
+ result := 0; // shouldn't happen, but avoids warnings
+ end;
+end;
+
+procedure SDL_PutPixel( SrcSurface : PSDL_Surface; x : integer; y : integer; Color :
+ cardinal );
+var
+ Addr, Pitch, BPP : cardinal;
+begin
+ Addr := cardinal( SrcSurface.Pixels );
+ Pitch := SrcSurface.Pitch;
+ BPP := SrcSurface.format.BytesPerPixel;
+ asm
+ mov eax, y
+ mul Pitch // EAX := y * Pitch
+ add Addr, eax // Addr:= Addr + (y * Pitch)
+ mov eax, x
+ mov ecx, Color
+ cmp BPP, 1
+ jne @Not1BPP
+ add eax, Addr // Now: EAX:= Addr + (y * Pitch) + x
+ mov [eax], cl
+ jmp @Quit
+ @Not1BPP:
+ cmp BPP, 2
+ jne @Not2BPP
+ mul BPP // EAX := x * BPP
+ add eax, Addr // Now: EAX:= Addr + (y * Pitch) + x * BPP
+ mov [eax], cx
+ jmp @Quit
+ @Not2BPP:
+ cmp BPP, 3
+ jne @Not3BPP
+ mul BPP // EAX := x * BPP
+ add eax, Addr // Now: EAX:= Addr + (y * Pitch) + x * BPP
+ mov edx, [eax]
+ and edx, $ff000000
+ or edx, ecx
+ mov [eax], edx
+ jmp @Quit
+ @Not3BPP:
+ mul BPP // EAX := x * BPP
+ add eax, Addr // Now: EAX:= Addr + (y * Pitch) + x * BPP
+ mov [eax], ecx
+ @Quit:
+ end;
+end;
+
+procedure SDL_AddPixel( SrcSurface : PSDL_Surface; x : integer; y : integer; Color :
+ cardinal );
+var
+ SrcColor, FinalColor : cardinal;
+ Addr, Pitch, Bits : cardinal;
+begin
+ if Color = 0 then
+ exit;
+ Addr := cardinal( SrcSurface.Pixels );
+ Pitch := SrcSurface.Pitch;
+ Bits := SrcSurface.format.BitsPerPixel;
+ asm
+ mov eax, y
+ mul Pitch // EAX := y * Pitch
+ add Addr, eax // Addr:= Addr + (y * Pitch)
+ mov eax, x
+ cmp Bits, 8
+ jne @Not8bit
+ add eax, Addr // Now: EAX:= Addr + (y * Pitch) + x
+ mov cl, [eax]
+ movzx ecx, cl
+ mov SrcColor, ecx
+ mov edx, Color
+ and ecx, 3
+ and edx, 3
+ add ecx, edx
+ cmp ecx, 3
+ jbe @Skip1_8bit
+ mov ecx, 3
+ @Skip1_8bit:
+ mov FinalColor, ecx
+ mov ecx, SrcColor
+ mov edx, Color
+ and ecx, $1c
+ and edx, $1c
+ add ecx, edx
+ cmp ecx, $1c
+ jbe @Skip2_8bit
+ mov ecx, $1c
+ @Skip2_8bit:
+ or FinalColor, ecx
+ mov ecx, SrcColor
+ mov edx, Color
+ and ecx, $e0
+ and edx, $e0
+ add ecx, edx
+ cmp ecx, $e0
+ jbe @Skip3_8bit
+ mov ecx, $e0
+ @Skip3_8bit:
+ or ecx, FinalColor
+ mov [eax], cl
+ jmp @Quit
+ @Not8bit:
+ cmp Bits, 15
+ jne @Not15bit
+ shl eax, 1
+ add eax, Addr // Now: EAX:= Addr + (y * Pitch) + x * 2
+ mov ecx, [eax]
+ and ecx, $00007fff
+ mov SrcColor, ecx
+ mov edx, Color
+ and ecx, $1f
+ and edx, $1f
+ add ecx, edx
+ cmp ecx, $1f
+ jbe @Skip1_15bit
+ mov ecx, $1f
+ @Skip1_15bit:
+ mov FinalColor, ecx
+ mov ecx, SrcColor
+ mov edx, Color
+ and ecx, $03e0
+ and edx, $03e0
+ add ecx, edx
+ cmp ecx, $03e0
+ jbe @Skip2_15bit
+ mov ecx, $03e0
+ @Skip2_15bit:
+ or FinalColor, ecx
+ mov ecx, SrcColor
+ mov edx, Color
+ and ecx, $7c00
+ and edx, $7c00
+ add ecx, edx
+ cmp ecx, $7c00
+ jbe @Skip3_15bit
+ mov ecx, $7c00
+ @Skip3_15bit:
+ or ecx, FinalColor
+ mov [eax], cx
+ jmp @Quit
+ @Not15Bit:
+ cmp Bits, 16
+ jne @Not16bit
+ shl eax, 1
+ add eax, Addr // Now: EAX:= Addr + (y * Pitch) + x * 2
+ mov ecx, [eax]
+ and ecx, $0000ffff
+ mov SrcColor, ecx
+ mov edx, Color
+ and ecx, $1f
+ and edx, $1f
+ add ecx, edx
+ cmp ecx, $1f
+ jbe @Skip1_16bit
+ mov ecx, $1f
+ @Skip1_16bit:
+ mov FinalColor, ecx
+ mov ecx, SrcColor
+ mov edx, Color
+ and ecx, $07e0
+ and edx, $07e0
+ add ecx, edx
+ cmp ecx, $07e0
+ jbe @Skip2_16bit
+ mov ecx, $07e0
+ @Skip2_16bit:
+ or FinalColor, ecx
+ mov ecx, SrcColor
+ mov edx, Color
+ and ecx, $f800
+ and edx, $f800
+ add ecx, edx
+ cmp ecx, $f800
+ jbe @Skip3_16bit
+ mov ecx, $f800
+ @Skip3_16bit:
+ or ecx, FinalColor
+ mov [eax], cx
+ jmp @Quit
+ @Not16Bit:
+ cmp Bits, 24
+ jne @Not24bit
+ mov ecx, 0
+ add ecx, eax
+ shl ecx, 1
+ add ecx, eax
+ mov eax, ecx
+ jmp @32bit
+ @Not24bit:
+ shl eax, 2
+ @32bit:
+ add eax, Addr // Now: EAX:= Addr + (y * Pitch) + x * 2
+ mov ecx, [eax]
+ mov FinalColor, ecx
+ and FinalColor, $ff000000
+ and ecx, $00ffffff
+ mov SrcColor, ecx
+ mov edx, Color
+ and ecx, $000000ff
+ and edx, $000000ff
+ add ecx, edx
+ cmp ecx, $000000ff
+ jbe @Skip1_32bit
+ mov ecx, $000000ff
+ @Skip1_32bit:
+ or FinalColor, ecx
+ mov ecx, SrcColor
+ mov edx, Color
+ and ecx, $0000ff00
+ and edx, $0000ff00
+ add ecx, edx
+ cmp ecx, $0000ff00
+ jbe @Skip2_32bit
+ mov ecx, $0000ff00
+ @Skip2_32bit:
+ or FinalColor, ecx
+ mov ecx, SrcColor
+ mov edx, Color
+ and ecx, $00ff0000
+ and edx, $00ff0000
+ add ecx, edx
+ cmp ecx, $00ff0000
+ jbe @Skip3_32bit
+ mov ecx, $00ff0000
+ @Skip3_32bit:
+ or ecx, FinalColor
+ mov [eax], ecx
+ @Quit:
+ end;
+end;
+
+procedure SDL_SubPixel( SrcSurface : PSDL_Surface; x : integer; y : integer; Color :
+ cardinal );
+var
+ SrcColor, FinalColor : cardinal;
+ Addr, Pitch, Bits : cardinal;
+begin
+ if Color = 0 then
+ exit;
+ Addr := cardinal( SrcSurface.Pixels );
+ Pitch := SrcSurface.Pitch;
+ Bits := SrcSurface.format.BitsPerPixel;
+ asm
+ mov eax, y
+ mul Pitch // EAX := y * Pitch
+ add Addr, eax // Addr:= Addr + (y * Pitch)
+ mov eax, x
+ cmp Bits, 8
+ jne @Not8bit
+ add eax, Addr // Now: EAX:= Addr + (y * Pitch) + x
+ mov cl, [eax]
+ movzx ecx, cl
+ mov SrcColor, ecx
+ mov edx, Color
+ and ecx, 3
+ and edx, 3
+ sub ecx, edx
+ jns @Skip1_8bit
+ mov ecx, 0
+ @Skip1_8bit:
+ mov FinalColor, ecx
+ mov ecx, SrcColor
+ mov edx, Color
+ and ecx, $1c
+ and edx, $1c
+ sub ecx, edx
+ jns @Skip2_8bit
+ mov ecx, 0
+ @Skip2_8bit:
+ or FinalColor, ecx
+ mov ecx, SrcColor
+ mov edx, Color
+ and ecx, $e0
+ and edx, $e0
+ sub ecx, edx
+ jns @Skip3_8bit
+ mov ecx, 0
+ @Skip3_8bit:
+ or ecx, FinalColor
+ mov [eax], cl
+ jmp @Quit
+ @Not8bit:
+ cmp Bits, 15
+ jne @Not15bit
+ shl eax, 1
+ add eax, Addr
+ mov ecx, [eax]
+ and ecx, $00007fff
+ mov SrcColor, ecx
+ mov edx, Color
+ and ecx, $1f
+ and edx, $1f
+ sub ecx, edx
+ jns @Skip1_15bit
+ mov ecx, 0
+ @Skip1_15bit:
+ mov FinalColor, ecx
+ mov ecx, SrcColor
+ mov edx, Color
+ and ecx, $03e0
+ and edx, $03e0
+ sub ecx, edx
+ jns @Skip2_15bit
+ mov ecx, 0
+ @Skip2_15bit:
+ or FinalColor, ecx
+ mov ecx, SrcColor
+ mov edx, Color
+ and ecx, $7c00
+ and edx, $7c00
+ sub ecx, edx
+ jns @Skip3_15bit
+ mov ecx, 0
+ @Skip3_15bit:
+ or ecx, FinalColor
+ mov [eax], cx
+ jmp @Quit
+ @Not15Bit:
+ cmp Bits, 16
+ jne @Not16bit
+ shl eax, 1
+ add eax, Addr
+ mov ecx, [eax]
+ and ecx, $0000ffff
+ mov SrcColor, ecx
+ mov edx, Color
+ and ecx, $1f
+ and edx, $1f
+ sub ecx, edx
+ jns @Skip1_16bit
+ mov ecx, 0
+ @Skip1_16bit:
+ mov FinalColor, ecx
+ mov ecx, SrcColor
+ mov edx, Color
+ and ecx, $07e0
+ and edx, $07e0
+ sub ecx, edx
+ jns @Skip2_16bit
+ mov ecx, 0
+ @Skip2_16bit:
+ or FinalColor, ecx
+ mov ecx, SrcColor
+ mov edx, Color
+ and ecx, $f800
+ and edx, $f800
+ sub ecx, edx
+ jns @Skip3_16bit
+ mov ecx, 0
+ @Skip3_16bit:
+ or ecx, FinalColor
+ mov [eax], cx
+ jmp @Quit
+ @Not16Bit:
+ cmp Bits, 24
+ jne @Not24bit
+ mov ecx, 0
+ add ecx, eax
+ shl ecx, 1
+ add ecx, eax
+ mov eax, ecx
+ jmp @32bit
+ @Not24bit:
+ shl eax, 2
+ @32bit:
+ add eax, Addr
+ mov ecx, [eax]
+ mov FinalColor, ecx
+ and FinalColor, $ff000000
+ and ecx, $00ffffff
+ mov SrcColor, ecx
+ mov edx, Color
+ and ecx, $000000ff
+ and edx, $000000ff
+ sub ecx, edx
+ jns @Skip1_32bit
+ mov ecx, 0
+ @Skip1_32bit:
+ or FinalColor, ecx
+ mov ecx, SrcColor
+ mov edx, Color
+ and ecx, $0000ff00
+ and edx, $0000ff00
+ sub ecx, edx
+ jns @Skip2_32bit
+ mov ecx, 0
+ @Skip2_32bit:
+ or FinalColor, ecx
+ mov ecx, SrcColor
+ mov edx, Color
+ and ecx, $00ff0000
+ and edx, $00ff0000
+ sub ecx, edx
+ jns @Skip3_32bit
+ mov ecx, 0
+ @Skip3_32bit:
+ or ecx, FinalColor
+ mov [eax], ecx
+ @Quit:
+ end;
+end;
+
+// Draw a line between x1,y1 and x2,y2 to the given surface
+// NOTE: The surface must be locked before calling this!
+procedure SDL_DrawLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
+ cardinal );
+var
+ dx, dy, sdx, sdy, x, y, px, py : integer;
+begin
+ dx := x2 - x1;
+ dy := y2 - y1;
+ if dx < 0 then
+ sdx := -1
+ else
+ sdx := 1;
+ if dy < 0 then
+ sdy := -1
+ else
+ sdy := 1;
+ dx := sdx * dx + 1;
+ dy := sdy * dy + 1;
+ x := 0;
+ y := 0;
+ px := x1;
+ py := y1;
+ if dx >= dy then
+ begin
+ for x := 0 to dx - 1 do
+ begin
+ SDL_PutPixel( DstSurface, px, py, Color );
+ y := y + dy;
+ if y >= dx then
+ begin
+ y := y - dx;
+ py := py + sdy;
+ end;
+ px := px + sdx;
+ end;
+ end
+ else
+ begin
+ for y := 0 to dy - 1 do
+ begin
+ SDL_PutPixel( DstSurface, px, py, Color );
+ x := x + dx;
+ if x >= dy then
+ begin
+ x := x - dy;
+ px := px + sdx;
+ end;
+ py := py + sdy;
+ end;
+ end;
+end;
+
+// Draw a dashed line between x1,y1 and x2,y2 to the given surface
+// NOTE: The surface must be locked before calling this!
+procedure SDL_DrawLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
+ cardinal ; DashLength, DashSpace : byte ); overload;
+var
+ dx, dy, sdx, sdy, x, y, px, py, counter : integer; drawdash : boolean;
+begin
+ counter := 0;
+ drawdash := true; //begin line drawing with dash
+
+ //Avoid invalid user-passed dash parameters
+ if (DashLength < 1)
+ then DashLength := 1;
+ if (DashSpace < 1)
+ then DashSpace := 0;
+
+ dx := x2 - x1;
+ dy := y2 - y1;
+ if dx < 0 then
+ sdx := -1
+ else
+ sdx := 1;
+ if dy < 0 then
+ sdy := -1
+ else
+ sdy := 1;
+ dx := sdx * dx + 1;
+ dy := sdy * dy + 1;
+ x := 0;
+ y := 0;
+ px := x1;
+ py := y1;
+ if dx >= dy then
+ begin
+ for x := 0 to dx - 1 do
+ begin
+
+ //Alternate drawing dashes, or leaving spaces
+ if drawdash then
+ begin
+ SDL_PutPixel( DstSurface, px, py, Color );
+ inc(counter);
+ if (counter > DashLength-1) and (DashSpace > 0) then
+ begin
+ drawdash := false;
+ counter := 0;
+ end;
+ end
+ else //space
+ begin
+ inc(counter);
+ if counter > DashSpace-1 then
+ begin
+ drawdash := true;
+ counter := 0;
+ end;
+ end;
+
+ y := y + dy;
+ if y >= dx then
+ begin
+ y := y - dx;
+ py := py + sdy;
+ end;
+ px := px + sdx;
+ end;
+ end
+ else
+ begin
+ for y := 0 to dy - 1 do
+ begin
+
+ //Alternate drawing dashes, or leaving spaces
+ if drawdash then
+ begin
+ SDL_PutPixel( DstSurface, px, py, Color );
+ inc(counter);
+ if (counter > DashLength-1) and (DashSpace > 0) then
+ begin
+ drawdash := false;
+ counter := 0;
+ end;
+ end
+ else //space
+ begin
+ inc(counter);
+ if counter > DashSpace-1 then
+ begin
+ drawdash := true;
+ counter := 0;
+ end;
+ end;
+
+ x := x + dx;
+ if x >= dy then
+ begin
+ x := x - dy;
+ px := px + sdx;
+ end;
+ py := py + sdy;
+ end;
+ end;
+end;
+
+procedure SDL_AddLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
+ cardinal );
+var
+ dx, dy, sdx, sdy, x, y, px, py : integer;
+begin
+ dx := x2 - x1;
+ dy := y2 - y1;
+ if dx < 0 then
+ sdx := -1
+ else
+ sdx := 1;
+ if dy < 0 then
+ sdy := -1
+ else
+ sdy := 1;
+ dx := sdx * dx + 1;
+ dy := sdy * dy + 1;
+ x := 0;
+ y := 0;
+ px := x1;
+ py := y1;
+ if dx >= dy then
+ begin
+ for x := 0 to dx - 1 do
+ begin
+ SDL_AddPixel( DstSurface, px, py, Color );
+ y := y + dy;
+ if y >= dx then
+ begin
+ y := y - dx;
+ py := py + sdy;
+ end;
+ px := px + sdx;
+ end;
+ end
+ else
+ begin
+ for y := 0 to dy - 1 do
+ begin
+ SDL_AddPixel( DstSurface, px, py, Color );
+ x := x + dx;
+ if x >= dy then
+ begin
+ x := x - dy;
+ px := px + sdx;
+ end;
+ py := py + sdy;
+ end;
+ end;
+end;
+
+procedure SDL_SubLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
+ cardinal );
+var
+ dx, dy, sdx, sdy, x, y, px, py : integer;
+begin
+ dx := x2 - x1;
+ dy := y2 - y1;
+ if dx < 0 then
+ sdx := -1
+ else
+ sdx := 1;
+ if dy < 0 then
+ sdy := -1
+ else
+ sdy := 1;
+ dx := sdx * dx + 1;
+ dy := sdy * dy + 1;
+ x := 0;
+ y := 0;
+ px := x1;
+ py := y1;
+ if dx >= dy then
+ begin
+ for x := 0 to dx - 1 do
+ begin
+ SDL_SubPixel( DstSurface, px, py, Color );
+ y := y + dy;
+ if y >= dx then
+ begin
+ y := y - dx;
+ py := py + sdy;
+ end;
+ px := px + sdx;
+ end;
+ end
+ else
+ begin
+ for y := 0 to dy - 1 do
+ begin
+ SDL_SubPixel( DstSurface, px, py, Color );
+ x := x + dx;
+ if x >= dy then
+ begin
+ x := x - dy;
+ px := px + sdx;
+ end;
+ py := py + sdy;
+ end;
+ end;
+end;
+
+// This procedure works on 8, 15, 16, 24 and 32 bits color depth surfaces.
+// In 8 bit color depth mode the procedure works with the default packed
+// palette (RRRGGGBB). It handles all clipping.
+procedure SDL_AddSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DstSurface : PSDL_Surface; DestRect : PSDL_Rect );
+var
+ Src, Dest : TSDL_Rect;
+ Diff : integer;
+ SrcAddr, DestAddr : cardinal;
+ // TransparentColor: cardinal;
+ _ebx, _esi, _edi, _esp : cardinal;
+ WorkX, WorkY : word;
+ SrcMod, DestMod : cardinal;
+ Bits : cardinal;
+begin
+ if ( SrcSurface = nil ) or ( DstSurface = nil ) then
+ exit; // Remove this to make it faster
+ if ( SrcSurface.Format.BitsPerPixel <> DstSurface.Format.BitsPerPixel ) then
+ exit; // Remove this to make it faster
+ if SrcRect = nil then
+ begin
+ with Src do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface.w;
+ h := SrcSurface.h;
+ end;
+ end
+ else
+ Src := SrcRect^;
+ if DestRect = nil then
+ begin
+ Dest.x := 0;
+ Dest.y := 0;
+ end
+ else
+ Dest := DestRect^;
+ Dest.w := Src.w;
+ Dest.h := Src.h;
+ with DstSurface.Clip_Rect do
+ begin
+ // Source's right side is greater than the dest.cliprect
+ if Dest.x + Src.w > x + w then
+ begin
+ smallint( Src.w ) := x + w - Dest.x;
+ smallint( Dest.w ) := x + w - Dest.x;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's bottom side is greater than the dest.clip
+ if Dest.y + Src.h > y + h then
+ begin
+ smallint( Src.h ) := y + h - Dest.y;
+ smallint( Dest.h ) := y + h - Dest.y;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ // Source's left side is less than the dest.clip
+ if Dest.x < x then
+ begin
+ Diff := x - Dest.x;
+ Src.x := Src.x + Diff;
+ smallint( Src.w ) := smallint( Src.w ) - Diff;
+ Dest.x := x;
+ smallint( Dest.w ) := smallint( Dest.w ) - Diff;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's Top side is less than the dest.clip
+ if Dest.y < y then
+ begin
+ Diff := y - Dest.y;
+ Src.y := Src.y + Diff;
+ smallint( Src.h ) := smallint( Src.h ) - Diff;
+ Dest.y := y;
+ smallint( Dest.h ) := smallint( Dest.h ) - Diff;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ end;
+ with SrcSurface^ do
+ begin
+ SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
+ Format.BytesPerPixel;
+ SrcMod := Pitch - Src.w * Format.BytesPerPixel;
+ // TransparentColor := format.ColorKey;
+ end;
+ with DstSurface^ do
+ begin
+ DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
+ Format.BytesPerPixel;
+ DestMod := Pitch - Dest.w * Format.BytesPerPixel;
+ Bits := Format.BitsPerPixel;
+ end;
+ SDL_LockSurface( SrcSurface );
+ SDL_LockSurface( DstSurface );
+ case bits of
+ 8 :
+ asm
+ mov _ebx, ebx
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ @Loopx:
+ mov al, [esi] // AL := source color
+ cmp al, 0
+ je @SkipColor // if AL=0 or AL=transparent color then skip everything
+ mov esp, eax // ESP - source color
+ mov bl, [edi] // BL := destination color
+ mov dl, bl // DL := destination color
+ and ax, $03 // Adding BLUE
+ and bl, $03
+ add al, bl
+ cmp al, $03
+ jbe @Skip1
+ mov al, $03
+ @Skip1:
+ mov cl, al
+ mov eax, esp // Adding GREEN
+ mov bl, dl
+ and al, $1c
+ and bl, $1c
+ add al, bl
+ cmp al, $1c
+ jbe @Skip2
+ mov al, $1c
+ @Skip2:
+ or cl, al
+ mov eax, esp // Adding RED
+ mov bl, dl
+ and ax, $e0
+ and bx, $e0
+ add ax, bx
+ cmp ax, $e0
+ jbe @Skip3
+ mov al, $e0
+ @Skip3:
+ or cl, al
+ mov [edi], cl
+ @SkipColor:
+ inc esi
+ inc edi
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx,_ebx
+ end;
+ 15 :
+ asm
+ mov _ebx, ebx
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ @Loopx:
+ mov ax, [esi] // AX := source color
+ cmp ax, 0
+ je @SkipColor // if AX=0 then skip everything
+ mov esp, eax // ESP - source color
+ mov bx, [edi] // BX := destination color
+ mov dx, bx // DX := destination color
+ and ax, $001F // Adding BLUE
+ and bx, $001F
+ add ax, bx
+ cmp ax, $001F
+ jbe @Skip1
+ mov ax, $001F
+ @Skip1:
+ mov cx, ax
+ mov eax, esp // Adding GREEN
+ mov bx, dx
+ and ax, $3E0
+ and bx, $3E0
+ add ax, bx
+ cmp ax, $3E0
+ jbe @Skip2
+ mov ax, $3E0
+ @Skip2:
+ or cx, ax
+ mov eax, esp // Adding RED
+ mov bx, dx
+ and ax, $7C00
+ and bx, $7C00
+ add ax, bx
+ cmp ax, $7C00
+ jbe @Skip3
+ mov ax, $7C00
+ @Skip3:
+ or cx, ax
+ mov [edi], cx
+ @SkipColor:
+ add esi, 2
+ add edi, 2
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx,_ebx
+ end;
+ 16 :
+ asm
+ mov _ebx, ebx
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ @Loopx:
+ mov ax, [esi] // AX := source color
+ cmp ax, 0
+ je @SkipColor // if AX=0 then skip everything
+ mov esp, eax // ESP - source color
+ mov bx, [edi] // BX := destination color
+ mov dx, bx // DX := destination color
+ and ax, $1F // Adding BLUE
+ and bx, $1F
+ add ax, bx
+ cmp ax, $1F
+ jbe @Skip1
+ mov ax, $1F
+ @Skip1:
+ mov cx, ax
+ mov eax, esp // Adding GREEN
+ mov bx, dx
+ and ax, $7E0
+ and bx, $7E0
+ add ax, bx
+ cmp ax, $7E0
+ jbe @Skip2
+ mov ax, $7E0
+ @Skip2:
+ or cx, ax
+ mov eax, esp // Adding RED
+ mov bx, dx
+ and eax, $F800
+ and ebx, $F800
+ add eax, ebx
+ cmp eax, $F800
+ jbe @Skip3
+ mov ax, $F800
+ @Skip3:
+ or cx, ax
+ mov [edi], cx
+ @SkipColor:
+ add esi, 2
+ add edi, 2
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx,_ebx
+ end;
+ 24 :
+ asm
+ mov _ebx, ebx
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ add WorkX, ax // WorkX := Src.w * 2
+ add WorkX, ax // WorkX := Src.w * 3
+ @Loopx:
+ mov bl, [edi] // BX := destination color
+ mov al, [esi] // AX := source color
+ cmp al, 0
+ je @Skip // if AL=0 then skip COMPONENT
+ mov ah, 0 // AX := COLOR COMPONENT
+ mov bh, 0
+ add bx, ax
+ cmp bx, $00ff
+ jb @Skip
+ mov bl, $ff
+ @Skip:
+ mov [edi], bl
+ inc esi
+ inc edi
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx,_ebx
+ end;
+ 32 :
+ asm
+ mov _ebx, ebx
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ shl ax, 2
+ mov WorkX, ax // WorkX := Src.w * 4
+ @Loopx:
+ mov bl, [edi] // BX := destination color
+ mov al, [esi] // AX := source color
+ cmp al, 0
+ je @Skip // if AL=0 then skip COMPONENT
+ mov ah, 0 // AX := COLOR COMPONENT
+ mov bh, 0
+ add bx, ax
+ cmp bx, $00ff
+ jb @Skip
+ mov bl, $ff
+ @Skip:
+ mov [edi], bl
+ inc esi
+ inc edi
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx,_ebx
+ end;
+ end;
+ SDL_UnlockSurface( SrcSurface );
+ SDL_UnlockSurface( DstSurface );
+end;
+
+procedure SDL_SubSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DstSurface : PSDL_Surface; DestRect : PSDL_Rect );
+var
+ Src, Dest : TSDL_Rect;
+ Diff : integer;
+ SrcAddr, DestAddr : cardinal;
+ _ebx, _esi, _edi, _esp : cardinal;
+ WorkX, WorkY : word;
+ SrcMod, DestMod : cardinal;
+ Bits : cardinal;
+begin
+ if ( SrcSurface = nil ) or ( DstSurface = nil ) then
+ exit; // Remove this to make it faster
+ if ( SrcSurface.Format.BitsPerPixel <> DstSurface.Format.BitsPerPixel ) then
+ exit; // Remove this to make it faster
+ if SrcRect = nil then
+ begin
+ with Src do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface.w;
+ h := SrcSurface.h;
+ end;
+ end
+ else
+ Src := SrcRect^;
+ if DestRect = nil then
+ begin
+ Dest.x := 0;
+ Dest.y := 0;
+ end
+ else
+ Dest := DestRect^;
+ Dest.w := Src.w;
+ Dest.h := Src.h;
+ with DstSurface.Clip_Rect do
+ begin
+ // Source's right side is greater than the dest.cliprect
+ if Dest.x + Src.w > x + w then
+ begin
+ smallint( Src.w ) := x + w - Dest.x;
+ smallint( Dest.w ) := x + w - Dest.x;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's bottom side is greater than the dest.clip
+ if Dest.y + Src.h > y + h then
+ begin
+ smallint( Src.h ) := y + h - Dest.y;
+ smallint( Dest.h ) := y + h - Dest.y;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ // Source's left side is less than the dest.clip
+ if Dest.x < x then
+ begin
+ Diff := x - Dest.x;
+ Src.x := Src.x + Diff;
+ smallint( Src.w ) := smallint( Src.w ) - Diff;
+ Dest.x := x;
+ smallint( Dest.w ) := smallint( Dest.w ) - Diff;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's Top side is less than the dest.clip
+ if Dest.y < y then
+ begin
+ Diff := y - Dest.y;
+ Src.y := Src.y + Diff;
+ smallint( Src.h ) := smallint( Src.h ) - Diff;
+ Dest.y := y;
+ smallint( Dest.h ) := smallint( Dest.h ) - Diff;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ end;
+ with SrcSurface^ do
+ begin
+ SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
+ Format.BytesPerPixel;
+ SrcMod := Pitch - Src.w * Format.BytesPerPixel;
+ end;
+ with DstSurface^ do
+ begin
+ DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
+ Format.BytesPerPixel;
+ DestMod := Pitch - Dest.w * Format.BytesPerPixel;
+ Bits := DstSurface.Format.BitsPerPixel;
+ end;
+ SDL_LockSurface( SrcSurface );
+ SDL_LockSurface( DstSurface );
+ case bits of
+ 8 :
+ asm
+ mov _ebx, ebx
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ @Loopx:
+ mov al, [esi] // AL := source color
+ cmp al, 0
+ je @SkipColor // if AL=0 then skip everything
+ mov esp, eax // ESP - source color
+ mov bl, [edi] // BL := destination color
+ mov dl, bl // DL := destination color
+ and al, $03 // Subtract BLUE
+ and bl, $03
+ sub bl, al
+ jns @Skip1
+ mov bl, 0
+ @Skip1:
+ mov cl, bl
+ mov eax, esp // Subtract GREEN
+ mov bl, dl
+ and al, $1c
+ and bl, $1c
+ sub bl, al
+ jns @Skip2
+ mov bl, 0
+ @Skip2:
+ or cl, bl
+ mov eax, esp // Subtract RED
+ mov bl, dl
+ and ax, $e0
+ and bx, $e0
+ sub bx, ax
+ jns @Skip3
+ mov bl, 0
+ @Skip3:
+ or cl, bl
+ mov [edi], cl
+ @SkipColor:
+ inc esi
+ inc edi
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx,_ebx
+ end;
+ 15 :
+ asm
+ mov _ebx, ebx
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ @Loopx:
+ mov ax, [esi] // AX := source color
+ cmp ax, 0
+ je @SkipColor // if AX=0 then skip everything
+ mov esp, eax // ESP - source color
+ mov bx, [edi] // BX := destination color
+ mov dx, bx // DX := destination color
+ and ax, $001F // Subtract BLUE
+ and bx, $001F
+ sub bx, ax
+ jns @Skip1
+ mov bx, 0
+ @Skip1:
+ mov cx, bx
+ mov eax, esp // Subtract GREEN
+ mov bx, dx
+ and ax, $3E0
+ and bx, $3E0
+ sub bx, ax
+ jns @Skip2
+ mov bx, 0
+ @Skip2:
+ or cx, bx
+ mov eax, esp // Subtract RED
+ mov bx, dx
+ and ax, $7C00
+ and bx, $7C00
+ sub bx, ax
+ jns @Skip3
+ mov bx, 0
+ @Skip3:
+ or cx, bx
+ mov [edi], cx
+ @SkipColor:
+ add esi, 2
+ add edi, 2
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx,_ebx
+ end;
+ 16 :
+ asm
+ mov _ebx, ebx
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ @Loopx:
+ mov ax, [esi] // AX := source color
+ cmp ax, 0
+ je @SkipColor // if AX=0 then skip everything
+ mov esp, eax // ESP - source color
+ mov bx, [edi] // BX := destination color
+ mov dx, bx // DX := destination color
+ and ax, $1F // Subtracting BLUE
+ and bx, $1F
+ sub bx, ax
+ jns @Skip1
+ mov bx, 0
+ @Skip1:
+ mov cx, bx
+ mov eax, esp // Adding GREEN
+ mov bx, dx
+ and ax, $7E0
+ and bx, $7E0
+ sub bx, ax
+ jns @Skip2
+ mov bx, 0
+ @Skip2:
+ or cx, bx
+ mov eax, esp // Adding RED
+ mov bx, dx
+ and eax, $F800
+ and ebx, $F800
+ sub ebx, eax
+ jns @Skip3
+ mov bx, 0
+ @Skip3:
+ or cx, bx
+ mov [edi], cx
+ @SkipColor:
+ add esi, 2
+ add edi, 2
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx,_ebx
+ end;
+ 24 :
+ asm
+ mov _ebx, ebx
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ add WorkX, ax // WorkX := Src.w * 2
+ add WorkX, ax // WorkX := Src.w * 3
+ @Loopx:
+ mov bl, [edi] // BX := destination color
+ mov al, [esi] // AX := source color
+ cmp al, 0
+ je @Skip // if AL=0 then skip COMPONENT
+ mov ah, 0 // AX := COLOR COMPONENT
+ mov bh, 0
+ sub bx, ax
+ jns @Skip
+ mov bl, 0
+ @Skip:
+ mov [edi], bl
+ inc esi
+ inc edi
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx,_ebx
+ end;
+ 32 :
+ asm
+ mov _ebx, ebx
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ shl ax, 2
+ mov WorkX, ax // WorkX := Src.w * 4
+ @Loopx:
+ mov bl, [edi] // BX := destination color
+ mov al, [esi] // AX := source color
+ cmp al, 0
+ je @Skip // if AL=0 then skip COMPONENT
+ mov ah, 0 // AX := COLOR COMPONENT
+ mov bh, 0
+ sub bx, ax
+ jns @Skip
+ mov bl, 0
+ @Skip:
+ mov [edi], bl
+ inc esi
+ inc edi
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx,_ebx
+ end;
+ end;
+ SDL_UnlockSurface( SrcSurface );
+ SDL_UnlockSurface( DstSurface );
+end;
+
+procedure SDL_MonoSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DstSurface : PSDL_Surface; DestRect : PSDL_Rect; Color : cardinal );
+var
+ Src, Dest : TSDL_Rect;
+ Diff : integer;
+ SrcAddr, DestAddr : cardinal;
+ _ebx, _esi, _edi, _esp : cardinal;
+ WorkX, WorkY : word;
+ SrcMod, DestMod : cardinal;
+ SrcTransparentColor : cardinal;
+ Bits : cardinal;
+begin
+ if ( SrcSurface = nil ) or ( DstSurface = nil ) then
+ exit; // Remove this to make it faster
+ if ( SrcSurface.Format.BitsPerPixel <> DstSurface.Format.BitsPerPixel ) then
+ exit; // Remove this to make it faster
+ if SrcRect = nil then
+ begin
+ with Src do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface.w;
+ h := SrcSurface.h;
+ end;
+ end
+ else
+ Src := SrcRect^;
+ if DestRect = nil then
+ begin
+ Dest.x := 0;
+ Dest.y := 0;
+ end
+ else
+ Dest := DestRect^;
+ Dest.w := Src.w;
+ Dest.h := Src.h;
+ with DstSurface.Clip_Rect do
+ begin
+ // Source's right side is greater than the dest.cliprect
+ if Dest.x + Src.w > x + w then
+ begin
+ smallint( Src.w ) := x + w - Dest.x;
+ smallint( Dest.w ) := x + w - Dest.x;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's bottom side is greater than the dest.clip
+ if Dest.y + Src.h > y + h then
+ begin
+ smallint( Src.h ) := y + h - Dest.y;
+ smallint( Dest.h ) := y + h - Dest.y;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ // Source's left side is less than the dest.clip
+ if Dest.x < x then
+ begin
+ Diff := x - Dest.x;
+ Src.x := Src.x + Diff;
+ smallint( Src.w ) := smallint( Src.w ) - Diff;
+ Dest.x := x;
+ smallint( Dest.w ) := smallint( Dest.w ) - Diff;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's Top side is less than the dest.clip
+ if Dest.y < y then
+ begin
+ Diff := y - Dest.y;
+ Src.y := Src.y + Diff;
+ smallint( Src.h ) := smallint( Src.h ) - Diff;
+ Dest.y := y;
+ smallint( Dest.h ) := smallint( Dest.h ) - Diff;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ end;
+ with SrcSurface^ do
+ begin
+ SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
+ Format.BytesPerPixel;
+ SrcMod := Pitch - Src.w * Format.BytesPerPixel;
+ SrcTransparentColor := format.colorkey;
+ end;
+ with DstSurface^ do
+ begin
+ DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
+ Format.BytesPerPixel;
+ DestMod := Pitch - Dest.w * Format.BytesPerPixel;
+ Bits := DstSurface.Format.BitsPerPixel;
+ end;
+ SDL_LockSurface( SrcSurface );
+ SDL_LockSurface( DstSurface );
+ case bits of
+ 8 :
+ asm
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ mov ecx, Color
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ @Loopx:
+ mov al, [esi] // AL := source color
+ movzx eax, al
+ cmp eax, SrcTransparentColor
+ je @SkipColor // if AL=Transparent color then skip everything
+ mov [edi], cl
+ @SkipColor:
+ inc esi
+ inc edi
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ end;
+ 15, 16 :
+ asm
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ mov ecx, Color
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ @Loopx:
+ mov ax, [esi] // AX := source color
+ movzx eax, ax
+ cmp eax, SrcTransparentColor
+ je @SkipColor // if AX=Transparent color then skip everything
+ mov [edi], cx
+ @SkipColor:
+ inc esi
+ inc esi
+ inc edi
+ inc edi
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ end;
+ 24 :
+ asm
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov _ebx, ebx
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ mov ecx, Color
+ and ecx, $00ffffff
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ @Loopx:
+ mov eax, [esi] // EAX := source color
+ and eax, $00ffffff
+ cmp eax, SrcTransparentColor
+ je @SkipColor // if EAX=Transparent color then skip everything
+ mov ebx, [edi]
+ and ebx, $ff000000
+ or ebx, ecx
+ mov [edi], ecx
+ @SkipColor:
+ add esi, 3
+ add edi, 3
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp, _esp
+ mov edi, _edi
+ mov esi, _esi
+ mov ebx, _ebx
+ end;
+ 32 :
+ asm
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ mov ecx, Color
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ @Loopx:
+ mov eax, [esi] // EAX := source color
+ cmp eax, SrcTransparentColor
+ je @SkipColor // if EAX=Transparent color then skip everything
+ mov [edi], ecx
+ @SkipColor:
+ add esi, 4
+ add edi, 4
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp, _esp
+ mov edi, _edi
+ mov esi, _esi
+ end;
+ end;
+ SDL_UnlockSurface( SrcSurface );
+ SDL_UnlockSurface( DstSurface );
+end;
+// TextureRect.w and TextureRect.h are not used.
+// The TextureSurface's size MUST larger than the drawing rectangle!!!
+
+procedure SDL_TexturedSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DstSurface : PSDL_Surface; DestRect : PSDL_Rect; Texture : PSDL_Surface;
+ TextureRect : PSDL_Rect );
+var
+ Src, Dest : TSDL_Rect;
+ Diff : integer;
+ SrcAddr, DestAddr, TextAddr : cardinal;
+ _ebx, _esi, _edi, _esp : cardinal;
+ WorkX, WorkY : word;
+ SrcMod, DestMod, TextMod : cardinal;
+ SrcTransparentColor : cardinal;
+ Bits : cardinal;
+begin
+ if ( SrcSurface = nil ) or ( DstSurface = nil ) then
+ exit; // Remove this to make it faster
+ if ( SrcSurface.Format.BitsPerPixel <> DstSurface.Format.BitsPerPixel ) then
+ exit; // Remove this to make it faster
+ if SrcRect = nil then
+ begin
+ with Src do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface.w;
+ h := SrcSurface.h;
+ end;
+ end
+ else
+ Src := SrcRect^;
+ if DestRect = nil then
+ begin
+ Dest.x := 0;
+ Dest.y := 0;
+ end
+ else
+ Dest := DestRect^;
+ Dest.w := Src.w;
+ Dest.h := Src.h;
+ with DstSurface.Clip_Rect do
+ begin
+ // Source's right side is greater than the dest.cliprect
+ if Dest.x + Src.w > x + w then
+ begin
+ smallint( Src.w ) := x + w - Dest.x;
+ smallint( Dest.w ) := x + w - Dest.x;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's bottom side is greater than the dest.clip
+ if Dest.y + Src.h > y + h then
+ begin
+ smallint( Src.h ) := y + h - Dest.y;
+ smallint( Dest.h ) := y + h - Dest.y;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ // Source's left side is less than the dest.clip
+ if Dest.x < x then
+ begin
+ Diff := x - Dest.x;
+ Src.x := Src.x + Diff;
+ smallint( Src.w ) := smallint( Src.w ) - Diff;
+ Dest.x := x;
+ smallint( Dest.w ) := smallint( Dest.w ) - Diff;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's Top side is less than the dest.clip
+ if Dest.y < y then
+ begin
+ Diff := y - Dest.y;
+ Src.y := Src.y + Diff;
+ smallint( Src.h ) := smallint( Src.h ) - Diff;
+ Dest.y := y;
+ smallint( Dest.h ) := smallint( Dest.h ) - Diff;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ end;
+ with SrcSurface^ do
+ begin
+ SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
+ Format.BytesPerPixel;
+ SrcMod := Pitch - Src.w * Format.BytesPerPixel;
+ SrcTransparentColor := format.colorkey;
+ end;
+ with DstSurface^ do
+ begin
+ DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
+ Format.BytesPerPixel;
+ DestMod := Pitch - Dest.w * Format.BytesPerPixel;
+ Bits := DstSurface.Format.BitsPerPixel;
+ end;
+ with Texture^ do
+ begin
+ TextAddr := cardinal( Pixels ) + UInt32( TextureRect.y ) * Pitch +
+ UInt32( TextureRect.x ) * Format.BytesPerPixel;
+ TextMod := Pitch - Src.w * Format.BytesPerPixel;
+ end;
+ SDL_LockSurface( SrcSurface );
+ SDL_LockSurface( DstSurface );
+ SDL_LockSurface( Texture );
+ case bits of
+ 8 :
+ asm
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov _ebx, ebx
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ebx, TextAddr
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ @Loopx:
+ mov al, [esi] // AL := source color
+ movzx eax, al
+ cmp eax, SrcTransparentColor
+ je @SkipColor // if AL=Transparent color then skip everything
+ mov al, [ebx]
+ mov [edi], al
+ @SkipColor:
+ inc esi
+ inc edi
+ inc ebx
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ add ebx, TextMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx, _ebx
+ end;
+ 15, 16 :
+ asm
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ecx, TextAddr
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ @Loopx:
+ mov ax, [esi] // AL := source color
+ movzx eax, ax
+ cmp eax, SrcTransparentColor
+ je @SkipColor // if AL=Transparent color then skip everything
+ mov ax, [ecx]
+ mov [edi], ax
+ @SkipColor:
+ inc esi
+ inc esi
+ inc edi
+ inc edi
+ inc ecx
+ inc ecx
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ add ecx, TextMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ end;
+ 24 :
+ asm
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov _ebx, ebx
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ebx, TextAddr
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ @Loopx:
+ mov eax, [esi] // AL := source color
+ and eax, $00ffffff
+ cmp eax, SrcTransparentColor
+ je @SkipColor // if AL=Transparent color then skip everything
+ mov eax, [ebx]
+ and eax, $00ffffff
+ mov ecx, [edi]
+ and ecx, $ff000000
+ or ecx, eax
+ mov [edi], eax
+ @SkipColor:
+ add esi, 3
+ add edi, 3
+ add ebx, 3
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ add ebx, TextMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx, _ebx
+ end;
+ 32 :
+ asm
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ecx, TextAddr
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ @Loopx:
+ mov eax, [esi] // AL := source color
+ cmp eax, SrcTransparentColor
+ je @SkipColor // if AL=Transparent color then skip everything
+ mov eax, [ecx]
+ mov [edi], eax
+ @SkipColor:
+ add esi, 4
+ add edi, 4
+ add ecx, 4
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ add ecx, TextMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ end;
+ end;
+ SDL_UnlockSurface( SrcSurface );
+ SDL_UnlockSurface( DstSurface );
+ SDL_UnlockSurface( Texture );
+end;
+
+procedure SDL_ZoomSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect; DstSurface : PSDL_Surface; DstRect : PSDL_Rect );
+var
+ xc, yc : cardinal;
+ rx, wx, ry, wy, ry16 : cardinal;
+ color : cardinal;
+ modx, mody : cardinal;
+begin
+ // Warning! No checks for surface pointers!!!
+ if srcrect = nil then
+ srcrect := @SrcSurface.clip_rect;
+ if dstrect = nil then
+ dstrect := @DstSurface.clip_rect;
+ if SDL_MustLock( SrcSurface ) then
+ SDL_LockSurface( SrcSurface );
+ if SDL_MustLock( DstSurface ) then
+ SDL_LockSurface( DstSurface );
+ modx := trunc( ( srcrect.w / dstrect.w ) * 65536 );
+ mody := trunc( ( srcrect.h / dstrect.h ) * 65536 );
+ //rx := srcrect.x * 65536;
+ ry := srcrect.y * 65536;
+ wy := dstrect.y;
+ for yc := 0 to dstrect.h - 1 do
+ begin
+ rx := srcrect.x * 65536;
+ wx := dstrect.x;
+ ry16 := ry shr 16;
+ for xc := 0 to dstrect.w - 1 do
+ begin
+ color := SDL_GetPixel( SrcSurface, rx shr 16, ry16 );
+ SDL_PutPixel( DstSurface, wx, wy, color );
+ rx := rx + modx;
+ inc( wx );
+ end;
+ ry := ry + mody;
+ inc( wy );
+ end;
+ if SDL_MustLock( SrcSurface ) then
+ SDL_UnlockSurface( SrcSurface );
+ if SDL_MustLock( DstSurface ) then
+ SDL_UnlockSurface( DstSurface );
+end;
+// Re-map a rectangular area into an area defined by four vertices
+// Converted from C to Pascal by KiCHY
+
+procedure SDL_WarpSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect; DstSurface : PSDL_Surface; UL, UR, LR, LL : PPoint );
+const
+ SHIFTS = 15; // Extend ints to limit round-off error (try 2 - 20)
+ THRESH = 1 shl SHIFTS; // Threshold for pixel size value
+ procedure CopySourceToDest( UL, UR, LR, LL : TPoint; x1, y1, x2, y2 : cardinal );
+ var
+ tm, lm, rm, bm, m : TPoint;
+ mx, my : cardinal;
+ cr : cardinal;
+ begin
+ // Does the destination area specify a single pixel?
+ if ( ( abs( ul.x - ur.x ) < THRESH ) and
+ ( abs( ul.x - lr.x ) < THRESH ) and
+ ( abs( ul.x - ll.x ) < THRESH ) and
+ ( abs( ul.y - ur.y ) < THRESH ) and
+ ( abs( ul.y - lr.y ) < THRESH ) and
+ ( abs( ul.y - ll.y ) < THRESH ) ) then
+ begin // Yes
+ cr := SDL_GetPixel( SrcSurface, ( x1 shr SHIFTS ), ( y1 shr SHIFTS ) );
+ SDL_PutPixel( DstSurface, ( ul.x shr SHIFTS ), ( ul.y shr SHIFTS ), cr );
+ end
+ else
+ begin // No
+ // Quarter the source and the destination, and then recurse
+ tm.x := ( ul.x + ur.x ) shr 1;
+ tm.y := ( ul.y + ur.y ) shr 1;
+ bm.x := ( ll.x + lr.x ) shr 1;
+ bm.y := ( ll.y + lr.y ) shr 1;
+ lm.x := ( ul.x + ll.x ) shr 1;
+ lm.y := ( ul.y + ll.y ) shr 1;
+ rm.x := ( ur.x + lr.x ) shr 1;
+ rm.y := ( ur.y + lr.y ) shr 1;
+ m.x := ( tm.x + bm.x ) shr 1;
+ m.y := ( tm.y + bm.y ) shr 1;
+ mx := ( x1 + x2 ) shr 1;
+ my := ( y1 + y2 ) shr 1;
+ CopySourceToDest( ul, tm, m, lm, x1, y1, mx, my );
+ CopySourceToDest( tm, ur, rm, m, mx, y1, x2, my );
+ CopySourceToDest( m, rm, lr, bm, mx, my, x2, y2 );
+ CopySourceToDest( lm, m, bm, ll, x1, my, mx, y2 );
+ end;
+ end;
+var
+ _UL, _UR, _LR, _LL : TPoint;
+ Rect_x, Rect_y, Rect_w, Rect_h : integer;
+begin
+ if SDL_MustLock( SrcSurface ) then
+ SDL_LockSurface( SrcSurface );
+ if SDL_MustLock( DstSurface ) then
+ SDL_LockSurface( DstSurface );
+ if SrcRect = nil then
+ begin
+ Rect_x := 0;
+ Rect_y := 0;
+ Rect_w := ( SrcSurface.w - 1 ) shl SHIFTS;
+ Rect_h := ( SrcSurface.h - 1 ) shl SHIFTS;
+ end
+ else
+ begin
+ Rect_x := SrcRect.x;
+ Rect_y := SrcRect.y;
+ Rect_w := ( SrcRect.w - 1 ) shl SHIFTS;
+ Rect_h := ( SrcRect.h - 1 ) shl SHIFTS;
+ end;
+ // Shift all values to help reduce round-off error.
+ _ul.x := ul.x shl SHIFTS;
+ _ul.y := ul.y shl SHIFTS;
+ _ur.x := ur.x shl SHIFTS;
+ _ur.y := ur.y shl SHIFTS;
+ _lr.x := lr.x shl SHIFTS;
+ _lr.y := lr.y shl SHIFTS;
+ _ll.x := ll.x shl SHIFTS;
+ _ll.y := ll.y shl SHIFTS;
+ CopySourceToDest( _ul, _ur, _lr, _ll, Rect_x, Rect_y, Rect_w, Rect_h );
+ if SDL_MustLock( SrcSurface ) then
+ SDL_UnlockSurface( SrcSurface );
+ if SDL_MustLock( DstSurface ) then
+ SDL_UnlockSurface( DstSurface );
+end;
+
+// flips a rectangle vertically on given surface
+procedure SDL_FlipRectV( DstSurface : PSDL_Surface; Rect : PSDL_Rect );
+var
+ TmpRect : TSDL_Rect;
+ Locked : boolean;
+ y, FlipLength, RowLength : integer;
+ Row1, Row2 : Pointer;
+ OneRow : TByteArray; // Optimize it if you wish
+begin
+ if DstSurface <> nil then
+ begin
+ if Rect = nil then
+ begin // if Rect=nil then we flip the whole surface
+ TmpRect := SDLRect( 0, 0, DstSurface.w, DstSurface.h );
+ Rect := @TmpRect;
+ end;
+ FlipLength := Rect^.h shr 1 - 1;
+ RowLength := Rect^.w * DstSurface^.format.BytesPerPixel;
+ if SDL_MustLock( DstSurface ) then
+ begin
+ Locked := true;
+ SDL_LockSurface( DstSurface );
+ end
+ else
+ Locked := false;
+ Row1 := pointer( cardinal( DstSurface^.Pixels ) + UInt32( Rect^.y ) *
+ DstSurface^.Pitch );
+ Row2 := pointer( cardinal( DstSurface^.Pixels ) + ( UInt32( Rect^.y ) + Rect^.h - 1 )
+ * DstSurface^.Pitch );
+ for y := 0 to FlipLength do
+ begin
+ Move( Row1^, OneRow, RowLength );
+ Move( Row2^, Row1^, RowLength );
+ Move( OneRow, Row2^, RowLength );
+ inc( cardinal( Row1 ), DstSurface^.Pitch );
+ dec( cardinal( Row2 ), DstSurface^.Pitch );
+ end;
+ if Locked then
+ SDL_UnlockSurface( DstSurface );
+ end;
+end;
+
+// flips a rectangle horizontally on given surface
+procedure SDL_FlipRectH( DstSurface : PSDL_Surface; Rect : PSDL_Rect );
+type
+ T24bit = packed array[ 0..2 ] of byte;
+ T24bitArray = packed array[ 0..8191 ] of T24bit;
+ P24bitArray = ^T24bitArray;
+ TLongWordArray = array[ 0..8191 ] of LongWord;
+ PLongWordArray = ^TLongWordArray;
+var
+ TmpRect : TSDL_Rect;
+ Row8bit : PByteArray;
+ Row16bit : PWordArray;
+ Row24bit : P24bitArray;
+ Row32bit : PLongWordArray;
+ y, x, RightSide, FlipLength : integer;
+ Pixel : cardinal;
+ Pixel24 : T24bit;
+ Locked : boolean;
+begin
+ if DstSurface <> nil then
+ begin
+ if Rect = nil then
+ begin
+ TmpRect := SDLRect( 0, 0, DstSurface.w, DstSurface.h );
+ Rect := @TmpRect;
+ end;
+ FlipLength := Rect^.w shr 1 - 1;
+ if SDL_MustLock( DstSurface ) then
+ begin
+ Locked := true;
+ SDL_LockSurface( DstSurface );
+ end
+ else
+ Locked := false;
+ case DstSurface^.format.BytesPerPixel of
+ 1 :
+ begin
+ Row8Bit := pointer( cardinal( DstSurface^.pixels ) + UInt32( Rect^.y ) *
+ DstSurface^.pitch );
+ for y := 1 to Rect^.h do
+ begin
+ RightSide := Rect^.w - 1;
+ for x := 0 to FlipLength do
+ begin
+ Pixel := Row8Bit^[ x ];
+ Row8Bit^[ x ] := Row8Bit^[ RightSide ];
+ Row8Bit^[ RightSide ] := Pixel;
+ dec( RightSide );
+ end;
+ inc( cardinal( Row8Bit ), DstSurface^.pitch );
+ end;
+ end;
+ 2 :
+ begin
+ Row16Bit := pointer( cardinal( DstSurface^.pixels ) + UInt32( Rect^.y ) *
+ DstSurface^.pitch );
+ for y := 1 to Rect^.h do
+ begin
+ RightSide := Rect^.w - 1;
+ for x := 0 to FlipLength do
+ begin
+ Pixel := Row16Bit^[ x ];
+ Row16Bit^[ x ] := Row16Bit^[ RightSide ];
+ Row16Bit^[ RightSide ] := Pixel;
+ dec( RightSide );
+ end;
+ inc( cardinal( Row16Bit ), DstSurface^.pitch );
+ end;
+ end;
+ 3 :
+ begin
+ Row24Bit := pointer( cardinal( DstSurface^.pixels ) + UInt32( Rect^.y ) *
+ DstSurface^.pitch );
+ for y := 1 to Rect^.h do
+ begin
+ RightSide := Rect^.w - 1;
+ for x := 0 to FlipLength do
+ begin
+ Pixel24 := Row24Bit^[ x ];
+ Row24Bit^[ x ] := Row24Bit^[ RightSide ];
+ Row24Bit^[ RightSide ] := Pixel24;
+ dec( RightSide );
+ end;
+ inc( cardinal( Row24Bit ), DstSurface^.pitch );
+ end;
+ end;
+ 4 :
+ begin
+ Row32Bit := pointer( cardinal( DstSurface^.pixels ) + UInt32( Rect^.y ) *
+ DstSurface^.pitch );
+ for y := 1 to Rect^.h do
+ begin
+ RightSide := Rect^.w - 1;
+ for x := 0 to FlipLength do
+ begin
+ Pixel := Row32Bit^[ x ];
+ Row32Bit^[ x ] := Row32Bit^[ RightSide ];
+ Row32Bit^[ RightSide ] := Pixel;
+ dec( RightSide );
+ end;
+ inc( cardinal( Row32Bit ), DstSurface^.pitch );
+ end;
+ end;
+ end;
+ if Locked then
+ SDL_UnlockSurface( DstSurface );
+ end;
+end;
+
+// Use with caution! The procedure allocates memory for TSDL_Rect and return with its pointer.
+// But you MUST free it after you don't need it anymore!!!
+function PSDLRect( aLeft, aTop, aWidth, aHeight : integer ) : PSDL_Rect;
+var
+ Rect : PSDL_Rect;
+begin
+ New( Rect );
+ with Rect^ do
+ begin
+ x := aLeft;
+ y := aTop;
+ w := aWidth;
+ h := aHeight;
+ end;
+ Result := Rect;
+end;
+
+function SDLRect( aLeft, aTop, aWidth, aHeight : integer ) : TSDL_Rect;
+begin
+ with result do
+ begin
+ x := aLeft;
+ y := aTop;
+ w := aWidth;
+ h := aHeight;
+ end;
+end;
+
+function SDLRect( aRect : TRect ) : TSDL_Rect;
+begin
+ with aRect do
+ result := SDLRect( Left, Top, Right - Left, Bottom - Top );
+end;
+
+procedure SDL_Stretch8( Surface, Dst_Surface : PSDL_Surface; x1, x2, y1, y2, yr, yw,
+ depth : integer );
+var
+ dx, dy, e, d, dx2 : integer;
+ src_pitch, dst_pitch : uint16;
+ src_pixels, dst_pixels : PUint8;
+begin
+ if ( yw >= dst_surface^.h ) then
+ exit;
+ dx := ( x2 - x1 );
+ dy := ( y2 - y1 );
+ dy := dy shl 1;
+ e := dy - dx;
+ dx2 := dx shl 1;
+ src_pitch := Surface^.pitch;
+ dst_pitch := dst_surface^.pitch;
+ src_pixels := PUint8( integer( Surface^.pixels ) + yr * src_pitch + y1 * depth );
+ dst_pixels := PUint8( integer( dst_surface^.pixels ) + yw * dst_pitch + x1 *
+ depth );
+ for d := 0 to dx - 1 do
+ begin
+ move( src_pixels^, dst_pixels^, depth );
+ while ( e >= 0 ) do
+ begin
+ inc( src_pixels, depth );
+ e := e - dx2;
+ end;
+ inc( dst_pixels, depth );
+ e := e + dy;
+ end;
+end;
+
+function sign( x : integer ) : integer;
+begin
+ if x > 0 then
+ result := 1
+ else
+ result := -1;
+end;
+
+// Stretches a part of a surface
+function SDL_ScaleSurfaceRect( SrcSurface : PSDL_Surface; SrcX1, SrcY1, SrcW, SrcH,
+ Width, Height : integer ) : PSDL_Surface;
+var
+ dst_surface : PSDL_Surface;
+ dx, dy, e, d, dx2, srcx2, srcy2 : integer;
+ destx1, desty1 : integer;
+begin
+ srcx2 := srcx1 + SrcW;
+ srcy2 := srcy1 + SrcH;
+ result := nil;
+ destx1 := 0;
+ desty1 := 0;
+ dx := abs( integer( Height - desty1 ) );
+ dy := abs( integer( SrcY2 - SrcY1 ) );
+ e := ( dy shl 1 ) - dx;
+ dx2 := dx shl 1;
+ dy := dy shl 1;
+ dst_surface := SDL_CreateRGBSurface( SDL_HWPALETTE, width - destx1, Height -
+ desty1,
+ SrcSurface^.Format^.BitsPerPixel,
+ SrcSurface^.Format^.RMask,
+ SrcSurface^.Format^.GMask,
+ SrcSurface^.Format^.BMask,
+ SrcSurface^.Format^.AMask );
+ if ( dst_surface^.format^.BytesPerPixel = 1 ) then
+ SDL_SetColors( dst_surface, @SrcSurface^.format^.palette^.colors^[ 0 ], 0, 256 );
+ SDL_SetColorKey( dst_surface, sdl_srccolorkey, SrcSurface^.format^.colorkey );
+ if ( SDL_MustLock( dst_surface ) ) then
+ if ( SDL_LockSurface( dst_surface ) < 0 ) then
+ exit;
+ for d := 0 to dx - 1 do
+ begin
+ SDL_Stretch8( SrcSurface, dst_surface, destx1, Width, SrcX1, SrcX2, SrcY1, desty1,
+ SrcSurface^.format^.BytesPerPixel );
+ while e >= 0 do
+ begin
+ inc( SrcY1 );
+ e := e - dx2;
+ end;
+ inc( desty1 );
+ e := e + dy;
+ end;
+ if SDL_MUSTLOCK( dst_surface ) then
+ SDL_UnlockSurface( dst_surface );
+ result := dst_surface;
+end;
+
+procedure SDL_ScrollY( DstSurface : PSDL_Surface; DifY : integer );
+var
+ r1, r2 : TSDL_Rect;
+ //buffer: PSDL_Surface;
+ YPos : Integer;
+begin
+ if ( DstSurface <> nil ) and ( DifY <> 0 ) then
+ begin
+ //if DifY > 0 then // going up
+ //begin
+ ypos := 0;
+ r1.x := 0;
+ r2.x := 0;
+ r1.w := DstSurface.w;
+ r2.w := DstSurface.w;
+ r1.h := DifY;
+ r2.h := DifY;
+ while ypos < DstSurface.h do
+ begin
+ r1.y := ypos;
+ r2.y := ypos + DifY;
+ SDL_BlitSurface( DstSurface, @r2, DstSurface, @r1 );
+ ypos := ypos + DifY;
+ end;
+ //end
+ //else
+ //begin // Going Down
+ //end;
+ end;
+end;
+
+procedure SDL_ScrollX( DstSurface : PSDL_Surface; DifX : integer );
+var
+ r1, r2 : TSDL_Rect;
+ buffer : PSDL_Surface;
+begin
+ if ( DstSurface <> nil ) and ( DifX <> 0 ) then
+ begin
+ buffer := SDL_CreateRGBSurface( SDL_HWSURFACE, ( DstSurface^.w - DifX ) * 2,
+ DstSurface^.h * 2,
+ DstSurface^.Format^.BitsPerPixel,
+ DstSurface^.Format^.RMask,
+ DstSurface^.Format^.GMask,
+ DstSurface^.Format^.BMask,
+ DstSurface^.Format^.AMask );
+ if buffer <> nil then
+ begin
+ if ( buffer^.format^.BytesPerPixel = 1 ) then
+ SDL_SetColors( buffer, @DstSurface^.format^.palette^.colors^[ 0 ], 0, 256 );
+ r1 := SDLRect( DifX, 0, buffer^.w, buffer^.h );
+ r2 := SDLRect( 0, 0, buffer^.w, buffer^.h );
+ SDL_BlitSurface( DstSurface, @r1, buffer, @r2 );
+ SDL_BlitSurface( buffer, @r2, DstSurface, @r2 );
+ SDL_FreeSurface( buffer );
+ end;
+ end;
+end;
+
+procedure SDL_RotateRad( DstSurface, SrcSurface : PSDL_Surface; SrcRect :
+ PSDL_Rect; DestX, DestY, OffsetX, OffsetY : Integer; Angle : Single );
+var
+ aSin, aCos : Single;
+ MX, MY, DX, DY, NX, NY, SX, SY, OX, OY, Width, Height, TX, TY, RX, RY, ROX, ROY : Integer;
+ Colour, TempTransparentColour : UInt32;
+ MAXX, MAXY : Integer;
+begin
+ // Rotate the surface to the target surface.
+ TempTransparentColour := SrcSurface.format.colorkey;
+ if srcRect.w > srcRect.h then
+ begin
+ Width := srcRect.w;
+ Height := srcRect.w;
+ end
+ else
+ begin
+ Width := srcRect.h;
+ Height := srcRect.h;
+ end;
+
+ maxx := DstSurface.w;
+ maxy := DstSurface.h;
+ aCos := cos( Angle );
+ aSin := sin( Angle );
+
+ Width := round( abs( srcrect.h * acos ) + abs( srcrect.w * asin ) );
+ Height := round( abs( srcrect.h * asin ) + abs( srcrect.w * acos ) );
+
+ OX := Width div 2;
+ OY := Height div 2; ;
+ MX := ( srcRect.x + ( srcRect.x + srcRect.w ) ) div 2;
+ MY := ( srcRect.y + ( srcRect.y + srcRect.h ) ) div 2;
+ ROX := ( -( srcRect.w div 2 ) ) + Offsetx;
+ ROY := ( -( srcRect.h div 2 ) ) + OffsetY;
+ Tx := ox + round( ROX * aSin - ROY * aCos );
+ Ty := oy + round( ROY * aSin + ROX * aCos );
+ SX := 0;
+ for DX := DestX - TX to DestX - TX + ( width ) do
+ begin
+ Inc( SX );
+ SY := 0;
+ for DY := DestY - TY to DestY - TY + ( Height ) do
+ begin
+ RX := SX - OX;
+ RY := SY - OY;
+ NX := round( mx + RX * aSin + RY * aCos ); //
+ NY := round( my + RY * aSin - RX * aCos ); //
+ // Used for testing only
+ //SDL_PutPixel(DstSurface.SDLSurfacePointer,DX,DY,0);
+ if ( ( DX > 0 ) and ( DX < MAXX ) ) and ( ( DY > 0 ) and ( DY < MAXY ) ) then
+ begin
+ if ( NX >= srcRect.x ) and ( NX <= srcRect.x + srcRect.w ) then
+ begin
+ if ( NY >= srcRect.y ) and ( NY <= srcRect.y + srcRect.h ) then
+ begin
+ Colour := SDL_GetPixel( SrcSurface, NX, NY );
+ if Colour <> TempTransparentColour then
+ begin
+ SDL_PutPixel( DstSurface, DX, DY, Colour );
+ end;
+ end;
+ end;
+ end;
+ inc( SY );
+ end;
+ end;
+end;
+
+procedure SDL_RotateDeg( DstSurface, SrcSurface : PSDL_Surface; SrcRect :
+ PSDL_Rect; DestX, DestY, OffsetX, OffsetY : Integer; Angle : Integer );
+begin
+ SDL_RotateRad( DstSurface, SrcSurface, SrcRect, DestX, DestY, OffsetX, OffsetY, DegToRad( Angle ) );
+end;
+
+function ValidateSurfaceRect( DstSurface : PSDL_Surface; dstrect : PSDL_Rect ) : TSDL_Rect;
+var
+ RealRect : TSDL_Rect;
+ OutOfRange : Boolean;
+begin
+ OutOfRange := false;
+ if dstrect = nil then
+ begin
+ RealRect.x := 0;
+ RealRect.y := 0;
+ RealRect.w := DstSurface.w;
+ RealRect.h := DstSurface.h;
+ end
+ else
+ begin
+ if dstrect.x < DstSurface.w then
+ begin
+ RealRect.x := dstrect.x;
+ end
+ else if dstrect.x < 0 then
+ begin
+ realrect.x := 0;
+ end
+ else
+ begin
+ OutOfRange := True;
+ end;
+ if dstrect.y < DstSurface.h then
+ begin
+ RealRect.y := dstrect.y;
+ end
+ else if dstrect.y < 0 then
+ begin
+ realrect.y := 0;
+ end
+ else
+ begin
+ OutOfRange := True;
+ end;
+ if OutOfRange = False then
+ begin
+ if realrect.x + dstrect.w <= DstSurface.w then
+ begin
+ RealRect.w := dstrect.w;
+ end
+ else
+ begin
+ RealRect.w := dstrect.w - realrect.x;
+ end;
+ if realrect.y + dstrect.h <= DstSurface.h then
+ begin
+ RealRect.h := dstrect.h;
+ end
+ else
+ begin
+ RealRect.h := dstrect.h - realrect.y;
+ end;
+ end;
+ end;
+ if OutOfRange = False then
+ begin
+ result := realrect;
+ end
+ else
+ begin
+ realrect.w := 0;
+ realrect.h := 0;
+ realrect.x := 0;
+ realrect.y := 0;
+ result := realrect;
+ end;
+end;
+
+procedure SDL_FillRectAdd( DstSurface : PSDL_Surface; dstrect : PSDL_Rect; color : UInt32 );
+var
+ RealRect : TSDL_Rect;
+ Addr : pointer;
+ ModX, BPP : cardinal;
+ x, y, R, G, B, SrcColor : cardinal;
+begin
+ RealRect := ValidateSurfaceRect( DstSurface, DstRect );
+ if ( RealRect.w > 0 ) and ( RealRect.h > 0 ) then
+ begin
+ SDL_LockSurface( DstSurface );
+ BPP := DstSurface.format.BytesPerPixel;
+ with DstSurface^ do
+ begin
+ Addr := pointer( UInt32( pixels ) + UInt32( RealRect.y ) * pitch + UInt32( RealRect.x ) * BPP );
+ ModX := Pitch - UInt32( RealRect.w ) * BPP;
+ end;
+ case DstSurface.format.BitsPerPixel of
+ 8 :
+ begin
+ for y := 0 to RealRect.h - 1 do
+ begin
+ for x := 0 to RealRect.w - 1 do
+ begin
+ SrcColor := PUInt32( Addr )^;
+ R := SrcColor and $E0 + Color and $E0;
+ G := SrcColor and $1C + Color and $1C;
+ B := SrcColor and $03 + Color and $03;
+ if R > $E0 then
+ R := $E0;
+ if G > $1C then
+ G := $1C;
+ if B > $03 then
+ B := $03;
+ PUInt8( Addr )^ := R or G or B;
+ inc( UInt32( Addr ), BPP );
+ end;
+ inc( UInt32( Addr ), ModX );
+ end;
+ end;
+ 15 :
+ begin
+ for y := 0 to RealRect.h - 1 do
+ begin
+ for x := 0 to RealRect.w - 1 do
+ begin
+ SrcColor := PUInt32( Addr )^;
+ R := SrcColor and $7C00 + Color and $7C00;
+ G := SrcColor and $03E0 + Color and $03E0;
+ B := SrcColor and $001F + Color and $001F;
+ if R > $7C00 then
+ R := $7C00;
+ if G > $03E0 then
+ G := $03E0;
+ if B > $001F then
+ B := $001F;
+ PUInt16( Addr )^ := R or G or B;
+ inc( UInt32( Addr ), BPP );
+ end;
+ inc( UInt32( Addr ), ModX );
+ end;
+ end;
+ 16 :
+ begin
+ for y := 0 to RealRect.h - 1 do
+ begin
+ for x := 0 to RealRect.w - 1 do
+ begin
+ SrcColor := PUInt32( Addr )^;
+ R := SrcColor and $F800 + Color and $F800;
+ G := SrcColor and $07C0 + Color and $07C0;
+ B := SrcColor and $001F + Color and $001F;
+ if R > $F800 then
+ R := $F800;
+ if G > $07C0 then
+ G := $07C0;
+ if B > $001F then
+ B := $001F;
+ PUInt16( Addr )^ := R or G or B;
+ inc( UInt32( Addr ), BPP );
+ end;
+ inc( UInt32( Addr ), ModX );
+ end;
+ end;
+ 24 :
+ begin
+ for y := 0 to RealRect.h - 1 do
+ begin
+ for x := 0 to RealRect.w - 1 do
+ begin
+ SrcColor := PUInt32( Addr )^;
+ R := SrcColor and $00FF0000 + Color and $00FF0000;
+ G := SrcColor and $0000FF00 + Color and $0000FF00;
+ B := SrcColor and $000000FF + Color and $000000FF;
+ if R > $FF0000 then
+ R := $FF0000;
+ if G > $00FF00 then
+ G := $00FF00;
+ if B > $0000FF then
+ B := $0000FF;
+ PUInt32( Addr )^ := SrcColor and $FF000000 or R or G or B;
+ inc( UInt32( Addr ), BPP );
+ end;
+ inc( UInt32( Addr ), ModX );
+ end;
+ end;
+ 32 :
+ begin
+ for y := 0 to RealRect.h - 1 do
+ begin
+ for x := 0 to RealRect.w - 1 do
+ begin
+ SrcColor := PUInt32( Addr )^;
+ R := SrcColor and $00FF0000 + Color and $00FF0000;
+ G := SrcColor and $0000FF00 + Color and $0000FF00;
+ B := SrcColor and $000000FF + Color and $000000FF;
+ if R > $FF0000 then
+ R := $FF0000;
+ if G > $00FF00 then
+ G := $00FF00;
+ if B > $0000FF then
+ B := $0000FF;
+ PUInt32( Addr )^ := R or G or B;
+ inc( UInt32( Addr ), BPP );
+ end;
+ inc( UInt32( Addr ), ModX );
+ end;
+ end;
+ end;
+ SDL_UnlockSurface( DstSurface );
+ end;
+end;
+
+procedure SDL_FillRectSub( DstSurface : PSDL_Surface; dstrect : PSDL_Rect; color : UInt32 );
+var
+ RealRect : TSDL_Rect;
+ Addr : pointer;
+ ModX, BPP : cardinal;
+ x, y, R, G, B, SrcColor : cardinal;
+begin
+ RealRect := ValidateSurfaceRect( DstSurface, DstRect );
+ if ( RealRect.w > 0 ) and ( RealRect.h > 0 ) then
+ begin
+ SDL_LockSurface( DstSurface );
+ BPP := DstSurface.format.BytesPerPixel;
+ with DstSurface^ do
+ begin
+ Addr := pointer( UInt32( pixels ) + UInt32( RealRect.y ) * pitch + UInt32( RealRect.x ) * BPP );
+ ModX := Pitch - UInt32( RealRect.w ) * BPP;
+ end;
+ case DstSurface.format.BitsPerPixel of
+ 8 :
+ begin
+ for y := 0 to RealRect.h - 1 do
+ begin
+ for x := 0 to RealRect.w - 1 do
+ begin
+ SrcColor := PUInt32( Addr )^;
+ R := SrcColor and $E0 - Color and $E0;
+ G := SrcColor and $1C - Color and $1C;
+ B := SrcColor and $03 - Color and $03;
+ if R > $E0 then
+ R := 0;
+ if G > $1C then
+ G := 0;
+ if B > $03 then
+ B := 0;
+ PUInt8( Addr )^ := R or G or B;
+ inc( UInt32( Addr ), BPP );
+ end;
+ inc( UInt32( Addr ), ModX );
+ end;
+ end;
+ 15 :
+ begin
+ for y := 0 to RealRect.h - 1 do
+ begin
+ for x := 0 to RealRect.w - 1 do
+ begin
+ SrcColor := PUInt32( Addr )^;
+ R := SrcColor and $7C00 - Color and $7C00;
+ G := SrcColor and $03E0 - Color and $03E0;
+ B := SrcColor and $001F - Color and $001F;
+ if R > $7C00 then
+ R := 0;
+ if G > $03E0 then
+ G := 0;
+ if B > $001F then
+ B := 0;
+ PUInt16( Addr )^ := R or G or B;
+ inc( UInt32( Addr ), BPP );
+ end;
+ inc( UInt32( Addr ), ModX );
+ end;
+ end;
+ 16 :
+ begin
+ for y := 0 to RealRect.h - 1 do
+ begin
+ for x := 0 to RealRect.w - 1 do
+ begin
+ SrcColor := PUInt32( Addr )^;
+ R := SrcColor and $F800 - Color and $F800;
+ G := SrcColor and $07C0 - Color and $07C0;
+ B := SrcColor and $001F - Color and $001F;
+ if R > $F800 then
+ R := 0;
+ if G > $07C0 then
+ G := 0;
+ if B > $001F then
+ B := 0;
+ PUInt16( Addr )^ := R or G or B;
+ inc( UInt32( Addr ), BPP );
+ end;
+ inc( UInt32( Addr ), ModX );
+ end;
+ end;
+ 24 :
+ begin
+ for y := 0 to RealRect.h - 1 do
+ begin
+ for x := 0 to RealRect.w - 1 do
+ begin
+ SrcColor := PUInt32( Addr )^;
+ R := SrcColor and $00FF0000 - Color and $00FF0000;
+ G := SrcColor and $0000FF00 - Color and $0000FF00;
+ B := SrcColor and $000000FF - Color and $000000FF;
+ if R > $FF0000 then
+ R := 0;
+ if G > $00FF00 then
+ G := 0;
+ if B > $0000FF then
+ B := 0;
+ PUInt32( Addr )^ := SrcColor and $FF000000 or R or G or B;
+ inc( UInt32( Addr ), BPP );
+ end;
+ inc( UInt32( Addr ), ModX );
+ end;
+ end;
+ 32 :
+ begin
+ for y := 0 to RealRect.h - 1 do
+ begin
+ for x := 0 to RealRect.w - 1 do
+ begin
+ SrcColor := PUInt32( Addr )^;
+ R := SrcColor and $00FF0000 - Color and $00FF0000;
+ G := SrcColor and $0000FF00 - Color and $0000FF00;
+ B := SrcColor and $000000FF - Color and $000000FF;
+ if R > $FF0000 then
+ R := 0;
+ if G > $00FF00 then
+ G := 0;
+ if B > $0000FF then
+ B := 0;
+ PUInt32( Addr )^ := R or G or B;
+ inc( UInt32( Addr ), BPP );
+ end;
+ inc( UInt32( Addr ), ModX );
+ end;
+ end;
+ end;
+ SDL_UnlockSurface( DstSurface );
+ end;
+end;
+
+procedure SDL_GradientFillRect( DstSurface : PSDL_Surface; const Rect : PSDL_Rect; const StartColor, EndColor : TSDL_Color; const Style : TGradientStyle );
+var
+ FBC : array[ 0..255 ] of Cardinal;
+ // temp vars
+ i, YR, YG, YB, SR, SG, SB, DR, DG, DB : Integer;
+
+ TempStepV, TempStepH : Single;
+ TempLeft, TempTop, TempHeight, TempWidth : integer;
+ TempRect : TSDL_Rect;
+
+begin
+ // calc FBC
+ YR := StartColor.r;
+ YG := StartColor.g;
+ YB := StartColor.b;
+ SR := YR;
+ SG := YG;
+ SB := YB;
+ DR := EndColor.r - SR;
+ DG := EndColor.g - SG;
+ DB := EndColor.b - SB;
+
+ for i := 0 to 255 do
+ begin
+ FBC[ i ] := SDL_MapRGB( DstSurface.format, YR, YG, YB );
+ YR := SR + round( DR / 255 * i );
+ YG := SG + round( DG / 255 * i );
+ YB := SB + round( DB / 255 * i );
+ end;
+
+ // if aStyle = 1 then begin
+ TempStepH := Rect.w / 255;
+ TempStepV := Rect.h / 255;
+ TempHeight := Trunc( TempStepV + 1 );
+ TempWidth := Trunc( TempStepH + 1 );
+ TempTop := 0;
+ TempLeft := 0;
+ TempRect.x := Rect.x;
+ TempRect.y := Rect.y;
+ TempRect.h := Rect.h;
+ TempRect.w := Rect.w;
+
+ case Style of
+ gsHorizontal :
+ begin
+ TempRect.h := TempHeight;
+ for i := 0 to 255 do
+ begin
+ TempRect.y := Rect.y + TempTop;
+ SDL_FillRect( DstSurface, @TempRect, FBC[ i ] );
+ TempTop := Trunc( TempStepV * i );
+ end;
+ end;
+ gsVertical :
+ begin
+ TempRect.w := TempWidth;
+ for i := 0 to 255 do
+ begin
+ TempRect.x := Rect.x + TempLeft;
+ SDL_FillRect( DstSurface, @TempRect, FBC[ i ] );
+ TempLeft := Trunc( TempStepH * i );
+ end;
+ end;
+ end;
+end;
+
+procedure SDL_2xBlit( Src, Dest : PSDL_Surface );
+var
+ ReadAddr, WriteAddr, ReadRow, WriteRow : UInt32;
+ SrcPitch, DestPitch, x, y, w, h : UInt32;
+begin
+ if ( Src = nil ) or ( Dest = nil ) then
+ exit;
+ if ( Src.w shl 1 ) < Dest.w then
+ exit;
+ if ( Src.h shl 1 ) < Dest.h then
+ exit;
+
+ if SDL_MustLock( Src ) then
+ SDL_LockSurface( Src );
+ if SDL_MustLock( Dest ) then
+ SDL_LockSurface( Dest );
+
+ ReadRow := UInt32( Src.Pixels );
+ WriteRow := UInt32( Dest.Pixels );
+
+ SrcPitch := Src.pitch;
+ DestPitch := Dest.pitch;
+
+ w := Src.w;
+ h := Src.h;
+
+ case Src.format.BytesPerPixel of
+ 1 :
+ asm
+ push ebx
+ mov eax, h // for y := 1 to Src.h do
+ mov y, eax
+ @LoopY:
+ mov eax, ReadRow // ReadAddr := ReadRow;
+ mov ReadAddr, eax
+
+ mov eax, WriteRow // WriteAddr := WriteRow;
+ mov WriteAddr, eax
+
+ mov eax, w // for x := 1 to Src.w do
+ mov x, eax
+
+ mov ecx, ReadAddr
+ mov edx, WriteAddr
+ mov ebx, DestPitch
+
+ @LoopX:
+ mov al, [ecx] // PUInt8(WriteAddr)^ := PUInt8(ReadAddr)^;
+ mov [edx], al
+ mov [edx + 1], al // PUInt8(WriteAddr + 1)^ := PUInt8(ReadAddr)^;
+ mov [edx + ebx], al // PUInt8(WriteAddr + DestPitch)^ := PUInt8(ReadAddr)^;
+ mov [edx + ebx + 1], al // PUInt8(WriteAddr + DestPitch + 1)^ := PUInt8(ReadAddr)^;
+
+ inc ecx // inc(ReadAddr);
+ add edx, 2 // inc(WriteAddr, 2);
+
+ dec x
+ jnz @LoopX
+
+ mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
+ add ReadRow, eax
+
+ mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
+ add WriteRow, eax
+ add WriteRow, eax
+
+ dec y
+ jnz @LoopY
+ pop ebx
+ end;
+ 2 :
+ asm
+ push ebx
+ mov eax, h // for y := 1 to Src.h do
+ mov y, eax
+ @LoopY:
+ mov eax, ReadRow // ReadAddr := ReadRow;
+ mov ReadAddr, eax
+
+ mov eax, WriteRow // WriteAddr := WriteRow;
+ mov WriteAddr, eax
+
+ mov eax, w // for x := 1 to Src.w do
+ mov x, eax
+
+ mov ecx, ReadAddr
+ mov edx, WriteAddr
+ mov ebx, DestPitch
+
+ @LoopX:
+ mov ax, [ecx] // PUInt16(WriteAddr)^ := PUInt16(ReadAddr)^;
+ mov [edx], ax
+ mov [edx + 2], ax // PUInt16(WriteAddr + 2)^ := PUInt16(ReadAddr)^;
+ mov [edx + ebx], ax // PUInt16(WriteAddr + DestPitch)^ := PUInt16(ReadAddr)^;
+ mov [edx + ebx + 2], ax // PUInt16(WriteAddr + DestPitch + 2)^ := PUInt16(ReadAddr)^;
+
+ add ecx, 2 // inc(ReadAddr, 2);
+ add edx, 4 // inc(WriteAddr, 4);
+
+ dec x
+ jnz @LoopX
+
+ mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
+ add ReadRow, eax
+
+ mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
+ add WriteRow, eax
+ add WriteRow, eax
+
+ dec y
+ jnz @LoopY
+ pop ebx
+ end;
+ 3 :
+ asm
+ push ebx
+ mov eax, h // for y := 1 to Src.h do
+ mov y, eax
+ @LoopY:
+ mov eax, ReadRow // ReadAddr := ReadRow;
+ mov ReadAddr, eax
+
+ mov eax, WriteRow // WriteAddr := WriteRow;
+ mov WriteAddr, eax
+
+ mov eax, w // for x := 1 to Src.w do
+ mov x, eax
+
+ mov ecx, ReadAddr
+ mov edx, WriteAddr
+ mov ebx, DestPitch
+
+ @LoopX:
+ mov eax, [ecx] // (PUInt32(WriteAddr)^ and $ff000000) or (PUInt32(ReadAddr)^ and $00ffffff);
+ and eax, $00ffffff
+ and dword ptr [edx], $ff000000
+ or [edx], eax
+ and dword ptr [edx + 3], $00ffffff // (PUInt32(WriteAddr + 3)^ and $ff000000) or (PUInt32(ReadAddr)^ and $00ffffff);
+ or [edx + 3], eax
+ and dword ptr [edx + ebx], $00ffffff // (PUInt32(WriteAddr + DestPitch)^ and $ff000000) or (PUInt32(ReadAddr)^ and $00ffffff);
+ or [edx + ebx], eax
+ and dword ptr [edx + ebx + 3], $00ffffff // (PUInt32(WriteAddr + DestPitch + 3)^ and $ff000000) or (PUInt32(ReadAddr)^ and $00ffffff);
+ or [edx + ebx + 3], eax
+
+ add ecx, 3 // inc(ReadAddr, 3);
+ add edx, 6 // inc(WriteAddr, 6);
+
+ dec x
+ jnz @LoopX
+
+ mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
+ add ReadRow, eax
+
+ mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
+ add WriteRow, eax
+ add WriteRow, eax
+
+ dec y
+ jnz @LoopY
+ pop ebx
+ end;
+ 4 :
+ asm
+ push ebx
+ mov eax, h // for y := 1 to Src.h do
+ mov y, eax
+ @LoopY:
+ mov eax, ReadRow // ReadAddr := ReadRow;
+ mov ReadAddr, eax
+
+ mov eax, WriteRow // WriteAddr := WriteRow;
+ mov WriteAddr, eax
+
+ mov eax, w // for x := 1 to Src.w do
+ mov x, eax
+
+ mov ecx, ReadAddr
+ mov edx, WriteAddr
+ mov ebx, DestPitch
+
+ @LoopX:
+ mov eax, [ecx] // PUInt32(WriteAddr)^ := PUInt32(ReadAddr)^;
+ mov [edx], eax
+ mov [edx + 4], eax // PUInt32(WriteAddr + 4)^ := PUInt32(ReadAddr)^;
+ mov [edx + ebx], eax // PUInt32(WriteAddr + DestPitch)^ := PUInt32(ReadAddr)^;
+ mov [edx + ebx + 4], eax // PUInt32(WriteAddr + DestPitch + 4)^ := PUInt32(ReadAddr)^;
+
+ add ecx, 4 // inc(ReadAddr, 4);
+ add edx, 8 // inc(WriteAddr, 8);
+
+ dec x
+ jnz @LoopX
+
+ mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
+ add ReadRow, eax
+
+ mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
+ add WriteRow, eax
+ add WriteRow, eax
+
+ dec y
+ jnz @LoopY
+ pop ebx
+ end;
+ end;
+
+ if SDL_MustLock( Src ) then
+ SDL_UnlockSurface( Src );
+ if SDL_MustLock( Dest ) then
+ SDL_UnlockSurface( Dest );
+end;
+
+procedure SDL_Scanline2xBlit( Src, Dest : PSDL_Surface );
+var
+ ReadAddr, WriteAddr, ReadRow, WriteRow : UInt32;
+ SrcPitch, DestPitch, x, y, w, h : UInt32;
+begin
+ if ( Src = nil ) or ( Dest = nil ) then
+ exit;
+ if ( Src.w shl 1 ) < Dest.w then
+ exit;
+ if ( Src.h shl 1 ) < Dest.h then
+ exit;
+
+ if SDL_MustLock( Src ) then
+ SDL_LockSurface( Src );
+ if SDL_MustLock( Dest ) then
+ SDL_LockSurface( Dest );
+
+ ReadRow := UInt32( Src.Pixels );
+ WriteRow := UInt32( Dest.Pixels );
+
+ SrcPitch := Src.pitch;
+ DestPitch := Dest.pitch;
+
+ w := Src.w;
+ h := Src.h;
+
+ case Src.format.BytesPerPixel of
+ 1 :
+ asm
+ push ebx
+ mov eax, h // for y := 1 to Src.h do
+ mov y, eax
+ @LoopY:
+ mov eax, ReadRow // ReadAddr := ReadRow;
+ mov ReadAddr, eax
+
+ mov eax, WriteRow // WriteAddr := WriteRow;
+ mov WriteAddr, eax
+
+ mov eax, w // for x := 1 to Src.w do
+ mov x, eax
+
+ mov ecx, ReadAddr
+ mov edx, WriteAddr
+
+ @LoopX:
+ mov al, [ecx] // PUInt8(WriteAddr)^ := PUInt8(ReadAddr)^;
+ mov [edx], al
+ mov [edx + 1], al // PUInt8(WriteAddr + 1)^ := PUInt8(ReadAddr)^;
+
+ inc ecx // inc(ReadAddr);
+ add edx, 2 // inc(WriteAddr, 2);
+
+ dec x
+ jnz @LoopX
+
+ mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
+ add ReadRow, eax
+
+ mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
+ add WriteRow, eax
+ add WriteRow, eax
+
+ dec y
+ jnz @LoopY
+ pop ebx
+ end;
+ 2 :
+ asm
+ push ebx
+ mov eax, h // for y := 1 to Src.h do
+ mov y, eax
+ @LoopY:
+ mov eax, ReadRow // ReadAddr := ReadRow;
+ mov ReadAddr, eax
+
+ mov eax, WriteRow // WriteAddr := WriteRow;
+ mov WriteAddr, eax
+
+ mov eax, w // for x := 1 to Src.w do
+ mov x, eax
+
+ mov ecx, ReadAddr
+ mov edx, WriteAddr
+
+ @LoopX:
+ mov ax, [ecx] // PUInt16(WriteAddr)^ := PUInt16(ReadAddr)^;
+ mov [edx], ax
+ mov [edx + 2], eax // PUInt16(WriteAddr + 2)^ := PUInt16(ReadAddr)^;
+
+ add ecx, 2 // inc(ReadAddr, 2);
+ add edx, 4 // inc(WriteAddr, 4);
+
+ dec x
+ jnz @LoopX
+
+ mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
+ add ReadRow, eax
+
+ mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
+ add WriteRow, eax
+ add WriteRow, eax
+
+ dec y
+ jnz @LoopY
+ pop ebx
+ end;
+ 3 :
+ asm
+ push ebx
+ mov eax, h // for y := 1 to Src.h do
+ mov y, eax
+ @LoopY:
+ mov eax, ReadRow // ReadAddr := ReadRow;
+ mov ReadAddr, eax
+
+ mov eax, WriteRow // WriteAddr := WriteRow;
+ mov WriteAddr, eax
+
+ mov eax, w // for x := 1 to Src.w do
+ mov x, eax
+
+ mov ecx, ReadAddr
+ mov edx, WriteAddr
+
+ @LoopX:
+ mov eax, [ecx] // (PUInt32(WriteAddr)^ and $ff000000) or (PUInt32(ReadAddr)^ and $00ffffff);
+ and eax, $00ffffff
+ and dword ptr [edx], $ff000000
+ or [edx], eax
+ and dword ptr [edx + 3], $00ffffff // (PUInt32(WriteAddr + 3)^ and $ff000000) or (PUInt32(ReadAddr)^ and $00ffffff);
+ or [edx + 3], eax
+
+ add ecx, 3 // inc(ReadAddr, 3);
+ add edx, 6 // inc(WriteAddr, 6);
+
+ dec x
+ jnz @LoopX
+
+ mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
+ add ReadRow, eax
+
+ mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
+ add WriteRow, eax
+ add WriteRow, eax
+
+ dec y
+ jnz @LoopY
+ pop ebx
+ end;
+ 4 :
+ asm
+ push ebx
+ mov eax, h // for y := 1 to Src.h do
+ mov y, eax
+ @LoopY:
+ mov eax, ReadRow // ReadAddr := ReadRow;
+ mov ReadAddr, eax
+
+ mov eax, WriteRow // WriteAddr := WriteRow;
+ mov WriteAddr, eax
+
+ mov eax, w // for x := 1 to Src.w do
+ mov x, eax
+
+ mov ecx, ReadAddr
+ mov edx, WriteAddr
+
+ @LoopX:
+ mov eax, [ecx] // PUInt32(WriteAddr)^ := PUInt32(ReadAddr)^;
+ mov [edx], eax
+ mov [edx + 4], eax // PUInt32(WriteAddr + 4)^ := PUInt32(ReadAddr)^;
+
+ add ecx, 4 // inc(ReadAddr, 4);
+ add edx, 8 // inc(WriteAddr, 8);
+
+ dec x
+ jnz @LoopX
+
+ mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
+ add ReadRow, eax
+
+ mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
+ add WriteRow, eax
+ add WriteRow, eax
+
+ dec y
+ jnz @LoopY
+ pop ebx
+ end;
+ end;
+
+ if SDL_MustLock( Src ) then
+ SDL_UnlockSurface( Src );
+ if SDL_MustLock( Dest ) then
+ SDL_UnlockSurface( Dest );
+end;
+
+procedure SDL_50Scanline2xBlit( Src, Dest : PSDL_Surface );
+var
+ ReadAddr, WriteAddr, ReadRow, WriteRow : UInt32;
+ SrcPitch, DestPitch, x, y, w, h : UInt32;
+begin
+ if ( Src = nil ) or ( Dest = nil ) then
+ exit;
+ if ( Src.w shl 1 ) < Dest.w then
+ exit;
+ if ( Src.h shl 1 ) < Dest.h then
+ exit;
+
+ if SDL_MustLock( Src ) then
+ SDL_LockSurface( Src );
+ if SDL_MustLock( Dest ) then
+ SDL_LockSurface( Dest );
+
+ ReadRow := UInt32( Src.Pixels );
+ WriteRow := UInt32( Dest.Pixels );
+
+ SrcPitch := Src.pitch;
+ DestPitch := Dest.pitch;
+
+ w := Src.w;
+ h := Src.h;
+
+ case Src.format.BitsPerPixel of
+ 8 :
+ asm
+ push ebx
+ mov eax, h // for y := 1 to Src.h do
+ mov y, eax
+ @LoopY:
+ mov eax, ReadRow // ReadAddr := ReadRow;
+ mov ReadAddr, eax
+
+ mov eax, WriteRow // WriteAddr := WriteRow;
+ mov WriteAddr, eax
+
+ mov eax, w // for x := 1 to Src.w do
+ mov x, eax
+
+ mov ecx, ReadAddr
+ mov edx, WriteAddr
+ mov ebx, DestPitch
+
+ @LoopX:
+ mov al, [ecx] // PUInt8(WriteAddr)^ := PUInt8(ReadAddr)^;
+ mov [edx], al
+ mov [edx + 1], al // PUInt8(WriteAddr + 1)^ := PUInt8(ReadAddr)^;
+ shr al, 1
+ and al, $6d
+ mov [edx + ebx], al // PUInt8(WriteAddr + DestPitch)^ := PUInt8(ReadAddr)^;
+ mov [edx + ebx + 1], al // PUInt8(WriteAddr + DestPitch + 1)^ := PUInt8(ReadAddr)^;
+
+ inc ecx // inc(ReadAddr);
+ add edx, 2 // inc(WriteAddr, 2);
+
+ dec x
+ jnz @LoopX
+
+ mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
+ add ReadRow, eax
+
+ mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
+ add WriteRow, eax
+ add WriteRow, eax
+
+ dec y
+ jnz @LoopY
+ pop ebx
+ end;
+ 15 :
+ asm
+ push ebx
+ mov eax, h // for y := 1 to Src.h do
+ mov y, eax
+ @LoopY:
+ mov eax, ReadRow // ReadAddr := ReadRow;
+ mov ReadAddr, eax
+
+ mov eax, WriteRow // WriteAddr := WriteRow;
+ mov WriteAddr, eax
+
+ mov eax, w // for x := 1 to Src.w do
+ mov x, eax
+
+ mov ecx, ReadAddr
+ mov edx, WriteAddr
+ mov ebx, DestPitch
+
+ @LoopX:
+ mov ax, [ecx] // PUInt16(WriteAddr)^ := PUInt16(ReadAddr)^;
+ mov [edx], ax
+ mov [edx + 2], ax // PUInt16(WriteAddr + 2)^ := PUInt16(ReadAddr)^;
+ shr ax, 1
+ and ax, $3def
+ mov [edx + ebx], ax // PUInt16(WriteAddr + DestPitch)^ := PUInt16(ReadAddr)^;
+ mov [edx + ebx + 2], ax // PUInt16(WriteAddr + DestPitch + 2)^ := PUInt16(ReadAddr)^;
+
+ add ecx, 2 // inc(ReadAddr, 2);
+ add edx, 4 // inc(WriteAddr, 4);
+
+ dec x
+ jnz @LoopX
+
+ mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
+ add ReadRow, eax
+
+ mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
+ add WriteRow, eax
+ add WriteRow, eax
+
+ dec y
+ jnz @LoopY
+ pop ebx
+ end;
+ 16 :
+ asm
+ push ebx
+ mov eax, h // for y := 1 to Src.h do
+ mov y, eax
+ @LoopY:
+ mov eax, ReadRow // ReadAddr := ReadRow;
+ mov ReadAddr, eax
+
+ mov eax, WriteRow // WriteAddr := WriteRow;
+ mov WriteAddr, eax
+
+ mov eax, w // for x := 1 to Src.w do
+ mov x, eax
+
+ mov ecx, ReadAddr
+ mov edx, WriteAddr
+ mov ebx, DestPitch
+
+ @LoopX:
+ mov ax, [ecx] // PUInt16(WriteAddr)^ := PUInt16(ReadAddr)^;
+ mov [edx], ax
+ mov [edx + 2], ax // PUInt16(WriteAddr + 2)^ := PUInt16(ReadAddr)^;
+ shr ax, 1
+ and ax, $7bef
+ mov [edx + ebx], ax // PUInt16(WriteAddr + DestPitch)^ := PUInt16(ReadAddr)^;
+ mov [edx + ebx + 2], ax // PUInt16(WriteAddr + DestPitch + 2)^ := PUInt16(ReadAddr)^;
+
+ add ecx, 2 // inc(ReadAddr, 2);
+ add edx, 4 // inc(WriteAddr, 4);
+
+ dec x
+ jnz @LoopX
+
+ mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
+ add ReadRow, eax
+
+ mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
+ add WriteRow, eax
+ add WriteRow, eax
+
+ dec y
+ jnz @LoopY
+ pop ebx
+ end;
+ 24 :
+ asm
+ push ebx
+ mov eax, h // for y := 1 to Src.h do
+ mov y, eax
+ @LoopY:
+ mov eax, ReadRow // ReadAddr := ReadRow;
+ mov ReadAddr, eax
+
+ mov eax, WriteRow // WriteAddr := WriteRow;
+ mov WriteAddr, eax
+
+ mov eax, w // for x := 1 to Src.w do
+ mov x, eax
+
+ mov ecx, ReadAddr
+ mov edx, WriteAddr
+ mov ebx, DestPitch
+
+ @LoopX:
+ mov eax, [ecx] // (PUInt32(WriteAddr)^ and $ff000000) or (PUInt32(ReadAddr)^ and $00ffffff);
+ and eax, $00ffffff
+ and dword ptr [edx], $ff000000
+ or [edx], eax
+ and dword ptr [edx + 3], $00ffffff // (PUInt32(WriteAddr + 3)^ and $ff000000) or (PUInt32(ReadAddr)^ and $00ffffff);
+ or [edx + 3], eax
+ shr eax, 1
+ and eax, $007f7f7f
+ and dword ptr [edx + ebx], $00ffffff // (PUInt32(WriteAddr + DestPitch)^ and $ff000000) or (PUInt32(ReadAddr)^ and $00ffffff);
+ or [edx + ebx], eax
+ and dword ptr [edx + ebx + 3], $00ffffff // (PUInt32(WriteAddr + DestPitch + 3)^ and $ff000000) or (PUInt32(ReadAddr)^ and $00ffffff);
+ or [edx + ebx + 3], eax
+
+ add ecx, 3 // inc(ReadAddr, 3);
+ add edx, 6 // inc(WriteAddr, 6);
+
+ dec x
+ jnz @LoopX
+
+ mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
+ add ReadRow, eax
+
+ mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
+ add WriteRow, eax
+ add WriteRow, eax
+
+ dec y
+ jnz @LoopY
+ pop ebx
+ end;
+ 32 :
+ asm
+ push ebx
+ mov eax, h // for y := 1 to Src.h do
+ mov y, eax
+ @LoopY:
+ mov eax, ReadRow // ReadAddr := ReadRow;
+ mov ReadAddr, eax
+
+ mov eax, WriteRow // WriteAddr := WriteRow;
+ mov WriteAddr, eax
+
+ mov eax, w // for x := 1 to Src.w do
+ mov x, eax
+
+ mov ecx, ReadAddr
+ mov edx, WriteAddr
+ mov ebx, DestPitch
+
+ @LoopX:
+ mov eax, [ecx] // PUInt32(WriteAddr)^ := PUInt32(ReadAddr)^;
+ mov [edx], eax
+ mov [edx + 4], eax // PUInt32(WriteAddr + 4)^ := PUInt32(ReadAddr)^;
+ shr eax, 1
+ and eax, $7f7f7f7f
+ mov [edx + ebx], eax // PUInt32(WriteAddr + DestPitch)^ := PUInt32(ReadAddr)^;
+ mov [edx + ebx + 4], eax // PUInt32(WriteAddr + DestPitch + 4)^ := PUInt32(ReadAddr)^;
+
+ add ecx, 4 // inc(ReadAddr, 4);
+ add edx, 8 // inc(WriteAddr, 8);
+
+ dec x
+ jnz @LoopX
+
+ mov eax, SrcPitch // inc(UInt32(ReadRow), SrcPitch);
+ add ReadRow, eax
+
+ mov eax, DestPitch // inc(UInt32(WriteRow), DestPitch * 2);
+ add WriteRow, eax
+ add WriteRow, eax
+
+ dec y
+ jnz @LoopY
+ pop ebx
+ end;
+ end;
+
+ if SDL_MustLock( Src ) then
+ SDL_UnlockSurface( Src );
+ if SDL_MustLock( Dest ) then
+ SDL_UnlockSurface( Dest );
+end;
+
+function SDL_PixelTestSurfaceVsRect( SrcSurface1 : PSDL_Surface; SrcRect1 : PSDL_Rect; SrcRect2 : PSDL_Rect; Left1, Top1, Left2, Top2 : integer ) :
+boolean;
+var
+ Src_Rect1, Src_Rect2 : TSDL_Rect;
+ right1, bottom1 : integer;
+ right2, bottom2 : integer;
+ Scan1Start, Scan2Start, ScanWidth, ScanHeight : cardinal;
+ Mod1: cardinal;
+ Addr1 : cardinal;
+ BPP : cardinal;
+ Pitch1 : cardinal;
+ TransparentColor1 : cardinal;
+ tx, ty : cardinal;
+ StartTick : cardinal;
+ Color1 : cardinal;
+begin
+ Result := false;
+ if SrcRect1 = nil then
+ begin
+ with Src_Rect1 do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface1.w;
+ h := SrcSurface1.h;
+ end;
+ end
+ else
+ Src_Rect1 := SrcRect1^;
+
+ Src_Rect2 := SrcRect2^;
+ with Src_Rect1 do
+ begin
+ Right1 := Left1 + w;
+ Bottom1 := Top1 + h;
+ end;
+ with Src_Rect2 do
+ begin
+ Right2 := Left2 + w;
+ Bottom2 := Top2 + h;
+ end;
+ if ( Left1 >= Right2 ) or ( Right1 <= Left2 ) or ( Top1 >= Bottom2 ) or (
+Bottom1 <=
+ Top2 ) then
+ exit;
+ if Left1 <= Left2 then
+ begin
+ // 1. left, 2. right
+ Scan1Start := Src_Rect1.x + Left2 - Left1;
+ Scan2Start := Src_Rect2.x;
+ ScanWidth := Right1 - Left2;
+ with Src_Rect2 do
+ if ScanWidth > w then
+ ScanWidth := w;
+ end
+ else
+ begin
+ // 1. right, 2. left
+ Scan1Start := Src_Rect1.x;
+ Scan2Start := Src_Rect2.x + Left1 - Left2;
+ ScanWidth := Right2 - Left1;
+ with Src_Rect1 do
+ if ScanWidth > w then
+ ScanWidth := w;
+ end;
+ with SrcSurface1^ do
+ begin
+ Pitch1 := Pitch;
+ Addr1 := cardinal( Pixels );
+ inc( Addr1, Pitch1 * UInt32( Src_Rect1.y ) );
+ with format^ do
+ begin
+ BPP := BytesPerPixel;
+ TransparentColor1 := colorkey;
+ end;
+ end;
+
+ Mod1 := Pitch1 - ( ScanWidth * BPP );
+
+ inc( Addr1, BPP * Scan1Start );
+
+ if Top1 <= Top2 then
+ begin
+ // 1. up, 2. down
+ ScanHeight := Bottom1 - Top2;
+ if ScanHeight > Src_Rect2.h then
+ ScanHeight := Src_Rect2.h;
+ inc( Addr1, Pitch1 * UInt32( Top2 - Top1 ) );
+ end
+ else
+ begin
+ // 1. down, 2. up
+ ScanHeight := Bottom2 - Top1;
+ if ScanHeight > Src_Rect1.h then
+ ScanHeight := Src_Rect1.h;
+
+ end;
+ case BPP of
+ 1 :
+ for ty := 1 to ScanHeight do
+ begin
+ for tx := 1 to ScanWidth do
+ begin
+ if ( PByte( Addr1 )^ <> TransparentColor1 ) then
+ begin
+ Result := true;
+ exit;
+ end;
+ inc( Addr1 );
+
+ end;
+ inc( Addr1, Mod1 );
+
+ end;
+ 2 :
+ for ty := 1 to ScanHeight do
+ begin
+ for tx := 1 to ScanWidth do
+ begin
+ if ( PWord( Addr1 )^ <> TransparentColor1 ) then
+ begin
+ Result := true;
+ exit;
+ end;
+ inc( Addr1, 2 );
+
+ end;
+ inc( Addr1, Mod1 );
+
+ end;
+ 3 :
+ for ty := 1 to ScanHeight do
+ begin
+ for tx := 1 to ScanWidth do
+ begin
+ Color1 := PLongWord( Addr1 )^ and $00FFFFFF;
+
+ if ( Color1 <> TransparentColor1 )
+ then
+ begin
+ Result := true;
+ exit;
+ end;
+ inc( Addr1, 3 );
+
+ end;
+ inc( Addr1, Mod1 );
+
+ end;
+ 4 :
+ for ty := 1 to ScanHeight do
+ begin
+ for tx := 1 to ScanWidth do
+ begin
+ if ( PLongWord( Addr1 )^ <> TransparentColor1 ) then
+ begin
+ Result := true;
+ exit;
+ end;
+ inc( Addr1, 4 );
+
+ end;
+ inc( Addr1, Mod1 );
+
+ end;
+ end;
+end;
+
+procedure SDL_ORSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
+var
+ Src, Dest : TSDL_Rect;
+ Diff : integer;
+ SrcAddr, DestAddr, TransparentColor : cardinal;
+ // TransparentColor: cardinal;
+ _ebx, _esi, _edi, _esp : cardinal;
+ WorkX, WorkY : word;
+ SrcMod, DestMod : cardinal;
+ Bits : cardinal;
+begin
+ if ( SrcSurface = nil ) or ( DestSurface = nil ) then
+ exit; // Remove this to make it faster
+ if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
+ exit; // Remove this to make it faster
+ if SrcRect = nil then
+ begin
+ with Src do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface.w;
+ h := SrcSurface.h;
+ end;
+ end
+ else
+ Src := SrcRect^;
+ if DestRect = nil then
+ begin
+ Dest.x := 0;
+ Dest.y := 0;
+ end
+ else
+ Dest := DestRect^;
+ Dest.w := Src.w;
+ Dest.h := Src.h;
+ with DestSurface.Clip_Rect do
+ begin
+ // Source's right side is greater than the dest.cliprect
+ if Dest.x + Src.w > x + w then
+ begin
+ smallint( Src.w ) := x + w - Dest.x;
+ smallint( Dest.w ) := x + w - Dest.x;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's bottom side is greater than the dest.clip
+ if Dest.y + Src.h > y + h then
+ begin
+ smallint( Src.h ) := y + h - Dest.y;
+ smallint( Dest.h ) := y + h - Dest.y;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ // Source's left side is less than the dest.clip
+ if Dest.x < x then
+ begin
+ Diff := x - Dest.x;
+ Src.x := Src.x + Diff;
+ smallint( Src.w ) := smallint( Src.w ) - Diff;
+ Dest.x := x;
+ smallint( Dest.w ) := smallint( Dest.w ) - Diff;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's Top side is less than the dest.clip
+ if Dest.y < y then
+ begin
+ Diff := y - Dest.y;
+ Src.y := Src.y + Diff;
+ smallint( Src.h ) := smallint( Src.h ) - Diff;
+ Dest.y := y;
+ smallint( Dest.h ) := smallint( Dest.h ) - Diff;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ end;
+ with SrcSurface^ do
+ begin
+ SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
+ Format.BytesPerPixel;
+ SrcMod := Pitch - Src.w * Format.BytesPerPixel;
+ TransparentColor := Format.colorkey;
+ end;
+ with DestSurface^ do
+ begin
+ DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
+ Format.BytesPerPixel;
+ DestMod := Pitch - Dest.w * Format.BytesPerPixel;
+ Bits := Format.BitsPerPixel;
+ end;
+ SDL_LockSurface( SrcSurface );
+ SDL_LockSurface( DestSurface );
+ WorkY := Src.h;
+ case bits of
+ 8 :
+ asm
+ mov _ebx, ebx
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ @Loopx:
+ mov al, [esi] // AL := source color
+ cmp al, 0
+ je @SkipColor // if AL=0 or AL=transparent color then skip everything
+ cmp al, byte ptr TransparentColor
+ je @SkipColor
+ or al, [edi]
+ mov [edi], al
+ @SkipColor:
+ inc esi
+ inc edi
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx,_ebx
+ end;
+ 15 :
+ asm
+ mov _ebx, ebx
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ @Loopx:
+ mov ax, [esi] // AX := source color
+ cmp ax, 0
+ je @SkipColor // if AX=0 then skip everything
+ cmp ax, word ptr TransparentColor
+ je @SkipColor
+ or ax, [edi]
+ mov [edi], ax
+ @SkipColor:
+ add esi, 2
+ add edi, 2
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx,_ebx
+ end;
+ 16 :
+ asm
+ mov _ebx, ebx
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ @Loopx:
+ mov ax, [esi] // AX := source color
+ cmp ax, 0
+ je @SkipColor // if AX=0 then skip everything
+ cmp ax, word ptr TransparentColor
+ je @SkipColor
+ or ax, [edi]
+ mov [edi], ax
+ @SkipColor:
+ add esi, 2
+ add edi, 2
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx,_ebx
+ end;
+ 24 :
+ asm
+ mov _ebx, ebx
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ add WorkX, ax // WorkX := Src.w * 2
+ add WorkX, ax // WorkX := Src.w * 3
+ @Loopx:
+ mov al, [esi] // AL := source color
+ or al, [edi]
+ mov [edi], al
+ inc esi
+ inc edi
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx,_ebx
+ end;
+ 32 :
+ asm
+ mov _ebx, ebx
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ shl ax, 2
+ mov WorkX, ax // WorkX := Src.w * 4
+ @Loopx:
+ mov al, [esi] // AL := source color
+ or al, [edi]
+ mov [edi], al
+ inc esi
+ inc edi
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx,_ebx
+ end;
+ end;
+ SDL_UnlockSurface( SrcSurface );
+ SDL_UnlockSurface( DestSurface );
+end;
+
+procedure SDL_ANDSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
+var
+ Src, Dest : TSDL_Rect;
+ Diff : integer;
+ SrcAddr, DestAddr, TransparentColor : cardinal;
+ // TransparentColor: cardinal;
+ _ebx, _esi, _edi, _esp : cardinal;
+ WorkX, WorkY : word;
+ SrcMod, DestMod : cardinal;
+ Bits : cardinal;
+begin
+ if ( SrcSurface = nil ) or ( DestSurface = nil ) then
+ exit; // Remove this to make it faster
+ if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
+ exit; // Remove this to make it faster
+ if SrcRect = nil then
+ begin
+ with Src do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface.w;
+ h := SrcSurface.h;
+ end;
+ end
+ else
+ Src := SrcRect^;
+ if DestRect = nil then
+ begin
+ Dest.x := 0;
+ Dest.y := 0;
+ end
+ else
+ Dest := DestRect^;
+ Dest.w := Src.w;
+ Dest.h := Src.h;
+ with DestSurface.Clip_Rect do
+ begin
+ // Source's right side is greater than the dest.cliprect
+ if Dest.x + Src.w > x + w then
+ begin
+ smallint( Src.w ) := x + w - Dest.x;
+ smallint( Dest.w ) := x + w - Dest.x;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's bottom side is greater than the dest.clip
+ if Dest.y + Src.h > y + h then
+ begin
+ smallint( Src.h ) := y + h - Dest.y;
+ smallint( Dest.h ) := y + h - Dest.y;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ // Source's left side is less than the dest.clip
+ if Dest.x < x then
+ begin
+ Diff := x - Dest.x;
+ Src.x := Src.x + Diff;
+ smallint( Src.w ) := smallint( Src.w ) - Diff;
+ Dest.x := x;
+ smallint( Dest.w ) := smallint( Dest.w ) - Diff;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's Top side is less than the dest.clip
+ if Dest.y < y then
+ begin
+ Diff := y - Dest.y;
+ Src.y := Src.y + Diff;
+ smallint( Src.h ) := smallint( Src.h ) - Diff;
+ Dest.y := y;
+ smallint( Dest.h ) := smallint( Dest.h ) - Diff;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ end;
+ with SrcSurface^ do
+ begin
+ SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
+ Format.BytesPerPixel;
+ SrcMod := Pitch - Src.w * Format.BytesPerPixel;
+ TransparentColor := Format.colorkey;
+ end;
+ with DestSurface^ do
+ begin
+ DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
+ Format.BytesPerPixel;
+ DestMod := Pitch - Dest.w * Format.BytesPerPixel;
+ Bits := Format.BitsPerPixel;
+ end;
+ SDL_LockSurface( SrcSurface );
+ SDL_LockSurface( DestSurface );
+ WorkY := Src.h;
+ case bits of
+ 8 :
+ asm
+ mov _ebx, ebx
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ @Loopx:
+ mov al, [esi] // AL := source color
+ cmp al, 0
+ je @SkipColor // if AL=0 or AL=transparent color then skip everything
+ cmp al, byte ptr TransparentColor
+ je @SkipColor
+ and al, [edi]
+ mov [edi], al
+ @SkipColor:
+ inc esi
+ inc edi
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx,_ebx
+ end;
+ 15 :
+ asm
+ mov _ebx, ebx
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ @Loopx:
+ mov ax, [esi] // AX := source color
+ cmp ax, 0
+ je @SkipColor // if AX=0 then skip everything
+ cmp ax, word ptr TransparentColor
+ je @SkipColor
+ and ax, [edi]
+ mov [edi], ax
+ @SkipColor:
+ add esi, 2
+ add edi, 2
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx,_ebx
+ end;
+ 16 :
+ asm
+ mov _ebx, ebx
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ @Loopx:
+ mov ax, [esi] // AX := source color
+ cmp ax, 0
+ je @SkipColor // if AX=0 then skip everything
+ cmp ax, word ptr TransparentColor
+ je @SkipColor
+ and ax, [edi]
+ mov [edi], ax
+ @SkipColor:
+ add esi, 2
+ add edi, 2
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx,_ebx
+ end;
+ 24 :
+ asm
+ mov _ebx, ebx
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ mov WorkX, ax // WorkX := Src.w
+ add WorkX, ax // WorkX := Src.w * 2
+ add WorkX, ax // WorkX := Src.w * 3
+ @Loopx:
+ mov al, [esi] // AL := source color
+ and al, [edi]
+ mov [edi], al
+ inc esi
+ inc edi
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx,_ebx
+ end;
+ 32 :
+ asm
+ mov _ebx, ebx
+ mov _esi, esi
+ mov _edi, edi
+ mov _esp, esp
+ mov esi, SrcAddr // ESI - Source Offset
+ mov edi, DestAddr // EDI - Destination Offset
+ mov ax, Src.h // WorkY := Src.h
+ mov WorkY, ax
+ @LoopY:
+ mov ax, Src.w
+ shl ax, 2
+ mov WorkX, ax // WorkX := Src.w * 4
+ @Loopx:
+ mov al, [esi] // AL := source color
+ and al, [edi]
+ mov [edi], al
+ inc esi
+ inc edi
+ dec WorkX
+ jnz @LoopX
+ add esi, SrcMod
+ add edi, DestMod
+ dec WorkY
+ jnz @LoopY
+ mov esp,_esp
+ mov edi,_edi
+ mov esi,_esi
+ mov ebx,_ebx
+ end;
+ end;
+ SDL_UnlockSurface( SrcSurface );
+ SDL_UnlockSurface( DestSurface );
+end;
+
+
+procedure SDL_GTSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
+var
+ R, G, B, Pixel1, Pixel2, TransparentColor : cardinal;
+ Src, Dest : TSDL_Rect;
+ Diff : integer;
+ SrcAddr, DestAddr : cardinal;
+ WorkX, WorkY : word;
+ SrcMod, DestMod : cardinal;
+ Bits : cardinal;
+begin
+ if ( SrcSurface = nil ) or ( DestSurface = nil ) then
+ exit; // Remove this to make it faster
+ if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
+ exit; // Remove this to make it faster
+ if SrcRect = nil then
+ begin
+ with Src do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface.w;
+ h := SrcSurface.h;
+ end;
+ end
+ else
+ Src := SrcRect^;
+ if DestRect = nil then
+ begin
+ Dest.x := 0;
+ Dest.y := 0;
+ end
+ else
+ Dest := DestRect^;
+ Dest.w := Src.w;
+ Dest.h := Src.h;
+ with DestSurface.Clip_Rect do
+ begin
+ // Source's right side is greater than the dest.cliprect
+ if Dest.x + Src.w > x + w then
+ begin
+ smallint( Src.w ) := x + w - Dest.x;
+ smallint( Dest.w ) := x + w - Dest.x;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's bottom side is greater than the dest.clip
+ if Dest.y + Src.h > y + h then
+ begin
+ smallint( Src.h ) := y + h - Dest.y;
+ smallint( Dest.h ) := y + h - Dest.y;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ // Source's left side is less than the dest.clip
+ if Dest.x < x then
+ begin
+ Diff := x - Dest.x;
+ Src.x := Src.x + Diff;
+ smallint( Src.w ) := smallint( Src.w ) - Diff;
+ Dest.x := x;
+ smallint( Dest.w ) := smallint( Dest.w ) - Diff;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's Top side is less than the dest.clip
+ if Dest.y < y then
+ begin
+ Diff := y - Dest.y;
+ Src.y := Src.y + Diff;
+ smallint( Src.h ) := smallint( Src.h ) - Diff;
+ Dest.y := y;
+ smallint( Dest.h ) := smallint( Dest.h ) - Diff;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ end;
+ with SrcSurface^ do
+ begin
+ SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
+ Format.BytesPerPixel;
+ SrcMod := Pitch - Src.w * Format.BytesPerPixel;
+ TransparentColor := Format.colorkey;
+ end;
+ with DestSurface^ do
+ begin
+ DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
+ Format.BytesPerPixel;
+ DestMod := Pitch - Dest.w * Format.BytesPerPixel;
+ Bits := Format.BitsPerPixel;
+ end;
+ SDL_LockSurface( SrcSurface );
+ SDL_LockSurface( DestSurface );
+ WorkY := Src.h;
+ case bits of
+ 8 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt8( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt8( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+ if Pixel2 and $E0 > Pixel1 and $E0 then R := Pixel2 and $E0 else R := Pixel1 and $E0;
+ if Pixel2 and $1C > Pixel1 and $1C then G := Pixel2 and $1C else G := Pixel1 and $1C;
+ if Pixel2 and $03 > Pixel1 and $03 then B := Pixel2 and $03 else B := Pixel1 and $03;
+
+ if R > $E0 then
+ R := $E0;
+ if G > $1C then
+ G := $1C;
+ if B > $03 then
+ B := $03;
+ PUInt8( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt8( DestAddr )^ := Pixel1;
+ end;
+ inc( SrcAddr );
+ inc( DestAddr );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 15 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt16( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt16( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+
+ if Pixel2 and $7C00 > Pixel1 and $7C00 then R := Pixel2 and $7C00 else R := Pixel1 and $7C00;
+ if Pixel2 and $03E0 > Pixel1 and $03E0 then G := Pixel2 and $03E0 else G := Pixel1 and $03E0;
+ if Pixel2 and $001F > Pixel1 and $001F then B := Pixel2 and $001F else B := Pixel1 and $001F;
+
+ PUInt16( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt16( DestAddr )^ := Pixel1;
+ end;
+ inc( SrcAddr, 2 );
+ inc( DestAddr, 2 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 16 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt16( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt16( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+
+ if Pixel2 and $F800 > Pixel1 and $F800 then R := Pixel2 and $F800 else R := Pixel1 and $F800;
+ if Pixel2 and $07E0 > Pixel1 and $07E0 then G := Pixel2 and $07E0 else G := Pixel1 and $07E0;
+ if Pixel2 and $001F > Pixel1 and $001F then B := Pixel2 and $001F else B := Pixel1 and $001F;
+
+ PUInt16( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt16( DestAddr )^ := Pixel1;
+ end;
+ inc( SrcAddr, 2 );
+ inc( DestAddr, 2 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 24 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt32( SrcAddr )^ and $00FFFFFF;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt32( DestAddr )^ and $00FFFFFF;
+ if Pixel2 > 0 then
+ begin
+
+ if Pixel2 and $FF0000 > Pixel1 and $FF0000 then R := Pixel2 and $FF0000 else R := Pixel1 and $FF0000;
+ if Pixel2 and $00FF00 > Pixel1 and $00FF00 then G := Pixel2 and $00FF00 else G := Pixel1 and $00FF00;
+ if Pixel2 and $0000FF > Pixel1 and $0000FF then B := Pixel2 and $0000FF else B := Pixel1 and $0000FF;
+
+ PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or ( R or G or B );
+ end
+ else
+ PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or Pixel1;
+ end;
+ inc( SrcAddr, 3 );
+ inc( DestAddr, 3 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 32 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt32( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt32( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+
+ if Pixel2 and $FF0000 > Pixel1 and $FF0000 then R := Pixel2 and $FF0000 else R := Pixel1 and $FF0000;
+ if Pixel2 and $00FF00 > Pixel1 and $00FF00 then G := Pixel2 and $00FF00 else G := Pixel1 and $00FF00;
+ if Pixel2 and $0000FF > Pixel1 and $0000FF then B := Pixel2 and $0000FF else B := Pixel1 and $0000FF;
+
+ PUInt32( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt32( DestAddr )^ := Pixel1;
+ end;
+ inc( SrcAddr, 4 );
+ inc( DestAddr, 4 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ end;
+ SDL_UnlockSurface( SrcSurface );
+ SDL_UnlockSurface( DestSurface );
+end;
+
+
+procedure SDL_LTSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
+var
+ R, G, B, Pixel1, Pixel2, TransparentColor : cardinal;
+ Src, Dest : TSDL_Rect;
+ Diff : integer;
+ SrcAddr, DestAddr : cardinal;
+ WorkX, WorkY : word;
+ SrcMod, DestMod : cardinal;
+ Bits : cardinal;
+begin
+ if ( SrcSurface = nil ) or ( DestSurface = nil ) then
+ exit; // Remove this to make it faster
+ if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
+ exit; // Remove this to make it faster
+ if SrcRect = nil then
+ begin
+ with Src do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface.w;
+ h := SrcSurface.h;
+ end;
+ end
+ else
+ Src := SrcRect^;
+ if DestRect = nil then
+ begin
+ Dest.x := 0;
+ Dest.y := 0;
+ end
+ else
+ Dest := DestRect^;
+ Dest.w := Src.w;
+ Dest.h := Src.h;
+ with DestSurface.Clip_Rect do
+ begin
+ // Source's right side is greater than the dest.cliprect
+ if Dest.x + Src.w > x + w then
+ begin
+ smallint( Src.w ) := x + w - Dest.x;
+ smallint( Dest.w ) := x + w - Dest.x;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's bottom side is greater than the dest.clip
+ if Dest.y + Src.h > y + h then
+ begin
+ smallint( Src.h ) := y + h - Dest.y;
+ smallint( Dest.h ) := y + h - Dest.y;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ // Source's left side is less than the dest.clip
+ if Dest.x < x then
+ begin
+ Diff := x - Dest.x;
+ Src.x := Src.x + Diff;
+ smallint( Src.w ) := smallint( Src.w ) - Diff;
+ Dest.x := x;
+ smallint( Dest.w ) := smallint( Dest.w ) - Diff;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's Top side is less than the dest.clip
+ if Dest.y < y then
+ begin
+ Diff := y - Dest.y;
+ Src.y := Src.y + Diff;
+ smallint( Src.h ) := smallint( Src.h ) - Diff;
+ Dest.y := y;
+ smallint( Dest.h ) := smallint( Dest.h ) - Diff;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ end;
+ with SrcSurface^ do
+ begin
+ SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
+ Format.BytesPerPixel;
+ SrcMod := Pitch - Src.w * Format.BytesPerPixel;
+ TransparentColor := Format.colorkey;
+ end;
+ with DestSurface^ do
+ begin
+ DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
+ Format.BytesPerPixel;
+ DestMod := Pitch - Dest.w * Format.BytesPerPixel;
+ Bits := Format.BitsPerPixel;
+ end;
+ SDL_LockSurface( SrcSurface );
+ SDL_LockSurface( DestSurface );
+ WorkY := Src.h;
+ case bits of
+ 8 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt8( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt8( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+ if Pixel2 and $E0 < Pixel1 and $E0 then R := Pixel2 and $E0 else R := Pixel1 and $E0;
+ if Pixel2 and $1C < Pixel1 and $1C then G := Pixel2 and $1C else G := Pixel1 and $1C;
+ if Pixel2 and $03 < Pixel1 and $03 then B := Pixel2 and $03 else B := Pixel1 and $03;
+
+ if R > $E0 then
+ R := $E0;
+ if G > $1C then
+ G := $1C;
+ if B > $03 then
+ B := $03;
+ PUInt8( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt8( DestAddr )^ := Pixel1;
+ end;
+ inc( SrcAddr );
+ inc( DestAddr );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 15 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt16( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt16( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+
+ if Pixel2 and $7C00 < Pixel1 and $7C00 then R := Pixel2 and $7C00 else R := Pixel1 and $7C00;
+ if Pixel2 and $03E0 < Pixel1 and $03E0 then G := Pixel2 and $03E0 else G := Pixel1 and $03E0;
+ if Pixel2 and $001F < Pixel1 and $001F then B := Pixel2 and $001F else B := Pixel1 and $001F;
+
+ PUInt16( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt16( DestAddr )^ := Pixel1;
+ end;
+ inc( SrcAddr, 2 );
+ inc( DestAddr, 2 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 16 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt16( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt16( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+
+ if Pixel2 and $F800 < Pixel1 and $F800 then R := Pixel2 and $F800 else R := Pixel1 and $F800;
+ if Pixel2 and $07E0 < Pixel1 and $07E0 then G := Pixel2 and $07E0 else G := Pixel1 and $07E0;
+ if Pixel2 and $001F < Pixel1 and $001F then B := Pixel2 and $001F else B := Pixel1 and $001F;
+
+ PUInt16( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt16( DestAddr )^ := Pixel1;
+ end;
+ inc( SrcAddr, 2 );
+ inc( DestAddr, 2 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 24 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt32( SrcAddr )^ and $00FFFFFF;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt32( DestAddr )^ and $00FFFFFF;
+ if Pixel2 > 0 then
+ begin
+
+ if Pixel2 and $FF0000 < Pixel1 and $FF0000 then R := Pixel2 and $FF0000 else R := Pixel1 and $FF0000;
+ if Pixel2 and $00FF00 < Pixel1 and $00FF00 then G := Pixel2 and $00FF00 else G := Pixel1 and $00FF00;
+ if Pixel2 and $0000FF < Pixel1 and $0000FF then B := Pixel2 and $0000FF else B := Pixel1 and $0000FF;
+
+ PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or ( R or G or B );
+ end
+ else
+ PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or Pixel1;
+ end;
+ inc( SrcAddr, 3 );
+ inc( DestAddr, 3 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 32 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt32( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt32( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+
+ if Pixel2 and $FF0000 < Pixel1 and $FF0000 then R := Pixel2 and $FF0000 else R := Pixel1 and $FF0000;
+ if Pixel2 and $00FF00 < Pixel1 and $00FF00 then G := Pixel2 and $00FF00 else G := Pixel1 and $00FF00;
+ if Pixel2 and $0000FF < Pixel1 and $0000FF then B := Pixel2 and $0000FF else B := Pixel1 and $0000FF;
+
+ PUInt32( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt32( DestAddr )^ := Pixel1;
+ end;
+ inc( SrcAddr, 4 );
+ inc( DestAddr, 4 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ end;
+ SDL_UnlockSurface( SrcSurface );
+ SDL_UnlockSurface( DestSurface );
+end;
+
+function SDL_ClipLine(var x1,y1,x2,y2: Integer; ClipRect: PSDL_Rect) : boolean;
+var tflag, flag1, flag2: word;
+ txy, xedge, yedge: Integer;
+ slope: single;
+
+ function ClipCode(x,y: Integer): word;
+ begin
+ Result := 0;
+ if x < ClipRect.x then Result := 1;
+ if x >= ClipRect.w + ClipRect.x then Result := Result or 2;
+ if y < ClipRect.y then Result := Result or 4;
+ if y >= ClipRect.h + ClipRect.y then Result := Result or 8;
+ end;
+
+begin
+ flag1 := ClipCode(x1,y1);
+ flag2 := ClipCode(x2,y2);
+ result := true;
+
+ while true do
+ begin
+ if (flag1 or flag2) = 0 then Exit; // all in
+
+ if (flag1 and flag2) <> 0 then
+ begin
+ result := false;
+ Exit; // all out
+ end;
+
+ if flag2 = 0 then
+ begin
+ txy := x1; x1 := x2; x2 := txy;
+ txy := y1; y1 := y2; y2 := txy;
+ tflag := flag1; flag1 := flag2; flag2 := tflag;
+ end;
+
+ if (flag2 and 3) <> 0 then
+ begin
+ if (flag2 and 1) <> 0 then
+ xedge := ClipRect.x
+ else
+ xedge := ClipRect.w + ClipRect.x -1; // back 1 pixel otherwise we end up in a loop
+
+ slope := (y2 - y1) / (x2 - x1);
+ y2 := y1 + Round(slope * (xedge - x1));
+ x2 := xedge;
+ end
+ else
+ begin
+ if (flag2 and 4) <> 0 then
+ yedge := ClipRect.y
+ else
+ yedge := ClipRect.h + ClipRect.y -1; // up 1 pixel otherwise we end up in a loop
+
+ slope := (x2 - x1) / (y2 - y1);
+ x2 := x1 + Round(slope * (yedge - y1));
+ y2 := yedge;
+ end;
+
+ flag2 := ClipCode(x2, y2);
+ end;
+end;
+
+end.
+
+
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlinput.pas b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlinput.pas
new file mode 100644
index 00000000..e1b2347e
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlinput.pas
@@ -0,0 +1,923 @@
+unit sdlinput;
+{
+ $Id: sdlinput.pas,v 1.9 2007/08/22 21:18:43 savage Exp $
+
+}
+{******************************************************************************}
+{ }
+{ JEDI-SDL : Pascal units for SDL - Simple DirectMedia Layer }
+{ SDL Input Wrapper }
+{ }
+{ }
+{ The initial developer of this Pascal code was : }
+{ Dominique Louis <Dominique@SavageSoftware.com.au> }
+{ }
+{ Portions created by Dominique Louis are }
+{ Copyright (C) 2003 - 2100 Dominique Louis. }
+{ }
+{ }
+{ Contributor(s) }
+{ -------------- }
+{ Dominique Louis <Dominique@SavageSoftware.com.au> }
+{ }
+{ Obtained through: }
+{ Joint Endeavour of Delphi Innovators ( Project JEDI ) }
+{ }
+{ You may retrieve the latest version of this file at the Project }
+{ JEDI home page, located at http://delphi-jedi.org }
+{ }
+{ The contents of this file are used with permission, subject to }
+{ the Mozilla Public License Version 1.1 (the "License"); you may }
+{ not use this file except in compliance with the License. You may }
+{ obtain a copy of the License at }
+{ http://www.mozilla.org/MPL/MPL-1.1.html }
+{ }
+{ Software distributed under the License is distributed on an }
+{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
+{ implied. See the License for the specific language governing }
+{ rights and limitations under the License. }
+{ }
+{ Description }
+{ ----------- }
+{ SDL Mouse, Keyboard and Joystick wrapper }
+{ }
+{ }
+{ Requires }
+{ -------- }
+{ SDL.dll on Windows platforms }
+{ libSDL-1.1.so.0 on Linux platform }
+{ }
+{ Programming Notes }
+{ ----------------- }
+{ }
+{ }
+{ }
+{ }
+{ Revision History }
+{ ---------------- }
+{ March 12 2003 - DL : Initial creation }
+{ }
+{ February 02 2004 - DL : Added Custom Cursor Support to the Mouse class }
+{
+ $Log: sdlinput.pas,v $
+ Revision 1.9 2007/08/22 21:18:43 savage
+ Thanks to Dean for his MouseDelta patch.
+
+ Revision 1.8 2005/08/03 18:57:32 savage
+ Various updates and additions. Mainly to handle OpenGL 3D Window support and better cursor support for the mouse class
+
+ Revision 1.7 2004/09/30 22:32:04 savage
+ Updated with slightly different header comments
+
+ Revision 1.6 2004/09/12 21:52:58 savage
+ Slight changes to fix some issues with the sdl classes.
+
+ Revision 1.5 2004/05/10 21:11:49 savage
+ changes required to help get SoAoS off the ground.
+
+ Revision 1.4 2004/05/03 22:38:40 savage
+ Added the ability to enable or disable certain inputs @ runtime. Basically it just does not call UpdateInput if Enabled = false.
+ Can also disable and enable input devices via the InputManager.
+
+ Revision 1.3 2004/04/28 21:27:01 savage
+ Updated Joystick code and event handlers. Needs testing...
+
+ Revision 1.2 2004/02/14 22:36:29 savage
+ Fixed inconsistencies of using LoadLibrary and LoadModule.
+ Now all units make use of LoadModule rather than LoadLibrary and other dynamic proc procedures.
+
+ Revision 1.1 2004/02/05 00:08:20 savage
+ Module 1.0 release
+
+
+}
+{******************************************************************************}
+
+interface
+
+{$i jedi-sdl.inc}
+
+uses
+ Classes,
+ sdl;
+
+type
+ TSDLInputType = ( itJoystick , itKeyBoard, itMouse );
+ TSDLInputTypes = set of TSDLInputType;
+
+ TSDLCustomInput = class( TObject )
+ private
+ FEnabled: Boolean;
+ public
+ constructor Create;
+ function UpdateInput( event: TSDL_EVENT ) : Boolean; virtual; abstract;
+ property Enabled : Boolean read FEnabled write FEnabled;
+ end;
+
+ TSDLJoyAxisMoveEvent = procedure ( Which: UInt8; Axis: UInt8; Value: SInt16 ) {$IFNDEF NOT_OO}of object{$ENDIF};
+ TSDLJoyBallMoveEvent = procedure ( Which: UInt8; Ball: UInt8; RelativePos: TPoint ) {$IFNDEF NOT_OO}of object{$ENDIF};
+ TSDLJoyHatMoveEvent = procedure ( Which: UInt8; Hat: UInt8; Value: SInt16 ) {$IFNDEF NOT_OO}of object{$ENDIF};
+ TSDLJoyButtonEvent = procedure ( Which: UInt8; Button: UInt8; State: SInt16 ) {$IFNDEF NOT_OO}of object{$ENDIF};
+
+
+ TSDLJoyStick = class( TSDLCustomInput )
+ private
+ FJoystick : PSDL_Joystick;
+ FJoystickIndex : Integer;
+ FJoyAxisMoveEvent : TSDLJoyAxisMoveEvent;
+ FJoyBallMoveEvent : TSDLJoyBallMoveEvent;
+ FJoyHatMoveEvent : TSDLJoyHatMoveEvent;
+ FJoyButtonDownEvent : TSDLJoyButtonEvent;
+ FJoyButtonUpEvent : TSDLJoyButtonEvent;
+ procedure DoAxisMove( Event : TSDL_Event );
+ procedure DoBallMove( Event : TSDL_Event );
+ procedure DoHatMove( Event : TSDL_Event );
+ procedure DoButtonDown( Event : TSDL_Event );
+ procedure DoButtonUp( Event : TSDL_Event );
+ function GetName: PChar;
+ function GetNumAxes: integer;
+ function GetNumBalls: integer;
+ function GetNumButtons: integer;
+ function GetNumHats: integer;
+ public
+ constructor Create( Index : Integer );
+ destructor Destroy; override;
+ procedure Open;
+ procedure Close;
+ function UpdateInput( Event: TSDL_EVENT ) : Boolean; override;
+ property Name : PChar read GetName;
+ property NumAxes : integer read GetNumAxes;
+ property NumBalls : integer read GetNumBalls;
+ property NumButtons : integer read GetNumButtons;
+ property NumHats : integer read GetNumHats;
+ property OnAxisMove : TSDLJoyAxisMoveEvent read FJoyAxisMoveEvent write FJoyAxisMoveEvent;
+ property OnBallMove : TSDLJoyBallMoveEvent read FJoyBallMoveEvent write FJoyBallMoveEvent;
+ property OnHatMove : TSDLJoyHatMoveEvent read FJoyHatMoveEvent write FJoyHatMoveEvent;
+ property OnButtonDown : TSDLJoyButtonEvent read FJoyButtonDownEvent write FJoyButtonDownEvent;
+ property OnButtonUp : TSDLJoyButtonEvent read FJoyButtonUpEvent write FJoyButtonUpEvent;
+ end;
+
+ TSDLJoySticks = class( TObject )
+ private
+ FNumOfJoySticks: Integer;
+ FJoyStickList : TList;
+ function GetJoyStick(Index: integer): TSDLJoyStick;
+ procedure SetJoyStick(Index: integer; const Value: TSDLJoyStick);
+ public
+ constructor Create;
+ destructor Destroy; override;
+ function UpdateInput( event: TSDL_EVENT ) : Boolean;
+ property NumOfJoySticks : Integer read FNumOfJoySticks write FNumOfJoySticks;
+ property JoySticks[ Index : integer ] : TSDLJoyStick read GetJoyStick write SetJoyStick;
+ end;
+
+ TSDLKeyBoardEvent = procedure ( var Key: TSDLKey; Shift: TSDLMod; unicode : UInt16 ) {$IFNDEF NOT_OO}of object{$ENDIF};
+
+ TSDLKeyBoard = class( TSDLCustomInput )
+ private
+ FKeys : PKeyStateArr;
+ FOnKeyUp: TSDLKeyBoardEvent;
+ FOnKeyDown: TSDLKeyBoardEvent;
+ procedure DoKeyDown( keysym : PSDL_keysym );
+ procedure DoKeyUp( keysym : PSDL_keysym );
+ public
+ function IsKeyDown( Key : TSDLKey ) : Boolean;
+ function IsKeyUp( Key : TSDLKey ) : Boolean;
+ function UpdateInput( event: TSDL_EVENT ) : Boolean; override;
+ property Keys : PKeyStateArr read FKeys write FKeys;
+ property OnKeyDown : TSDLKeyBoardEvent read FOnKeyDown write FOnKeyDown;
+ property OnKeyUp : TSDLKeyBoardEvent read FOnKeyUp write FOnKeyUp;
+ end;
+
+ TSDLMouseButtonEvent = procedure ( Button : Integer; Shift: TSDLMod; MousePos : TPoint ) {$IFNDEF NOT_OO}of object{$ENDIF};
+ TSDLMouseMoveEvent = procedure ( Shift: TSDLMod; CurrentPos : TPoint; RelativePos : TPoint ) {$IFNDEF NOT_OO}of object{$ENDIF};
+ TSDLMouseWheelEvent = procedure ( WheelDelta : Integer; Shift: TSDLMod; MousePos : TPoint ) {$IFNDEF NOT_OO}of object{$ENDIF};
+
+ TSDLCustomCursor = class( TObject )
+ private
+ FFileName : string;
+ FHotPoint: TPoint;
+ procedure SetFileName(const aValue: string );
+ function ScanForChar( str : string; ch : Char; startPos : Integer; lookFor : Boolean ) : Integer;
+ public
+ constructor Create( const aFileName : string; aHotPoint: TPoint );
+ procedure LoadFromFile( const aFileName : string ); virtual; abstract;
+ procedure LoadFromStream( aStream : TStream ); virtual; abstract;
+ procedure Show; virtual; abstract;
+ property FileName : string read FFileName write SetFileName;
+ property HotPoint : TPoint read FHotPoint write FHotPoint;
+ end;
+
+ TSDLXPMCursor = class( TSDLCustomCursor )
+ private
+ FCursor : PSDL_Cursor;
+ procedure FreeCursor;
+ public
+ destructor Destroy; override;
+ procedure LoadFromFile( const aFileName : string ); override;
+ procedure LoadFromStream( aStream : TStream ); override;
+ procedure Show; override;
+ end;
+
+ TSDLCursorList = class( TStringList )
+ protected
+ function GetObject( aIndex : Integer ): TSDLCustomCursor; reintroduce;
+ procedure PutObject( aIndex : Integer; AObject : TSDLCustomCursor); reintroduce;
+ public
+ constructor Create;
+ function AddCursor(const aName : string; aObject : TSDLCustomCursor): Integer; virtual;
+ end;
+
+ TSDLMouse = class( TSDLCustomInput )
+ private
+ FDragging : Boolean;
+ FMousePos : TPoint;
+ FOnMouseUp: TSDLMouseButtonEvent;
+ FOnMouseDown: TSDLMouseButtonEvent;
+ FOnMouseMove: TSDLMouseMoveEvent;
+ FOnMouseWheel: TSDLMouseWheelEvent;
+ FCursorList : TSDLCursorList; // Cursor Pointer
+ procedure DoMouseMove( Event: TSDL_Event );
+ procedure DoMouseDown( Event: TSDL_Event );
+ procedure DoMouseUp( Event: TSDL_Event );
+ procedure DoMouseWheelScroll( Event: TSDL_Event );
+ function GetMousePosition: TPoint;
+ procedure SetMousePosition(const Value: TPoint);
+ function GetMouseDelta: TPoint;
+ public
+ destructor Destroy; override;
+ function UpdateInput( event: TSDL_EVENT ) : Boolean; override;
+ function MouseIsDown( Button : Integer ) : Boolean;
+ function MouseIsUp( Button : Integer ) : Boolean;
+ procedure ShowCursor;
+ procedure HideCursor;
+ property OnMouseDown : TSDLMouseButtonEvent read FOnMouseDown write FOnMouseDown;
+ property OnMouseUp : TSDLMouseButtonEvent read FOnMouseUp write FOnMouseUp;
+ property OnMouseMove : TSDLMouseMoveEvent read FOnMouseMove write FOnMouseMove;
+ property OnMouseWheel : TSDLMouseWheelEvent read FOnMouseWheel write FOnMouseWheel;
+ property MousePosition : TPoint read GetMousePosition write SetMousePosition;
+ property MouseDelta: TPoint read GetMouseDelta;
+ property Cursors : TSDLCursorList read FCursorList write FCursorList;
+ end;
+
+ TSDLInputManager = class( TObject )
+ private
+ FKeyBoard : TSDLKeyBoard;
+ FMouse : TSDLMouse;
+ FJoystick : TSDLJoysticks;
+ public
+ constructor Create( InitInputs : TSDLInputTypes );
+ destructor Destroy; override;
+ procedure Disable( InitInputs : TSDLInputTypes; JoyStickNumber : Integer = 0 );
+ procedure Enable( InitInputs : TSDLInputTypes; JoyStickNumber : Integer = 0 );
+ function UpdateInputs( event: TSDL_EVENT ) : Boolean;
+ property KeyBoard : TSDLKeyBoard read FKeyBoard write FKeyBoard;
+ property Mouse : TSDLMouse read FMouse write FMouse;
+ property JoyStick : TSDLJoysticks read FJoyStick write FJoyStick;
+ end;
+
+implementation
+
+uses
+ SysUtils;
+
+{ TSDLCustomInput }
+constructor TSDLCustomInput.Create;
+begin
+ inherited;
+ FEnabled := true;
+end;
+
+{ TSDLJoysticks }
+constructor TSDLJoysticks.Create;
+var
+ i : integer;
+begin
+ inherited;
+ if ( SDL_WasInit( SDL_INIT_JOYSTICK ) = 0 ) then
+ SDL_InitSubSystem( SDL_INIT_JOYSTICK );
+ FNumOfJoySticks := SDL_NumJoysticks;
+ FJoyStickList := TList.Create;
+ for i := 0 to FNumOfJoySticks - 1 do
+ begin
+ FJoyStickList.Add( TSDLJoyStick.Create( i ) );
+ end;
+end;
+
+destructor TSDLJoysticks.Destroy;
+var
+ i : integer;
+begin
+ if FJoyStickList.Count > 0 then
+ begin
+ for i := 0 to FJoyStickList.Count - 1 do
+ begin
+ TSDLJoyStick( FJoyStickList.Items[i] ).Free;
+ end;
+ end;
+ SDL_QuitSubSystem( SDL_INIT_JOYSTICK );
+ inherited;
+end;
+
+function TSDLJoySticks.GetJoyStick(Index: integer): TSDLJoyStick;
+begin
+ Result := TSDLJoyStick( FJoyStickList[ Index ] );
+end;
+
+procedure TSDLJoySticks.SetJoyStick(Index: integer;
+ const Value: TSDLJoyStick);
+begin
+ FJoyStickList[ Index ] := @Value;
+end;
+
+function TSDLJoysticks.UpdateInput(event: TSDL_EVENT): Boolean;
+var
+ i : integer;
+begin
+ result := false;
+ if FJoyStickList.Count > 0 then
+ begin
+ for i := 0 to FJoyStickList.Count - 1 do
+ begin
+ TSDLJoyStick( FJoyStickList.Items[i] ).UpdateInput( event );
+ end;
+ end;
+end;
+
+{ TSDLKeyBoard }
+procedure TSDLKeyBoard.DoKeyDown(keysym: PSDL_keysym);
+begin
+ if Assigned( FOnKeyDown ) then
+ FOnKeyDown( keysym.sym , keysym.modifier, keysym.unicode );
+end;
+
+procedure TSDLKeyBoard.DoKeyUp(keysym: PSDL_keysym);
+begin
+ if Assigned( FOnKeyUp ) then
+ FOnKeyUp( keysym.sym , keysym.modifier, keysym.unicode );
+end;
+
+function TSDLKeyBoard.IsKeyDown( Key: TSDLKey ): Boolean;
+begin
+ SDL_PumpEvents;
+
+ // Populate Keys array
+ FKeys := PKeyStateArr( SDL_GetKeyState( nil ) );
+ Result := ( FKeys[Key] = SDL_PRESSED );
+end;
+
+function TSDLKeyBoard.IsKeyUp( Key: TSDLKey ): Boolean;
+begin
+ SDL_PumpEvents;
+
+ // Populate Keys array
+ FKeys := PKeyStateArr( SDL_GetKeyState( nil ) );
+ Result := ( FKeys[Key] = SDL_RELEASED );
+end;
+
+function TSDLKeyBoard.UpdateInput(event: TSDL_EVENT): Boolean;
+begin
+ result := false;
+ if ( FEnabled ) then
+ begin
+ case event.type_ of
+ SDL_KEYDOWN :
+ begin
+ // handle key presses
+ DoKeyDown( @event.key.keysym );
+ result := true;
+ end;
+
+ SDL_KEYUP :
+ begin
+ // handle key releases
+ DoKeyUp( @event.key.keysym );
+ result := true;
+ end;
+ end;
+ end;
+end;
+
+{ TSDLMouse }
+destructor TSDLMouse.Destroy;
+begin
+
+ inherited;
+end;
+
+procedure TSDLMouse.DoMouseDown( Event: TSDL_Event );
+var
+ CurrentPos : TPoint;
+begin
+ FDragging := true;
+ if Assigned( FOnMouseDown ) then
+ begin
+ CurrentPos.x := event.button.x;
+ CurrentPos.y := event.button.y;
+ FOnMouseDown( event.button.button, SDL_GetModState, CurrentPos );
+ end;
+end;
+
+procedure TSDLMouse.DoMouseMove( Event: TSDL_Event );
+var
+ CurrentPos, RelativePos : TPoint;
+begin
+ if Assigned( FOnMouseMove ) then
+ begin
+ CurrentPos.x := event.motion.x;
+ CurrentPos.y := event.motion.y;
+ RelativePos.x := event.motion.xrel;
+ RelativePos.y := event.motion.yrel;
+ FOnMouseMove( SDL_GetModState, CurrentPos, RelativePos );
+ end;
+end;
+
+procedure TSDLMouse.DoMouseUp( event: TSDL_EVENT );
+var
+ Point : TPoint;
+begin
+ FDragging := false;
+ if Assigned( FOnMouseUp ) then
+ begin
+ Point.x := event.button.x;
+ Point.y := event.button.y;
+ FOnMouseUp( event.button.button, SDL_GetModState, Point );
+ end;
+end;
+
+procedure TSDLMouse.DoMouseWheelScroll( event: TSDL_EVENT );
+var
+ Point : TPoint;
+begin
+ if Assigned( FOnMouseWheel ) then
+ begin
+ Point.x := event.button.x;
+ Point.y := event.button.y;
+ if ( event.button.button = SDL_BUTTON_WHEELUP ) then
+ FOnMouseWheel( SDL_BUTTON_WHEELUP, SDL_GetModState, Point )
+ else
+ FOnMouseWheel( SDL_BUTTON_WHEELDOWN, SDL_GetModState, Point );
+ end;
+end;
+
+function TSDLMouse.GetMouseDelta: TPoint;
+begin
+ SDL_PumpEvents;
+
+ SDL_GetRelativeMouseState( Result.X, Result.Y );
+end;
+
+function TSDLMouse.GetMousePosition: TPoint;
+begin
+ SDL_PumpEvents;
+
+ SDL_GetMouseState( FMousePos.X, FMousePos.Y );
+ Result := FMousePos;
+end;
+
+procedure TSDLMouse.HideCursor;
+begin
+ SDL_ShowCursor( SDL_DISABLE );
+end;
+
+function TSDLMouse.MouseIsDown(Button: Integer): Boolean;
+begin
+ SDL_PumpEvents;
+
+ Result := ( SDL_GetMouseState( FMousePos.X, FMousePos.Y ) and SDL_BUTTON( Button ) = 0 );
+end;
+
+function TSDLMouse.MouseIsUp(Button: Integer): Boolean;
+begin
+ SDL_PumpEvents;
+
+ Result := not ( SDL_GetMouseState( FMousePos.X, FMousePos.Y ) and SDL_BUTTON( Button ) = 0 );
+end;
+
+procedure TSDLMouse.SetMousePosition(const Value: TPoint);
+begin
+ SDL_WarpMouse( Value.x, Value.y );
+end;
+
+procedure TSDLMouse.ShowCursor;
+begin
+ SDL_ShowCursor( SDL_ENABLE );
+end;
+
+function TSDLMouse.UpdateInput(event: TSDL_EVENT): Boolean;
+begin
+ result := false;
+ if ( FEnabled ) then
+ begin
+ case event.type_ of
+ SDL_MOUSEMOTION :
+ begin
+ // handle Mouse Move
+ DoMouseMove( event );
+ end;
+
+ SDL_MOUSEBUTTONDOWN :
+ begin
+ // handle Mouse Down
+ if ( event.button.button = SDL_BUTTON_WHEELUP )
+ or ( event.button.button = SDL_BUTTON_WHEELDOWN ) then
+ DoMouseWheelScroll( event )
+ else
+ DoMouseDown( event );
+ end;
+
+ SDL_MOUSEBUTTONUP :
+ begin
+ // handle Mouse Up
+ if ( event.button.button = SDL_BUTTON_WHEELUP )
+ or ( event.button.button = SDL_BUTTON_WHEELDOWN ) then
+ DoMouseWheelScroll( event )
+ else
+ DoMouseUp( event );
+ end;
+ end;
+ end;
+end;
+
+{ TSDLInputManager }
+constructor TSDLInputManager.Create(InitInputs: TSDLInputTypes);
+begin
+ inherited Create;
+ if itJoystick in InitInputs then
+ FJoystick := TSDLJoysticks.Create;
+
+ if itKeyBoard in InitInputs then
+ FKeyBoard := TSDLKeyBoard.Create;
+
+ if itMouse in InitInputs then
+ FMouse := TSDLMouse.Create;
+end;
+
+destructor TSDLInputManager.Destroy;
+begin
+ if FJoystick <> nil then
+ FreeAndNil( FJoystick );
+ if FKeyBoard <> nil then
+ FreeAndNil( FKeyBoard );
+ if FMouse <> nil then
+ FreeAndNil( FMouse );
+ inherited;
+end;
+
+procedure TSDLInputManager.Disable( InitInputs : TSDLInputTypes; JoyStickNumber : Integer );
+begin
+ if itJoystick in InitInputs then
+ FJoystick.JoySticks[ JoyStickNumber ].Enabled := false;
+
+ if itKeyBoard in InitInputs then
+ FKeyBoard.Enabled := false;
+
+ if itMouse in InitInputs then
+ FMouse.Enabled := false;
+end;
+
+procedure TSDLInputManager.Enable( InitInputs: TSDLInputTypes; JoyStickNumber: Integer );
+begin
+ if itJoystick in InitInputs then
+ FJoystick.JoySticks[ JoyStickNumber ].Enabled := true;
+
+ if itKeyBoard in InitInputs then
+ FKeyBoard.Enabled := true;
+
+ if itMouse in InitInputs then
+ FMouse.Enabled := true;
+end;
+
+function TSDLInputManager.UpdateInputs( event: TSDL_EVENT ): Boolean;
+begin
+ Result := false;
+ if ( FJoystick <> nil ) then
+ Result := FJoystick.UpdateInput( event );
+ if ( FKeyBoard <> nil ) then
+ Result := FKeyBoard.UpdateInput( event );
+ if ( FMouse <> nil ) then
+ Result := FMouse.UpdateInput( event );
+end;
+
+{ TSDLJoyStick }
+procedure TSDLJoyStick.Close;
+begin
+ SDL_JoystickClose( @FJoystick );
+end;
+
+constructor TSDLJoyStick.Create( Index : Integer );
+begin
+ inherited Create;
+ FJoystick := nil;
+ FJoystickIndex := Index;
+end;
+
+destructor TSDLJoyStick.Destroy;
+begin
+ if FJoystick <> nil then
+ Close;
+ inherited;
+end;
+
+procedure TSDLJoyStick.DoAxisMove(Event: TSDL_Event);
+begin
+ if Assigned( FJoyAxisMoveEvent ) then
+ begin
+ FJoyAxisMoveEvent( Event.jaxis.which, Event.jaxis.axis, Event.jaxis.value );
+ end
+end;
+
+procedure TSDLJoyStick.DoBallMove(Event: TSDL_Event);
+var
+ BallPoint : TPoint;
+begin
+ if Assigned( FJoyBallMoveEvent ) then
+ begin
+ BallPoint.x := Event.jball.xrel;
+ BallPoint.y := Event.jball.yrel;
+ FJoyBallMoveEvent( Event.jball.which, Event.jball.ball, BallPoint );
+ end;
+end;
+
+procedure TSDLJoyStick.DoButtonDown(Event: TSDL_Event);
+begin
+ if Assigned( FJoyButtonDownEvent ) then
+ begin
+ if ( Event.jbutton.state = SDL_PRESSED ) then
+ FJoyButtonDownEvent( Event.jbutton.which, Event.jbutton.button, Event.jbutton.state );
+ end;
+end;
+
+procedure TSDLJoyStick.DoButtonUp(Event: TSDL_Event);
+begin
+ if Assigned( FJoyButtonUpEvent ) then
+ begin
+ if ( Event.jbutton.state = SDL_RELEASED ) then
+ FJoyButtonUpEvent( Event.jbutton.which, Event.jbutton.button, Event.jbutton.state );
+ end
+end;
+
+procedure TSDLJoyStick.DoHatMove(Event: TSDL_Event);
+begin
+ if Assigned( FJoyHatMoveEvent ) then
+ begin
+ FJoyHatMoveEvent( Event.jhat.which, Event.jhat.hat, Event.jhat.value );
+ end;
+end;
+
+function TSDLJoyStick.GetName: PChar;
+begin
+ result := FJoystick.name;
+end;
+
+function TSDLJoyStick.GetNumAxes: integer;
+begin
+ result := FJoystick.naxes;
+end;
+
+function TSDLJoyStick.GetNumBalls: integer;
+begin
+ result := FJoystick.nballs;
+end;
+
+function TSDLJoyStick.GetNumButtons: integer;
+begin
+ result := FJoystick.nbuttons;
+end;
+
+function TSDLJoyStick.GetNumHats: integer;
+begin
+ result := FJoystick.nhats;
+end;
+
+procedure TSDLJoyStick.Open;
+begin
+ FJoystick := SDL_JoyStickOpen( FJoystickIndex );
+end;
+
+function TSDLJoyStick.UpdateInput(Event: TSDL_EVENT): Boolean;
+begin
+ Result := false;
+
+ if ( FEnabled ) then
+ begin
+ case event.type_ of
+ SDL_JOYAXISMOTION :
+ begin
+ DoAxisMove( Event );
+ end;
+
+ SDL_JOYBALLMOTION :
+ begin
+ DoBallMove( Event );
+ end;
+
+ SDL_JOYHATMOTION :
+ begin
+ DoHatMove( Event );
+ end;
+
+ SDL_JOYBUTTONDOWN :
+ begin
+ DoButtonDown( Event );
+ end;
+
+ SDL_JOYBUTTONUP :
+ begin
+ DoButtonUp( Event );
+ end;
+ end;
+ end;
+end;
+
+{ TSDLCustomCursor }
+
+constructor TSDLCustomCursor.Create(const aFileName: string; aHotPoint: TPoint);
+begin
+ inherited Create;
+ FHotPoint := aHotPoint;
+ LoadFromFile( aFileName );
+end;
+
+function TSDLCustomCursor.ScanForChar(str: string; ch: Char;
+ startPos: Integer; lookFor: Boolean): Integer;
+begin
+ Result := -1;
+ while ( ( ( str[ startPos ] = ch ) <> lookFor ) and ( startPos < Length( str ) ) ) do
+ inc( startPos );
+ if startPos <> Length( str ) then
+ Result := startPos;
+end;
+
+procedure TSDLCustomCursor.SetFileName(const aValue: string);
+begin
+ LoadFromFile( aValue );
+end;
+
+{ TSDLXPMCursor }
+
+destructor TSDLXPMCursor.Destroy;
+begin
+ FreeCursor;
+ inherited;
+end;
+
+procedure TSDLXPMCursor.FreeCursor;
+begin
+ if FCursor <> nil then
+ begin
+ SDL_FreeCursor( FCursor );
+ FFileName := '';
+ end;
+end;
+
+procedure TSDLXPMCursor.LoadFromFile(const aFileName: string);
+var
+ xpmFile : Textfile;
+ step : Integer;
+ holdPos : Integer;
+ counter : Integer;
+ dimensions : array[ 1..3 ] of Integer;
+ clr, clrNone, clrBlack, clrWhite : Char;
+ data, mask : array of UInt8;
+ i, col : Integer;
+ LineString : string;
+begin
+ FreeCursor;
+ AssignFile( xpmFile, aFileName );
+ Reset( xpmFile );
+ step := 0;
+ i := -1;
+ clrBlack := 'X';
+ clrWhite := ',';
+ clrNone := ' ';
+ counter := 0;
+ while not ( eof( xpmFile ) ) do
+ begin
+ Readln( xpmFile, LineString );
+ // scan for strings
+ if LineString[ 1 ] = '"' then
+ begin
+ case step of
+ 0 : // Get dimensions (should be width height number-of-colors ???)
+ begin
+ HoldPos := 2;
+ counter := ScanForChar( LineString, ' ', HoldPos, False );
+ counter := ScanForChar( LineString, ' ', counter, True );
+ dimensions[ 1 ] := StrToInt( Copy( LineString, HoldPos, counter - HoldPos ) );
+ counter := ScanForChar( LineString, ' ', counter, False );
+ holdPos := counter;
+ counter := ScanForChar( LineString, ' ', counter, True );
+ dimensions[ 2 ] := StrToInt( Copy( LineString, holdPos, counter - HoldPos ) );
+ counter := ScanForChar( LineString, ' ', counter, False );
+ holdPos := counter;
+ counter := ScanForChar( LineString, ' ', counter, True );
+ dimensions[ 3 ] := StrToInt( Copy( LineString, holdPos, counter - HoldPos ) );
+ step := 1;
+ SetLength( data, ( dimensions[ 1 ] * dimensions[ 2 ] ) div 8 );
+ SetLength( mask, ( dimensions[ 1 ] * dimensions[ 2 ] ) div 8 );
+ //Log.LogStatus( 'Length = ' + IntToStr( ( dimensions[ 1 ] * dimensions[ 2 ] ) div 8 ), 'LoadCursorFromFile' );
+ end;
+ 1 : // get the symbols for transparent, black and white
+ begin
+ // get the symbol for the color
+ clr := LineString[ 2 ];
+ // look for the 'c' symbol
+ counter := ScanForChar( LineString, 'c', 3, True );
+ inc( counter );
+ counter := ScanForChar( LineString, ' ', counter, False );
+ if LowerCase( Copy( LineString, counter, 4 ) ) = 'none' then
+ begin
+ clrNone := clr;
+ end;
+ if LowerCase( Copy( LineString, counter, 7 ) ) = '#ffffff' then
+ begin
+ clrWhite := clr;
+ end;
+ if LowerCase( Copy( LineString, counter, 7 ) ) = '#000000' then
+ begin
+ clrBlack := clr;
+ end;
+ dec( dimensions[ 3 ] );
+ if dimensions[ 3 ] = 0 then
+ begin
+ step := 2;
+ counter := 0;
+ end;
+ end;
+ 2 : // get cursor information -- modified from the SDL
+ // documentation of SDL_CreateCursor.
+ begin
+ for col := 1 to dimensions[1] do
+ begin
+ if ( ( col mod 8 ) <> 1 ) then
+ begin
+ data[ i ] := data[ i ] shl 1;
+ mask[ i ] := mask[ i ] shl 1;
+ end
+ else
+ begin
+ inc( i );
+ data[ i ] := 0;
+ mask[ i ] := 0;
+ end;
+ if LineString[ col ] = clrWhite then
+ begin
+ mask[ i ] := mask[ i ] or $01;
+ end
+ else if LineString[ col ] = clrBlack then
+ begin
+ data[ i ] := data[ i ] or $01;
+ mask[ i ] := mask[ i ] or $01;
+ end
+ else if LineString[ col + 1 ] = clrNone then
+ begin
+ //
+ end;
+ end;
+ inc(counter);
+ if counter = dimensions[2] then
+ step := 4;
+ end;
+ end;
+ end;
+ end;
+ CloseFile( xpmFile );
+ FCursor := SDL_CreateCursor( PUInt8( data ), PUInt8( mask ), dimensions[ 1 ], dimensions[ 2 ], FHotPoint.x, FHotPoint.y );
+end;
+
+procedure TSDLXPMCursor.LoadFromStream(aStream: TStream);
+begin
+ inherited;
+
+end;
+
+procedure TSDLXPMCursor.Show;
+begin
+ inherited;
+ SDL_SetCursor( FCursor );
+end;
+
+{ TSDLCursorList }
+function TSDLCursorList.AddCursor(const aName : string; aObject : TSDLCustomCursor): Integer;
+begin
+ result := inherited AddObject( aName, aObject );
+end;
+
+constructor TSDLCursorList.Create;
+begin
+ inherited;
+ Duplicates := dupIgnore;
+end;
+
+function TSDLCursorList.GetObject(aIndex: Integer): TSDLCustomCursor;
+begin
+ result := TSDLCustomCursor( inherited GetObject( aIndex ) );
+end;
+
+procedure TSDLCursorList.PutObject(aIndex: Integer; aObject: TSDLCustomCursor);
+begin
+ inherited PutObject( aIndex, aObject );
+end;
+
+end.
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlstreams.pas b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlstreams.pas
new file mode 100644
index 00000000..64009176
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlstreams.pas
@@ -0,0 +1,216 @@
+unit sdlstreams;
+{
+ $Id: sdlstreams.pas,v 1.1 2004/02/05 00:08:20 savage Exp $
+
+}
+{******************************************************************}
+{ }
+{ SDL - Simple DirectMedia Layer }
+{ Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga }
+{ }
+{ Portions created by Chris Bruner are }
+{ Copyright (C) 2002 Chris Bruner. }
+{ }
+{ Contributor(s) }
+{ -------------- }
+{ }
+{ }
+{ Obtained through: }
+{ Joint Endeavour of Delphi Innovators ( Project JEDI ) }
+{ }
+{ You may retrieve the latest version of this file at the Project }
+{ JEDI home page, located at http://delphi-jedi.org }
+{ }
+{ The contents of this file are used with permission, subject to }
+{ the Mozilla Public License Version 1.1 (the "License"); you may }
+{ not use this file except in compliance with the License. You may }
+{ obtain a copy of the License at }
+{ http://www.mozilla.org/NPL/NPL-1_1Final.html }
+{ }
+{ Software distributed under the License is distributed on an }
+{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
+{ implied. See the License for the specific language governing }
+{ rights and limitations under the License. }
+{ }
+{ Description }
+{ ----------- }
+{ Shows how to use OpenGL to do 2D and 3D with the SDL libraries }
+{ }
+{ }
+{ Requires }
+{ -------- }
+{ SDL runtime libary somewhere in your path }
+{ The Latest SDL runtime can be found on http://www.libsdl.org }
+{ }
+{ Programming Notes }
+{ ----------------- }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ Revision History }
+{ ---------------- }
+{ January 11 2002 - CB : Software embraced and extended by }
+{ Chris Bruner of Crystal Software }
+{ (Canada) Inc. }
+{ }
+{ February 11 2002 - DL : Added FreePascal support as suggested }
+{ by "QuePasha Pepe" <mrkroket@hotmail.com> }
+{ }
+{******************************************************************}
+{
+ $Log: sdlstreams.pas,v $
+ Revision 1.1 2004/02/05 00:08:20 savage
+ Module 1.0 release
+
+
+}
+
+{$i jedi-sdl.inc}
+
+interface
+
+uses
+ Classes,
+ SysUtils,
+ sdl,
+ sdlutils;
+
+{$IFDEF FPC}
+type
+ EinvalidContainer=class(Exception);
+ {$ENDIF}
+
+function LoadSDLBMPFromStream( Stream : TStream ) : PSDL_Surface;
+procedure SaveSDLBMPToStream( SDL_Surface : PSDL_Surface; stream : TStream );
+function SDL_Swap16( D : UInt16 ) : Uint16;
+function SDL_Swap32( D : UInt32 ) : Uint32;
+function SDLStreamSetup( stream : TStream ) : PSDL_RWops;
+// this only closes the SDL_RWops part of the stream, not the stream itself
+procedure SDLStreamCloseRWops( SDL_RWops : PSDL_RWops );
+
+implementation
+
+function SDL_Swap16( D : UInt16 ) : Uint16;
+begin
+ Result := ( D shl 8 ) or ( D shr 8 );
+end;
+
+function SDL_Swap32( D : UInt32 ) : Uint32;
+begin
+ Result := ( ( D shl 24 ) or ( ( D shl 8 ) and $00FF0000 ) or ( ( D shr 8 ) and $0000FF00 ) or ( D shr 24 ) );
+end;
+
+(*function SDL_Swap64(D : UInt64) : Uint64;
+var hi,lo : Uint32;
+begin
+ // Separate into high and low 32-bit resultues and swap them
+ lo := Uint32(D and $0FFFFFFFF); // bloody pascal is too tight in it's type checking!
+ D := D shr 32;
+ hi = Uint32((D and $FFFFFFFF));
+ result = SDL_Swap32(lo);
+ result := result shl 32;
+ result := result or SDL_Swap32(hi);
+end;
+*)
+
+function SdlStreamSeek( context : PSDL_RWops; offset : Integer; whence : Integer ) : integer; cdecl;
+var
+ stream : TStream;
+ origin : Word;
+begin
+ stream := TStream( context.unknown );
+ if ( stream = nil ) then
+ raise EInvalidContainer.Create( 'SDLStreamSeek on nil' );
+ case whence of
+ 0 : origin := soFromBeginning; // Offset is from the beginning of the resource. Seek moves to the position Offset. Offset must be >= 0.
+ 1 : origin := soFromCurrent; // Offset is from the current position in the resource. Seek moves to Position + Offset.
+ 2 : origin := soFromEnd;
+ else
+ origin := soFromBeginning; // just in case
+ end;
+ Result := stream.Seek( offset, origin );
+end;
+
+function SDLStreamWrite( context : PSDL_RWops; Ptr : Pointer;
+ size : Integer; num : Integer ) : Integer; cdecl;
+var
+ stream : TStream;
+begin
+ stream := TStream( context.unknown );
+ if ( stream = nil ) then
+ raise EInvalidContainer.Create( 'SDLStreamWrite on nil' );
+ try
+ Result := stream.Write( Ptr^, Size * num ) div size;
+ except
+ Result := -1;
+ end;
+end;
+
+function SdlStreamRead( context : PSDL_RWops; Ptr : Pointer; size : Integer; maxnum
+ : Integer ) : Integer; cdecl;
+var
+ stream : TStream;
+begin
+ stream := TStream( context.unknown );
+ if ( stream = nil ) then
+ raise EInvalidContainer.Create( 'SDLStreamRead on nil' );
+ try
+ Result := stream.read( Ptr^, Size * maxnum ) div size;
+ except
+ Result := -1;
+ end;
+end;
+
+function SDLStreamClose( context : PSDL_RWops ) : Integer; cdecl;
+var
+ stream : TStream;
+begin
+ stream := TStream( context.unknown );
+ if ( stream = nil ) then
+ raise EInvalidContainer.Create( 'SDLStreamClose on nil' );
+ stream.Free;
+ Result := 1;
+end;
+
+function SDLStreamSetup( stream : TStream ) : PSDL_RWops;
+begin
+ result := SDL_AllocRW;
+ if ( result = nil ) then
+ raise EInvalidContainer.Create( 'could not create SDLStream on nil' );
+ result.unknown := TUnknown( stream );
+ result.seek := SDLStreamSeek;
+ result.read := SDLStreamRead;
+ result.write := SDLStreamWrite;
+ result.close := SDLStreamClose;
+ Result.type_ := 2; // TUnknown
+end;
+
+// this only closes the SDL part of the stream, not the context
+
+procedure SDLStreamCloseRWops( SDL_RWops : PSDL_RWops );
+begin
+ SDL_FreeRW( SDL_RWops );
+end;
+
+function LoadSDLBMPFromStream( stream : TStream ) : PSDL_Surface;
+var
+ SDL_RWops : PSDL_RWops;
+begin
+ SDL_RWops := SDLStreamSetup( stream );
+ result := SDL_LoadBMP_RW( SDL_RWops, 0 );
+ SDLStreamCloseRWops( SDL_RWops );
+end;
+
+procedure SaveSDLBMPToStream( SDL_Surface : PSDL_Surface; stream : TStream );
+var
+ SDL_RWops : PSDL_RWops;
+begin
+ SDL_RWops := SDLStreamSetup( stream );
+ SDL_SaveBMP_RW( SDL_Surface, SDL_RWops, 0 );
+ SDLStreamCloseRWops( SDL_RWops );
+end;
+
+end.
+
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlticks.pas b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlticks.pas
new file mode 100644
index 00000000..8e00dd6f
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlticks.pas
@@ -0,0 +1,197 @@
+unit sdlticks;
+{
+ $Id: sdlticks.pas,v 1.2 2006/11/08 08:22:48 savage Exp $
+
+}
+{******************************************************************************}
+{ }
+{ JEDI-SDL : Pascal units for SDL - Simple DirectMedia Layer }
+{ SDL GetTicks Class Wrapper }
+{ }
+{ }
+{ The initial developer of this Pascal code was : }
+{ Dominique Louis <Dominique@SavageSoftware.com.au> }
+{ }
+{ Portions created by Dominique Louis are }
+{ Copyright (C) 2004 - 2100 Dominique Louis. }
+{ }
+{ }
+{ Contributor(s) }
+{ -------------- }
+{ Dominique Louis <Dominique@SavageSoftware.com.au> }
+{ }
+{ Obtained through: }
+{ Joint Endeavour of Delphi Innovators ( Project JEDI ) }
+{ }
+{ You may retrieve the latest version of this file at the Project }
+{ JEDI home page, located at http://delphi-jedi.org }
+{ }
+{ The contents of this file are used with permission, subject to }
+{ the Mozilla Public License Version 1.1 (the "License"); you may }
+{ not use this file except in compliance with the License. You may }
+{ obtain a copy of the License at }
+{ http://www.mozilla.org/MPL/MPL-1.1.html }
+{ }
+{ Software distributed under the License is distributed on an }
+{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
+{ implied. See the License for the specific language governing }
+{ rights and limitations under the License. }
+{ }
+{ Description }
+{ ----------- }
+{ SDL Window Wrapper }
+{ }
+{ }
+{ Requires }
+{ -------- }
+{ SDL.dll on Windows platforms }
+{ libSDL-1.1.so.0 on Linux platform }
+{ }
+{ Programming Notes }
+{ ----------------- }
+{ }
+{ }
+{ }
+{ }
+{ Revision History }
+{ ---------------- }
+{ }
+{ September 23 2004 - DL : Initial Creation }
+{
+ $Log: sdlticks.pas,v $
+ Revision 1.2 2006/11/08 08:22:48 savage
+ updates tp sdlgameinterface and sdlticks functions.
+
+ Revision 1.1 2004/09/30 22:35:47 savage
+ Changes, enhancements and additions as required to get SoAoS working.
+
+}
+{******************************************************************************}
+
+interface
+
+uses
+ sdl;
+
+type
+ TSDLTicks = class
+ private
+ FStartTime : UInt32;
+ FTicksPerSecond : UInt32;
+ FElapsedLastTime : UInt32;
+ FFPSLastTime : UInt32;
+ FLockFPSLastTime : UInt32;
+ public
+ constructor Create;
+ destructor Destroy; override; // destructor
+
+ {*****************************************************************************
+ Init
+ If the hi-res timer is present, the tick rate is stored and the function
+ returns true. Otherwise, the function returns false, and the timer should
+ not be used.
+ *****************************************************************************}
+ function Init : boolean;
+
+ {***************************************************************************
+ GetGetElapsedSeconds
+ Returns the Elapsed time, since the function was last called.
+ ***************************************************************************}
+ function GetElapsedSeconds : Single;
+
+ {***************************************************************************
+ GetFPS
+ Returns the average frames per second.
+ If this is not called every frame, the client should track the number
+ of frames itself, and reset the value after this is called.
+ ***************************************************************************}
+ function GetFPS : single;
+
+ {***************************************************************************
+ LockFPS
+ Used to lock the frame rate to a set amount. This will block until enough
+ time has passed to ensure that the fps won't go over the requested amount.
+ Note that this can only keep the fps from going above the specified level;
+ it can still drop below it. It is assumed that if used, this function will
+ be called every frame. The value returned is the instantaneous fps, which
+ will be less than or equal to the targetFPS.
+ ***************************************************************************}
+ procedure LockFPS( targetFPS : Byte );
+ end;
+
+implementation
+
+{ TSDLTicks }
+constructor TSDLTicks.Create;
+begin
+ inherited;
+ FTicksPerSecond := 1000;
+end;
+
+destructor TSDLTicks.Destroy;
+begin
+ inherited;
+end;
+
+function TSDLTicks.GetElapsedSeconds : Single;
+var
+ currentTime : Cardinal;
+begin
+ currentTime := SDL_GetTicks;
+
+ result := ( currentTime - FElapsedLastTime ) / FTicksPerSecond;
+
+ // reset the timer
+ FElapsedLastTime := currentTime;
+end;
+
+function TSDLTicks.GetFPS : Single;
+var
+ currentTime, FrameTime : UInt32;
+ fps : single;
+begin
+ currentTime := SDL_GetTicks;
+
+ FrameTime := ( currentTime - FFPSLastTime );
+
+ if FrameTime = 0 then
+ FrameTime := 1;
+
+ fps := FTicksPerSecond / FrameTime;
+
+ // reset the timer
+ FFPSLastTime := currentTime;
+ result := fps;
+end;
+
+function TSDLTicks.Init : boolean;
+begin
+ FStartTime := SDL_GetTicks;
+ FElapsedLastTime := FStartTime;
+ FFPSLastTime := FStartTime;
+ FLockFPSLastTime := FStartTime;
+ result := true;
+end;
+
+procedure TSDLTicks.LockFPS( targetFPS : Byte );
+var
+ currentTime : UInt32;
+ targetTime : single;
+begin
+ if ( targetFPS = 0 ) then
+ targetFPS := 1;
+
+ targetTime := FTicksPerSecond / targetFPS;
+
+ // delay to maintain a constant frame rate
+ repeat
+ currentTime := SDL_GetTicks;
+ until ( ( currentTime - FLockFPSLastTime ) > targetTime );
+
+ // reset the timer
+ FLockFPSLastTime := currentTime;
+end;
+
+end.
+
+ \ No newline at end of file
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlutils.pas b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlutils.pas
new file mode 100644
index 00000000..b15fa9ba
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlutils.pas
@@ -0,0 +1,4361 @@
+unit sdlutils;
+{
+ $Id: sdlutils.pas,v 1.5 2006/11/19 18:56:44 savage Exp $
+
+}
+{******************************************************************************}
+{ }
+{ Borland Delphi SDL - Simple DirectMedia Layer }
+{ SDL Utility functions }
+{ }
+{ }
+{ The initial developer of this Pascal code was : }
+{ Tom Jones <tigertomjones@gmx.de> }
+{ }
+{ Portions created by Tom Jones are }
+{ Copyright (C) 2000 - 2001 Tom Jones. }
+{ }
+{ }
+{ Contributor(s) }
+{ -------------- }
+{ Dominique Louis <Dominique@SavageSoftware.com.au> }
+{ Róbert Kisnémeth <mikrobi@freemail.hu> }
+{ }
+{ Obtained through: }
+{ Joint Endeavour of Delphi Innovators ( Project JEDI ) }
+{ }
+{ You may retrieve the latest version of this file at the Project }
+{ JEDI home page, located at http://delphi-jedi.org }
+{ }
+{ The contents of this file are used with permission, subject to }
+{ the Mozilla Public License Version 1.1 (the "License"); you may }
+{ not use this file except in compliance with the License. You may }
+{ obtain a copy of the License at }
+{ http://www.mozilla.org/MPL/MPL-1.1.html }
+{ }
+{ Software distributed under the License is distributed on an }
+{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
+{ implied. See the License for the specific language governing }
+{ rights and limitations under the License. }
+{ }
+{ Description }
+{ ----------- }
+{ Helper functions... }
+{ }
+{ }
+{ Requires }
+{ -------- }
+{ SDL.dll on Windows platforms }
+{ libSDL-1.1.so.0 on Linux platform }
+{ }
+{ Programming Notes }
+{ ----------------- }
+{ }
+{ }
+{ }
+{ }
+{ Revision History }
+{ ---------------- }
+{ 2000 - TJ : Initial creation }
+{ }
+{ July 13 2001 - DL : Added PutPixel and GetPixel routines. }
+{ }
+{ Sept 14 2001 - RK : Added flipping routines. }
+{ }
+{ Sept 19 2001 - RK : Added PutPixel & line drawing & blitting with ADD }
+{ effect. Fixed a bug in SDL_PutPixel & SDL_GetPixel }
+{ Added PSDLRect() }
+{ Sept 22 2001 - DL : Removed need for Windows.pas by defining types here}
+{ Also removed by poor attempt or a dialog box }
+{ }
+{ Sept 25 2001 - RK : Added PixelTest, NewPutPixel, SubPixel, SubLine, }
+{ SubSurface, MonoSurface & TexturedSurface }
+{ }
+{ Sept 26 2001 - DL : Made change so that it refers to native Pascal }
+{ types rather that Windows types. This makes it more}
+{ portable to Linix. }
+{ }
+{ Sept 27 2001 - RK : SDLUtils now can be compiled with FreePascal }
+{ }
+{ Oct 27 2001 - JF : Added ScrollY function }
+{ }
+{ Jan 21 2002 - RK : Added SDL_ZoomSurface and SDL_WarpSurface }
+{ }
+{ Mar 28 2002 - JF : Added SDL_RotateSurface }
+{ }
+{ May 13 2002 - RK : Improved SDL_FillRectAdd & SDL_FillRectSub }
+{ }
+{ May 27 2002 - YS : GradientFillRect function }
+{ }
+{ May 30 2002 - RK : Added SDL_2xBlit, SDL_Scanline2xBlit }
+{ & SDL_50Scanline2xBlit }
+{ }
+{ June 12 2002 - RK : Added SDL_PixelTestSurfaceVsRect }
+{ }
+{ June 12 2002 - JF : Updated SDL_PixelTestSurfaceVsRect }
+{ }
+{ November 9 2002 - JF : Added Jason's boolean Surface functions }
+{ }
+{ December 10 2002 - DE : Added Dean's SDL_ClipLine function }
+{ }
+{ April 26 2003 - SS : Incorporated JF's changes to SDL_ClipLine }
+{ Fixed SDL_ClipLine bug for non-zero cliprect x, y }
+{ Added overloaded SDL_DrawLine for dashed lines }
+{ }
+{******************************************************************************}
+{
+ $Log: sdlutils.pas,v $
+ Revision 1.5 2006/11/19 18:56:44 savage
+ Removed Hints and Warnings.
+
+ Revision 1.4 2004/06/02 19:38:53 savage
+ Changes to SDL_GradientFillRect as suggested by
+ Ángel Eduardo García Hernández. Many thanks.
+
+ Revision 1.3 2004/05/29 23:11:54 savage
+ Changes to SDL_ScaleSurfaceRect as suggested by
+ Ángel Eduardo García Hernández to fix a colour issue with the function. Many thanks.
+
+ Revision 1.2 2004/02/14 00:23:39 savage
+ As UNIX is defined in jedi-sdl.inc this will be used to check linux compatability as well. Units have been changed to reflect this change.
+
+ Revision 1.1 2004/02/05 00:08:20 savage
+ Module 1.0 release
+
+
+}
+
+interface
+
+{$I jedi-sdl.inc}
+
+uses
+{$IFDEF UNIX}
+ Types,
+ Xlib,
+{$ENDIF}
+ SysUtils,
+ sdl;
+
+type
+ TGradientStyle = ( gsHorizontal, gsVertical );
+
+// Pixel procedures
+function SDL_PixelTest( SrcSurface1 : PSDL_Surface; SrcRect1 : PSDL_Rect; SrcSurface2 :
+ PSDL_Surface; SrcRect2 : PSDL_Rect; Left1, Top1, Left2, Top2 : integer ) : Boolean;
+
+function SDL_GetPixel( SrcSurface : PSDL_Surface; x : integer; y : integer ) : Uint32;
+
+procedure SDL_PutPixel( DstSurface : PSDL_Surface; x : integer; y : integer; pixel :
+ Uint32 );
+
+procedure SDL_AddPixel( DstSurface : PSDL_Surface; x : cardinal; y : cardinal; Color :
+ cardinal );
+
+procedure SDL_SubPixel( DstSurface : PSDL_Surface; x : cardinal; y : cardinal; Color :
+ cardinal );
+
+// Line procedures
+procedure SDL_DrawLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
+ cardinal ); overload;
+
+procedure SDL_DrawLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
+ cardinal; DashLength, DashSpace : byte ); overload;
+
+procedure SDL_AddLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
+ cardinal );
+
+procedure SDL_SubLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
+ cardinal );
+
+// Surface procedures
+procedure SDL_AddSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
+
+procedure SDL_SubSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
+
+procedure SDL_MonoSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect; Color : cardinal );
+
+procedure SDL_TexturedSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect; Texture : PSDL_Surface;
+ TextureRect : PSDL_Rect );
+
+procedure SDL_ZoomSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect; DstSurface : PSDL_Surface; DstRect : PSDL_Rect );
+
+procedure SDL_WarpSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect; DstSurface : PSDL_Surface; UL, UR, LR, LL : PPoint );
+
+// Flip procedures
+procedure SDL_FlipRectH( DstSurface : PSDL_Surface; Rect : PSDL_Rect );
+
+procedure SDL_FlipRectV( DstSurface : PSDL_Surface; Rect : PSDL_Rect );
+
+function PSDLRect( aLeft, aTop, aWidth, aHeight : integer ) : PSDL_Rect;
+
+function SDLRect( aLeft, aTop, aWidth, aHeight : integer ) : TSDL_Rect; overload;
+
+function SDLRect( aRect : TRect ) : TSDL_Rect; overload;
+
+function SDL_ScaleSurfaceRect( SrcSurface : PSDL_Surface; SrcX1, SrcY1, SrcW, SrcH,
+ Width, Height : integer ) : PSDL_Surface;
+
+procedure SDL_ScrollY( DstSurface : PSDL_Surface; DifY : integer );
+
+procedure SDL_ScrollX( DstSurface : PSDL_Surface; DifX : integer );
+
+procedure SDL_RotateDeg( DstSurface, SrcSurface : PSDL_Surface; SrcRect :
+ PSDL_Rect; DestX, DestY, OffsetX, OffsetY : Integer; Angle : Integer );
+
+procedure SDL_RotateRad( DstSurface, SrcSurface : PSDL_Surface; SrcRect :
+ PSDL_Rect; DestX, DestY, OffsetX, OffsetY : Integer; Angle : Single );
+
+function ValidateSurfaceRect( DstSurface : PSDL_Surface; dstrect : PSDL_Rect ) : TSDL_Rect;
+
+// Fill Rect routine
+procedure SDL_FillRectAdd( DstSurface : PSDL_Surface; dstrect : PSDL_Rect; color : UInt32 );
+
+procedure SDL_FillRectSub( DstSurface : PSDL_Surface; dstrect : PSDL_Rect; color : UInt32 );
+
+procedure SDL_GradientFillRect( DstSurface : PSDL_Surface; const Rect : PSDL_Rect; const StartColor, EndColor : TSDL_Color; const Style : TGradientStyle );
+
+// NOTE for All SDL_2xblit... function : the dest surface must be 2x of the source surface!
+procedure SDL_2xBlit( Src, Dest : PSDL_Surface );
+
+procedure SDL_Scanline2xBlit( Src, Dest : PSDL_Surface );
+
+procedure SDL_50Scanline2xBlit( Src, Dest : PSDL_Surface );
+
+//
+function SDL_PixelTestSurfaceVsRect( SrcSurface1 : PSDL_Surface; SrcRect1 :
+ PSDL_Rect; SrcRect2 : PSDL_Rect; Left1, Top1, Left2, Top2 : integer ) :
+ boolean;
+
+// Jason's boolean Surface functions
+procedure SDL_ORSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
+
+procedure SDL_ANDSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
+
+
+procedure SDL_GTSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
+
+procedure SDL_LTSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
+
+function SDL_ClipLine( var x1, y1, x2, y2 : Integer; ClipRect : PSDL_Rect ) : boolean;
+
+implementation
+
+uses
+ Math;
+
+function SDL_PixelTest( SrcSurface1 : PSDL_Surface; SrcRect1 : PSDL_Rect; SrcSurface2 :
+ PSDL_Surface; SrcRect2 : PSDL_Rect; Left1, Top1, Left2, Top2 : integer ) : boolean;
+var
+ Src_Rect1, Src_Rect2 : TSDL_Rect;
+ right1, bottom1 : integer;
+ right2, bottom2 : integer;
+ Scan1Start, Scan2Start, ScanWidth, ScanHeight : cardinal;
+ Mod1, Mod2 : cardinal;
+ Addr1, Addr2 : cardinal;
+ BPP : cardinal;
+ Pitch1, Pitch2 : cardinal;
+ TransparentColor1, TransparentColor2 : cardinal;
+ tx, ty : cardinal;
+ StartTick : cardinal;
+ Color1, Color2 : cardinal;
+begin
+ Result := false;
+ if SrcRect1 = nil then
+ begin
+ with Src_Rect1 do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface1.w;
+ h := SrcSurface1.h;
+ end;
+ end
+ else
+ Src_Rect1 := SrcRect1^;
+ if SrcRect2 = nil then
+ begin
+ with Src_Rect2 do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface2.w;
+ h := SrcSurface2.h;
+ end;
+ end
+ else
+ Src_Rect2 := SrcRect2^;
+ with Src_Rect1 do
+ begin
+ Right1 := Left1 + w;
+ Bottom1 := Top1 + h;
+ end;
+ with Src_Rect2 do
+ begin
+ Right2 := Left2 + w;
+ Bottom2 := Top2 + h;
+ end;
+ if ( Left1 >= Right2 ) or ( Right1 <= Left2 ) or ( Top1 >= Bottom2 ) or ( Bottom1 <=
+ Top2 ) then
+ exit;
+ if Left1 <= Left2 then
+ begin
+ // 1. left, 2. right
+ Scan1Start := Src_Rect1.x + Left2 - Left1;
+ Scan2Start := Src_Rect2.x;
+ ScanWidth := Right1 - Left2;
+ with Src_Rect2 do
+ if ScanWidth > w then
+ ScanWidth := w;
+ end
+ else
+ begin
+ // 1. right, 2. left
+ Scan1Start := Src_Rect1.x;
+ Scan2Start := Src_Rect2.x + Left1 - Left2;
+ ScanWidth := Right2 - Left1;
+ with Src_Rect1 do
+ if ScanWidth > w then
+ ScanWidth := w;
+ end;
+ with SrcSurface1^ do
+ begin
+ Pitch1 := Pitch;
+ Addr1 := cardinal( Pixels );
+ inc( Addr1, Pitch1 * UInt32( Src_Rect1.y ) );
+ with format^ do
+ begin
+ BPP := BytesPerPixel;
+ TransparentColor1 := colorkey;
+ end;
+ end;
+ with SrcSurface2^ do
+ begin
+ TransparentColor2 := format.colorkey;
+ Pitch2 := Pitch;
+ Addr2 := cardinal( Pixels );
+ inc( Addr2, Pitch2 * UInt32( Src_Rect2.y ) );
+ end;
+ Mod1 := Pitch1 - ( ScanWidth * BPP );
+ Mod2 := Pitch2 - ( ScanWidth * BPP );
+ inc( Addr1, BPP * Scan1Start );
+ inc( Addr2, BPP * Scan2Start );
+ if Top1 <= Top2 then
+ begin
+ // 1. up, 2. down
+ ScanHeight := Bottom1 - Top2;
+ if ScanHeight > Src_Rect2.h then
+ ScanHeight := Src_Rect2.h;
+ inc( Addr1, Pitch1 * UInt32( Top2 - Top1 ) );
+ end
+ else
+ begin
+ // 1. down, 2. up
+ ScanHeight := Bottom2 - Top1;
+ if ScanHeight > Src_Rect1.h then
+ ScanHeight := Src_Rect1.h;
+ inc( Addr2, Pitch2 * UInt32( Top1 - Top2 ) );
+ end;
+ case BPP of
+ 1 :
+ for ty := 1 to ScanHeight do
+ begin
+ for tx := 1 to ScanWidth do
+ begin
+ if ( PByte( Addr1 )^ <> TransparentColor1 ) and ( PByte( Addr2 )^ <>
+ TransparentColor2 ) then
+ begin
+ Result := true;
+ exit;
+ end;
+ inc( Addr1 );
+ inc( Addr2 );
+ end;
+ inc( Addr1, Mod1 );
+ inc( Addr2, Mod2 );
+ end;
+ 2 :
+ for ty := 1 to ScanHeight do
+ begin
+ for tx := 1 to ScanWidth do
+ begin
+ if ( PWord( Addr1 )^ <> TransparentColor1 ) and ( PWord( Addr2 )^ <>
+ TransparentColor2 ) then
+ begin
+ Result := true;
+ exit;
+ end;
+ inc( Addr1, 2 );
+ inc( Addr2, 2 );
+ end;
+ inc( Addr1, Mod1 );
+ inc( Addr2, Mod2 );
+ end;
+ 3 :
+ for ty := 1 to ScanHeight do
+ begin
+ for tx := 1 to ScanWidth do
+ begin
+ Color1 := PLongWord( Addr1 )^ and $00FFFFFF;
+ Color2 := PLongWord( Addr2 )^ and $00FFFFFF;
+ if ( Color1 <> TransparentColor1 ) and ( Color2 <> TransparentColor2 )
+ then
+ begin
+ Result := true;
+ exit;
+ end;
+ inc( Addr1, 3 );
+ inc( Addr2, 3 );
+ end;
+ inc( Addr1, Mod1 );
+ inc( Addr2, Mod2 );
+ end;
+ 4 :
+ for ty := 1 to ScanHeight do
+ begin
+ for tx := 1 to ScanWidth do
+ begin
+ if ( PLongWord( Addr1 )^ <> TransparentColor1 ) and ( PLongWord( Addr2 )^ <>
+ TransparentColor2 ) then
+ begin
+ Result := true;
+ exit;
+ end;
+ inc( Addr1, 4 );
+ inc( Addr2, 4 );
+ end;
+ inc( Addr1, Mod1 );
+ inc( Addr2, Mod2 );
+ end;
+ end;
+end;
+
+procedure SDL_AddPixel( DstSurface : PSDL_Surface; x : cardinal; y : cardinal; Color :
+ cardinal );
+var
+ SrcColor : cardinal;
+ Addr : cardinal;
+ R, G, B : cardinal;
+begin
+ if Color = 0 then
+ exit;
+ with DstSurface^ do
+ begin
+ Addr := cardinal( Pixels ) + y * Pitch + x * format.BytesPerPixel;
+ SrcColor := PUInt32( Addr )^;
+ case format.BitsPerPixel of
+ 8 :
+ begin
+ R := SrcColor and $E0 + Color and $E0;
+ G := SrcColor and $1C + Color and $1C;
+ B := SrcColor and $03 + Color and $03;
+ if R > $E0 then
+ R := $E0;
+ if G > $1C then
+ G := $1C;
+ if B > $03 then
+ B := $03;
+ PUInt8( Addr )^ := R or G or B;
+ end;
+ 15 :
+ begin
+ R := SrcColor and $7C00 + Color and $7C00;
+ G := SrcColor and $03E0 + Color and $03E0;
+ B := SrcColor and $001F + Color and $001F;
+ if R > $7C00 then
+ R := $7C00;
+ if G > $03E0 then
+ G := $03E0;
+ if B > $001F then
+ B := $001F;
+ PUInt16( Addr )^ := R or G or B;
+ end;
+ 16 :
+ begin
+ R := SrcColor and $F800 + Color and $F800;
+ G := SrcColor and $07C0 + Color and $07C0;
+ B := SrcColor and $001F + Color and $001F;
+ if R > $F800 then
+ R := $F800;
+ if G > $07C0 then
+ G := $07C0;
+ if B > $001F then
+ B := $001F;
+ PUInt16( Addr )^ := R or G or B;
+ end;
+ 24 :
+ begin
+ R := SrcColor and $00FF0000 + Color and $00FF0000;
+ G := SrcColor and $0000FF00 + Color and $0000FF00;
+ B := SrcColor and $000000FF + Color and $000000FF;
+ if R > $FF0000 then
+ R := $FF0000;
+ if G > $00FF00 then
+ G := $00FF00;
+ if B > $0000FF then
+ B := $0000FF;
+ PUInt32( Addr )^ := SrcColor and $FF000000 or R or G or B;
+ end;
+ 32 :
+ begin
+ R := SrcColor and $00FF0000 + Color and $00FF0000;
+ G := SrcColor and $0000FF00 + Color and $0000FF00;
+ B := SrcColor and $000000FF + Color and $000000FF;
+ if R > $FF0000 then
+ R := $FF0000;
+ if G > $00FF00 then
+ G := $00FF00;
+ if B > $0000FF then
+ B := $0000FF;
+ PUInt32( Addr )^ := R or G or B;
+ end;
+ end;
+ end;
+end;
+
+procedure SDL_SubPixel( DstSurface : PSDL_Surface; x : cardinal; y : cardinal; Color :
+ cardinal );
+var
+ SrcColor : cardinal;
+ Addr : cardinal;
+ R, G, B : cardinal;
+begin
+ if Color = 0 then
+ exit;
+ with DstSurface^ do
+ begin
+ Addr := cardinal( Pixels ) + y * Pitch + x * format.BytesPerPixel;
+ SrcColor := PUInt32( Addr )^;
+ case format.BitsPerPixel of
+ 8 :
+ begin
+ R := SrcColor and $E0 - Color and $E0;
+ G := SrcColor and $1C - Color and $1C;
+ B := SrcColor and $03 - Color and $03;
+ if R > $E0 then
+ R := 0;
+ if G > $1C then
+ G := 0;
+ if B > $03 then
+ B := 0;
+ PUInt8( Addr )^ := R or G or B;
+ end;
+ 15 :
+ begin
+ R := SrcColor and $7C00 - Color and $7C00;
+ G := SrcColor and $03E0 - Color and $03E0;
+ B := SrcColor and $001F - Color and $001F;
+ if R > $7C00 then
+ R := 0;
+ if G > $03E0 then
+ G := 0;
+ if B > $001F then
+ B := 0;
+ PUInt16( Addr )^ := R or G or B;
+ end;
+ 16 :
+ begin
+ R := SrcColor and $F800 - Color and $F800;
+ G := SrcColor and $07C0 - Color and $07C0;
+ B := SrcColor and $001F - Color and $001F;
+ if R > $F800 then
+ R := 0;
+ if G > $07C0 then
+ G := 0;
+ if B > $001F then
+ B := 0;
+ PUInt16( Addr )^ := R or G or B;
+ end;
+ 24 :
+ begin
+ R := SrcColor and $00FF0000 - Color and $00FF0000;
+ G := SrcColor and $0000FF00 - Color and $0000FF00;
+ B := SrcColor and $000000FF - Color and $000000FF;
+ if R > $FF0000 then
+ R := 0;
+ if G > $00FF00 then
+ G := 0;
+ if B > $0000FF then
+ B := 0;
+ PUInt32( Addr )^ := SrcColor and $FF000000 or R or G or B;
+ end;
+ 32 :
+ begin
+ R := SrcColor and $00FF0000 - Color and $00FF0000;
+ G := SrcColor and $0000FF00 - Color and $0000FF00;
+ B := SrcColor and $000000FF - Color and $000000FF;
+ if R > $FF0000 then
+ R := 0;
+ if G > $00FF00 then
+ G := 0;
+ if B > $0000FF then
+ B := 0;
+ PUInt32( Addr )^ := R or G or B;
+ end;
+ end;
+ end;
+end;
+// This procedure works on 8, 15, 16, 24 and 32 bits color depth surfaces.
+// In 8 bit color depth mode the procedure works with the default packed
+// palette (RRRGGGBB). It handles all clipping.
+
+procedure SDL_AddSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
+var
+ R, G, B, Pixel1, Pixel2, TransparentColor : cardinal;
+ Src, Dest : TSDL_Rect;
+ Diff : integer;
+ SrcAddr, DestAddr : cardinal;
+ WorkX, WorkY : word;
+ SrcMod, DestMod : cardinal;
+ Bits : cardinal;
+begin
+ if ( SrcSurface = nil ) or ( DestSurface = nil ) then
+ exit; // Remove this to make it faster
+ if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
+ exit; // Remove this to make it faster
+ if SrcRect = nil then
+ begin
+ with Src do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface.w;
+ h := SrcSurface.h;
+ end;
+ end
+ else
+ Src := SrcRect^;
+ if DestRect = nil then
+ begin
+ Dest.x := 0;
+ Dest.y := 0;
+ end
+ else
+ Dest := DestRect^;
+ Dest.w := Src.w;
+ Dest.h := Src.h;
+ with DestSurface.Clip_Rect do
+ begin
+ // Source's right side is greater than the dest.cliprect
+ if Dest.x + Src.w > x + w then
+ begin
+ smallint( Src.w ) := x + w - Dest.x;
+ smallint( Dest.w ) := x + w - Dest.x;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's bottom side is greater than the dest.clip
+ if Dest.y + Src.h > y + h then
+ begin
+ smallint( Src.h ) := y + h - Dest.y;
+ smallint( Dest.h ) := y + h - Dest.y;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ // Source's left side is less than the dest.clip
+ if Dest.x < x then
+ begin
+ Diff := x - Dest.x;
+ Src.x := Src.x + Diff;
+ smallint( Src.w ) := smallint( Src.w ) - Diff;
+ Dest.x := x;
+ smallint( Dest.w ) := smallint( Dest.w ) - Diff;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's Top side is less than the dest.clip
+ if Dest.y < y then
+ begin
+ Diff := y - Dest.y;
+ Src.y := Src.y + Diff;
+ smallint( Src.h ) := smallint( Src.h ) - Diff;
+ Dest.y := y;
+ smallint( Dest.h ) := smallint( Dest.h ) - Diff;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ end;
+ with SrcSurface^ do
+ begin
+ SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
+ Format.BytesPerPixel;
+ SrcMod := Pitch - Src.w * Format.BytesPerPixel;
+ TransparentColor := Format.colorkey;
+ end;
+ with DestSurface^ do
+ begin
+ DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
+ Format.BytesPerPixel;
+ DestMod := Pitch - Dest.w * Format.BytesPerPixel;
+ Bits := Format.BitsPerPixel;
+ end;
+ SDL_LockSurface( SrcSurface );
+ SDL_LockSurface( DestSurface );
+ WorkY := Src.h;
+ case bits of
+ 8 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt8( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt8( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+ R := Pixel1 and $E0 + Pixel2 and $E0;
+ G := Pixel1 and $1C + Pixel2 and $1C;
+ B := Pixel1 and $03 + Pixel2 and $03;
+ if R > $E0 then
+ R := $E0;
+ if G > $1C then
+ G := $1C;
+ if B > $03 then
+ B := $03;
+ PUInt8( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt8( DestAddr )^ := Pixel1;
+ end;
+ inc( SrcAddr );
+ inc( DestAddr );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 15 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt16( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt16( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+ R := Pixel1 and $7C00 + Pixel2 and $7C00;
+ G := Pixel1 and $03E0 + Pixel2 and $03E0;
+ B := Pixel1 and $001F + Pixel2 and $001F;
+ if R > $7C00 then
+ R := $7C00;
+ if G > $03E0 then
+ G := $03E0;
+ if B > $001F then
+ B := $001F;
+ PUInt16( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt16( DestAddr )^ := Pixel1;
+ end;
+ inc( SrcAddr, 2 );
+ inc( DestAddr, 2 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 16 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt16( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt16( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+ R := Pixel1 and $F800 + Pixel2 and $F800;
+ G := Pixel1 and $07E0 + Pixel2 and $07E0;
+ B := Pixel1 and $001F + Pixel2 and $001F;
+ if R > $F800 then
+ R := $F800;
+ if G > $07E0 then
+ G := $07E0;
+ if B > $001F then
+ B := $001F;
+ PUInt16( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt16( DestAddr )^ := Pixel1;
+ end;
+ inc( SrcAddr, 2 );
+ inc( DestAddr, 2 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 24 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt32( SrcAddr )^ and $00FFFFFF;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt32( DestAddr )^ and $00FFFFFF;
+ if Pixel2 > 0 then
+ begin
+ R := Pixel1 and $FF0000 + Pixel2 and $FF0000;
+ G := Pixel1 and $00FF00 + Pixel2 and $00FF00;
+ B := Pixel1 and $0000FF + Pixel2 and $0000FF;
+ if R > $FF0000 then
+ R := $FF0000;
+ if G > $00FF00 then
+ G := $00FF00;
+ if B > $0000FF then
+ B := $0000FF;
+ PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or ( R or G or B );
+ end
+ else
+ PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or Pixel1;
+ end;
+ inc( SrcAddr, 3 );
+ inc( DestAddr, 3 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 32 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt32( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt32( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+ R := Pixel1 and $FF0000 + Pixel2 and $FF0000;
+ G := Pixel1 and $00FF00 + Pixel2 and $00FF00;
+ B := Pixel1 and $0000FF + Pixel2 and $0000FF;
+ if R > $FF0000 then
+ R := $FF0000;
+ if G > $00FF00 then
+ G := $00FF00;
+ if B > $0000FF then
+ B := $0000FF;
+ PUInt32( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt32( DestAddr )^ := Pixel1;
+ end;
+ inc( SrcAddr, 4 );
+ inc( DestAddr, 4 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ end;
+ SDL_UnlockSurface( SrcSurface );
+ SDL_UnlockSurface( DestSurface );
+end;
+
+procedure SDL_SubSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
+var
+ R, G, B, Pixel1, Pixel2, TransparentColor : cardinal;
+ Src, Dest : TSDL_Rect;
+ Diff : integer;
+ SrcAddr, DestAddr : cardinal;
+ _ebx, _esi, _edi, _esp : cardinal;
+ WorkX, WorkY : word;
+ SrcMod, DestMod : cardinal;
+ Bits : cardinal;
+begin
+ if ( SrcSurface = nil ) or ( DestSurface = nil ) then
+ exit; // Remove this to make it faster
+ if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
+ exit; // Remove this to make it faster
+ if SrcRect = nil then
+ begin
+ with Src do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface.w;
+ h := SrcSurface.h;
+ end;
+ end
+ else
+ Src := SrcRect^;
+ if DestRect = nil then
+ begin
+ Dest.x := 0;
+ Dest.y := 0;
+ end
+ else
+ Dest := DestRect^;
+ Dest.w := Src.w;
+ Dest.h := Src.h;
+ with DestSurface.Clip_Rect do
+ begin
+ // Source's right side is greater than the dest.cliprect
+ if Dest.x + Src.w > x + w then
+ begin
+ smallint( Src.w ) := x + w - Dest.x;
+ smallint( Dest.w ) := x + w - Dest.x;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's bottom side is greater than the dest.clip
+ if Dest.y + Src.h > y + h then
+ begin
+ smallint( Src.h ) := y + h - Dest.y;
+ smallint( Dest.h ) := y + h - Dest.y;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ // Source's left side is less than the dest.clip
+ if Dest.x < x then
+ begin
+ Diff := x - Dest.x;
+ Src.x := Src.x + Diff;
+ smallint( Src.w ) := smallint( Src.w ) - Diff;
+ Dest.x := x;
+ smallint( Dest.w ) := smallint( Dest.w ) - Diff;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's Top side is less than the dest.clip
+ if Dest.y < y then
+ begin
+ Diff := y - Dest.y;
+ Src.y := Src.y + Diff;
+ smallint( Src.h ) := smallint( Src.h ) - Diff;
+ Dest.y := y;
+ smallint( Dest.h ) := smallint( Dest.h ) - Diff;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ end;
+ with SrcSurface^ do
+ begin
+ SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
+ Format.BytesPerPixel;
+ SrcMod := Pitch - Src.w * Format.BytesPerPixel;
+ TransparentColor := Format.colorkey;
+ end;
+ with DestSurface^ do
+ begin
+ DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
+ Format.BytesPerPixel;
+ DestMod := Pitch - Dest.w * Format.BytesPerPixel;
+ Bits := DestSurface.Format.BitsPerPixel;
+ end;
+ SDL_LockSurface( SrcSurface );
+ SDL_LockSurface( DestSurface );
+ WorkY := Src.h;
+ case bits of
+ 8 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt8( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt8( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+ R := Pixel2 and $E0 - Pixel1 and $E0;
+ G := Pixel2 and $1C - Pixel1 and $1C;
+ B := Pixel2 and $03 - Pixel1 and $03;
+ if R > $E0 then
+ R := 0;
+ if G > $1C then
+ G := 0;
+ if B > $03 then
+ B := 0;
+ PUInt8( DestAddr )^ := R or G or B;
+ end;
+ end;
+ inc( SrcAddr );
+ inc( DestAddr );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 15 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt16( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt16( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+ R := Pixel2 and $7C00 - Pixel1 and $7C00;
+ G := Pixel2 and $03E0 - Pixel1 and $03E0;
+ B := Pixel2 and $001F - Pixel1 and $001F;
+ if R > $7C00 then
+ R := 0;
+ if G > $03E0 then
+ G := 0;
+ if B > $001F then
+ B := 0;
+ PUInt16( DestAddr )^ := R or G or B;
+ end;
+ end;
+ inc( SrcAddr, 2 );
+ inc( DestAddr, 2 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 16 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt16( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt16( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+ R := Pixel2 and $F800 - Pixel1 and $F800;
+ G := Pixel2 and $07E0 - Pixel1 and $07E0;
+ B := Pixel2 and $001F - Pixel1 and $001F;
+ if R > $F800 then
+ R := 0;
+ if G > $07E0 then
+ G := 0;
+ if B > $001F then
+ B := 0;
+ PUInt16( DestAddr )^ := R or G or B;
+ end;
+ end;
+ inc( SrcAddr, 2 );
+ inc( DestAddr, 2 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 24 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt32( SrcAddr )^ and $00FFFFFF;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt32( DestAddr )^ and $00FFFFFF;
+ if Pixel2 > 0 then
+ begin
+ R := Pixel2 and $FF0000 - Pixel1 and $FF0000;
+ G := Pixel2 and $00FF00 - Pixel1 and $00FF00;
+ B := Pixel2 and $0000FF - Pixel1 and $0000FF;
+ if R > $FF0000 then
+ R := 0;
+ if G > $00FF00 then
+ G := 0;
+ if B > $0000FF then
+ B := 0;
+ PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or ( R or G or B );
+ end;
+ end;
+ inc( SrcAddr, 3 );
+ inc( DestAddr, 3 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 32 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt32( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt32( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+ R := Pixel2 and $FF0000 - Pixel1 and $FF0000;
+ G := Pixel2 and $00FF00 - Pixel1 and $00FF00;
+ B := Pixel2 and $0000FF - Pixel1 and $0000FF;
+ if R > $FF0000 then
+ R := 0;
+ if G > $00FF00 then
+ G := 0;
+ if B > $0000FF then
+ B := 0;
+ PUInt32( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt32( DestAddr )^ := Pixel2;
+ end;
+ inc( SrcAddr, 4 );
+ inc( DestAddr, 4 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ end;
+ SDL_UnlockSurface( SrcSurface );
+ SDL_UnlockSurface( DestSurface );
+end;
+
+procedure SDL_MonoSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect; Color : cardinal );
+var
+ Src, Dest : TSDL_Rect;
+ Diff : integer;
+ SrcAddr, DestAddr : cardinal;
+ _ebx, _esi, _edi, _esp : cardinal;
+ WorkX, WorkY : word;
+ SrcMod, DestMod : cardinal;
+ TransparentColor, SrcColor : cardinal;
+ BPP : cardinal;
+begin
+ if ( SrcSurface = nil ) or ( DestSurface = nil ) then
+ exit; // Remove this to make it faster
+ if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
+ exit; // Remove this to make it faster
+ if SrcRect = nil then
+ begin
+ with Src do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface.w;
+ h := SrcSurface.h;
+ end;
+ end
+ else
+ Src := SrcRect^;
+ if DestRect = nil then
+ begin
+ Dest.x := 0;
+ Dest.y := 0;
+ end
+ else
+ Dest := DestRect^;
+ Dest.w := Src.w;
+ Dest.h := Src.h;
+ with DestSurface.Clip_Rect do
+ begin
+ // Source's right side is greater than the dest.cliprect
+ if Dest.x + Src.w > x + w then
+ begin
+ smallint( Src.w ) := x + w - Dest.x;
+ smallint( Dest.w ) := x + w - Dest.x;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's bottom side is greater than the dest.clip
+ if Dest.y + Src.h > y + h then
+ begin
+ smallint( Src.h ) := y + h - Dest.y;
+ smallint( Dest.h ) := y + h - Dest.y;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ // Source's left side is less than the dest.clip
+ if Dest.x < x then
+ begin
+ Diff := x - Dest.x;
+ Src.x := Src.x + Diff;
+ smallint( Src.w ) := smallint( Src.w ) - Diff;
+ Dest.x := x;
+ smallint( Dest.w ) := smallint( Dest.w ) - Diff;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's Top side is less than the dest.clip
+ if Dest.y < y then
+ begin
+ Diff := y - Dest.y;
+ Src.y := Src.y + Diff;
+ smallint( Src.h ) := smallint( Src.h ) - Diff;
+ Dest.y := y;
+ smallint( Dest.h ) := smallint( Dest.h ) - Diff;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ end;
+ with SrcSurface^ do
+ begin
+ SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
+ Format.BytesPerPixel;
+ SrcMod := Pitch - Src.w * Format.BytesPerPixel;
+ TransparentColor := Format.colorkey;
+ end;
+ with DestSurface^ do
+ begin
+ DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
+ Format.BytesPerPixel;
+ DestMod := Pitch - Dest.w * Format.BytesPerPixel;
+ BPP := DestSurface.Format.BytesPerPixel;
+ end;
+ SDL_LockSurface( SrcSurface );
+ SDL_LockSurface( DestSurface );
+ WorkY := Src.h;
+ case BPP of
+ 1 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ SrcColor := PUInt8( SrcAddr )^;
+ if SrcColor <> TransparentColor then
+ PUInt8( DestAddr )^ := SrcColor;
+ inc( SrcAddr );
+ inc( DestAddr );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 2 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ SrcColor := PUInt16( SrcAddr )^;
+ if SrcColor <> TransparentColor then
+ PUInt16( DestAddr )^ := SrcColor;
+ inc( SrcAddr );
+ inc( DestAddr );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 3 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ SrcColor := PUInt32( SrcAddr )^ and $FFFFFF;
+ if SrcColor <> TransparentColor then
+ PUInt32( DestAddr )^ := ( PUInt32( DestAddr )^ and $FFFFFF ) or SrcColor;
+ inc( SrcAddr );
+ inc( DestAddr );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 4 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ SrcColor := PUInt32( SrcAddr )^;
+ if SrcColor <> TransparentColor then
+ PUInt32( DestAddr )^ := SrcColor;
+ inc( SrcAddr );
+ inc( DestAddr );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ end;
+ SDL_UnlockSurface( SrcSurface );
+ SDL_UnlockSurface( DestSurface );
+end;
+// TextureRect.w and TextureRect.h are not used.
+// The TextureSurface's size MUST larger than the drawing rectangle!!!
+
+procedure SDL_TexturedSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect; Texture : PSDL_Surface;
+ TextureRect : PSDL_Rect );
+var
+ Src, Dest : TSDL_Rect;
+ Diff : integer;
+ SrcAddr, DestAddr, TextAddr : cardinal;
+ _ebx, _esi, _edi, _esp : cardinal;
+ WorkX, WorkY : word;
+ SrcMod, DestMod, TextMod : cardinal;
+ SrcColor, TransparentColor, TextureColor : cardinal;
+ BPP : cardinal;
+begin
+ if ( SrcSurface = nil ) or ( DestSurface = nil ) then
+ exit; // Remove this to make it faster
+ if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
+ exit; // Remove this to make it faster
+ if SrcRect = nil then
+ begin
+ with Src do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface.w;
+ h := SrcSurface.h;
+ end;
+ end
+ else
+ Src := SrcRect^;
+ if DestRect = nil then
+ begin
+ Dest.x := 0;
+ Dest.y := 0;
+ end
+ else
+ Dest := DestRect^;
+ Dest.w := Src.w;
+ Dest.h := Src.h;
+ with DestSurface.Clip_Rect do
+ begin
+ // Source's right side is greater than the dest.cliprect
+ if Dest.x + Src.w > x + w then
+ begin
+ smallint( Src.w ) := x + w - Dest.x;
+ smallint( Dest.w ) := x + w - Dest.x;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's bottom side is greater than the dest.clip
+ if Dest.y + Src.h > y + h then
+ begin
+ smallint( Src.h ) := y + h - Dest.y;
+ smallint( Dest.h ) := y + h - Dest.y;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ // Source's left side is less than the dest.clip
+ if Dest.x < x then
+ begin
+ Diff := x - Dest.x;
+ Src.x := Src.x + Diff;
+ smallint( Src.w ) := smallint( Src.w ) - Diff;
+ Dest.x := x;
+ smallint( Dest.w ) := smallint( Dest.w ) - Diff;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's Top side is less than the dest.clip
+ if Dest.y < y then
+ begin
+ Diff := y - Dest.y;
+ Src.y := Src.y + Diff;
+ smallint( Src.h ) := smallint( Src.h ) - Diff;
+ Dest.y := y;
+ smallint( Dest.h ) := smallint( Dest.h ) - Diff;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ end;
+ with SrcSurface^ do
+ begin
+ SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
+ Format.BytesPerPixel;
+ SrcMod := Pitch - Src.w * Format.BytesPerPixel;
+ TransparentColor := format.colorkey;
+ end;
+ with DestSurface^ do
+ begin
+ DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
+ Format.BytesPerPixel;
+ DestMod := Pitch - Dest.w * Format.BytesPerPixel;
+ BPP := DestSurface.Format.BitsPerPixel;
+ end;
+ with Texture^ do
+ begin
+ TextAddr := cardinal( Pixels ) + UInt32( TextureRect.y ) * Pitch +
+ UInt32( TextureRect.x ) * Format.BytesPerPixel;
+ TextMod := Pitch - Src.w * Format.BytesPerPixel;
+ end;
+ SDL_LockSurface( SrcSurface );
+ SDL_LockSurface( DestSurface );
+ SDL_LockSurface( Texture );
+ WorkY := Src.h;
+ case BPP of
+ 1 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ SrcColor := PUInt8( SrcAddr )^;
+ if SrcColor <> TransparentColor then
+ PUInt8( DestAddr )^ := PUint8( TextAddr )^;
+ inc( SrcAddr );
+ inc( DestAddr );
+ inc( TextAddr );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ inc( TextAddr, TextMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 2 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ SrcColor := PUInt16( SrcAddr )^;
+ if SrcColor <> TransparentColor then
+ PUInt16( DestAddr )^ := PUInt16( TextAddr )^;
+ inc( SrcAddr );
+ inc( DestAddr );
+ inc( TextAddr );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ inc( TextAddr, TextMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 3 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ SrcColor := PUInt32( SrcAddr )^ and $FFFFFF;
+ if SrcColor <> TransparentColor then
+ PUInt32( DestAddr )^ := ( PUInt32( DestAddr )^ and $FFFFFF ) or ( PUInt32( TextAddr )^ and $FFFFFF );
+ inc( SrcAddr );
+ inc( DestAddr );
+ inc( TextAddr );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ inc( TextAddr, TextMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 4 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ SrcColor := PUInt32( SrcAddr )^;
+ if SrcColor <> TransparentColor then
+ PUInt32( DestAddr )^ := PUInt32( TextAddr )^;
+ inc( SrcAddr );
+ inc( DestAddr );
+ inc( TextAddr );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ inc( TextAddr, TextMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ end;
+ SDL_UnlockSurface( SrcSurface );
+ SDL_UnlockSurface( DestSurface );
+ SDL_UnlockSurface( Texture );
+end;
+
+procedure SDL_ZoomSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect; DstSurface : PSDL_Surface; DstRect : PSDL_Rect );
+var
+ xc, yc : cardinal;
+ rx, wx, ry, wy, ry16 : cardinal;
+ color : cardinal;
+ modx, mody : cardinal;
+begin
+ // Warning! No checks for surface pointers!!!
+ if srcrect = nil then
+ srcrect := @SrcSurface.clip_rect;
+ if dstrect = nil then
+ dstrect := @DstSurface.clip_rect;
+ if SDL_MustLock( SrcSurface ) then
+ SDL_LockSurface( SrcSurface );
+ if SDL_MustLock( DstSurface ) then
+ SDL_LockSurface( DstSurface );
+ modx := trunc( ( srcrect.w / dstrect.w ) * 65536 );
+ mody := trunc( ( srcrect.h / dstrect.h ) * 65536 );
+ //rx := srcrect.x * 65536;
+ ry := srcrect.y * 65536;
+ wy := dstrect.y;
+ for yc := 0 to dstrect.h - 1 do
+ begin
+ rx := srcrect.x * 65536;
+ wx := dstrect.x;
+ ry16 := ry shr 16;
+ for xc := 0 to dstrect.w - 1 do
+ begin
+ color := SDL_GetPixel( SrcSurface, rx shr 16, ry16 );
+ SDL_PutPixel( DstSurface, wx, wy, color );
+ rx := rx + modx;
+ inc( wx );
+ end;
+ ry := ry + mody;
+ inc( wy );
+ end;
+ if SDL_MustLock( SrcSurface ) then
+ SDL_UnlockSurface( SrcSurface );
+ if SDL_MustLock( DstSurface ) then
+ SDL_UnlockSurface( DstSurface );
+end;
+// Re-map a rectangular area into an area defined by four vertices
+// Converted from C to Pascal by KiCHY
+
+procedure SDL_WarpSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect; DstSurface : PSDL_Surface; UL, UR, LR, LL : PPoint );
+const
+ SHIFTS = 15; // Extend ints to limit round-off error (try 2 - 20)
+ THRESH = 1 shl SHIFTS; // Threshold for pixel size value
+ procedure CopySourceToDest( UL, UR, LR, LL : TPoint; x1, y1, x2, y2 : cardinal );
+ var
+ tm, lm, rm, bm, m : TPoint;
+ mx, my : cardinal;
+ cr : cardinal;
+ begin
+ // Does the destination area specify a single pixel?
+ if ( ( abs( ul.x - ur.x ) < THRESH ) and
+ ( abs( ul.x - lr.x ) < THRESH ) and
+ ( abs( ul.x - ll.x ) < THRESH ) and
+ ( abs( ul.y - ur.y ) < THRESH ) and
+ ( abs( ul.y - lr.y ) < THRESH ) and
+ ( abs( ul.y - ll.y ) < THRESH ) ) then
+ begin // Yes
+ cr := SDL_GetPixel( SrcSurface, ( x1 shr SHIFTS ), ( y1 shr SHIFTS ) );
+ SDL_PutPixel( DstSurface, ( ul.x shr SHIFTS ), ( ul.y shr SHIFTS ), cr );
+ end
+ else
+ begin // No
+ // Quarter the source and the destination, and then recurse
+ tm.x := ( ul.x + ur.x ) shr 1;
+ tm.y := ( ul.y + ur.y ) shr 1;
+ bm.x := ( ll.x + lr.x ) shr 1;
+ bm.y := ( ll.y + lr.y ) shr 1;
+ lm.x := ( ul.x + ll.x ) shr 1;
+ lm.y := ( ul.y + ll.y ) shr 1;
+ rm.x := ( ur.x + lr.x ) shr 1;
+ rm.y := ( ur.y + lr.y ) shr 1;
+ m.x := ( tm.x + bm.x ) shr 1;
+ m.y := ( tm.y + bm.y ) shr 1;
+ mx := ( x1 + x2 ) shr 1;
+ my := ( y1 + y2 ) shr 1;
+ CopySourceToDest( ul, tm, m, lm, x1, y1, mx, my );
+ CopySourceToDest( tm, ur, rm, m, mx, y1, x2, my );
+ CopySourceToDest( m, rm, lr, bm, mx, my, x2, y2 );
+ CopySourceToDest( lm, m, bm, ll, x1, my, mx, y2 );
+ end;
+ end;
+var
+ _UL, _UR, _LR, _LL : TPoint;
+ Rect_x, Rect_y, Rect_w, Rect_h : integer;
+begin
+ if SDL_MustLock( SrcSurface ) then
+ SDL_LockSurface( SrcSurface );
+ if SDL_MustLock( DstSurface ) then
+ SDL_LockSurface( DstSurface );
+ if SrcRect = nil then
+ begin
+ Rect_x := 0;
+ Rect_y := 0;
+ Rect_w := ( SrcSurface.w - 1 ) shl SHIFTS;
+ Rect_h := ( SrcSurface.h - 1 ) shl SHIFTS;
+ end
+ else
+ begin
+ Rect_x := SrcRect.x;
+ Rect_y := SrcRect.y;
+ Rect_w := ( SrcRect.w - 1 ) shl SHIFTS;
+ Rect_h := ( SrcRect.h - 1 ) shl SHIFTS;
+ end;
+ // Shift all values to help reduce round-off error.
+ _ul.x := ul.x shl SHIFTS;
+ _ul.y := ul.y shl SHIFTS;
+ _ur.x := ur.x shl SHIFTS;
+ _ur.y := ur.y shl SHIFTS;
+ _lr.x := lr.x shl SHIFTS;
+ _lr.y := lr.y shl SHIFTS;
+ _ll.x := ll.x shl SHIFTS;
+ _ll.y := ll.y shl SHIFTS;
+ CopySourceToDest( _ul, _ur, _lr, _ll, Rect_x, Rect_y, Rect_w, Rect_h );
+ if SDL_MustLock( SrcSurface ) then
+ SDL_UnlockSurface( SrcSurface );
+ if SDL_MustLock( DstSurface ) then
+ SDL_UnlockSurface( DstSurface );
+end;
+
+// Draw a line between x1,y1 and x2,y2 to the given surface
+// NOTE: The surface must be locked before calling this!
+
+procedure SDL_DrawLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
+ cardinal );
+var
+ dx, dy, sdx, sdy, x, y, px, py : integer;
+begin
+ dx := x2 - x1;
+ dy := y2 - y1;
+ if dx < 0 then
+ sdx := -1
+ else
+ sdx := 1;
+ if dy < 0 then
+ sdy := -1
+ else
+ sdy := 1;
+ dx := sdx * dx + 1;
+ dy := sdy * dy + 1;
+ x := 0;
+ y := 0;
+ px := x1;
+ py := y1;
+ if dx >= dy then
+ begin
+ for x := 0 to dx - 1 do
+ begin
+ SDL_PutPixel( DstSurface, px, py, Color );
+ y := y + dy;
+ if y >= dx then
+ begin
+ y := y - dx;
+ py := py + sdy;
+ end;
+ px := px + sdx;
+ end;
+ end
+ else
+ begin
+ for y := 0 to dy - 1 do
+ begin
+ SDL_PutPixel( DstSurface, px, py, Color );
+ x := x + dx;
+ if x >= dy then
+ begin
+ x := x - dy;
+ px := px + sdx;
+ end;
+ py := py + sdy;
+ end;
+ end;
+end;
+
+// Draw a dashed line between x1,y1 and x2,y2 to the given surface
+// NOTE: The surface must be locked before calling this!
+
+procedure SDL_DrawLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
+ cardinal; DashLength, DashSpace : byte ); overload;
+var
+ dx, dy, sdx, sdy, x, y, px, py, counter : integer; drawdash : boolean;
+begin
+ counter := 0;
+ drawdash := true; //begin line drawing with dash
+
+ //Avoid invalid user-passed dash parameters
+ if ( DashLength < 1 )
+ then
+ DashLength := 1;
+ if ( DashSpace < 1 )
+ then
+ DashSpace := 0;
+
+ dx := x2 - x1;
+ dy := y2 - y1;
+ if dx < 0 then
+ sdx := -1
+ else
+ sdx := 1;
+ if dy < 0 then
+ sdy := -1
+ else
+ sdy := 1;
+ dx := sdx * dx + 1;
+ dy := sdy * dy + 1;
+ x := 0;
+ y := 0;
+ px := x1;
+ py := y1;
+ if dx >= dy then
+ begin
+ for x := 0 to dx - 1 do
+ begin
+
+ //Alternate drawing dashes, or leaving spaces
+ if drawdash then
+ begin
+ SDL_PutPixel( DstSurface, px, py, Color );
+ inc( counter );
+ if ( counter > DashLength - 1 ) and ( DashSpace > 0 ) then
+ begin
+ drawdash := false;
+ counter := 0;
+ end;
+ end
+ else //space
+ begin
+ inc( counter );
+ if counter > DashSpace - 1 then
+ begin
+ drawdash := true;
+ counter := 0;
+ end;
+ end;
+
+ y := y + dy;
+ if y >= dx then
+ begin
+ y := y - dx;
+ py := py + sdy;
+ end;
+ px := px + sdx;
+ end;
+ end
+ else
+ begin
+ for y := 0 to dy - 1 do
+ begin
+
+ //Alternate drawing dashes, or leaving spaces
+ if drawdash then
+ begin
+ SDL_PutPixel( DstSurface, px, py, Color );
+ inc( counter );
+ if ( counter > DashLength - 1 ) and ( DashSpace > 0 ) then
+ begin
+ drawdash := false;
+ counter := 0;
+ end;
+ end
+ else //space
+ begin
+ inc( counter );
+ if counter > DashSpace - 1 then
+ begin
+ drawdash := true;
+ counter := 0;
+ end;
+ end;
+
+ x := x + dx;
+ if x >= dy then
+ begin
+ x := x - dy;
+ px := px + sdx;
+ end;
+ py := py + sdy;
+ end;
+ end;
+end;
+
+procedure SDL_AddLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
+ cardinal );
+var
+ dx, dy, sdx, sdy, x, y, px, py : integer;
+begin
+ dx := x2 - x1;
+ dy := y2 - y1;
+ if dx < 0 then
+ sdx := -1
+ else
+ sdx := 1;
+ if dy < 0 then
+ sdy := -1
+ else
+ sdy := 1;
+ dx := sdx * dx + 1;
+ dy := sdy * dy + 1;
+ x := 0;
+ y := 0;
+ px := x1;
+ py := y1;
+ if dx >= dy then
+ begin
+ for x := 0 to dx - 1 do
+ begin
+ SDL_AddPixel( DstSurface, px, py, Color );
+ y := y + dy;
+ if y >= dx then
+ begin
+ y := y - dx;
+ py := py + sdy;
+ end;
+ px := px + sdx;
+ end;
+ end
+ else
+ begin
+ for y := 0 to dy - 1 do
+ begin
+ SDL_AddPixel( DstSurface, px, py, Color );
+ x := x + dx;
+ if x >= dy then
+ begin
+ x := x - dy;
+ px := px + sdx;
+ end;
+ py := py + sdy;
+ end;
+ end;
+end;
+
+procedure SDL_SubLine( DstSurface : PSDL_Surface; x1, y1, x2, y2 : integer; Color :
+ cardinal );
+var
+ dx, dy, sdx, sdy, x, y, px, py : integer;
+begin
+ dx := x2 - x1;
+ dy := y2 - y1;
+ if dx < 0 then
+ sdx := -1
+ else
+ sdx := 1;
+ if dy < 0 then
+ sdy := -1
+ else
+ sdy := 1;
+ dx := sdx * dx + 1;
+ dy := sdy * dy + 1;
+ x := 0;
+ y := 0;
+ px := x1;
+ py := y1;
+ if dx >= dy then
+ begin
+ for x := 0 to dx - 1 do
+ begin
+ SDL_SubPixel( DstSurface, px, py, Color );
+ y := y + dy;
+ if y >= dx then
+ begin
+ y := y - dx;
+ py := py + sdy;
+ end;
+ px := px + sdx;
+ end;
+ end
+ else
+ begin
+ for y := 0 to dy - 1 do
+ begin
+ SDL_SubPixel( DstSurface, px, py, Color );
+ x := x + dx;
+ if x >= dy then
+ begin
+ x := x - dy;
+ px := px + sdx;
+ end;
+ py := py + sdy;
+ end;
+ end;
+end;
+
+// flips a rectangle vertically on given surface
+
+procedure SDL_FlipRectV( DstSurface : PSDL_Surface; Rect : PSDL_Rect );
+var
+ TmpRect : TSDL_Rect;
+ Locked : boolean;
+ y, FlipLength, RowLength : integer;
+ Row1, Row2 : Pointer;
+ OneRow : TByteArray; // Optimize it if you wish
+begin
+ if DstSurface <> nil then
+ begin
+ if Rect = nil then
+ begin // if Rect=nil then we flip the whole surface
+ TmpRect := SDLRect( 0, 0, DstSurface.w, DstSurface.h );
+ Rect := @TmpRect;
+ end;
+ FlipLength := Rect^.h shr 1 - 1;
+ RowLength := Rect^.w * DstSurface^.format.BytesPerPixel;
+ if SDL_MustLock( DstSurface ) then
+ begin
+ Locked := true;
+ SDL_LockSurface( DstSurface );
+ end
+ else
+ Locked := false;
+ Row1 := pointer( cardinal( DstSurface^.Pixels ) + UInt32( Rect^.y ) *
+ DstSurface^.Pitch );
+ Row2 := pointer( cardinal( DstSurface^.Pixels ) + ( UInt32( Rect^.y ) + Rect^.h - 1 )
+ * DstSurface^.Pitch );
+ for y := 0 to FlipLength do
+ begin
+ Move( Row1^, OneRow, RowLength );
+ Move( Row2^, Row1^, RowLength );
+ Move( OneRow, Row2^, RowLength );
+ inc( cardinal( Row1 ), DstSurface^.Pitch );
+ dec( cardinal( Row2 ), DstSurface^.Pitch );
+ end;
+ if Locked then
+ SDL_UnlockSurface( DstSurface );
+ end;
+end;
+
+// flips a rectangle horizontally on given surface
+
+procedure SDL_FlipRectH( DstSurface : PSDL_Surface; Rect : PSDL_Rect );
+type
+ T24bit = packed array[ 0..2 ] of byte;
+ T24bitArray = packed array[ 0..8191 ] of T24bit;
+ P24bitArray = ^T24bitArray;
+ TLongWordArray = array[ 0..8191 ] of LongWord;
+ PLongWordArray = ^TLongWordArray;
+var
+ TmpRect : TSDL_Rect;
+ Row8bit : PByteArray;
+ Row16bit : PWordArray;
+ Row24bit : P24bitArray;
+ Row32bit : PLongWordArray;
+ y, x, RightSide, FlipLength : integer;
+ Pixel : cardinal;
+ Pixel24 : T24bit;
+ Locked : boolean;
+begin
+ if DstSurface <> nil then
+ begin
+ if Rect = nil then
+ begin
+ TmpRect := SDLRect( 0, 0, DstSurface.w, DstSurface.h );
+ Rect := @TmpRect;
+ end;
+ FlipLength := Rect^.w shr 1 - 1;
+ if SDL_MustLock( DstSurface ) then
+ begin
+ Locked := true;
+ SDL_LockSurface( DstSurface );
+ end
+ else
+ Locked := false;
+ case DstSurface^.format.BytesPerPixel of
+ 1 :
+ begin
+ Row8Bit := pointer( cardinal( DstSurface^.pixels ) + UInt32( Rect^.y ) *
+ DstSurface^.pitch );
+ for y := 1 to Rect^.h do
+ begin
+ RightSide := Rect^.w - 1;
+ for x := 0 to FlipLength do
+ begin
+ Pixel := Row8Bit^[ x ];
+ Row8Bit^[ x ] := Row8Bit^[ RightSide ];
+ Row8Bit^[ RightSide ] := Pixel;
+ dec( RightSide );
+ end;
+ inc( cardinal( Row8Bit ), DstSurface^.pitch );
+ end;
+ end;
+ 2 :
+ begin
+ Row16Bit := pointer( cardinal( DstSurface^.pixels ) + UInt32( Rect^.y ) *
+ DstSurface^.pitch );
+ for y := 1 to Rect^.h do
+ begin
+ RightSide := Rect^.w - 1;
+ for x := 0 to FlipLength do
+ begin
+ Pixel := Row16Bit^[ x ];
+ Row16Bit^[ x ] := Row16Bit^[ RightSide ];
+ Row16Bit^[ RightSide ] := Pixel;
+ dec( RightSide );
+ end;
+ inc( cardinal( Row16Bit ), DstSurface^.pitch );
+ end;
+ end;
+ 3 :
+ begin
+ Row24Bit := pointer( cardinal( DstSurface^.pixels ) + UInt32( Rect^.y ) *
+ DstSurface^.pitch );
+ for y := 1 to Rect^.h do
+ begin
+ RightSide := Rect^.w - 1;
+ for x := 0 to FlipLength do
+ begin
+ Pixel24 := Row24Bit^[ x ];
+ Row24Bit^[ x ] := Row24Bit^[ RightSide ];
+ Row24Bit^[ RightSide ] := Pixel24;
+ dec( RightSide );
+ end;
+ inc( cardinal( Row24Bit ), DstSurface^.pitch );
+ end;
+ end;
+ 4 :
+ begin
+ Row32Bit := pointer( cardinal( DstSurface^.pixels ) + UInt32( Rect^.y ) *
+ DstSurface^.pitch );
+ for y := 1 to Rect^.h do
+ begin
+ RightSide := Rect^.w - 1;
+ for x := 0 to FlipLength do
+ begin
+ Pixel := Row32Bit^[ x ];
+ Row32Bit^[ x ] := Row32Bit^[ RightSide ];
+ Row32Bit^[ RightSide ] := Pixel;
+ dec( RightSide );
+ end;
+ inc( cardinal( Row32Bit ), DstSurface^.pitch );
+ end;
+ end;
+ end;
+ if Locked then
+ SDL_UnlockSurface( DstSurface );
+ end;
+end;
+
+// Use with caution! The procedure allocates memory for TSDL_Rect and return with its pointer.
+// But you MUST free it after you don't need it anymore!!!
+
+function PSDLRect( aLeft, aTop, aWidth, aHeight : integer ) : PSDL_Rect;
+var
+ Rect : PSDL_Rect;
+begin
+ New( Rect );
+ with Rect^ do
+ begin
+ x := aLeft;
+ y := aTop;
+ w := aWidth;
+ h := aHeight;
+ end;
+ Result := Rect;
+end;
+
+function SDLRect( aLeft, aTop, aWidth, aHeight : integer ) : TSDL_Rect;
+begin
+ with result do
+ begin
+ x := aLeft;
+ y := aTop;
+ w := aWidth;
+ h := aHeight;
+ end;
+end;
+
+function SDLRect( aRect : TRect ) : TSDL_Rect;
+begin
+ with aRect do
+ result := SDLRect( Left, Top, Right - Left, Bottom - Top );
+end;
+
+procedure SDL_Stretch8( Surface, Dst_Surface : PSDL_Surface; x1, x2, y1, y2, yr, yw,
+ depth : integer );
+var
+ dx, dy, e, d, dx2 : integer;
+ src_pitch, dst_pitch : uint16;
+ src_pixels, dst_pixels : PUint8;
+begin
+ if ( yw >= dst_surface^.h ) then
+ exit;
+ dx := ( x2 - x1 );
+ dy := ( y2 - y1 );
+ dy := dy shl 1;
+ e := dy - dx;
+ dx2 := dx shl 1;
+ src_pitch := Surface^.pitch;
+ dst_pitch := dst_surface^.pitch;
+ src_pixels := PUint8( integer( Surface^.pixels ) + yr * src_pitch + y1 * depth );
+ dst_pixels := PUint8( integer( dst_surface^.pixels ) + yw * dst_pitch + x1 *
+ depth );
+ for d := 0 to dx - 1 do
+ begin
+ move( src_pixels^, dst_pixels^, depth );
+ while ( e >= 0 ) do
+ begin
+ inc( src_pixels, depth );
+ e := e - dx2;
+ end;
+ inc( dst_pixels, depth );
+ e := e + dy;
+ end;
+end;
+
+function sign( x : integer ) : integer;
+begin
+ if x > 0 then
+ result := 1
+ else
+ result := -1;
+end;
+
+// Stretches a part of a surface
+
+function SDL_ScaleSurfaceRect( SrcSurface : PSDL_Surface; SrcX1, SrcY1, SrcW, SrcH,
+ Width, Height : integer ) : PSDL_Surface;
+var
+ dst_surface : PSDL_Surface;
+ dx, dy, e, d, dx2, srcx2, srcy2 : integer;
+ destx1, desty1 : integer;
+begin
+ srcx2 := srcx1 + SrcW;
+ srcy2 := srcy1 + SrcH;
+ result := nil;
+ destx1 := 0;
+ desty1 := 0;
+ dx := abs( integer( Height - desty1 ) );
+ dy := abs( integer( SrcY2 - SrcY1 ) );
+ e := ( dy shl 1 ) - dx;
+ dx2 := dx shl 1;
+ dy := dy shl 1;
+ dst_surface := SDL_CreateRGBSurface( SDL_HWPALETTE, width - destx1, Height -
+ desty1,
+ SrcSurface^.Format^.BitsPerPixel,
+ SrcSurface^.Format^.RMask,
+ SrcSurface^.Format^.GMask,
+ SrcSurface^.Format^.BMask,
+ SrcSurface^.Format^.AMask );
+ if ( dst_surface^.format^.BytesPerPixel = 1 ) then
+ SDL_SetColors( dst_surface, @SrcSurface^.format^.palette^.colors^[ 0 ], 0, 256 );
+ SDL_SetColorKey( dst_surface, sdl_srccolorkey, SrcSurface^.format^.colorkey );
+ if ( SDL_MustLock( dst_surface ) ) then
+ if ( SDL_LockSurface( dst_surface ) < 0 ) then
+ exit;
+ for d := 0 to dx - 1 do
+ begin
+ SDL_Stretch8( SrcSurface, dst_surface, destx1, Width, SrcX1, SrcX2, SrcY1, desty1,
+ SrcSurface^.format^.BytesPerPixel );
+ while e >= 0 do
+ begin
+ inc( SrcY1 );
+ e := e - dx2;
+ end;
+ inc( desty1 );
+ e := e + dy;
+ end;
+ if SDL_MUSTLOCK( dst_surface ) then
+ SDL_UnlockSurface( dst_surface );
+ result := dst_surface;
+end;
+
+procedure SDL_MoveLine( Surface : PSDL_Surface; x1, x2, y1, xofs, depth : integer );
+var
+ src_pixels, dst_pixels : PUint8;
+ i : integer;
+begin
+ src_pixels := PUint8( integer( Surface^.pixels ) + Surface^.w * y1 * depth + x2 *
+ depth );
+ dst_pixels := PUint8( integer( Surface^.pixels ) + Surface^.w * y1 * depth + ( x2
+ + xofs ) * depth );
+ for i := x2 downto x1 do
+ begin
+ move( src_pixels^, dst_pixels^, depth );
+ dec( src_pixels );
+ dec( dst_pixels );
+ end;
+end;
+{ Return the pixel value at (x, y)
+NOTE: The surface must be locked before calling this! }
+
+function SDL_GetPixel( SrcSurface : PSDL_Surface; x : integer; y : integer ) : Uint32;
+var
+ bpp : UInt32;
+ p : PInteger;
+begin
+ bpp := SrcSurface.format.BytesPerPixel;
+ // Here p is the address to the pixel we want to retrieve
+ p := Pointer( Uint32( SrcSurface.pixels ) + UInt32( y ) * SrcSurface.pitch + UInt32( x ) *
+ bpp );
+ case bpp of
+ 1 : result := PUint8( p )^;
+ 2 : result := PUint16( p )^;
+ 3 :
+ if ( SDL_BYTEORDER = SDL_BIG_ENDIAN ) then
+ result := PUInt8Array( p )[ 0 ] shl 16 or PUInt8Array( p )[ 1 ] shl 8 or
+ PUInt8Array( p )[ 2 ]
+ else
+ result := PUInt8Array( p )[ 0 ] or PUInt8Array( p )[ 1 ] shl 8 or
+ PUInt8Array( p )[ 2 ] shl 16;
+ 4 : result := PUint32( p )^;
+ else
+ result := 0; // shouldn't happen, but avoids warnings
+ end;
+end;
+{ Set the pixel at (x, y) to the given value
+ NOTE: The surface must be locked before calling this! }
+
+procedure SDL_PutPixel( DstSurface : PSDL_Surface; x : integer; y : integer; pixel :
+ Uint32 );
+var
+ bpp : UInt32;
+ p : PInteger;
+begin
+ bpp := DstSurface.format.BytesPerPixel;
+ p := Pointer( Uint32( DstSurface.pixels ) + UInt32( y ) * DstSurface.pitch + UInt32( x )
+ * bpp );
+ case bpp of
+ 1 : PUint8( p )^ := pixel;
+ 2 : PUint16( p )^ := pixel;
+ 3 :
+ if ( SDL_BYTEORDER = SDL_BIG_ENDIAN ) then
+ begin
+ PUInt8Array( p )[ 0 ] := ( pixel shr 16 ) and $FF;
+ PUInt8Array( p )[ 1 ] := ( pixel shr 8 ) and $FF;
+ PUInt8Array( p )[ 2 ] := pixel and $FF;
+ end
+ else
+ begin
+ PUInt8Array( p )[ 0 ] := pixel and $FF;
+ PUInt8Array( p )[ 1 ] := ( pixel shr 8 ) and $FF;
+ PUInt8Array( p )[ 2 ] := ( pixel shr 16 ) and $FF;
+ end;
+ 4 :
+ PUint32( p )^ := pixel;
+ end;
+end;
+
+procedure SDL_ScrollY( DstSurface : PSDL_Surface; DifY : integer );
+var
+ r1, r2 : TSDL_Rect;
+ //buffer: PSDL_Surface;
+ YPos : Integer;
+begin
+ if ( DstSurface <> nil ) and ( DifY <> 0 ) then
+ begin
+ //if DifY > 0 then // going up
+ //begin
+ ypos := 0;
+ r1.x := 0;
+ r2.x := 0;
+ r1.w := DstSurface.w;
+ r2.w := DstSurface.w;
+ r1.h := DifY;
+ r2.h := DifY;
+ while ypos < DstSurface.h do
+ begin
+ r1.y := ypos;
+ r2.y := ypos + DifY;
+ SDL_BlitSurface( DstSurface, @r2, DstSurface, @r1 );
+ ypos := ypos + DifY;
+ end;
+ //end
+ //else
+ //begin // Going Down
+ //end;
+ end;
+end;
+
+{procedure SDL_ScrollY(Surface: PSDL_Surface; DifY: integer);
+var
+ r1, r2: TSDL_Rect;
+ buffer: PSDL_Surface;
+begin
+ if (Surface <> nil) and (Dify <> 0) then
+ begin
+ buffer := SDL_CreateRGBSurface(SDL_HWSURFACE, (Surface^.w - DifY) * 2,
+ Surface^.h * 2,
+ Surface^.Format^.BitsPerPixel, 0, 0, 0, 0);
+ if buffer <> nil then
+ begin
+ if (buffer^.format^.BytesPerPixel = 1) then
+ SDL_SetColors(buffer, @Surface^.format^.palette^.colors^[0], 0, 256);
+ r1 := SDLRect(0, DifY, buffer^.w, buffer^.h);
+ r2 := SDLRect(0, 0, buffer^.w, buffer^.h);
+ SDL_BlitSurface(Surface, @r1, buffer, @r2);
+ SDL_BlitSurface(buffer, @r2, Surface, @r2);
+ SDL_FreeSurface(buffer);
+ end;
+ end;
+end;}
+
+procedure SDL_ScrollX( DstSurface : PSDL_Surface; DifX : integer );
+var
+ r1, r2 : TSDL_Rect;
+ buffer : PSDL_Surface;
+begin
+ if ( DstSurface <> nil ) and ( DifX <> 0 ) then
+ begin
+ buffer := SDL_CreateRGBSurface( SDL_HWSURFACE, ( DstSurface^.w - DifX ) * 2,
+ DstSurface^.h * 2,
+ DstSurface^.Format^.BitsPerPixel,
+ DstSurface^.Format^.RMask,
+ DstSurface^.Format^.GMask,
+ DstSurface^.Format^.BMask,
+ DstSurface^.Format^.AMask );
+ if buffer <> nil then
+ begin
+ if ( buffer^.format^.BytesPerPixel = 1 ) then
+ SDL_SetColors( buffer, @DstSurface^.format^.palette^.colors^[ 0 ], 0, 256 );
+ r1 := SDLRect( DifX, 0, buffer^.w, buffer^.h );
+ r2 := SDLRect( 0, 0, buffer^.w, buffer^.h );
+ SDL_BlitSurface( DstSurface, @r1, buffer, @r2 );
+ SDL_BlitSurface( buffer, @r2, DstSurface, @r2 );
+ SDL_FreeSurface( buffer );
+ end;
+ end;
+end;
+
+procedure SDL_RotateRad( DstSurface, SrcSurface : PSDL_Surface; SrcRect :
+ PSDL_Rect; DestX, DestY, OffsetX, OffsetY : Integer; Angle : Single );
+var
+ aSin, aCos : Single;
+ MX, MY, DX, DY, NX, NY, SX, SY, OX, OY, Width, Height, TX, TY, RX, RY, ROX, ROY : Integer;
+ Colour, TempTransparentColour : UInt32;
+ MAXX, MAXY : Integer;
+begin
+ // Rotate the surface to the target surface.
+ TempTransparentColour := SrcSurface.format.colorkey;
+ {if srcRect.w > srcRect.h then
+ begin
+ Width := srcRect.w;
+ Height := srcRect.w;
+ end
+ else
+ begin
+ Width := srcRect.h;
+ Height := srcRect.h;
+ end; }
+
+ maxx := DstSurface.w;
+ maxy := DstSurface.h;
+ aCos := cos( Angle );
+ aSin := sin( Angle );
+
+ Width := round( abs( srcrect.h * acos ) + abs( srcrect.w * asin ) );
+ Height := round( abs( srcrect.h * asin ) + abs( srcrect.w * acos ) );
+
+ OX := Width div 2;
+ OY := Height div 2; ;
+ MX := ( srcRect.x + ( srcRect.x + srcRect.w ) ) div 2;
+ MY := ( srcRect.y + ( srcRect.y + srcRect.h ) ) div 2;
+ ROX := ( -( srcRect.w div 2 ) ) + Offsetx;
+ ROY := ( -( srcRect.h div 2 ) ) + OffsetY;
+ Tx := ox + round( ROX * aSin - ROY * aCos );
+ Ty := oy + round( ROY * aSin + ROX * aCos );
+ SX := 0;
+ for DX := DestX - TX to DestX - TX + ( width ) do
+ begin
+ Inc( SX );
+ SY := 0;
+ for DY := DestY - TY to DestY - TY + ( Height ) do
+ begin
+ RX := SX - OX;
+ RY := SY - OY;
+ NX := round( mx + RX * aSin + RY * aCos ); //
+ NY := round( my + RY * aSin - RX * aCos ); //
+ // Used for testing only
+ //SDL_PutPixel(DestSurface.SDLSurfacePointer,DX,DY,0);
+ if ( ( DX > 0 ) and ( DX < MAXX ) ) and ( ( DY > 0 ) and ( DY < MAXY ) ) then
+ begin
+ if ( NX >= srcRect.x ) and ( NX <= srcRect.x + srcRect.w ) then
+ begin
+ if ( NY >= srcRect.y ) and ( NY <= srcRect.y + srcRect.h ) then
+ begin
+ Colour := SDL_GetPixel( SrcSurface, NX, NY );
+ if Colour <> TempTransparentColour then
+ begin
+ SDL_PutPixel( DstSurface, DX, DY, Colour );
+ end;
+ end;
+ end;
+ end;
+ inc( SY );
+ end;
+ end;
+end;
+
+procedure SDL_RotateDeg( DstSurface, SrcSurface : PSDL_Surface; SrcRect :
+ PSDL_Rect; DestX, DestY, OffsetX, OffsetY : Integer; Angle : Integer );
+begin
+ SDL_RotateRad( DstSurface, SrcSurface, SrcRect, DestX, DestY, OffsetX, OffsetY, DegToRad( Angle ) );
+end;
+
+function ValidateSurfaceRect( DstSurface : PSDL_Surface; dstrect : PSDL_Rect ) : TSDL_Rect;
+var
+ RealRect : TSDL_Rect;
+ OutOfRange : Boolean;
+begin
+ OutOfRange := false;
+ if dstrect = nil then
+ begin
+ RealRect.x := 0;
+ RealRect.y := 0;
+ RealRect.w := DstSurface.w;
+ RealRect.h := DstSurface.h;
+ end
+ else
+ begin
+ if dstrect.x < DstSurface.w then
+ begin
+ RealRect.x := dstrect.x;
+ end
+ else if dstrect.x < 0 then
+ begin
+ realrect.x := 0;
+ end
+ else
+ begin
+ OutOfRange := True;
+ end;
+ if dstrect.y < DstSurface.h then
+ begin
+ RealRect.y := dstrect.y;
+ end
+ else if dstrect.y < 0 then
+ begin
+ realrect.y := 0;
+ end
+ else
+ begin
+ OutOfRange := True;
+ end;
+ if OutOfRange = False then
+ begin
+ if realrect.x + dstrect.w <= DstSurface.w then
+ begin
+ RealRect.w := dstrect.w;
+ end
+ else
+ begin
+ RealRect.w := dstrect.w - realrect.x;
+ end;
+ if realrect.y + dstrect.h <= DstSurface.h then
+ begin
+ RealRect.h := dstrect.h;
+ end
+ else
+ begin
+ RealRect.h := dstrect.h - realrect.y;
+ end;
+ end;
+ end;
+ if OutOfRange = False then
+ begin
+ result := realrect;
+ end
+ else
+ begin
+ realrect.w := 0;
+ realrect.h := 0;
+ realrect.x := 0;
+ realrect.y := 0;
+ result := realrect;
+ end;
+end;
+
+procedure SDL_FillRectAdd( DstSurface : PSDL_Surface; dstrect : PSDL_Rect; color : UInt32 );
+var
+ RealRect : TSDL_Rect;
+ Addr : pointer;
+ ModX, BPP : cardinal;
+ x, y, R, G, B, SrcColor : cardinal;
+begin
+ RealRect := ValidateSurfaceRect( DstSurface, DstRect );
+ if ( RealRect.w > 0 ) and ( RealRect.h > 0 ) then
+ begin
+ SDL_LockSurface( DstSurface );
+ BPP := DstSurface.format.BytesPerPixel;
+ with DstSurface^ do
+ begin
+ Addr := pointer( UInt32( pixels ) + UInt32( RealRect.y ) * pitch + UInt32( RealRect.x ) * BPP );
+ ModX := Pitch - UInt32( RealRect.w ) * BPP;
+ end;
+ case DstSurface.format.BitsPerPixel of
+ 8 :
+ begin
+ for y := 0 to RealRect.h - 1 do
+ begin
+ for x := 0 to RealRect.w - 1 do
+ begin
+ SrcColor := PUInt32( Addr )^;
+ R := SrcColor and $E0 + Color and $E0;
+ G := SrcColor and $1C + Color and $1C;
+ B := SrcColor and $03 + Color and $03;
+ if R > $E0 then
+ R := $E0;
+ if G > $1C then
+ G := $1C;
+ if B > $03 then
+ B := $03;
+ PUInt8( Addr )^ := R or G or B;
+ inc( UInt32( Addr ), BPP );
+ end;
+ inc( UInt32( Addr ), ModX );
+ end;
+ end;
+ 15 :
+ begin
+ for y := 0 to RealRect.h - 1 do
+ begin
+ for x := 0 to RealRect.w - 1 do
+ begin
+ SrcColor := PUInt32( Addr )^;
+ R := SrcColor and $7C00 + Color and $7C00;
+ G := SrcColor and $03E0 + Color and $03E0;
+ B := SrcColor and $001F + Color and $001F;
+ if R > $7C00 then
+ R := $7C00;
+ if G > $03E0 then
+ G := $03E0;
+ if B > $001F then
+ B := $001F;
+ PUInt16( Addr )^ := R or G or B;
+ inc( UInt32( Addr ), BPP );
+ end;
+ inc( UInt32( Addr ), ModX );
+ end;
+ end;
+ 16 :
+ begin
+ for y := 0 to RealRect.h - 1 do
+ begin
+ for x := 0 to RealRect.w - 1 do
+ begin
+ SrcColor := PUInt32( Addr )^;
+ R := SrcColor and $F800 + Color and $F800;
+ G := SrcColor and $07C0 + Color and $07C0;
+ B := SrcColor and $001F + Color and $001F;
+ if R > $F800 then
+ R := $F800;
+ if G > $07C0 then
+ G := $07C0;
+ if B > $001F then
+ B := $001F;
+ PUInt16( Addr )^ := R or G or B;
+ inc( UInt32( Addr ), BPP );
+ end;
+ inc( UInt32( Addr ), ModX );
+ end;
+ end;
+ 24 :
+ begin
+ for y := 0 to RealRect.h - 1 do
+ begin
+ for x := 0 to RealRect.w - 1 do
+ begin
+ SrcColor := PUInt32( Addr )^;
+ R := SrcColor and $00FF0000 + Color and $00FF0000;
+ G := SrcColor and $0000FF00 + Color and $0000FF00;
+ B := SrcColor and $000000FF + Color and $000000FF;
+ if R > $FF0000 then
+ R := $FF0000;
+ if G > $00FF00 then
+ G := $00FF00;
+ if B > $0000FF then
+ B := $0000FF;
+ PUInt32( Addr )^ := SrcColor and $FF000000 or R or G or B;
+ inc( UInt32( Addr ), BPP );
+ end;
+ inc( UInt32( Addr ), ModX );
+ end;
+ end;
+ 32 :
+ begin
+ for y := 0 to RealRect.h - 1 do
+ begin
+ for x := 0 to RealRect.w - 1 do
+ begin
+ SrcColor := PUInt32( Addr )^;
+ R := SrcColor and $00FF0000 + Color and $00FF0000;
+ G := SrcColor and $0000FF00 + Color and $0000FF00;
+ B := SrcColor and $000000FF + Color and $000000FF;
+ if R > $FF0000 then
+ R := $FF0000;
+ if G > $00FF00 then
+ G := $00FF00;
+ if B > $0000FF then
+ B := $0000FF;
+ PUInt32( Addr )^ := R or G or B;
+ inc( UInt32( Addr ), BPP );
+ end;
+ inc( UInt32( Addr ), ModX );
+ end;
+ end;
+ end;
+ SDL_UnlockSurface( DstSurface );
+ end;
+end;
+
+procedure SDL_FillRectSub( DstSurface : PSDL_Surface; dstrect : PSDL_Rect; color : UInt32 );
+var
+ RealRect : TSDL_Rect;
+ Addr : pointer;
+ ModX, BPP : cardinal;
+ x, y, R, G, B, SrcColor : cardinal;
+begin
+ RealRect := ValidateSurfaceRect( DstSurface, DstRect );
+ if ( RealRect.w > 0 ) and ( RealRect.h > 0 ) then
+ begin
+ SDL_LockSurface( DstSurface );
+ BPP := DstSurface.format.BytesPerPixel;
+ with DstSurface^ do
+ begin
+ Addr := pointer( UInt32( pixels ) + UInt32( RealRect.y ) * pitch + UInt32( RealRect.x ) * BPP );
+ ModX := Pitch - UInt32( RealRect.w ) * BPP;
+ end;
+ case DstSurface.format.BitsPerPixel of
+ 8 :
+ begin
+ for y := 0 to RealRect.h - 1 do
+ begin
+ for x := 0 to RealRect.w - 1 do
+ begin
+ SrcColor := PUInt32( Addr )^;
+ R := SrcColor and $E0 - Color and $E0;
+ G := SrcColor and $1C - Color and $1C;
+ B := SrcColor and $03 - Color and $03;
+ if R > $E0 then
+ R := 0;
+ if G > $1C then
+ G := 0;
+ if B > $03 then
+ B := 0;
+ PUInt8( Addr )^ := R or G or B;
+ inc( UInt32( Addr ), BPP );
+ end;
+ inc( UInt32( Addr ), ModX );
+ end;
+ end;
+ 15 :
+ begin
+ for y := 0 to RealRect.h - 1 do
+ begin
+ for x := 0 to RealRect.w - 1 do
+ begin
+ SrcColor := PUInt32( Addr )^;
+ R := SrcColor and $7C00 - Color and $7C00;
+ G := SrcColor and $03E0 - Color and $03E0;
+ B := SrcColor and $001F - Color and $001F;
+ if R > $7C00 then
+ R := 0;
+ if G > $03E0 then
+ G := 0;
+ if B > $001F then
+ B := 0;
+ PUInt16( Addr )^ := R or G or B;
+ inc( UInt32( Addr ), BPP );
+ end;
+ inc( UInt32( Addr ), ModX );
+ end;
+ end;
+ 16 :
+ begin
+ for y := 0 to RealRect.h - 1 do
+ begin
+ for x := 0 to RealRect.w - 1 do
+ begin
+ SrcColor := PUInt32( Addr )^;
+ R := SrcColor and $F800 - Color and $F800;
+ G := SrcColor and $07C0 - Color and $07C0;
+ B := SrcColor and $001F - Color and $001F;
+ if R > $F800 then
+ R := 0;
+ if G > $07C0 then
+ G := 0;
+ if B > $001F then
+ B := 0;
+ PUInt16( Addr )^ := R or G or B;
+ inc( UInt32( Addr ), BPP );
+ end;
+ inc( UInt32( Addr ), ModX );
+ end;
+ end;
+ 24 :
+ begin
+ for y := 0 to RealRect.h - 1 do
+ begin
+ for x := 0 to RealRect.w - 1 do
+ begin
+ SrcColor := PUInt32( Addr )^;
+ R := SrcColor and $00FF0000 - Color and $00FF0000;
+ G := SrcColor and $0000FF00 - Color and $0000FF00;
+ B := SrcColor and $000000FF - Color and $000000FF;
+ if R > $FF0000 then
+ R := 0;
+ if G > $00FF00 then
+ G := 0;
+ if B > $0000FF then
+ B := 0;
+ PUInt32( Addr )^ := SrcColor and $FF000000 or R or G or B;
+ inc( UInt32( Addr ), BPP );
+ end;
+ inc( UInt32( Addr ), ModX );
+ end;
+ end;
+ 32 :
+ begin
+ for y := 0 to RealRect.h - 1 do
+ begin
+ for x := 0 to RealRect.w - 1 do
+ begin
+ SrcColor := PUInt32( Addr )^;
+ R := SrcColor and $00FF0000 - Color and $00FF0000;
+ G := SrcColor and $0000FF00 - Color and $0000FF00;
+ B := SrcColor and $000000FF - Color and $000000FF;
+ if R > $FF0000 then
+ R := 0;
+ if G > $00FF00 then
+ G := 0;
+ if B > $0000FF then
+ B := 0;
+ PUInt32( Addr )^ := R or G or B;
+ inc( UInt32( Addr ), BPP );
+ end;
+ inc( UInt32( Addr ), ModX );
+ end;
+ end;
+ end;
+ SDL_UnlockSurface( DstSurface );
+ end;
+end;
+
+procedure SDL_GradientFillRect( DstSurface : PSDL_Surface; const Rect : PSDL_Rect; const StartColor, EndColor : TSDL_Color; const Style : TGradientStyle );
+var
+ FBC : array[ 0..255 ] of Cardinal;
+ // temp vars
+ i, YR, YG, YB, SR, SG, SB, DR, DG, DB : Integer;
+
+ TempStepV, TempStepH : Single;
+ TempLeft, TempTop, TempHeight, TempWidth : integer;
+ TempRect : TSDL_Rect;
+
+begin
+ // calc FBC
+ YR := StartColor.r;
+ YG := StartColor.g;
+ YB := StartColor.b;
+ SR := YR;
+ SG := YG;
+ SB := YB;
+ DR := EndColor.r - SR;
+ DG := EndColor.g - SG;
+ DB := EndColor.b - SB;
+
+ for i := 0 to 255 do
+ begin
+ FBC[ i ] := SDL_MapRGB( DstSurface.format, YR, YG, YB );
+ YR := SR + round( DR / 255 * i );
+ YG := SG + round( DG / 255 * i );
+ YB := SB + round( DB / 255 * i );
+ end;
+
+ // if aStyle = 1 then begin
+ TempStepH := Rect.w / 255;
+ TempStepV := Rect.h / 255;
+ TempHeight := Trunc( TempStepV + 1 );
+ TempWidth := Trunc( TempStepH + 1 );
+ TempTop := 0;
+ TempLeft := 0;
+ TempRect.x := Rect.x;
+ TempRect.y := Rect.y;
+ TempRect.h := Rect.h;
+ TempRect.w := Rect.w;
+
+ case Style of
+ gsHorizontal :
+ begin
+ TempRect.h := TempHeight;
+ for i := 0 to 255 do
+ begin
+ TempRect.y := Rect.y + TempTop;
+ SDL_FillRect( DstSurface, @TempRect, FBC[ i ] );
+ TempTop := Trunc( TempStepV * i );
+ end;
+ end;
+ gsVertical :
+ begin
+ TempRect.w := TempWidth;
+ for i := 0 to 255 do
+ begin
+ TempRect.x := Rect.x + TempLeft;
+ SDL_FillRect( DstSurface, @TempRect, FBC[ i ] );
+ TempLeft := Trunc( TempStepH * i );
+ end;
+ end;
+ end;
+end;
+
+procedure SDL_2xBlit( Src, Dest : PSDL_Surface );
+var
+ ReadAddr, WriteAddr, ReadRow, WriteRow : UInt32;
+ SrcPitch, DestPitch, x, y : UInt32;
+begin
+ if ( Src = nil ) or ( Dest = nil ) then
+ exit;
+ if ( Src.w shl 1 ) < Dest.w then
+ exit;
+ if ( Src.h shl 1 ) < Dest.h then
+ exit;
+
+ if SDL_MustLock( Src ) then
+ SDL_LockSurface( Src );
+ if SDL_MustLock( Dest ) then
+ SDL_LockSurface( Dest );
+
+ ReadRow := UInt32( Src.Pixels );
+ WriteRow := UInt32( Dest.Pixels );
+
+ SrcPitch := Src.pitch;
+ DestPitch := Dest.pitch;
+
+ case Src.format.BytesPerPixel of
+ 1 : for y := 1 to Src.h do
+ begin
+ ReadAddr := ReadRow;
+ WriteAddr := WriteRow;
+ for x := 1 to Src.w do
+ begin
+ PUInt8( WriteAddr )^ := PUInt8( ReadAddr )^;
+ PUInt8( WriteAddr + 1 )^ := PUInt8( ReadAddr )^;
+ PUInt8( WriteAddr + DestPitch )^ := PUInt8( ReadAddr )^;
+ PUInt8( WriteAddr + DestPitch + 1 )^ := PUInt8( ReadAddr )^;
+ inc( ReadAddr );
+ inc( WriteAddr, 2 );
+ end;
+ inc( UInt32( ReadRow ), SrcPitch );
+ inc( UInt32( WriteRow ), DestPitch * 2 );
+ end;
+ 2 : for y := 1 to Src.h do
+ begin
+ ReadAddr := ReadRow;
+ WriteAddr := WriteRow;
+ for x := 1 to Src.w do
+ begin
+ PUInt16( WriteAddr )^ := PUInt16( ReadAddr )^;
+ PUInt16( WriteAddr + 2 )^ := PUInt16( ReadAddr )^;
+ PUInt16( WriteAddr + DestPitch )^ := PUInt16( ReadAddr )^;
+ PUInt16( WriteAddr + DestPitch + 2 )^ := PUInt16( ReadAddr )^;
+ inc( ReadAddr, 2 );
+ inc( WriteAddr, 4 );
+ end;
+ inc( UInt32( ReadRow ), SrcPitch );
+ inc( UInt32( WriteRow ), DestPitch * 2 );
+ end;
+ 3 : for y := 1 to Src.h do
+ begin
+ ReadAddr := ReadRow;
+ WriteAddr := WriteRow;
+ for x := 1 to Src.w do
+ begin
+ PUInt32( WriteAddr )^ := ( PUInt32( WriteAddr )^ and $FF000000 ) or ( PUInt32( ReadAddr )^ and $00FFFFFF );
+ PUInt32( WriteAddr + 3 )^ := ( PUInt32( WriteAddr + 3 )^ and $FF000000 ) or ( PUInt32( ReadAddr )^ and $00FFFFFF );
+ PUInt32( WriteAddr + DestPitch )^ := ( PUInt32( WriteAddr + DestPitch )^ and $FF000000 ) or ( PUInt32( ReadAddr )^ and $00FFFFFF );
+ PUInt32( WriteAddr + DestPitch + 3 )^ := ( PUInt32( WriteAddr + DestPitch + 3 )^ and $FF000000 ) or ( PUInt32( ReadAddr )^ and $00FFFFFF );
+ inc( ReadAddr, 3 );
+ inc( WriteAddr, 6 );
+ end;
+ inc( UInt32( ReadRow ), SrcPitch );
+ inc( UInt32( WriteRow ), DestPitch * 2 );
+ end;
+ 4 : for y := 1 to Src.h do
+ begin
+ ReadAddr := ReadRow;
+ WriteAddr := WriteRow;
+ for x := 1 to Src.w do
+ begin
+ PUInt32( WriteAddr )^ := PUInt32( ReadAddr )^;
+ PUInt32( WriteAddr + 4 )^ := PUInt32( ReadAddr )^;
+ PUInt32( WriteAddr + DestPitch )^ := PUInt32( ReadAddr )^;
+ PUInt32( WriteAddr + DestPitch + 4 )^ := PUInt32( ReadAddr )^;
+ inc( ReadAddr, 4 );
+ inc( WriteAddr, 8 );
+ end;
+ inc( UInt32( ReadRow ), SrcPitch );
+ inc( UInt32( WriteRow ), DestPitch * 2 );
+ end;
+ end;
+
+ if SDL_MustLock( Src ) then
+ SDL_UnlockSurface( Src );
+ if SDL_MustLock( Dest ) then
+ SDL_UnlockSurface( Dest );
+end;
+
+procedure SDL_Scanline2xBlit( Src, Dest : PSDL_Surface );
+var
+ ReadAddr, WriteAddr, ReadRow, WriteRow : UInt32;
+ SrcPitch, DestPitch, x, y : UInt32;
+begin
+ if ( Src = nil ) or ( Dest = nil ) then
+ exit;
+ if ( Src.w shl 1 ) < Dest.w then
+ exit;
+ if ( Src.h shl 1 ) < Dest.h then
+ exit;
+
+ if SDL_MustLock( Src ) then
+ SDL_LockSurface( Src );
+ if SDL_MustLock( Dest ) then
+ SDL_LockSurface( Dest );
+
+ ReadRow := UInt32( Src.Pixels );
+ WriteRow := UInt32( Dest.Pixels );
+
+ SrcPitch := Src.pitch;
+ DestPitch := Dest.pitch;
+
+ case Src.format.BytesPerPixel of
+ 1 : for y := 1 to Src.h do
+ begin
+ ReadAddr := ReadRow;
+ WriteAddr := WriteRow;
+ for x := 1 to Src.w do
+ begin
+ PUInt8( WriteAddr )^ := PUInt8( ReadAddr )^;
+ PUInt8( WriteAddr + 1 )^ := PUInt8( ReadAddr )^;
+ inc( ReadAddr );
+ inc( WriteAddr, 2 );
+ end;
+ inc( UInt32( ReadRow ), SrcPitch );
+ inc( UInt32( WriteRow ), DestPitch * 2 );
+ end;
+ 2 : for y := 1 to Src.h do
+ begin
+ ReadAddr := ReadRow;
+ WriteAddr := WriteRow;
+ for x := 1 to Src.w do
+ begin
+ PUInt16( WriteAddr )^ := PUInt16( ReadAddr )^;
+ PUInt16( WriteAddr + 2 )^ := PUInt16( ReadAddr )^;
+ inc( ReadAddr, 2 );
+ inc( WriteAddr, 4 );
+ end;
+ inc( UInt32( ReadRow ), SrcPitch );
+ inc( UInt32( WriteRow ), DestPitch * 2 );
+ end;
+ 3 : for y := 1 to Src.h do
+ begin
+ ReadAddr := ReadRow;
+ WriteAddr := WriteRow;
+ for x := 1 to Src.w do
+ begin
+ PUInt32( WriteAddr )^ := ( PUInt32( WriteAddr )^ and $FF000000 ) or ( PUInt32( ReadAddr )^ and $00FFFFFF );
+ PUInt32( WriteAddr + 3 )^ := ( PUInt32( WriteAddr + 3 )^ and $FF000000 ) or ( PUInt32( ReadAddr )^ and $00FFFFFF );
+ inc( ReadAddr, 3 );
+ inc( WriteAddr, 6 );
+ end;
+ inc( UInt32( ReadRow ), SrcPitch );
+ inc( UInt32( WriteRow ), DestPitch * 2 );
+ end;
+ 4 : for y := 1 to Src.h do
+ begin
+ ReadAddr := ReadRow;
+ WriteAddr := WriteRow;
+ for x := 1 to Src.w do
+ begin
+ PUInt32( WriteAddr )^ := PUInt32( ReadAddr )^;
+ PUInt32( WriteAddr + 4 )^ := PUInt32( ReadAddr )^;
+ inc( ReadAddr, 4 );
+ inc( WriteAddr, 8 );
+ end;
+ inc( UInt32( ReadRow ), SrcPitch );
+ inc( UInt32( WriteRow ), DestPitch * 2 );
+ end;
+ end;
+
+ if SDL_MustLock( Src ) then
+ SDL_UnlockSurface( Src );
+ if SDL_MustLock( Dest ) then
+ SDL_UnlockSurface( Dest );
+end;
+
+procedure SDL_50Scanline2xBlit( Src, Dest : PSDL_Surface );
+var
+ ReadAddr, WriteAddr, ReadRow, WriteRow : UInt32;
+ SrcPitch, DestPitch, x, y, Color : UInt32;
+begin
+ if ( Src = nil ) or ( Dest = nil ) then
+ exit;
+ if ( Src.w shl 1 ) < Dest.w then
+ exit;
+ if ( Src.h shl 1 ) < Dest.h then
+ exit;
+
+ if SDL_MustLock( Src ) then
+ SDL_LockSurface( Src );
+ if SDL_MustLock( Dest ) then
+ SDL_LockSurface( Dest );
+
+ ReadRow := UInt32( Src.Pixels );
+ WriteRow := UInt32( Dest.Pixels );
+
+ SrcPitch := Src.pitch;
+ DestPitch := Dest.pitch;
+
+ case Src.format.BitsPerPixel of
+ 8 : for y := 1 to Src.h do
+ begin
+ ReadAddr := ReadRow;
+ WriteAddr := WriteRow;
+ for x := 1 to Src.w do
+ begin
+ Color := PUInt8( ReadAddr )^;
+ PUInt8( WriteAddr )^ := Color;
+ PUInt8( WriteAddr + 1 )^ := Color;
+ Color := ( Color shr 1 ) and $6D; {%01101101}
+ PUInt8( WriteAddr + DestPitch )^ := Color;
+ PUInt8( WriteAddr + DestPitch + 1 )^ := Color;
+ inc( ReadAddr );
+ inc( WriteAddr, 2 );
+ end;
+ inc( UInt32( ReadRow ), SrcPitch );
+ inc( UInt32( WriteRow ), DestPitch * 2 );
+ end;
+ 15 : for y := 1 to Src.h do
+ begin
+ ReadAddr := ReadRow;
+ WriteAddr := WriteRow;
+ for x := 1 to Src.w do
+ begin
+ Color := PUInt16( ReadAddr )^;
+ PUInt16( WriteAddr )^ := Color;
+ PUInt16( WriteAddr + 2 )^ := Color;
+ Color := ( Color shr 1 ) and $3DEF; {%0011110111101111}
+ PUInt16( WriteAddr + DestPitch )^ := Color;
+ PUInt16( WriteAddr + DestPitch + 2 )^ := Color;
+ inc( ReadAddr, 2 );
+ inc( WriteAddr, 4 );
+ end;
+ inc( UInt32( ReadRow ), SrcPitch );
+ inc( UInt32( WriteRow ), DestPitch * 2 );
+ end;
+ 16 : for y := 1 to Src.h do
+ begin
+ ReadAddr := ReadRow;
+ WriteAddr := WriteRow;
+ for x := 1 to Src.w do
+ begin
+ Color := PUInt16( ReadAddr )^;
+ PUInt16( WriteAddr )^ := Color;
+ PUInt16( WriteAddr + 2 )^ := Color;
+ Color := ( Color shr 1 ) and $7BEF; {%0111101111101111}
+ PUInt16( WriteAddr + DestPitch )^ := Color;
+ PUInt16( WriteAddr + DestPitch + 2 )^ := Color;
+ inc( ReadAddr, 2 );
+ inc( WriteAddr, 4 );
+ end;
+ inc( UInt32( ReadRow ), SrcPitch );
+ inc( UInt32( WriteRow ), DestPitch * 2 );
+ end;
+ 24 : for y := 1 to Src.h do
+ begin
+ ReadAddr := ReadRow;
+ WriteAddr := WriteRow;
+ for x := 1 to Src.w do
+ begin
+ Color := ( PUInt32( WriteAddr )^ and $FF000000 ) or ( PUInt32( ReadAddr )^ and $00FFFFFF );
+ PUInt32( WriteAddr )^ := Color;
+ PUInt32( WriteAddr + 3 )^ := Color;
+ Color := ( Color shr 1 ) and $007F7F7F; {%011111110111111101111111}
+ PUInt32( WriteAddr + DestPitch )^ := Color;
+ PUInt32( WriteAddr + DestPitch + 3 )^ := Color;
+ inc( ReadAddr, 3 );
+ inc( WriteAddr, 6 );
+ end;
+ inc( UInt32( ReadRow ), SrcPitch );
+ inc( UInt32( WriteRow ), DestPitch * 2 );
+ end;
+ 32 : for y := 1 to Src.h do
+ begin
+ ReadAddr := ReadRow;
+ WriteAddr := WriteRow;
+ for x := 1 to Src.w do
+ begin
+ Color := PUInt32( ReadAddr )^;
+ PUInt32( WriteAddr )^ := Color;
+ PUInt32( WriteAddr + 4 )^ := Color;
+ Color := ( Color shr 1 ) and $7F7F7F7F;
+ PUInt32( WriteAddr + DestPitch )^ := Color;
+ PUInt32( WriteAddr + DestPitch + 4 )^ := Color;
+ inc( ReadAddr, 4 );
+ inc( WriteAddr, 8 );
+ end;
+ inc( UInt32( ReadRow ), SrcPitch );
+ inc( UInt32( WriteRow ), DestPitch * 2 );
+ end;
+ end;
+
+ if SDL_MustLock( Src ) then
+ SDL_UnlockSurface( Src );
+ if SDL_MustLock( Dest ) then
+ SDL_UnlockSurface( Dest );
+end;
+
+function SDL_PixelTestSurfaceVsRect( SrcSurface1 : PSDL_Surface; SrcRect1 :
+ PSDL_Rect; SrcRect2 : PSDL_Rect; Left1, Top1, Left2, Top2 : integer ) :
+ boolean;
+var
+ Src_Rect1, Src_Rect2 : TSDL_Rect;
+ right1, bottom1 : integer;
+ right2, bottom2 : integer;
+ Scan1Start, {Scan2Start,} ScanWidth, ScanHeight : cardinal;
+ Mod1 : cardinal;
+ Addr1 : cardinal;
+ BPP : cardinal;
+ Pitch1 : cardinal;
+ TransparentColor1 : cardinal;
+ tx, ty : cardinal;
+ StartTick : cardinal;
+ Color1 : cardinal;
+begin
+ Result := false;
+ if SrcRect1 = nil then
+ begin
+ with Src_Rect1 do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface1.w;
+ h := SrcSurface1.h;
+ end;
+ end
+ else
+ Src_Rect1 := SrcRect1^;
+
+ Src_Rect2 := SrcRect2^;
+ with Src_Rect1 do
+ begin
+ Right1 := Left1 + w;
+ Bottom1 := Top1 + h;
+ end;
+ with Src_Rect2 do
+ begin
+ Right2 := Left2 + w;
+ Bottom2 := Top2 + h;
+ end;
+ if ( Left1 >= Right2 ) or ( Right1 <= Left2 ) or ( Top1 >= Bottom2 ) or ( Bottom1 <= Top2 ) then
+ exit;
+ if Left1 <= Left2 then
+ begin
+ // 1. left, 2. right
+ Scan1Start := Src_Rect1.x + Left2 - Left1;
+ //Scan2Start := Src_Rect2.x;
+ ScanWidth := Right1 - Left2;
+ with Src_Rect2 do
+ if ScanWidth > w then
+ ScanWidth := w;
+ end
+ else
+ begin
+ // 1. right, 2. left
+ Scan1Start := Src_Rect1.x;
+ //Scan2Start := Src_Rect2.x + Left1 - Left2;
+ ScanWidth := Right2 - Left1;
+ with Src_Rect1 do
+ if ScanWidth > w then
+ ScanWidth := w;
+ end;
+ with SrcSurface1^ do
+ begin
+ Pitch1 := Pitch;
+ Addr1 := cardinal( Pixels );
+ inc( Addr1, Pitch1 * UInt32( Src_Rect1.y ) );
+ with format^ do
+ begin
+ BPP := BytesPerPixel;
+ TransparentColor1 := colorkey;
+ end;
+ end;
+
+ Mod1 := Pitch1 - ( ScanWidth * BPP );
+
+ inc( Addr1, BPP * Scan1Start );
+
+ if Top1 <= Top2 then
+ begin
+ // 1. up, 2. down
+ ScanHeight := Bottom1 - Top2;
+ if ScanHeight > Src_Rect2.h then
+ ScanHeight := Src_Rect2.h;
+ inc( Addr1, Pitch1 * UInt32( Top2 - Top1 ) );
+ end
+ else
+ begin
+ // 1. down, 2. up
+ ScanHeight := Bottom2 - Top1;
+ if ScanHeight > Src_Rect1.h then
+ ScanHeight := Src_Rect1.h;
+
+ end;
+ case BPP of
+ 1 :
+ for ty := 1 to ScanHeight do
+ begin
+ for tx := 1 to ScanWidth do
+ begin
+ if ( PByte( Addr1 )^ <> TransparentColor1 ) then
+ begin
+ Result := true;
+ exit;
+ end;
+ inc( Addr1 );
+
+ end;
+ inc( Addr1, Mod1 );
+
+ end;
+ 2 :
+ for ty := 1 to ScanHeight do
+ begin
+ for tx := 1 to ScanWidth do
+ begin
+ if ( PWord( Addr1 )^ <> TransparentColor1 ) then
+ begin
+ Result := true;
+ exit;
+ end;
+ inc( Addr1, 2 );
+
+ end;
+ inc( Addr1, Mod1 );
+
+ end;
+ 3 :
+ for ty := 1 to ScanHeight do
+ begin
+ for tx := 1 to ScanWidth do
+ begin
+ Color1 := PLongWord( Addr1 )^ and $00FFFFFF;
+
+ if ( Color1 <> TransparentColor1 )
+ then
+ begin
+ Result := true;
+ exit;
+ end;
+ inc( Addr1, 3 );
+
+ end;
+ inc( Addr1, Mod1 );
+
+ end;
+ 4 :
+ for ty := 1 to ScanHeight do
+ begin
+ for tx := 1 to ScanWidth do
+ begin
+ if ( PLongWord( Addr1 )^ <> TransparentColor1 ) then
+ begin
+ Result := true;
+ exit;
+ end;
+ inc( Addr1, 4 );
+
+ end;
+ inc( Addr1, Mod1 );
+
+ end;
+ end;
+end;
+
+procedure SDL_ORSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
+var
+ R, G, B, Pixel1, Pixel2, TransparentColor : cardinal;
+ Src, Dest : TSDL_Rect;
+ Diff : integer;
+ SrcAddr, DestAddr : cardinal;
+ WorkX, WorkY : word;
+ SrcMod, DestMod : cardinal;
+ Bits : cardinal;
+begin
+ if ( SrcSurface = nil ) or ( DestSurface = nil ) then
+ exit; // Remove this to make it faster
+ if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
+ exit; // Remove this to make it faster
+ if SrcRect = nil then
+ begin
+ with Src do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface.w;
+ h := SrcSurface.h;
+ end;
+ end
+ else
+ Src := SrcRect^;
+ if DestRect = nil then
+ begin
+ Dest.x := 0;
+ Dest.y := 0;
+ end
+ else
+ Dest := DestRect^;
+ Dest.w := Src.w;
+ Dest.h := Src.h;
+ with DestSurface.Clip_Rect do
+ begin
+ // Source's right side is greater than the dest.cliprect
+ if Dest.x + Src.w > x + w then
+ begin
+ smallint( Src.w ) := x + w - Dest.x;
+ smallint( Dest.w ) := x + w - Dest.x;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's bottom side is greater than the dest.clip
+ if Dest.y + Src.h > y + h then
+ begin
+ smallint( Src.h ) := y + h - Dest.y;
+ smallint( Dest.h ) := y + h - Dest.y;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ // Source's left side is less than the dest.clip
+ if Dest.x < x then
+ begin
+ Diff := x - Dest.x;
+ Src.x := Src.x + Diff;
+ smallint( Src.w ) := smallint( Src.w ) - Diff;
+ Dest.x := x;
+ smallint( Dest.w ) := smallint( Dest.w ) - Diff;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's Top side is less than the dest.clip
+ if Dest.y < y then
+ begin
+ Diff := y - Dest.y;
+ Src.y := Src.y + Diff;
+ smallint( Src.h ) := smallint( Src.h ) - Diff;
+ Dest.y := y;
+ smallint( Dest.h ) := smallint( Dest.h ) - Diff;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ end;
+ with SrcSurface^ do
+ begin
+ SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
+ Format.BytesPerPixel;
+ SrcMod := Pitch - Src.w * Format.BytesPerPixel;
+ TransparentColor := Format.colorkey;
+ end;
+ with DestSurface^ do
+ begin
+ DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
+ Format.BytesPerPixel;
+ DestMod := Pitch - Dest.w * Format.BytesPerPixel;
+ Bits := Format.BitsPerPixel;
+ end;
+ SDL_LockSurface( SrcSurface );
+ SDL_LockSurface( DestSurface );
+ WorkY := Src.h;
+ case bits of
+ 8 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt8( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt8( DestAddr )^;
+ PUInt8( DestAddr )^ := Pixel2 or Pixel1;
+ end;
+ inc( SrcAddr );
+ inc( DestAddr );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 15 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt16( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt16( DestAddr )^;
+
+ PUInt16( DestAddr )^ := Pixel2 or Pixel1;
+
+ end;
+ inc( SrcAddr, 2 );
+ inc( DestAddr, 2 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 16 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt16( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt16( DestAddr )^;
+
+ PUInt16( DestAddr )^ := Pixel2 or Pixel1;
+
+ end;
+ inc( SrcAddr, 2 );
+ inc( DestAddr, 2 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 24 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt32( SrcAddr )^ and $00FFFFFF;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt32( DestAddr )^ and $00FFFFFF;
+
+ PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or Pixel2 or Pixel1;
+ end;
+ inc( SrcAddr, 3 );
+ inc( DestAddr, 3 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 32 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt32( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt32( DestAddr )^;
+
+ PUInt32( DestAddr )^ := Pixel2 or Pixel1;
+ end;
+ inc( SrcAddr, 4 );
+ inc( DestAddr, 4 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ end;
+ SDL_UnlockSurface( SrcSurface );
+ SDL_UnlockSurface( DestSurface );
+end;
+
+procedure SDL_ANDSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
+var
+ R, G, B, Pixel1, Pixel2, TransparentColor : cardinal;
+ Src, Dest : TSDL_Rect;
+ Diff : integer;
+ SrcAddr, DestAddr : cardinal;
+ WorkX, WorkY : word;
+ SrcMod, DestMod : cardinal;
+ Bits : cardinal;
+begin
+ if ( SrcSurface = nil ) or ( DestSurface = nil ) then
+ exit; // Remove this to make it faster
+ if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
+ exit; // Remove this to make it faster
+ if SrcRect = nil then
+ begin
+ with Src do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface.w;
+ h := SrcSurface.h;
+ end;
+ end
+ else
+ Src := SrcRect^;
+ if DestRect = nil then
+ begin
+ Dest.x := 0;
+ Dest.y := 0;
+ end
+ else
+ Dest := DestRect^;
+ Dest.w := Src.w;
+ Dest.h := Src.h;
+ with DestSurface.Clip_Rect do
+ begin
+ // Source's right side is greater than the dest.cliprect
+ if Dest.x + Src.w > x + w then
+ begin
+ smallint( Src.w ) := x + w - Dest.x;
+ smallint( Dest.w ) := x + w - Dest.x;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's bottom side is greater than the dest.clip
+ if Dest.y + Src.h > y + h then
+ begin
+ smallint( Src.h ) := y + h - Dest.y;
+ smallint( Dest.h ) := y + h - Dest.y;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ // Source's left side is less than the dest.clip
+ if Dest.x < x then
+ begin
+ Diff := x - Dest.x;
+ Src.x := Src.x + Diff;
+ smallint( Src.w ) := smallint( Src.w ) - Diff;
+ Dest.x := x;
+ smallint( Dest.w ) := smallint( Dest.w ) - Diff;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's Top side is less than the dest.clip
+ if Dest.y < y then
+ begin
+ Diff := y - Dest.y;
+ Src.y := Src.y + Diff;
+ smallint( Src.h ) := smallint( Src.h ) - Diff;
+ Dest.y := y;
+ smallint( Dest.h ) := smallint( Dest.h ) - Diff;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ end;
+ with SrcSurface^ do
+ begin
+ SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
+ Format.BytesPerPixel;
+ SrcMod := Pitch - Src.w * Format.BytesPerPixel;
+ TransparentColor := Format.colorkey;
+ end;
+ with DestSurface^ do
+ begin
+ DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
+ Format.BytesPerPixel;
+ DestMod := Pitch - Dest.w * Format.BytesPerPixel;
+ Bits := Format.BitsPerPixel;
+ end;
+ SDL_LockSurface( SrcSurface );
+ SDL_LockSurface( DestSurface );
+ WorkY := Src.h;
+ case bits of
+ 8 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt8( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt8( DestAddr )^;
+ PUInt8( DestAddr )^ := Pixel2 and Pixel1;
+ end;
+ inc( SrcAddr );
+ inc( DestAddr );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 15 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt16( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt16( DestAddr )^;
+
+ PUInt16( DestAddr )^ := Pixel2 and Pixel1;
+
+ end;
+ inc( SrcAddr, 2 );
+ inc( DestAddr, 2 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 16 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt16( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt16( DestAddr )^;
+
+ PUInt16( DestAddr )^ := Pixel2 and Pixel1;
+
+ end;
+ inc( SrcAddr, 2 );
+ inc( DestAddr, 2 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 24 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt32( SrcAddr )^ and $00FFFFFF;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt32( DestAddr )^ and $00FFFFFF;
+
+ PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or Pixel2 and Pixel1;
+ end;
+ inc( SrcAddr, 3 );
+ inc( DestAddr, 3 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 32 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt32( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt32( DestAddr )^;
+
+ PUInt32( DestAddr )^ := Pixel2 and Pixel1;
+ end;
+ inc( SrcAddr, 4 );
+ inc( DestAddr, 4 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ end;
+ SDL_UnlockSurface( SrcSurface );
+ SDL_UnlockSurface( DestSurface );
+end;
+
+
+
+procedure SDL_GTSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
+var
+ R, G, B, Pixel1, Pixel2, TransparentColor : cardinal;
+ Src, Dest : TSDL_Rect;
+ Diff : integer;
+ SrcAddr, DestAddr : cardinal;
+ WorkX, WorkY : word;
+ SrcMod, DestMod : cardinal;
+ Bits : cardinal;
+begin
+ if ( SrcSurface = nil ) or ( DestSurface = nil ) then
+ exit; // Remove this to make it faster
+ if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
+ exit; // Remove this to make it faster
+ if SrcRect = nil then
+ begin
+ with Src do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface.w;
+ h := SrcSurface.h;
+ end;
+ end
+ else
+ Src := SrcRect^;
+ if DestRect = nil then
+ begin
+ Dest.x := 0;
+ Dest.y := 0;
+ end
+ else
+ Dest := DestRect^;
+ Dest.w := Src.w;
+ Dest.h := Src.h;
+ with DestSurface.Clip_Rect do
+ begin
+ // Source's right side is greater than the dest.cliprect
+ if Dest.x + Src.w > x + w then
+ begin
+ smallint( Src.w ) := x + w - Dest.x;
+ smallint( Dest.w ) := x + w - Dest.x;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's bottom side is greater than the dest.clip
+ if Dest.y + Src.h > y + h then
+ begin
+ smallint( Src.h ) := y + h - Dest.y;
+ smallint( Dest.h ) := y + h - Dest.y;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ // Source's left side is less than the dest.clip
+ if Dest.x < x then
+ begin
+ Diff := x - Dest.x;
+ Src.x := Src.x + Diff;
+ smallint( Src.w ) := smallint( Src.w ) - Diff;
+ Dest.x := x;
+ smallint( Dest.w ) := smallint( Dest.w ) - Diff;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's Top side is less than the dest.clip
+ if Dest.y < y then
+ begin
+ Diff := y - Dest.y;
+ Src.y := Src.y + Diff;
+ smallint( Src.h ) := smallint( Src.h ) - Diff;
+ Dest.y := y;
+ smallint( Dest.h ) := smallint( Dest.h ) - Diff;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ end;
+ with SrcSurface^ do
+ begin
+ SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
+ Format.BytesPerPixel;
+ SrcMod := Pitch - Src.w * Format.BytesPerPixel;
+ TransparentColor := Format.colorkey;
+ end;
+ with DestSurface^ do
+ begin
+ DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
+ Format.BytesPerPixel;
+ DestMod := Pitch - Dest.w * Format.BytesPerPixel;
+ Bits := Format.BitsPerPixel;
+ end;
+ SDL_LockSurface( SrcSurface );
+ SDL_LockSurface( DestSurface );
+ WorkY := Src.h;
+ case bits of
+ 8 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt8( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt8( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+ if Pixel2 and $E0 > Pixel1 and $E0 then
+ R := Pixel2 and $E0
+ else
+ R := Pixel1 and $E0;
+ if Pixel2 and $1C > Pixel1 and $1C then
+ G := Pixel2 and $1C
+ else
+ G := Pixel1 and $1C;
+ if Pixel2 and $03 > Pixel1 and $03 then
+ B := Pixel2 and $03
+ else
+ B := Pixel1 and $03;
+
+ if R > $E0 then
+ R := $E0;
+ if G > $1C then
+ G := $1C;
+ if B > $03 then
+ B := $03;
+ PUInt8( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt8( DestAddr )^ := Pixel1;
+ end;
+ inc( SrcAddr );
+ inc( DestAddr );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 15 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt16( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt16( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+
+ if Pixel2 and $7C00 > Pixel1 and $7C00 then
+ R := Pixel2 and $7C00
+ else
+ R := Pixel1 and $7C00;
+ if Pixel2 and $03E0 > Pixel1 and $03E0 then
+ G := Pixel2 and $03E0
+ else
+ G := Pixel1 and $03E0;
+ if Pixel2 and $001F > Pixel1 and $001F then
+ B := Pixel2 and $001F
+ else
+ B := Pixel1 and $001F;
+
+ PUInt16( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt16( DestAddr )^ := Pixel1;
+ end;
+ inc( SrcAddr, 2 );
+ inc( DestAddr, 2 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 16 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt16( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt16( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+
+ if Pixel2 and $F800 > Pixel1 and $F800 then
+ R := Pixel2 and $F800
+ else
+ R := Pixel1 and $F800;
+ if Pixel2 and $07E0 > Pixel1 and $07E0 then
+ G := Pixel2 and $07E0
+ else
+ G := Pixel1 and $07E0;
+ if Pixel2 and $001F > Pixel1 and $001F then
+ B := Pixel2 and $001F
+ else
+ B := Pixel1 and $001F;
+
+ PUInt16( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt16( DestAddr )^ := Pixel1;
+ end;
+ inc( SrcAddr, 2 );
+ inc( DestAddr, 2 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 24 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt32( SrcAddr )^ and $00FFFFFF;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt32( DestAddr )^ and $00FFFFFF;
+ if Pixel2 > 0 then
+ begin
+
+ if Pixel2 and $FF0000 > Pixel1 and $FF0000 then
+ R := Pixel2 and $FF0000
+ else
+ R := Pixel1 and $FF0000;
+ if Pixel2 and $00FF00 > Pixel1 and $00FF00 then
+ G := Pixel2 and $00FF00
+ else
+ G := Pixel1 and $00FF00;
+ if Pixel2 and $0000FF > Pixel1 and $0000FF then
+ B := Pixel2 and $0000FF
+ else
+ B := Pixel1 and $0000FF;
+
+ PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or ( R or G or B );
+ end
+ else
+ PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or Pixel1;
+ end;
+ inc( SrcAddr, 3 );
+ inc( DestAddr, 3 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 32 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt32( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt32( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+
+ if Pixel2 and $FF0000 > Pixel1 and $FF0000 then
+ R := Pixel2 and $FF0000
+ else
+ R := Pixel1 and $FF0000;
+ if Pixel2 and $00FF00 > Pixel1 and $00FF00 then
+ G := Pixel2 and $00FF00
+ else
+ G := Pixel1 and $00FF00;
+ if Pixel2 and $0000FF > Pixel1 and $0000FF then
+ B := Pixel2 and $0000FF
+ else
+ B := Pixel1 and $0000FF;
+
+ PUInt32( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt32( DestAddr )^ := Pixel1;
+ end;
+ inc( SrcAddr, 4 );
+ inc( DestAddr, 4 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ end;
+ SDL_UnlockSurface( SrcSurface );
+ SDL_UnlockSurface( DestSurface );
+end;
+
+
+procedure SDL_LTSurface( SrcSurface : PSDL_Surface; SrcRect : PSDL_Rect;
+ DestSurface : PSDL_Surface; DestRect : PSDL_Rect );
+var
+ R, G, B, Pixel1, Pixel2, TransparentColor : cardinal;
+ Src, Dest : TSDL_Rect;
+ Diff : integer;
+ SrcAddr, DestAddr : cardinal;
+ WorkX, WorkY : word;
+ SrcMod, DestMod : cardinal;
+ Bits : cardinal;
+begin
+ if ( SrcSurface = nil ) or ( DestSurface = nil ) then
+ exit; // Remove this to make it faster
+ if ( SrcSurface.Format.BitsPerPixel <> DestSurface.Format.BitsPerPixel ) then
+ exit; // Remove this to make it faster
+ if SrcRect = nil then
+ begin
+ with Src do
+ begin
+ x := 0;
+ y := 0;
+ w := SrcSurface.w;
+ h := SrcSurface.h;
+ end;
+ end
+ else
+ Src := SrcRect^;
+ if DestRect = nil then
+ begin
+ Dest.x := 0;
+ Dest.y := 0;
+ end
+ else
+ Dest := DestRect^;
+ Dest.w := Src.w;
+ Dest.h := Src.h;
+ with DestSurface.Clip_Rect do
+ begin
+ // Source's right side is greater than the dest.cliprect
+ if Dest.x + Src.w > x + w then
+ begin
+ smallint( Src.w ) := x + w - Dest.x;
+ smallint( Dest.w ) := x + w - Dest.x;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's bottom side is greater than the dest.clip
+ if Dest.y + Src.h > y + h then
+ begin
+ smallint( Src.h ) := y + h - Dest.y;
+ smallint( Dest.h ) := y + h - Dest.y;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ // Source's left side is less than the dest.clip
+ if Dest.x < x then
+ begin
+ Diff := x - Dest.x;
+ Src.x := Src.x + Diff;
+ smallint( Src.w ) := smallint( Src.w ) - Diff;
+ Dest.x := x;
+ smallint( Dest.w ) := smallint( Dest.w ) - Diff;
+ if smallint( Dest.w ) < 1 then
+ exit;
+ end;
+ // Source's Top side is less than the dest.clip
+ if Dest.y < y then
+ begin
+ Diff := y - Dest.y;
+ Src.y := Src.y + Diff;
+ smallint( Src.h ) := smallint( Src.h ) - Diff;
+ Dest.y := y;
+ smallint( Dest.h ) := smallint( Dest.h ) - Diff;
+ if smallint( Dest.h ) < 1 then
+ exit;
+ end;
+ end;
+ with SrcSurface^ do
+ begin
+ SrcAddr := cardinal( Pixels ) + UInt32( Src.y ) * Pitch + UInt32( Src.x ) *
+ Format.BytesPerPixel;
+ SrcMod := Pitch - Src.w * Format.BytesPerPixel;
+ TransparentColor := Format.colorkey;
+ end;
+ with DestSurface^ do
+ begin
+ DestAddr := cardinal( Pixels ) + UInt32( Dest.y ) * Pitch + UInt32( Dest.x ) *
+ Format.BytesPerPixel;
+ DestMod := Pitch - Dest.w * Format.BytesPerPixel;
+ Bits := Format.BitsPerPixel;
+ end;
+ SDL_LockSurface( SrcSurface );
+ SDL_LockSurface( DestSurface );
+ WorkY := Src.h;
+ case bits of
+ 8 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt8( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt8( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+ if Pixel2 and $E0 < Pixel1 and $E0 then
+ R := Pixel2 and $E0
+ else
+ R := Pixel1 and $E0;
+ if Pixel2 and $1C < Pixel1 and $1C then
+ G := Pixel2 and $1C
+ else
+ G := Pixel1 and $1C;
+ if Pixel2 and $03 < Pixel1 and $03 then
+ B := Pixel2 and $03
+ else
+ B := Pixel1 and $03;
+
+ if R > $E0 then
+ R := $E0;
+ if G > $1C then
+ G := $1C;
+ if B > $03 then
+ B := $03;
+ PUInt8( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt8( DestAddr )^ := Pixel1;
+ end;
+ inc( SrcAddr );
+ inc( DestAddr );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 15 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt16( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt16( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+
+ if Pixel2 and $7C00 < Pixel1 and $7C00 then
+ R := Pixel2 and $7C00
+ else
+ R := Pixel1 and $7C00;
+ if Pixel2 and $03E0 < Pixel1 and $03E0 then
+ G := Pixel2 and $03E0
+ else
+ G := Pixel1 and $03E0;
+ if Pixel2 and $001F < Pixel1 and $001F then
+ B := Pixel2 and $001F
+ else
+ B := Pixel1 and $001F;
+
+ PUInt16( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt16( DestAddr )^ := Pixel1;
+ end;
+ inc( SrcAddr, 2 );
+ inc( DestAddr, 2 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 16 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt16( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt16( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+
+ if Pixel2 and $F800 < Pixel1 and $F800 then
+ R := Pixel2 and $F800
+ else
+ R := Pixel1 and $F800;
+ if Pixel2 and $07E0 < Pixel1 and $07E0 then
+ G := Pixel2 and $07E0
+ else
+ G := Pixel1 and $07E0;
+ if Pixel2 and $001F < Pixel1 and $001F then
+ B := Pixel2 and $001F
+ else
+ B := Pixel1 and $001F;
+
+ PUInt16( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt16( DestAddr )^ := Pixel1;
+ end;
+ inc( SrcAddr, 2 );
+ inc( DestAddr, 2 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 24 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt32( SrcAddr )^ and $00FFFFFF;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt32( DestAddr )^ and $00FFFFFF;
+ if Pixel2 > 0 then
+ begin
+
+ if Pixel2 and $FF0000 < Pixel1 and $FF0000 then
+ R := Pixel2 and $FF0000
+ else
+ R := Pixel1 and $FF0000;
+ if Pixel2 and $00FF00 < Pixel1 and $00FF00 then
+ G := Pixel2 and $00FF00
+ else
+ G := Pixel1 and $00FF00;
+ if Pixel2 and $0000FF < Pixel1 and $0000FF then
+ B := Pixel2 and $0000FF
+ else
+ B := Pixel1 and $0000FF;
+
+ PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or ( R or G or B );
+ end
+ else
+ PUInt32( DestAddr )^ := PUInt32( DestAddr )^ and $FF000000 or Pixel1;
+ end;
+ inc( SrcAddr, 3 );
+ inc( DestAddr, 3 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ 32 :
+ begin
+ repeat
+ WorkX := Src.w;
+ repeat
+ Pixel1 := PUInt32( SrcAddr )^;
+ if ( Pixel1 <> TransparentColor ) and ( Pixel1 <> 0 ) then
+ begin
+ Pixel2 := PUInt32( DestAddr )^;
+ if Pixel2 > 0 then
+ begin
+
+ if Pixel2 and $FF0000 < Pixel1 and $FF0000 then
+ R := Pixel2 and $FF0000
+ else
+ R := Pixel1 and $FF0000;
+ if Pixel2 and $00FF00 < Pixel1 and $00FF00 then
+ G := Pixel2 and $00FF00
+ else
+ G := Pixel1 and $00FF00;
+ if Pixel2 and $0000FF < Pixel1 and $0000FF then
+ B := Pixel2 and $0000FF
+ else
+ B := Pixel1 and $0000FF;
+
+ PUInt32( DestAddr )^ := R or G or B;
+ end
+ else
+ PUInt32( DestAddr )^ := Pixel1;
+ end;
+ inc( SrcAddr, 4 );
+ inc( DestAddr, 4 );
+ dec( WorkX );
+ until WorkX = 0;
+ inc( SrcAddr, SrcMod );
+ inc( DestAddr, DestMod );
+ dec( WorkY );
+ until WorkY = 0;
+ end;
+ end;
+ SDL_UnlockSurface( SrcSurface );
+ SDL_UnlockSurface( DestSurface );
+end;
+
+// Will clip the x1,x2,y1,x2 params to the ClipRect provided
+
+function SDL_ClipLine( var x1, y1, x2, y2 : Integer; ClipRect : PSDL_Rect ) : boolean;
+var
+ tflag, flag1, flag2 : word;
+ txy, xedge, yedge : Integer;
+ slope : single;
+
+ function ClipCode( x, y : Integer ) : word;
+ begin
+ Result := 0;
+ if x < ClipRect.x then
+ Result := 1;
+ if x >= ClipRect.w + ClipRect.x then
+ Result := Result or 2;
+ if y < ClipRect.y then
+ Result := Result or 4;
+ if y >= ClipRect.h + ClipRect.y then
+ Result := Result or 8;
+ end;
+
+begin
+ flag1 := ClipCode( x1, y1 );
+ flag2 := ClipCode( x2, y2 );
+ result := true;
+
+ while true do
+ begin
+ if ( flag1 or flag2 ) = 0 then
+ Exit; // all in
+
+ if ( flag1 and flag2 ) <> 0 then
+ begin
+ result := false;
+ Exit; // all out
+ end;
+
+ if flag2 = 0 then
+ begin
+ txy := x1; x1 := x2; x2 := txy;
+ txy := y1; y1 := y2; y2 := txy;
+ tflag := flag1; flag1 := flag2; flag2 := tflag;
+ end;
+
+ if ( flag2 and 3 ) <> 0 then
+ begin
+ if ( flag2 and 1 ) <> 0 then
+ xedge := ClipRect.x
+ else
+ xedge := ClipRect.w + ClipRect.x - 1; // back 1 pixel otherwise we end up in a loop
+
+ slope := ( y2 - y1 ) / ( x2 - x1 );
+ y2 := y1 + Round( slope * ( xedge - x1 ) );
+ x2 := xedge;
+ end
+ else
+ begin
+ if ( flag2 and 4 ) <> 0 then
+ yedge := ClipRect.y
+ else
+ yedge := ClipRect.h + ClipRect.y - 1; // up 1 pixel otherwise we end up in a loop
+
+ slope := ( x2 - x1 ) / ( y2 - y1 );
+ x2 := x1 + Round( slope * ( yedge - y1 ) );
+ y2 := yedge;
+ end;
+
+ flag2 := ClipCode( x2, y2 );
+ end;
+end;
+
+end.
+
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlwindow.pas b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlwindow.pas
new file mode 100644
index 00000000..ba60714b
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/sdlwindow.pas
@@ -0,0 +1,566 @@
+unit sdlwindow;
+{
+ $Id: sdlwindow.pas,v 1.9 2006/10/22 18:55:25 savage Exp $
+
+}
+{******************************************************************************}
+{ }
+{ JEDI-SDL : Pascal units for SDL - Simple DirectMedia Layer }
+{ SDL Window Wrapper }
+{ }
+{ }
+{ The initial developer of this Pascal code was : }
+{ Dominique Louis <Dominique@SavageSoftware.com.au> }
+{ }
+{ Portions created by Dominique Louis are }
+{ Copyright (C) 2004 - 2100 Dominique Louis. }
+{ }
+{ }
+{ Contributor(s) }
+{ -------------- }
+{ Dominique Louis <Dominique@SavageSoftware.com.au> }
+{ }
+{ Obtained through: }
+{ Joint Endeavour of Delphi Innovators ( Project JEDI ) }
+{ }
+{ You may retrieve the latest version of this file at the Project }
+{ JEDI home page, located at http://delphi-jedi.org }
+{ }
+{ The contents of this file are used with permission, subject to }
+{ the Mozilla Public License Version 1.1 (the "License"); you may }
+{ not use this file except in compliance with the License. You may }
+{ obtain a copy of the License at }
+{ http://www.mozilla.org/MPL/MPL-1.1.html }
+{ }
+{ Software distributed under the License is distributed on an }
+{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
+{ implied. See the License for the specific language governing }
+{ rights and limitations under the License. }
+{ }
+{ Description }
+{ ----------- }
+{ SDL Window Wrapper }
+{ }
+{ }
+{ Requires }
+{ -------- }
+{ SDL.dll on Windows platforms }
+{ libSDL-1.1.so.0 on Linux platform }
+{ }
+{ Programming Notes }
+{ ----------------- }
+{ }
+{ }
+{ }
+{ }
+{ Revision History }
+{ ---------------- }
+{ January 31 2003 - DL : Initial creation }
+{ }
+{
+ $Log: sdlwindow.pas,v $
+ Revision 1.9 2006/10/22 18:55:25 savage
+ Slight Change to handle OpenGL context
+
+ Revision 1.8 2005/08/03 18:57:32 savage
+ Various updates and additions. Mainly to handle OpenGL 3D Window support and better cursor support for the mouse class
+
+ Revision 1.7 2004/09/30 22:35:47 savage
+ Changes, enhancements and additions as required to get SoAoS working.
+
+ Revision 1.6 2004/09/12 21:52:58 savage
+ Slight changes to fix some issues with the sdl classes.
+
+ Revision 1.5 2004/05/10 21:11:49 savage
+ changes required to help get SoAoS off the ground.
+
+ Revision 1.4 2004/05/01 14:59:27 savage
+ Updated code
+
+ Revision 1.3 2004/04/23 10:45:28 savage
+ Changes made by Dean Ellis to work more modularly.
+
+ Revision 1.2 2004/03/31 10:06:41 savage
+ Changed so that it now compiles, but is untested.
+
+ Revision 1.1 2004/02/05 00:08:20 savage
+ Module 1.0 release
+
+}
+{******************************************************************************}
+
+interface
+
+{$i jedi-sdl.inc}
+
+uses
+ Classes,
+ sdl,
+ sdlinput,
+ sdlticks;
+
+type
+ TSDLNotifyEvent = procedure {$IFNDEF NOT_OO}of object{$ENDIF};
+ TSDLUpdateEvent = procedure( aElapsedTime : single ) {$IFNDEF NOT_OO}of object{$ENDIF};
+ TSDLResizeEvent = procedure( aWidth : integer; aHeight : integer; aBitDepth : integer; aVideoFlags : Uint32 ) {$IFNDEF NOT_OO}of object{$ENDIF};
+ TSDLUserEvent = procedure( aType : UInt8; aCode : integer; aData1 : Pointer; aData2 : Pointer ) {$IFNDEF NOT_OO}of object{$ENDIF};
+ TSDLActiveEvent = procedure( aGain: UInt8; aState: UInt8 ) {$IFNDEF NOT_OO}of object{$ENDIF};
+
+ TSDLBaseWindow = class( TObject )
+ private
+ FDisplaySurface : PSDL_Surface;
+ FVideoFlags : Uint32;
+ FOnDestroy: TSDLNotifyEvent;
+ FOnCreate: TSDLNotifyEvent;
+ FOnShow: TSDLNotifyEvent;
+ FOnResize: TSDLResizeEvent;
+ FOnUpdate: TSDLUpdateEvent;
+ FOnRender: TSDLNotifyEvent;
+ FOnClose: TSDLNotifyEvent;
+ FLoaded: Boolean;
+ FRendering: Boolean;
+ FHeight: integer;
+ FBitDepth: integer;
+ FWidth: integer;
+ FInputManager: TSDLInputManager;
+ FCaptionText : PChar;
+ FIconName : PChar;
+ FOnActive: TSDLActiveEvent;
+ FOnQuit: TSDLNotifyEvent;
+ FOnExpose: TSDLNotifyEvent;
+ FOnUser: TSDLUserEvent;
+ FTimer : TSDLTicks;
+ protected
+ procedure DoActive( aGain: UInt8; aState: UInt8 );
+ procedure DoCreate;
+ procedure DoClose;
+ procedure DoDestroy;
+ procedure DoUpdate( aElapsedTime : single );
+ procedure DoQuit;
+ procedure DoRender;
+ procedure DoResize( aWidth : integer; aHeight : integer; aBitDepth : integer; aVideoFlags : Uint32 );
+ procedure DoShow;
+ procedure DoUser( aType : UInt8; aCode : integer; aData1 : Pointer; aData2 : Pointer );
+ procedure DoExpose;
+ procedure Render; virtual;
+ procedure Update( aElapsedTime : single ); virtual;
+ procedure InitialiseObjects; virtual;
+ procedure RestoreObjects; virtual;
+ procedure DeleteObjects; virtual;
+ function Flip : integer; virtual;
+ property OnActive : TSDLActiveEvent read FOnActive write FOnActive;
+ property OnClose: TSDLNotifyEvent read FOnClose write FOnClose;
+ property OnDestroy : TSDLNotifyEvent read FOnDestroy write FOnDestroy;
+ property OnCreate : TSDLNotifyEvent read FOnCreate write FOnCreate;
+ property OnUpdate: TSDLUpdateEvent read FOnUpdate write FOnUpdate;
+ property OnQuit : TSDLNotifyEvent read FOnQuit write FOnQuit;
+ property OnResize : TSDLResizeEvent read FOnResize write FOnResize;
+ property OnRender: TSDLNotifyEvent read FOnRender write FOnRender;
+ property OnShow : TSDLNotifyEvent read FOnShow write FOnShow;
+ property OnUser : TSDLUserEvent read FOnUser write FOnUser;
+ property OnExpose : TSDLNotifyEvent read FOnExpose write FOnExpose;
+ property DisplaySurface: PSDL_Surface read FDisplaySurface;
+ public
+ property InputManager : TSDLInputManager read FInputManager;
+ property Loaded : Boolean read FLoaded;
+ property Width : integer read FWidth;
+ property Height : integer read FHeight;
+ property BitDepth : integer read FBitDepth;
+ property Rendering : Boolean read FRendering write FRendering;
+ procedure SetCaption( const aCaptionText : string; const aIconName : string );
+ procedure GetCaption( var aCaptionText : string; var aIconName : string );
+ procedure SetIcon( aIcon : PSDL_Surface; aMask: UInt8 );
+ procedure ActivateVideoMode;
+ constructor Create( aWidth : integer; aHeight : integer; aBitDepth : integer; aVideoFlags : Uint32 ); virtual;
+ destructor Destroy; override;
+ procedure InitialiseEnvironment;
+ function Show : Boolean; virtual;
+ end;
+
+ TSDLCustomWindow = class( TSDLBaseWindow )
+ public
+ property OnCreate;
+ property OnDestroy;
+ property OnClose;
+ property OnShow;
+ property OnResize;
+ property OnRender;
+ property OnUpdate;
+ property DisplaySurface;
+ end;
+
+ TSDL2DWindow = class( TSDLCustomWindow )
+ public
+ constructor Create( aWidth : integer; aHeight : integer; aBitDepth : integer; aVideoFlags : Uint32 = SDL_DOUBLEBUF or SDL_SWSURFACE); override;
+ procedure Render; override;
+ procedure Update( aElapsedTime : single ); override;
+ procedure InitialiseObjects; override;
+ procedure RestoreObjects; override;
+ procedure DeleteObjects; override;
+ function Flip : integer; override;
+ end;
+
+ TSDL3DWindow = class( TSDLCustomWindow )
+ public
+ constructor Create( aWidth : integer; aHeight : integer; aBitDepth : integer; aVideoFlags : Uint32 = SDL_OPENGL or SDL_DOUBLEBUF); override;
+ function Flip : integer; override;
+ procedure Render; override;
+ procedure Update( aElapsedTime : single ); override;
+ procedure InitialiseObjects; override;
+ procedure RestoreObjects; override;
+ procedure DeleteObjects; override;
+ end;
+
+
+
+implementation
+
+uses
+ logger,
+ SysUtils;
+
+{ TSDLBaseWindow }
+procedure TSDLBaseWindow.ActivateVideoMode;
+begin
+ FDisplaySurface := SDL_SetVideoMode( FWidth, FHeight, FBitDepth, FVideoFlags);
+ if (FDisplaySurface = nil) then
+ begin
+ Log.LogError( Format('Could not set video mode: %s', [SDL_GetError]), 'Main');
+ exit;
+ end;
+
+ SetCaption( 'Made with JEDI-SDL', 'JEDI-SDL Icon' );
+end;
+
+constructor TSDLBaseWindow.Create( aWidth : integer; aHeight : integer; aBitDepth : integer; aVideoFlags : Uint32 );
+begin
+ inherited Create;
+ SDL_Init(SDL_INIT_EVERYTHING);
+ FInputManager := TSDLInputManager.Create( [ itJoystick, itKeyBoard, itMouse ]);
+ FTimer := TSDLTicks.Create;
+
+ FWidth := aWidth;
+ FHeight := aHeight;
+ FBitDepth := aBitDepth;
+ FVideoFlags := aVideoFlags;
+
+ DoCreate;
+end;
+
+procedure TSDLBaseWindow.DeleteObjects;
+begin
+ FLoaded := False;
+end;
+
+destructor TSDLBaseWindow.Destroy;
+begin
+ DoDestroy;
+ if FLoaded then
+ DeleteObjects;
+ if FInputManager <> nil then
+ FreeAndNil( FInputManager );
+ if FTimer <> nil then
+ FreeAndNil( FTimer );
+ if FDisplaySurface <> nil then
+ SDL_FreeSurface( FDisplaySurface );
+ inherited Destroy;
+ SDL_Quit;
+end;
+
+procedure TSDLBaseWindow.DoActive(aGain, aState: UInt8);
+begin
+ if Assigned( FOnActive ) then
+ begin
+ FOnActive( aGain, aState );
+ end;
+end;
+
+procedure TSDLBaseWindow.DoClose;
+begin
+ if Assigned( FOnClose ) then
+ begin
+ FOnClose;
+ end;
+end;
+
+procedure TSDLBaseWindow.DoCreate;
+begin
+ if Assigned( FOnCreate ) then
+ begin
+ FOnCreate;
+ end;
+end;
+
+procedure TSDLBaseWindow.DoDestroy;
+begin
+ if Assigned( FOnDestroy ) then
+ begin
+ FOnDestroy;
+ end;
+end;
+
+procedure TSDLBaseWindow.DoExpose;
+begin
+ if Assigned( FOnExpose ) then
+ begin
+ FOnExpose;
+ end;
+end;
+
+procedure TSDLBaseWindow.DoUpdate( aElapsedTime : single );
+begin
+ if Assigned( FOnUpdate ) then
+ begin
+ FOnUpdate( aElapsedTime );
+ end;
+end;
+
+procedure TSDLBaseWindow.DoQuit;
+begin
+ FRendering := false;
+ if Assigned( FOnQuit ) then
+ begin
+ FOnQuit;
+ end;
+end;
+
+procedure TSDLBaseWindow.DoRender;
+begin
+ if Assigned( FOnRender ) then
+ begin
+ FOnRender;
+ end;
+end;
+
+procedure TSDLBaseWindow.DoResize( aWidth : integer; aHeight : integer; aBitDepth : integer; aVideoFlags : Uint32 );
+begin
+ // resize to the new size
+ SDL_FreeSurface(FDisplaySurface);
+ FWidth := aWidth;
+ FHeight := aHeight;
+ FBitDepth := aBitDepth;
+ FVideoFlags := aVideoFlags;
+ FDisplaySurface := SDL_SetVideoMode(aWidth, aHeight, aBitDepth, aVideoFlags);
+ if Assigned( FOnResize ) then
+ begin
+ FOnResize( aWidth, aHeight, aBitDepth, aVideoFlags );
+ end;
+end;
+
+procedure TSDLBaseWindow.DoShow;
+begin
+ if Assigned( FOnShow ) then
+ begin
+ FOnShow;
+ end;
+end;
+
+procedure TSDLBaseWindow.DoUser(aType: UInt8; aCode: integer; aData1, aData2: Pointer);
+begin
+ if Assigned( FOnUser ) then
+ begin
+ FOnUser( aType, aCode, aData1, aData2 );
+ end;
+end;
+
+function TSDLBaseWindow.Flip : integer;
+begin
+ result := 0;
+end;
+
+procedure TSDLBaseWindow.GetCaption( var aCaptionText : string; var aIconName : string );
+begin
+ aCaptionText := string( FCaptionText );
+ aIconName := string( FIconName );
+end;
+
+procedure TSDLBaseWindow.InitialiseEnvironment;
+begin
+ InitialiseObjects;
+ RestoreObjects;
+end;
+
+procedure TSDLBaseWindow.InitialiseObjects;
+begin
+ FLoaded := True;
+end;
+
+procedure TSDLBaseWindow.Update( aElapsedTime : single );
+begin
+ DoUpdate( aElapsedTime );
+end;
+
+procedure TSDLBaseWindow.Render;
+begin
+ DoRender;
+end;
+
+procedure TSDLBaseWindow.RestoreObjects;
+begin
+ FLoaded := false;
+end;
+
+procedure TSDLBaseWindow.SetCaption( const aCaptionText : string; const aIconName : string );
+begin
+ if FCaptionText <> aCaptionText then
+ begin
+ FCaptionText := PChar( aCaptionText );
+ FIconName := PChar( aIconName );
+ SDL_WM_SetCaption( FCaptionText, FIconName );
+ end;
+end;
+
+procedure TSDLBaseWindow.SetIcon(aIcon: PSDL_Surface; aMask: UInt8);
+begin
+ SDL_WM_SetIcon( aIcon, aMask );
+end;
+
+function TSDLBaseWindow.Show : Boolean;
+var
+ eBaseWindowEvent : TSDL_Event;
+begin
+ DoShow;
+
+ FTimer.Init;
+
+ FRendering := true;
+ // repeat until we are told not to render
+ while FRendering do
+ begin
+ // wait for an event
+ while SDL_PollEvent( @eBaseWindowEvent ) > 0 do
+ begin
+
+ // check for a quit event
+ case eBaseWindowEvent.type_ of
+ SDL_ACTIVEEVENT :
+ begin
+ DoActive( eBaseWindowEvent.active.gain, eBaseWindowEvent.active.state );
+ end;
+
+ SDL_QUITEV :
+ begin
+ DoQuit;
+ DoClose;
+ end;
+
+ SDL_USEREVENT :
+ begin
+ DoUser( eBaseWindowEvent.user.type_, eBaseWindowEvent.user.code, eBaseWindowEvent.user.data1, eBaseWindowEvent.user.data2 );
+ end;
+
+ SDL_VIDEOEXPOSE :
+ begin
+ DoExpose;
+ end;
+
+ SDL_VIDEORESIZE :
+ begin
+ DoResize( eBaseWindowEvent.resize.w, eBaseWindowEvent.resize.h, FDisplaySurface.format.BitsPerPixel, FVideoflags );
+ end;
+
+
+ end;
+ InputManager.UpdateInputs( eBaseWindowEvent );
+ end;
+ // Prepare the Next Frame
+ Update( FTimer.GetElapsedSeconds );
+ // Display the Next Frame
+ Render;
+ // Flip the surfaces
+ Flip;
+ end;
+
+ Result := FRendering;
+end;
+
+{ TSDL2DWindow }
+
+constructor TSDL2DWindow.Create(aWidth, aHeight, aBitDepth: integer; aVideoFlags: Uint32);
+begin
+ // make sure double buffer is always included in the video flags
+ inherited Create(aWidth,aHeight, aBitDepth, aVideoFlags or SDL_DOUBLEBUF);
+end;
+
+procedure TSDL2DWindow.DeleteObjects;
+begin
+ inherited;
+
+end;
+
+function TSDL2DWindow.Flip: integer;
+begin
+ // let's show the back buffer
+ result := SDL_Flip( FDisplaySurface );
+end;
+
+procedure TSDL2DWindow.InitialiseObjects;
+begin
+ inherited;
+
+end;
+
+procedure TSDL2DWindow.Update( aElapsedTime : single );
+begin
+ inherited;
+
+end;
+
+procedure TSDL2DWindow.Render;
+begin
+ inherited;
+
+end;
+
+procedure TSDL2DWindow.RestoreObjects;
+begin
+ inherited;
+
+end;
+
+{ TSDL3DWindow }
+
+constructor TSDL3DWindow.Create(aWidth,
+ aHeight, aBitDepth: integer; aVideoFlags: Uint32);
+begin
+ // make sure opengl is always included in the video flags
+ inherited Create(aWidth,aHeight, aBitDepth, aVideoFlags or SDL_OPENGL or SDL_DOUBLEBUF);
+end;
+
+procedure TSDL3DWindow.DeleteObjects;
+begin
+ inherited;
+
+end;
+
+function TSDL3DWindow.Flip : integer;
+begin
+ SDL_GL_SwapBuffers;
+ result := 0;
+end;
+
+procedure TSDL3DWindow.InitialiseObjects;
+begin
+ inherited;
+
+end;
+
+procedure TSDL3DWindow.Update( aElapsedTime : single );
+begin
+ inherited;
+
+end;
+
+procedure TSDL3DWindow.Render;
+begin
+ inherited;
+
+end;
+
+procedure TSDL3DWindow.RestoreObjects;
+begin
+ inherited;
+
+end;
+
+end.
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/userpreferences.pas b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/userpreferences.pas
new file mode 100644
index 00000000..97e26520
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/userpreferences.pas
@@ -0,0 +1,159 @@
+unit userpreferences;
+{
+ $Id: userpreferences.pas,v 1.1 2004/09/30 22:35:47 savage Exp $
+
+}
+{******************************************************************************}
+{ }
+{ JEDI-SDL : Pascal units for SDL - Simple DirectMedia Layer }
+{ Base Class for User Preferences }
+{ }
+{ The initial developer of this Pascal code was : }
+{ Dominqiue Louis <Dominique@SavageSoftware.com.au> }
+{ }
+{ Portions created by Dominqiue Louis are }
+{ Copyright (C) 2000 - 2001 Dominqiue Louis. }
+{ }
+{ }
+{ Contributor(s) }
+{ -------------- }
+{ }
+{ }
+{ Obtained through: }
+{ Joint Endeavour of Delphi Innovators ( Project JEDI ) }
+{ }
+{ You may retrieve the latest version of this file at the Project }
+{ JEDI home page, located at http://delphi-jedi.org }
+{ }
+{ The contents of this file are used with permission, subject to }
+{ the Mozilla Public License Version 1.1 (the "License"); you may }
+{ not use this file except in compliance with the License. You may }
+{ obtain a copy of the License at }
+{ http://www.mozilla.org/MPL/MPL-1.1.html }
+{ }
+{ Software distributed under the License is distributed on an }
+{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
+{ implied. See the License for the specific language governing }
+{ rights and limitations under the License. }
+{ }
+{ Description }
+{ ----------- }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ Requires }
+{ -------- }
+{ The SDL Runtime libraris on Win32 : SDL.dll on Linux : libSDL.so }
+{ They are available from... }
+{ http://www.libsdl.org . }
+{ }
+{ Programming Notes }
+{ ----------------- }
+{ }
+{ }
+{ }
+{ }
+{ Revision History }
+{ ---------------- }
+{ September 23 2004 - DL : Initial Creation }
+{
+ $Log: userpreferences.pas,v $
+ Revision 1.1 2004/09/30 22:35:47 savage
+ Changes, enhancements and additions as required to get SoAoS working.
+
+
+}
+{******************************************************************************}
+
+interface
+
+uses
+ Classes;
+
+type
+ TUserPreferences = class
+ private
+ FAutoSave: Boolean;
+ procedure CheckAutoSave;
+ protected
+ function GetDefaultBoolean( const Index : Integer ) : Boolean; virtual; abstract;
+ function GetBoolean( const Index : Integer ) : Boolean; virtual; abstract;
+ procedure SetBoolean( const Index : Integer; const Value : Boolean ); virtual;
+ function GetDefaultDateTime( const Index : Integer ) : TDateTime; virtual; abstract;
+ function GetDateTime( const Index : Integer ) : TDateTime; virtual; abstract;
+ procedure SetDateTime( const Index : Integer; const Value : TDateTime ); virtual;
+ function GetDefaultInteger( const Index : Integer ) : Integer; virtual; abstract;
+ function GetInteger( const Index : Integer ) : Integer; virtual; abstract;
+ procedure SetInteger( const Index : Integer; const Value : Integer ); virtual;
+ function GetDefaultFloat( const Index : Integer ) : single; virtual; abstract;
+ function GetFloat( const Index : Integer ) : single; virtual; abstract;
+ procedure SetFloat( const Index : Integer; const Value : single ); virtual;
+ function GetDefaultString( const Index : Integer ) : string; virtual; abstract;
+ function GetString( const Index : Integer ) : string; virtual; abstract;
+ procedure SetString( const Index : Integer; const Value : string ); virtual;
+ function GetDefaultBinaryStream( const Index : Integer ) : TStream; virtual; abstract;
+ function GetBinaryStream( const Index : Integer ) : TStream; virtual; abstract;
+ procedure SetBinaryStream( const Index : Integer; const Value : TStream ); virtual;
+ public
+ procedure Update; virtual; abstract;
+ constructor Create; virtual;
+ destructor Destroy; override;
+ property AutoSave : Boolean read FAutoSave write FAutoSave;
+ end;
+
+implementation
+
+{ TUserPreferences }
+procedure TUserPreferences.CheckAutoSave;
+begin
+ if FAutoSave then
+ Update;
+end;
+
+constructor TUserPreferences.Create;
+begin
+ inherited;
+ FAutoSave := false;
+end;
+
+destructor TUserPreferences.Destroy;
+begin
+
+ inherited;
+end;
+
+procedure TUserPreferences.SetBinaryStream( const Index : Integer; const Value : TStream );
+begin
+ CheckAutoSave;
+end;
+
+procedure TUserPreferences.SetBoolean(const Index: Integer; const Value: Boolean);
+begin
+ CheckAutoSave;
+end;
+
+procedure TUserPreferences.SetDateTime(const Index: Integer; const Value: TDateTime);
+begin
+ CheckAutoSave;
+end;
+
+procedure TUserPreferences.SetFloat(const Index: Integer; const Value: single);
+begin
+ CheckAutoSave;
+end;
+
+procedure TUserPreferences.SetInteger(const Index, Value: Integer);
+begin
+ CheckAutoSave;
+end;
+
+procedure TUserPreferences.SetString(const Index: Integer; const Value: string);
+begin
+ CheckAutoSave;
+end;
+
+end.
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/xplatformutils.pas b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/xplatformutils.pas
new file mode 100644
index 00000000..7fd3128f
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL/Pas/xplatformutils.pas
@@ -0,0 +1,126 @@
+unit xplatformutils;
+
+{$I jedi-sdl.inc}
+
+interface
+
+uses
+ {$IFDEF WIN32}
+ Windows;
+ {$ELSE}
+ {$IFDEF UNIX}
+ {$IFDEF FPC}
+ libc;
+ {$ELSE}
+ Libc,
+ Xlib;
+ {$ENDIF}
+ {$ENDIF}
+ {$ENDIF}
+
+const
+{$IFDEF MACOS}
+ DIR_SEP = ':';
+ DIR_CUR = ':';
+{$ELSE}
+{$IFDEF DARWIN}
+ DIR_SEP = ':';
+ DIR_CUR = ':';
+{$ELSE}
+{$IFDEF WIN32}
+ DIR_SEP = '\';
+ DIR_CUR = '';
+{$ELSE}
+ DIR_SEP = '/';
+ DIR_CUR = '';
+{$ENDIF}
+{$ENDIF}
+{$ENDIF}
+
+procedure ExecAndWait( aProcess : string; aArguments : array of string );
+
+
+implementation
+
+procedure ExecAndWait( aProcess : string; aArguments : array of string );
+var
+{$IFDEF WIN32}
+ CommandLine : string;
+ ProcessInfo: TProcessInformation;
+ Startupinfo: TStartupInfo;
+ ExitCode: longword;
+ x : integer;
+{$ELSE}
+{$IFDEF UNIX}
+ pid: PID_T;
+ Max: Integer;
+ i: Integer;
+ parg: PPCharArray;
+ argnum: Integer;
+ returnvalue : Integer;
+{$ENDIF}
+{$ENDIF}
+begin
+ {$IFDEF WIN32}
+ // Initialize the structures
+ FillChar(ProcessInfo, sizeof(TProcessInformation), 0);
+ FillChar(Startupinfo, sizeof(TStartupInfo), 0);
+ Startupinfo.cb := sizeof(TStartupInfo);
+
+ // Attempts to create the process
+ Startupinfo.dwFlags := STARTF_USESHOWWINDOW;
+ Startupinfo.wShowWindow := 1;
+ CommandLine := aProcess;
+ for x := Low(aArguments ) to High(aArguments ) do
+ CommandLine := CommandLine + ' ' + aArguments[ x ];
+ if CreateProcess( nil, PChar( CommandLine ), nil, nil, False, NORMAL_PRIORITY_CLASS, nil, nil, Startupinfo, ProcessInfo ) then
+ begin
+ // The process has been successfully created
+ // No let's wait till it ends...
+ WaitForSingleObject(ProcessInfo.hProcess, INFINITE);
+
+ // Process has finished. Now we should close it.
+ GetExitCodeProcess(ProcessInfo.hProcess, ExitCode); // Optional
+ CloseHandle(ProcessInfo.hThread);
+ CloseHandle(ProcessInfo.hProcess);
+ end;
+ {$ELSE}
+ {$IFDEF UNIX}
+ pid := fork;
+
+ if pid = 0 then
+ begin
+ Max := sysconf(_SC_OPEN_MAX);
+ for i := (STDERR_FILENO+1) to Max do
+ begin
+ fcntl(i, F_SETFD, FD_CLOEXEC);
+ end;
+
+ argnum := High(aArguments) + 1;
+
+ GetMem(parg,(2 + argnum) * sizeof(PChar));
+ parg[0] := PChar(aProcess);
+
+ i := 0;
+
+ while i <= high(aArguments) do
+ begin
+ inc(i);
+ parg[i] := PChar(aArguments[i-1]);
+ end;
+
+ parg[i+1] := nil;
+ execvp(PChar(aProcess),PPChar(@parg[0]));
+ halt;
+ end;
+
+ if pid > 0 then
+ begin
+ waitpid(pid,@returnvalue,0);
+ end;
+ {$ENDIF}
+ {$ENDIF}
+end;
+
+end.
+ \ No newline at end of file
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL_Image/Pas/sdl_image.pas b/Game/Code/lib/JEDI-SDLv1.0/SDL_Image/Pas/sdl_image.pas
new file mode 100644
index 00000000..50ffcf3b
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL_Image/Pas/sdl_image.pas
@@ -0,0 +1,349 @@
+unit sdl_image;
+{
+ $Id: sdl_image.pas,v 1.15 2007/12/05 22:52:23 savage Exp $
+
+}
+{******************************************************************************}
+{ }
+{ Borland Delphi SDL_Image - An example image loading library for use }
+{ with SDL }
+{ Conversion of the Simple DirectMedia Layer Image Headers }
+{ }
+{ Portions created by Sam Lantinga <slouken@devolution.com> are }
+{ Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga }
+{ 5635-34 Springhouse Dr. }
+{ Pleasanton, CA 94588 (USA) }
+{ }
+{ All Rights Reserved. }
+{ }
+{ The original files are : SDL_image.h }
+{ }
+{ The initial developer of this Pascal code was : }
+{ Matthias Thoma <ma.thoma@gmx.de> }
+{ }
+{ Portions created by Matthias Thoma are }
+{ Copyright (C) 2000 - 2001 Matthias Thoma. }
+{ }
+{ }
+{ Contributor(s) }
+{ -------------- }
+{ Dominique Louis <Dominique@SavageSoftware.com.au> }
+{ }
+{ Obtained through: }
+{ Joint Endeavour of Delphi Innovators ( Project JEDI ) }
+{ }
+{ You may retrieve the latest version of this file at the Project }
+{ JEDI home page, located at http://delphi-jedi.org }
+{ }
+{ The contents of this file are used with permission, subject to }
+{ the Mozilla Public License Version 1.1 (the "License"); you may }
+{ not use this file except in compliance with the License. You may }
+{ obtain a copy of the License at }
+{ http://www.mozilla.org/MPL/MPL-1.1.html }
+{ }
+{ Software distributed under the License is distributed on an }
+{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
+{ implied. See the License for the specific language governing }
+{ rights and limitations under the License. }
+{ }
+{ Description }
+{ ----------- }
+{ A simple library to load images of various formats as SDL surfaces }
+{ }
+{ Requires }
+{ -------- }
+{ SDL.pas in your search path. }
+{ }
+{ Programming Notes }
+{ ----------------- }
+{ See the Aliens Demo on how to make use of this libaray }
+{ }
+{ Revision History }
+{ ---------------- }
+{ April 02 2001 - MT : Initial Translation }
+{ }
+{ May 08 2001 - DL : Added ExternalSym derectives and copyright header }
+{ }
+{ April 03 2003 - DL : Added jedi-sdl.inc include file to support more }
+{ Pascal compilers. Initial support is now included }
+{ for GnuPascal, VirtualPascal, TMT and obviously }
+{ continue support for Delphi Kylix and FreePascal. }
+{ }
+{ April 08 2003 - MK : Aka Mr Kroket - Added Better FPC support }
+{ }
+{ April 24 2003 - DL : under instruction from Alexey Barkovoy, I have added}
+{ better TMT Pascal support and under instruction }
+{ from Prof. Abimbola Olowofoyeku (The African Chief),}
+{ I have added better Gnu Pascal support }
+{ }
+{ April 30 2003 - DL : under instruction from David Mears AKA }
+{ Jason Siletto, I have added FPC Linux support. }
+{ This was compiled with fpc 1.1, so remember to set }
+{ include file path. ie. -Fi/usr/share/fpcsrc/rtl/* }
+{ }
+{
+ $Log: sdl_image.pas,v $
+ Revision 1.15 2007/12/05 22:52:23 savage
+ Better Mac OS X support for Frameworks.
+
+ Revision 1.14 2007/05/29 21:31:13 savage
+ Changes as suggested by Almindor for 64bit compatibility.
+
+ Revision 1.13 2007/05/20 20:30:54 savage
+ Initial Changes to Handle 64 Bits
+
+ Revision 1.12 2006/12/02 00:14:40 savage
+ Updated to latest version
+
+ Revision 1.11 2005/04/10 18:22:59 savage
+ Changes as suggested by Michalis, thanks.
+
+ Revision 1.10 2005/04/10 11:48:33 savage
+ Changes as suggested by Michalis, thanks.
+
+ Revision 1.9 2005/01/05 01:47:07 savage
+ Changed LibName to reflect what MacOS X should have. ie libSDL*-1.2.0.dylib respectively.
+
+ Revision 1.8 2005/01/04 23:14:44 savage
+ Changed LibName to reflect what most Linux distros will have. ie libSDL*-1.2.so.0 respectively.
+
+ Revision 1.7 2005/01/01 02:03:12 savage
+ Updated to v1.2.4
+
+ Revision 1.6 2004/08/14 22:54:30 savage
+ Updated so that Library name defines are correctly defined for MacOS X.
+
+ Revision 1.5 2004/05/10 14:10:04 savage
+ Initial MacOS X support. Fixed defines for MACOS ( Classic ) and DARWIN ( MacOS X ).
+
+ Revision 1.4 2004/04/13 09:32:08 savage
+ Changed Shared object names back to just the .so extension to avoid conflicts on various Linux/Unix distros. Therefore developers will need to create Symbolic links to the actual Share Objects if necessary.
+
+ Revision 1.3 2004/04/01 20:53:23 savage
+ Changed Linux Shared Object names so they reflect the Symbolic Links that are created when installing the RPMs from the SDL site.
+
+ Revision 1.2 2004/03/30 20:23:28 savage
+ Tidied up use of UNIX compiler directive.
+
+ Revision 1.1 2004/02/14 23:35:42 savage
+ version 1 of sdl_image, sdl_mixer and smpeg.
+
+
+}
+{******************************************************************************}
+
+{$I jedi-sdl.inc}
+
+interface
+
+uses
+{$IFDEF __GPC__}
+ gpc,
+{$ENDIF}
+ sdl;
+
+const
+{$IFDEF WINDOWS}
+ SDL_ImageLibName = 'SDL_Image.dll';
+{$ENDIF}
+
+{$IFDEF UNIX}
+{$IFDEF DARWIN}
+ SDL_ImageLibName = 'libSDL_image-1.2.0.dylib';
+{$ELSE}
+ {$IFDEF FPC}
+ SDL_ImageLibName = 'libSDL_image.so';
+ {$ELSE}
+ SDL_ImageLibName = 'libSDL_image-1.2.so.0';
+ {$ENDIF}
+{$ENDIF}
+{$ENDIF}
+
+{$IFDEF MACOS}
+ SDL_ImageLibName = 'SDL_image';
+ {$linklib libSDL_image}
+{$ENDIF}
+
+ // Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL
+ SDL_IMAGE_MAJOR_VERSION = 1;
+{$EXTERNALSYM SDL_IMAGE_MAJOR_VERSION}
+ SDL_IMAGE_MINOR_VERSION = 2;
+{$EXTERNALSYM SDL_IMAGE_MINOR_VERSION}
+ SDL_IMAGE_PATCHLEVEL = 6;
+{$EXTERNALSYM SDL_IMAGE_PATCHLEVEL}
+
+{ This macro can be used to fill a version structure with the compile-time
+ version of the SDL_image library. }
+procedure SDL_IMAGE_VERSION( var X : TSDL_Version );
+{$EXTERNALSYM SDL_IMAGE_VERSION}
+
+{ This function gets the version of the dynamically linked SDL_image library.
+ it should NOT be used to fill a version structure, instead you should
+ use the SDL_IMAGE_VERSION() macro.
+ }
+function IMG_Linked_Version : PSDL_version;
+external {$IFDEF __GPC__}name 'IMG_Linked_Version'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_Linked_Version}
+
+{ Load an image from an SDL data source.
+ The 'type' may be one of: "BMP", "GIF", "PNG", etc.
+
+ If the image format supports a transparent pixel, SDL will set the
+ colorkey for the surface. You can enable RLE acceleration on the
+ surface afterwards by calling:
+ SDL_SetColorKey(image, SDL_RLEACCEL, image.format.colorkey);
+}
+function IMG_LoadTyped_RW(src: PSDL_RWops; freesrc: Integer; _type: PChar): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'IMG_LoadTyped_RW'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_LoadTyped_RW}
+{ Convenience functions }
+function IMG_Load(const _file: PChar): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'IMG_Load'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_Load}
+function IMG_Load_RW(src: PSDL_RWops; freesrc: Integer): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'IMG_Load_RW'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_Load_RW}
+
+{ Invert the alpha of a surface for use with OpenGL
+ This function is now a no-op, and only provided for backwards compatibility. }
+function IMG_InvertAlpha(_on: Integer): Integer;
+cdecl; external {$IFDEF __GPC__}name 'IMG_InvertAlpha'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_InvertAlpha}
+
+{ Functions to detect a file type, given a seekable source }
+function IMG_isBMP(src: PSDL_RWops): Integer;
+cdecl; external {$IFDEF __GPC__}name 'IMG_isBMP'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_isBMP}
+
+function IMG_isGIF(src: PSDL_RWops): Integer;
+cdecl; external {$IFDEF __GPC__}name 'IMG_isGIF'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_isGIF}
+
+function IMG_isJPG(src: PSDL_RWops): Integer;
+cdecl; external {$IFDEF __GPC__}name 'IMG_isJPG'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_isJPG}
+
+function IMG_isLBM(src: PSDL_RWops): Integer;
+cdecl; external {$IFDEF __GPC__}name 'IMG_isLBM'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_isLBM}
+
+function IMG_isPCX(src: PSDL_RWops): Integer;
+cdecl; external {$IFDEF __GPC__}name 'IMG_isPCX'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_isPCX}
+
+function IMG_isPNG(src: PSDL_RWops): Integer;
+cdecl; external {$IFDEF __GPC__}name 'IMG_isPNG'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_isPNG}
+
+function IMG_isPNM(src: PSDL_RWops): Integer;
+cdecl; external {$IFDEF __GPC__}name 'IMG_isPNM'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_isPNM}
+
+function IMG_isTIF(src: PSDL_RWops): Integer;
+cdecl; external {$IFDEF __GPC__}name 'IMG_isTIF'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_isTIF}
+
+function IMG_isXCF(src: PSDL_RWops): Integer;
+cdecl; external {$IFDEF __GPC__}name 'IMG_isXCF'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_isXCF}
+
+function IMG_isXPM(src: PSDL_RWops): Integer;
+cdecl; external {$IFDEF __GPC__}name 'IMG_isXPM'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_isXPM}
+
+function IMG_isXV(src: PSDL_RWops): Integer;
+cdecl; external {$IFDEF __GPC__}name 'IMG_isXV'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_isXV}
+
+
+{ Individual loading functions }
+function IMG_LoadBMP_RW(src: PSDL_RWops): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'IMG_LoadBMP_RW'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_LoadBMP_RW}
+
+function IMG_LoadGIF_RW(src: PSDL_RWops): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'IMG_LoadGIF_RW'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_LoadGIF_RW}
+
+function IMG_LoadJPG_RW(src: PSDL_RWops): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'IMG_LoadJPG_RW'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_LoadJPG_RW}
+
+function IMG_LoadLBM_RW(src: PSDL_RWops): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'IMG_LoadLBM_RW'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_LoadLBM_RW}
+
+function IMG_LoadPCX_RW(src: PSDL_RWops): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'IMG_LoadPCX_RW'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_LoadPCX_RW}
+
+function IMG_LoadPNM_RW(src: PSDL_RWops): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'IMG_LoadPNM_RW'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_LoadPNM_RW}
+
+function IMG_LoadPNG_RW(src: PSDL_RWops): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'IMG_LoadPNG_RW'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_LoadPNG_RW}
+
+function IMG_LoadTGA_RW(src: PSDL_RWops): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'IMG_LoadTGA_RW'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_LoadTGA_RW}
+
+function IMG_LoadTIF_RW(src: PSDL_RWops): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'IMG_LoadTIF_RW'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_LoadTIF_RW}
+
+function IMG_LoadXCF_RW(src: PSDL_RWops): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'IMG_LoadXCF_RW'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_LoadXCF_RW}
+
+function IMG_LoadXPM_RW(src: PSDL_RWops): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'IMG_LoadXPM_RW'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_LoadXPM_RW}
+
+function IMG_LoadXV_RW(src: PSDL_RWops): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'IMG_LoadXV_RW'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_LoadXV_RW}
+
+function IMG_ReadXPMFromArray( xpm : PPChar ): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'IMG_ReadXPMFromArray'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+{$EXTERNALSYM IMG_ReadXPMFromArray}
+
+
+
+
+{ used internally, NOT an exported function }
+//function IMG_string_equals( const str1 : PChar; const str2 : PChar ) : integer;
+//cdecl; external {$IFDEF __GPC__}name 'IMG_string_equals'{$ELSE} SDL_ImageLibName{$ENDIF __GPC__};
+//{ $ EXTERNALSYM IMG_string_equals}
+
+{ Error Macros }
+{ We'll use SDL for reporting errors }
+procedure IMG_SetError( fmt : PChar );
+
+function IMG_GetError : PChar;
+
+implementation
+
+{$IFDEF __GPC__}
+ {$L 'sdl_image'} { link sdl_image.dll.a or libsdl_image.so or libsdl_image.a }
+{$ENDIF}
+
+procedure SDL_IMAGE_VERSION( var X : TSDL_Version );
+begin
+ X.major := SDL_IMAGE_MAJOR_VERSION;
+ X.minor := SDL_IMAGE_MINOR_VERSION;
+ X.patch := SDL_IMAGE_PATCHLEVEL;
+end;
+
+procedure IMG_SetError( fmt : PChar );
+begin
+ SDL_SetError( fmt );
+end;
+
+function IMG_GetError : PChar;
+begin
+ result := SDL_GetError;
+end;
+
+end.
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL_ttf/Demos/GLFont/glfont.dpr b/Game/Code/lib/JEDI-SDLv1.0/SDL_ttf/Demos/GLFont/glfont.dpr
new file mode 100644
index 00000000..645d4b96
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL_ttf/Demos/GLFont/glfont.dpr
@@ -0,0 +1,625 @@
+program glfont;
+{
+ glfont: An example of using the SDL_ttf library with OpenGL.
+ Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ The SDL_GL_* functions in this file are available in the public domain.
+ Sam Lantinga
+ slouken@libsdl.org
+}
+{ $Id: glfont.dpr,v 1.3 2005/05/23 22:35:39 savage Exp $ }
+{ A simple program to test the text rendering feature of the TTF library }
+uses
+ SysUtils,
+ sdl,
+ sdl_ttf,
+ gl;
+
+(* Undefine this if you want a flat cube instead of a rainbow cube *)
+{$DEFINE SHADED_CUBE}
+
+const
+ DEFAULT_PTSIZE = 18;
+ DEFAULT_TEXT = 'The quick brown fox jumped over the lazy dog';
+ NUM_COLORS = 256;
+ Usage = 'Usage: %s <font>.ttf [-solid] [-utf8 or -unicode] [-b] [-i] [-u] [-fgcol r g b] [-bgcol r g b] [-ptsize nn] [-text "message"]';
+ SCREEN_WIDTH = 640;
+ SCREEN_HEIGHT = 480;
+ SCREEN_BPP = 0;
+
+procedure ShutDownApplication( HaltStatus : integer );
+begin
+ TTF_Quit;
+ SDL_Quit;
+ Halt( HaltStatus );
+end;
+
+procedure SDL_GL_Enter2DMode;
+var
+ screen : PSDL_Surface;
+begin
+ screen := SDL_GetVideoSurface;
+ (* Note, there may be other things you need to change,
+ depending on how you have your OpenGL state set up.
+ *)
+ glPushAttrib( GL_ENABLE_BIT );
+ glDisable( GL_DEPTH_TEST );
+ glDisable( GL_CULL_FACE );
+ glEnable( GL_TEXTURE_2D );
+ glViewport( 0, 0, screen.w, screen.h );
+ glMatrixMode( GL_PROJECTION );
+ glPushMatrix;
+ glLoadIdentity;
+ glOrtho( 0.0, screen.w, screen.h, 0.0, 0.0, 1.0 );
+ glMatrixMode( GL_MODELVIEW );
+ glPushMatrix;
+ glLoadIdentity;
+ glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
+end;
+
+procedure SDL_GL_Leave2DMode;
+begin
+ glMatrixMode( GL_MODELVIEW );
+ glPopMatrix;
+ glMatrixMode( GL_PROJECTION );
+ glPopMatrix;
+ glPopAttrib;
+end;
+(* Quick utility function for texture creation *)
+
+function power_of_two( input : integer ) : integer;
+var
+ value : integer;
+begin
+ value := 1;
+ while ( value < input ) do
+ begin
+ value := value shl 1;
+ end;
+ result := value;
+end;
+
+function SDL_GL_LoadTexture( surface : PSDL_Surface; var texcoord : array of GlFloat ) : GLuint;
+var
+ texture : GLuint;
+ w, h : integer;
+ image : PSDL_Surface;
+ area : TSDL_Rect;
+ saved_flags : Uint32;
+ saved_alpha : Uint8;
+begin
+ (* Use the surface width and height expanded to powers of 2 *)
+ w := power_of_two( surface.w );
+ h := power_of_two( surface.h );
+ texcoord[ 0 ] := 0.0; (* Min X *)
+ texcoord[ 1 ] := 0.0; (* Min Y *)
+ texcoord[ 2 ] := surface.w / w; (* Max X *)
+ texcoord[ 3 ] := surface.h / h; (* Max Y *)
+ image := SDL_CreateRGBSurface(
+ SDL_SWSURFACE,
+ w, h,
+ 32,
+{$IFNDEF IA32} (* OpenGL RGBA masks *)
+ $000000FF,
+ $0000FF00,
+ $00FF0000,
+ $FF000000
+{$ELSE}
+ $FF000000,
+ $00FF0000,
+ $0000FF00,
+ $000000FF
+{$ENDIF}
+ );
+ if ( image = nil ) then
+ begin
+ result := 0;
+ exit;
+ end;
+ (* Save the alpha blending attributes *)
+ saved_flags := surface.flags and ( SDL_SRCALPHA or SDL_RLEACCELOK );
+ saved_alpha := surface.format.alpha;
+ if ( ( saved_flags and SDL_SRCALPHA ) = SDL_SRCALPHA ) then
+ begin
+ SDL_SetAlpha( surface, 0, 0 );
+ end;
+ (* Copy the surface into the GL texture image *)
+ area.x := 0;
+ area.y := 0;
+ area.w := surface.w;
+ area.h := surface.h;
+ SDL_BlitSurface( surface, @area, image, @area );
+ (* Restore the alpha blending attributes *)
+ if ( ( saved_flags and SDL_SRCALPHA ) = SDL_SRCALPHA ) then
+ begin
+ SDL_SetAlpha( surface, saved_flags, saved_alpha );
+ end;
+ (* Create an OpenGL texture for the image *)
+ glGenTextures( 1, @texture );
+ glBindTexture( GL_TEXTURE_2D, texture );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST );
+ glTexImage2D( GL_TEXTURE_2D,
+ 0,
+ GL_RGBA,
+ w, h,
+ 0,
+ GL_RGBA,
+ GL_UNSIGNED_BYTE,
+ image.pixels );
+ SDL_FreeSurface( image ); (* No longer needed *)
+ result := texture;
+end;
+
+type
+ TRenderType = ( rtLatin1, rtUTF8, rtUnicode );
+
+var
+ //fontfile : string;
+ //gl_error : GLenum;
+ texture : GLuint;
+ x, y, w, h : integer;
+ //texcoord : array[ 0..4 ] of TGLfloat;
+ texMinX, texMinY : GLfloat;
+ texMaxX, texMaxY : GLfloat;
+ color : array[ 0..7, 0..2 ] of single = ( ( 1.0, 1.0, 0.0 ),
+ ( 1.0, 0.0, 0.0 ),
+ ( 0.0, 0.0, 0.0 ),
+ ( 0.0, 1.0, 0.0 ),
+ ( 0.0, 1.0, 1.0 ),
+ ( 1.0, 1.0, 1.0 ),
+ ( 1.0, 0.0, 1.0 ),
+ ( 0.0, 0.0, 1.0 ) );
+ cube : array[ 0..7, 0..2 ] of single = ( ( 0.5, 0.5, -0.5 ),
+ ( 0.5, -0.5, -0.5 ),
+ ( -0.5, -0.5, -0.5 ),
+ ( -0.5, 0.5, -0.5 ),
+ ( -0.5, 0.5, 0.5 ),
+ ( 0.5, 0.5, 0.5 ),
+ ( 0.5, -0.5, 0.5 ),
+ ( -0.5, -0.5, 0.5 ) );
+ screen : PSDL_Surface = nil;
+ font : PTTF_Font;
+ temp : PSDL_Surface = nil;
+ ptsize : integer = 0;
+ i : integer;
+ done : Boolean = false;
+ //rdiff, gdiff, bdiff : integer;
+ //colors : array[ 0..NUM_COLORS - 1 ] of TSDL_Color;
+ white : TSDL_Color = ( r : $FF; g : $FF; b : $FF; unused : 0 );
+ black : TSDL_Color = ( r : $00; g : $00; b : $00; unused : 0 );
+ forecol : TSDL_Color;
+ backcol : TSDL_Color;
+ //dstrect : TSDL_Rect;
+ event : TSDL_Event;
+ rendersolid : Boolean = false;
+ renderstyle : integer = TTF_STYLE_NORMAL;
+ rendertype : TRenderType = rtLatin1;
+ dump : Boolean;
+ message : string;
+ glyph : PSDL_Surface = nil;
+ r, g, b : integer;
+ outname : string;
+ //texcoord : array[ 0..3 ] of TGLfloat;
+ aspect : single;
+
+procedure CreateTextTexture;
+var
+ //screen : PSDL_Surface;
+ image : PSDL_Surface;
+ texcoord : array[ 0..3 ] of GlFloat;
+begin
+ //screen := SDL_GetVideoSurface;
+ if ( texture = 0 ) then
+ begin
+ case rendertype of
+ rtLatin1 :
+ begin
+ if ( rendersolid ) then
+ begin
+ image := TTF_RenderText_Solid( font, PChar( message ), forecol );
+ end
+ else
+ begin
+ image := TTF_RenderText_Shaded( font, PChar( message ), forecol, backcol );
+ end;
+ end;
+
+ rtUTF8 :
+ begin
+ if ( rendersolid ) then
+ begin
+ image := TTF_RenderUTF8_Solid( font, PChar( message ), forecol );
+ end
+ else
+ begin
+ image := TTF_RenderUTF8_Shaded( font, PChar( message ), forecol, backcol );
+ end;
+ end;
+
+ rtUNICODE :
+ begin
+ { This doesn't actually work because you can't pass UNICODE text in via command line, AFAIK, but...}
+ {Uint16 unicode_text[BUFSIZ];
+ int index;
+ for index := 0 to Lneght(message) do
+ begin
+ unicode_text[index] := ((Uint8 *)message)[0];
+ unicode_text[index] := unicode_text[index] shl 8;
+ unicode_text[index] := unicode_text[index] or ((Uint8 *)message)[1];
+ message := message + 2;
+ end;
+ if ( rendersolid ) then
+ begin
+ text := TTF_RenderUNICODE_Solid(font, unicode_text, @forecol);
+ end
+ else
+ begin
+ text := TTF_RenderUNICODE_Shaded( font, unicode_text, @forecol, @backcol);
+ end;}
+ end;
+ else
+ begin
+ image := nil;
+ { This shouldn't happen }
+ end;
+ end;
+
+ if ( image = nil ) then
+ begin
+ //fprintf(stderr, 'Couldn't render text: %s', [SDL_GetError]);
+ TTF_CloseFont( font );
+ ShutDownApplication( 2 );
+ end;
+
+
+ w := image.w;
+ h := image.h;
+ (* Convert the image into an OpenGL texture *)
+ texture := SDL_GL_LoadTexture( image, texcoord );
+ (* Make texture coordinates easy to understand *)
+ texMinX := texcoord[ 0 ];
+ texMinY := texcoord[ 1 ];
+ texMaxX := texcoord[ 2 ];
+ texMaxY := texcoord[ 3 ];
+ (* We don't need the original image anymore *)
+ SDL_FreeSurface( image );
+ (* Make sure that the texture conversion is okay *)
+ if ( texture = 0 ) then
+ begin
+ exit;
+ end;
+ end;
+end;
+
+procedure DrawTextTexture;
+begin
+ (* Show the image on the screen *)
+ SDL_GL_Enter2DMode;
+ glBindTexture( GL_TEXTURE_2D, texture );
+ glBegin( GL_TRIANGLE_STRIP );
+ glTexCoord2f( texMinX, texMinY );
+ glVertex2i( x, y );
+ glTexCoord2f( texMaxX, texMinY );
+ glVertex2i( x + w, y );
+ glTexCoord2f( texMinX, texMaxY );
+ glVertex2i( x, y + h );
+ glTexCoord2f( texMaxX, texMaxY );
+ glVertex2i( x + w, y + h );
+ glEnd;
+ SDL_GL_Leave2DMode;
+end;
+
+begin
+ { Default is black and white }
+ forecol := black;
+ backcol := white;
+
+ for i := 1 to ParamCount - 1 do
+ begin
+ if ( ParamStr( i ) = '-solid' ) then
+ begin
+ rendersolid := true;
+ end
+ else if ( ParamStr( i ) = '-utf8' ) then
+ begin
+ rendertype := rtUTF8;
+ end
+ else if ( ParamStr( i ) = '-unicode' ) then
+ begin
+ rendertype := rtUnicode;
+ end
+ else if ( ParamStr( i ) = '-b' ) then
+ begin
+ renderstyle := renderstyle or TTF_STYLE_BOLD;
+ end
+ else if ( ParamStr( i ) = '-i' ) then
+ begin
+ renderstyle := renderstyle or TTF_STYLE_ITALIC;
+ end
+ else if ( ParamStr( i ) = '-u' ) then
+ begin
+ renderstyle := renderstyle or TTF_STYLE_UNDERLINE;
+ end
+ else if ( ParamStr( i ) = '-dump' ) then
+ begin
+ dump := true;
+ end
+ else if ( ParamStr( i ) = '-fgcol' ) then
+ begin
+ try
+ r := StrToInt( ParamStr( i + 1 ) );
+ g := StrToInt( ParamStr( i + 2 ) );
+ b := StrToInt( ParamStr( i + 3 ) );
+ except
+ ShutDownApplication( 1 )
+ end;
+ forecol.r := r;
+ forecol.g := g;
+ forecol.b := b;
+ end
+ else if ( ParamStr( i ) = '-bgcol' ) then
+ begin
+ try
+ r := StrToInt( ParamStr( i + 1 ) );
+ g := StrToInt( ParamStr( i + 2 ) );
+ b := StrToInt( ParamStr( i + 3 ) );
+ except
+ ShutDownApplication( 1 )
+ end;
+ forecol.r := r;
+ forecol.g := g;
+ forecol.b := b;
+ end
+ else if ( ParamStr( i ) = '-ptsize' ) then
+ begin
+ ptsize := StrToInt( ParamStr( i + 1 ) );
+ end
+ else if ( ParamStr( i ) = '-text' ) then
+ begin
+ message := ParamStr( i + 1 );
+ end
+ else
+ begin
+ //fprintf(stderr, Usage, argv0);
+ end;
+ end;
+
+ { Check usage }
+ {if ( ! argv[ 0 ] ) {
+ fprintf(stderr, Usage, argv0);
+ return(1);
+ }
+
+ { Initialize SDL }
+ if ( SDL_Init( SDL_INIT_VIDEO ) < 0 ) then
+ begin
+ //fprintf(stderr, 'Couldn't initialize SDL: %s',SDL_GetError);
+ SDL_Quit;
+ end;
+
+ { Initialize the TTF library }
+ if ( TTF_Init < 0 ) then
+ begin
+ //fprintf(stderr, 'Couldn't initialize TTF: %s',SDL_GetError);
+ SDL_Quit;
+ end;
+ //atexit( TTF_Quit );
+ { Open the font file with the requested point size }
+ if ( ptsize = 0 ) then
+ begin
+ //i := 2;
+ ptsize := DEFAULT_PTSIZE;
+ end
+ else
+ begin
+ //i := 3;
+ end;
+
+ font := TTF_OpenFont( PChar( ParamStr( 1 ) ), ptsize );
+ if ( font = nil ) then
+ begin
+ //fprintf(stderr, 'Couldn''t load %d pt font from %s: %s',[ptsize, ParamStr(0), SDL_GetError]);
+ ShutDownApplication( 2 )
+ end;
+
+ TTF_SetFontStyle( font, renderstyle );
+
+ if ( dump ) then
+ begin
+ for i := 48 to 122 do
+ begin
+ glyph := TTF_RenderGlyph_Shaded( font, i, forecol, backcol );
+ if ( glyph <> nil ) then
+ begin
+ outname := 'glyph-' + IntToStr( i ) + '.bmp';
+ SDL_SaveBMP( glyph, PChar( outname ) );
+ end;
+ end;
+ ShutDownApplication( 0 );
+ exit;
+ end;
+
+ { Set a 640x480x8 video mode }
+ screen := SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_OPENGL );
+ if ( screen = nil ) then
+ begin
+ //fprintf(stderr, 'Couldn''t set 640x480 OpenGL mode: %s', SDL_GetError);
+ ShutDownApplication( 2 );
+ end;
+
+ // Set the window manager title bar
+ SDL_WM_SetCaption( 'JEDI-SDL 3D TTF Demo', 'glfont' );
+
+ { Render and center the message }
+ if ( message = '' ) then
+ begin
+ message := DEFAULT_TEXT;
+ end;
+
+ { Initialize the GL state }
+ glViewport( 0, 0, screen.w, screen.h );
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity;
+ // This makes the cube rectangular on screen */
+ //glOrtho( -2.0, 2.0, -2.0, 2.0, -20.0, 20.0 );
+ // This makes the cube equisided on screen */
+ aspect := 2.0 / ( screen.w / screen.h );
+ glOrtho( -2.0, 2.0, -aspect, aspect, -20.0, 20.0 );
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity;
+ glEnable( GL_DEPTH_TEST );
+ glDepthFunc( GL_LESS );
+ glShadeModel( GL_SMOOTH );
+
+ CreateTextTexture;
+
+ { Wait for a keystroke, and blit text on mouse press }
+ done := false;
+ while ( not done ) do
+ begin
+ while ( SDL_PollEvent( @event ) <> 0 ) do
+ begin
+ case event.type_ of
+ SDL_MOUSEBUTTONDOWN :
+ begin
+ x := event.motion.x - w div 2;
+ y := event.motion.y - h div 2;
+ end;
+
+ SDL_KEYDOWN, SDL_QUITEV :
+ begin
+ done := true;
+ end;
+ end;
+ end;
+
+ { Clear the screen }
+ glClearColor( 1.0, 1.0, 1.0, 1.0 );
+ glClear( GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT );
+ { Draw the spinning cube }
+ glBegin( GL_QUADS );
+{$IFDEF SHADED_CUBE}
+ glColor3fv( @color[ 0 ] );
+ glVertex3fv( @cube[ 0 ] );
+ glColor3fv( @color[ 1 ] );
+ glVertex3fv( @cube[ 1 ] );
+ glColor3fv( @color[ 2 ] );
+ glVertex3fv( @cube[ 2 ] );
+ glColor3fv( @color[ 3 ] );
+ glVertex3fv( @cube[ 3 ] );
+
+ glColor3fv( @color[ 3 ] );
+ glVertex3fv( @cube[ 3 ] );
+ glColor3fv( @color[ 4 ] );
+ glVertex3fv( @cube[ 4 ] );
+ glColor3fv( @color[ 7 ] );
+ glVertex3fv( @cube[ 7 ] );
+ glColor3fv( @color[ 2 ] );
+ glVertex3fv( @cube[ 2 ] );
+
+ glColor3fv( @color[ 0 ] );
+ glVertex3fv( @cube[ 0 ] );
+ glColor3fv( @color[ 5 ] );
+ glVertex3fv( @cube[ 5 ] );
+ glColor3fv( @color[ 6 ] );
+ glVertex3fv( @cube[ 6 ] );
+ glColor3fv( @color[ 1 ] );
+ glVertex3fv( @cube[ 1 ] );
+
+ glColor3fv( @color[ 5 ] );
+ glVertex3fv( @cube[ 5 ] );
+ glColor3fv( @color[ 4 ] );
+ glVertex3fv( @cube[ 4 ] );
+ glColor3fv( @color[ 7 ] );
+ glVertex3fv( @cube[ 7 ] );
+ glColor3fv( @color[ 6 ] );
+ glVertex3fv( @cube[ 6 ] );
+ glColor3fv( @color[ 5 ] );
+ glVertex3fv( @cube[ 5 ] );
+ glColor3fv( @color[ 0 ] );
+ glVertex3fv( @cube[ 0 ] );
+ glColor3fv( @color[ 3 ] );
+ glVertex3fv( @cube[ 3 ] );
+ glColor3fv( @color[ 4 ] );
+ glVertex3fv( @cube[ 4 ] );
+ glColor3fv( @color[ 6 ] );
+ glVertex3fv( @cube[ 6 ] );
+ glColor3fv( @color[ 1 ] );
+ glVertex3fv( @cube[ 1 ] );
+ glColor3fv( @color[ 2 ] );
+ glVertex3fv( @cube[ 2 ] );
+ glColor3fv( @color[ 7 ] );
+ glVertex3fv( @cube[ 7 ] );
+{$ELSE} // flat cube
+ glColor3f( 1.0, 0.0, 0.0 );
+ glVertex3fv( @cube[ 0 ] );
+ glVertex3fv( @cube[ 1 ] );
+ glVertex3fv( @cube[ 2 ] );
+ glVertex3fv( @cube[ 3 ] );
+
+ glColor3f( 0.0, 1.0, 0.0 );
+ glVertex3fv( @cube[ 3 ] );
+ glVertex3fv( @cube[ 4 ] );
+ glVertex3fv( @cube[ 7 ] );
+ glVertex3fv( @cube[ 2 ] );
+
+ glColor3f( 0.0, 0.0, 1.0 );
+ glVertex3fv( @cube[ 0 ] );
+ glVertex3fv( @cube[ 5 ] );
+ glVertex3fv( @cube[ 6 ] );
+ glVertex3fv( @cube[ 1 ] );
+
+ glColor3f( 0.0, 1.0, 1.0 );
+ glVertex3fv( @cube[ 5 ] );
+ glVertex3fv( @cube[ 4 ] );
+ glVertex3fv( @cube[ 7 ] );
+ glVertex3fv( @cube[ 6 ] );
+ glColor3f( 1.0, 1.0, 0.0 );
+ glVertex3fv( @cube[ 5 ] );
+ glVertex3fv( @cube[ 0 ] );
+ glVertex3fv( @cube[ 3 ] );
+ glVertex3fv( @cube[ 4 ] );
+ glColor3f( 1.0, 0.0, 1.0 );
+ glVertex3fv( @cube[ 6 ] );
+ glVertex3fv( @cube[ 1 ] );
+ glVertex3fv( @cube[ 2 ] );
+ glVertex3fv( @cube[ 7 ] );
+{$ENDIF} (* SHADED_CUBE *)
+ glEnd;
+
+ { Rotate the cube }
+ glMatrixMode( GL_MODELVIEW );
+ glRotatef( 5.0, 1.0, 1.0, 1.0 );
+ { Show the text on the screen }
+ DrawTextTexture;
+ {SDL_GL_Enter2DMode;
+ glBindTexture( GL_TEXTURE_2D, texture );
+ glBegin( GL_TRIANGLE_STRIP );
+ glTexCoord2f( texMinX, texMinY );
+ glVertex2i( x, y );
+ glTexCoord2f( texMaxX, texMinY );
+ glVertex2i( x + w, y );
+ glTexCoord2f( texMinX, texMaxY );
+ glVertex2i( x, y + h );
+ glTexCoord2f( texMaxX, texMaxY );
+ glVertex2i( x + w, y + h );
+ glEnd;
+ SDL_GL_Leave2DMode;}
+ { Swap the buffers so everything is visible }
+ SDL_GL_SwapBuffers;
+ end;
+ TTF_CloseFont( font );
+ ShutDownApplication( 0 );
+end.
+
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL_ttf/Demos/ShowFont/showfont.dpr b/Game/Code/lib/JEDI-SDLv1.0/SDL_ttf/Demos/ShowFont/showfont.dpr
new file mode 100644
index 00000000..693c1b8c
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL_ttf/Demos/ShowFont/showfont.dpr
@@ -0,0 +1,384 @@
+program showfont;
+{
+ showfont: An example of using the SDL_ttf library with 2D graphics.
+ Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Library General Public
+ License as published by the Free Software Foundation; either
+ version 2 of the License, or (at your option) any later version.
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Library General Public License for more details.
+ You should have received a copy of the GNU Library General Public
+ License along with this library; if not, write to the Free
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Sam Lantinga slouken@libsdl.org
+}
+
+{
+$Id: showfont.dpr,v 1.3 2007/06/01 08:39:06 savage Exp $
+}
+
+{
+A simple program to test the text rendering feature of the TTF library
+}
+
+uses
+ SysUtils,
+ sdl,
+ sdl_ttf;
+
+const
+ DEFAULT_PTSIZE = 18;
+ DEFAULT_TEXT = 'The quick Pascal compiler jumped over the lazy C compiler';
+ NUM_COLORS = 256;
+ Usage = 'Usage: %s <font>.ttf [-solid] [-utf8 or -unicode] [-b] [-i] [-u] [-fgcol r g b] [-bgcol r g b] [-ptsize nn] [-text "message"]';
+ SCREEN_WIDTH = 640;
+ SCREEN_HEIGHT = 480;
+ SCREEN_BPP = 8;
+
+type
+ TRenderType = ( rtLatin1, rtUTF8, rtUnicode );
+
+procedure ShutDownApplication( HaltStatus : integer );
+begin
+ TTF_Quit;
+ SDL_Quit;
+ Halt( HaltStatus );
+end;
+
+var
+ screen : PSDL_Surface = nil;
+ font : PTTF_Font;
+ text : PSDL_Surface = nil;
+ temp : PSDL_Surface = nil;
+ ptsize : integer = 0;
+ i : integer;
+ done : Boolean = false;
+ rdiff, gdiff, bdiff : integer;
+ colors : array[ 0..NUM_COLORS - 1 ] of TSDL_Color;
+ white : TSDL_Color = ( r : $FF; g : $FF; b : $FF; unused : 0 );
+ black : TSDL_Color = ( r : $00; g : $00; b : $00; unused : 0 );
+ forecol : TSDL_Color;
+ backcol : TSDL_Color;
+ dstrect : TSDL_Rect;
+ event : TSDL_Event;
+ rendersolid : Boolean = false;
+ renderstyle : integer = TTF_STYLE_NORMAL;
+ rendertype : TRenderType = rtLatin1;
+ dump : Boolean;
+ message : WideString;
+ glyph : PSDL_Surface = nil;
+ r, g, b : integer;
+ outname : string;
+begin
+ { Look for special execution mode }
+ {dump := false;
+ { Look for special rendering types }
+ {rendersolid := false;
+ renderstyle := TTF_STYLE_NORMAL;
+ rendertype := rtLatin1;}
+
+ { Default is black and white }
+ forecol := black;
+ backcol := white;
+
+ for i := 1 to ParamCount do
+ begin
+ if ( ParamStr( i ) = '-solid' ) then
+ begin
+ rendersolid := true;
+ end
+ else if ( ParamStr( i ) = '-utf8' ) then
+ begin
+ rendertype := rtUTF8;
+ end
+ else if ( ParamStr( i ) = '-unicode' ) then
+ begin
+ rendertype := rtUnicode;
+ end
+ else if ( ParamStr( i ) = '-b' ) then
+ begin
+ renderstyle := renderstyle or TTF_STYLE_BOLD;
+ end
+ else if ( ParamStr( i ) = '-i' ) then
+ begin
+ renderstyle := renderstyle or TTF_STYLE_ITALIC;
+ end
+ else if ( ParamStr( i ) = '-u' ) then
+ begin
+ renderstyle := renderstyle or TTF_STYLE_UNDERLINE;
+ end
+ else if ( ParamStr( i ) = '-dump' ) then
+ begin
+ dump := true;
+ end
+ else if ( ParamStr( i ) = '-fgcol' ) then
+ begin
+ try
+ r := StrToInt( ParamStr( i + 1 ) );
+ g := StrToInt( ParamStr( i + 2 ) );
+ b := StrToInt( ParamStr( i + 3 ) );
+ except
+ ShutDownApplication( 1 )
+ end;
+ forecol.r := r;
+ forecol.g := g;
+ forecol.b := b;
+ end
+ else if ( ParamStr( i ) = '-bgcol' ) then
+ begin
+ try
+ r := StrToInt( ParamStr( i + 1 ) );
+ g := StrToInt( ParamStr( i + 2 ) );
+ b := StrToInt( ParamStr( i + 3 ) );
+ except
+ ShutDownApplication( 1 )
+ end;
+ forecol.r := r;
+ forecol.g := g;
+ forecol.b := b;
+ end
+ else if ( ParamStr( i ) = '-ptsize' ) then
+ begin
+ ptsize := StrToInt( ParamStr( i + 1 ) );
+ end
+ else if ( ParamStr( i ) = '-text' ) then
+ begin
+ message := WideString( ParamStr( i + 1 ) );
+ end
+ else
+ begin
+ //fprintf(stderr, Usage, argv0);
+ end;
+ end;
+
+ { Check usage }
+ {
+ if ( ! argv[0] ) then
+ begin
+ fprintf(stderr, Usage, argv0);
+ return(1);
+ end;
+ }
+
+ { Initialize SDL }
+ if ( SDL_Init( SDL_INIT_VIDEO ) < 0 ) then
+ begin
+ //fprintf(stderr, 'Couldn''t initialize SDL: %s',SDL_GetError);
+ ShutDownApplication( 2 )
+ end;
+
+ //atexit(SDL_Quit);
+
+ { Initialize the TTF library }
+ if ( TTF_Init( ) < 0 ) then
+ begin
+ //fprintf(stderr, 'Couldn''t initialize TTF: %s',SDL_GetError);
+ ShutDownApplication( 2 )
+ end;
+
+ //atexit(TTF_Quit);
+
+ { Open the font file with the requested point size }
+ if ( ptsize = 0 ) then
+ begin
+ i := 2;
+ ptsize := DEFAULT_PTSIZE;
+ end
+ else
+ begin
+ i := 3;
+ end;
+
+ font := TTF_OpenFont( PChar( ParamStr( 1 ) ), ptsize );
+ if ( font = nil ) then
+ begin
+ //fprintf(stderr, 'Couldn''t load %d pt font from %s: %s',[ptsize, ParamStr(0), SDL_GetError]);
+ ShutDownApplication( 2 )
+ end;
+
+ TTF_SetFontStyle( font, renderstyle );
+
+ if ( dump ) then
+ begin
+ for i := 48 to 123 do
+ begin
+ glyph := TTF_RenderGlyph_Shaded( font, i, forecol, backcol );
+ if ( glyph <> nil ) then
+ begin
+ //sprintf( outname, 'glyph-%d.bmp', i );
+ outname := 'glyph-' + IntToStr( i ) + '.bmp';
+ SDL_SaveBMP( glyph, PChar( outname ) );
+ end;
+ end;
+ ShutDownApplication( 0 );
+ exit;
+ end;
+
+ { Set a 640x480x8 video mode }
+ screen := SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, SCREEN_BPP, SDL_SWSURFACE );
+ if ( screen = nil ) then
+ begin
+ //fprintf(stderr, 'Couldn't set 640x480x8 video mode: %s',[SDL_GetError]);
+ ShutDownApplication( 2 );
+ end;
+
+ // Set the window manager title bar
+ SDL_WM_SetCaption( 'JEDI-SDL 2D TTF Demo', 'showfont' );
+
+ { Set a palette that is good for the foreground colored text }
+ rdiff := backcol.r - forecol.r;
+ gdiff := backcol.g - forecol.g;
+ bdiff := backcol.b - forecol.b;
+
+ for i := 0 to NUM_COLORS - 1 do
+ begin
+ colors[ i ].r := forecol.r + ( i * rdiff ) div 4;
+ colors[ i ].g := forecol.g + ( i * gdiff ) div 4;
+ colors[ i ].b := forecol.b + ( i * bdiff ) div 4;
+ end;
+
+ SDL_SetColors( screen, @colors, 0, NUM_COLORS );
+
+ { Clear the background to background color }
+
+ SDL_FillRect( screen, nil, SDL_MapRGB( screen.format, backcol.r, backcol.g, backcol.b ) );
+
+ SDL_UpdateRect( screen, 0, 0, 0, 0 );
+
+ { Show which font file we're looking at }
+ //sprintf(string, 'Font file: %s', argv[0]);
+
+ { Render and center the message }
+ if message = '' then
+ begin
+ message := DEFAULT_TEXT;
+ end;
+
+ case rendertype of
+ rtLatin1 :
+ begin
+ if ( rendersolid ) then
+ begin
+ text := TTF_RenderText_Solid( font, PChar( string(message) ), forecol );
+ end
+ else
+ begin
+ text := TTF_RenderText_Shaded( font, PChar( string( message ) ), forecol, backcol );
+ end;
+ end;
+
+ rtUTF8 :
+ begin
+ if ( rendersolid ) then
+ begin
+ text := TTF_RenderUTF8_Solid( font, PChar( string( message ) ), forecol );
+ end
+ else
+ begin
+ text := TTF_RenderUTF8_Shaded( font, PChar( string( message ) ), forecol, backcol );
+ end;
+ end;
+
+ rtUnicode :
+ begin
+ { This doesn't actually work because you can't pass UNICODE text in via command line, AFAIK, but...}
+ {Uint16 unicode_text[BUFSIZ];
+ int index;}
+ {for index := 0 to Length(message) - 1 do
+ begin
+ unicode_text[index] := ((Uint8 *)message)[0];
+ unicode_text[index] := unicode_text[index] shl 8;
+ unicode_text[index] := unicode_text[index] or ((Uint8 *)message)[1];
+ message := message + 2;
+ end; }
+ if ( rendersolid ) then
+ begin
+ text := TTF_RenderUNICODE_Solid(font, PUInt16( message ), forecol);
+ end
+ else
+ begin
+ text := TTF_RenderUNICODE_Shaded( font, PUInt16( message ), forecol, backcol);
+ end;
+ end;
+ else
+ begin
+ text := nil;
+ { This shouldn't happen }
+ end;
+ end;
+
+ if ( text = nil ) then
+ begin
+ //fprintf(stderr, 'Couldn''t render text: %s', [SDL_GetError]);
+ TTF_CloseFont( font );
+ ShutDownApplication( 2 );
+ end;
+
+ dstrect.x := ( screen.w - text.w ) div 2;
+ dstrect.y := ( screen.h - text.h ) div 2;
+ dstrect.w := text.w;
+ dstrect.h := text.h;
+ //printf('Font is generally %d big, and string is %hd big', TTF_FontHeight(font), text.h);
+
+ { Blit the text surface }
+ if ( SDL_BlitSurface( text, nil, screen, @dstrect ) < 0 ) then
+ begin
+ //fprintf(stderr, 'Couldn't blit text to display: %s', [SDL_GetError]);
+ TTF_CloseFont( font );
+ ShutDownApplication( 2 );
+ end;
+
+ SDL_UpdateRect( screen, 0, 0, 0, 0 );
+ { Set the text colorkey and convert to display format }
+ if ( SDL_SetColorKey( text, SDL_SRCCOLORKEY or SDL_RLEACCEL, 0 ) < 0 ) then
+ begin
+ //fprintf(stderr, 'Warning: Couldn't set text colorkey: %s', [SDL_GetError]);
+ end;
+
+ temp := SDL_DisplayFormat( text );
+ if ( temp <> nil ) then
+ begin
+ SDL_FreeSurface( text );
+ text := temp;
+
+ { Wait for a keystroke, and blit text on mouse press }
+ done := false;
+ while ( not done ) do
+ begin
+ while ( SDL_PollEvent( @event ) <> 0 ) do
+ begin
+ case ( event.type_ ) of
+ SDL_MOUSEBUTTONDOWN :
+ begin
+ dstrect.x := event.button.x - text.w div 2;
+ dstrect.y := event.button.y - text.h div 2;
+ dstrect.w := text.w;
+ dstrect.h := text.h;
+ if ( SDL_BlitSurface( text, nil, screen, @dstrect ) = 0 ) then
+ begin
+ SDL_UpdateRects( screen, 1, @dstrect );
+ end
+ else
+ begin
+ //fprintf(stderr, 'Couldn''t blit text to display: %s', [SDL_GetError]);
+ end;
+ end;
+
+ SDL_KEYDOWN, SDL_QUITEV :
+ begin
+ done := true;
+ end;
+
+ end;
+ end;
+ end;
+ end;
+ SDL_FreeSurface( text );
+ TTF_CloseFont( font );
+ ShutDownApplication( 0 );
+end.
+
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL_ttf/Pas/sdl_ttf.pas b/Game/Code/lib/JEDI-SDLv1.0/SDL_ttf/Pas/sdl_ttf.pas
new file mode 100644
index 00000000..88966f82
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL_ttf/Pas/sdl_ttf.pas
@@ -0,0 +1,505 @@
+unit sdl_ttf;
+{
+ $Id: sdl_ttf.pas,v 1.19 2007/12/05 22:54:20 savage Exp $
+
+}
+{******************************************************************************}
+{ }
+{ JEDI-SDL : Pascal units for SDL - Simple DirectMedia Layer }
+{ Conversion of the Simple DirectMedia Layer Headers }
+{ }
+{ Portions created by Sam Lantinga <slouken@devolution.com> are }
+{ Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga }
+{ 5635-34 Springhouse Dr. }
+{ Pleasanton, CA 94588 (USA) }
+{ }
+{ All Rights Reserved. }
+{ }
+{ The original files are : SDL_ttf.h }
+{ }
+{ The initial developer of this Pascal code was : }
+{ Dominqiue Louis <Dominique@SavageSoftware.com.au> }
+{ }
+{ Portions created by Dominqiue Louis are }
+{ Copyright (C) 2000 - 2001 Dominqiue Louis. }
+{ }
+{ }
+{ Contributor(s) }
+{ -------------- }
+{ Tom Jones <tigertomjones@gmx.de> His Project inspired this conversion }
+{ }
+{ Obtained through: }
+{ Joint Endeavour of Delphi Innovators ( Project JEDI ) }
+{ }
+{ You may retrieve the latest version of this file at the Project }
+{ JEDI home page, located at http://delphi-jedi.org }
+{ }
+{ The contents of this file are used with permission, subject to }
+{ the Mozilla Public License Version 1.1 (the "License"); you may }
+{ not use this file except in compliance with the License. You may }
+{ obtain a copy of the License at }
+{ http://www.mozilla.org/MPL/MPL-1.1.html }
+{ }
+{ Software distributed under the License is distributed on an }
+{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
+{ implied. See the License for the specific language governing }
+{ rights and limitations under the License. }
+{ }
+{ Description }
+{ ----------- }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ Requires }
+{ -------- }
+{ The SDL Runtime libraris on Win32 : SDL.dll on Linux : libSDL.so }
+{ They are available from... }
+{ http://www.libsdl.org . }
+{ }
+{ Programming Notes }
+{ ----------------- }
+{ }
+{ }
+{ }
+{ }
+{ Revision History }
+{ ---------------- }
+{ December 08 2002 - DL : Fixed definition of TTF_RenderUnicode_Solid }
+{ }
+{ April 03 2003 - DL : Added jedi-sdl.inc include file to support more }
+{ Pascal compilers. Initial support is now included }
+{ for GnuPascal, VirtualPascal, TMT and obviously }
+{ continue support for Delphi Kylix and FreePascal. }
+{ }
+{ April 24 2003 - DL : under instruction from Alexey Barkovoy, I have added}
+{ better TMT Pascal support and under instruction }
+{ from Prof. Abimbola Olowofoyeku (The African Chief),}
+{ I have added better Gnu Pascal support }
+{ }
+{ April 30 2003 - DL : under instruction from David Mears AKA }
+{ Jason Siletto, I have added FPC Linux support. }
+{ This was compiled with fpc 1.1, so remember to set }
+{ include file path. ie. -Fi/usr/share/fpcsrc/rtl/* }
+{ }
+{
+ $Log: sdl_ttf.pas,v $
+ Revision 1.19 2007/12/05 22:54:20 savage
+ Better Mac OS X support for Frameworks.
+
+ Revision 1.18 2007/06/01 11:16:33 savage
+ Added IFDEF UNIX for Workaround.
+
+ Revision 1.17 2007/06/01 08:38:21 savage
+ Added TTF_RenderText_Solid workaround as suggested by Michalis Kamburelis
+
+ Revision 1.16 2007/05/29 21:32:14 savage
+ Changes as suggested by Almindor for 64bit compatibility.
+
+ Revision 1.15 2007/05/20 20:32:45 savage
+ Initial Changes to Handle 64 Bits
+
+ Revision 1.14 2006/12/02 00:19:01 savage
+ Updated to latest version
+
+ Revision 1.13 2005/04/10 11:48:33 savage
+ Changes as suggested by Michalis, thanks.
+
+ Revision 1.12 2005/01/05 01:47:14 savage
+ Changed LibName to reflect what MacOS X should have. ie libSDL*-1.2.0.dylib respectively.
+
+ Revision 1.11 2005/01/04 23:14:57 savage
+ Changed LibName to reflect what most Linux distros will have. ie libSDL*-1.2.so.0 respectively.
+
+ Revision 1.10 2005/01/02 19:07:32 savage
+ Slight bug fix to use LongInt instead of Long ( Thanks Michalis Kamburelis )
+
+ Revision 1.9 2005/01/01 02:15:20 savage
+ Updated to v2.0.7
+
+ Revision 1.8 2004/10/07 21:02:32 savage
+ Fix for FPC
+
+ Revision 1.7 2004/09/30 22:39:50 savage
+ Added a true type font class which contains a wrap text function.
+ Changed the sdl_ttf.pas header to reflect the future of jedi-sdl.
+
+ Revision 1.6 2004/08/14 22:54:30 savage
+ Updated so that Library name defines are correctly defined for MacOS X.
+
+ Revision 1.5 2004/05/10 14:10:04 savage
+ Initial MacOS X support. Fixed defines for MACOS ( Classic ) and DARWIN ( MacOS X ).
+
+ Revision 1.4 2004/04/13 09:32:08 savage
+ Changed Shared object names back to just the .so extension to avoid conflicts on various Linux/Unix distros. Therefore developers will need to create Symbolic links to the actual Share Objects if necessary.
+
+ Revision 1.3 2004/04/01 20:53:24 savage
+ Changed Linux Shared Object names so they reflect the Symbolic Links that are created when installing the RPMs from the SDL site.
+
+ Revision 1.2 2004/03/30 20:23:28 savage
+ Tidied up use of UNIX compiler directive.
+
+ Revision 1.1 2004/02/16 22:16:40 savage
+ v1.0 changes
+
+
+}
+{******************************************************************************}
+
+{$I jedi-sdl.inc}
+
+{
+ Define this to workaround a known bug in some freetype versions.
+ The error manifests as TTF_RenderGlyph_Solid returning nil (error)
+ and error message (in SDL_Error) is
+ "Failed loading DPMSDisable: /usr/lib/libX11.so.6: undefined symbol: DPMSDisable"
+ See [http://lists.libsdl.org/pipermail/sdl-libsdl.org/2007-March/060459.html]
+}
+{$IFDEF UNIX}
+{$DEFINE Workaround_TTF_RenderText_Solid}
+{$ENDIF}
+
+
+interface
+
+uses
+{$IFDEF __GPC__}
+ gpc,
+{$ENDIF}
+
+{$IFDEF WINDOWS}
+ {$IFNDEF __GPC__}
+ Windows,
+ {$ENDIF}
+{$ENDIF}
+ sdl;
+
+const
+{$IFDEF WINDOWS}
+ SDLttfLibName = 'SDL_ttf.dll';
+{$ENDIF}
+
+{$IFDEF UNIX}
+{$IFDEF DARWIN}
+ SDLttfLibName = 'libSDL_ttf-2.0.0.dylib';
+{$ELSE}
+ {$IFDEF FPC}
+ SDLttfLibName = 'libSDL_ttf.so';
+ {$ELSE}
+ SDLttfLibName = 'libSDL_ttf-2.0.so.0';
+ {$ENDIF}
+{$ENDIF}
+{$ENDIF}
+
+{$IFDEF MACOS}
+ SDLttfLibName = 'SDL_ttf';
+ {$linklib libSDL_ttf}
+{$ENDIF}
+
+ {* Printable format: "%d.%d.%d", MAJOR, MINOR, PATCHLEVEL *}
+ SDL_TTF_MAJOR_VERSION = 2;
+{$EXTERNALSYM SDL_TTF_MAJOR_VERSION}
+ SDL_TTF_MINOR_VERSION = 0;
+{$EXTERNALSYM SDL_TTF_MINOR_VERSION}
+ SDL_TTF_PATCHLEVEL = 9;
+{$EXTERNALSYM SDL_TTF_PATCHLEVEL}
+
+ // Backwards compatibility
+ TTF_MAJOR_VERSION = SDL_TTF_MAJOR_VERSION;
+ TTF_MINOR_VERSION = SDL_TTF_MINOR_VERSION;
+ TTF_PATCHLEVEL = SDL_TTF_PATCHLEVEL;
+
+{*
+ Set and retrieve the font style
+ This font style is implemented by modifying the font glyphs, and
+ doesn't reflect any inherent properties of the truetype font file.
+*}
+ TTF_STYLE_NORMAL = $00;
+ TTF_STYLE_BOLD = $01;
+ TTF_STYLE_ITALIC = $02;
+ TTF_STYLE_UNDERLINE = $04;
+
+// ZERO WIDTH NO-BREAKSPACE (Unicode byte order mark)
+ UNICODE_BOM_NATIVE = $FEFF;
+ UNICODE_BOM_SWAPPED = $FFFE;
+
+type
+ PTTF_Font = ^TTTF_font;
+ TTTF_Font = record
+ end;
+
+{ This macro can be used to fill a version structure with the compile-time
+ version of the SDL_ttf library. }
+procedure SDL_TTF_VERSION( var X : TSDL_version );
+{$EXTERNALSYM SDL_TTF_VERSION}
+
+{ This function gets the version of the dynamically linked SDL_ttf library.
+ It should NOT be used to fill a version structure, instead you should use the
+ SDL_TTF_VERSION() macro. }
+function TTF_Linked_Version : PSDL_version;
+cdecl; external {$IFDEF __GPC__}name 'TTF_Linked_Version'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_Linked_Version}
+
+{ This function tells the library whether UNICODE text is generally
+ byteswapped. A UNICODE BOM character in a string will override
+ this setting for the remainder of that string.
+}
+procedure TTF_ByteSwappedUNICODE( swapped : integer );
+cdecl; external {$IFDEF __GPC__}name 'TTF_ByteSwappedUNICODE'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_ByteSwappedUNICODE}
+
+//returns 0 on succes, -1 if error occurs
+function TTF_Init : integer;
+cdecl; external {$IFDEF __GPC__}name 'TTF_Init'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_Init}
+
+{
+ Open a font file and create a font of the specified point size.
+ Some .fon fonts will have several sizes embedded in the file, so the
+ point size becomes the index of choosing which size. If the value
+ is too high, the last indexed size will be the default.
+}
+function TTF_OpenFont( const filename : Pchar; ptsize : integer ) : PTTF_Font;
+cdecl; external {$IFDEF __GPC__}name 'TTF_OpenFont'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_OpenFont}
+
+function TTF_OpenFontIndex( const filename : Pchar; ptsize : integer; index : Longint ): PTTF_Font;
+cdecl; external {$IFDEF __GPC__}name 'TTF_OpenFontIndex'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_OpenFontIndex}
+
+function TTF_OpenFontRW( src : PSDL_RWops; freesrc : integer; ptsize : integer ): PTTF_Font;
+cdecl; external {$IFDEF __GPC__}name 'TTF_OpenFontRW'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_OpenFontRW}
+
+function TTF_OpenFontIndexRW( src : PSDL_RWops; freesrc : integer; ptsize : integer; index : Longint ): PTTF_Font;
+cdecl; external {$IFDEF __GPC__}name 'TTF_OpenFontIndexRW'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_OpenFontIndexRW}
+
+function TTF_GetFontStyle( font : PTTF_Font) : integer;
+cdecl; external {$IFDEF __GPC__}name 'TTF_GetFontStyle'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_GetFontStyle}
+
+procedure TTF_SetFontStyle( font : PTTF_Font; style : integer );
+cdecl; external {$IFDEF __GPC__}name 'TTF_SetFontStyle'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_SetFontStyle}
+
+{ Get the total height of the font - usually equal to point size }
+function TTF_FontHeight( font : PTTF_Font ) : Integer;
+cdecl; external {$IFDEF __GPC__}name 'TTF_FontHeight'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_FontHeight}
+
+{ Get the offset from the baseline to the top of the font
+ This is a positive value, relative to the baseline.
+}
+function TTF_FontAscent( font : PTTF_Font ) : Integer;
+cdecl; external {$IFDEF __GPC__}name 'TTF_FontAscent'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_FontAscent}
+{ Get the offset from the baseline to the bottom of the font
+ This is a negative value, relative to the baseline.
+}
+function TTF_FontDescent( font : PTTF_Font ) : Integer;
+cdecl; external {$IFDEF __GPC__}name 'TTF_FontDescent'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_FontDescent}
+
+{ Get the recommended spacing between lines of text for this font }
+function TTF_FontLineSkip( font : PTTF_Font ): Integer;
+cdecl; external {$IFDEF __GPC__}name 'TTF_FontLineSkip'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_FontLineSkip}
+
+{ Get the number of faces of the font }
+function TTF_FontFaces( font : PTTF_Font ) : Longint;
+cdecl; external {$IFDEF __GPC__}name 'TTF_FontFaces'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_FontFaces}
+
+{ Get the font face attributes, if any }
+function TTF_FontFaceIsFixedWidth( font : PTTF_Font ): Integer;
+cdecl; external {$IFDEF __GPC__}name 'TTF_FontFaceIsFixedWidth'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_FontFaceIsFixedWidth}
+
+function TTF_FontFaceFamilyName( font : PTTF_Font ): PChar;
+cdecl; external {$IFDEF __GPC__}name 'TTF_FontFaceFamilyName'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_FontFaceFamilyName}
+
+function TTF_FontFaceStyleName( font : PTTF_Font ): PChar;
+cdecl; external {$IFDEF __GPC__}name 'TTF_FontFaceStyleName'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_FontFaceStyleName}
+
+{ Get the metrics (dimensions) of a glyph }
+function TTF_GlyphMetrics( font : PTTF_Font; ch : Uint16;
+ var minx : integer; var maxx : integer;
+ var miny : integer; var maxy : integer;
+ var advance : integer ): Integer;
+cdecl; external {$IFDEF __GPC__}name 'TTF_GlyphMetrics'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_GlyphMetrics}
+
+{ Get the dimensions of a rendered string of text }
+function TTF_SizeText( font : PTTF_Font; const text : PChar; var w : integer; var y : integer ): Integer;
+cdecl; external {$IFDEF __GPC__}name 'TTF_SizeText'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_SizeText}
+
+function TTF_SizeUTF8( font : PTTF_Font; const text : PChar; var w : integer; var y : integer): Integer;
+cdecl; external {$IFDEF __GPC__}name 'TTF_SizeUTF8'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_SizeUTF8}
+
+function TTF_SizeUNICODE( font : PTTF_Font; const text : PUint16; var w : integer; var y : integer): Integer;
+cdecl; external {$IFDEF __GPC__}name 'TTF_SizeUNICODE'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_SizeUNICODE}
+
+{ Create an 8-bit palettized surface and render the given text at
+ fast quality with the given font and color. The 0 pixel is the
+ colorkey, giving a transparent background, and the 1 pixel is set
+ to the text color.
+ This function returns the new surface, or NULL if there was an error.
+}
+function TTF_RenderText_Solid( font : PTTF_Font;
+ const text : PChar; fg : TSDL_Color ): PSDL_Surface;
+{$IFNDEF Workaround_TTF_RenderText_Solid}
+cdecl; external {$IFDEF __GPC__}name 'TTF_RenderText_Solid'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_RenderText_Solid}
+{$ENDIF}
+
+function TTF_RenderUTF8_Solid( font : PTTF_Font;
+ const text : PChar; fg : TSDL_Color ): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'TTF_RenderUTF8_Solid'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_RenderUTF8_Solid}
+
+function TTF_RenderUNICODE_Solid( font : PTTF_Font;
+ const text :PUint16; fg : TSDL_Color ): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'TTF_RenderUNICODE_Solid'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_RenderUNICODE_Solid}
+
+{
+Create an 8-bit palettized surface and render the given glyph at
+ fast quality with the given font and color. The 0 pixel is the
+ colorkey, giving a transparent background, and the 1 pixel is set
+ to the text color. The glyph is rendered without any padding or
+ centering in the X direction, and aligned normally in the Y direction.
+ This function returns the new surface, or NULL if there was an error.
+}
+function TTF_RenderGlyph_Solid( font : PTTF_Font;
+ ch : Uint16; fg : TSDL_Color ): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'TTF_RenderGlyph_Solid'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_RenderGlyph_Solid}
+
+{ Create an 8-bit palettized surface and render the given text at
+ high quality with the given font and colors. The 0 pixel is background,
+ while other pixels have varying degrees of the foreground color.
+ This function returns the new surface, or NULL if there was an error.
+}
+function TTF_RenderText_Shaded( font : PTTF_Font;
+ const text : PChar; fg : TSDL_Color; bg : TSDL_Color ): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'TTF_RenderText_Shaded'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_RenderText_Shaded}
+function TTF_RenderUTF8_Shaded( font : PTTF_Font;
+ const text : PChar; fg : TSDL_Color; bg : TSDL_Color ): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'TTF_RenderUTF8_Shaded'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_RenderUTF8_Shaded}
+function TTF_RenderUNICODE_Shaded( font : PTTF_Font;
+ const text : PUint16; fg : TSDL_Color; bg : TSDL_Color ): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'TTF_RenderUNICODE_Shaded'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_RenderUNICODE_Shaded}
+
+{ Create an 8-bit palettized surface and render the given glyph at
+ high quality with the given font and colors. The 0 pixel is background,
+ while other pixels have varying degrees of the foreground color.
+ The glyph is rendered without any padding or centering in the X
+ direction, and aligned normally in the Y direction.
+ This function returns the new surface, or NULL if there was an error.
+}
+function TTF_RenderGlyph_Shaded( font : PTTF_Font; ch : Uint16; fg : TSDL_Color;
+ bg : TSDL_Color ): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'TTF_RenderGlyph_Shaded'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_RenderGlyph_Shaded}
+
+{ Create a 32-bit ARGB surface and render the given text at high quality,
+ using alpha blending to dither the font with the given color.
+ This function returns the new surface, or NULL if there was an error.
+}
+function TTF_RenderText_Blended( font : PTTF_Font;
+ const text : PChar; fg : TSDL_Color ): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'TTF_RenderText_Blended'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_RenderText_Blended}
+function TTF_RenderUTF8_Blended( font : PTTF_Font;
+ const text : PChar; fg : TSDL_Color ): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'TTF_RenderUTF8_Blended'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_RenderUTF8_Blended}
+function TTF_RenderUNICODE_Blended( font : PTTF_Font;
+ const text: PUint16; fg : TSDL_Color ): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'TTF_RenderUNICODE_Blended'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_RenderUNICODE_Blended}
+
+{ Create a 32-bit ARGB surface and render the given glyph at high quality,
+ using alpha blending to dither the font with the given color.
+ The glyph is rendered without any padding or centering in the X
+ direction, and aligned normally in the Y direction.
+ This function returns the new surface, or NULL if there was an error.
+}
+function TTF_RenderGlyph_Blended( font : PTTF_Font; ch : Uint16; fg : TSDL_Color ): PSDL_Surface;
+cdecl; external {$IFDEF __GPC__}name 'TTF_RenderGlyph_Blended'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_RenderGlyph_Blended}
+
+{ For compatibility with previous versions, here are the old functions }
+{#define TTF_RenderText(font, text, fg, bg)
+ TTF_RenderText_Shaded(font, text, fg, bg)
+#define TTF_RenderUTF8(font, text, fg, bg)
+ TTF_RenderUTF8_Shaded(font, text, fg, bg)
+#define TTF_RenderUNICODE(font, text, fg, bg)
+ TTF_RenderUNICODE_Shaded(font, text, fg, bg)}
+
+{ Close an opened font file }
+procedure TTF_CloseFont( font : PTTF_Font );
+cdecl; external {$IFDEF __GPC__}name 'TTF_CloseFont'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_CloseFont}
+
+//De-initialize TTF engine
+procedure TTF_Quit;
+cdecl; external {$IFDEF __GPC__}name 'TTF_Quit'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_Quit}
+
+// Check if the TTF engine is initialized
+function TTF_WasInit : integer;
+cdecl; external {$IFDEF __GPC__}name 'TTF_WasInit'{$ELSE} SDLttfLibName{$ENDIF __GPC__};
+{$EXTERNALSYM TTF_WasInit}
+
+// We'll use SDL for reporting errors
+procedure TTF_SetError( fmt : PChar );
+
+function TTF_GetError : PChar;
+
+implementation
+
+{$IFDEF __GPC__}
+ {$L 'sdl_ttf'} { link sdl_ttf.dll.a or libsdl_ttf.so or libsdl_ttf.a }
+{$ENDIF}
+
+procedure SDL_TTF_VERSION( var X : TSDL_version );
+begin
+ X.major := SDL_TTF_MAJOR_VERSION;
+ X.minor := SDL_TTF_MINOR_VERSION;
+ X.patch := SDL_TTF_PATCHLEVEL;
+end;
+
+procedure TTF_SetError( fmt : PChar );
+begin
+ SDL_SetError( fmt );
+end;
+
+function TTF_GetError : PChar;
+begin
+ result := SDL_GetError;
+end;
+
+{$IFDEF Workaround_TTF_RenderText_Solid}
+function TTF_RenderText_Solid( font : PTTF_Font;
+ const text : PChar; fg : TSDL_Color ): PSDL_Surface;
+const
+ Black: TSDL_Color = (r: 0; g: 0; b: 0; unused: 0);
+begin
+ Result := TTF_RenderText_Shaded(font, text, fg, Black);
+end;
+{$ENDIF Workaround_TTF_RenderText_Solid}
+
+end.
diff --git a/Game/Code/lib/JEDI-SDLv1.0/SDL_ttf/Pas/sdltruetypefont.pas b/Game/Code/lib/JEDI-SDLv1.0/SDL_ttf/Pas/sdltruetypefont.pas
new file mode 100644
index 00000000..a0f25e12
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/SDL_ttf/Pas/sdltruetypefont.pas
@@ -0,0 +1,565 @@
+unit sdltruetypefont;
+{
+ $Id: sdltruetypefont.pas,v 1.5 2005/05/26 21:22:28 savage Exp $
+
+}
+{******************************************************************************}
+{ }
+{ JEDI-SDL : Pascal units for SDL - Simple DirectMedia Layer }
+{ Wrapper class for SDL_ttf }
+{ }
+{ The initial developer of this Pascal code was : }
+{ Dominqiue Louis <Dominique@SavageSoftware.com.au> }
+{ }
+{ Portions created by Dominqiue Louis are }
+{ Copyright (C) 2000 - 2001 Dominqiue Louis. }
+{ }
+{ }
+{ Contributor(s) }
+{ -------------- }
+{ }
+{ }
+{ Obtained through: }
+{ Joint Endeavour of Delphi Innovators ( Project JEDI ) }
+{ }
+{ You may retrieve the latest version of this file at the Project }
+{ JEDI home page, located at http://delphi-jedi.org }
+{ }
+{ The contents of this file are used with permission, subject to }
+{ the Mozilla Public License Version 1.1 (the "License"); you may }
+{ not use this file except in compliance with the License. You may }
+{ obtain a copy of the License at }
+{ http://www.mozilla.org/MPL/MPL-1.1.html }
+{ }
+{ Software distributed under the License is distributed on an }
+{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
+{ implied. See the License for the specific language governing }
+{ rights and limitations under the License. }
+{ }
+{ Description }
+{ ----------- }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ Requires }
+{ -------- }
+{ The SDL Runtime libraris on Win32 : SDL.dll on Linux : libSDL.so }
+{ They are available from... }
+{ http://www.libsdl.org . }
+{ }
+{ Programming Notes }
+{ ----------------- }
+{ }
+{ }
+{ }
+{ }
+{ Revision History }
+{ ---------------- }
+{ September 23 2004 - DL : Initial Creation }
+{
+ $Log: sdltruetypefont.pas,v $
+ Revision 1.5 2005/05/26 21:22:28 savage
+ Update to Input code.
+
+ Revision 1.1 2005/05/25 23:15:42 savage
+ Latest Changes
+
+ Revision 1.4 2005/05/25 22:55:01 savage
+ Added InputRect support.
+
+ Revision 1.3 2005/05/13 14:02:49 savage
+ Made it use UniCode rendering by default.
+
+ Revision 1.2 2005/05/13 11:37:52 savage
+ Improved wordwrapping algorithm
+
+ Revision 1.1 2004/09/30 22:39:50 savage
+ Added a true type font class which contains a wrap text function.
+ Changed the sdl_ttf.pas header to reflect the future of jedi-sdl.
+
+
+}
+{******************************************************************************}
+
+interface
+
+uses
+ sdl,
+ sdl_ttf;
+
+type
+ TRenderType = ( rtLatin1, rtUTF8, rtUnicode );
+ TSDLFontStyle = ( fsBold, fsItalic, fsUnderline, fsStrikeOut );
+
+ TSDLFontStyles = set of TSDLFontStyle;
+
+ TTrueTypeFont = class( TObject )
+ private
+ FFont : PTTF_Font;
+ FSolid : Boolean;
+ FBackGroundColour : TSDL_Color;
+ FForeGroundColour : TSDL_Color;
+ FRenderType : TRenderType;
+ FStyle : TSDLFontStyles;
+ FFontFile : string;
+ FFontSize : integer;
+ procedure PrepareFont;
+
+ protected
+
+ public
+ constructor Create( aFontFile : string; aRenderStyle : TSDLFontStyles = [ ]; aFontSize : integer = 14 );
+ destructor Destroy; override;
+ function DrawText( aText : WideString ) : PSDL_Surface; overload;
+ function DrawText( aText : WideString; aWidth, aHeight : Integer ) : PSDL_Surface; overload;
+ function Input(aDestination: PSDL_Surface; aX, aY, aWidth, aHeight: integer; var aText: string; aMaxChars: integer = 10 ): PSDL_Surface;
+ property BackGroundColour : TSDL_Color read FBackGroundColour write FBackGroundColour;
+ property ForeGroundColour : TSDL_Color read FForeGroundColour write FForeGroundColour;
+ property FontFile : string read FFontFile write FFontFile;
+ property RenderType : TRenderType read FRenderType write FRenderType;
+ property Solid : Boolean read FSolid write FSolid;
+ property Style : TSDLFontStyles read FStyle write FStyle;
+ property FontSize : integer read FFontSize write FFontSize;
+ end;
+
+
+implementation
+
+uses
+ SysUtils;
+
+{ TTrueTypeFont }
+
+constructor TTrueTypeFont.Create( aFontFile : string; aRenderStyle : TSDLFontStyles; aFontSize : integer );
+begin
+ inherited Create;
+ if FileExists( aFontFile ) then
+ begin
+ FStyle := aRenderStyle;
+ FFontSize := aFontSize;
+ FSolid := false;
+ FBackGroundColour.r := 255;
+ FBackGroundColour.g := 255;
+ FBackGroundColour.b := 255;
+ FForeGroundColour.r := 0;
+ FForeGroundColour.g := 0;
+ FForeGroundColour.b := 0;
+ FRenderType := rtUnicode;
+ if ( TTF_Init >= 0 ) then
+ begin
+ FFontFile := aFontFile;
+ end
+ else
+ raise Exception.Create( 'Failed to Initialiase SDL_TTF' );
+ end
+ else
+ raise Exception.Create( 'Font File does not exist' );
+end;
+
+destructor TTrueTypeFont.Destroy;
+begin
+ if FFont <> nil then
+ TTF_CloseFont( FFont );
+ TTF_Quit;
+ inherited;
+end;
+
+function TTrueTypeFont.DrawText( aText : WideString ) : PSDL_Surface;
+begin
+ PrepareFont;
+
+ result := nil;
+
+ case FRenderType of
+ rtLatin1 :
+ begin
+ if ( FSolid ) then
+ begin
+ result := TTF_RenderText_Solid( FFont, PChar( string( aText ) ), FForeGroundColour );
+ end
+ else
+ begin
+ result := TTF_RenderText_Shaded( FFont, PChar( string( aText ) ), FForeGroundColour, FBackGroundColour );
+ end;
+ end;
+
+ rtUTF8 :
+ begin
+ if ( FSolid ) then
+ begin
+ result := TTF_RenderUTF8_Solid( FFont, PChar( string( aText ) ), FForeGroundColour );
+ end
+ else
+ begin
+ result := TTF_RenderUTF8_Shaded( FFont, PChar( string( aText ) ), FForeGroundColour, FBackGroundColour );
+ end;
+ end;
+
+ rtUnicode :
+ begin
+ if ( FSolid ) then
+ begin
+ result := TTF_RenderUNICODE_Solid( FFont, PUInt16( aText ), FForeGroundColour );
+ end
+ else
+ begin
+ result := TTF_RenderUNICODE_Shaded( FFont, PUInt16( aText ), FForeGroundColour, FBackGroundColour );
+ end;
+ end;
+ end;
+end;
+
+function TTrueTypeFont.DrawText( aText : WideString; aWidth, aHeight : Integer ) : PSDL_Surface;
+var
+ textw, texth, i, yPos : integer;
+ strChopped : WideString;
+ SurfaceList : array of PSDL_Surface;
+ strlist : array of WideString;
+ ReturnedSurface : PSDL_Surface;
+ BltRect : TSDL_Rect;
+begin
+ PrepareFont;
+
+ // Do an initial check to see if it already fits
+ case FRenderType of
+ rtLatin1 :
+ begin
+ if TTF_SizeText( FFont, PChar( string( aText ) ), textw, texth ) = 0 then
+ begin
+ if ( textw < aWidth )
+ and ( texth < aHeight ) then
+ begin
+ result := DrawText( aText );
+ exit;
+ end
+ end;
+ end;
+
+ rtUTF8 :
+ begin
+ if TTF_SizeUTF8( FFont, PChar( string( aText ) ), textw, texth ) = 0 then
+ begin
+ if ( textw < aWidth )
+ and ( texth < aHeight ) then
+ begin
+ result := DrawText( aText );
+ exit;
+ end
+ end;
+ end;
+
+ rtUnicode :
+ begin
+ if TTF_SizeUNICODE( FFont, PUInt16( aText ), textw, texth ) = 0 then
+ begin
+ if ( textw < aWidth )
+ and ( texth < aHeight ) then
+ begin
+ result := DrawText( aText );
+ exit;
+ end
+ end;
+ end;
+ end;
+
+ // Create the Surface we will be returning
+ ReturnedSurface := SDL_DisplayFormat( SDL_CreateRGBSurface( SDL_SRCCOLORKEY or SDL_RLEACCEL or SDL_HWACCEL, aWidth, aHeight, 16, 0, 0, 0, 0 ) );
+
+ // If we are still here there is some serious parsing to do
+ case FRenderType of
+ rtLatin1 :
+ begin
+ strChopped := aText;
+ i := Length( strChopped );
+ while ( i <> 0 ) do
+ begin
+ if ( string( strChopped[ i ] ) <> ' ' ) and ( Integer( string( strChopped[ i ] ) ) <> 13 ) then
+ dec( i )
+ else
+ begin
+ dec( i );
+ if TTF_SizeText( FFont, PChar( string( Copy( strChopped, 0, i ) ) ), textw, texth ) = 0 then
+ begin
+ if ( textw < aWidth )
+ and ( texth < aHeight ) then
+ begin
+ SetLength( strlist, Length( strlist ) + 1 );
+ strlist[ Length( strlist ) - 1 ] := Copy( strChopped, 0, i );
+ strChopped := Copy( strChopped, i + 2, Length( strChopped ) - ( i - 1 ) );
+ i := Length( strChopped );
+ if TTF_SizeText( FFont, PChar( string( strChopped ) ), textw, texth ) = 0 then
+ begin
+ if ( textw < aWidth )
+ and ( texth < aHeight ) then
+ begin
+ SetLength( strlist, Length( strlist ) + 1 );
+ strlist[ Length( strlist ) - 1 ] := Copy( strChopped, 0, i );
+ strChopped := Copy( strChopped, i + 2, Length( strChopped ) - ( i - 1 ) );
+ i := Length( strChopped );
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+
+ SetLength( SurfaceList, Length( strlist ) );
+ for i := Low( strlist ) to High( strlist ) do
+ begin
+ if ( FSolid ) then
+ begin
+ SurfaceList[ i ] := TTF_RenderText_Solid( FFont, PChar( string( strlist[ i ] ) ), FForeGroundColour );
+ end
+ else
+ begin
+ SurfaceList[ i ] := TTF_RenderText_Shaded( FFont, PChar( string( strlist[ i ] ) ), FForeGroundColour, FBackGroundColour );
+ end;
+ end;
+ end;
+
+ rtUTF8 :
+ begin
+ strChopped := aText;
+ i := Length( strChopped );
+ while ( i <> 0 ) do
+ begin
+ if ( string( strChopped[ i ] ) <> ' ' ) and ( Integer( string( strChopped[ i ] ) ) <> 13 ) then
+ dec( i )
+ else
+ begin
+ dec( i );
+ if TTF_SizeUTF8( FFont, PChar( string( Copy( strChopped, 0, i ) ) ), textw, texth ) = 0 then
+ begin
+ if ( textw < aWidth )
+ and ( texth < aHeight ) then
+ begin
+ SetLength( strlist, Length( strlist ) + 1 );
+ strlist[ Length( strlist ) - 1 ] := Copy( strChopped, 0, i );
+ strChopped := Copy( strChopped, i + 2, Length( strChopped ) - ( i - 1 ) );
+ i := Length( strChopped );
+ if TTF_SizeUTF8( FFont, PChar( string( strChopped ) ), textw, texth ) = 0 then
+ begin
+ if ( textw < aWidth )
+ and ( texth < aHeight ) then
+ begin
+ SetLength( strlist, Length( strlist ) + 1 );
+ strlist[ Length( strlist ) - 1 ] := Copy( strChopped, 0, i );
+ strChopped := Copy( strChopped, i + 2, Length( strChopped ) - ( i - 1 ) );
+ i := Length( strChopped );
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+
+ SetLength( SurfaceList, Length( strlist ) );
+ for i := Low( strlist ) to High( strlist ) do
+ begin
+ if ( FSolid ) then
+ begin
+ SurfaceList[ i ] := TTF_RenderUTF8_Solid( FFont, PChar( string( strlist[ i ] ) ), FForeGroundColour );
+ end
+ else
+ begin
+ SurfaceList[ i ] := TTF_RenderUTF8_Shaded( FFont, PChar( string( strlist[ i ] ) ), FForeGroundColour, FBackGroundColour );
+ end;
+ end;
+ end;
+
+ rtUnicode :
+ begin
+ strChopped := aText;
+ i := Length( strChopped );
+ while ( i <> 0 ) do
+ begin
+ if ( string( strChopped[ i ] ) <> ' ' ) and ( Integer( string( strChopped[ i ] ) ) <> 13 ) then
+ dec( i )
+ else
+ begin
+ dec( i );
+ if TTF_SizeUNICODE( FFont, PUInt16( Copy( strChopped, 0, i ) ), textw, texth ) = 0 then
+ begin
+ if ( textw < aWidth )
+ and ( texth < aHeight ) then
+ begin
+ SetLength( strlist, Length( strlist ) + 1 );
+ strlist[ Length( strlist ) - 1 ] := Copy( strChopped, 0, i );
+ strChopped := Copy( strChopped, i + 2, Length( strChopped ) - ( i - 1 ) );
+ i := Length( strChopped );
+ if TTF_SizeUNICODE( FFont, PUInt16( strChopped ), textw, texth ) = 0 then
+ begin
+ if ( textw < aWidth )
+ and ( texth < aHeight ) then
+ begin
+ SetLength( strlist, Length( strlist ) + 1 );
+ strlist[ Length( strlist ) - 1 ] := Copy( strChopped, 0, i );
+ strChopped := Copy( strChopped, i + 2, Length( strChopped ) - ( i - 1 ) );
+ i := Length( strChopped );
+ end;
+ end;
+ end;
+ end;
+ end;
+ end;
+ SetLength( SurfaceList, Length( strlist ) );
+ for i := Low( strlist ) to High( strlist ) do
+ begin
+ if ( FSolid ) then
+ begin
+ SurfaceList[ i ] := TTF_RenderUNICODE_Solid( FFont, PUInt16( strlist[ i ] ), FForeGroundColour );
+ end
+ else
+ begin
+ SurfaceList[ i ] := TTF_RenderUNICODE_Shaded( FFont, PUInt16( strlist[ i ] ), FForeGroundColour, FBackGroundColour );
+ end;
+ end;
+ end;
+ end;
+
+ // Now Draw the SurfaceList onto the resulting Surface
+ yPos := 6;
+ for i := Low( SurfaceList ) to High( SurfaceList ) do
+ begin
+ BltRect.x := 6;
+ BltRect.y := yPos;
+ BltRect.w := SurfaceList[ i ].w;
+ BltRect.h := SurfaceList[ i ].h;
+ SDL_BlitSurface( SurfaceList[ i ], nil, ReturnedSurface, @BltRect );
+ yPos := yPos + TTF_FontHeight( FFont );
+ end;
+ result := ReturnedSurface;
+
+ for i := Low( SurfaceList ) to High( SurfaceList ) do
+ begin
+ SDL_FreeSurface( SurfaceList[ i ] );
+ end;
+ SetLength( SurfaceList, 0 );
+ SetLength( strlist, 0 );
+end;
+
+function TTrueTypeFont.Input(aDestination: PSDL_Surface; aX, aY, aWidth: integer; aHeight : integer; var aText : string; aMaxChars: integer): PSDL_Surface;
+var
+ event : TSDL_Event;
+ ch : integer;
+
+ BackSurface, TextSurface : PSDL_Surface;
+ rect : SDL_Rect;
+ textw, texth : integer;
+ Done : boolean;
+ PassedInText : string;
+begin
+ PassedInText := aText;
+
+ BackSurface := SDL_AllocSurface( aDestination.flags,
+ aDestination.w,
+ aDestination.h,
+ aDestination.format.BitsPerPixel,
+ aDestination.format.Rmask,
+ aDestination.format.Gmask,
+ aDestination.format.Bmask, 0 );
+
+ rect.x := aX;
+ rect.y := aY;
+ rect.w := aWidth;
+ rect.h := aHeight;
+
+ SDL_BlitSurface( aDestination, nil, BackSurface, nil );
+ SDL_FillRect( BackSurface, @rect, SDL_MapRGB( aDestination.format, 0, 0, 0 ) );
+
+ TextSurface := DrawText( aText + '|' );
+
+ // start input
+ SDL_EnableUNICODE( 1 );
+ Done := false;
+ while ( not Done ) and ( SDL_WaitEvent( @event ) > 0 ) do
+ begin
+ if event.type_ = SDL_KEYDOWN then
+ begin
+ ch := event.key.keysym.unicode;
+ case ch of
+ SDLK_RETURN :
+ begin
+ Done := true;
+ end;
+
+ SDLK_ESCAPE :
+ begin
+ aText := PassedInText;
+ Done := true;
+ end;
+
+ SDLK_BACKSPACE :
+ begin
+ if ( Length( aText ) > 0 ) then
+ begin
+ aText := Copy( aText, 0, Length( aText ) - 1 );
+ if TextSurface <> nil then
+ SDL_FreeSurface( TextSurface );
+ TextSurface := DrawText( aText + '|' );
+ end;
+ end;
+ else
+ begin
+ if Length( aText ) < aMaxChars then
+ begin
+ if ( chr( ch ) <> '' ) then
+ begin
+ aText := aText + chr( ch );
+
+ if ( aText <> '' )
+ and ( TTF_SizeUNICODE( FFont, PUInt16( aText ), textw, texth ) = 0 ) then
+ begin
+ if ( textw > aWidth ) then
+ aText := Copy( aText, 0, Length( aText ) - 1 );
+ end;
+
+ if TextSurface <> nil then
+ SDL_FreeSurface( TextSurface );
+ TextSurface := DrawText( aText + '|' );
+ end;
+ end;
+ end;
+ end;
+ end;
+ SDL_BlitSurface( BackSurface, nil, aDestination, nil );
+ SDL_BlitSurface( TextSurface, nil, aDestination, @rect );
+ SDL_Flip( aDestination );
+ end;
+
+ if TextSurface <> nil then
+ SDL_FreeSurface( TextSurface );
+ if aText <> '' then
+ TextSurface := DrawText( aText );
+ SDL_FreeSurface( BackSurface );
+ result := TextSurface;
+end;
+
+procedure TTrueTypeFont.PrepareFont;
+var
+ renderstyle : integer;
+begin
+ if FFont <> nil then
+ TTF_CloseFont( FFont );
+
+ FFont := TTF_OpenFont( PChar( FFontFile ), FFontSize );
+
+ renderstyle := TTF_STYLE_NORMAL;
+ if ( fsBold in FStyle ) then
+ renderstyle := renderstyle or TTF_STYLE_BOLD;
+
+ if ( fsItalic in FStyle ) then
+ renderstyle := renderstyle or TTF_STYLE_ITALIC;
+
+ if ( fsUnderline in FStyle ) then
+ renderstyle := renderstyle or TTF_STYLE_UNDERLINE;
+
+ TTF_SetFontStyle( FFont, renderstyle );
+end;
+
+end.
+
diff --git a/Game/Code/lib/JEDI-SDLv1.0/placeholder.txt b/Game/Code/lib/JEDI-SDLv1.0/placeholder.txt
new file mode 100644
index 00000000..d4073d15
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/placeholder.txt
@@ -0,0 +1,4 @@
+grab Jedi-sdl from :
+ http://sourceforge.net/projects/jedi-sdl
+
+and extract in this directory !! \ No newline at end of file
diff --git a/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/GLMovie/glmovie.dpr b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/GLMovie/glmovie.dpr
new file mode 100644
index 00000000..375e0b79
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/GLMovie/glmovie.dpr
@@ -0,0 +1,434 @@
+program glmovie;
+{******************************************************************}
+{ }
+{ Object Pascal Example of using smpeg with OpenGL }
+{ Conversion of the glmovie Demo }
+{ }
+{ Portions created by Sam Lantinga <slouken@devolution.com>, are }
+{ Copyright (C) 1998 Sam Lantinga. }
+{ All Rights Reserved. }
+{ }
+{ The original files are : glmovie.c }
+{ }
+{ The original Pascal code is : glmovie.dpr }
+{ The initial developer of the Pascal code is : }
+{ Dominique Louis <Dominique@SavageSoftware.com.au> }
+{ }
+{ Portions created by Dominique Louis are }
+{ Copyright (C) 2001 Dominique Louis. }
+{ }
+{ Contributor(s) }
+{ -------------- }
+{ Romi Kuntsman <romik@users.sourceforge.net> }
+{ }
+{ Obtained through: }
+{ Joint Endeavour of Delphi Innovators ( Project JEDI ) }
+{ }
+{ You may retrieve the latest version of this file at the Project }
+{ JEDI home page, located at http://delphi-jedi.org }
+{ }
+{ The contents of this file are used with permission, subject to }
+{ the Mozilla Public License Version 1.1 (the "License"); you may }
+{ not use this file except in compliance with the License. You may }
+{ obtain a copy of the License at }
+{ http://www.mozilla.org/NPL/NPL-1_1Final.html }
+{ }
+{ Software distributed under the License is distributed on an }
+{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
+{ implied. See the License for the specific language governing }
+{ rights and limitations under the License. }
+{ }
+{ Description }
+{ ----------- }
+{ GLMovie : Shows how to load and play an Mpeg file using OpenGL }
+{ }
+{ }
+{ Requires }
+{ -------- }
+{ SDL runtime libary for SDL, smpeg and OpenGL somewhere }
+{ in your path . }
+{ The Latest SDL runtimes can be found on http://www.libsdl.org }
+{ }
+{ Programming Notes }
+{ ----------------- }
+{ This demo shows how to load and play an mpeg file using smpeg }
+{ with OpenGLv }
+{ You will need Smpeg libraris and OpenGL in order for this demo }
+{ }
+{ Revision History }
+{ ---------------- }
+{ December 02 2001 - DL : Initial translation. }
+{ June 21 2002 - RK : Fixed DL's silly mistakes }
+{ }
+{ }
+{******************************************************************}
+
+uses
+ SysUtils,
+ gl,
+ glu,
+ smpeg,
+ sdl,
+ logger;
+
+type
+ { Some data is redundant at this stage. }
+ PGLMovieTexture = ^TGLMovieTexture;
+ TGLMovieTexture = record
+ id : GLuint; (* OpenGL texture id. *)
+ poly_width : GLuint; (* Quad width for tile. *)
+ poly_height : GLuint; (* Quad height for tile. *)
+ movie_width : GLuint; (* Width of movie inside tile. *)
+ movie_height : GLuint; (* Height of movie inside tile. *)
+ skip_rows : GLuint; (* Number of rows of movie to skip *)
+ skip_pixels : GLuint; (* Number of columns of movie to skip *)
+ row : GLuint; (* Row number of tile in scheme. *)
+ col : GLuint; (* Column number of tile in scheme. *)
+ end;
+
+type
+ TGLuintArray = array of GLuint;
+ PGLuintArray = ^TGLuintArray;
+ TGLMovieTextureArray = array of TGLMovieTexture;
+ PGLMovieTextureArray = ^TGLMovieTextureArray;
+
+var
+ (* Our evil maximum texture size. Boo 3Dfxnot *)
+ texture_size : GLuint = 256; (* Keep this around for easy freeing later. *)
+ texture_ids : TGLuintArray; (* Our main data. *)
+ textures : TGLMovieTextureArray;
+ num_texture_rows : GLuint = 0;
+ num_texture_cols : GLuint = 0; (* Width and height of all tiling. *)
+ tiled_width : GLuint = 0;
+ tiled_height : GLuint = 0; (* Width and height of entire movie. *)
+ movie_width : GLuint = 0;
+ movie_height : GLuint = 0;
+
+ (*
+ * Draw the frame data.
+ *
+ * Parameters:
+ * frame: Actual RGBA frame data
+ *)
+
+procedure glmovie_draw( frame : PGLubyte );
+var
+ i : GLuint;
+ shift : GLdouble;
+begin
+ glClear( GL_COLOR_BUFFER_BIT );
+ glMatrixMode( GL_MODELVIEW );
+ glLoadIdentity;
+ shift := 1 / ( texture_size );
+ for i := 0 to num_texture_rows * num_texture_cols - 1 do
+ begin
+ glBindTexture( GL_TEXTURE_2D, textures[ i ].id );
+ glPixelStorei( GL_UNPACK_ROW_LENGTH, movie_width );
+ glPixelStorei( GL_UNPACK_SKIP_ROWS, textures[ i ].skip_rows );
+ glPixelStorei( GL_UNPACK_SKIP_PIXELS, textures[ i ].skip_pixels );
+ glTexSubImage2D( GL_TEXTURE_2D, 0, 0, (* offset_x *) 0, (* offset_y *) textures[ i ].movie_width + 2, textures[ i ].movie_height + 2, GL_RGBA, GL_UNSIGNED_BYTE, frame );
+ glBegin( GL_QUADS );
+ glTexCoord2f( shift, shift );
+ glVertex2i( textures[ i ].col * texture_size, textures[ i ].row * texture_size );
+ glTexCoord2f( shift, shift + ( textures[ i ].movie_height ) / ( texture_size ) );
+ glVertex2i( textures[ i ].col * texture_size, ( textures[ i ].row + 1 ) * texture_size );
+ glTexCoord2f( shift + ( textures[ i ].movie_width ) / ( texture_size ), shift + ( textures[ i ].movie_height ) / ( texture_size ) );
+ glVertex2i( ( textures[ i ].col + 1 ) * texture_size, ( textures[ i ].row + 1 ) * texture_size );
+ glTexCoord2f( shift + ( textures[ i ].movie_width ) / ( texture_size ), shift );
+ glVertex2i( ( textures[ i ].col + 1 ) * texture_size, textures[ i ].row * texture_size );
+ glEnd;
+ end;
+end;
+
+{*
+ * Calculates the next power of 2 given a particular value.
+ * Useful for calculating proper texture sizes for non power-of-2
+ * aligned texures.
+ * Parameters:
+ * seed: Value to begin from
+ * Returns:
+ * Next power of 2 beginning from 'seed'
+ *}
+
+function glmovie_next_power_of_2( seed : GLuint ) : GLuint;
+var
+ i : GLuint;
+begin
+ i := 1;
+ while ( i < seed ) do
+ begin
+ i := i * 2;
+ end;
+
+ result := i;
+end;
+
+(*
+ * Initialize the movie player subsystem with the width and height
+ * of the *movie data* (as opposed to the window).
+ *
+ * Parameters:
+ * width: Width of movie in pixels
+ * height: Height of movie in pixels
+ * result :=s:
+ * GL_NO_ERROR on success
+ * Any of the enumerated GL errors on failure
+ *)
+
+function glmovie_init( Width : GLuint; Height : GLuint ) : GLenum;
+type
+ PGLubyteArray = ^TGLubyteArray;
+ TGLubyteArray = array of GLubyte;
+var
+ (* Initial black texels. *)
+ pixels : TGLubyteArray;
+ (* Absolute offsets from within tiled frame. *)
+ //offset_x: GLuint;
+ //offset_y: GLuint;
+ skip_rows : GLuint;
+ skip_pixels : GLuint;
+ i, j, current : GLuint;
+begin
+ skip_rows := 0;
+ current := 0;
+ (* Save original movie dimensions. *)
+ movie_width := width;
+ movie_height := height;
+ (* Get the power of 2 dimensions. *)
+ tiled_width := glmovie_next_power_of_2( width );
+ tiled_height := glmovie_next_power_of_2( height );
+ while ( ( texture_size > tiled_width ) or ( texture_size > tiled_height ) ) do
+ begin
+ texture_size := texture_size div 2;
+ end;
+ (* Now break it up into quads. *)
+ num_texture_rows := tiled_height div texture_size;
+ num_texture_cols := tiled_width div texture_size;
+ (* Time for fun with data type = record *)
+ glPixelStorei( GL_UNPACK_ALIGNMENT, 1 );
+ glEnable( GL_TEXTURE_2D );
+ glEnable( GL_DITHER );
+
+ SetLength( texture_ids, num_texture_rows * num_texture_cols );
+ if ( texture_ids = nil ) then
+ begin
+ result := GL_OUT_OF_MEMORY;
+ exit;
+ end;
+
+ glGenTextures( num_texture_rows * num_texture_cols, @texture_ids[0] );
+ SetLength( textures, num_texture_rows * num_texture_cols );
+
+ if ( textures = nil ) then
+ begin
+ glDeleteTextures( num_texture_rows * num_texture_cols, @texture_ids[0] );
+ SetLength( texture_ids, 0 );
+ result := GL_OUT_OF_MEMORY;
+ exit;
+ end;
+
+ for i := 0 to num_texture_rows - 1 do
+ begin
+ skip_pixels := 0;
+ for j := 0 to num_texture_cols - 1 do
+ begin
+ current := i * num_texture_cols + j;
+ (* Setup texture. *)
+ textures[ current ].id := texture_ids[ current ];
+ textures[ current ].poly_width := texture_size;
+ textures[ current ].poly_height := texture_size;
+ textures[ current ].movie_width := ( movie_width - 2 ) * ( j + 1 ) div num_texture_cols - skip_pixels;
+ textures[ current ].movie_height := ( movie_height - 2 ) * ( i + 1 ) div num_texture_rows - skip_rows;
+ textures[ current ].row := i;
+ textures[ current ].col := j;
+ textures[ current ].skip_pixels := skip_pixels;
+ textures[ current ].skip_rows := skip_rows;
+ skip_pixels := skip_pixels + textures[ current ].movie_width;
+
+ SetLength( pixels, textures[ current ].poly_width * textures[ current ].poly_height * 4 );
+ if ( pixels = nil ) then
+ begin
+ glDeleteTextures( num_texture_rows * num_texture_cols, @texture_ids[0] );
+ SetLength( texture_ids, 0 );
+ SetLength( textures, 0 );
+ result := GL_OUT_OF_MEMORY;
+ exit;
+ end;
+ //FillChar( pixels^, textures[ current ].poly_width * textures[ current ].poly_height * 4, 0 );
+
+ (* Do all of our useful binding. *)
+ glBindTexture( GL_TEXTURE_2D, textures[ current ].id );
+ glTexEnvf( GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_DECAL );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR );
+ glTexParameteri( GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR );
+ (* Specify our 256x256 black texture. *)
+ glTexImage2D( GL_TEXTURE_2D,
+ 0,
+ GL_RGB,
+ textures[ current ].poly_width,
+ textures[ current ].poly_height,
+ 0,
+ GL_RGBA,
+ GL_UNSIGNED_BYTE,
+ @pixels[0] );
+ SetLength( pixels, 0 );
+ end;
+ skip_rows := skip_rows + textures[ current ].movie_height;
+ end;
+ (* Simple state setup at the end. *)
+ glClearColor( 0.0, 0.0, 0.0, 0.0 );
+ result := glGetError( );
+end;
+
+//******************* glmpeg_update *************************
+
+procedure glmpeg_update( surface : PSDL_Surface; x : Sint32; y : Sint32; w : Uint32;
+ h : Uint32 ); cdecl;
+var
+ error : GLenum;
+begin
+ glmovie_draw( PGLubyte( surface.pixels ) );
+ error := glGetError( );
+ if ( error <> GL_NO_ERROR ) then
+ begin
+ Log.LogError( Format( 'glmovie: GL error: %s', [ gluErrorString( error ) ] ),
+ 'glmpeg_update' );
+ Exit;
+ end;
+ SDL_GL_SwapBuffers;
+end;
+
+{*
+ * Here we need to center the OpenGL viewport within the
+ * window size that we are given.
+ *
+ * Parameters:
+ * width: Width of the window in pixels
+ * height: Height of the window in pixels
+ *}
+
+procedure glmovie_resize( width : GLuint; height : GLuint );
+begin
+ glViewport( 0, 0, width, height );
+ glMatrixMode( GL_PROJECTION );
+ glLoadIdentity;
+ gluOrtho2D( 0, tiled_width, tiled_height, 0 );
+end;
+
+{*
+ * Free any resources associated with the movie player.
+ *}
+
+procedure glmovie_quit;
+begin
+ glDeleteTextures( num_texture_rows * num_texture_cols, @texture_ids );
+ SetLength( texture_ids, 0 );
+ SetLength( textures, 0 );
+end;
+
+var
+ mpeg : PSMPEG;
+ mpeg_info : TSMPEG_Info;
+ screen : PSDL_Surface;
+ surface : PSDL_Surface;
+ event : TSDL_Event;
+begin
+ if ( ParamCount < 1 ) then
+ begin
+ Log.LogError( Format( 'Usage: %s file.mpg', [ ParamStr( 0 ) ] ), 'Main' );
+ Exit;
+ end;
+
+ if ( SDL_Init( SDL_INIT_VIDEO or SDL_INIT_AUDIO ) < 0 ) then
+ begin
+ Log.LogError( 'glmovie: I couldn''t initizlize SDL(shrug)', 'Main' );
+ Exit;
+ end;
+
+ mpeg := SMPEG_new( PChar( ParamStr( 1 ) ), @mpeg_info, 1 );
+ if ( mpeg = nil ) then
+ begin
+ Log.LogError( Format( 'glmovie: I''m not so sure about this %s file...',
+ [ ParamStr( 1 ) ] ), 'Main' );
+ SDL_Quit;
+ Exit;
+ end;
+ (* Grab the mouse and input and set the video mode *)
+ SDL_ShowCursor( 0 );
+ SDL_WM_GrabInput( SDL_GRAB_ON );
+
+ SDL_GL_SetAttribute( SDL_GL_RED_SIZE, 5 );
+ SDL_GL_SetAttribute( SDL_GL_GREEN_SIZE, 5 );
+ SDL_GL_SetAttribute( SDL_GL_BLUE_SIZE, 5 );
+ SDL_GL_SetAttribute( SDL_GL_DEPTH_SIZE, 16 );
+ SDL_GL_SetAttribute( SDL_GL_DOUBLEBUFFER, 1 );
+
+ // Set the title bar in environments that support it
+ SDL_WM_SetCaption('SDL GLMovie Demo using JEDI-SDL', nil
+ );
+
+ screen := SDL_SetVideoMode( 640, 480, 16, SDL_OPENGL { or SDL_FULLSCREEN } );
+ if ( Screen = nil ) then
+ begin
+ Log.LogError( Format( 'glmovie: Couldn''t set 640 x 480 GL video mode : %s',
+ [ SDL_GetError ] ), 'Main' );
+ SDL_Quit;
+ Exit;
+ end;
+
+ (* Everything needs to be in RGB for GL, but needs to be 32-bit for SMPEG. *)
+ surface := SDL_AllocSurface( SDL_SWSURFACE,
+ mpeg_info.width,
+ mpeg_info.height,
+ 32,
+ $000000FF,
+ $0000FF00,
+ $00FF0000,
+ $FF000000 );
+
+ if ( surface = nil ) then
+ begin
+ Log.LogError( 'glmovie: I couldn''t make a surface(boo hoo)', 'Main' );
+ SDL_Quit;
+ Exit;
+ end;
+
+ (* *Initialize* with mpeg size. *)
+ if ( glmovie_init( mpeg_info.width, mpeg_info.height ) <> GL_NO_ERROR ) then
+ begin
+ Log.LogError( 'glmovie: glmovie_init failed ', 'Main' );
+ SDL_Quit;
+ Exit;
+ end;
+
+ (* *Resize* with window size. *)
+ glmovie_resize( screen.w, screen.h );
+ SMPEG_setdisplay( mpeg, surface, nil, @glmpeg_update );
+ SMPEG_play( mpeg );
+
+ while ( SMPEG_status( mpeg ) = STATUS_SMPEG_PLAYING ) do
+ begin
+
+ while ( SDL_PollEvent( @event ) <> 0 ) do
+ begin
+ case ( event.type_ ) of
+ SDL_KEYDOWN :
+ begin
+ if ( event.key.keysym.sym = SDLK_ESCAPE ) then
+ begin
+ SMPEG_stop( mpeg );
+ end;
+ end;
+ SDL_MOUSEBUTTONDOWN, SDL_QUITEV :
+ SMPEG_stop( mpeg );
+ end;
+ SDL_Delay( 100 );
+ end;
+ end;
+
+ glmovie_quit;
+ SDL_Quit;
+end.
+
diff --git a/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/Campus.jpg b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/Campus.jpg
new file mode 100644
index 00000000..366d7e91
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/Campus.jpg
Binary files differ
diff --git a/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/MPEGPlay.dpr b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/MPEGPlay.dpr
new file mode 100644
index 00000000..a0687f4e
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/MPEGPlay.dpr
@@ -0,0 +1,26 @@
+program MPEGPlay;
+
+{$IFDEF VER140}
+{$DEFINE CLX}
+{$ELSE}
+{$DEFINE VCL}
+{$ENDIF}
+
+uses
+
+{$IFDEF CLX}
+ QForms,
+{$ENDIF}
+{$IFDEF VCL}
+ Forms,
+{$ENDIF}
+ Main in 'Main.pas' {Form1};
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.CreateForm( TForm1, Form1 );
+ Application.Run;
+end.
+
diff --git a/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/Main.dfm b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/Main.dfm
new file mode 100644
index 00000000..f881f626
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/Main.dfm
Binary files differ
diff --git a/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/Main.pas b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/Main.pas
new file mode 100644
index 00000000..5c2bd4f5
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/Main.pas
@@ -0,0 +1,91 @@
+unit Main;
+
+interface
+
+{$IFDEF UNIX}
+{$DEFINE CLX}
+{$ELSE}
+{$DEFINE VCL}
+{$ENDIF}
+
+uses
+ SysUtils,
+ Classes,
+{$IFDEF CLX}
+ Types,
+ QGraphics,
+ QControls,
+ QForms,
+ QDialogs,
+ QExtCtrls,
+ QStdCtrls,
+{$ENDIF}
+{$IFDEF VCL}
+ Forms,
+ Graphics,
+ Dialogs,
+ StdCtrls,
+ Controls,
+ ExtCtrls,
+{$ENDIF}
+ sdlmpegpanel;
+
+type
+ TForm1 = class( TForm )
+ Panel1 : TPanel;
+ Panel2 : TPanel;
+ Button1 : TButton;
+ Button2 : TButton;
+ Button3 : TButton;
+ Panel3 : TPanel;
+ CheckBox1 : TCheckBox;
+ OpenDialog: TOpenDialog;
+ SDLMPEGPanel: TSDLMPEGPanel;
+ procedure Button1Click( Sender : TObject );
+ procedure Button2Click( Sender : TObject );
+ procedure Button3Click( Sender : TObject );
+ private
+ { Private declarations }
+ public
+ { Public declarations }
+ end;
+
+var
+ Form1 : TForm1;
+
+implementation
+
+{$IFDEF WIN32}
+{$R *.dfm}
+{$ENDIF}
+
+{$IFDEF UNIX}
+{$R *.xfm}
+{$ENDIF}
+
+procedure TForm1.Button1Click( Sender : TObject );
+begin
+ with OpenDialog do
+ begin
+ if Execute then
+ begin
+ SDLMPEGPanel.MPEGFile := FileName;
+ SDLMPEGPanel.Sound := CheckBox1.Checked;
+ SDLMPEGPanel.Play;
+ end;
+ end;
+end;
+
+procedure TForm1.Button2Click( Sender : TObject );
+begin
+ SDLMPEGPanel.Pause;
+end;
+
+procedure TForm1.Button3Click( Sender : TObject );
+begin
+ SDLMPEGPanel.Stop;
+end;
+
+end.
+
+ \ No newline at end of file
diff --git a/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/Main.xfm b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/Main.xfm
new file mode 100644
index 00000000..6b581787
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/Main.xfm
@@ -0,0 +1,106 @@
+object Form1: TForm1
+ Left = 377
+ Top = 273
+ Width = 351
+ Height = 308
+ VertScrollBar.Range = 44
+ ActiveControl = Button1
+ AutoScroll = False
+ Caption = 'The Tube'
+ Color = clBackground
+ Font.Color = clText
+ Font.Height = 11
+ Font.Name = 'MS Sans Serif'
+ Font.Pitch = fpVariable
+ Font.Style = []
+ ParentFont = False
+ Position = poScreenCenter
+ PixelsPerInch = 96
+ TextHeight = 18
+ TextWidth = 5
+ object Panel1: TPanel
+ Left = 0
+ Top = 264
+ Width = 351
+ Height = 44
+ Align = alBottom
+ TabOrder = 0
+ object Panel2: TPanel
+ Left = 1
+ Top = 1
+ Width = 282
+ Height = 42
+ Align = alClient
+ BevelOuter = bvNone
+ TabOrder = 0
+ object Button1: TButton
+ Left = 5
+ Top = 21
+ Width = 48
+ Height = 16
+ Caption = 'Play'
+ TabOrder = 0
+ OnClick = Button1Click
+ end
+ object Button2: TButton
+ Left = 57
+ Top = 21
+ Width = 48
+ Height = 16
+ Caption = 'Pause'
+ TabOrder = 1
+ OnClick = Button2Click
+ end
+ object Button3: TButton
+ Left = 109
+ Top = 21
+ Width = 48
+ Height = 16
+ Caption = 'Stop'
+ TabOrder = 2
+ OnClick = Button3Click
+ end
+ object CheckBox1: TCheckBox
+ Left = 5
+ Top = 0
+ Width = 65
+ Height = 20
+ Caption = 'Sound'
+ Checked = True
+ State = cbChecked
+ TabOrder = 3
+ end
+ end
+ object Panel3: TPanel
+ Left = 283
+ Top = 1
+ Width = 67
+ Height = 42
+ Align = alRight
+ Anchors = [akLeft, akTop, akRight, akBottom]
+ BevelOuter = bvNone
+ TabOrder = 1
+ end
+ end
+ object SDLMPEGPanel: TSDLMPEGPanel
+ Left = 0
+ Top = 0
+ Width = 351
+ Height = 264
+ Align = alClient
+ BevelInner = bvRaised
+ BevelOuter = bvLowered
+ Caption = 'You Movie should play here...'
+ TabOrder = 1
+ Sound = False
+ end
+ object OpenDialog: TOpenDialog
+ Filter = 'MPEGs|*.mpeg;*.mpg|All Files|*.*'
+ FilterIndex = 0
+ Height = 0
+ Title = 'Open'
+ Width = 0
+ Left = 40
+ Top = 32
+ end
+end
diff --git a/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/README.1ST b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/README.1ST
new file mode 100644
index 00000000..07e09117
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/README.1ST
@@ -0,0 +1,21 @@
+0. This demo app makes use of SDL Beta 4 from the JEDI group.
+ Their full library is on this companion CD as well.
+
+1. You need to install libSDL-1.2 - www.libsdl.org if it is not already
+ installed on your system
+
+2. You need to install smpeg 0.4.4 - www.lokigames.com if it is not already
+ installed on your system.
+ Once smpeg is installed, navigate to your /usr/lib/ directory via a commandline and
+ create a symbolic link from libsmpeg-0.4.so.0 to libsmpeg.so. This is done
+ with the following command ( assuming you are in /usr/lib/ )...
+ ln -s libsmpeg-0.4.so.0 libsmpeg.so
+
+
+3. Then compile using:
+ dcc video60.dpk - Kylix or D6, video40.dpk - D4, video50 - D5
+ dcc MPEGPlay.dpr
+
+4. Run the app and play some MPEGs.
+
+
diff --git a/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/sdlmpegpanel.pas b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/sdlmpegpanel.pas
new file mode 100644
index 00000000..6e7e87de
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/sdlmpegpanel.pas
@@ -0,0 +1,149 @@
+unit sdlmpegpanel;
+
+interface
+
+{$IFDEF UNIX}
+{$DEFINE CLX}
+{$ELSE}
+{$DEFINE VCL}
+{$ENDIF}
+
+uses
+ SysUtils,
+ Classes,
+{$IFDEF VCL}
+ Graphics,
+ Controls,
+ Forms,
+ Dialogs,
+ ExtCtrls,
+{$ENDIF}
+{$IFDEF CLX}
+ Types,
+ QGraphics,
+ QControls,
+ QForms,
+ QDialogs,
+ QExtCtrls,
+{$ENDIF}
+ sdl,
+ smpeg;
+
+type
+ TSDLMPEGPanel = class( TPanel )
+ private
+ { Private declarations }
+ FSurface : PSDL_Surface;
+ FSMPEGHandle : PSMPEG;
+ FMPEGFile : TFileName;
+ FMPEGInfo : TSMPEG_Info;
+ FPlaying : Boolean;
+ FSound : Integer;
+ function GetSound : Boolean;
+ procedure SetSound( const Value : Boolean );
+ protected
+ { Protected declarations }
+ public
+ { Public declarations }
+ procedure Play;
+ procedure Stop;
+ procedure Pause;
+ published
+ { Published declarations }
+ property MPEGFile : TFileName read FMPEGFile write FMPEGFile;
+ property Sound : Boolean read GetSound write SetSound;
+ end;
+
+procedure Register;
+
+implementation
+
+{$IFDEF CLX}
+uses
+ Libc,
+ Qt;
+{$ENDIF}
+
+procedure TSDLMPEGPanel.Play;
+var
+ EnvVal : string;
+begin
+ if FPlaying then
+ Exit;
+ FPlaying := True;
+
+ if SDL_getenv( 'SDL_WINDOWID' ) = '' then
+ begin
+ {$IFDEF VCL}
+ SDL_putenv( 'SDL_VIDEODRIVER=windib' );
+ EnvVal := 'SDL_WINDOWID=' + inttostr( Integer( Handle ) );
+ {$ENDIF}
+
+ {$IFDEF CLX}
+ EnvVal := 'SDL_WINDOWID=' + inttostr( QWidget_WinId( ChildHandle ) );
+ {$ENDIF}
+
+ SDL_putenv( PChar( EnvVal ) );
+ end;
+
+ if SDL_getenv( 'SDL_VIDEO_YUV_HWACCEL' ) = '' then
+ SDL_putenv( 'SDL_VIDEO_YUV_HWACCEL=0' );
+
+ if SDL_Init( SDL_INIT_VIDEO or SDL_INIT_NOPARACHUTE ) < 0 then
+ raise Exception.Create( 'SDL_Init failed' );
+ {$IFDEF VCL}
+ FSurface := SDL_SetVideoMode( Width, Height, 16, SDL_SWSURFACE );
+ {$ENDIF}
+ {$IFDEF CLX}
+ FSurface := SDL_SetVideoMode( Width, Height, QPixmap_depth( Bitmap.Handle ), SDL_SWSURFACE );
+ {$ENDIF}
+ if FSurface = nil then
+ raise Exception.Create( 'SDL_SetVideoMode failed' );
+
+ FSMPEGHandle := SMPEG_new( PChar( FMPEGFile ), @FMPEGInfo, FSound );
+ if FSMPEGHandle = nil then
+ raise Exception.Create( 'Cannot create MPEG stream' );
+
+ if FSound = 0 then
+ SMPEG_enableaudio( FSMPEGHandle, 0 );
+
+ SMPEG_scaleXY( FSMPEGHandle, Width, Height );
+ SMPEG_setdisplay( FSMPEGHandle, FSurface, nil, nil );
+
+ SMPEG_play( FSMPEGHandle );
+end;
+
+procedure TSDLMPEGPanel.Stop;
+begin
+ if not FPlaying then
+ Exit;
+ FPlaying := False;
+ SMPEG_stop( FSMPEGHandle );
+ SMPEG_delete( FSMPEGHandle );
+ SDL_Quit;
+end;
+
+procedure TSDLMPEGPanel.Pause;
+begin
+ if FPlaying then
+ SMPEG_pause( FSMPEGHandle );
+end;
+
+function TSDLMPEGPanel.GetSound : Boolean;
+begin
+ Result := Boolean( FSound );
+end;
+
+procedure TSDLMPEGPanel.SetSound( const Value : Boolean );
+begin
+ FSound := Integer( Value );
+end;
+
+procedure Register;
+begin
+ RegisterComponents( 'SDL', [ TSDLMPEGPanel ] );
+end;
+
+end.
+
+
diff --git a/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/video40.dpk b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/video40.dpk
new file mode 100644
index 00000000..5af28450
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/video40.dpk
@@ -0,0 +1,33 @@
+package video40;
+
+{$R *.RES}
+{$ALIGN ON}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $00400000}
+{$IMPLICITBUILD OFF}
+
+requires
+ Vcl40;
+
+contains
+ SDLMPEGPanel in 'SDLMPEGPanel.pas';
+
+end.
diff --git a/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/video50.dpk b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/video50.dpk
new file mode 100644
index 00000000..9c5612e4
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/video50.dpk
@@ -0,0 +1,33 @@
+package video50;
+
+{$R *.RES}
+{$ALIGN ON}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$IMPLICITBUILD OFF}
+
+requires
+ Vcl50;
+
+contains
+ SDLMPEGPanel in 'SDLMPEGPanel.pas';
+
+end.
diff --git a/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/video60.dpk b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/video60.dpk
new file mode 100644
index 00000000..9af38841
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/MpegPlayer/video60.dpk
@@ -0,0 +1,35 @@
+package video60;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$IMPLICITBUILD OFF}
+requires
+ rtl,
+ visualclx;
+
+contains
+ SDLMPEGPanel in 'SDLMPEGPanel.pas';
+
+
+
+end. \ No newline at end of file
diff --git a/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/SMpegPlayer/SMpegPlayer.cfg b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/SMpegPlayer/SMpegPlayer.cfg
new file mode 100644
index 00000000..9d13f677
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/SMpegPlayer/SMpegPlayer.cfg
@@ -0,0 +1,38 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-LE"c:\program files\borland\delphi7\Projects\Bpl"
+-LN"c:\program files\borland\delphi7\Projects\Bpl"
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/SMpegPlayer/SMpegPlayer.dof b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/SMpegPlayer/SMpegPlayer.dof
new file mode 100644
index 00000000..96b3fada
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/SMpegPlayer/SMpegPlayer.dof
@@ -0,0 +1,136 @@
+[FileVersion]
+Version=7.0
+[Compiler]
+A=8
+B=0
+C=1
+D=1
+E=0
+F=0
+G=1
+H=1
+I=1
+J=0
+K=0
+L=1
+M=0
+N=1
+O=1
+P=1
+Q=0
+R=0
+S=0
+T=0
+U=0
+V=1
+W=0
+X=1
+Y=1
+Z=1
+ShowHints=1
+ShowWarnings=1
+UnitAliases=WinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+NamespacePrefix=
+SymbolDeprecated=1
+SymbolLibrary=1
+SymbolPlatform=1
+UnitLibrary=1
+UnitPlatform=1
+UnitDeprecated=1
+HResultCompat=1
+HidingMember=1
+HiddenVirtual=1
+Garbage=1
+BoundsError=1
+ZeroNilCompat=1
+StringConstTruncated=1
+ForLoopVarVarPar=1
+TypedConstVarPar=1
+AsgToTypedConst=1
+CaseLabelRange=1
+ForVariable=1
+ConstructingAbstract=1
+ComparisonFalse=1
+ComparisonTrue=1
+ComparingSignedUnsigned=1
+CombiningSignedUnsigned=1
+UnsupportedConstruct=1
+FileOpen=1
+FileOpenUnitSrc=1
+BadGlobalSymbol=1
+DuplicateConstructorDestructor=1
+InvalidDirective=1
+PackageNoLink=1
+PackageThreadVar=1
+ImplicitImport=1
+HPPEMITIgnored=1
+NoRetVal=1
+UseBeforeDef=1
+ForLoopVarUndef=1
+UnitNameMismatch=1
+NoCFGFileFound=1
+MessageDirective=1
+ImplicitVariants=1
+UnicodeToLocale=1
+LocaleToUnicode=1
+ImagebaseMultiple=1
+SuspiciousTypecast=1
+PrivatePropAccessor=1
+UnsafeType=0
+UnsafeCode=0
+UnsafeCast=0
+[Linker]
+MapFile=0
+OutputObjs=0
+ConsoleApp=1
+DebugInfo=0
+RemoteSymbols=0
+MinStackSize=16384
+MaxStackSize=1048576
+ImageBase=4194304
+ExeDescription=
+[Directories]
+OutputDir=
+UnitOutputDir=
+PackageDLLOutputDir=
+PackageDCPOutputDir=
+SearchPath=
+Packages=
+Conditionals=
+DebugSourceDirs=
+UsePackages=0
+[Parameters]
+RunParams=
+HostApplication=
+Launcher=
+UseLauncher=0
+DebugCWD=
+[Language]
+ActiveLang=
+ProjectLang=
+RootDir=
+[Version Info]
+IncludeVerInfo=0
+AutoIncBuild=0
+MajorVer=1
+MinorVer=0
+Release=0
+Build=0
+Debug=0
+PreRelease=0
+Special=0
+Private=0
+DLL=0
+Locale=2057
+CodePage=1252
+[Version Info Keys]
+CompanyName=
+FileDescription=
+FileVersion=1.0.0.0
+InternalName=
+LegalCopyright=
+LegalTrademarks=
+OriginalFilename=
+ProductName=
+ProductVersion=1.0.0.0
+Comments=
diff --git a/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/SMpegPlayer/SMpegPlayer.dpr b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/SMpegPlayer/SMpegPlayer.dpr
new file mode 100644
index 00000000..c88c0eb6
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Demos/SMpegPlayer/SMpegPlayer.dpr
@@ -0,0 +1,278 @@
+program SMpegPlayer;
+{******************************************************************}
+{ }
+{ Object Pascal Example of using smpeg and SDL_Mixer }
+{ Conversion of Console Smpeg player }
+{ }
+{ }
+{ The original files are : Found on internet }
+{ }
+{ The original Pascal code is : SMpegPlayer.dpr }
+{ The initial developer of the Pascal code is : }
+{ Dominique Louis <Dominique@SavageSoftware.com.au> }
+{ }
+{ Portions created by Dominique Louis are }
+{ Copyright (C) 2001 Dominique Louis. }
+{ }
+{ Contributor(s) }
+{ -------------- }
+{ }
+{ }
+{ Obtained through: }
+{ Joint Endeavour of Delphi Innovators ( Project JEDI ) }
+{ }
+{ You may retrieve the latest version of this file at the Project }
+{ JEDI home page, located at http://delphi-jedi.org }
+{ }
+{ The contents of this file are used with permission, subject to }
+{ the Mozilla Public License Version 1.1 (the "License"); you may }
+{ not use this file except in compliance with the License. You may }
+{ obtain a copy of the License at }
+{ http://www.mozilla.org/NPL/NPL-1_1Final.html }
+{ }
+{ Software distributed under the License is distributed on an }
+{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
+{ implied. See the License for the specific language governing }
+{ rights and limitations under the License. }
+{ }
+{ Description }
+{ ----------- }
+{ SMpegPlayer : Shows how to load and play an Mpeg file using }
+{ smpeg and SDL_Mixer for the sound }
+{ }
+{ Requires }
+{ -------- }
+{ SDL runtime libary for SDL, smpeg and OpenGL somewhere }
+{ in your path . }
+{ The Latest SDL runtimes can be found on http://www.libsdl.org }
+{ }
+{ Programming Notes }
+{ ----------------- }
+{ This demo shows how to load and play an mpeg file using smpeg }
+{ with SDL_Mixer }
+{ You will need Smpeg and SDL_Mixer libraris order for this demo }
+{ }
+{ Revision History }
+{ ---------------- }
+{ July 02 2001 - DL : Initial translation. }
+{ }
+{ November 23 2002 - DL : Fix PollMPeg as suggested by }
+{ }
+{ }
+{******************************************************************}
+
+uses
+ SysUtils,
+ sdl,
+ sdl_mixer,
+ smpeg;
+
+const
+ SCREEN_WIDTH = 800;
+ SCREEN_HEIGHT = 600;
+ BPP = 0;
+
+ TITLE = 'JEDI-SDL Console MpegPlayer';
+
+var
+ // Screen Surface
+ screen : PSDL_Surface;
+
+ // Audio Specs
+ aspec : TSDL_AudioSpec;
+ format : Uint16;
+ freq, chan : integer;
+ Islooping : Boolean;
+
+function OpenMpeg( FileName : string ) : PSMPEG;
+var
+ Handle : PSMPEG;
+begin
+ // Create a new Mpeg
+ handle := SMPEG_new( PChar( fileName ), nil, 0 );
+ if handle = nil then
+ begin
+ //Display Error
+ Halt;
+ end;
+
+ // Disable Audio
+ SMPEG_enableaudio( handle, 0 );
+
+ // Query Mixer
+ Mix_QuerySpec( freq, format, chan );
+ aspec.freq := freq;
+ aspec.format := format;
+ aspec.channels := chan;
+
+ // Tell Smpeg what we want
+ Smpeg_actualSpec( handle, @aspec );
+
+ // Hook the mixer audio playing function
+ Mix_HookMusic( @SMPeg_PlayAudioSDL, handle );
+
+ // Reenable Audio
+ SMPEG_enableaudio( handle, 1 );
+
+ // Set Max Volume
+ SMPEG_setvolume( handle, 100 );
+
+ //Set up a video surface to display MPeg in
+ SMPEG_setdisplay( Handle, Screen, nil, nil );
+
+ // Reenable Video
+ SMPEG_enablevideo( handle, 1 );
+
+ // Retuen the handle in case we need it somewhere else
+ Result := handle;
+end;
+
+// Free Mpeg
+
+procedure FreeMPeg( handle : PSMPEG );
+begin
+ SMPEG_delete( handle );
+end;
+
+// Loop Mpeg
+
+procedure LoopMpeg( handle : PSMPEG );
+begin
+ if IsLooping then
+ begin
+ SMPEG_loop( handle, 1 );
+ isLooping := true;
+ end
+ else
+ begin
+ SMPEG_loop( handle, 0 );
+ isLooping := false;
+ end;
+end;
+
+// Play Mpeg
+
+procedure PlayMpeg( handle : PSMPEG );
+begin
+ SMpeg_play( handle );
+end;
+
+// Stop Mpeg
+
+procedure StopMpeg( handle : PSMPEG );
+begin
+ SMpeg_stop( handle );
+end;
+
+function PollMPeg( handle : PSMPEG ) : TSMpegStatus;
+begin
+ Result := SMPEG_status( handle );
+end;
+
+function WaitMpeg( interval : Uint32; param : pointer ) : Uint32;
+var
+ e : TSDL_Event;
+ handle : PSMPEG;
+begin
+ handle := PSMPEG( param );
+
+ // Has it stopped? If so, throw a User Event
+ if PollMPeg( handle ) = STATUS_SMPEG_STOPPED then
+ begin
+ e.type_ := SDL_USEREVENT;
+ e.user.code := 1;
+ e.user.data1 := nil;
+ e.user.data2 := nil;
+ SDL_PushEvent( @e );
+ end;
+
+ result := interval;
+end;
+
+procedure RunIntro( fileName : string );
+var
+ e : TSDL_Event;
+ handle : PSMPEG;
+ td : PSDL_TimerID;
+ done : Boolean;
+begin
+ done := false;
+ // Create a Movie
+ handle := OpenMpeg( fileName );
+
+ // Play the Movie
+ PlayMPeg( Handle );
+
+ // Create a timer to see if the Movie has stopped
+ td := SDL_AddTimer( 1000, @WaitMPeg, handle );
+
+ // wait for Movie to finish
+ while not done do
+ begin
+ // wiat for out event to happen
+ SDL_WaitEvent( @e );
+ case e.type_ of
+ // Check to see if user want to skip the movie
+ SDL_KEYDOWN :
+ begin
+ if e.key.keysym.sym = SDLK_ESCAPE then
+ Done := true;
+ end;
+
+ SDL_USEREVENT :
+ begin
+ if PollMpeg( handle ) = STATUS_SMPEG_STOPPED then
+ Done := true;
+ end
+
+ end;
+ end;
+
+ // Stop the movie
+ StopMpeg( handle );
+
+ // Remove WaitMpegTimer
+ SDL_RemoveTimer( td );
+
+ // Unhook mixer audio playback function
+ Mix_HookMusic( nil, nil );
+
+ // Free out MPEG
+ FreeMPeg( handle );
+end;
+
+begin
+ // Make sure we at least have a parameter
+ if ParamCount <> 1 then
+ begin
+ Halt( 1 );
+ end;
+
+ // Initialize SDL
+ if SDL_Init( SDL_INIT_VIDEO or SDL_INIT_AUDIO or SDL_INIT_TIMER ) < 0 then
+ begin
+ // Display and error
+ Halt( 1 );
+ end;
+
+ // Open the Mixer before SDL_SetVideo to avoid the poping sound
+ Mix_OpenAudio( 22050, AUDIO_S16, 2, 1024 );
+
+ SDL_WM_SetCaption( TITLE, nil );
+
+ // Set the video Mode
+ screen := SDL_SetVideoMode( SCREEN_WIDTH, SCREEN_HEIGHT, BPP, SDL_DOUBLEBUF or
+ SDL_ANYFORMAT );
+ if screen = nil then
+ begin
+ // Display and error
+ Halt( 1 );
+ end;
+
+ RunIntro( ParamStr( 1 ) );
+
+ Mix_CloseAudio;
+
+ SDL_Quit;
+end.
+
diff --git a/Game/Code/lib/JEDI-SDLv1.0/smpeg/Pas/smpeg.pas b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Pas/smpeg.pas
new file mode 100644
index 00000000..c32c1904
--- /dev/null
+++ b/Game/Code/lib/JEDI-SDLv1.0/smpeg/Pas/smpeg.pas
@@ -0,0 +1,465 @@
+unit smpeg;
+{******************************************************************************}
+{
+ $Id: smpeg.pas,v 1.12 2007/12/05 22:54:30 savage Exp $
+
+}
+{ }
+{ Borland Delphi SMPEG - SDL MPEG Player Library }
+{ Conversion of the SMPEG - SDL MPEG Player Library }
+{ }
+{ Portions created by Sam Lantinga <slouken@devolution.com> are }
+{ Copyright (C) 1997, 1998, 1999, 2000, 2001 Sam Lantinga }
+{ 5635-34 Springhouse Dr. }
+{ Pleasanton, CA 94588 (USA) }
+{ }
+{ All Rights Reserved. }
+{ }
+{ The original files are : smpeg.h }
+{ }
+{ The initial developer of this Pascal code was : }
+{ Matthias Thoma <ma.thoma@gmx.de> }
+{ }
+{ Portions created by Matthias Thoma are }
+{ Copyright (C) 2000 - 2001 Matthias Thoma. }
+{ }
+{ }
+{ Contributor(s) }
+{ -------------- }
+{ Tom Jones <tigertomjones@gmx.de> His Project inspired this conversion }
+{ Matthias Thoma <ma.thoma@gmx.de> }
+{ }
+{ Obtained through: }
+{ Joint Endeavour of Delphi Innovators ( Project JEDI ) }
+{ }
+{ You may retrieve the latest version of this file at the Project }
+{ JEDI home page, located at http://delphi-jedi.org }
+{ }
+{ The contents of this file are used with permission, subject to }
+{ the Mozilla Public License Version 1.1 (the "License"); you may }
+{ not use this file except in compliance with the License. You may }
+{ obtain a copy of the License at }
+{ http://www.mozilla.org/MPL/MPL-1.1.html }
+{ }
+{ Software distributed under the License is distributed on an }
+{ "AS IS" basis, WITHOUT WARRANTY OF ANY KIND, either express or }
+{ implied. See the License for the specific language governing }
+{ rights and limitations under the License. }
+{ }
+{ Description }
+{ ----------- }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ }
+{ Requires }
+{ -------- }
+{ The SDL Runtime libraris on Win32 : SDL.dll on Linux : libSDL-1.2.so.0 }
+{ They are available from... }
+{ http://www.libsdl.org . }
+{ }
+{ Programming Notes }
+{ ----------------- }
+{ }
+{ }
+{ }
+{ }
+{ Revision History }
+{ ---------------- }
+{ May 08 2001 - MT : Initial conversion }
+{ }
+{ October 12 2001 - DA : Various changes as suggested by David Acklam }
+{ }
+{ April 03 2003 - DL : Added jedi-sdl.inc include file to support more }
+{ Pascal compilers. Initial support is now included }
+{ for GnuPascal, VirtualPascal, TMT and obviously }
+{ continue support for Delphi Kylix and FreePascal. }
+{ }
+{ April 08 2003 - MK : Aka Mr Kroket - Added Better FPC support }
+{ Fixed all invalid calls to DLL. }
+{ Changed constant names to: }
+{ const }
+{ STATUS_SMPEG_ERROR = -1; }
+{ STATUS_SMPEG_STOPPED = 0; }
+{ STATUS_SMPEG_PLAYING = 1; }
+{ because SMPEG_ERROR is a function (_SMPEG_error }
+{ isn't correct), and cannot be two elements with the }
+{ same name }
+{ }
+{ April 24 2003 - DL : under instruction from Alexey Barkovoy, I have added}
+{ better TMT Pascal support and under instruction }
+{ from Prof. Abimbola Olowofoyeku (The African Chief),}
+{ I have added better Gnu Pascal support }
+{ }
+{ April 30 2003 - DL : under instruction from David Mears AKA }
+{ Jason Siletto, I have added FPC Linux support. }
+{ This was compiled with fpc 1.1, so remember to set }
+{ include file path. ie. -Fi/usr/share/fpcsrc/rtl/* }
+{ }
+{
+ $Log: smpeg.pas,v $
+ Revision 1.12 2007/12/05 22:54:30 savage
+ Better Mac OS X support for Frameworks.
+
+ Revision 1.11 2007/05/20 20:32:45 savage
+ Initial Changes to Handle 64 Bits
+
+ Revision 1.10 2005/04/10 11:48:33 savage
+ Changes as suggested by Michalis, thanks.
+
+ Revision 1.9 2005/01/05 01:47:15 savage
+ Changed LibName to reflect what MacOS X should have. ie libSDL*-1.2.0.dylib respectively.
+
+ Revision 1.8 2005/01/04 23:14:59 savage
+ Changed LibName to reflect what most Linux distros will have. ie libSDL*-1.2.so.0 respectively.
+
+ Revision 1.7 2004/08/14 22:54:30 savage
+ Updated so that Library name defines are correctly defined for MacOS X.
+
+ Revision 1.6 2004/05/10 14:10:04 savage
+ Initial MacOS X support. Fixed defines for MACOS ( Classic ) and DARWIN ( MacOS X ).
+
+ Revision 1.5 2004/04/13 09:32:08 savage
+ Changed Shared object names back to just the .so extension to avoid conflicts on various Linux/Unix distros. Therefore developers will need to create Symbolic links to the actual Share Objects if necessary.
+
+ Revision 1.4 2004/04/02 10:40:55 savage
+ Changed Linux Shared Object name so they reflect the Symbolic Links that are created when installing the RPMs from the SDL site.
+
+ Revision 1.3 2004/03/31 22:20:02 savage
+ Windows unit not used in this file, so it was removed to keep the code tidy.
+
+ Revision 1.2 2004/03/30 20:23:28 savage
+ Tidied up use of UNIX compiler directive.
+
+ Revision 1.1 2004/02/14 23:35:42 savage
+ version 1 of sdl_image, sdl_mixer and smpeg.
+
+
+}
+{******************************************************************************}
+
+{$I jedi-sdl.inc}
+
+// Linux and Windows C-Compilers use different byte-allignment
+{$IFDEF UNIX}
+ {$ALIGN 4} // Linux uses DWORD alignment
+{$ENDIF}
+{$IFDEF WINDOWS}
+ {$IFDEF VER140}
+ {$ALIGN 8} // Windows uses Quad-Word alignment
+ {$ENDIF}
+{$ENDIF}
+
+interface
+
+uses
+{$IFDEF __GPC__}
+ gpc,
+{$ENDIF}
+
+ sdl;
+
+const
+{$IFDEF WINDOWS}
+ SmpegLibName = 'smpeg.dll';
+{$ENDIF}
+
+{$IFDEF UNIX}
+{$IFDEF DARWIN}
+ SmpegLibName = 'libsmpeg-0.4.0.dylib';
+{$ELSE}
+ {$IFDEF FPC}
+ SmpegLibName = 'libsmpeg.so';
+ {$ELSE}
+ SmpegLibName = 'libsmpeg-0.4.so.0';
+ {$ENDIF}
+{$ENDIF}
+{$ENDIF}
+
+{$IFDEF MACOS}
+ SmpegLibName = 'smpeg';
+ {$linklib libsmpeg}
+{$ENDIF}
+
+//------------------------------------------------------------------------------
+// MPEGFilter.h
+//------------------------------------------------------------------------------
+{ SMPEG filter info flags }
+const
+ SMPEG_FILTER_INFO_MB_ERROR = 1;
+ SMPEG_FILTER_INFO_PIXEL_ERROR = 2;
+
+{ Filter info from SMPEG }
+type
+ SMPEG_FilterInfo = record
+ yuv_mb_square_error: PUint16;
+ yuv_pixel_square_error: PUint16;
+ end;
+ TSMPEG_FilterInfo = SMPEG_FilterInfo;
+ PSMPEG_FilterInfo = ^SMPEG_FilterInfo;
+
+{ MPEG filter definition }
+ PSMPEG_Filter = ^TSMPEG_Filter;
+
+{ Callback functions for the filter }
+ {$IFNDEF __GPC__}
+ TSMPEG_FilterCallback = function( dest, source: PSDL_Overlay; region: PSDL_Rect; filter_info: PSMPEG_FilterInfo; data: Pointer ): Pointer; cdecl;
+ {$ELSE}
+ TSMPEG_FilterCallback = function( dest, source: PSDL_Overlay; region: PSDL_Rect; filter_info: PSMPEG_FilterInfo; data: Pointer ): Pointer;
+ {$ENDIF}
+
+ {$IFNDEF __GPC__}
+ TSMPEG_FilterDestroy = function( Filter: PSMPEG_Filter ): Pointer; cdecl;
+ {$ELSE}
+ TSMPEG_FilterDestroy = function( Filter: PSMPEG_Filter ): Pointer;
+ {$ENDIF}
+
+{ The filter definition itself }
+ TSMPEG_Filter = record
+ flags: Uint32;
+ data: Pointer;
+ callback: TSMPEG_FilterCallback;
+ destroy: TSMPEG_FilterDestroy;
+ end;
+
+{ The null filter (default). It simply copies the source rectangle to the video overlay. }
+function SMPEGfilter_null: PSMPEG_Filter;
+cdecl; external {$IFDEF __GPC__}name 'SMPEGfilter_null'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ The bilinear filter. A basic low-pass filter that will produce a smoother image. }
+function SMPEGfilter_bilinear: PSMPEG_Filter;
+cdecl; external {$IFDEF __GPC__}name 'SMPEGfilter_bilinear'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ The deblocking filter. It filters block borders and non-intra coded blocks to reduce blockiness }
+function SMPEGfilter_deblocking: PSMPEG_Filter;
+cdecl; external {$IFDEF __GPC__}name 'SMPEGfilter_deblocking'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+//------------------------------------------------------------------------------
+// SMPEG.h
+//------------------------------------------------------------------------------
+const
+ SMPEG_MAJOR_VERSION = 0;
+ SMPEG_MINOR_VERSION = 4;
+ SMPEG_PATCHLEVEL = 2;
+
+type
+ SMPEG_version = record
+ major: UInt8;
+ minor: UInt8;
+ patch: UInt8;
+ end;
+ TSMPEG_version = SMPEG_version;
+ PSMPEG_version = ^TSMPEG_version;
+
+ // This is the actual SMPEG object
+ _SMPEG = record
+ //obj: PMPEG;
+ end;
+ TSMPEG = _SMPEG;
+ PSMPEG = ^_SMPEG;
+
+ { Used to get information about the SMPEG object }
+ __SMPEG_Info = record
+ has_audio: Integer;
+ has_video: Integer;
+ width: Integer;
+ height: Integer;
+ current_frame: Integer;
+ current_fps: double;
+ audio_string: array[0..79] of char;
+ audio_current_frame: Integer;
+ current_offset: UInt32;
+ total_size: UInt32;
+ current_time: double;
+ total_time: double;
+ end;
+ _SMPEG_Info = __SMPEG_Info;
+ SMPEG_Info = _SMPEG_Info;
+ TSMPEG_Info = _SMPEG_Info;
+ PSMPEG_Info = ^_SMPEG_Info;
+
+{ Possible MPEG status codes }
+const
+ STATUS_SMPEG_ERROR = -1;
+ STATUS_SMPEG_STOPPED = 0;
+ STATUS_SMPEG_PLAYING = 1;
+
+type
+ SMPEGstatus = Integer;
+ TSMPEGstatus = Integer;
+ PSMPEGstatus = ^Integer;
+
+ { Matches the declaration of SDL_UpdateRect() }
+ {$IFNDEF __GPC__}
+ TSMPEG_DisplayCallback = function( dst: PSDL_Surface; x, y: Integer; w, h: Cardinal ): Pointer; cdecl;
+ {$ELSE}
+ TSMPEG_DisplayCallback = function( dst: PSDL_Surface; x, y: Integer; w, h: Cardinal ): Pointer;
+ {$ENDIF}
+
+
+{ Create a new SMPEG object from an MPEG file.
+ On return, if 'info' is not NULL, it will be filled with information
+ about the MPEG object.
+ This function returns a new SMPEG object. Use SMPEG_error() to find out
+ whether or not there was a problem building the MPEG stream.
+ The sdl_audio parameter indicates if SMPEG should initialize the SDL audio
+ subsystem. If not, you will have to use the SMPEG_playaudio() function below
+ to extract the decoded data. }
+function SMPEG_new(const _file: PChar; info: PSMPEG_Info; sdl_audio: Integer): PSMPEG;
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_new'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ The same as above for a file descriptor }
+function SMPEG_new_descr(_file: Integer; info: PSMPEG_Info; sdl_audio: Integer): PSMPEG;
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_new_descr'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ The same as above but for a raw chunk of data. SMPEG makes a copy of the
+ data, so the application is free to delete after a successful call to this
+ function. }
+function SMPEG_new_data(data: Pointer; size: Integer; info: PSMPEG_Info; sdl_audio: Integer): PSMPEG;
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_new_data'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Get current information about an SMPEG object }
+procedure SMPEG_getinfo(mpeg: PSMPEG; info: PSMPEG_Info);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_getinfo'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+//procedure SMPEG_getinfo(mpeg: PSMPEG; info: Pointer);
+//cdecl; external {$IFDEF __GPC__}name 'SMPEG_getinfo'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+{ Enable or disable audio playback in MPEG stream }
+procedure SMPEG_enableaudio(mpeg: PSMPEG; enable: Integer);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_enableaudio'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Enable or disable video playback in MPEG stream }
+procedure SMPEG_enablevideo(mpeg: PSMPEG; enable: Integer);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_enablevideo'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Delete an SMPEG object }
+procedure SMPEG_delete(mpeg: PSMPEG);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_delete'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Get the current status of an SMPEG object }
+function SMPEG_status(mpeg: PSMPEG): TSMPEGstatus;
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_status'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+ // status
+{ Set the audio volume of an MPEG stream, in the range 0-100 }
+procedure SMPEG_setvolume(mpeg: PSMPEG; volume: Integer);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_setvolume'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Set the destination surface for MPEG video playback
+ 'surfLock' is a mutex used to synchronize access to 'dst', and can be NULL.
+ 'callback' is a function called when an area of 'dst' needs to be updated.
+ If 'callback' is NULL, the default function (SDL_UpdateRect) will be used. }
+procedure SMPEG_setdisplay(mpeg: PSMPEG; dst: PSDL_Surface; surfLock: PSDL_mutex; callback: TSMPEG_DisplayCallback);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_setdisplay'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Set or clear looping play on an SMPEG object }
+procedure SMPEG_loop(mpeg: PSMPEG; _repeat: Integer);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_loop'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Scale pixel display on an SMPEG object }
+procedure SMPEG_scaleXY(mpeg: PSMPEG; width, height: Integer);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_scaleXY'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+procedure SMPEG_scale(mpeg: PSMPEG; scale: Integer);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_scale'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+procedure SMPEG_Double(mpeg : PSMPEG; doubleit : Boolean );
+
+{ Move the video display area within the destination surface }
+procedure SMPEG_move(mpeg: PSMPEG; x, y: Integer);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_move'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Set the region of the video to be shown }
+procedure SMPEG_setdisplayregion(mpeg: PSMPEG; x, y, w, h: Integer);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_setdisplayregion'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Play an SMPEG object }
+procedure SMPEG_play(mpeg: PSMPEG);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_play'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Pause/Resume playback of an SMPEG object}
+procedure SMPEG_pause(mpeg: PSMPEG);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_pause'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Stop playback of an SMPEG object }
+procedure SMPEG_stop(mpeg: PSMPEG);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_stop'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Rewind the play position of an SMPEG object to the beginning of the MPEG }
+procedure SMPEG_rewind(mpeg: PSMPEG);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_rewind'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Seek 'bytes' bytes in the MPEG stream }
+procedure SMPEG_seek(mpeg: PSMPEG; bytes: Integer);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_seek'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Skip 'seconds' seconds in the MPEG stream }
+procedure SMPEG_skip(mpeg: PSMPEG; seconds: single);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_skip'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Render a particular frame in the MPEG video
+ API CHANGE: This function no longer takes a target surface and position.
+ Use SMPEG_setdisplay() and SMPEG_move() to set this information. }
+procedure SMPEG_renderFrame(mpeg: PSMPEG; framenum: Integer);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_renderFrame'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Render the last frame of an MPEG video }
+procedure SMPEG_renderFinal(mpeg: PSMPEG; dst: PSDL_Surface; x, y: Integer);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_renderFinal'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Set video filter }
+function SMPEG_filter(mpeg: PSMPEG; filter: PSMPEG_Filter): PSMPEG_Filter;
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_filter'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Return NULL if there is no error in the MPEG stream, or an error message
+ if there was a fatal error in the MPEG stream for the SMPEG object. }
+function SMPEG_error(mpeg: PSMPEG): PChar;
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_error'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Exported callback function for audio playback.
+ The function takes a buffer and the amount of data to fill, and returns
+ the amount of data in bytes that was actually written. This will be the
+ amount requested unless the MPEG audio has finished.
+}
+function SMPEG_playAudio(mpeg: PSMPEG; stream: PUInt8; len: Integer): Integer;
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_playAudio'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Wrapper for SMPEG_playAudio() that can be passed to SDL and SDL_mixer }
+procedure SMPEG_playAudioSDL(mpeg: Pointer; stream: PUInt8; len: Integer);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_playAudioSDL'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Get the best SDL audio spec for the audio stream }
+function SMPEG_wantedSpec(mpeg: PSMPEG; wanted: PSDL_AudioSpec): Integer;
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_wantedSpec'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ Inform SMPEG of the actual SDL audio spec used for sound playback }
+procedure SMPEG_actualSpec(mpeg: PSMPEG; spec: PSDL_AudioSpec);
+cdecl; external {$IFDEF __GPC__}name 'SMPEG_actualSpec'{$ELSE} SmpegLibName{$ENDIF __GPC__};
+
+{ This macro can be used to fill a version structure with the compile-time
+ version of the SDL library. }
+procedure SMPEG_GETVERSION( var X : TSMPEG_version );
+
+implementation
+
+{$IFDEF __GPC__}
+ {$L 'smpeg'} { link smpeg.dll.a or libsmpeg.so or libsmpeg.a }
+{$ENDIF}
+
+procedure SMPEG_double(mpeg : PSMPEG; doubleit : Boolean );
+begin
+ if doubleit then
+ SMPEG_scale( mpeg, 2 )
+ else
+ SMPEG_scale( mpeg, 1 );
+end;
+
+procedure SMPEG_GETVERSION( var X : TSMPEG_version );
+begin
+ X.major := SMPEG_MAJOR_VERSION;
+ X.minor := SMPEG_MINOR_VERSION;
+ X.patch := SMPEG_PATCHLEVEL;
+end;
+
+end.
diff --git a/Game/Code/lib/PngImage/Tpngimage.DPK b/Game/Code/lib/PngImage/Tpngimage.DPK
new file mode 100644
index 00000000..b9c395f4
--- /dev/null
+++ b/Game/Code/lib/PngImage/Tpngimage.DPK
@@ -0,0 +1,34 @@
+package Tpngimage;
+
+{$R *.res}
+{$ALIGN 8}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO ON}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST OFF}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$IMPLICITBUILD OFF}
+
+requires
+ rtl,
+ vcl;
+
+contains
+ pngimage in 'pngimage.pas';
+
+end.
diff --git a/Game/Code/lib/PngImage/Tpngimage.cfg b/Game/Code/lib/PngImage/Tpngimage.cfg
new file mode 100644
index 00000000..4a78a005
--- /dev/null
+++ b/Game/Code/lib/PngImage/Tpngimage.cfg
@@ -0,0 +1,40 @@
+-$A8
+-$B-
+-$C+
+-$D+
+-$E-
+-$F-
+-$G+
+-$H+
+-$I+
+-$J-
+-$K-
+-$L+
+-$M-
+-$N+
+-$O+
+-$P+
+-$Q-
+-$R-
+-$S-
+-$T-
+-$U-
+-$V+
+-$W-
+-$X+
+-$YD
+-$Z1
+-GD
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-LE"C:\Documents and Settings\Jay Binks\My Documents\Borland Studio Projects\Bpl"
+-LN"C:\Documents and Settings\Jay Binks\My Documents\Borland Studio Projects\Bpl"
+-Z
+-w-UNSAFE_TYPE
+-w-UNSAFE_CODE
+-w-UNSAFE_CAST
diff --git a/Game/Code/lib/PngImage/Tpngimage.drc b/Game/Code/lib/PngImage/Tpngimage.drc
new file mode 100644
index 00000000..52d3a522
--- /dev/null
+++ b/Game/Code/lib/PngImage/Tpngimage.drc
@@ -0,0 +1,62 @@
+/* VER180
+ Generated by the Borland Delphi Pascal Compiler
+ because -GD or --drc was supplied to the compiler.
+
+ This file contains compiler-generated resources that
+ were bound to the executable.
+ If this file is empty, then no compiler-generated
+ resources were bound to the produced executable.
+*/
+
+#define pnglang_EPNGNoImageDataText 65504
+#define pnglang_EPNGCannotChangeSizeText 65505
+#define pnglang_EPNGCannotAddChunkText 65506
+#define pnglang_EPNGCannotAddInvalidImageText 65507
+#define pnglang_EPNGCouldNotLoadResourceText 65508
+#define pnglang_EPNGOutMemoryText 65509
+#define pnglang_EPNGCannotChangeTransparentText 65510
+#define pnglang_EPNGHeaderNotPresentText 65511
+#define pnglang_EPngInvalidCRCText 65520
+#define pnglang_EPNGInvalidIHDRText 65521
+#define pnglang_EPNGMissingMultipleIDATText 65522
+#define pnglang_EPNGZLIBErrorText 65523
+#define pnglang_EPNGInvalidPaletteText 65524
+#define pnglang_EPNGInvalidFileHeaderText 65525
+#define pnglang_EPNGIHDRNotFirstText 65526
+#define pnglang_EPNGNotExistsText 65527
+#define pnglang_EPNGSizeExceedsText 65528
+#define pnglang_EPNGUnknownPalEntryText 65529
+#define pnglang_EPNGMissingPaletteText 65530
+#define pnglang_EPNGUnknownCriticalChunkText 65531
+#define pnglang_EPNGUnknownCompressionText 65532
+#define pnglang_EPNGUnknownInterlaceText 65533
+#define pnglang_EPNGCannotAssignChunkText 65534
+#define pnglang_EPNGUnexpectedEndText 65535
+STRINGTABLE
+BEGIN
+ pnglang_EPNGNoImageDataText, "This \"Portable Network Graphics\" image contains no data."
+ pnglang_EPNGCannotChangeSizeText, "The \"Portable Network Graphics\" image can not be resize by changing width and height properties. Try assigning the image from a bitmap."
+ pnglang_EPNGCannotAddChunkText, "The program tried to add a existent critical chunk to the current image which is not allowed."
+ pnglang_EPNGCannotAddInvalidImageText, "It's not allowed to add a new chunk because the current image is invalid."
+ pnglang_EPNGCouldNotLoadResourceText, "The png image could not be loaded from the resource ID."
+ pnglang_EPNGOutMemoryText, "Some operation could not be performed because the system is out of resources. Close some windows and try again."
+ pnglang_EPNGCannotChangeTransparentText, "Setting bit transparency color is not allowed for png images containing alpha value for each pixel (COLOR_RGBALPHA and COLOR_GRAYSCALEALPHA)"
+ pnglang_EPNGHeaderNotPresentText, "This operation is not valid because the current image contains no valid header."
+ pnglang_EPngInvalidCRCText, "This \"Portable Network Graphics\" image is not valid because it contains invalid pieces of data (crc error)"
+ pnglang_EPNGInvalidIHDRText, "The \"Portable Network Graphics\" image could not be loaded because one of its main piece of data (ihdr) might be corrupted"
+ pnglang_EPNGMissingMultipleIDATText, "This \"Portable Network Graphics\" image is invalid because it has missing image parts."
+ pnglang_EPNGZLIBErrorText, "Could not decompress the image because it contains invalid compressed data.\r\n Description: "
+ pnglang_EPNGInvalidPaletteText, "The \"Portable Network Graphics\" image contains an invalid palette."
+ pnglang_EPNGInvalidFileHeaderText, "The file being readed is not a valid \"Portable Network Graphics\" image because it contains an invalid header. This file may be corruped, try obtaining it again."
+ pnglang_EPNGIHDRNotFirstText, "This \"Portable Network Graphics\" image is not supported or it might be invalid.\r\n(IHDR chunk is not the first)"
+ pnglang_EPNGNotExistsText, "The png file could not be loaded because it does not exists."
+ pnglang_EPNGSizeExceedsText, "This \"Portable Network Graphics\" image is not supported because either it's width or height exceeds the maximum size, which is 65535 pixels length."
+ pnglang_EPNGUnknownPalEntryText, "There is no such palette entry."
+ pnglang_EPNGMissingPaletteText, "This \"Portable Network Graphics\" could not be loaded because it uses a color table which is missing."
+ pnglang_EPNGUnknownCriticalChunkText, "This \"Portable Network Graphics\" image contains an unknown critical part which could not be decoded."
+ pnglang_EPNGUnknownCompressionText, "This \"Portable Network Graphics\" image is encoded with an unknown compression scheme which could not be decoded."
+ pnglang_EPNGUnknownInterlaceText, "This \"Portable Network Graphics\" image uses an unknown interlace scheme which could not be decoded."
+ pnglang_EPNGCannotAssignChunkText, "The chunks must be compatible to be assigned."
+ pnglang_EPNGUnexpectedEndText, "This \"Portable Network Graphics\" image is invalid because the decoder found an unexpected end of the file."
+END
+
diff --git a/Game/Code/lib/PngImage/Tpngimage.res b/Game/Code/lib/PngImage/Tpngimage.res
new file mode 100644
index 00000000..aac9aa64
--- /dev/null
+++ b/Game/Code/lib/PngImage/Tpngimage.res
Binary files differ
diff --git a/Game/Code/lib/PngImage/Tpngimage.stat b/Game/Code/lib/PngImage/Tpngimage.stat
new file mode 100644
index 00000000..57f32789
--- /dev/null
+++ b/Game/Code/lib/PngImage/Tpngimage.stat
@@ -0,0 +1,10 @@
+[Stats]
+EditorSecs=3
+DesignerSecs=1
+InspectorSecs=1
+CompileSecs=1542
+OtherSecs=11
+StartTime=5/6/2004 7:36:05 PM
+RealKeys=0
+EffectiveKeys=0
+DebugSecs=1
diff --git a/Game/Code/lib/PngImage/lazarustest.lpi b/Game/Code/lib/PngImage/lazarustest.lpi
new file mode 100644
index 00000000..4dec8a9e
--- /dev/null
+++ b/Game/Code/lib/PngImage/lazarustest.lpi
@@ -0,0 +1,239 @@
+<?xml version="1.0"?>
+<CONFIG>
+ <ProjectOptions>
+ <PathDelim Value="\"/>
+ <Version Value="5"/>
+ <General>
+ <MainUnit Value="0"/>
+ <IconPath Value="./"/>
+ <TargetFileExt Value=".exe"/>
+ <ActiveEditorIndexAtStart Value="0"/>
+ </General>
+ <VersionInfo>
+ <ProjectVersion Value=""/>
+ <Language Value=""/>
+ <CharSet Value=""/>
+ </VersionInfo>
+ <PublishOptions>
+ <Version Value="2"/>
+ <IgnoreBinaries Value="False"/>
+ <IncludeFileFilter Value="*.(pas|pp|inc|lfm|lpr|lrs|lpi|lpk|sh|xml)"/>
+ <ExcludeFileFilter Value="*.(bak|ppu|ppw|o|so);*~;backup"/>
+ </PublishOptions>
+ <RunParams>
+ <local>
+ <FormatVersion Value="1"/>
+ <LaunchingApplication PathPlusParams="/usr/X11R6/bin/xterm -T 'Lazarus Run Output' -e $(LazarusDir)/tools/runwait.sh $(TargetCmdLine)"/>
+ </local>
+ </RunParams>
+ <Units Count="8">
+ <Unit0>
+ <Filename Value="lazarustest.lpr"/>
+ <IsPartOfProject Value="True"/>
+ <UnitName Value="lazarustest"/>
+ <CursorPos X="49" Y="11"/>
+ <TopLine Value="1"/>
+ <EditorIndex Value="0"/>
+ <UsageCount Value="23"/>
+ <Loaded Value="True"/>
+ </Unit0>
+ <Unit1>
+ <Filename Value="delphi\bass.pas"/>
+ <UnitName Value="Bass"/>
+ <CursorPos X="12" Y="539"/>
+ <TopLine Value="589"/>
+ <UsageCount Value="10"/>
+ </Unit1>
+ <Unit2>
+ <Filename Value="avformat.pas"/>
+ <UnitName Value="avformat"/>
+ <CursorPos X="38" Y="594"/>
+ <TopLine Value="567"/>
+ <UsageCount Value="10"/>
+ </Unit2>
+ <Unit3>
+ <Filename Value="avcodec.pas"/>
+ <UnitName Value="avcodec"/>
+ <CursorPos X="3" Y="1796"/>
+ <TopLine Value="1775"/>
+ <UsageCount Value="11"/>
+ </Unit3>
+ <Unit4>
+ <Filename Value="avio.pas"/>
+ <UnitName Value="avio"/>
+ <CursorPos X="1" Y="1"/>
+ <TopLine Value="1"/>
+ <UsageCount Value="11"/>
+ </Unit4>
+ <Unit5>
+ <Filename Value="pngimage.pas"/>
+ <UnitName Value="pngimage"/>
+ <CursorPos X="20" Y="133"/>
+ <TopLine Value="121"/>
+ <EditorIndex Value="1"/>
+ <UsageCount Value="10"/>
+ <Loaded Value="True"/>
+ </Unit5>
+ <Unit6>
+ <Filename Value="pngzlib.pas"/>
+ <UnitName Value="pngzlib"/>
+ <CursorPos X="6" Y="111"/>
+ <TopLine Value="91"/>
+ <EditorIndex Value="3"/>
+ <UsageCount Value="10"/>
+ <Loaded Value="True"/>
+ </Unit6>
+ <Unit7>
+ <Filename Value="pnglang.pas"/>
+ <UnitName Value="pnglang"/>
+ <CursorPos X="1" Y="1"/>
+ <TopLine Value="1"/>
+ <EditorIndex Value="2"/>
+ <UsageCount Value="10"/>
+ <Loaded Value="True"/>
+ </Unit7>
+ </Units>
+ <JumpHistory Count="30" HistoryIndex="29">
+ <Position1>
+ <Filename Value="pngimage.pas"/>
+ <Caret Line="4037" Column="16" TopLine="4017"/>
+ </Position1>
+ <Position2>
+ <Filename Value="lazarustest.lpr"/>
+ <Caret Line="19" Column="1" TopLine="1"/>
+ </Position2>
+ <Position3>
+ <Filename Value="lazarustest.lpr"/>
+ <Caret Line="6" Column="1" TopLine="1"/>
+ </Position3>
+ <Position4>
+ <Filename Value="lazarustest.lpr"/>
+ <Caret Line="4" Column="1" TopLine="1"/>
+ </Position4>
+ <Position5>
+ <Filename Value="pngzlib.pas"/>
+ <Caret Line="8" Column="30" TopLine="1"/>
+ </Position5>
+ <Position6>
+ <Filename Value="pngzlib.pas"/>
+ <Caret Line="38" Column="37" TopLine="18"/>
+ </Position6>
+ <Position7>
+ <Filename Value="pngzlib.pas"/>
+ <Caret Line="52" Column="16" TopLine="31"/>
+ </Position7>
+ <Position8>
+ <Filename Value="lazarustest.lpr"/>
+ <Caret Line="6" Column="1" TopLine="1"/>
+ </Position8>
+ <Position9>
+ <Filename Value="pngzlib.pas"/>
+ <Caret Line="124" Column="82" TopLine="86"/>
+ </Position9>
+ <Position10>
+ <Filename Value="pngzlib.pas"/>
+ <Caret Line="1" Column="1" TopLine="1"/>
+ </Position10>
+ <Position11>
+ <Filename Value="pngzlib.pas"/>
+ <Caret Line="103" Column="6" TopLine="83"/>
+ </Position11>
+ <Position12>
+ <Filename Value="pngzlib.pas"/>
+ <Caret Line="104" Column="6" TopLine="84"/>
+ </Position12>
+ <Position13>
+ <Filename Value="pngzlib.pas"/>
+ <Caret Line="105" Column="6" TopLine="85"/>
+ </Position13>
+ <Position14>
+ <Filename Value="pngzlib.pas"/>
+ <Caret Line="106" Column="6" TopLine="86"/>
+ </Position14>
+ <Position15>
+ <Filename Value="pngzlib.pas"/>
+ <Caret Line="107" Column="6" TopLine="87"/>
+ </Position15>
+ <Position16>
+ <Filename Value="pngzlib.pas"/>
+ <Caret Line="108" Column="6" TopLine="88"/>
+ </Position16>
+ <Position17>
+ <Filename Value="pngzlib.pas"/>
+ <Caret Line="109" Column="6" TopLine="89"/>
+ </Position17>
+ <Position18>
+ <Filename Value="pngzlib.pas"/>
+ <Caret Line="110" Column="6" TopLine="90"/>
+ </Position18>
+ <Position19>
+ <Filename Value="pngimage.pas"/>
+ <Caret Line="4037" Column="62" TopLine="4017"/>
+ </Position19>
+ <Position20>
+ <Filename Value="pnglang.pas"/>
+ <Caret Line="275" Column="31" TopLine="255"/>
+ </Position20>
+ <Position21>
+ <Filename Value="lazarustest.lpr"/>
+ <Caret Line="19" Column="1" TopLine="1"/>
+ </Position21>
+ <Position22>
+ <Filename Value="pngimage.pas"/>
+ <Caret Line="1" Column="1" TopLine="1"/>
+ </Position22>
+ <Position23>
+ <Filename Value="lazarustest.lpr"/>
+ <Caret Line="19" Column="1" TopLine="1"/>
+ </Position23>
+ <Position24>
+ <Filename Value="pngimage.pas"/>
+ <Caret Line="1" Column="1" TopLine="1"/>
+ </Position24>
+ <Position25>
+ <Filename Value="pngimage.pas"/>
+ <Caret Line="139" Column="10" TopLine="119"/>
+ </Position25>
+ <Position26>
+ <Filename Value="pngimage.pas"/>
+ <Caret Line="138" Column="1" TopLine="119"/>
+ </Position26>
+ <Position27>
+ <Filename Value="pngimage.pas"/>
+ <Caret Line="146" Column="38" TopLine="121"/>
+ </Position27>
+ <Position28>
+ <Filename Value="pngimage.pas"/>
+ <Caret Line="141" Column="2" TopLine="121"/>
+ </Position28>
+ <Position29>
+ <Filename Value="lazarustest.lpr"/>
+ <Caret Line="11" Column="20" TopLine="1"/>
+ </Position29>
+ <Position30>
+ <Filename Value="lazarustest.lpr"/>
+ <Caret Line="14" Column="1" TopLine="1"/>
+ </Position30>
+ </JumpHistory>
+ </ProjectOptions>
+ <CompilerOptions>
+ <Version Value="5"/>
+ <PathDelim Value="\"/>
+ <CodeGeneration>
+ <Generate Value="Faster"/>
+ </CodeGeneration>
+ <Other>
+ <CompilerPath Value="$(CompPath)"/>
+ </Other>
+ </CompilerOptions>
+ <Debugging>
+ <Exceptions Count="2">
+ <Item1>
+ <Name Value="ECodetoolError"/>
+ </Item1>
+ <Item2>
+ <Name Value="EFOpenError"/>
+ </Item2>
+ </Exceptions>
+ </Debugging>
+</CONFIG>
diff --git a/Game/Code/lib/PngImage/lazarustest.lpr b/Game/Code/lib/PngImage/lazarustest.lpr
new file mode 100644
index 00000000..f567b6cb
--- /dev/null
+++ b/Game/Code/lib/PngImage/lazarustest.lpr
@@ -0,0 +1,15 @@
+program lazarustest;
+
+uses
+ pngimage in 'pngimage.pas',
+ pnglang in 'pnglang.pas',
+ pngzlib in 'pngzlib.pas',
+ sysutils;
+
+begin
+ writeln( 'pngimage is NOT lazarus compatible' );
+ writeln( 'It might compile ( not link though ), however the object files are in borland obj format' );
+ writeln( 'to use this, it will need to be in GCC object file format format' );
+ writeln( 'Or we can use the lazarus / freepascal png unit' );
+end.
+
diff --git a/Game/Code/lib/PngImage/obj/adler32.obj b/Game/Code/lib/PngImage/obj/adler32.obj
new file mode 100644
index 00000000..7da9fd19
--- /dev/null
+++ b/Game/Code/lib/PngImage/obj/adler32.obj
Binary files differ
diff --git a/Game/Code/lib/PngImage/obj/deflate.obj b/Game/Code/lib/PngImage/obj/deflate.obj
new file mode 100644
index 00000000..804e9334
--- /dev/null
+++ b/Game/Code/lib/PngImage/obj/deflate.obj
Binary files differ
diff --git a/Game/Code/lib/PngImage/obj/infblock.obj b/Game/Code/lib/PngImage/obj/infblock.obj
new file mode 100644
index 00000000..3bc38e41
--- /dev/null
+++ b/Game/Code/lib/PngImage/obj/infblock.obj
Binary files differ
diff --git a/Game/Code/lib/PngImage/obj/infcodes.obj b/Game/Code/lib/PngImage/obj/infcodes.obj
new file mode 100644
index 00000000..faec2222
--- /dev/null
+++ b/Game/Code/lib/PngImage/obj/infcodes.obj
Binary files differ
diff --git a/Game/Code/lib/PngImage/obj/inffast.obj b/Game/Code/lib/PngImage/obj/inffast.obj
new file mode 100644
index 00000000..62e18ceb
--- /dev/null
+++ b/Game/Code/lib/PngImage/obj/inffast.obj
Binary files differ
diff --git a/Game/Code/lib/PngImage/obj/inflate.obj b/Game/Code/lib/PngImage/obj/inflate.obj
new file mode 100644
index 00000000..7dc522e0
--- /dev/null
+++ b/Game/Code/lib/PngImage/obj/inflate.obj
Binary files differ
diff --git a/Game/Code/lib/PngImage/obj/inftrees.obj b/Game/Code/lib/PngImage/obj/inftrees.obj
new file mode 100644
index 00000000..5755233f
--- /dev/null
+++ b/Game/Code/lib/PngImage/obj/inftrees.obj
Binary files differ
diff --git a/Game/Code/lib/PngImage/obj/infutil.obj b/Game/Code/lib/PngImage/obj/infutil.obj
new file mode 100644
index 00000000..7e175a83
--- /dev/null
+++ b/Game/Code/lib/PngImage/obj/infutil.obj
Binary files differ
diff --git a/Game/Code/lib/PngImage/obj/trees.obj b/Game/Code/lib/PngImage/obj/trees.obj
new file mode 100644
index 00000000..81f05568
--- /dev/null
+++ b/Game/Code/lib/PngImage/obj/trees.obj
Binary files differ
diff --git a/Game/Code/lib/PngImage/pngimage.chm b/Game/Code/lib/PngImage/pngimage.chm
new file mode 100644
index 00000000..c7e51b2e
--- /dev/null
+++ b/Game/Code/lib/PngImage/pngimage.chm
Binary files differ
diff --git a/Game/Code/lib/PngImage/pngimage.pas b/Game/Code/lib/PngImage/pngimage.pas
new file mode 100644
index 00000000..ecd52c5b
--- /dev/null
+++ b/Game/Code/lib/PngImage/pngimage.pas
@@ -0,0 +1,5213 @@
+{Portable Network Graphics Delphi 1.4361 (8 March 2003) }
+
+{This is the latest implementation for TPngImage component }
+{It's meant to be a full replacement for the previous one. }
+{There are lots of new improvements, including cleaner code, }
+{full partial transparency support, speed improvements, }
+{saving using ADAM 7 interlacing, better error handling, also }
+{the best compression for the final image ever. And now it's }
+{truly able to read about any png image. }
+
+{
+ Version 1.4361
+ 2003-03-04 - Fixed important bug for simple transparency when using
+ RGB, Grayscale color modes
+
+ Version 1.436
+ 2003-03-04 - * NEW * Property Pixels for direct access to pixels
+ * IMPROVED * Palette property (TPngObject) (read only)
+ Slovenian traslation for the component (Miha Petelin)
+ Help file update (scanline article/png->jpg example)
+
+ Version 1.435
+ 2003-11-03 - * NEW * New chunk implementation zTXt (method AddzTXt)
+ * NEW * New compiler flags to store the extra 8 bits
+ from 16 bits samples (when saving it is ignored), the
+ extra data may be acessed using ExtraScanline property
+ * Fixed * a bug on tIMe chunk
+ French translation included (Thanks to IBE Software)
+ Bugs fixed
+
+ Version 1.432
+ 2002-08-24 - * NEW * A new method, CreateAlpha will transform the
+ current image into partial transparency.
+ Help file updated with a new article on how to handle
+ partial transparency.
+
+ Version 1.431
+ 2002-08-14 - Fixed and tested to work on:
+ C++ Builder 3
+ C++ Builder 5
+ Delphi 3
+ There was an error when setting TransparentColor, fixed
+ New method, RemoveTransparency to remove image
+ BIT TRANSPARENCY
+
+ Version 1.43
+ 2002-08-01 - * NEW * Support for Delphi 3 and C++ Builder 3
+ Implements mostly some things that were missing,
+ a few tweaks and fixes.
+
+ Version 1.428
+ 2002-07-24 - More minor fixes (thanks to Ian Boyd)
+ Bit transparency fixes
+ * NEW * Finally support to bit transparency
+ (palette / rgb / grayscale -> all)
+
+ Version 1.427
+ 2002-07-19 - Lots of bugs and leaks fixed
+ * NEW * method to easy adding text comments, AddtEXt
+ * NEW * property for setting bit transparency,
+ TransparentColor
+
+ Version 1.426
+ 2002-07-18 - Clipboard finally fixed (hope)
+ Changed UseDelphi trigger to UseDelphi
+ * NEW * Support for bit transparency bitmaps
+ when assigning from/to TBitmap objects
+ Altough it does not support drawing transparent
+ parts of bit transparency pngs (only partial)
+ it is closer than ever
+
+ Version 1.425
+ 2002-07-01 - Clipboard methods implemented
+ Lots of bugs fixed
+
+ Version 1.424
+ 2002-05-16 - Scanline and AlphaScanline are now working correctly.
+ New methods for handling the clipboard
+
+ Version 1.423
+ 2002-05-16 - * NEW * Partial transparency for 1, 2, 4 and 8 bits is
+ also supported using the tRNS chunk (for palette and
+ grayscaling).
+ New bug fixes (Peter Haas).
+
+ Version 1.422
+ 2002-05-14 - Fixed some critical leaks, thanks to Peter Haas tips.
+ New translation for German (Peter Haas).
+
+ Version 1.421
+ 2002-05-06 - Now uses new ZLIB version, 1.1.4 with some security
+ fixes.
+ LoadFromResourceID and LoadFromResourceName added and
+ help file updated for that.
+ The resources strings are now located in pnglang.pas.
+ New translation for Brazilian Portuguese.
+ Bugs fixed.
+
+ IMPORTANT: I'm currently looking for bugs on the library. If
+ anyone has found one, please send me an email and
+ I will fix right away. Thanks for all the help and
+ ideias I'm receiving so far.}
+
+{My new email is: gubadaud@terra.com.br}
+{Website link : pngdelphi.sourceforge.net}
+{Gustavo Huffenbacher Daud}
+
+unit pngimage;
+
+interface
+
+{$IFDEF FPC}
+ {$MODE DELPHI}
+{$ENDIF}
+
+{Triggers avaliable (edit the fields bellow)}
+{$IFNDef FPC}
+{$DEFINE UseDelphi} //Disable fat vcl units (perfect to small apps)
+{$ENDIF}
+
+{$DEFINE ErrorOnUnknownCritical} //Error when finds an unknown critical chunk
+{$DEFINE CheckCRC} //Enables CRC checking
+{$DEFINE RegisterGraphic} //Registers TPNGObject to use with TPicture
+{$DEFINE PartialTransparentDraw} //Draws partial transparent images
+{.$DEFINE Store16bits} //Stores the extra 8 bits from 16bits/sample
+{.$DEFINE Debug} //For programming purposes
+{$RANGECHECKS OFF} {$J+}
+
+
+
+uses
+ Windows,
+ {$IFDEF UseDelphi}
+ Classes,
+ Graphics,
+ SysUtils,
+ {$ENDIF}
+ {$IFDEF Debug}
+ dialogs,
+ {$ENDIF}
+ pngzlib,
+ pnglang;
+
+{$IFNDEF UseDelphi}
+ const
+ soFromBeginning = 0;
+ soFromCurrent = 1;
+ soFromEnd = 2;
+{$ENDIF}
+
+const
+ {ZLIB constants}
+ ZLIBErrors: Array[-6..2] of string = ('incompatible version (-6)',
+ 'buffer error (-5)', 'insufficient memory (-4)', 'data error (-3)',
+ 'stream error (-2)', 'file error (-1)', '(0)', 'stream end (1)',
+ 'need dictionary (2)');
+ Z_NO_FLUSH = 0;
+ Z_FINISH = 4;
+ Z_STREAM_END = 1;
+
+ {Avaliable PNG filters for mode 0}
+ FILTER_NONE = 0;
+ FILTER_SUB = 1;
+ FILTER_UP = 2;
+ FILTER_AVERAGE = 3;
+ FILTER_PAETH = 4;
+
+ {Avaliable color modes for PNG}
+ COLOR_GRAYSCALE = 0;
+ COLOR_RGB = 2;
+ COLOR_PALETTE = 3;
+ COLOR_GRAYSCALEALPHA = 4;
+ COLOR_RGBALPHA = 6;
+
+
+type
+ {$IFNDEF UseDelphi}
+ {Custom exception handler}
+ Exception = class(TObject)
+ constructor Create(Msg: String);
+ end;
+ ExceptClass = class of Exception;
+ TColor = ColorRef;
+ {$ENDIF}
+
+ {Error types}
+ EPNGOutMemory = class(Exception);
+ EPngError = class(Exception);
+ EPngUnexpectedEnd = class(Exception);
+ EPngInvalidCRC = class(Exception);
+ EPngInvalidIHDR = class(Exception);
+ EPNGMissingMultipleIDAT = class(Exception);
+ EPNGZLIBError = class(Exception);
+ EPNGInvalidPalette = class(Exception);
+ EPNGInvalidFileHeader = class(Exception);
+ EPNGIHDRNotFirst = class(Exception);
+ EPNGNotExists = class(Exception);
+ EPNGSizeExceeds = class(Exception);
+ EPNGMissingPalette = class(Exception);
+ EPNGUnknownCriticalChunk = class(Exception);
+ EPNGUnknownCompression = class(Exception);
+ EPNGUnknownInterlace = class(Exception);
+ EPNGNoImageData = class(Exception);
+ EPNGCouldNotLoadResource = class(Exception);
+ EPNGCannotChangeTransparent = class(Exception);
+ EPNGHeaderNotPresent = class(Exception);
+
+type
+ {Direct access to pixels using R,G,B}
+ TRGBLine = array[word] of TRGBTriple;
+ pRGBLine = ^TRGBLine;
+
+ {Same as TBitmapInfo but with allocated space for}
+ {palette entries}
+ TMAXBITMAPINFO = packed record
+ bmiHeader: TBitmapInfoHeader;
+ bmiColors: packed array[0..255] of TRGBQuad;
+ end;
+
+ {Transparency mode for pngs}
+ TPNGTransparencyMode = (ptmNone, ptmBit, ptmPartial);
+ {Pointer to a cardinal type}
+ pCardinal = ^Cardinal;
+ {Access to a rgb pixel}
+ pRGBPixel = ^TRGBPixel;
+ TRGBPixel = packed record
+ B, G, R: Byte;
+ end;
+
+ {Pointer to an array of bytes type}
+ TByteArray = Array[Word] of Byte;
+ pByteArray = ^TByteArray;
+
+ {Forward}
+ TPNGObject = class;
+ pPointerArray = ^TPointerArray;
+ TPointerArray = Array[Word] of Pointer;
+
+ {Contains a list of objects}
+ TPNGPointerList = class
+ private
+ fOwner: TPNGObject;
+ fCount : Cardinal;
+ fMemory: pPointerArray;
+ function GetItem(Index: Cardinal): Pointer;
+ procedure SetItem(Index: Cardinal; const Value: Pointer);
+ protected
+ {Removes an item}
+ function Remove(Value: Pointer): Pointer; virtual;
+ {Inserts an item}
+ procedure Insert(Value: Pointer; Position: Cardinal);
+ {Add a new item}
+ procedure Add(Value: Pointer);
+ {Returns an item}
+ property Item[Index: Cardinal]: Pointer read GetItem write SetItem;
+ {Set the size of the list}
+ procedure SetSize(const Size: Cardinal);
+ {Returns owner}
+ property Owner: TPNGObject read fOwner;
+ public
+ {Returns number of items}
+ property Count: Cardinal read fCount write SetSize;
+ {Object being either created or destroyed}
+ constructor Create(AOwner: TPNGObject);
+ destructor Destroy; override;
+ end;
+
+ {Forward declaration}
+ TChunk = class;
+ TChunkClass = class of TChunk;
+
+ {Same as TPNGPointerList but providing typecasted values}
+ TPNGList = class(TPNGPointerList)
+ private
+ {Used with property Item}
+ function GetItem(Index: Cardinal): TChunk;
+ public
+ {Removes an item}
+ procedure RemoveChunk(Chunk: TChunk); overload;
+ {Add a new chunk using the class from the parameter}
+ function Add(ChunkClass: TChunkClass): TChunk;
+ {Returns pointer to the first chunk of class}
+ function ItemFromClass(ChunkClass: TChunkClass): TChunk;
+ {Returns a chunk item from the list}
+ property Item[Index: Cardinal]: TChunk read GetItem;
+ end;
+
+ {$IFNDEF UseDelphi}
+ {The STREAMs bellow are only needed in case delphi provided ones is not}
+ {avaliable (UseDelphi trigger not set)}
+ {Object becomes handles}
+ TCanvas = THandle;
+ TBitmap = HBitmap;
+ {Trick to work}
+ TPersistent = TObject;
+
+ {Base class for all streams}
+ TStream = class
+ protected
+ {Returning/setting size}
+ function GetSize: Longint; virtual;
+ procedure SetSize(const Value: Longint); virtual; abstract;
+ {Returns/set position}
+ function GetPosition: Longint; virtual;
+ procedure SetPosition(const Value: Longint); virtual;
+ public
+ {Returns/sets current position}
+ property Position: Longint read GetPosition write SetPosition;
+ {Property returns/sets size}
+ property Size: Longint read GetSize write SetSize;
+ {Allows reading/writing data}
+ function Read(var Buffer; Count: Longint): Cardinal; virtual; abstract;
+ function Write(const Buffer; Count: Longint): Cardinal; virtual; abstract;
+ {Copies from another Stream}
+ function CopyFrom(Source: TStream;
+ Count: Cardinal): Cardinal; virtual;
+ {Seeks a stream position}
+ function Seek(Offset: Longint; Origin: Word): Longint; virtual; abstract;
+ end;
+
+ {File stream modes}
+ TFileStreamMode = (fsmRead, fsmWrite, fsmCreate);
+ TFileStreamModeSet = set of TFileStreamMode;
+
+ {File stream for reading from files}
+ TFileStream = class(TStream)
+ private
+ {Opened mode}
+ Filemode: TFileStreamModeSet;
+ {Handle}
+ fHandle: THandle;
+ protected
+ {Set the size of the file}
+ procedure SetSize(const Value: Longint); override;
+ public
+ {Seeks a file position}
+ function Seek(Offset: Longint; Origin: Word): Longint; override;
+ {Reads/writes data from/to the file}
+ function Read(var Buffer; Count: Longint): Cardinal; override;
+ function Write(const Buffer; Count: Longint): Cardinal; override;
+ {Stream being created and destroy}
+ constructor Create(Filename: String; Mode: TFileStreamModeSet);
+ destructor Destroy; override;
+ end;
+
+ {Stream for reading from resources}
+ TResourceStream = class(TStream)
+ constructor Create(Instance: HInst; const ResName: String; ResType:PChar);
+ private
+ {Variables for reading}
+ Size: Integer;
+ Memory: Pointer;
+ Position: Integer;
+ protected
+ {Set the size of the file}
+ procedure SetSize(const Value: Longint); override;
+ public
+ {Stream processing}
+ function Read(var Buffer; Count: Integer): Cardinal; override;
+ function Seek(Offset: Integer; Origin: Word): Longint; override;
+ function Write(const Buffer; Count: Longint): Cardinal; override;
+ end;
+ {$ENDIF}
+
+ {Forward}
+ TChunkIHDR = class;
+ {Interlace method}
+ TInterlaceMethod = (imNone, imAdam7);
+ {Compression level type}
+ TCompressionLevel = 0..9;
+ {Filters type}
+ TFilter = (pfNone, pfSub, pfUp, pfAverage, pfPaeth);
+ TFilters = set of TFilter;
+
+ {Png implementation object}
+ TPngObject = class{$IFDEF UseDelphi}(TGraphic){$ENDIF}
+ protected
+ {Gamma table values}
+ GammaTable, InverseGamma: Array[Byte] of Byte;
+ procedure InitializeGamma;
+ private
+ {Temporary palette}
+ TempPalette: HPalette;
+ {Filters to test to encode}
+ fFilters: TFilters;
+ {Compression level for ZLIB}
+ fCompressionLevel: TCompressionLevel;
+ {Maximum size for IDAT chunks}
+ fMaxIdatSize: Cardinal;
+ {Returns if image is interlaced}
+ fInterlaceMethod: TInterlaceMethod;
+ {Chunks object}
+ fChunkList: TPngList;
+ {Clear all chunks in the list}
+ procedure ClearChunks;
+ {Returns if header is present}
+ function HeaderPresent: Boolean;
+ {Returns linesize and byte offset for pixels}
+ procedure GetPixelInfo(var LineSize, Offset: Cardinal);
+ procedure SetMaxIdatSize(const Value: Cardinal);
+ function GetAlphaScanline(const LineIndex: Integer): pByteArray;
+ function GetScanline(const LineIndex: Integer): Pointer;
+ {$IFDEF Store16bits}
+ function GetExtraScanline(const LineIndex: Integer): Pointer;
+ {$ENDIF}
+ function GetTransparencyMode: TPNGTransparencyMode;
+ function GetTransparentColor: TColor;
+ procedure SetTransparentColor(const Value: TColor);
+ protected
+ {Returns the image palette}
+ function GetPalette: HPALETTE; {$IFDEF UseDelphi}override;{$ENDIF}
+ {Returns/sets image width and height}
+ function GetWidth: Integer; {$IFDEF UseDelphi}override;{$ENDIF}
+ function GetHeight: Integer; {$IFDEF UseDelphi}override; {$ENDIF}
+ procedure SetWidth(Value: Integer); {$IFDEF UseDelphi}override; {$ENDIF}
+ procedure SetHeight(Value: Integer); {$IFDEF UseDelphi}override;{$ENDIF}
+ {Assigns from another TPNGObject}
+ procedure AssignPNG(Source: TPNGObject);
+ {Returns if the image is empty}
+ function GetEmpty: Boolean; {$IFDEF UseDelphi}override; {$ENDIF}
+ {Used with property Header}
+ function GetHeader: TChunkIHDR;
+ {Draws using partial transparency}
+ procedure DrawPartialTrans(DC: HDC; Rect: TRect);
+ {$IFDEF UseDelphi}
+ {Returns if the image is transparent}
+ function GetTransparent: Boolean; override;
+ {$ENDIF}
+ {Returns a pixel}
+ function GetPixels(const X, Y: Integer): TColor; virtual;
+ procedure SetPixels(const X, Y: Integer; const Value: TColor); virtual;
+ public
+ {Generates alpha information}
+ procedure CreateAlpha;
+ {Removes the image transparency}
+ procedure RemoveTransparency;
+ {Transparent color}
+ property TransparentColor: TColor read GetTransparentColor write
+ SetTransparentColor;
+ {Add text chunk, TChunkTEXT, TChunkzTXT}
+ procedure AddtEXt(const Keyword, Text: String);
+ procedure AddzTXt(const Keyword, Text: String);
+ {$IFDEF UseDelphi}
+ {Saves to clipboard format (thanks to Antoine Pottern)}
+ procedure SaveToClipboardFormat(var AFormat: Word; var AData: THandle;
+ var APalette: HPalette); override;
+ procedure LoadFromClipboardFormat(AFormat: Word; AData: THandle;
+ APalette: HPalette); override;
+ {$ENDIF}
+ {Calling errors}
+ procedure RaiseError(ExceptionClass: ExceptClass; Text: String);
+ {Returns a scanline from png}
+ property Scanline[const Index: Integer]: Pointer read GetScanline;
+ {$IFDEF Store16bits}
+ property ExtraScanline[const Index: Integer]: Pointer read GetExtraScanline;
+ {$ENDIF}
+ property AlphaScanline[const Index: Integer]: pByteArray read GetAlphaScanline;
+ {Returns pointer to the header}
+ property Header: TChunkIHDR read GetHeader;
+ {Returns the transparency mode used by this png}
+ property TransparencyMode: TPNGTransparencyMode read GetTransparencyMode;
+ {Assigns from another object}
+ procedure Assign(Source: TPersistent);{$IFDEF UseDelphi}override;{$ENDIF}
+ {Assigns to another object}
+ procedure AssignTo(Dest: TPersistent);{$IFDEF UseDelphi}override;{$ENDIF}
+ {Assigns from a windows bitmap handle}
+ procedure AssignHandle(Handle: HBitmap; Transparent: Boolean;
+ TransparentColor: ColorRef);
+ {Draws the image into a canvas}
+ procedure Draw(ACanvas: TCanvas; const Rect: TRect);
+ {$IFDEF UseDelphi}override;{$ENDIF}
+ {Width and height properties}
+ property Width: Integer read GetWidth;
+ property Height: Integer read GetHeight;
+ {Returns if the image is interlaced}
+ property InterlaceMethod: TInterlaceMethod read fInterlaceMethod
+ write fInterlaceMethod;
+ {Filters to test to encode}
+ property Filters: TFilters read fFilters write fFilters;
+ {Maximum size for IDAT chunks, default and minimum is 65536}
+ property MaxIdatSize: Cardinal read fMaxIdatSize write SetMaxIdatSize;
+ {Property to return if the image is empty or not}
+ property Empty: Boolean read GetEmpty;
+ {Compression level}
+ property CompressionLevel: TCompressionLevel read fCompressionLevel
+ write fCompressionLevel;
+ {Access to the chunk list}
+ property Chunks: TPngList read fChunkList;
+ {Object being created and destroyed}
+ constructor Create; {$IFDEF UseDelphi}override;{$ENDIF}
+ destructor Destroy; override;
+ {$IFNDEF UseDelphi}procedure LoadFromFile(const Filename: String);{$ENDIF}
+ {$IFNDEF UseDelphi}procedure SaveToFile(const Filename: String);{$ENDIF}
+ procedure LoadFromStream(Stream: TStream); {$IFDEF UseDelphi}override;{$ENDIF}
+ procedure SaveToStream(Stream: TStream); {$IFDEF UseDelphi}override;{$ENDIF}
+ {Loading the image from resources}
+ procedure LoadFromResourceName(Instance: HInst; const Name: String);
+ procedure LoadFromResourceID(Instance: HInst; ResID: Integer);
+ {Access to the png pixels}
+ property Pixels[const X, Y: Integer]: TColor read GetPixels write SetPixels;
+ {Palette property}
+ {$IFNDEF UseDelphi}property Palette: HPalette read GetPalette;{$ENDIF}
+ end;
+
+ {Chunk name object}
+ TChunkName = Array[0..3] of Char;
+
+ {Global chunk object}
+ TChunk = class
+ private
+ {Contains data}
+ fData: Pointer;
+ fDataSize: Cardinal;
+ {Stores owner}
+ fOwner: TPngObject;
+ {Stores the chunk name}
+ fName: TChunkName;
+ {Returns pointer to the TChunkIHDR}
+ function GetHeader: TChunkIHDR;
+ {Used with property index}
+ function GetIndex: Integer;
+ {Should return chunk class/name}
+ class function GetName: String; virtual;
+ {Returns the chunk name}
+ function GetChunkName: String;
+ public
+ {Returns index from list}
+ property Index: Integer read GetIndex;
+ {Returns pointer to the TChunkIHDR}
+ property Header: TChunkIHDR read GetHeader;
+ {Resize the data}
+ procedure ResizeData(const NewSize: Cardinal);
+ {Returns data and size}
+ property Data: Pointer read fData;
+ property DataSize: Cardinal read fDataSize;
+ {Assigns from another TChunk}
+ procedure Assign(Source: TChunk); virtual;
+ {Returns owner}
+ property Owner: TPngObject read fOwner;
+ {Being destroyed/created}
+ constructor Create(Owner: TPngObject); virtual;
+ destructor Destroy; override;
+ {Returns chunk class/name}
+ property Name: String read GetChunkName;
+ {Loads the chunk from a stream}
+ function LoadFromStream(Stream: TStream; const ChunkName: TChunkName;
+ Size: Integer): Boolean; virtual;
+ {Saves the chunk to a stream}
+ function SaveData(Stream: TStream): Boolean;
+ function SaveToStream(Stream: TStream): Boolean; virtual;
+ end;
+
+ {Chunk classes}
+ TChunkIEND = class(TChunk); {End chunk}
+
+ {IHDR data}
+ pIHDRData = ^TIHDRData;
+ TIHDRData = packed record
+ Width, Height: Cardinal;
+ BitDepth,
+ ColorType,
+ CompressionMethod,
+ FilterMethod,
+ InterlaceMethod: Byte;
+ end;
+
+ {Information header chunk}
+ TChunkIHDR = class(TChunk)
+ private
+ {Current image}
+ ImageHandle: HBitmap;
+ ImageDC: HDC;
+
+ {Output windows bitmap}
+ HasPalette: Boolean;
+ BitmapInfo: TMaxBitmapInfo;
+ BytesPerRow: Integer;
+ {Stores the image bytes}
+ {$IFDEF Store16bits}ExtraImageData: Pointer;{$ENDIF}
+ ImageData: pointer;
+ ImageAlpha: Pointer;
+
+ {Contains all the ihdr data}
+ IHDRData: TIHDRData;
+ protected
+ {Resizes the image data to fill the color type, bit depth, }
+ {width and height parameters}
+ procedure PrepareImageData;
+ {Release allocated ImageData memory}
+ procedure FreeImageData;
+ public
+ {Properties}
+ property Width: Cardinal read IHDRData.Width write IHDRData.Width;
+ property Height: Cardinal read IHDRData.Height write IHDRData.Height;
+ property BitDepth: Byte read IHDRData.BitDepth write IHDRData.BitDepth;
+ property ColorType: Byte read IHDRData.ColorType write IHDRData.ColorType;
+ property CompressionMethod: Byte read IHDRData.CompressionMethod
+ write IHDRData.CompressionMethod;
+ property FilterMethod: Byte read IHDRData.FilterMethod
+ write IHDRData.FilterMethod;
+ property InterlaceMethod: Byte read IHDRData.InterlaceMethod
+ write IHDRData.InterlaceMethod;
+ {Loads the chunk from a stream}
+ function LoadFromStream(Stream: TStream; const ChunkName: TChunkName;
+ Size: Integer): Boolean; override;
+ {Saves the chunk to a stream}
+ function SaveToStream(Stream: TStream): Boolean; override;
+ {Destructor/constructor}
+ constructor Create(Owner: TPngObject); override;
+ destructor Destroy; override;
+ {Assigns from another TChunk}
+ procedure Assign(Source: TChunk); override;
+ end;
+
+ {Gamma chunk}
+ TChunkgAMA = class(TChunk)
+ private
+ {Returns/sets the value for the gamma chunk}
+ function GetValue: Cardinal;
+ procedure SetValue(const Value: Cardinal);
+ public
+ {Returns/sets gamma value}
+ property Gamma: Cardinal read GetValue write SetValue;
+ {Loading the chunk from a stream}
+ function LoadFromStream(Stream: TStream; const ChunkName: TChunkName;
+ Size: Integer): Boolean; override;
+ {Being created}
+ constructor Create(Owner: TPngObject); override;
+ {Assigns from another TChunk}
+ procedure Assign(Source: TChunk); override;
+ end;
+
+ {ZLIB Decompression extra information}
+ TZStreamRec2 = packed record
+ {From ZLIB}
+ ZLIB: TZStreamRec;
+ {Additional info}
+ Data: Pointer;
+ fStream : TStream;
+ end;
+
+ {Palette chunk}
+ TChunkPLTE = class(TChunk)
+ private
+ {Number of items in the palette}
+ fCount: Integer;
+ {Contains the palette handle}
+ function GetPaletteItem(Index: Byte): TRGBQuad;
+ public
+ {Returns the color for each item in the palette}
+ property Item[Index: Byte]: TRGBQuad read GetPaletteItem;
+ {Returns the number of items in the palette}
+ property Count: Integer read fCount;
+ {Loads the chunk from a stream}
+ function LoadFromStream(Stream: TStream; const ChunkName: TChunkName;
+ Size: Integer): Boolean; override;
+ {Saves the chunk to a stream}
+ function SaveToStream(Stream: TStream): Boolean; override;
+ {Assigns from another TChunk}
+ procedure Assign(Source: TChunk); override;
+ end;
+
+ {Transparency information}
+ TChunktRNS = class(TChunk)
+ private
+ fBitTransparency: Boolean;
+ function GetTransparentColor: ColorRef;
+ {Returns the transparent color}
+ procedure SetTransparentColor(const Value: ColorRef);
+ public
+ {Palette values for transparency}
+ PaletteValues: Array[Byte] of Byte;
+ {Returns if it uses bit transparency}
+ property BitTransparency: Boolean read fBitTransparency;
+ {Returns the transparent color}
+ property TransparentColor: ColorRef read GetTransparentColor write
+ SetTransparentColor;
+ {Loads/saves the chunk from/to a stream}
+ function LoadFromStream(Stream: TStream; const ChunkName: TChunkName;
+ Size: Integer): Boolean; override;
+ function SaveToStream(Stream: TStream): Boolean; override;
+ {Assigns from another TChunk}
+ procedure Assign(Source: TChunk); override;
+ end;
+
+ {Actual image information}
+ TChunkIDAT = class(TChunk)
+ private
+ {Holds another pointer to the TChunkIHDR}
+ Header: TChunkIHDR;
+ {Stores temporary image width and height}
+ ImageWidth, ImageHeight: Integer;
+ {Size in bytes of each line and offset}
+ Row_Bytes, Offset : Cardinal;
+ {Contains data for the lines}
+ Encode_Buffer: Array[0..5] of pByteArray;
+ Row_Buffer: Array[Boolean] of pByteArray;
+ {Variable to invert the Row_Buffer used}
+ RowUsed: Boolean;
+ {Ending position for the current IDAT chunk}
+ EndPos: Integer;
+ {Filter the current line}
+ procedure FilterRow;
+ {Filter to encode and returns the best filter}
+ function FilterToEncode: Byte;
+ {Reads ZLIB compressed data}
+ function IDATZlibRead(var ZLIBStream: TZStreamRec2; Buffer: Pointer;
+ Count: Integer; var EndPos: Integer; var crcfile: Cardinal): Integer;
+ {Compress and writes IDAT data}
+ procedure IDATZlibWrite(var ZLIBStream: TZStreamRec2; Buffer: Pointer;
+ const Length: Cardinal);
+ procedure FinishIDATZlib(var ZLIBStream: TZStreamRec2);
+ {Prepares the palette}
+ procedure PreparePalette;
+ protected
+ {Decode interlaced image}
+ procedure DecodeInterlacedAdam7(Stream: TStream;
+ var ZLIBStream: TZStreamRec2; const Size: Integer; var crcfile: Cardinal);
+ {Decode non interlaced imaged}
+ procedure DecodeNonInterlaced(Stream: TStream;
+ var ZLIBStream: TZStreamRec2; const Size: Integer;
+ var crcfile: Cardinal);
+ protected
+ {Encode non interlaced images}
+ procedure EncodeNonInterlaced(Stream: TStream;
+ var ZLIBStream: TZStreamRec2);
+ {Encode interlaced images}
+ procedure EncodeInterlacedAdam7(Stream: TStream;
+ var ZLIBStream: TZStreamRec2);
+ protected
+ {Memory copy methods to decode}
+ procedure CopyNonInterlacedRGB8(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+ procedure CopyNonInterlacedRGB16(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+ procedure CopyNonInterlacedPalette148(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+ procedure CopyNonInterlacedPalette2(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+ procedure CopyNonInterlacedGray2(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+ procedure CopyNonInterlacedGrayscale16(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+ procedure CopyNonInterlacedRGBAlpha8(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+ procedure CopyNonInterlacedRGBAlpha16(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+ procedure CopyNonInterlacedGrayscaleAlpha8(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+ procedure CopyNonInterlacedGrayscaleAlpha16(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+ procedure CopyInterlacedRGB8(const Pass: Byte;
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+ procedure CopyInterlacedRGB16(const Pass: Byte;
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+ procedure CopyInterlacedPalette148(const Pass: Byte;
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+ procedure CopyInterlacedPalette2(const Pass: Byte;
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+ procedure CopyInterlacedGray2(const Pass: Byte;
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+ procedure CopyInterlacedGrayscale16(const Pass: Byte;
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+ procedure CopyInterlacedRGBAlpha8(const Pass: Byte;
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+ procedure CopyInterlacedRGBAlpha16(const Pass: Byte;
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+ procedure CopyInterlacedGrayscaleAlpha8(const Pass: Byte;
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+ procedure CopyInterlacedGrayscaleAlpha16(const Pass: Byte;
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+ protected
+ {Memory copy methods to encode}
+ procedure EncodeNonInterlacedRGB8(Src, Dest, Trans: pChar);
+ procedure EncodeNonInterlacedRGB16(Src, Dest, Trans: pChar);
+ procedure EncodeNonInterlacedGrayscale16(Src, Dest, Trans: pChar);
+ procedure EncodeNonInterlacedPalette148(Src, Dest, Trans: pChar);
+ procedure EncodeNonInterlacedRGBAlpha8(Src, Dest, Trans: pChar);
+ procedure EncodeNonInterlacedRGBAlpha16(Src, Dest, Trans: pChar);
+ procedure EncodeNonInterlacedGrayscaleAlpha8(Src, Dest, Trans: pChar);
+ procedure EncodeNonInterlacedGrayscaleAlpha16(Src, Dest, Trans: pChar);
+ procedure EncodeInterlacedRGB8(const Pass: Byte; Src, Dest, Trans: pChar);
+ procedure EncodeInterlacedRGB16(const Pass: Byte; Src, Dest, Trans: pChar);
+ procedure EncodeInterlacedPalette148(const Pass: Byte;
+ Src, Dest, Trans: pChar);
+ procedure EncodeInterlacedGrayscale16(const Pass: Byte;
+ Src, Dest, Trans: pChar);
+ procedure EncodeInterlacedRGBAlpha8(const Pass: Byte;
+ Src, Dest, Trans: pChar);
+ procedure EncodeInterlacedRGBAlpha16(const Pass: Byte;
+ Src, Dest, Trans: pChar);
+ procedure EncodeInterlacedGrayscaleAlpha8(const Pass: Byte;
+ Src, Dest, Trans: pChar);
+ procedure EncodeInterlacedGrayscaleAlpha16(const Pass: Byte;
+ Src, Dest, Trans: pChar);
+ public
+ {Loads the chunk from a stream}
+ function LoadFromStream(Stream: TStream; const ChunkName: TChunkName;
+ Size: Integer): Boolean; override;
+ {Saves the chunk to a stream}
+ function SaveToStream(Stream: TStream): Boolean; override;
+ end;
+
+ {Image last modification chunk}
+ TChunktIME = class(TChunk)
+ private
+ {Holds the variables}
+ fYear: Word;
+ fMonth, fDay, fHour, fMinute, fSecond: Byte;
+ public
+ {Returns/sets variables}
+ property Year: Word read fYear write fYear;
+ property Month: Byte read fMonth write fMonth;
+ property Day: Byte read fDay write fDay;
+ property Hour: Byte read fHour write fHour;
+ property Minute: Byte read fMinute write fMinute;
+ property Second: Byte read fSecond write fSecond;
+ {Loads the chunk from a stream}
+ function LoadFromStream(Stream: TStream; const ChunkName: TChunkName;
+ Size: Integer): Boolean; override;
+ {Saves the chunk to a stream}
+ function SaveToStream(Stream: TStream): Boolean; override;
+ end;
+
+ {Textual data}
+ TChunktEXt = class(TChunk)
+ private
+ fKeyword, fText: String;
+ public
+ {Keyword and text}
+ property Keyword: String read fKeyword write fKeyword;
+ property Text: String read fText write fText;
+ {Loads the chunk from a stream}
+ function LoadFromStream(Stream: TStream; const ChunkName: TChunkName;
+ Size: Integer): Boolean; override;
+ {Saves the chunk to a stream}
+ function SaveToStream(Stream: TStream): Boolean; override;
+ {Assigns from another TChunk}
+ procedure Assign(Source: TChunk); override;
+ end;
+
+ {zTXT chunk}
+ TChunkzTXt = class(TChunktEXt)
+ {Loads the chunk from a stream}
+ function LoadFromStream(Stream: TStream; const ChunkName: TChunkName;
+ Size: Integer): Boolean; override;
+ {Saves the chunk to a stream}
+ function SaveToStream(Stream: TStream): Boolean; override;
+ end;
+
+{Here we test if it's c++ builder or delphi version 3 or less}
+{$IFDEF VER110}{$DEFINE DelphiBuilder3Less}{$ENDIF}
+{$IFDEF VER100}{$DEFINE DelphiBuilder3Less}{$ENDIF}
+{$IFDEF VER93}{$DEFINE DelphiBuilder3Less}{$ENDIF}
+{$IFDEF VER90}{$DEFINE DelphiBuilder3Less}{$ENDIF}
+{$IFDEF VER80}{$DEFINE DelphiBuilder3Less}{$ENDIF}
+
+
+{Registers a new chunk class}
+procedure RegisterChunk(ChunkClass: TChunkClass);
+{Calculates crc}
+function update_crc(crc: {$IFNDEF DelphiBuilder3Less}Cardinal{$ELSE}Integer
+ {$ENDIF}; buf: pByteArray; len: Integer): Cardinal;
+{Invert bytes using assembly}
+function ByteSwap(const a: integer): integer;
+
+implementation
+
+var
+ ChunkClasses: TPngPointerList;
+ {Table of CRCs of all 8-bit messages}
+ crc_table: Array[0..255] of Cardinal;
+ {Flag: has the table been computed? Initially false}
+ crc_table_computed: Boolean;
+
+{Draw transparent image using transparent color}
+procedure DrawTransparentBitmap(dc: HDC; srcBits: Pointer;
+ var srcHeader: TBitmapInfoHeader;
+ srcBitmapInfo: pBitmapInfo; Rect: TRect; cTransparentColor: COLORREF);
+var
+ cColor: COLORREF;
+ bmAndBack, bmAndObject, bmAndMem: HBITMAP;
+ bmBackOld, bmObjectOld, bmMemOld: HBITMAP;
+ hdcMem, hdcBack, hdcObject, hdcTemp: HDC;
+ ptSize, orgSize: TPOINT;
+ OldBitmap, DrawBitmap: HBITMAP;
+begin
+ hdcTemp := CreateCompatibleDC(dc);
+ // Select the bitmap
+ DrawBitmap := CreateDIBitmap(dc, srcHeader, CBM_INIT, srcBits, srcBitmapInfo^,
+ DIB_RGB_COLORS);
+ OldBitmap := SelectObject(hdcTemp, DrawBitmap);
+
+ // Sizes
+ OrgSize.x := abs(srcHeader.biWidth);
+ OrgSize.y := abs(srcHeader.biHeight);
+ ptSize.x := Rect.Right - Rect.Left; // Get width of bitmap
+ ptSize.y := Rect.Bottom - Rect.Top; // Get height of bitmap
+
+ // Create some DCs to hold temporary data.
+ hdcBack := CreateCompatibleDC(dc);
+ hdcObject := CreateCompatibleDC(dc);
+ hdcMem := CreateCompatibleDC(dc);
+
+ // Create a bitmap for each DC. DCs are required for a number of
+ // GDI functions.
+
+ // Monochrome DCs
+ bmAndBack := CreateBitmap(ptSize.x, ptSize.y, 1, 1, nil);
+ bmAndObject := CreateBitmap(ptSize.x, ptSize.y, 1, 1, nil);
+
+ bmAndMem := CreateCompatibleBitmap(dc, ptSize.x, ptSize.y);
+
+ // Each DC must select a bitmap object to store pixel data.
+ bmBackOld := SelectObject(hdcBack, bmAndBack);
+ bmObjectOld := SelectObject(hdcObject, bmAndObject);
+ bmMemOld := SelectObject(hdcMem, bmAndMem);
+
+ // Set the background color of the source DC to the color.
+ // contained in the parts of the bitmap that should be transparent
+ cColor := SetBkColor(hdcTemp, cTransparentColor);
+
+ // Create the object mask for the bitmap by performing a BitBlt
+ // from the source bitmap to a monochrome bitmap.
+ StretchBlt(hdcObject, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0,
+ orgSize.x, orgSize.y, SRCCOPY);
+
+ // Set the background color of the source DC back to the original
+ // color.
+ SetBkColor(hdcTemp, cColor);
+
+ // Create the inverse of the object mask.
+ BitBlt(hdcBack, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0,
+ NOTSRCCOPY);
+
+ // Copy the background of the main DC to the destination.
+ BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, dc, Rect.Left, Rect.Top,
+ SRCCOPY);
+
+ // Mask out the places where the bitmap will be placed.
+ BitBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcObject, 0, 0, SRCAND);
+
+ // Mask out the transparent colored pixels on the bitmap.
+// BitBlt(hdcTemp, 0, 0, ptSize.x, ptSize.y, hdcBack, 0, 0, SRCAND);
+ StretchBlt(hdcTemp, 0, 0, OrgSize.x, OrgSize.y, hdcBack, 0, 0,
+ PtSize.x, PtSize.y, SRCAND);
+
+ // XOR the bitmap with the background on the destination DC.
+ StretchBlt(hdcMem, 0, 0, ptSize.x, ptSize.y, hdcTemp, 0, 0,
+ OrgSize.x, OrgSize.y, SRCPAINT);
+
+ // Copy the destination to the screen.
+ BitBlt(dc, Rect.Left, Rect.Top, ptSize.x, ptSize.y, hdcMem, 0, 0,
+ SRCCOPY);
+
+ // Delete the memory bitmaps.
+ DeleteObject(SelectObject(hdcBack, bmBackOld));
+ DeleteObject(SelectObject(hdcObject, bmObjectOld));
+ DeleteObject(SelectObject(hdcMem, bmMemOld));
+ DeleteObject(SelectObject(hdcTemp, OldBitmap));
+
+ // Delete the memory DCs.
+ DeleteDC(hdcMem);
+ DeleteDC(hdcBack);
+ DeleteDC(hdcObject);
+ DeleteDC(hdcTemp);
+end;
+
+{Make the table for a fast CRC.}
+procedure make_crc_table;
+var
+ c: Cardinal;
+ n, k: Integer;
+begin
+
+ {fill the crc table}
+ for n := 0 to 255 do
+ begin
+ c := Cardinal(n);
+ for k := 0 to 7 do
+ begin
+ if Boolean(c and 1) then
+ c := $edb88320 xor (c shr 1)
+ else
+ c := c shr 1;
+ end;
+ crc_table[n] := c;
+ end;
+
+ {The table has already being computated}
+ crc_table_computed := true;
+end;
+
+{Update a running CRC with the bytes buf[0..len-1]--the CRC
+ should be initialized to all 1's, and the transmitted value
+ is the 1's complement of the final running CRC (see the
+ crc() routine below)).}
+function update_crc(crc: {$IFNDEF DelphiBuilder3Less}Cardinal{$ELSE}Integer
+ {$ENDIF}; buf: pByteArray; len: Integer): Cardinal;
+var
+ c: Cardinal;
+ n: Integer;
+begin
+ c := crc;
+
+ {Create the crc table in case it has not being computed yet}
+ if not crc_table_computed then make_crc_table;
+
+ {Update}
+ for n := 0 to len - 1 do
+ c := crc_table[(c XOR buf^[n]) and $FF] XOR (c shr 8);
+
+ {Returns}
+ Result := c;
+end;
+
+{$IFNDEF UseDelphi}
+ function FileExists(Filename: String): Boolean;
+ var
+ FindFile: THandle;
+ FindData: TWin32FindData;
+ begin
+ FindFile := FindFirstFile(PChar(Filename), FindData);
+ Result := FindFile <> INVALID_HANDLE_VALUE;
+ if Result then Windows.FindClose(FindFile);
+ end;
+
+
+{$ENDIF}
+
+{$IFNDEF UseDelphi}
+ {Exception implementation}
+ constructor Exception.Create(Msg: String);
+ begin
+ end;
+{$ENDIF}
+
+{Calculates the paeth predictor}
+function PaethPredictor(a, b, c: Byte): Byte;
+var
+ pa, pb, pc: Integer;
+begin
+ { a = left, b = above, c = upper left }
+ pa := abs(b - c); { distances to a, b, c }
+ pb := abs(a - c);
+ pc := abs(a + b - c * 2);
+
+ { return nearest of a, b, c, breaking ties in order a, b, c }
+ if (pa <= pb) and (pa <= pc) then
+ Result := a
+ else
+ if pb <= pc then
+ Result := b
+ else
+ Result := c;
+end;
+
+{Invert bytes using assembly}
+function ByteSwap(const a: integer): integer;
+asm
+ bswap eax
+end;
+function ByteSwap16(inp:word): word;
+asm
+ bswap eax
+ shr eax, 16
+end;
+
+{Calculates number of bytes for the number of pixels using the}
+{color mode in the paramenter}
+function BytesForPixels(const Pixels: Integer; const ColorType,
+ BitDepth: Byte): Integer;
+begin
+ case ColorType of
+ {Palette and grayscale contains a single value, for palette}
+ {an value of size 2^bitdepth pointing to the palette index}
+ {and grayscale the value from 0 to 2^bitdepth with color intesity}
+ COLOR_GRAYSCALE, COLOR_PALETTE:
+ Result := (Pixels * BitDepth + 7) div 8;
+ {RGB contains 3 values R, G, B with size 2^bitdepth each}
+ COLOR_RGB:
+ Result := (Pixels * BitDepth * 3) div 8;
+ {Contains one value followed by alpha value booth size 2^bitdepth}
+ COLOR_GRAYSCALEALPHA:
+ Result := (Pixels * BitDepth * 2) div 8;
+ {Contains four values size 2^bitdepth, Red, Green, Blue and alpha}
+ COLOR_RGBALPHA:
+ Result := (Pixels * BitDepth * 4) div 8;
+ else
+ Result := 0;
+ end {case ColorType}
+end;
+
+type
+ pChunkClassInfo = ^TChunkClassInfo;
+ TChunkClassInfo = record
+ ClassName: TChunkClass;
+ end;
+
+{Register a chunk type}
+procedure RegisterChunk(ChunkClass: TChunkClass);
+var
+ NewClass: pChunkClassInfo;
+begin
+ {In case the list object has not being created yet}
+ if ChunkClasses = nil then ChunkClasses := TPngPointerList.Create(nil);
+
+ {Add this new class}
+ new(NewClass);
+ NewClass^.ClassName := ChunkClass;
+ ChunkClasses.Add(NewClass);
+end;
+
+{Free chunk class list}
+procedure FreeChunkClassList;
+var
+ i: Integer;
+begin
+ if (ChunkClasses <> nil) then
+ begin
+ FOR i := 0 TO ChunkClasses.Count - 1 do
+ Dispose(pChunkClassInfo(ChunkClasses.Item[i]));
+ ChunkClasses.Free;
+ end;
+end;
+
+{Registering of common chunk classes}
+procedure RegisterCommonChunks;
+begin
+ {Important chunks}
+ RegisterChunk(TChunkIEND);
+ RegisterChunk(TChunkIHDR);
+ RegisterChunk(TChunkIDAT);
+ RegisterChunk(TChunkPLTE);
+ RegisterChunk(TChunkgAMA);
+ RegisterChunk(TChunktRNS);
+
+ {Not so important chunks}
+ RegisterChunk(TChunktIME);
+ RegisterChunk(TChunktEXt);
+ RegisterChunk(TChunkzTXt);
+end;
+
+{Creates a new chunk of this class}
+function CreateClassChunk(Owner: TPngObject; Name: TChunkName): TChunk;
+var
+ i : Integer;
+ NewChunk: TChunkClass;
+begin
+ {Looks for this chunk}
+ NewChunk := TChunk; {In case there is no registered class for this}
+
+ {Looks for this class in all registered chunks}
+ if Assigned(ChunkClasses) then
+ FOR i := 0 TO ChunkClasses.Count - 1 DO
+ begin
+ if pChunkClassInfo(ChunkClasses.Item[i])^.ClassName.GetName = Name then
+ begin
+ NewChunk := pChunkClassInfo(ChunkClasses.Item[i])^.ClassName;
+ break;
+ end;
+ end;
+
+ {Returns chunk class}
+ Result := NewChunk.Create(Owner);
+ Result.fName := Name;
+end;
+
+{ZLIB support}
+
+const
+ ZLIBAllocate = High(Word);
+
+{Initializes ZLIB for decompression}
+function ZLIBInitInflate(Stream: TStream): TZStreamRec2;
+begin
+ {Fill record}
+ Fillchar(Result, SIZEOF(TZStreamRec2), #0);
+
+ {Set internal record information}
+ with Result do
+ begin
+ GetMem(Data, ZLIBAllocate);
+ fStream := Stream;
+ end;
+
+ {Init decompression}
+ InflateInit_(Result.zlib, zlib_version, SIZEOF(TZStreamRec));
+end;
+
+{Initializes ZLIB for compression}
+function ZLIBInitDeflate(Stream: TStream;
+ Level: TCompressionlevel; Size: Cardinal): TZStreamRec2;
+begin
+ {Fill record}
+ Fillchar(Result, SIZEOF(TZStreamRec2), #0);
+
+ {Set internal record information}
+ with Result, ZLIB do
+ begin
+ GetMem(Data, Size);
+ fStream := Stream;
+ next_out := Data;
+ avail_out := Size;
+ end;
+
+ {Inits compression}
+ deflateInit_(Result.zlib, Level, zlib_version, sizeof(TZStreamRec));
+end;
+
+{Terminates ZLIB for compression}
+procedure ZLIBTerminateDeflate(var ZLIBStream: TZStreamRec2);
+begin
+ {Terminates decompression}
+ DeflateEnd(ZLIBStream.zlib);
+ {Free internal record}
+ FreeMem(ZLIBStream.Data, ZLIBAllocate);
+end;
+
+{Terminates ZLIB for decompression}
+procedure ZLIBTerminateInflate(var ZLIBStream: TZStreamRec2);
+begin
+ {Terminates decompression}
+ InflateEnd(ZLIBStream.zlib);
+ {Free internal record}
+ FreeMem(ZLIBStream.Data, ZLIBAllocate);
+end;
+
+{Decompresses ZLIB into a memory address}
+function DecompressZLIB(const Input: Pointer; InputSize: Integer;
+ var Output: Pointer; var OutputSize: Integer;
+ var ErrorOutput: String): Boolean;
+var
+ StreamRec : TZStreamRec;
+ Buffer : Array[Byte] of Byte;
+ InflateRet: Integer;
+begin
+ with StreamRec do
+ begin
+ {Initializes}
+ Result := True;
+ OutputSize := 0;
+
+ {Prepares the data to decompress}
+ FillChar(StreamRec, SizeOf(TZStreamRec), #0);
+ InflateInit_(StreamRec, zlib_version, SIZEOF(TZStreamRec));
+ next_in := Input;
+ avail_in := InputSize;
+
+ {Decodes data}
+ repeat
+ {In case it needs an output buffer}
+ if (avail_out = 0) then
+ begin
+ next_out := @Buffer;
+ avail_out := SizeOf(Buffer);
+ end {if (avail_out = 0)};
+
+ {Decompress and put in output}
+ InflateRet := inflate(StreamRec, 0);
+ if (InflateRet = Z_STREAM_END) or (InflateRet = 0) then
+ begin
+ {Reallocates output buffer}
+ inc(OutputSize, total_out);
+ if Output = nil then
+ GetMem(Output, OutputSize) else ReallocMem(Output, OutputSize);
+ {Copies the new data}
+ CopyMemory(pointer(Longint(Output) + OutputSize - total_out), @Buffer, total_out);
+ end {if (InflateRet = Z_STREAM_END) or (InflateRet = 0)}
+ {Now tests for errors}
+ else if InflateRet < 0 then
+ begin
+ Result := False;
+ ErrorOutput := StreamRec.msg;
+ InflateEnd(StreamRec);
+ Exit;
+ end {if InflateRet < 0}
+ until InflateRet = Z_STREAM_END;
+
+ {Terminates decompression}
+ InflateEnd(StreamRec);
+ end {with StreamRec}
+
+end;
+
+{Compresses ZLIB into a memory address}
+function CompressZLIB(Input: Pointer; InputSize, CompressionLevel: Integer;
+ var Output: Pointer; var OutputSize: Integer;
+ var ErrorOutput: String): Boolean;
+var
+ StreamRec : TZStreamRec;
+ Buffer : Array[Byte] of Byte;
+ DeflateRet: Integer;
+begin
+ with StreamRec do
+ begin
+ Result := True; {By default returns TRUE as everything might have gone ok}
+ OutputSize := 0; {Initialize}
+ {Prepares the data to compress}
+ FillChar(StreamRec, SizeOf(TZStreamRec), #0);
+ DeflateInit_(StreamRec, CompressionLevel,zlib_version, SIZEOF(TZStreamRec));
+
+ next_in := Input;
+ avail_in := InputSize;
+
+ while avail_in > 0 do
+ begin
+ {When it needs new buffer to stores the compressed data}
+ if avail_out = 0 then
+ begin
+ {Restore buffer}
+ next_out := @Buffer;
+ avail_out := SizeOf(Buffer);
+ end {if avail_out = 0};
+
+ {Compresses}
+ DeflateRet := deflate(StreamRec, Z_FINISH);
+
+ if (DeflateRet = Z_STREAM_END) or (DeflateRet = 0) then
+ begin
+ {Updates the output memory}
+ inc(OutputSize, total_out);
+ if Output = nil then
+ GetMem(Output, OutputSize) else ReallocMem(Output, OutputSize);
+
+ {Copies the new data}
+ CopyMemory(Pointer(Longint(Output) + OutputSize - total_out), @Buffer, total_out);
+ end {if (InflateRet = Z_STREAM_END) or (InflateRet = 0)}
+ {Now tests for errors}
+ else if DeflateRet < 0 then
+ begin
+ Result := False;
+ ErrorOutput := StreamRec.msg;
+ DeflateEnd(StreamRec);
+ Exit;
+ end {if InflateRet < 0}
+
+ end {while avail_in > 0};
+
+ {Finishes compressing}
+ DeflateEnd(StreamRec);
+ end {with StreamRec}
+
+end;
+
+{TPngPointerList implementation}
+
+{Object being created}
+constructor TPngPointerList.Create(AOwner: TPNGObject);
+begin
+ inherited Create; {Let ancestor work}
+ {Holds owner}
+ fOwner := AOwner;
+ {Memory pointer not being used yet}
+ fMemory := nil;
+ {No items yet}
+ fCount := 0;
+end;
+
+{Removes value from the list}
+function TPngPointerList.Remove(Value: Pointer): Pointer;
+var
+ I, Position: Integer;
+begin
+ {Gets item position}
+ Position := -1;
+ FOR I := 0 TO Count - 1 DO
+ if Value = Item[I] then Position := I;
+ {In case a match was found}
+ if Position >= 0 then
+ begin
+ Result := Item[Position]; {Returns pointer}
+ {Remove item and move memory}
+ Dec(fCount);
+ if Position < Integer(FCount) then
+ System.Move(fMemory^[Position + 1], fMemory^[Position],
+ (Integer(fCount) - Position) * SizeOf(Pointer));
+ end {if Position >= 0} else Result := nil
+end;
+
+{Add a new value in the list}
+procedure TPngPointerList.Add(Value: Pointer);
+begin
+ Count := Count + 1;
+ Item[Count - 1] := Value;
+end;
+
+
+{Object being destroyed}
+destructor TPngPointerList.Destroy;
+begin
+ {Release memory if needed}
+ if fMemory <> nil then
+ FreeMem(fMemory, fCount * sizeof(Pointer));
+
+ {Free things}
+ inherited Destroy;
+end;
+
+{Returns one item from the list}
+function TPngPointerList.GetItem(Index: Cardinal): Pointer;
+begin
+ if (Index <= Count - 1) then
+ Result := fMemory[Index]
+ else
+ {In case it's out of bounds}
+ Result := nil;
+end;
+
+{Inserts a new item in the list}
+procedure TPngPointerList.Insert(Value: Pointer; Position: Cardinal);
+begin
+ if (Position < Count) then
+ begin
+ {Increase item count}
+ SetSize(Count + 1);
+ {Move other pointers}
+ if Position < Count then
+ System.Move(fMemory^[Position], fMemory^[Position + 1],
+ (Count - Position - 1) * SizeOf(Pointer));
+ {Sets item}
+ Item[Position] := Value;
+ end;
+end;
+
+{Sets one item from the list}
+procedure TPngPointerList.SetItem(Index: Cardinal; const Value: Pointer);
+begin
+ {If index is in bounds, set value}
+ if (Index <= Count - 1) then
+ fMemory[Index] := Value
+end;
+
+{This method resizes the list}
+procedure TPngPointerList.SetSize(const Size: Cardinal);
+begin
+ {Sets the size}
+ if (fMemory = nil) and (Size > 0) then
+ GetMem(fMemory, Size * SIZEOF(Pointer))
+ else
+ if Size > 0 then {Only realloc if the new size is greater than 0}
+ ReallocMem(fMemory, Size * SIZEOF(Pointer))
+ else
+ {In case user is resize to 0 items}
+ begin
+ FreeMem(fMemory);
+ fMemory := nil;
+ end;
+ {Update count}
+ fCount := Size;
+end;
+
+{TPNGList implementation}
+
+{Removes an item}
+procedure TPNGList.RemoveChunk(Chunk: TChunk);
+begin
+ Remove(Chunk);
+ Chunk.Free
+end;
+
+{Add a new item}
+function TPNGList.Add(ChunkClass: TChunkClass): TChunk;
+var
+ IHDR: TChunkIHDR;
+ IEND: TChunkIEND;
+
+ IDAT: TChunkIDAT;
+ PLTE: TChunkPLTE;
+begin
+ Result := nil; {Default result}
+ {Adding these is not allowed}
+ if (ChunkClass = TChunkIHDR) or (ChunkClass = TChunkIDAT) or
+ (ChunkClass = TChunkPLTE) or (ChunkClass = TChunkIEND) then
+ fOwner.RaiseError(EPngError, EPNGCannotAddChunkText)
+ {Two of these is not allowed}
+ else if ((ChunkClass = TChunkgAMA) and (ItemFromClass(TChunkgAMA) <> nil)) or
+ ((ChunkClass = TChunktRNS) and (ItemFromClass(TChunktRNS) <> nil)) then
+ fOwner.RaiseError(EPngError, EPNGCannotAddChunkText)
+ {There must have an IEND and IHDR chunk}
+ else if (ItemFromClass(TChunkIEND) = nil) or
+ (ItemFromClass(TChunkIHDR) = nil) then
+ fOwner.RaiseError(EPngError, EPNGCannotAddInvalidImageText)
+ else
+ begin
+ {Get common chunks}
+ IHDR := ItemFromClass(TChunkIHDR) as TChunkIHDR;
+ IEND := ItemFromClass(TChunkIEND) as TChunkIEND;
+ {Create new chunk}
+ Result := ChunkClass.Create(Owner);
+ {Add to the list}
+ if (ChunkClass = TChunkgAMA) then
+ Insert(Result, IHDR.Index + 1)
+ {Transparency chunk (fix by Ian Boyd)}
+ else if (ChunkClass = TChunktRNS) then
+ begin
+ {Transparecy chunk must be after PLTE; before IDAT}
+ IDAT := ItemFromClass(TChunkIDAT) as TChunkIDAT;
+ PLTE := ItemFromClass(TChunkPLTE) as TChunkPLTE;
+
+ if Assigned(PLTE) then
+ Insert(Result, PLTE.Index + 1)
+ else if Assigned(IDAT) then
+ Insert(Result, IDAT.Index)
+ else
+ Insert(Result, IHDR.Index + 1)
+ end
+ else {All other chunks}
+ Insert(Result, IEND.Index);
+ end {if}
+end;
+
+{Returns item from the list}
+function TPNGList.GetItem(Index: Cardinal): TChunk;
+begin
+ Result := inherited GetItem(Index);
+end;
+
+{Returns first item from the list using the class from parameter}
+function TPNGList.ItemFromClass(ChunkClass: TChunkClass): TChunk;
+var
+ i: Integer;
+begin
+ Result := nil; {Initial result}
+ FOR i := 0 TO Count - 1 DO
+ {Test if this item has the same class}
+ if Item[i] is ChunkClass then
+ begin
+ {Returns this item and exit}
+ Result := Item[i];
+ break;
+ end {if}
+end;
+
+{$IFNDEF UseDelphi}
+
+ {TStream implementation}
+
+ {Copies all from another stream}
+ function TStream.CopyFrom(Source: TStream; Count: Cardinal): Cardinal;
+ const
+ MaxBytes = $f000;
+ var
+ Buffer: PChar;
+ BufSize, N: Cardinal;
+ begin
+ {If count is zero, copy everything from Source}
+ if Count = 0 then
+ begin
+ Source.Seek(0, soFromBeginning);
+ Count := Source.Size;
+ end;
+
+ Result := Count; {Returns the number of bytes readed}
+ {Allocates memory}
+ if Count > MaxBytes then BufSize := MaxBytes else BufSize := Count;
+ GetMem(Buffer, BufSize);
+
+ {Copy memory}
+ while Count > 0 do
+ begin
+ if Count > BufSize then N := BufSize else N := Count;
+ Source.Read(Buffer^, N);
+ Write(Buffer^, N);
+ dec(Count, N);
+ end;
+
+ {Deallocates memory}
+ FreeMem(Buffer, BufSize);
+ end;
+
+{Set current stream position}
+procedure TStream.SetPosition(const Value: Longint);
+begin
+ Seek(Value, soFromBeginning);
+end;
+
+{Returns position}
+function TStream.GetPosition: Longint;
+begin
+ Result := Seek(0, soFromCurrent);
+end;
+
+ {Returns stream size}
+function TStream.GetSize: Longint;
+ var
+ Pos: Cardinal;
+ begin
+ Pos := Seek(0, soFromCurrent);
+ Result := Seek(0, soFromEnd);
+ Seek(Pos, soFromCurrent);
+ end;
+
+ {TFileStream implementation}
+
+ {Filestream object being created}
+ constructor TFileStream.Create(Filename: String; Mode: TFileStreamModeSet);
+ {Makes file mode}
+ function OpenMode: DWORD;
+ begin
+ Result := 0;
+ if fsmRead in Mode then Result := GENERIC_READ;
+ if (fsmWrite in Mode) or (fsmCreate in Mode) then
+ Result := Result OR GENERIC_WRITE;
+ end;
+ const
+ IsCreate: Array[Boolean] of Integer = (OPEN_ALWAYS, CREATE_ALWAYS);
+ begin
+ {Call ancestor}
+ inherited Create;
+
+ {Create handle}
+ fHandle := CreateFile(PChar(Filename), OpenMode, FILE_SHARE_READ or
+ FILE_SHARE_WRITE, nil, IsCreate[fsmCreate in Mode], 0, 0);
+ {Store mode}
+ FileMode := Mode;
+ end;
+
+ {Filestream object being destroyed}
+ destructor TFileStream.Destroy;
+ begin
+ {Terminates file and close}
+ if FileMode = [fsmWrite] then
+ SetEndOfFile(fHandle);
+ CloseHandle(fHandle);
+
+ {Call ancestor}
+ inherited Destroy;
+ end;
+
+ {Writes data to the file}
+ function TFileStream.Write(const Buffer; Count: Longint): Cardinal;
+ begin
+ if not WriteFile(fHandle, Buffer, Count, Result, nil) then
+ Result := 0;
+ end;
+
+ {Reads data from the file}
+ function TFileStream.Read(var Buffer; Count: Longint): Cardinal;
+ begin
+ if not ReadFile(fHandle, Buffer, Count, Result, nil) then
+ Result := 0;
+ end;
+
+ {Seeks the file position}
+ function TFileStream.Seek(Offset: Integer; Origin: Word): Longint;
+ begin
+ Result := SetFilePointer(fHandle, Offset, nil, Origin);
+ end;
+
+ {Sets the size of the file}
+ procedure TFileStream.SetSize(const Value: Longint);
+ begin
+ Seek(Value, soFromBeginning);
+ SetEndOfFile(fHandle);
+ end;
+
+ {TResourceStream implementation}
+
+ {Creates the resource stream}
+ constructor TResourceStream.Create(Instance: HInst; const ResName: String;
+ ResType: PChar);
+ var
+ ResID: HRSRC;
+ ResGlobal: HGlobal;
+ begin
+ {Obtains the resource ID}
+ ResID := FindResource(hInstance, PChar(ResName), RT_RCDATA);
+ if ResID = 0 then raise EPNGError.Create('');
+ {Obtains memory and size}
+ ResGlobal := LoadResource(hInstance, ResID);
+ Size := SizeOfResource(hInstance, ResID);
+ Memory := LockResource(ResGlobal);
+ if (ResGlobal = 0) or (Memory = nil) then EPNGError.Create('');
+ end;
+
+
+ {Setting resource stream size is not supported}
+ procedure TResourceStream.SetSize(const Value: Integer);
+ begin
+ end;
+
+ {Writing into a resource stream is not supported}
+ function TResourceStream.Write(const Buffer; Count: Integer): Cardinal;
+ begin
+ Result := 0;
+ end;
+
+ {Reads data from the stream}
+ function TResourceStream.Read(var Buffer; Count: Integer): Cardinal;
+ begin
+ //Returns data
+ CopyMemory(@Buffer, pointer(Longint(Memory) + Position), Count);
+ //Update position
+ inc(Position, Count);
+ //Returns
+ Result := Count;
+ end;
+
+ {Seeks data}
+ function TResourceStream.Seek(Offset: Integer; Origin: Word): Longint;
+ begin
+ {Move depending on the origin}
+ case Origin of
+ soFromBeginning: Position := Offset;
+ soFromCurrent: inc(Position, Offset);
+ soFromEnd: Position := Size + Offset;
+ end;
+
+ {Returns the current position}
+ Result := Position;
+ end;
+
+{$ENDIF}
+
+{TChunk implementation}
+
+{Resizes the data}
+procedure TChunk.ResizeData(const NewSize: Cardinal);
+begin
+ fDataSize := NewSize;
+ ReallocMem(fData, NewSize + 1);
+end;
+
+{Returns index from list}
+function TChunk.GetIndex: Integer;
+var
+ i: Integer;
+begin
+ Result := -1; {Avoiding warnings}
+ {Searches in the list}
+ FOR i := 0 TO Owner.Chunks.Count - 1 DO
+ if Owner.Chunks.Item[i] = Self then
+ begin
+ {Found match}
+ Result := i;
+ exit;
+ end {for i}
+end;
+
+{Returns pointer to the TChunkIHDR}
+function TChunk.GetHeader: TChunkIHDR;
+begin
+ Result := Owner.Chunks.Item[0] as TChunkIHDR;
+end;
+
+{Assigns from another TChunk}
+procedure TChunk.Assign(Source: TChunk);
+begin
+ {Copy properties}
+ fName := Source.fName;
+ {Set data size and realloc}
+ ResizeData(Source.fDataSize);
+
+ {Copy data (if there's any)}
+ if fDataSize > 0 then CopyMemory(fData, Source.fData, fDataSize);
+end;
+
+{Chunk being created}
+constructor TChunk.Create(Owner: TPngObject);
+var
+ ChunkName: String;
+begin
+ {Ancestor create}
+ inherited Create;
+
+ {If it's a registered class, set the chunk name based on the class}
+ {name. For instance, if the class name is TChunkgAMA, the GAMA part}
+ {will become the chunk name}
+ ChunkName := Copy(ClassName, Length('TChunk') + 1, Length(ClassName));
+ if Length(ChunkName) = 4 then CopyMemory(@fName[0], @ChunkName[1], 4);
+
+ {Initialize data holder}
+ GetMem(fData, 1);
+ fDataSize := 0;
+ {Record owner}
+ fOwner := Owner;
+end;
+
+{Chunk being destroyed}
+destructor TChunk.Destroy;
+begin
+ {Free data holder}
+ FreeMem(fData, fDataSize + 1);
+ {Let ancestor destroy}
+ inherited Destroy;
+end;
+
+{Returns the chunk name 1}
+function TChunk.GetChunkName: String;
+begin
+ Result := fName
+end;
+
+{Returns the chunk name 2}
+class function TChunk.GetName: String;
+begin
+ {For avoid writing GetName for each TChunk descendent, by default for}
+ {classes which don't declare GetName, it will look for the class name}
+ {to extract the chunk kind. Example, if the class name is TChunkIEND }
+ {this method extracts and returns IEND}
+ Result := Copy(ClassName, Length('TChunk') + 1, Length(ClassName));
+end;
+
+{Saves the data to the stream}
+function TChunk.SaveData(Stream: TStream): Boolean;
+var
+ ChunkSize, ChunkCRC: Cardinal;
+begin
+ {First, write the size for the following data in the chunk}
+ ChunkSize := ByteSwap(DataSize);
+ Stream.Write(ChunkSize, 4);
+ {The chunk name}
+ Stream.Write(fName, 4);
+ {If there is data for the chunk, write it}
+ if DataSize > 0 then Stream.Write(Data^, DataSize);
+ {Calculates and write CRC}
+ ChunkCRC := update_crc($ffffffff, @fName[0], 4);
+ ChunkCRC := Byteswap(update_crc(ChunkCRC, Data, DataSize) xor $ffffffff);
+ Stream.Write(ChunkCRC, 4);
+
+ {Returns that everything went ok}
+ Result := TRUE;
+end;
+
+{Saves the chunk to the stream}
+function TChunk.SaveToStream(Stream: TStream): Boolean;
+begin
+ Result := SaveData(Stream)
+end;
+
+
+{Loads the chunk from a stream}
+function TChunk.LoadFromStream(Stream: TStream; const ChunkName: TChunkName;
+ Size: Integer): Boolean;
+var
+ CheckCRC: Cardinal;
+ {$IFDEF CheckCRC}RightCRC: Cardinal;{$ENDIF}
+begin
+ {Copies data from source}
+ ResizeData(Size);
+ if Size > 0 then Stream.Read(fData^, Size);
+ {Reads CRC}
+ Stream.Read(CheckCRC, 4);
+ CheckCrc := ByteSwap(CheckCRC);
+
+ {Check if crc readed is valid}
+ {$IFDEF CheckCRC}
+ RightCRC := update_crc($ffffffff, @ChunkName[0], 4);
+ RightCRC := update_crc(RightCRC, fData, Size) xor $ffffffff;
+ Result := RightCRC = CheckCrc;
+
+ {Handle CRC error}
+ if not Result then
+ begin
+ {In case it coult not load chunk}
+ Owner.RaiseError(EPngInvalidCRC, EPngInvalidCRCText);
+ exit;
+ end
+ {$ELSE}Result := TRUE; {$ENDIF}
+
+end;
+
+{TChunktIME implementation}
+
+{Chunk being loaded from a stream}
+function TChunktIME.LoadFromStream(Stream: TStream;
+ const ChunkName: TChunkName; Size: Integer): Boolean;
+begin
+ {Let ancestor load the data}
+ Result := inherited LoadFromStream(Stream, ChunkName, Size);
+ if not Result or (Size <> 7) then exit; {Size must be 7}
+
+ {Reads data}
+ fYear := ((pByte(Longint(Data) )^) * 256)+ (pByte(Longint(Data) + 1)^);
+ fMonth := pByte(Longint(Data) + 2)^;
+ fDay := pByte(Longint(Data) + 3)^;
+ fHour := pByte(Longint(Data) + 4)^;
+ fMinute := pByte(Longint(Data) + 5)^;
+ fSecond := pByte(Longint(Data) + 6)^;
+end;
+
+{Saving the chunk to a stream}
+function TChunktIME.SaveToStream(Stream: TStream): Boolean;
+begin
+ {Update data}
+ ResizeData(7); {Make sure the size is 7}
+ pWord(Data)^ := Year;
+ pByte(Longint(Data) + 2)^ := Month;
+ pByte(Longint(Data) + 3)^ := Day;
+ pByte(Longint(Data) + 4)^ := Hour;
+ pByte(Longint(Data) + 5)^ := Minute;
+ pByte(Longint(Data) + 6)^ := Second;
+
+ {Let inherited save data}
+ Result := inherited SaveToStream(Stream);
+end;
+
+{TChunkztXt implementation}
+
+{Loading the chunk from a stream}
+function TChunkzTXt.LoadFromStream(Stream: TStream;
+ const ChunkName: TChunkName; Size: Integer): Boolean;
+var
+ ErrorOutput: String;
+ CompressionMethod: Byte;
+ Output: Pointer;
+ OutputSize: Integer;
+begin
+ {Load data from stream and validate}
+ Result := inherited LoadFromStream(Stream, ChunkName, Size);
+ if not Result or (Size < 4) then exit;
+ fKeyword := PChar(Data); {Get keyword and compression method bellow}
+ CompressionMethod := pByte(Longint(fKeyword) + Length(fKeyword))^;
+ fText := '';
+
+ {In case the compression is 0 (only one accepted by specs), reads it}
+ if CompressionMethod = 0 then
+ begin
+ Output := nil;
+ if DecompressZLIB(PChar(Longint(Data) + Length(fKeyword) + 2),
+ Size - Length(fKeyword) - 2, Output, OutputSize, ErrorOutput) then
+ begin
+ SetLength(fText, OutputSize);
+ CopyMemory(@fText[1], Output, OutputSize);
+ end {if DecompressZLIB(...};
+ FreeMem(Output);
+ end {if CompressionMethod = 0}
+
+end;
+
+{Saving the chunk to a stream}
+function TChunkztXt.SaveToStream(Stream: TStream): Boolean;
+var
+ Output: Pointer;
+ OutputSize: Integer;
+ ErrorOutput: String;
+begin
+ Output := nil; {Initializes output}
+ if fText = '' then fText := ' ';
+
+ {Compresses the data}
+ if CompressZLIB(@fText[1], Length(fText), Owner.CompressionLevel, Output,
+ OutputSize, ErrorOutput) then
+ begin
+ {Size is length from keyword, plus a null character to divide}
+ {plus the compression method, plus the length of the text (zlib compressed)}
+ ResizeData(Length(fKeyword) + 2 + OutputSize);
+
+ Fillchar(Data^, DataSize, #0);
+ {Copies the keyword data}
+ if Keyword <> '' then
+ CopyMemory(Data, @fKeyword[1], Length(Keyword));
+ {Compression method 0 (inflate/deflate)}
+ pByte(pointer(Longint(Data) + Length(Keyword) + 1))^ := 0;
+ if OutputSize > 0 then
+ CopyMemory(pointer(Longint(Data) + Length(Keyword) + 2), Output, OutputSize);
+
+ {Let ancestor calculate crc and save}
+ Result := SaveData(Stream);
+ end {if CompressZLIB(...} else Result := False;
+
+ {Frees output}
+ if Output <> nil then FreeMem(Output)
+end;
+
+{TChunktEXt implementation}
+
+{Assigns from another text chunk}
+procedure TChunktEXt.Assign(Source: TChunk);
+begin
+ fKeyword := TChunktEXt(Source).fKeyword;
+ fText := TChunktEXt(Source).fText;
+end;
+
+{Loading the chunk from a stream}
+function TChunktEXt.LoadFromStream(Stream: TStream;
+ const ChunkName: TChunkName; Size: Integer): Boolean;
+begin
+ {Load data from stream and validate}
+ Result := inherited LoadFromStream(Stream, ChunkName, Size);
+ if not Result or (Size < 3) then exit;
+ {Get text}
+ fKeyword := PChar(Data);
+ SetLength(fText, Size - Length(fKeyword) - 1);
+ CopyMemory(@fText[1], pointer(Longint(Data) + Length(fKeyword) + 1), Length(fText));
+end;
+
+{Saving the chunk to a stream}
+function TChunktEXt.SaveToStream(Stream: TStream): Boolean;
+begin
+ {Size is length from keyword, plus a null character to divide}
+ {plus the length of the text}
+ ResizeData(Length(fKeyword) + 1 + Length(fText));
+ Fillchar(Data^, DataSize, #0);
+ {Copy data}
+ if Keyword <> '' then
+ CopyMemory(Data, @fKeyword[1], Length(Keyword));
+ if Text <> '' then
+ CopyMemory(pointer(Longint(Data) + Length(Keyword) + 1), @fText[1], Length(Text));
+ {Let ancestor calculate crc and save}
+ Result := inherited SaveToStream(Stream);
+end;
+
+
+{TChunkIHDR implementation}
+
+{Chunk being created}
+constructor TChunkIHDR.Create(Owner: TPngObject);
+begin
+ {Call inherited}
+ inherited Create(Owner);
+ {Prepare pointers}
+ ImageHandle := 0;
+ ImageDC := 0;
+end;
+
+{Chunk being destroyed}
+destructor TChunkIHDR.Destroy;
+begin
+ {Free memory}
+ FreeImageData();
+
+ {Calls TChunk destroy}
+ inherited Destroy;
+end;
+
+{Assigns from another IHDR chunk}
+procedure TChunkIHDR.Assign(Source: TChunk);
+begin
+ {Copy the IHDR data}
+ if Source is TChunkIHDR then
+ begin
+ {Copy IHDR values}
+ IHDRData := TChunkIHDR(Source).IHDRData;
+
+ {Prepare to hold data by filling BitmapInfo structure and}
+ {resizing ImageData and ImageAlpha memory allocations}
+ PrepareImageData();
+
+ {Copy image data}
+ CopyMemory(ImageData, TChunkIHDR(Source).ImageData,
+ BytesPerRow * Integer(Height));
+ CopyMemory(ImageAlpha, TChunkIHDR(Source).ImageAlpha,
+ Integer(Width) * Integer(Height));
+
+ {Copy palette colors}
+ BitmapInfo.bmiColors := TChunkIHDR(Source).BitmapInfo.bmiColors;
+ end
+ else
+ Owner.RaiseError(EPNGError, EPNGCannotAssignChunkText);
+end;
+
+{Release allocated image data}
+procedure TChunkIHDR.FreeImageData;
+begin
+ {Free old image data}
+ if ImageHandle <> 0 then DeleteObject(ImageHandle);
+ if ImageDC <> 0 then DeleteDC(ImageDC);
+ if ImageAlpha <> nil then FreeMem(ImageAlpha);
+ {$IFDEF Store16bits}
+ if ExtraImageData <> nil then FreeMem(ExtraImageData);
+ {$ENDIF}
+ ImageHandle := 0; ImageDC := 0; ImageAlpha := nil; ImageData := nil;
+end;
+
+{Chunk being loaded from a stream}
+function TChunkIHDR.LoadFromStream(Stream: TStream; const ChunkName: TChunkName;
+ Size: Integer): Boolean;
+begin
+ {Let TChunk load it}
+ Result := inherited LoadFromStream(Stream, ChunkName, Size);
+ if not Result then Exit;
+
+ {Now check values}
+ {Note: It's recommended by png specification to make sure that the size}
+ {must be 13 bytes to be valid, but some images with 14 bytes were found}
+ {which could be loaded by internet explorer and other tools}
+ if (fDataSize < SIZEOF(TIHdrData)) then
+ begin
+ {Ihdr must always have at least 13 bytes}
+ Result := False;
+ Owner.RaiseError(EPNGInvalidIHDR, EPNGInvalidIHDRText);
+ exit;
+ end;
+
+ {Everything ok, reads IHDR}
+ IHDRData := pIHDRData(fData)^;
+ IHDRData.Width := ByteSwap(IHDRData.Width);
+ IHDRData.Height := ByteSwap(IHDRData.Height);
+
+ {The width and height must not be larger than 65535 pixels}
+ if (IHDRData.Width > High(Word)) or (IHDRData.Height > High(Word)) then
+ begin
+ Result := False;
+ Owner.RaiseError(EPNGSizeExceeds, EPNGSizeExceedsText);
+ exit;
+ end {if IHDRData.Width > High(Word)};
+ {Compression method must be 0 (inflate/deflate)}
+ if (IHDRData.CompressionMethod <> 0) then
+ begin
+ Result := False;
+ Owner.RaiseError(EPNGUnknownCompression, EPNGUnknownCompressionText);
+ exit;
+ end;
+ {Interlace must be either 0 (none) or 7 (adam7)}
+ if (IHDRData.InterlaceMethod <> 0) and (IHDRData.InterlaceMethod <> 1) then
+ begin
+ Result := False;
+ Owner.RaiseError(EPNGUnknownInterlace, EPNGUnknownInterlaceText);
+ exit;
+ end;
+
+ {Updates owner properties}
+ Owner.InterlaceMethod := TInterlaceMethod(IHDRData.InterlaceMethod);
+
+ {Prepares data to hold image}
+ PrepareImageData();
+end;
+
+{Saving the IHDR chunk to a stream}
+function TChunkIHDR.SaveToStream(Stream: TStream): Boolean;
+begin
+ {Ignore 2 bits images}
+ if BitDepth = 2 then BitDepth := 4;
+
+ {It needs to do is update the data with the IHDR data}
+ {structure containing the write values}
+ ResizeData(SizeOf(TIHDRData));
+ pIHDRData(fData)^ := IHDRData;
+ {..byteswap 4 byte types}
+ pIHDRData(fData)^.Width := ByteSwap(pIHDRData(fData)^.Width);
+ pIHDRData(fData)^.Height := ByteSwap(pIHDRData(fData)^.Height);
+ {..update interlace method}
+ pIHDRData(fData)^.InterlaceMethod := Byte(Owner.InterlaceMethod);
+ {..and then let the ancestor SaveToStream do the hard work}
+ Result := inherited SaveToStream(Stream);
+end;
+
+{Resizes the image data to fill the color type, bit depth, }
+{width and height parameters}
+procedure TChunkIHDR.PrepareImageData();
+
+ {Set the bitmap info}
+ procedure SetInfo(const Bitdepth: Integer; const Palette: Boolean);
+ begin
+
+ {Copy if the bitmap contain palette entries}
+ HasPalette := Palette;
+ {Initialize the structure with zeros}
+ fillchar(BitmapInfo, sizeof(BitmapInfo), #0);
+ {Fill the strucutre}
+ with BitmapInfo.bmiHeader do
+ begin
+ biSize := sizeof(TBitmapInfoHeader);
+ biHeight := Height;
+ biWidth := Width;
+ biPlanes := 1;
+ biBitCount := BitDepth;
+ biCompression := BI_RGB;
+ end {with BitmapInfo.bmiHeader}
+ end;
+begin
+ {Prepare bitmap info header}
+ Fillchar(BitmapInfo, sizeof(TMaxBitmapInfo), #0);
+ {Release old image data}
+ FreeImageData();
+
+ {Obtain number of bits for each pixel}
+ case ColorType of
+ COLOR_GRAYSCALE, COLOR_PALETTE, COLOR_GRAYSCALEALPHA:
+ case BitDepth of
+ {These are supported by windows}
+ 1, 4, 8: SetInfo(BitDepth, TRUE);
+ {2 bits for each pixel is not supported by windows bitmap}
+ 2 : SetInfo(4, TRUE);
+ {Also 16 bits (2 bytes) for each pixel is not supported}
+ {and should be transormed into a 8 bit grayscale}
+ 16 : SetInfo(8, TRUE);
+ end;
+ {Only 1 byte (8 bits) is supported}
+ COLOR_RGB, COLOR_RGBALPHA: SetInfo(24, FALSE);
+ end {case ColorType};
+ {Number of bytes for each scanline}
+ BytesPerRow := (((BitmapInfo.bmiHeader.biBitCount * Width) + 31)
+ and not 31) div 8;
+
+ {Build array for alpha information, if necessary}
+ if (ColorType = COLOR_RGBALPHA) or (ColorType = COLOR_GRAYSCALEALPHA) then
+ begin
+ GetMem(ImageAlpha, Integer(Width) * Integer(Height));
+ FillChar(ImageAlpha^, Integer(Width) * Integer(Height), #0);
+ end;
+
+ {Build array for extra byte information}
+ {$IFDEF Store16bits}
+ if (BitDepth = 16) then
+ begin
+ GetMem(ExtraImageData, BytesPerRow * Integer(Height));
+ FillChar(ExtraImageData^, BytesPerRow * Integer(Height), #0);
+ end;
+ {$ENDIF}
+
+ {Creates the image to hold the data, CreateDIBSection does a better}
+ {work in allocating necessary memory}
+ ImageDC := CreateCompatibleDC(0);
+ ImageHandle := CreateDIBSection(ImageDC, pBitmapInfo(@BitmapInfo)^,
+ DIB_RGB_COLORS, ImageData, 0, 0);
+
+ {Clears the old palette (if any)}
+ with Owner do
+ if TempPalette <> 0 then
+ begin
+ DeleteObject(TempPalette);
+ TempPalette := 0;
+ end {with Owner, if TempPalette <> 0};
+
+ {Build array and allocate bytes for each row}
+ zeromemory(ImageData, BytesPerRow * Integer(Height));
+end;
+
+{TChunktRNS implementation}
+
+{$IFNDEF UseDelphi}
+function CompareMem(P1, P2: pByte; const Size: Integer): Boolean;
+var i: Integer;
+begin
+ Result := True;
+ for i := 1 to Size do
+ begin
+ if P1^ <> P2^ then Result := False;
+ inc(P1); inc(P2);
+ end {for i}
+end;
+{$ENDIF}
+
+{Sets the transpararent color}
+procedure TChunktRNS.SetTransparentColor(const Value: ColorRef);
+var
+ i: Byte;
+ LookColor: TRGBQuad;
+begin
+ {Clears the palette values}
+ Fillchar(PaletteValues, SizeOf(PaletteValues), #0);
+ {Sets that it uses bit transparency}
+ fBitTransparency := True;
+
+
+ {Depends on the color type}
+ with Header do
+ case ColorType of
+ COLOR_GRAYSCALE:
+ begin
+ Self.ResizeData(2);
+ pWord(@PaletteValues[0])^ := ByteSwap16(GetRValue(Value));
+ end;
+ COLOR_RGB:
+ begin
+ Self.ResizeData(6);
+ pWord(@PaletteValues[0])^ := ByteSwap16(GetRValue(Value));
+ pWord(@PaletteValues[2])^ := ByteSwap16(GetGValue(Value));
+ pWord(@PaletteValues[4])^ := ByteSwap16(GetBValue(Value));
+ end;
+ COLOR_PALETTE:
+ begin
+ {Creates a RGBQuad to search for the color}
+ LookColor.rgbRed := GetRValue(Value);
+ LookColor.rgbGreen := GetGValue(Value);
+ LookColor.rgbBlue := GetBValue(Value);
+ {Look in the table for the entry}
+ for i := 0 to 255 do
+ if CompareMem(@BitmapInfo.bmiColors[i], @LookColor, 3) then
+ Break;
+ {Fill the transparency table}
+ Fillchar(PaletteValues, i, 255);
+ Self.ResizeData(i + 1)
+
+ end
+ end {case / with};
+
+end;
+
+{Returns the transparent color for the image}
+function TChunktRNS.GetTransparentColor: ColorRef;
+var
+ PaletteChunk: TChunkPLTE;
+ i: Integer;
+begin
+ Result := 0; {Default: Unknown transparent color}
+
+ {Depends on the color type}
+ with Header do
+ case ColorType of
+ COLOR_GRAYSCALE:
+ Result := RGB(PaletteValues[0], PaletteValues[0],
+ PaletteValues[0]);
+ COLOR_RGB:
+ Result := RGB(PaletteValues[1], PaletteValues[3], PaletteValues[5]);
+ COLOR_PALETTE:
+ begin
+ {Obtains the palette chunk}
+ PaletteChunk := Owner.Chunks.ItemFromClass(TChunkPLTE) as TChunkPLTE;
+
+ {Looks for an entry with 0 transparency meaning that it is the}
+ {full transparent entry}
+ for i := 0 to Self.DataSize - 1 do
+ if PaletteValues[i] = 0 then
+ with PaletteChunk.GetPaletteItem(i) do
+ begin
+ Result := RGB(rgbRed, rgbGreen, rgbBlue);
+ break
+ end
+ end {COLOR_PALETTE}
+ end {case Header.ColorType};
+end;
+
+{Saving the chunk to a stream}
+function TChunktRNS.SaveToStream(Stream: TStream): Boolean;
+begin
+ {Copy palette into data buffer}
+ if DataSize <= 256 then
+ CopyMemory(fData, @PaletteValues[0], DataSize);
+
+ Result := inherited SaveToStream(Stream);
+end;
+
+{Assigns from another chunk}
+procedure TChunktRNS.Assign(Source: TChunk);
+begin
+ CopyMemory(@PaletteValues[0], @TChunkTrns(Source).PaletteValues[0], 256);
+ fBitTransparency := TChunkTrns(Source).fBitTransparency;
+ inherited Assign(Source);
+end;
+
+{Loads the chunk from a stream}
+function TChunktRNS.LoadFromStream(Stream: TStream; const ChunkName: TChunkName;
+ Size: Integer): Boolean;
+var
+ i, Differ255: Integer;
+begin
+ {Let inherited load}
+ Result := inherited LoadFromStream(Stream, ChunkName, Size);
+
+ if not Result then Exit;
+
+ {Make sure size is correct}
+ if Size > 256 then Owner.RaiseError(EPNGInvalidPalette,
+ EPNGInvalidPaletteText);
+
+ {The unset items should have value 255}
+ Fillchar(PaletteValues[0], 256, 255);
+ {Copy the other values}
+ CopyMemory(@PaletteValues[0], fData, Size);
+
+ {Create the mask if needed}
+ case Header.ColorType of
+ {Mask for grayscale and RGB}
+ COLOR_RGB, COLOR_GRAYSCALE: fBitTransparency := True;
+ COLOR_PALETTE:
+ begin
+ Differ255 := 0; {Count the entries with a value different from 255}
+ {Tests if it uses bit transparency}
+ for i := 0 to Size - 1 do
+ if PaletteValues[i] <> 255 then inc(Differ255);
+
+ {If it has one value different from 255 it is a bit transparency}
+ fBitTransparency := (Differ255 = 1);
+ end {COLOR_PALETTE}
+ end {case Header.ColorType};
+
+end;
+
+{Prepares the image palette}
+procedure TChunkIDAT.PreparePalette;
+var
+ Entries: Word;
+ j : Integer;
+begin
+ {In case the image uses grayscale, build a grayscale palette}
+ with Header do
+ if (ColorType = COLOR_GRAYSCALE) or (ColorType = COLOR_GRAYSCALEALPHA) then
+ begin
+ {Calculate total number of palette entries}
+ Entries := (1 shl Byte(BitmapInfo.bmiHeader.biBitCount));
+
+ FOR j := 0 TO Entries - 1 DO
+ with BitmapInfo.bmiColors[j] do
+ begin
+
+ {Calculate each palette entry}
+ rgbRed := fOwner.GammaTable[MulDiv(j, 255, Entries - 1)];
+ rgbGreen := rgbRed;
+ rgbBlue := rgbRed;
+ end {with BitmapInfo.bmiColors[j]}
+ end {if ColorType = COLOR_GRAYSCALE..., with Header}
+end;
+
+{Reads from ZLIB}
+function TChunkIDAT.IDATZlibRead(var ZLIBStream: TZStreamRec2;
+ Buffer: Pointer; Count: Integer; var EndPos: Integer;
+ var crcfile: Cardinal): Integer;
+var
+ ProcResult : Integer;
+ IDATHeader : Array[0..3] of char;
+ IDATCRC : Cardinal;
+begin
+ {Uses internal record pointed by ZLIBStream to gather information}
+ with ZLIBStream, ZLIBStream.zlib do
+ begin
+ {Set the buffer the zlib will read into}
+ next_out := Buffer;
+ avail_out := Count;
+
+ {Decode until it reach the Count variable}
+ while avail_out > 0 do
+ begin
+ {In case it needs more data and it's in the end of a IDAT chunk,}
+ {it means that there are more IDAT chunks}
+ if (fStream.Position = EndPos) and (avail_out > 0) and
+ (avail_in = 0) then
+ begin
+ {End this chunk by reading and testing the crc value}
+ fStream.Read(IDATCRC, 4);
+
+ {$IFDEF CheckCRC}
+ if crcfile xor $ffffffff <> Cardinal(ByteSwap(IDATCRC)) then
+ begin
+ Result := -1;
+ Owner.RaiseError(EPNGInvalidCRC, EPNGInvalidCRCText);
+ exit;
+ end;
+ {$ENDIF}
+
+ {Start reading the next chunk}
+ fStream.Read(EndPos, 4); {Reads next chunk size}
+ fStream.Read(IDATHeader[0], 4); {Next chunk header}
+ {It must be a IDAT chunk since image data is required and PNG}
+ {specification says that multiple IDAT chunks must be consecutive}
+ if IDATHeader <> 'IDAT' then
+ begin
+ Owner.RaiseError(EPNGMissingMultipleIDAT, EPNGMissingMultipleIDATText);
+ result := -1;
+ exit;
+ end;
+
+ {Calculate chunk name part of the crc}
+ {$IFDEF CheckCRC}
+ crcfile := update_crc($ffffffff, @IDATHeader[0], 4);
+ {$ENDIF}
+ EndPos := fStream.Position + ByteSwap(EndPos);
+ end;
+
+
+ {In case it needs compressed data to read from}
+ if avail_in = 0 then
+ begin
+ {In case it's trying to read more than it is avaliable}
+ if fStream.Position + ZLIBAllocate > EndPos then
+ avail_in := fStream.Read(Data^, EndPos - fStream.Position)
+ else
+ avail_in := fStream.Read(Data^, ZLIBAllocate);
+ {Update crc}
+ {$IFDEF CheckCRC}
+ crcfile := update_crc(crcfile, Data, avail_in);
+ {$ENDIF}
+
+ {In case there is no more compressed data to read from}
+ if avail_in = 0 then
+ begin
+ Result := Count - avail_out;
+ Exit;
+ end;
+
+ {Set next buffer to read and record current position}
+ next_in := Data;
+
+ end {if avail_in = 0};
+
+ ProcResult := inflate(zlib, 0);
+
+ {In case the result was not sucessfull}
+ if (ProcResult < 0) then
+ begin
+ Result := -1;
+ Owner.RaiseError(EPNGZLIBError,
+ EPNGZLIBErrorText + zliberrors[procresult]);
+ exit;
+ end;
+
+ end {while avail_out > 0};
+
+ end {with};
+
+ {If everything gone ok, it returns the count bytes}
+ Result := Count;
+end;
+
+{TChunkIDAT implementation}
+
+const
+ {Adam 7 interlacing values}
+ RowStart: array[0..6] of Integer = (0, 0, 4, 0, 2, 0, 1);
+ ColumnStart: array[0..6] of Integer = (0, 4, 0, 2, 0, 1, 0);
+ RowIncrement: array[0..6] of Integer = (8, 8, 8, 4, 4, 2, 2);
+ ColumnIncrement: array[0..6] of Integer = (8, 8, 4, 4, 2, 2, 1);
+
+{Copy interlaced images with 1 byte for R, G, B}
+procedure TChunkIDAT.CopyInterlacedRGB8(const Pass: Byte;
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+var
+ Col: Integer;
+begin
+ {Get first column and enter in loop}
+ Col := ColumnStart[Pass];
+ Dest := pChar(Longint(Dest) + Col * 3);
+ repeat
+ {Copy this row}
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 2)^]; inc(Dest);
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 1)^]; inc(Dest);
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) )^]; inc(Dest);
+
+ {Move to next column}
+ inc(Src, 3);
+ inc(Dest, ColumnIncrement[Pass] * 3 - 3);
+ inc(Col, ColumnIncrement[Pass]);
+ until Col >= ImageWidth;
+end;
+
+{Copy interlaced images with 2 bytes for R, G, B}
+procedure TChunkIDAT.CopyInterlacedRGB16(const Pass: Byte;
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+var
+ Col: Integer;
+begin
+ {Get first column and enter in loop}
+ Col := ColumnStart[Pass];
+ Dest := pChar(Longint(Dest) + Col * 3);
+ repeat
+ {Copy this row}
+ Byte(Dest^) := Owner.GammaTable[pByte(Longint(Src) + 4)^]; inc(Dest);
+ Byte(Dest^) := Owner.GammaTable[pByte(Longint(Src) + 2)^]; inc(Dest);
+ Byte(Dest^) := Owner.GammaTable[pByte(Longint(Src) )^]; inc(Dest);
+ {$IFDEF Store16bits}
+ {Copy extra pixel values}
+ Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 5)^]; inc(Extra);
+ Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 3)^]; inc(Extra);
+ Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 1)^]; inc(Extra);
+ {$ENDIF}
+
+ {Move to next column}
+ inc(Src, 6);
+ inc(Dest, ColumnIncrement[Pass] * 3 - 3);
+ inc(Col, ColumnIncrement[Pass]);
+ until Col >= ImageWidth;
+end;
+
+{Copy ímages with palette using bit depths 1, 4 or 8}
+procedure TChunkIDAT.CopyInterlacedPalette148(const Pass: Byte;
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+const
+ BitTable: Array[1..8] of Integer = ($1, $3, 0, $F, 0, 0, 0, $FF);
+ StartBit: Array[1..8] of Integer = (7 , 0 , 0, 4, 0, 0, 0, 0);
+var
+ CurBit, Col: Integer;
+ Dest2: PChar;
+begin
+ {Get first column and enter in loop}
+ Col := ColumnStart[Pass];
+ repeat
+ {Copy data}
+ CurBit := StartBit[Header.BitDepth];
+ repeat
+ {Adjust pointer to pixel byte bounds}
+ Dest2 := pChar(Longint(Dest) + (Header.BitDepth * Col) div 8);
+ {Copy data}
+ Byte(Dest2^) := Byte(Dest2^) or
+ ( ((Byte(Src^) shr CurBit) and BitTable[Header.BitDepth])
+ shl (StartBit[Header.BitDepth] - (Col * Header.BitDepth mod 8)));
+
+ {Move to next column}
+ inc(Col, ColumnIncrement[Pass]);
+ {Will read next bits}
+ dec(CurBit, Header.BitDepth);
+ until CurBit < 0;
+
+ {Move to next byte in source}
+ inc(Src);
+ until Col >= ImageWidth;
+end;
+
+{Copy ímages with palette using bit depth 2}
+procedure TChunkIDAT.CopyInterlacedPalette2(const Pass: Byte; Src, Dest,
+ Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+var
+ CurBit, Col: Integer;
+ Dest2: PChar;
+begin
+ {Get first column and enter in loop}
+ Col := ColumnStart[Pass];
+ repeat
+ {Copy data}
+ CurBit := 6;
+ repeat
+ {Adjust pointer to pixel byte bounds}
+ Dest2 := pChar(Longint(Dest) + Col div 2);
+ {Copy data}
+ Byte(Dest2^) := Byte(Dest2^) or (((Byte(Src^) shr CurBit) and $3)
+ shl (4 - (4 * Col) mod 8));
+ {Move to next column}
+ inc(Col, ColumnIncrement[Pass]);
+ {Will read next bits}
+ dec(CurBit, 2);
+ until CurBit < 0;
+
+ {Move to next byte in source}
+ inc(Src);
+ until Col >= ImageWidth;
+end;
+
+{Copy ímages with grayscale using bit depth 2}
+procedure TChunkIDAT.CopyInterlacedGray2(const Pass: Byte;
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+var
+ CurBit, Col: Integer;
+ Dest2: PChar;
+begin
+ {Get first column and enter in loop}
+ Col := ColumnStart[Pass];
+ repeat
+ {Copy data}
+ CurBit := 6;
+ repeat
+ {Adjust pointer to pixel byte bounds}
+ Dest2 := pChar(Longint(Dest) + Col div 2);
+ {Copy data}
+ Byte(Dest2^) := Byte(Dest2^) or ((((Byte(Src^) shr CurBit) shl 2) and $F)
+ shl (4 - (Col*4) mod 8));
+ {Move to next column}
+ inc(Col, ColumnIncrement[Pass]);
+ {Will read next bits}
+ dec(CurBit, 2);
+ until CurBit < 0;
+
+ {Move to next byte in source}
+ inc(Src);
+ until Col >= ImageWidth;
+end;
+
+{Copy ímages with palette using 2 bytes for each pixel}
+procedure TChunkIDAT.CopyInterlacedGrayscale16(const Pass: Byte;
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+var
+ Col: Integer;
+begin
+ {Get first column and enter in loop}
+ Col := ColumnStart[Pass];
+ Dest := pChar(Longint(Dest) + Col);
+ repeat
+ {Copy this row}
+ Dest^ := Src^; inc(Dest);
+ {$IFDEF Store16bits}
+ Extra^ := pChar(Longint(Src) + 1)^; inc(Extra);
+ {$ENDIF}
+
+ {Move to next column}
+ inc(Src, 2);
+ inc(Dest, ColumnIncrement[Pass] - 1);
+ inc(Col, ColumnIncrement[Pass]);
+ until Col >= ImageWidth;
+end;
+
+{Decodes interlaced RGB alpha with 1 byte for each sample}
+procedure TChunkIDAT.CopyInterlacedRGBAlpha8(const Pass: Byte;
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+var
+ Col: Integer;
+begin
+ {Get first column and enter in loop}
+ Col := ColumnStart[Pass];
+ Dest := pChar(Longint(Dest) + Col * 3);
+ Trans := pChar(Longint(Trans) + Col);
+ repeat
+ {Copy this row and alpha value}
+ Trans^ := pChar(Longint(Src) + 3)^;
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 2)^]; inc(Dest);
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 1)^]; inc(Dest);
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) )^]; inc(Dest);
+
+ {Move to next column}
+ inc(Src, 4);
+ inc(Dest, ColumnIncrement[Pass] * 3 - 3);
+ inc(Trans, ColumnIncrement[Pass]);
+ inc(Col, ColumnIncrement[Pass]);
+ until Col >= ImageWidth;
+end;
+
+{Decodes interlaced RGB alpha with 2 bytes for each sample}
+procedure TChunkIDAT.CopyInterlacedRGBAlpha16(const Pass: Byte;
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+var
+ Col: Integer;
+begin
+ {Get first column and enter in loop}
+ Col := ColumnStart[Pass];
+ Dest := pChar(Longint(Dest) + Col * 3);
+ Trans := pChar(Longint(Trans) + Col);
+ repeat
+ {Copy this row and alpha value}
+ Trans^ := pChar(Longint(Src) + 6)^;
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 4)^]; inc(Dest);
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 2)^]; inc(Dest);
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) )^]; inc(Dest);
+ {$IFDEF Store16bits}
+ {Copy extra pixel values}
+ Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 5)^]; inc(Extra);
+ Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 3)^]; inc(Extra);
+ Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 1)^]; inc(Extra);
+ {$ENDIF}
+
+ {Move to next column}
+ inc(Src, 8);
+ inc(Dest, ColumnIncrement[Pass] * 3 - 3);
+ inc(Trans, ColumnIncrement[Pass]);
+ inc(Col, ColumnIncrement[Pass]);
+ until Col >= ImageWidth;
+end;
+
+{Decodes 8 bit grayscale image followed by an alpha sample}
+procedure TChunkIDAT.CopyInterlacedGrayscaleAlpha8(const Pass: Byte;
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+var
+ Col: Integer;
+begin
+ {Get first column, pointers to the data and enter in loop}
+ Col := ColumnStart[Pass];
+ Dest := pChar(Longint(Dest) + Col);
+ Trans := pChar(Longint(Trans) + Col);
+ repeat
+ {Copy this grayscale value and alpha}
+ Dest^ := Src^; inc(Src);
+ Trans^ := Src^; inc(Src);
+
+ {Move to next column}
+ inc(Dest, ColumnIncrement[Pass]);
+ inc(Trans, ColumnIncrement[Pass]);
+ inc(Col, ColumnIncrement[Pass]);
+ until Col >= ImageWidth;
+end;
+
+{Decodes 16 bit grayscale image followed by an alpha sample}
+procedure TChunkIDAT.CopyInterlacedGrayscaleAlpha16(const Pass: Byte;
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+var
+ Col: Integer;
+begin
+ {Get first column, pointers to the data and enter in loop}
+ Col := ColumnStart[Pass];
+ Dest := pChar(Longint(Dest) + Col);
+ Trans := pChar(Longint(Trans) + Col);
+ repeat
+ {$IFDEF Store16bits}
+ Extra^ := pChar(Longint(Src) + 1)^; inc(Extra);
+ {$ENDIF}
+ {Copy this grayscale value and alpha, transforming 16 bits into 8}
+ Dest^ := Src^; inc(Src, 2);
+ Trans^ := Src^; inc(Src, 2);
+
+ {Move to next column}
+ inc(Dest, ColumnIncrement[Pass]);
+ inc(Trans, ColumnIncrement[Pass]);
+ inc(Col, ColumnIncrement[Pass]);
+ until Col >= ImageWidth;
+end;
+
+{Decodes an interlaced image}
+procedure TChunkIDAT.DecodeInterlacedAdam7(Stream: TStream;
+ var ZLIBStream: TZStreamRec2; const Size: Integer; var crcfile: Cardinal);
+var
+ CurrentPass: Byte;
+ PixelsThisRow: Integer;
+ CurrentRow: Integer;
+ Trans, Data{$IFDEF Store16bits}, Extra{$ENDIF}: pChar;
+ CopyProc: procedure(const Pass: Byte; Src, Dest,
+ Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar) of object;
+begin
+
+ CopyProc := nil; {Initialize}
+ {Determine method to copy the image data}
+ case Header.ColorType of
+ {R, G, B values for each pixel}
+ COLOR_RGB:
+ case Header.BitDepth of
+ 8: CopyProc := CopyInterlacedRGB8;
+ 16: CopyProc := CopyInterlacedRGB16;
+ end {case Header.BitDepth};
+ {Palette}
+ COLOR_PALETTE, COLOR_GRAYSCALE:
+ case Header.BitDepth of
+ 1, 4, 8: CopyProc := CopyInterlacedPalette148;
+ 2 : if Header.ColorType = COLOR_PALETTE then
+ CopyProc := CopyInterlacedPalette2
+ else
+ CopyProc := CopyInterlacedGray2;
+ 16 : CopyProc := CopyInterlacedGrayscale16;
+ end;
+ {RGB followed by alpha}
+ COLOR_RGBALPHA:
+ case Header.BitDepth of
+ 8: CopyProc := CopyInterlacedRGBAlpha8;
+ 16: CopyProc := CopyInterlacedRGBAlpha16;
+ end;
+ {Grayscale followed by alpha}
+ COLOR_GRAYSCALEALPHA:
+ case Header.BitDepth of
+ 8: CopyProc := CopyInterlacedGrayscaleAlpha8;
+ 16: CopyProc := CopyInterlacedGrayscaleAlpha16;
+ end;
+ end {case Header.ColorType};
+
+ {Adam7 method has 7 passes to make the final image}
+ FOR CurrentPass := 0 TO 6 DO
+ begin
+ {Calculates the number of pixels and bytes for this pass row}
+ PixelsThisRow := (ImageWidth - ColumnStart[CurrentPass] +
+ ColumnIncrement[CurrentPass] - 1) div ColumnIncrement[CurrentPass];
+ Row_Bytes := BytesForPixels(PixelsThisRow, Header.ColorType,
+ Header.BitDepth);
+ {Clear buffer for this pass}
+ ZeroMemory(Row_Buffer[not RowUsed], Row_Bytes);
+
+ {Get current row index}
+ CurrentRow := RowStart[CurrentPass];
+ {Get a pointer to the current row image data}
+ Data := pointer(Longint(Header.ImageData) + Header.BytesPerRow * (ImageHeight - 1 - CurrentRow));
+ Trans := pointer(Longint(Header.ImageAlpha) + ImageWidth * CurrentRow);
+ {$IFDEF Store16bits}
+ Extra := pointer(Longint(Header.ExtraImageData) + Header.BytesPerRow * (ImageHeight - 1 - CurrentRow));
+ {$ENDIF}
+
+ if Row_Bytes > 0 then {There must have bytes for this interlaced pass}
+ while CurrentRow < ImageHeight do
+ begin
+ {Reads this line and filter}
+ if IDATZlibRead(ZLIBStream, @Row_Buffer[RowUsed][0], Row_Bytes + 1,
+ EndPos, CRCFile) = 0 then break;
+
+ FilterRow;
+ {Copy image data}
+
+ CopyProc(CurrentPass, @Row_Buffer[RowUsed][1], Data, Trans
+ {$IFDEF Store16bits}, Extra{$ENDIF});
+
+ {Use the other RowBuffer item}
+ RowUsed := not RowUsed;
+
+ {Move to the next row}
+ inc(CurrentRow, RowIncrement[CurrentPass]);
+ {Move pointer to the next line}
+ dec(Data, RowIncrement[CurrentPass] * Header.BytesPerRow);
+ inc(Trans, RowIncrement[CurrentPass] * ImageWidth);
+ {$IFDEF Store16bits}
+ dec(Extra, RowIncrement[CurrentPass] * Header.BytesPerRow);
+ {$ENDIF}
+ end {while CurrentRow < ImageHeight};
+
+ end {FOR CurrentPass};
+
+end;
+
+{Copy 8 bits RGB image}
+procedure TChunkIDAT.CopyNonInterlacedRGB8(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+var
+ I: Integer;
+begin
+ FOR I := 1 TO ImageWidth DO
+ begin
+ {Copy pixel values}
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 2)^]; inc(Dest);
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 1)^]; inc(Dest);
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) )^]; inc(Dest);
+ {Move to next pixel}
+ inc(Src, 3);
+ end {for I}
+end;
+
+{Copy 16 bits RGB image}
+procedure TChunkIDAT.CopyNonInterlacedRGB16(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+var
+ I: Integer;
+begin
+ FOR I := 1 TO ImageWidth DO
+ begin
+ //Since windows does not supports 2 bytes for
+ //each R, G, B value, the method will read only 1 byte from it
+ {Copy pixel values}
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 4)^]; inc(Dest);
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 2)^]; inc(Dest);
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) )^]; inc(Dest);
+ {$IFDEF Store16bits}
+ {Copy extra pixel values}
+ Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 5)^]; inc(Extra);
+ Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 3)^]; inc(Extra);
+ Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 1)^]; inc(Extra);
+ {$ENDIF}
+
+ {Move to next pixel}
+ inc(Src, 6);
+ end {for I}
+end;
+
+{Copy types using palettes (1, 4 or 8 bits per pixel)}
+procedure TChunkIDAT.CopyNonInterlacedPalette148(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+begin
+ {It's simple as copying the data}
+ CopyMemory(Dest, Src, Row_Bytes);
+end;
+
+{Copy grayscale types using 2 bits for each pixel}
+procedure TChunkIDAT.CopyNonInterlacedGray2(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+var
+ i: Integer;
+begin
+ {2 bits is not supported, this routine will converted into 4 bits}
+ FOR i := 1 TO Row_Bytes do
+ begin
+ Byte(Dest^) := ((Byte(Src^) shr 2) and $F) or ((Byte(Src^)) and $F0); inc(Dest);
+ Byte(Dest^) := ((Byte(Src^) shl 2) and $F) or ((Byte(Src^) shl 4) and $F0); inc(Dest);
+ inc(Src);
+ end {FOR i}
+end;
+
+{Copy types using palette with 2 bits for each pixel}
+procedure TChunkIDAT.CopyNonInterlacedPalette2(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+var
+ i: Integer;
+begin
+ {2 bits is not supported, this routine will converted into 4 bits}
+ FOR i := 1 TO Row_Bytes do
+ begin
+ Byte(Dest^) := ((Byte(Src^) shr 4) and $3) or ((Byte(Src^) shr 2) and $30); inc(Dest);
+ Byte(Dest^) := (Byte(Src^) and $3) or ((Byte(Src^) shl 2) and $30); inc(Dest);
+ inc(Src);
+ end {FOR i}
+end;
+
+{Copy grayscale images with 16 bits}
+procedure TChunkIDAT.CopyNonInterlacedGrayscale16(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+var
+ I: Integer;
+begin
+ FOR I := 1 TO ImageWidth DO
+ begin
+ {Windows does not supports 16 bits for each pixel in grayscale}
+ {mode, so reduce to 8}
+ Dest^ := Src^; inc(Dest);
+ {$IFDEF Store16bits}
+ Extra^ := pChar(Longint(Src) + 1)^; inc(Extra);
+ {$ENDIF}
+
+ {Move to next pixel}
+ inc(Src, 2);
+ end {for I}
+end;
+
+{Copy 8 bits per sample RGB images followed by an alpha byte}
+procedure TChunkIDAT.CopyNonInterlacedRGBAlpha8(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+var
+ i: Integer;
+begin
+ FOR I := 1 TO ImageWidth DO
+ begin
+ {Copy pixel values and transparency}
+ Trans^ := pChar(Longint(Src) + 3)^;
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 2)^]; inc(Dest);
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 1)^]; inc(Dest);
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) )^]; inc(Dest);
+ {Move to next pixel}
+ inc(Src, 4); inc(Trans);
+ end {for I}
+end;
+
+{Copy 16 bits RGB image with alpha using 2 bytes for each sample}
+procedure TChunkIDAT.CopyNonInterlacedRGBAlpha16(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+var
+ I: Integer;
+begin
+ FOR I := 1 TO ImageWidth DO
+ begin
+ //Copy rgb and alpha values (transforming from 16 bits to 8 bits)
+ {Copy pixel values}
+ Trans^ := pChar(Longint(Src) + 6)^;
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 4)^]; inc(Dest);
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) + 2)^]; inc(Dest);
+ Byte(Dest^) := fOwner.GammaTable[pByte(Longint(Src) )^]; inc(Dest);
+ {$IFDEF Store16bits}
+ {Copy extra pixel values}
+ Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 5)^]; inc(Extra);
+ Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 3)^]; inc(Extra);
+ Byte(Extra^) := fOwner.GammaTable[pByte(Longint(Src) + 1)^]; inc(Extra);
+ {$ENDIF}
+ {Move to next pixel}
+ inc(Src, 8); inc(Trans);
+ end {for I}
+end;
+
+{Copy 8 bits per sample grayscale followed by alpha}
+procedure TChunkIDAT.CopyNonInterlacedGrayscaleAlpha8(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+var
+ I: Integer;
+begin
+ FOR I := 1 TO ImageWidth DO
+ begin
+ {Copy alpha value and then gray value}
+ Dest^ := Src^; inc(Src);
+ Trans^ := Src^; inc(Src);
+ inc(Dest); inc(Trans);
+ end;
+end;
+
+{Copy 16 bits per sample grayscale followed by alpha}
+procedure TChunkIDAT.CopyNonInterlacedGrayscaleAlpha16(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar);
+var
+ I: Integer;
+begin
+ FOR I := 1 TO ImageWidth DO
+ begin
+ {Copy alpha value and then gray value}
+ {$IFDEF Store16bits}
+ Extra^ := pChar(Longint(Src) + 1)^; inc(Extra);
+ {$ENDIF}
+ Dest^ := Src^; inc(Src, 2);
+ Trans^ := Src^; inc(Src, 2);
+ inc(Dest); inc(Trans);
+ end;
+end;
+
+{Decode non interlaced image}
+procedure TChunkIDAT.DecodeNonInterlaced(Stream: TStream;
+ var ZLIBStream: TZStreamRec2; const Size: Integer; var crcfile: Cardinal);
+var
+ j: Cardinal;
+ Trans, Data{$IFDEF Store16bits}, Extra{$ENDIF}: pChar;
+ CopyProc: procedure(
+ Src, Dest, Trans{$IFDEF Store16bits}, Extra{$ENDIF}: pChar) of object;
+begin
+ CopyProc := nil; {Initialize}
+ {Determines the method to copy the image data}
+ case Header.ColorType of
+ {R, G, B values}
+ COLOR_RGB:
+ case Header.BitDepth of
+ 8: CopyProc := CopyNonInterlacedRGB8;
+ 16: CopyProc := CopyNonInterlacedRGB16;
+ end;
+ {Types using palettes}
+ COLOR_PALETTE, COLOR_GRAYSCALE:
+ case Header.BitDepth of
+ 1, 4, 8: CopyProc := CopyNonInterlacedPalette148;
+ 2 : if Header.ColorType = COLOR_PALETTE then
+ CopyProc := CopyNonInterlacedPalette2
+ else
+ CopyProc := CopyNonInterlacedGray2;
+ 16 : CopyProc := CopyNonInterlacedGrayscale16;
+ end;
+ {R, G, B followed by alpha}
+ COLOR_RGBALPHA:
+ case Header.BitDepth of
+ 8 : CopyProc := CopyNonInterlacedRGBAlpha8;
+ 16 : CopyProc := CopyNonInterlacedRGBAlpha16;
+ end;
+ {Grayscale followed by alpha}
+ COLOR_GRAYSCALEALPHA:
+ case Header.BitDepth of
+ 8 : CopyProc := CopyNonInterlacedGrayscaleAlpha8;
+ 16 : CopyProc := CopyNonInterlacedGrayscaleAlpha16;
+ end;
+ end;
+
+ {Get the image data pointer}
+ Longint(Data) := Longint(Header.ImageData) +
+ Header.BytesPerRow * (ImageHeight - 1);
+ Trans := Header.ImageAlpha;
+ {$IFDEF Store16bits}
+ Longint(Extra) := Longint(Header.ExtraImageData) +
+ Header.BytesPerRow * (ImageHeight - 1);
+ {$ENDIF}
+ {Reads each line}
+ FOR j := 0 to ImageHeight - 1 do
+ begin
+ {Read this line Row_Buffer[RowUsed][0] if the filter type for this line}
+ if IDATZlibRead(ZLIBStream, @Row_Buffer[RowUsed][0], Row_Bytes + 1, EndPos,
+ CRCFile) = 0 then break;
+
+ {Filter the current row}
+ FilterRow;
+ {Copies non interlaced row to image}
+ CopyProc(@Row_Buffer[RowUsed][1], Data, Trans{$IFDEF Store16bits}, Extra
+ {$ENDIF});
+
+ {Invert line used}
+ RowUsed := not RowUsed;
+ dec(Data, Header.BytesPerRow);
+ {$IFDEF Store16bits}dec(Extra, Header.BytesPerRow);{$ENDIF}
+ inc(Trans, ImageWidth);
+ end {for I};
+
+
+end;
+
+{Filter the current line}
+procedure TChunkIDAT.FilterRow;
+var
+ pp: Byte;
+ vv, left, above, aboveleft: Integer;
+ Col: Cardinal;
+begin
+ {Test the filter}
+ case Row_Buffer[RowUsed]^[0] of
+ {No filtering for this line}
+ FILTER_NONE: begin end;
+ {AND 255 serves only to never let the result be larger than one byte}
+ {Sub filter}
+ FILTER_SUB:
+ FOR Col := Offset + 1 to Row_Bytes DO
+ Row_Buffer[RowUsed][Col] := (Row_Buffer[RowUsed][Col] +
+ Row_Buffer[RowUsed][Col - Offset]) and 255;
+ {Up filter}
+ FILTER_UP:
+ FOR Col := 1 to Row_Bytes DO
+ Row_Buffer[RowUsed][Col] := (Row_Buffer[RowUsed][Col] +
+ Row_Buffer[not RowUsed][Col]) and 255;
+ {Average filter}
+ FILTER_AVERAGE:
+ FOR Col := 1 to Row_Bytes DO
+ begin
+ {Obtains up and left pixels}
+ above := Row_Buffer[not RowUsed][Col];
+ if col - 1 < Offset then
+ left := 0
+ else
+ Left := Row_Buffer[RowUsed][Col - Offset];
+
+ {Calculates}
+ Row_Buffer[RowUsed][Col] := (Row_Buffer[RowUsed][Col] +
+ (left + above) div 2) and 255;
+ end;
+ {Paeth filter}
+ FILTER_PAETH:
+ begin
+ {Initialize}
+ left := 0;
+ aboveleft := 0;
+ {Test each byte}
+ FOR Col := 1 to Row_Bytes DO
+ begin
+ {Obtains above pixel}
+ above := Row_Buffer[not RowUsed][Col];
+ {Obtains left and top-left pixels}
+ if (col - 1 >= offset) Then
+ begin
+ left := row_buffer[RowUsed][col - offset];
+ aboveleft := row_buffer[not RowUsed][col - offset];
+ end;
+
+ {Obtains current pixel and paeth predictor}
+ vv := row_buffer[RowUsed][Col];
+ pp := PaethPredictor(left, above, aboveleft);
+
+ {Calculates}
+ Row_Buffer[RowUsed][Col] := (pp + vv) and $FF;
+ end {for};
+ end;
+
+ end {case};
+end;
+
+{Reads the image data from the stream}
+function TChunkIDAT.LoadFromStream(Stream: TStream; const ChunkName: TChunkName;
+ Size: Integer): Boolean;
+var
+ ZLIBStream: TZStreamRec2;
+ CRCCheck,
+ CRCFile : Cardinal;
+begin
+ {Get pointer to the header chunk}
+ Header := Owner.Chunks.Item[0] as TChunkIHDR;
+ {Build palette if necessary}
+ if Header.HasPalette then PreparePalette();
+
+ {Copy image width and height}
+ ImageWidth := Header.Width;
+ ImageHeight := Header.Height;
+
+ {Initialize to calculate CRC}
+ {$IFDEF CheckCRC}
+ CRCFile := update_crc($ffffffff, @ChunkName[0], 4);
+ {$ENDIF}
+
+ Owner.GetPixelInfo(Row_Bytes, Offset); {Obtain line information}
+ ZLIBStream := ZLIBInitInflate(Stream); {Initializes decompression}
+
+ {Calculate ending position for the current IDAT chunk}
+ EndPos := Stream.Position + Size;
+
+ {Allocate memory}
+ GetMem(Row_Buffer[false], Row_Bytes + 1);
+ GetMem(Row_Buffer[true], Row_Bytes + 1);
+ ZeroMemory(Row_Buffer[false], Row_bytes + 1);
+ {Set the variable to alternate the Row_Buffer item to use}
+ RowUsed := TRUE;
+
+ {Call special methods for the different interlace methods}
+ case Owner.InterlaceMethod of
+ imNone: DecodeNonInterlaced(stream, ZLIBStream, Size, crcfile);
+ imAdam7: DecodeInterlacedAdam7(stream, ZLIBStream, size, crcfile);
+ end;
+
+ {Free memory}
+ ZLIBTerminateInflate(ZLIBStream); {Terminates decompression}
+ FreeMem(Row_Buffer[False], Row_Bytes + 1);
+ FreeMem(Row_Buffer[True], Row_Bytes + 1);
+
+ {Now checks CRC}
+ Stream.Read(CRCCheck, 4);
+ {$IFDEF CheckCRC}
+ CRCFile := CRCFile xor $ffffffff;
+ CRCCheck := ByteSwap(CRCCheck);
+ Result := CRCCheck = CRCFile;
+
+ {Handle CRC error}
+ if not Result then
+ begin
+ {In case it coult not load chunk}
+ Owner.RaiseError(EPngInvalidCRC, EPngInvalidCRCText);
+ exit;
+ end;
+ {$ELSE}Result := TRUE; {$ENDIF}
+end;
+
+const
+ IDATHeader: Array[0..3] of char = ('I', 'D', 'A', 'T');
+ BUFFER = 5;
+
+{Saves the IDAT chunk to a stream}
+function TChunkIDAT.SaveToStream(Stream: TStream): Boolean;
+var
+ ZLIBStream : TZStreamRec2;
+begin
+ {Get pointer to the header chunk}
+ Header := Owner.Chunks.Item[0] as TChunkIHDR;
+ {Copy image width and height}
+ ImageWidth := Header.Width;
+ ImageHeight := Header.Height;
+ Owner.GetPixelInfo(Row_Bytes, Offset); {Obtain line information}
+
+ {Allocate memory}
+ GetMem(Encode_Buffer[BUFFER], Row_Bytes);
+ ZeroMemory(Encode_Buffer[BUFFER], Row_Bytes);
+ {Allocate buffers for the filters selected}
+ {Filter none will always be calculated to the other filters to work}
+ GetMem(Encode_Buffer[FILTER_NONE], Row_Bytes);
+ ZeroMemory(Encode_Buffer[FILTER_NONE], Row_Bytes);
+ if pfSub in Owner.Filters then
+ GetMem(Encode_Buffer[FILTER_SUB], Row_Bytes);
+ if pfUp in Owner.Filters then
+ GetMem(Encode_Buffer[FILTER_UP], Row_Bytes);
+ if pfAverage in Owner.Filters then
+ GetMem(Encode_Buffer[FILTER_AVERAGE], Row_Bytes);
+ if pfPaeth in Owner.Filters then
+ GetMem(Encode_Buffer[FILTER_PAETH], Row_Bytes);
+
+ {Initialize ZLIB}
+ ZLIBStream := ZLIBInitDeflate(Stream, Owner.fCompressionLevel,
+ Owner.MaxIdatSize);
+ {Write data depending on the interlace method}
+ case Owner.InterlaceMethod of
+ imNone: EncodeNonInterlaced(stream, ZLIBStream);
+ imAdam7: EncodeInterlacedAdam7(stream, ZLIBStream);
+ end;
+ {Terminates ZLIB}
+ ZLIBTerminateDeflate(ZLIBStream);
+
+ {Release allocated memory}
+ FreeMem(Encode_Buffer[BUFFER], Row_Bytes);
+ FreeMem(Encode_Buffer[FILTER_NONE], Row_Bytes);
+ if pfSub in Owner.Filters then
+ FreeMem(Encode_Buffer[FILTER_SUB], Row_Bytes);
+ if pfUp in Owner.Filters then
+ FreeMem(Encode_Buffer[FILTER_UP], Row_Bytes);
+ if pfAverage in Owner.Filters then
+ FreeMem(Encode_Buffer[FILTER_AVERAGE], Row_Bytes);
+ if pfPaeth in Owner.Filters then
+ FreeMem(Encode_Buffer[FILTER_PAETH], Row_Bytes);
+
+ {Everything went ok}
+ Result := True;
+end;
+
+{Writes the IDAT using the settings}
+procedure WriteIDAT(Stream: TStream; Data: Pointer; const Length: Cardinal);
+var
+ ChunkLen, CRC: Cardinal;
+begin
+ {Writes IDAT header}
+ ChunkLen := ByteSwap(Length);
+ Stream.Write(ChunkLen, 4); {Chunk length}
+ Stream.Write(IDATHeader[0], 4); {Idat header}
+ CRC := update_crc($ffffffff, @IDATHeader[0], 4); {Crc part for header}
+
+ {Writes IDAT data and calculates CRC for data}
+ Stream.Write(Data^, Length);
+ CRC := Byteswap(update_crc(CRC, Data, Length) xor $ffffffff);
+ {Writes final CRC}
+ Stream.Write(CRC, 4);
+end;
+
+{Compress and writes IDAT chunk data}
+procedure TChunkIDAT.IDATZlibWrite(var ZLIBStream: TZStreamRec2;
+ Buffer: Pointer; const Length: Cardinal);
+begin
+ with ZLIBStream, ZLIBStream.ZLIB do
+ begin
+ {Set data to be compressed}
+ next_in := Buffer;
+ avail_in := Length;
+
+ {Compress all the data avaliable to compress}
+ while avail_in > 0 do
+ begin
+ deflate(ZLIB, Z_NO_FLUSH);
+
+ {The whole buffer was used, save data to stream and restore buffer}
+ if avail_out = 0 then
+ begin
+ {Writes this IDAT chunk}
+ WriteIDAT(fStream, Data, ZLIBAllocate);
+
+ {Restore buffer}
+ next_out := Data;
+ avail_out := ZLIBAllocate;
+ end {if avail_out = 0};
+
+ end {while avail_in};
+
+ end {with ZLIBStream, ZLIBStream.ZLIB}
+end;
+
+{Finishes compressing data to write IDAT chunk}
+procedure TChunkIDAT.FinishIDATZlib(var ZLIBStream: TZStreamRec2);
+begin
+ with ZLIBStream, ZLIBStream.ZLIB do
+ begin
+ {Set data to be compressed}
+ next_in := nil;
+ avail_in := 0;
+
+ while deflate(ZLIB,Z_FINISH) <> Z_STREAM_END do
+ begin
+ {Writes this IDAT chunk}
+ WriteIDAT(fStream, Data, ZLIBAllocate - avail_out);
+ {Re-update buffer}
+ next_out := Data;
+ avail_out := ZLIBAllocate;
+ end;
+
+ if avail_out < ZLIBAllocate then
+ {Writes final IDAT}
+ WriteIDAT(fStream, Data, ZLIBAllocate - avail_out);
+
+ end {with ZLIBStream, ZLIBStream.ZLIB};
+end;
+
+{Copy memory to encode RGB image with 1 byte for each color sample}
+procedure TChunkIDAT.EncodeNonInterlacedRGB8(Src, Dest, Trans: pChar);
+var
+ I: Integer;
+begin
+ FOR I := 1 TO ImageWidth DO
+ begin
+ {Copy pixel values}
+ Byte(Dest^) := fOwner.InverseGamma[pByte(Longint(Src) + 2)^]; inc(Dest);
+ Byte(Dest^) := fOwner.InverseGamma[pByte(Longint(Src) + 1)^]; inc(Dest);
+ Byte(Dest^) := fOwner.InverseGamma[pByte(Longint(Src) )^]; inc(Dest);
+ {Move to next pixel}
+ inc(Src, 3);
+ end {for I}
+end;
+
+{Copy memory to encode RGB images with 16 bits for each color sample}
+procedure TChunkIDAT.EncodeNonInterlacedRGB16(Src, Dest, Trans: pChar);
+var
+ I: Integer;
+begin
+ FOR I := 1 TO ImageWidth DO
+ begin
+ //Now we copy from 1 byte for each sample stored to a 2 bytes (or 1 word)
+ //for sample
+ {Copy pixel values}
+ pWORD(Dest)^ := fOwner.InverseGamma[pByte(Longint(Src) + 2)^]; inc(Dest, 2);
+ pWORD(Dest)^ := fOwner.InverseGamma[pByte(Longint(Src) + 1)^]; inc(Dest, 2);
+ pWORD(Dest)^ := fOwner.InverseGamma[pByte(Longint(Src) )^]; inc(Dest, 2);
+ {Move to next pixel}
+ inc(Src, 3);
+ end {for I}
+
+end;
+
+{Copy memory to encode types using palettes (1, 4 or 8 bits per pixel)}
+procedure TChunkIDAT.EncodeNonInterlacedPalette148(Src, Dest, Trans: pChar);
+begin
+ {It's simple as copying the data}
+ CopyMemory(Dest, Src, Row_Bytes);
+end;
+
+{Copy memory to encode grayscale images with 2 bytes for each sample}
+procedure TChunkIDAT.EncodeNonInterlacedGrayscale16(Src, Dest, Trans: pChar);
+var
+ I: Integer;
+begin
+ FOR I := 1 TO ImageWidth DO
+ begin
+ //Now we copy from 1 byte for each sample stored to a 2 bytes (or 1 word)
+ //for sample
+ pWORD(Dest)^ := pByte(Longint(Src))^; inc(Dest, 2);
+ {Move to next pixel}
+ inc(Src);
+ end {for I}
+end;
+
+{Encode images using RGB followed by an alpha value using 1 byte for each}
+procedure TChunkIDAT.EncodeNonInterlacedRGBAlpha8(Src, Dest, Trans: pChar);
+var
+ i: Integer;
+begin
+ {Copy the data to the destination, including data from Trans pointer}
+ FOR i := 1 TO ImageWidth do
+ begin
+ Byte(Dest^) := Owner.InverseGamma[PByte(Longint(Src) + 2)^]; inc(Dest);
+ Byte(Dest^) := Owner.InverseGamma[PByte(Longint(Src) + 1)^]; inc(Dest);
+ Byte(Dest^) := Owner.InverseGamma[PByte(Longint(Src) )^]; inc(Dest);
+ Dest^ := Trans^; inc(Dest);
+ inc(Src, 3); inc(Trans);
+ end {for i};
+end;
+
+{Encode images using RGB followed by an alpha value using 2 byte for each}
+procedure TChunkIDAT.EncodeNonInterlacedRGBAlpha16(Src, Dest, Trans: pChar);
+var
+ i: Integer;
+begin
+ {Copy the data to the destination, including data from Trans pointer}
+ FOR i := 1 TO ImageWidth do
+ begin
+ pWord(Dest)^ := Owner.InverseGamma[PByte(Longint(Src) + 2)^]; inc(Dest, 2);
+ pWord(Dest)^ := Owner.InverseGamma[PByte(Longint(Src) + 1)^]; inc(Dest, 2);
+ pWord(Dest)^ := Owner.InverseGamma[PByte(Longint(Src) )^]; inc(Dest, 2);
+ pWord(Dest)^ := PByte(Longint(Trans) )^; inc(Dest, 2);
+ inc(Src, 3); inc(Trans);
+ end {for i};
+end;
+
+{Encode grayscale images followed by an alpha value using 1 byte for each}
+procedure TChunkIDAT.EncodeNonInterlacedGrayscaleAlpha8(
+ Src, Dest, Trans: pChar);
+var
+ i: Integer;
+begin
+ {Copy the data to the destination, including data from Trans pointer}
+ FOR i := 1 TO ImageWidth do
+ begin
+ Dest^ := Src^; inc(Dest);
+ Dest^ := Trans^; inc(Dest);
+ inc(Src); inc(Trans);
+ end {for i};
+end;
+
+{Encode grayscale images followed by an alpha value using 2 byte for each}
+procedure TChunkIDAT.EncodeNonInterlacedGrayscaleAlpha16(
+ Src, Dest, Trans: pChar);
+var
+ i: Integer;
+begin
+ {Copy the data to the destination, including data from Trans pointer}
+ FOR i := 1 TO ImageWidth do
+ begin
+ pWord(Dest)^ := pByte(Src)^; inc(Dest, 2);
+ pWord(Dest)^ := pByte(Trans)^; inc(Dest, 2);
+ inc(Src); inc(Trans);
+ end {for i};
+end;
+
+{Encode non interlaced images}
+procedure TChunkIDAT.EncodeNonInterlaced(Stream: TStream;
+ var ZLIBStream: TZStreamRec2);
+var
+ {Current line}
+ j: Cardinal;
+ {Pointers to image data}
+ Data, Trans: PChar;
+ {Filter used for this line}
+ Filter: Byte;
+ {Method which will copy the data into the buffer}
+ CopyProc: procedure(Src, Dest, Trans: pChar) of object;
+begin
+ CopyProc := nil; {Initialize to avoid warnings}
+ {Defines the method to copy the data to the buffer depending on}
+ {the image parameters}
+ case Header.ColorType of
+ {R, G, B values}
+ COLOR_RGB:
+ case Header.BitDepth of
+ 8: CopyProc := EncodeNonInterlacedRGB8;
+ 16: CopyProc := EncodeNonInterlacedRGB16;
+ end;
+ {Palette and grayscale values}
+ COLOR_GRAYSCALE, COLOR_PALETTE:
+ case Header.BitDepth of
+ 1, 4, 8: CopyProc := EncodeNonInterlacedPalette148;
+ 16: CopyProc := EncodeNonInterlacedGrayscale16;
+ end;
+ {RGB with a following alpha value}
+ COLOR_RGBALPHA:
+ case Header.BitDepth of
+ 8: CopyProc := EncodeNonInterlacedRGBAlpha8;
+ 16: CopyProc := EncodeNonInterlacedRGBAlpha16;
+ end;
+ {Grayscale images followed by an alpha}
+ COLOR_GRAYSCALEALPHA:
+ case Header.BitDepth of
+ 8: CopyProc := EncodeNonInterlacedGrayscaleAlpha8;
+ 16: CopyProc := EncodeNonInterlacedGrayscaleAlpha16;
+ end;
+ end {case Header.ColorType};
+
+ {Get the image data pointer}
+ Longint(Data) := Longint(Header.ImageData) +
+ Header.BytesPerRow * (ImageHeight - 1);
+ Trans := Header.ImageAlpha;
+
+ {Writes each line}
+ FOR j := 0 to ImageHeight - 1 do
+ begin
+ {Copy data into buffer}
+ CopyProc(Data, @Encode_Buffer[BUFFER][0], Trans);
+ {Filter data}
+ Filter := FilterToEncode;
+
+ {Compress data}
+ IDATZlibWrite(ZLIBStream, @Filter, 1);
+ IDATZlibWrite(ZLIBStream, @Encode_Buffer[Filter][0], Row_Bytes);
+
+ {Adjust pointers to the actual image data}
+ dec(Data, Header.BytesPerRow);
+ inc(Trans, ImageWidth);
+ end;
+
+ {Compress and finishes copying the remaining data}
+ FinishIDATZlib(ZLIBStream);
+end;
+
+{Copy memory to encode interlaced images using RGB value with 1 byte for}
+{each color sample}
+procedure TChunkIDAT.EncodeInterlacedRGB8(const Pass: Byte;
+ Src, Dest, Trans: pChar);
+var
+ Col: Integer;
+begin
+ {Get first column and enter in loop}
+ Col := ColumnStart[Pass];
+ Src := pChar(Longint(Src) + Col * 3);
+ repeat
+ {Copy this row}
+ Byte(Dest^) := fOwner.InverseGamma[pByte(Longint(Src) + 2)^]; inc(Dest);
+ Byte(Dest^) := fOwner.InverseGamma[pByte(Longint(Src) + 1)^]; inc(Dest);
+ Byte(Dest^) := fOwner.InverseGamma[pByte(Longint(Src) )^]; inc(Dest);
+
+ {Move to next column}
+ inc(Src, ColumnIncrement[Pass] * 3);
+ inc(Col, ColumnIncrement[Pass]);
+ until Col >= ImageWidth;
+end;
+
+{Copy memory to encode interlaced RGB images with 2 bytes each color sample}
+procedure TChunkIDAT.EncodeInterlacedRGB16(const Pass: Byte;
+ Src, Dest, Trans: pChar);
+var
+ Col: Integer;
+begin
+ {Get first column and enter in loop}
+ Col := ColumnStart[Pass];
+ Src := pChar(Longint(Src) + Col * 3);
+ repeat
+ {Copy this row}
+ pWord(Dest)^ := Owner.InverseGamma[pByte(Longint(Src) + 2)^]; inc(Dest, 2);
+ pWord(Dest)^ := Owner.InverseGamma[pByte(Longint(Src) + 1)^]; inc(Dest, 2);
+ pWord(Dest)^ := Owner.InverseGamma[pByte(Longint(Src) )^]; inc(Dest, 2);
+
+ {Move to next column}
+ inc(Src, ColumnIncrement[Pass] * 3);
+ inc(Col, ColumnIncrement[Pass]);
+ until Col >= ImageWidth;
+end;
+
+{Copy memory to encode interlaced images using palettes using bit depths}
+{1, 4, 8 (each pixel in the image)}
+procedure TChunkIDAT.EncodeInterlacedPalette148(const Pass: Byte;
+ Src, Dest, Trans: pChar);
+const
+ BitTable: Array[1..8] of Integer = ($1, $3, 0, $F, 0, 0, 0, $FF);
+ StartBit: Array[1..8] of Integer = (7 , 0 , 0, 4, 0, 0, 0, 0);
+var
+ CurBit, Col: Integer;
+ Src2: PChar;
+begin
+ {Clean the line}
+ fillchar(Dest^, Row_Bytes, #0);
+ {Get first column and enter in loop}
+ Col := ColumnStart[Pass];
+ with Header.BitmapInfo.bmiHeader do
+ repeat
+ {Copy data}
+ CurBit := StartBit[biBitCount];
+ repeat
+ {Adjust pointer to pixel byte bounds}
+ Src2 := pChar(Longint(Src) + (biBitCount * Col) div 8);
+ {Copy data}
+ Byte(Dest^) := Byte(Dest^) or
+ (((Byte(Src2^) shr (StartBit[Header.BitDepth] - (biBitCount * Col)
+ mod 8))) and (BitTable[biBitCount])) shl CurBit;
+
+ {Move to next column}
+ inc(Col, ColumnIncrement[Pass]);
+ {Will read next bits}
+ dec(CurBit, biBitCount);
+ until CurBit < 0;
+
+ {Move to next byte in source}
+ inc(Dest);
+ until Col >= ImageWidth;
+end;
+
+{Copy to encode interlaced grayscale images using 16 bits for each sample}
+procedure TChunkIDAT.EncodeInterlacedGrayscale16(const Pass: Byte;
+ Src, Dest, Trans: pChar);
+var
+ Col: Integer;
+begin
+ {Get first column and enter in loop}
+ Col := ColumnStart[Pass];
+ Src := pChar(Longint(Src) + Col);
+ repeat
+ {Copy this row}
+ pWord(Dest)^ := Byte(Src^); inc(Dest, 2);
+
+ {Move to next column}
+ inc(Src, ColumnIncrement[Pass]);
+ inc(Col, ColumnIncrement[Pass]);
+ until Col >= ImageWidth;
+end;
+
+{Copy to encode interlaced rgb images followed by an alpha value, all using}
+{one byte for each sample}
+procedure TChunkIDAT.EncodeInterlacedRGBAlpha8(const Pass: Byte;
+ Src, Dest, Trans: pChar);
+var
+ Col: Integer;
+begin
+ {Get first column and enter in loop}
+ Col := ColumnStart[Pass];
+ Src := pChar(Longint(Src) + Col * 3);
+ Trans := pChar(Longint(Trans) + Col);
+ repeat
+ {Copy this row}
+ Byte(Dest^) := Owner.InverseGamma[pByte(Longint(Src) + 2)^]; inc(Dest);
+ Byte(Dest^) := Owner.InverseGamma[pByte(Longint(Src) + 1)^]; inc(Dest);
+ Byte(Dest^) := Owner.InverseGamma[pByte(Longint(Src) )^]; inc(Dest);
+ Dest^ := Trans^; inc(Dest);
+
+ {Move to next column}
+ inc(Src, ColumnIncrement[Pass] * 3);
+ inc(Trans, ColumnIncrement[Pass]);
+ inc(Col, ColumnIncrement[Pass]);
+ until Col >= ImageWidth;
+end;
+
+{Copy to encode interlaced rgb images followed by an alpha value, all using}
+{two byte for each sample}
+procedure TChunkIDAT.EncodeInterlacedRGBAlpha16(const Pass: Byte;
+ Src, Dest, Trans: pChar);
+var
+ Col: Integer;
+begin
+ {Get first column and enter in loop}
+ Col := ColumnStart[Pass];
+ Src := pChar(Longint(Src) + Col * 3);
+ Trans := pChar(Longint(Trans) + Col);
+ repeat
+ {Copy this row}
+ pWord(Dest)^ := pByte(Longint(Src) + 2)^; inc(Dest, 2);
+ pWord(Dest)^ := pByte(Longint(Src) + 1)^; inc(Dest, 2);
+ pWord(Dest)^ := pByte(Longint(Src) )^; inc(Dest, 2);
+ pWord(Dest)^ := pByte(Trans)^; inc(Dest, 2);
+
+ {Move to next column}
+ inc(Src, ColumnIncrement[Pass] * 3);
+ inc(Trans, ColumnIncrement[Pass]);
+ inc(Col, ColumnIncrement[Pass]);
+ until Col >= ImageWidth;
+end;
+
+{Copy to encode grayscale interlaced images followed by an alpha value, all}
+{using 1 byte for each sample}
+procedure TChunkIDAT.EncodeInterlacedGrayscaleAlpha8(const Pass: Byte;
+ Src, Dest, Trans: pChar);
+var
+ Col: Integer;
+begin
+ {Get first column and enter in loop}
+ Col := ColumnStart[Pass];
+ Src := pChar(Longint(Src) + Col);
+ Trans := pChar(Longint(Trans) + Col);
+ repeat
+ {Copy this row}
+ Dest^ := Src^; inc(Dest);
+ Dest^ := Trans^; inc(Dest);
+
+ {Move to next column}
+ inc(Src, ColumnIncrement[Pass]);
+ inc(Trans, ColumnIncrement[Pass]);
+ inc(Col, ColumnIncrement[Pass]);
+ until Col >= ImageWidth;
+end;
+
+{Copy to encode grayscale interlaced images followed by an alpha value, all}
+{using 2 bytes for each sample}
+procedure TChunkIDAT.EncodeInterlacedGrayscaleAlpha16(const Pass: Byte;
+ Src, Dest, Trans: pChar);
+var
+ Col: Integer;
+begin
+ {Get first column and enter in loop}
+ Col := ColumnStart[Pass];
+ Src := pChar(Longint(Src) + Col);
+ Trans := pChar(Longint(Trans) + Col);
+ repeat
+ {Copy this row}
+ pWord(Dest)^ := pByte(Src)^; inc(Dest, 2);
+ pWord(Dest)^ := pByte(Trans)^; inc(Dest, 2);
+
+ {Move to next column}
+ inc(Src, ColumnIncrement[Pass]);
+ inc(Trans, ColumnIncrement[Pass]);
+ inc(Col, ColumnIncrement[Pass]);
+ until Col >= ImageWidth;
+end;
+
+{Encode interlaced images}
+procedure TChunkIDAT.EncodeInterlacedAdam7(Stream: TStream;
+ var ZLIBStream: TZStreamRec2);
+var
+ CurrentPass, Filter: Byte;
+ PixelsThisRow: Integer;
+ CurrentRow : Integer;
+ Trans, Data: pChar;
+ CopyProc: procedure(const Pass: Byte;
+ Src, Dest, Trans: pChar) of object;
+begin
+ CopyProc := nil; {Initialize to avoid warnings}
+ {Defines the method to copy the data to the buffer depending on}
+ {the image parameters}
+ case Header.ColorType of
+ {R, G, B values}
+ COLOR_RGB:
+ case Header.BitDepth of
+ 8: CopyProc := EncodeInterlacedRGB8;
+ 16: CopyProc := EncodeInterlacedRGB16;
+ end;
+ {Grayscale and palette}
+ COLOR_PALETTE, COLOR_GRAYSCALE:
+ case Header.BitDepth of
+ 1, 4, 8: CopyProc := EncodeInterlacedPalette148;
+ 16: CopyProc := EncodeInterlacedGrayscale16;
+ end;
+ {RGB followed by alpha}
+ COLOR_RGBALPHA:
+ case Header.BitDepth of
+ 8: CopyProc := EncodeInterlacedRGBAlpha8;
+ 16: CopyProc := EncodeInterlacedRGBAlpha16;
+ end;
+ COLOR_GRAYSCALEALPHA:
+ {Grayscale followed by alpha}
+ case Header.BitDepth of
+ 8: CopyProc := EncodeInterlacedGrayscaleAlpha8;
+ 16: CopyProc := EncodeInterlacedGrayscaleAlpha16;
+ end;
+ end {case Header.ColorType};
+
+ {Compress the image using the seven passes for ADAM 7}
+ FOR CurrentPass := 0 TO 6 DO
+ begin
+ {Calculates the number of pixels and bytes for this pass row}
+ PixelsThisRow := (ImageWidth - ColumnStart[CurrentPass] +
+ ColumnIncrement[CurrentPass] - 1) div ColumnIncrement[CurrentPass];
+ Row_Bytes := BytesForPixels(PixelsThisRow, Header.ColorType,
+ Header.BitDepth);
+ ZeroMemory(Encode_Buffer[FILTER_NONE], Row_Bytes);
+
+ {Get current row index}
+ CurrentRow := RowStart[CurrentPass];
+ {Get a pointer to the current row image data}
+ Data := pointer(Longint(Header.ImageData) + Header.BytesPerRow * (ImageHeight - 1 - CurrentRow));
+ Trans := pointer(Longint(Header.ImageAlpha) + ImageWidth * CurrentRow);
+
+ {Process all the image rows}
+ if Row_Bytes > 0 then
+ while CurrentRow < ImageHeight do
+ begin
+ {Copy data into buffer}
+ CopyProc(CurrentPass, Data, @Encode_Buffer[BUFFER][0], Trans);
+ {Filter data}
+ Filter := FilterToEncode;
+
+ {Compress data}
+ IDATZlibWrite(ZLIBStream, @Filter, 1);
+ IDATZlibWrite(ZLIBStream, @Encode_Buffer[Filter][0], Row_Bytes);
+
+ {Move to the next row}
+ inc(CurrentRow, RowIncrement[CurrentPass]);
+ {Move pointer to the next line}
+ dec(Data, RowIncrement[CurrentPass] * Header.BytesPerRow);
+ inc(Trans, RowIncrement[CurrentPass] * ImageWidth);
+ end {while CurrentRow < ImageHeight}
+
+ end {CurrentPass};
+
+ {Compress and finishes copying the remaining data}
+ FinishIDATZlib(ZLIBStream);
+end;
+
+{Filters the row to be encoded and returns the best filter}
+function TChunkIDAT.FilterToEncode: Byte;
+var
+ Run, LongestRun, ii, jj: Cardinal;
+ Last, Above, LastAbove: Byte;
+begin
+ {Selecting more filters using the Filters property from TPngObject}
+ {increases the chances to the file be much smaller, but decreases}
+ {the performace}
+
+ {This method will creates the same line data using the different}
+ {filter methods and select the best}
+
+ {Sub-filter}
+ if pfSub in Owner.Filters then
+ for ii := 0 to Row_Bytes - 1 do
+ begin
+ {There is no previous pixel when it's on the first pixel, so}
+ {set last as zero when in the first}
+ if (ii >= Offset) then
+ last := Encode_Buffer[BUFFER]^[ii - Offset]
+ else
+ last := 0;
+ Encode_Buffer[FILTER_SUB]^[ii] := Encode_Buffer[BUFFER]^[ii] - last;
+ end;
+
+ {Up filter}
+ if pfUp in Owner.Filters then
+ for ii := 0 to Row_Bytes - 1 do
+ Encode_Buffer[FILTER_UP]^[ii] := Encode_Buffer[BUFFER]^[ii] -
+ Encode_Buffer[FILTER_NONE]^[ii];
+
+ {Average filter}
+ if pfAverage in Owner.Filters then
+ for ii := 0 to Row_Bytes - 1 do
+ begin
+ {Get the previous pixel, if the current pixel is the first, the}
+ {previous is considered to be 0}
+ if (ii >= Offset) then
+ last := Encode_Buffer[BUFFER]^[ii - Offset]
+ else
+ last := 0;
+ {Get the pixel above}
+ above := Encode_Buffer[FILTER_NONE]^[ii];
+
+ {Calculates formula to the average pixel}
+ Encode_Buffer[FILTER_AVERAGE]^[ii] := Encode_Buffer[BUFFER]^[ii] -
+ (above + last) div 2 ;
+ end;
+
+ {Paeth filter (the slower)}
+ if pfPaeth in Owner.Filters then
+ begin
+ {Initialize}
+ last := 0;
+ lastabove := 0;
+ for ii := 0 to Row_Bytes - 1 do
+ begin
+ {In case this pixel is not the first in the line obtains the}
+ {previous one and the one above the previous}
+ if (ii >= Offset) then
+ begin
+ last := Encode_Buffer[BUFFER]^[ii - Offset];
+ lastabove := Encode_Buffer[FILTER_NONE]^[ii - Offset];
+ end;
+ {Obtains the pixel above}
+ above := Encode_Buffer[FILTER_NONE]^[ii];
+ {Calculate paeth filter for this byte}
+ Encode_Buffer[FILTER_PAETH]^[ii] := Encode_Buffer[BUFFER]^[ii] -
+ PaethPredictor(last, above, lastabove);
+ end;
+ end;
+
+ {Now calculates the same line using no filter, which is necessary}
+ {in order to have data to the filters when the next line comes}
+ CopyMemory(@Encode_Buffer[FILTER_NONE]^[0],
+ @Encode_Buffer[BUFFER]^[0], Row_Bytes);
+
+ {If only filter none is selected in the filter list, we don't need}
+ {to proceed and further}
+ if (Owner.Filters = [pfNone]) or (Owner.Filters = []) then
+ begin
+ Result := FILTER_NONE;
+ exit;
+ end {if (Owner.Filters = [pfNone...};
+
+ {Check which filter is the best by checking which has the larger}
+ {sequence of the same byte, since they are best compressed}
+ LongestRun := 0; Result := FILTER_NONE;
+ for ii := FILTER_NONE TO FILTER_PAETH do
+ {Check if this filter was selected}
+ if TFilter(ii) in Owner.Filters then
+ begin
+ Run := 0;
+ {Check if it's the only filter}
+ if Owner.Filters = [TFilter(ii)] then
+ begin
+ Result := ii;
+ exit;
+ end;
+
+ {Check using a sequence of four bytes}
+ for jj := 2 to Row_Bytes - 1 do
+ if (Encode_Buffer[ii]^[jj] = Encode_Buffer [ii]^[jj-1]) or
+ (Encode_Buffer[ii]^[jj] = Encode_Buffer [ii]^[jj-2]) then
+ inc(Run); {Count the number of sequences}
+
+ {Check if this one is the best so far}
+ if (Run > LongestRun) then
+ begin
+ Result := ii;
+ LongestRun := Run;
+ end {if (Run > LongestRun)};
+
+ end {if TFilter(ii) in Owner.Filters};
+end;
+
+{TChunkPLTE implementation}
+
+{Returns an item in the palette}
+function TChunkPLTE.GetPaletteItem(Index: Byte): TRGBQuad;
+begin
+ {Test if item is valid, if not raise error}
+ if Index > Count - 1 then
+ Owner.RaiseError(EPNGError, EPNGUnknownPalEntryText)
+ else
+ {Returns the item}
+ Result := Header.BitmapInfo.bmiColors[Index];
+end;
+
+{Loads the palette chunk from a stream}
+function TChunkPLTE.LoadFromStream(Stream: TStream;
+ const ChunkName: TChunkName; Size: Integer): Boolean;
+type
+ pPalEntry = ^PalEntry;
+ PalEntry = record r, g, b: Byte end;
+var
+ j : Integer; {For the FOR}
+ PalColor : pPalEntry;
+begin
+ {Let ancestor load data and check CRC}
+ Result := inherited LoadFromStream(Stream, ChunkName, Size);
+ if not Result then exit;
+
+ {This chunk must be divisible by 3 in order to be valid}
+ if (Size mod 3 <> 0) or (Size div 3 > 256) then
+ begin
+ {Raise error}
+ Result := FALSE;
+ Owner.RaiseError(EPNGInvalidPalette, EPNGInvalidPaletteText);
+ exit;
+ end {if Size mod 3 <> 0};
+
+ {Fill array with the palette entries}
+ fCount := Size div 3;
+ PalColor := Data;
+ FOR j := 0 TO fCount - 1 DO
+ with Header.BitmapInfo.bmiColors[j] do
+ begin
+ rgbRed := Owner.GammaTable[PalColor.r];
+ rgbGreen := Owner.GammaTable[PalColor.g];
+ rgbBlue := Owner.GammaTable[PalColor.b];
+ rgbReserved := 0;
+ inc(PalColor); {Move to next palette entry}
+ end;
+end;
+
+{Saves the PLTE chunk to a stream}
+function TChunkPLTE.SaveToStream(Stream: TStream): Boolean;
+var
+ J: Integer;
+ DataPtr: pByte;
+begin
+ {Adjust size to hold all the palette items}
+ ResizeData(fCount * 3);
+ {Copy pointer to data}
+ DataPtr := fData;
+
+ {Copy palette items}
+ with Header do
+ FOR j := 0 TO fCount - 1 DO
+ with BitmapInfo.bmiColors[j] do
+ begin
+ DataPtr^ := Owner.InverseGamma[rgbRed] ; inc(DataPtr);
+ DataPtr^ := Owner.InverseGamma[rgbGreen]; inc(DataPtr);
+ DataPtr^ := Owner.InverseGamma[rgbBlue] ; inc(DataPtr);
+ end {with BitmapInfo};
+
+ {Let ancestor do the rest of the work}
+ Result := inherited SaveToStream(Stream);
+end;
+
+{Assigns from another PLTE chunk}
+procedure TChunkPLTE.Assign(Source: TChunk);
+begin
+ {Copy the number of palette items}
+ if Source is TChunkPLTE then
+ fCount := TChunkPLTE(Source).fCount
+ else
+ Owner.RaiseError(EPNGError, EPNGCannotAssignChunkText);
+end;
+
+{TChunkgAMA implementation}
+
+{Assigns from another chunk}
+procedure TChunkgAMA.Assign(Source: TChunk);
+begin
+ {Copy the gamma value}
+ if Source is TChunkgAMA then
+ Gamma := TChunkgAMA(Source).Gamma
+ else
+ Owner.RaiseError(EPNGError, EPNGCannotAssignChunkText);
+end;
+
+{Gamma chunk being created}
+constructor TChunkgAMA.Create(Owner: TPngObject);
+begin
+ {Call ancestor}
+ inherited Create(Owner);
+ Gamma := 1; {Initial value}
+end;
+
+{Returns gamma value}
+function TChunkgAMA.GetValue: Cardinal;
+begin
+ {Make sure that the size is four bytes}
+ if DataSize <> 4 then
+ begin
+ {Adjust size and returns 1}
+ ResizeData(4);
+ Result := 1;
+ end
+ {If it's right, read the value}
+ else Result := Cardinal(ByteSwap(pCardinal(Data)^))
+end;
+
+function Power(Base, Exponent: Extended): Extended;
+begin
+ if Exponent = 0.0 then
+ Result := 1.0 {Math rule}
+ else if (Base = 0) or (Exponent = 0) then Result := 0
+ else
+ Result := Exp(Exponent * Ln(Base));
+end;
+
+
+{Loading the chunk from a stream}
+function TChunkgAMA.LoadFromStream(Stream: TStream;
+ const ChunkName: TChunkName; Size: Integer): Boolean;
+var
+ i: Integer;
+ Value: Cardinal;
+begin
+ {Call ancestor and test if it went ok}
+ Result := inherited LoadFromStream(Stream, ChunkName, Size);
+ if not Result then exit;
+ Value := Gamma;
+ {Build gamma table and inverse table for saving}
+ if Value <> 0 then
+ with Owner do
+ FOR i := 0 TO 255 DO
+ begin
+ GammaTable[I] := Round(Power((I / 255), 1 /
+ (Value / 100000 * 2.2)) * 255);
+ InverseGamma[Round(Power((I / 255), 1 /
+ (Value / 100000 * 2.2)) * 255)] := I;
+ end
+end;
+
+{Sets the gamma value}
+procedure TChunkgAMA.SetValue(const Value: Cardinal);
+begin
+ {Make sure that the size is four bytes}
+ if DataSize <> 4 then ResizeData(4);
+ {If it's right, set the value}
+ pCardinal(Data)^ := ByteSwap(Value);
+end;
+
+{TPngObject implementation}
+
+{Assigns from another object}
+procedure TPngObject.Assign(Source: TPersistent);
+begin
+ {Assigns contents from another TPNGObject}
+ if Source is TPNGObject then
+ AssignPNG(Source as TPNGObject)
+ {Copy contents from a TBitmap}
+ {$IFDEF UseDelphi}else if Source is TBitmap then
+ with Source as TBitmap do
+ AssignHandle(Handle, Transparent,
+ ColorToRGB(TransparentColor)){$ENDIF}
+ {Unknown source, let ancestor deal with it}
+ else
+ inherited;
+end;
+
+{Clear all the chunks in the list}
+procedure TPngObject.ClearChunks;
+var
+ i: Integer;
+begin
+ {Initialize gamma}
+ InitializeGamma();
+ {Free all the objects and memory (0 chunks Bug fixed by Noel Sharpe)}
+ for i := 0 TO Integer(Chunks.Count) - 1 do
+ TChunk(Chunks.Item[i]).Free;
+ Chunks.Count := 0;
+end;
+
+{Portable Network Graphics object being created}
+constructor TPngObject.Create;
+begin
+ {Let it be created}
+ inherited Create;
+
+ {Initial properties}
+ TempPalette := 0;
+ fFilters := [pfSub];
+ fCompressionLevel := 7;
+ fInterlaceMethod := imNone;
+ fMaxIdatSize := High(Word);
+ {Create chunklist object}
+ fChunkList := TPngList.Create(Self);
+end;
+
+{Portable Network Graphics object being destroyed}
+destructor TPngObject.Destroy;
+begin
+ {Free object list}
+ ClearChunks;
+ fChunkList.Free;
+ {Free the temporary palette}
+ if TempPalette <> 0 then DeleteObject(TempPalette);
+
+ {Call ancestor destroy}
+ inherited Destroy;
+end;
+
+{Returns linesize and byte offset for pixels}
+procedure TPngObject.GetPixelInfo(var LineSize, Offset: Cardinal);
+begin
+ {There must be an Header chunk to calculate size}
+ if HeaderPresent then
+ begin
+ {Calculate number of bytes for each line}
+ LineSize := BytesForPixels(Header.Width, Header.ColorType, Header.BitDepth);
+
+ {Calculates byte offset}
+ Case Header.ColorType of
+ {Grayscale}
+ COLOR_GRAYSCALE:
+ If Header.BitDepth = 16 Then
+ Offset := 2
+ Else
+ Offset := 1 ;
+ {It always smaller or equal one byte, so it occupes one byte}
+ COLOR_PALETTE:
+ offset := 1;
+ {It might be 3 or 6 bytes}
+ COLOR_RGB:
+ offset := 3 * Header.BitDepth Div 8;
+ {It might be 2 or 4 bytes}
+ COLOR_GRAYSCALEALPHA:
+ offset := 2 * Header.BitDepth Div 8;
+ {4 or 8 bytes}
+ COLOR_RGBALPHA:
+ offset := 4 * Header.BitDepth Div 8;
+ else
+ Offset := 0;
+ End ;
+
+ end
+ else
+ begin
+ {In case if there isn't any Header chunk}
+ Offset := 0;
+ LineSize := 0;
+ end;
+
+end;
+
+{Returns image height}
+function TPngObject.GetHeight: Integer;
+begin
+ {There must be a Header chunk to get the size, otherwise returns 0}
+ if HeaderPresent then
+ Result := TChunkIHDR(Chunks.Item[0]).Height
+ else Result := 0;
+end;
+
+{Returns image width}
+function TPngObject.GetWidth: Integer;
+begin
+ {There must be a Header chunk to get the size, otherwise returns 0}
+ if HeaderPresent then
+ Result := Header.Width
+ else Result := 0;
+end;
+
+{Returns if the image is empty}
+function TPngObject.GetEmpty: Boolean;
+begin
+ Result := (Chunks.Count = 0);
+end;
+
+{Raises an error}
+procedure TPngObject.RaiseError(ExceptionClass: ExceptClass; Text: String);
+begin
+ raise ExceptionClass.Create(Text);
+end;
+
+{Set the maximum size for IDAT chunk}
+procedure TPngObject.SetMaxIdatSize(const Value: Cardinal);
+begin
+ {Make sure the size is at least 65535}
+ if Value < High(Word) then
+ fMaxIdatSize := High(Word) else fMaxIdatSize := Value;
+end;
+
+{$IFNDEF UseDelphi}
+ {Creates a file stream reading from the filename in the parameter and load}
+ procedure TPngObject.LoadFromFile(const Filename: String);
+ var
+ FileStream: TFileStream;
+ begin
+ {Test if the file exists}
+ if not FileExists(Filename) then
+ begin
+ {In case it does not exists, raise error}
+ RaiseError(EPNGNotExists, EPNGNotExistsText);
+ exit;
+ end;
+
+ {Creates the file stream to read}
+ FileStream := TFileStream.Create(Filename, [fsmRead]);
+ LoadFromStream(FileStream); {Loads the data}
+ FileStream.Free; {Free file stream}
+ end;
+
+ {Saves the current png image to a file}
+ procedure TPngObject.SaveToFile(const Filename: String);
+ var
+ FileStream: TFileStream;
+ begin
+ {Creates the file stream to write}
+ FileStream := TFileStream.Create(Filename, [fsmWrite]);
+ SaveToStream(FileStream); {Saves the data}
+ FileStream.Free; {Free file stream}
+ end;
+
+{$ENDIF}
+
+{Returns pointer to the chunk TChunkIHDR which should be the first}
+function TPngObject.GetHeader: TChunkIHDR;
+begin
+ {If there is a TChunkIHDR returns it, otherwise returns nil}
+ if (Chunks.Count <> 0) and (Chunks.Item[0] is TChunkIHDR) then
+ Result := Chunks.Item[0] as TChunkIHDR
+ else
+ begin
+ {No header, throw error message}
+ RaiseError(EPNGHeaderNotPresent, EPNGHeaderNotPresentText);
+ Result := nil
+ end
+end;
+
+{Draws using partial transparency}
+procedure TPngObject.DrawPartialTrans(DC: HDC; Rect: TRect);
+type
+ {Access to pixels}
+ TPixelLine = Array[Word] of TRGBQuad;
+ pPixelLine = ^TPixelLine;
+const
+ {Structure used to create the bitmap}
+ BitmapInfoHeader: TBitmapInfoHeader =
+ (biSize: sizeof(TBitmapInfoHeader);
+ biWidth: 100;
+ biHeight: 100;
+ biPlanes: 1;
+ biBitCount: 32;
+ biCompression: BI_RGB;
+ biSizeImage: 0;
+ biXPelsPerMeter: 0;
+ biYPelsPerMeter: 0;
+ biClrUsed: 0;
+ biClrImportant: 0);
+var
+ {Buffer bitmap creation}
+ BitmapInfo : TBitmapInfo;
+ BufferDC : HDC;
+ BufferBits : Pointer;
+ OldBitmap,
+ BufferBitmap: HBitmap;
+
+ {Transparency/palette chunks}
+ TransparencyChunk: TChunktRNS;
+ PaletteChunk: TChunkPLTE;
+ TransValue, PaletteIndex: Byte;
+ CurBit: Integer;
+ Data: PByte;
+
+ {Buffer bitmap modification}
+ BytesPerRowDest,
+ BytesPerRowSrc,
+ BytesPerRowAlpha: Integer;
+ ImageSource,
+ AlphaSource : pByteArray;
+ ImageData : pPixelLine;
+ i, j : Integer;
+begin
+ {Prepare to create the bitmap}
+ Fillchar(BitmapInfo, sizeof(BitmapInfo), #0);
+ BitmapInfoHeader.biWidth := Header.Width;
+ BitmapInfoHeader.biHeight := -1 * Header.Height;
+ BitmapInfo.bmiHeader := BitmapInfoHeader;
+
+ {Create the bitmap which will receive the background, the applied}
+ {alpha blending and then will be painted on the background}
+ BufferDC := CreateCompatibleDC(0);
+ {In case BufferDC could not be created}
+ if (BufferDC = 0) then RaiseError(EPNGOutMemory, EPNGOutMemoryText);
+ BufferBitmap := CreateDIBSection(BufferDC, BitmapInfo, DIB_RGB_COLORS,
+ BufferBits, 0, 0);
+ {In case buffer bitmap could not be created}
+ if (BufferBitmap = 0) or (BufferBits = Nil) then
+ begin
+ if BufferBitmap <> 0 then DeleteObject(BufferBitmap);
+ DeleteDC(BufferDC);
+ RaiseError(EPNGOutMemory, EPNGOutMemoryText);
+ end;
+
+ {Selects new bitmap and release old bitmap}
+ OldBitmap := SelectObject(BufferDC, BufferBitmap);
+
+ {Draws the background on the buffer image}
+ StretchBlt(BufferDC, 0, 0, Header.Width, Header.height, DC, Rect.Left,
+ Rect.Top, Header.Width, Header.Height, SRCCOPY);
+
+ {Obtain number of bytes for each row}
+ BytesPerRowAlpha := Header.Width;
+ BytesPerRowDest := (((BitmapInfo.bmiHeader.biBitCount * Width) + 31)
+ and not 31) div 8; {Number of bytes for each image row in destination}
+ BytesPerRowSrc := (((Header.BitmapInfo.bmiHeader.biBitCount * Header.Width) +
+ 31) and not 31) div 8; {Number of bytes for each image row in source}
+
+ {Obtains image pointers}
+ ImageData := BufferBits;
+ AlphaSource := Header.ImageAlpha;
+ Longint(ImageSource) := Longint(Header.ImageData) +
+ Header.BytesPerRow * Longint(Header.Height - 1);
+
+ case Header.BitmapInfo.bmiHeader.biBitCount of
+ {R, G, B images}
+ 24:
+ FOR j := 1 TO Header.Height DO
+ begin
+ {Process all the pixels in this line}
+ FOR i := 0 TO Header.Width - 1 DO
+ with ImageData[i] do
+ begin
+ rgbRed := (255+ImageSource[2+i*3] * AlphaSource[i] + rgbRed * (255 -
+ AlphaSource[i])) shr 8;
+ rgbGreen := (255+ImageSource[1+i*3] * AlphaSource[i] + rgbGreen *
+ (255 - AlphaSource[i])) shr 8;
+ rgbBlue := (255+ImageSource[i*3] * AlphaSource[i] + rgbBlue *
+ (255 - AlphaSource[i])) shr 8;
+ end;
+
+ {Move pointers}
+ Longint(ImageData) := Longint(ImageData) + BytesPerRowDest;
+ Longint(ImageSource) := Longint(ImageSource) - BytesPerRowSrc;
+ Longint(AlphaSource) := Longint(AlphaSource) + BytesPerRowAlpha;
+ end;
+ {Palette images with 1 byte for each pixel}
+ 1,4,8: if Header.ColorType = COLOR_GRAYSCALEALPHA then
+ FOR j := 1 TO Header.Height DO
+ begin
+ {Process all the pixels in this line}
+ FOR i := 0 TO Header.Width - 1 DO
+ with ImageData[i], Header.BitmapInfo do begin
+ rgbRed := (255 + ImageSource[i] * AlphaSource[i] +
+ rgbRed * (255 - AlphaSource[i])) shr 8;
+ rgbGreen := (255 + ImageSource[i] * AlphaSource[i] +
+ rgbGreen * (255 - AlphaSource[i])) shr 8;
+ rgbBlue := (255 + ImageSource[i] * AlphaSource[i] +
+ rgbBlue * (255 - AlphaSource[i])) shr 8;
+ end;
+
+ {Move pointers}
+ Longint(ImageData) := Longint(ImageData) + BytesPerRowDest;
+ Longint(ImageSource) := Longint(ImageSource) - BytesPerRowSrc;
+ Longint(AlphaSource) := Longint(AlphaSource) + BytesPerRowAlpha;
+ end
+ else {Palette images}
+ begin
+ {Obtain pointer to the transparency chunk}
+ TransparencyChunk := TChunktRNS(Chunks.ItemFromClass(TChunktRNS));
+ PaletteChunk := TChunkPLTE(Chunks.ItemFromClass(TChunkPLTE));
+
+ FOR j := 1 TO Header.Height DO
+ begin
+ {Process all the pixels in this line}
+ i := 0; Data := @ImageSource[0];
+ repeat
+ CurBit := 0;
+
+ repeat
+ {Obtains the palette index}
+ case Header.BitDepth of
+ 1: PaletteIndex := (Data^ shr (7-(I Mod 8))) and 1;
+ 2,4: PaletteIndex := (Data^ shr ((1-(I Mod 2))*4)) and $0F;
+ else PaletteIndex := Data^;
+ end;
+
+ {Updates the image with the new pixel}
+ with ImageData[i] do
+ begin
+ TransValue := TransparencyChunk.PaletteValues[PaletteIndex];
+ rgbRed := (255 + PaletteChunk.Item[PaletteIndex].rgbRed *
+ TransValue + rgbRed * (255 - TransValue)) shr 8;
+ rgbGreen := (255 + PaletteChunk.Item[PaletteIndex].rgbGreen *
+ TransValue + rgbGreen * (255 - TransValue)) shr 8;
+ rgbBlue := (255 + PaletteChunk.Item[PaletteIndex].rgbBlue *
+ TransValue + rgbBlue * (255 - TransValue)) shr 8;
+ end;
+
+ {Move to next data}
+ inc(i); inc(CurBit, Header.BitmapInfo.bmiHeader.biBitCount);
+ until CurBit >= 8;
+ {Move to next source data}
+ inc(Data);
+ until i >= Integer(Header.Width);
+
+ {Move pointers}
+ Longint(ImageData) := Longint(ImageData) + BytesPerRowDest;
+ Longint(ImageSource) := Longint(ImageSource) - BytesPerRowSrc;
+ end
+ end {Palette images}
+ end {case Header.BitmapInfo.bmiHeader.biBitCount};
+
+ {Draws the new bitmap on the foreground}
+ StretchBlt(DC, Rect.Left, Rect.Top, Header.Width, Header.Height, BufferDC,
+ 0, 0, Header.Width, Header.Height, SRCCOPY);
+
+ {Free bitmap}
+ SelectObject(BufferDC, OldBitmap);
+ DeleteObject(BufferBitmap);
+ DeleteDC(BufferDC);
+end;
+
+{Draws the image into a canvas}
+procedure TPngObject.Draw(ACanvas: TCanvas; const Rect: TRect);
+var
+ Header: TChunkIHDR;
+begin
+ {Quit in case there is no header, otherwise obtain it}
+ if (Chunks.Count = 0) or not (Chunks.GetItem(0) is TChunkIHDR) then Exit;
+ Header := Chunks.GetItem(0) as TChunkIHDR;
+
+ {Copy the data to the canvas}
+ case Self.TransparencyMode of
+ {$IFDEF PartialTransparentDraw}
+ ptmPartial:
+ DrawPartialTrans(ACanvas{$IFDEF UseDelphi}.Handle{$ENDIF}, Rect);
+ {$ENDIF}
+ ptmBit: DrawTransparentBitmap(ACanvas{$IFDEF UseDelphi}.Handle{$ENDIF},
+ Header.ImageData, Header.BitmapInfo.bmiHeader,
+ pBitmapInfo(@Header.BitmapInfo), Rect,
+ {$IFDEF UseDelphi}ColorToRGB({$ENDIF}TransparentColor)
+ {$IFDEF UseDelphi}){$ENDIF}
+ else
+ StretchDiBits(ACanvas{$IFDEF UseDelphi}.Handle{$ENDIF}, Rect.Left,
+ Rect.Top, Rect.Right - Rect.Left, Rect.Bottom - Rect.Top, 0, 0,
+ Header.Width, Header.Height, Header.ImageData,
+ pBitmapInfo(@Header.BitmapInfo)^, DIB_RGB_COLORS, SRCCOPY)
+ end {case}
+end;
+
+{Characters for the header}
+const
+ PngHeader: Array[0..7] of Char = (#137, #80, #78, #71, #13, #10, #26, #10);
+
+{Loads the image from a stream of data}
+procedure TPngObject.LoadFromStream(Stream: TStream);
+var
+ Header : Array[0..7] of Char;
+ HasIDAT : Boolean;
+
+ {Chunks reading}
+ ChunkCount : Cardinal;
+ ChunkLength: Cardinal;
+ ChunkName : TChunkName;
+begin
+ {Initialize before start loading chunks}
+ ChunkCount := 0;
+ ClearChunks();
+ {Reads the header}
+ Stream.Read(Header[0], 8);
+
+ {Test if the header matches}
+ if Header <> PngHeader then
+ begin
+ RaiseError(EPNGInvalidFileHeader, EPNGInvalidFileHeaderText);
+ Exit;
+ end;
+
+
+ HasIDAT := FALSE;
+ Chunks.Count := 10;
+
+ {Load chunks}
+ repeat
+ inc(ChunkCount); {Increment number of chunks}
+ if Chunks.Count < ChunkCount then {Resize the chunks list if needed}
+ Chunks.Count := Chunks.Count + 10;
+
+ {Reads chunk length and invert since it is in network order}
+ {also checks the Read method return, if it returns 0, it}
+ {means that no bytes was readed, probably because it reached}
+ {the end of the file}
+ if Stream.Read(ChunkLength, 4) = 0 then
+ begin
+ {In case it found the end of the file here}
+ Chunks.Count := ChunkCount - 1;
+ RaiseError(EPNGUnexpectedEnd, EPNGUnexpectedEndText);
+ end;
+
+ ChunkLength := ByteSwap(ChunkLength);
+ {Reads chunk name}
+ Stream.Read(Chunkname, 4);
+
+ {Here we check if the first chunk is the Header which is necessary}
+ {to the file in order to be a valid Portable Network Graphics image}
+ if (ChunkCount = 1) and (ChunkName <> 'IHDR') then
+ begin
+ Chunks.Count := ChunkCount - 1;
+ RaiseError(EPNGIHDRNotFirst, EPNGIHDRNotFirstText);
+ exit;
+ end;
+
+ {Has a previous IDAT}
+ if (HasIDAT and (ChunkName = 'IDAT')) or (ChunkName = 'cHRM') then
+ begin
+ dec(ChunkCount);
+ Stream.Seek(ChunkLength + 4, soFromCurrent);
+ Continue;
+ end;
+ {Tell it has an IDAT chunk}
+ if ChunkName = 'IDAT' then HasIDAT := TRUE;
+
+ {Creates object for this chunk}
+ Chunks.SetItem(ChunkCount - 1, CreateClassChunk(Self, ChunkName));
+
+ {Check if the chunk is critical and unknown}
+ {$IFDEF ErrorOnUnknownCritical}
+ if (TChunk(Chunks.Item[ChunkCount - 1]).ClassType = TChunk) and
+ ((Byte(ChunkName[0]) AND $20) = 0) and (ChunkName <> '') then
+ begin
+ Chunks.Count := ChunkCount;
+ RaiseError(EPNGUnknownCriticalChunk, EPNGUnknownCriticalChunkText);
+ end;
+ {$ENDIF}
+
+ {Loads it}
+ try if not TChunk(Chunks.Item[ChunkCount - 1]).LoadFromStream(Stream,
+ ChunkName, ChunkLength) then break;
+ except
+ Chunks.Count := ChunkCount;
+ raise;
+ end;
+
+ {Terminates when it reaches the IEND chunk}
+ until (ChunkName = 'IEND');
+
+ {Resize the list to the appropriate size}
+ Chunks.Count := ChunkCount;
+
+ {Check if there is data}
+ if not HasIDAT then
+ RaiseError(EPNGNoImageData, EPNGNoImageDataText);
+end;
+
+{Changing height is not supported}
+procedure TPngObject.SetHeight(Value: Integer);
+begin
+ RaiseError(EPNGError, EPNGCannotChangeSizeText);
+end;
+
+{Changing width is not supported}
+procedure TPngObject.SetWidth(Value: Integer);
+begin
+ RaiseError(EPNGError, EPNGCannotChangeSizeText);
+end;
+
+{$IFDEF UseDelphi}
+{Saves to clipboard format (thanks to Antoine Pottern)}
+procedure TPNGObject.SaveToClipboardFormat(var AFormat: Word;
+ var AData: THandle; var APalette: HPalette);
+begin
+ with TBitmap.Create do
+ try
+ Width := Self.Width;
+ Height := Self.Height;
+ Self.Draw(Canvas, Rect(0, 0, Width, Height));
+ SaveToClipboardFormat(AFormat, AData, APalette);
+ finally
+ Free;
+ end {try}
+end;
+
+{Loads data from clipboard}
+procedure TPngObject.LoadFromClipboardFormat(AFormat: Word;
+ AData: THandle; APalette: HPalette);
+begin
+ with TBitmap.Create do
+ try
+ LoadFromClipboardFormat(AFormat, AData, APalette);
+ Self.AssignHandle(Handle, False, 0);
+ finally
+ Free;
+ end {try}
+end;
+
+{Returns if the image is transparent}
+function TPngObject.GetTransparent: Boolean;
+begin
+ Result := (TransparencyMode <> ptmNone);
+end;
+
+{$ENDIF}
+
+{Saving the PNG image to a stream of data}
+procedure TPngObject.SaveToStream(Stream: TStream);
+var
+ j: Integer;
+begin
+ {Reads the header}
+ Stream.Write(PNGHeader[0], 8);
+ {Write each chunk}
+ FOR j := 0 TO Chunks.Count - 1 DO
+ Chunks.Item[j].SaveToStream(Stream)
+end;
+
+{Prepares the Header chunk}
+procedure BuildHeader(Header: TChunkIHDR; Handle: HBitmap; Info: pBitmap;
+ HasPalette: Boolean);
+var
+ DC: HDC;
+begin
+ {Set width and height}
+ Header.Width := Info.bmWidth;
+ Header.Height := abs(Info.bmHeight);
+ {Set bit depth}
+ if Info.bmBitsPixel >= 16 then
+ Header.BitDepth := 8 else Header.BitDepth := Info.bmBitsPixel;
+ {Set color type}
+ if Info.bmBitsPixel >= 16 then
+ Header.ColorType := COLOR_RGB else Header.ColorType := COLOR_PALETTE;
+ {Set other info}
+ Header.CompressionMethod := 0; {deflate/inflate}
+ Header.InterlaceMethod := 0; {no interlace}
+
+ {Prepares bitmap headers to hold data}
+ Header.PrepareImageData();
+ {Copy image data}
+ DC := CreateCompatibleDC(0);
+ GetDIBits(DC, Handle, 0, Header.Height, Header.ImageData,
+ pBitmapInfo(@Header.BitmapInfo)^, DIB_RGB_COLORS);
+ DeleteDC(DC);
+end;
+
+{Loads the image from a resource}
+procedure TPngObject.LoadFromResourceName(Instance: HInst;
+ const Name: String);
+var
+ ResStream: TResourceStream;
+begin
+ {Creates an especial stream to load from the resource}
+ try ResStream := TResourceStream.Create(Instance, Name, RT_RCDATA);
+ except RaiseError(EPNGCouldNotLoadResource, EPNGCouldNotLoadResourceText);
+ exit; end;
+
+ {Loads the png image from the resource}
+ try
+ LoadFromStream(ResStream);
+ finally
+ ResStream.Free;
+ end;
+end;
+
+{Loads the png from a resource ID}
+procedure TPngObject.LoadFromResourceID(Instance: HInst; ResID: Integer);
+begin
+ LoadFromResourceName(Instance, String(ResID));
+end;
+
+{Assigns this tpngobject to another object}
+procedure TPngObject.AssignTo(Dest: TPersistent);
+{$IFDEF UseDelphi}
+var
+ DeskDC: HDC;
+ TRNS: TChunkTRNS;
+{$ENDIF}
+begin
+ {If the destination is also a TPNGObject make it assign}
+ {this one}
+ if Dest is TPNGObject then
+ TPNGObject(Dest).AssignPNG(Self)
+ {$IFDEF UseDelphi}
+ {In case the destination is a bitmap}
+ else if (Dest is TBitmap) and HeaderPresent then
+ begin
+ {Device context}
+ DeskDC := GetDC(0);
+ {Copy the data}
+ TBitmap(Dest).Handle := CreateDIBitmap(DeskDC,
+ Header.BitmapInfo.bmiHeader, CBM_INIT, Header.ImageData,
+ pBitmapInfo(@Header.BitmapInfo)^, DIB_RGB_COLORS);
+ ReleaseDC(0, DeskDC);
+ {Tests for the best pixelformat}
+ case Header.BitmapInfo.bmiHeader.biBitCount of
+ 1: TBitmap(Dest).PixelFormat := pf1Bit;
+ 4: TBitmap(Dest).PixelFormat := pf4Bit;
+ 8: TBitmap(Dest).PixelFormat := pf8Bit;
+ 24: TBitmap(Dest).PixelFormat := pf24Bit;
+ 32: TBitmap(Dest).PixelFormat := pf32Bit;
+ end {case Header.BitmapInfo.bmiHeader.biBitCount};
+
+ {Copy transparency mode}
+ if (TransparencyMode = ptmBit) then
+ begin
+ TRNS := Chunks.ItemFromClass(TChunkTRNS) as TChunkTRNS;
+ TBitmap(Dest).TransparentColor := TRNS.TransparentColor;
+ TBitmap(Dest).Transparent := True
+ end {if (TransparencyMode = ptmBit)}
+
+ end
+ else
+ {Unknown destination kind, }
+ inherited AssignTo(Dest);
+ {$ENDIF}
+end;
+
+{Assigns from a bitmap object}
+procedure TPngObject.AssignHandle(Handle: HBitmap; Transparent: Boolean;
+ TransparentColor: ColorRef);
+var
+ BitmapInfo: Windows.TBitmap;
+ HasPalette: Boolean;
+
+ {Chunks}
+ Header: TChunkIHDR;
+ PLTE: TChunkPLTE;
+ IDAT: TChunkIDAT;
+ IEND: TChunkIEND;
+ TRNS: TChunkTRNS;
+begin
+ {Obtain bitmap info}
+ GetObject(Handle, SizeOf(BitmapInfo), @BitmapInfo);
+
+ {Only bit depths 1, 4 and 8 needs a palette}
+ HasPalette := (BitmapInfo.bmBitsPixel < 16);
+
+ {Clear old chunks and prepare}
+ ClearChunks();
+
+ {Create the chunks}
+ Header := TChunkIHDR.Create(Self);
+ if HasPalette then PLTE := TChunkPLTE.Create(Self) else PLTE := nil;
+ if Transparent then TRNS := TChunkTRNS.Create(Self) else TRNS := nil;
+ IDAT := TChunkIDAT.Create(Self);
+ IEND := TChunkIEND.Create(Self);
+
+ {Add chunks}
+ TPNGPointerList(Chunks).Add(Header);
+ if HasPalette then TPNGPointerList(Chunks).Add(PLTE);
+ if Transparent then TPNGPointerList(Chunks).Add(TRNS);
+ TPNGPointerList(Chunks).Add(IDAT);
+ TPNGPointerList(Chunks).Add(IEND);
+
+ {This method will fill the Header chunk with bitmap information}
+ {and copy the image data}
+ BuildHeader(Header, Handle, @BitmapInfo, HasPalette);
+ {In case there is a image data, set the PLTE chunk fCount variable}
+ {to the actual number of palette colors which is 2^(Bits for each pixel)}
+ if HasPalette then PLTE.fCount := 1 shl BitmapInfo.bmBitsPixel;
+
+ {In case it is a transparent bitmap, prepares it}
+ if Transparent then TRNS.TransparentColor := TransparentColor;
+
+end;
+
+{Assigns from another PNG}
+procedure TPngObject.AssignPNG(Source: TPNGObject);
+var
+ J: Integer;
+begin
+ {Copy properties}
+ InterlaceMethod := Source.InterlaceMethod;
+ MaxIdatSize := Source.MaxIdatSize;
+ CompressionLevel := Source.CompressionLevel;
+ Filters := Source.Filters;
+
+ {Clear old chunks and prepare}
+ ClearChunks();
+ Chunks.Count := Source.Chunks.Count;
+ {Create chunks and makes a copy from the source}
+ FOR J := 0 TO Chunks.Count - 1 DO
+ with Source.Chunks do
+ begin
+ Chunks.SetItem(J, TChunkClass(TChunk(Item[J]).ClassType).Create(Self));
+ TChunk(Chunks.Item[J]).Assign(TChunk(Item[J]));
+ end {with};
+end;
+
+{Returns a alpha data scanline}
+function TPngObject.GetAlphaScanline(const LineIndex: Integer): pByteArray;
+begin
+ with Header do
+ if (ColorType = COLOR_RGBALPHA) or (ColorType = COLOR_GRAYSCALEALPHA) then
+ Longint(Result) := Longint(ImageAlpha) + (LineIndex * Longint(Width))
+ else Result := nil; {In case the image does not use alpha information}
+end;
+
+{$IFDEF Store16bits}
+{Returns a png data extra scanline}
+function TPngObject.GetExtraScanline(const LineIndex: Integer): Pointer;
+begin
+ with Header do
+ Longint(Result) := (Longint(ExtraImageData) + ((Longint(Height) - 1) *
+ BytesPerRow)) - (LineIndex * BytesPerRow);
+end;
+{$ENDIF}
+
+{Returns a png data scanline}
+function TPngObject.GetScanline(const LineIndex: Integer): Pointer;
+begin
+ with Header do
+ Longint(Result) := (Longint(ImageData) + ((Longint(Height) - 1) *
+ BytesPerRow)) - (LineIndex * BytesPerRow);
+end;
+
+{Initialize gamma table}
+procedure TPngObject.InitializeGamma;
+var
+ i: Integer;
+begin
+ {Build gamma table as if there was no gamma}
+ FOR i := 0 to 255 do
+ begin
+ GammaTable[i] := i;
+ InverseGamma[i] := i;
+ end {for i}
+end;
+
+{Returns the transparency mode used by this png}
+function TPngObject.GetTransparencyMode: TPNGTransparencyMode;
+var
+ TRNS: TChunkTRNS;
+begin
+ with Header do
+ begin
+ Result := ptmNone; {Default result}
+ {Gets the TRNS chunk pointer}
+ TRNS := Chunks.ItemFromClass(TChunkTRNS) as TChunkTRNS;
+
+ {Test depending on the color type}
+ case ColorType of
+ {This modes are always partial}
+ COLOR_RGBALPHA, COLOR_GRAYSCALEALPHA: Result := ptmPartial;
+ {This modes support bit transparency}
+ COLOR_RGB, COLOR_GRAYSCALE: if TRNS <> nil then Result := ptmBit;
+ {Supports booth translucid and bit}
+ COLOR_PALETTE:
+ {A TRNS chunk must be present, otherwise it won't support transparency}
+ if TRNS <> nil then
+ if TRNS.BitTransparency then
+ Result := ptmBit else Result := ptmPartial
+ end {case}
+
+ end {with Header}
+end;
+
+{Add a text chunk}
+procedure TPngObject.AddtEXt(const Keyword, Text: String);
+var
+ TextChunk: TChunkTEXT;
+begin
+ TextChunk := Chunks.Add(TChunkText) as TChunkTEXT;
+ TextChunk.Keyword := Keyword;
+ TextChunk.Text := Text;
+end;
+
+{Add a text chunk}
+procedure TPngObject.AddzTXt(const Keyword, Text: String);
+var
+ TextChunk: TChunkzTXt;
+begin
+ TextChunk := Chunks.Add(TChunkText) as TChunkzTXt;
+ TextChunk.Keyword := Keyword;
+ TextChunk.Text := Text;
+end;
+
+{Removes the image transparency}
+procedure TPngObject.RemoveTransparency;
+var
+ TRNS: TChunkTRNS;
+begin
+ TRNS := Chunks.ItemFromClass(TChunkTRNS) as TChunkTRNS;
+ if TRNS <> nil then Chunks.RemoveChunk(TRNS)
+end;
+
+{Generates alpha information}
+procedure TPngObject.CreateAlpha;
+var
+ TRNS: TChunkTRNS;
+begin
+ {Generates depending on the color type}
+ with Header do
+ case ColorType of
+ {Png allocates different memory space to hold alpha information}
+ {for these types}
+ COLOR_GRAYSCALE, COLOR_RGB:
+ begin
+ {Transform into the appropriate color type}
+ if ColorType = COLOR_GRAYSCALE then
+ ColorType := COLOR_GRAYSCALEALPHA
+ else ColorType := COLOR_RGBALPHA;
+ {Allocates memory to hold alpha information}
+ GetMem(ImageAlpha, Integer(Width) * Integer(Height));
+ FillChar(ImageAlpha^, Integer(Width) * Integer(Height), #255);
+ end;
+ {Palette uses the TChunktRNS to store alpha}
+ COLOR_PALETTE:
+ begin
+ {Gets/creates TRNS chunk}
+ if Chunks.ItemFromClass(TChunkTRNS) = nil then
+ TRNS := Chunks.Add(TChunkTRNS) as TChunkTRNS
+ else
+ TRNS := Chunks.ItemFromClass(TChunkTRNS) as TChunkTRNS;
+
+ {Prepares the TRNS chunk}
+ with TRNS do
+ begin
+ Fillchar(PaletteValues[0], 256, 255);
+ fDataSize := 1 shl Header.BitDepth;
+ fBitTransparency := False
+ end {with Chunks.Add};
+ end;
+ end {case Header.ColorType}
+
+end;
+
+{Returns transparent color}
+function TPngObject.GetTransparentColor: TColor;
+var
+ TRNS: TChunkTRNS;
+begin
+ TRNS := Chunks.ItemFromClass(TChunkTRNS) as TChunkTRNS;
+ {Reads the transparency chunk to get this info}
+ if Assigned(TRNS) then Result := TRNS.TransparentColor
+ else Result := 0
+end;
+
+{$OPTIMIZATION OFF}
+procedure TPngObject.SetTransparentColor(const Value: TColor);
+var
+ TRNS: TChunkTRNS;
+begin
+ if HeaderPresent then
+ {Tests the ColorType}
+ case Header.ColorType of
+ {Not allowed for this modes}
+ COLOR_RGBALPHA, COLOR_GRAYSCALEALPHA: Self.RaiseError(
+ EPNGCannotChangeTransparent, EPNGCannotChangeTransparentText);
+ {Allowed}
+ COLOR_PALETTE, COLOR_RGB, COLOR_GRAYSCALE:
+ begin
+ TRNS := Chunks.ItemFromClass(TChunkTRNS) as TChunkTRNS;
+ if not Assigned(TRNS) then TRNS := Chunks.Add(TChunkTRNS) as TChunkTRNS;
+
+ {Sets the transparency value from TRNS chunk}
+ TRNS.TransparentColor := {$IFDEF UseDelphi}ColorToRGB({$ENDIF}Value{$IFDEF UseDelphi}){$ENDIF}
+ end {COLOR_PALETTE, COLOR_RGB, COLOR_GRAYSCALE)}
+ end {case}
+end;
+
+{Returns if header is present}
+function TPngObject.HeaderPresent: Boolean;
+begin
+ Result := ((Chunks.Count <> 0) and (Chunks.Item[0] is TChunkIHDR))
+end;
+
+{Returns pixel for png using palette and grayscale}
+function GetByteArrayPixel(const png: TPngObject; const X, Y: Integer): TColor;
+var
+ ByteData: Byte;
+ DataDepth: Byte;
+begin
+ with png, Header do
+ begin
+ {Make sure the bitdepth is not greater than 8}
+ DataDepth := BitDepth;
+ if DataDepth > 8 then DataDepth := 8;
+ {Obtains the byte containing this pixel}
+ ByteData := pByteArray(png.Scanline[Y])^[X div (8 div DataDepth)];
+ {Moves the bits we need to the right}
+ ByteData := (ByteData shr ((8 - DataDepth) -
+ (X mod (8 div DataDepth)) * DataDepth));
+ {Discard the unwanted pixels}
+ ByteData:= ByteData and ($FF shr (8 - DataDepth));
+
+ {For palette mode map the palette entry and for grayscale convert and
+ returns the intensity}
+ case ColorType of
+ COLOR_PALETTE:
+ with TChunkPLTE(png.Chunks.ItemFromClass(TChunkPLTE)).Item[ByteData] do
+ Result := rgb(GammaTable[rgbRed], GammaTable[rgbGreen],
+ GammaTable[rgbBlue]);
+ COLOR_GRAYSCALE:
+ begin
+ ByteData := GammaTable[ByteData * ((1 shl DataDepth) + 1)];
+ Result := rgb(ByteData, ByteData, ByteData);
+ end;
+ else Result := 0;
+ end {case};
+ end {with}
+end;
+
+{In case vcl units are not being used}
+{$IFNDEF UseDelphi}
+function ColorToRGB(const Color: TColor): COLORREF;
+begin
+ Result := Color
+end;
+{$ENDIF}
+
+{Sets a pixel for grayscale and palette pngs}
+procedure SetByteArrayPixel(const png: TPngObject; const X, Y: Integer;
+ const Value: TColor);
+const
+ ClearFlag: Array[1..8] of Integer = (1, 3, 0, 15, 0, 0, 0, $FF);
+var
+ ByteData: pByte;
+ DataDepth: Byte;
+ ValEntry: Byte;
+begin
+ with png.Header do
+ begin
+ {Map into a palette entry}
+ ValEntry := GetNearestPaletteIndex(Png.Palette, ColorToRGB(Value));
+
+ {16 bits grayscale extra bits are discarted}
+ DataDepth := BitDepth;
+ if DataDepth > 8 then DataDepth := 8;
+ {Gets a pointer to the byte we intend to change}
+ ByteData := @pByteArray(png.Scanline[Y])^[X div (8 div DataDepth)];
+ {Clears the old pixel data}
+ ByteData^ := ByteData^ and not (ClearFlag[DataDepth] shl ((8 - DataDepth) -
+ (X mod (8 div DataDepth)) * DataDepth));
+
+ {Setting the new pixel}
+ ByteData^ := ByteData^ or (ValEntry shl ((8 - DataDepth) - (X mod (8 div DataDepth)) * DataDepth));
+ end {with png.Header}
+end;
+
+{Returns pixel when png uses RGB}
+function GetRGBLinePixel(const png: TPngObject;
+ const X, Y: Integer): TColor;
+begin
+ with pRGBLine(png.Scanline[Y])^[X] do
+ Result := RGB(rgbtRed, rgbtGreen, rgbtBlue)
+end;
+
+{Sets pixel when png uses RGB}
+procedure SetRGBLinePixel(const png: TPngObject;
+ const X, Y: Integer; Value: TColor);
+begin
+ with pRGBLine(png.Scanline[Y])^[X] do
+ begin
+ rgbtRed := GetRValue(Value);
+ rgbtGreen := GetGValue(Value);
+ rgbtBlue := GetBValue(Value)
+ end
+end;
+
+{Sets a pixel}
+procedure TPngObject.SetPixels(const X, Y: Integer; const Value: TColor);
+begin
+ if (X in [0..Width - 1]) and (Y in [0..Height - 1]) then
+ with Header do
+ begin
+ if ColorType in [COLOR_GRAYSCALE, COLOR_PALETTE] then
+ SetByteArrayPixel(Self, X, Y, Value)
+ else
+ SetRGBLinePixel(Self, X, Y, Value)
+ end {with}
+end;
+
+{Returns a pixel}
+function TPngObject.GetPixels(const X, Y: Integer): TColor;
+begin
+ if (X in [0..Width - 1]) and (Y in [0..Height - 1]) then
+ with Header do
+ begin
+ if ColorType in [COLOR_GRAYSCALE, COLOR_PALETTE] then
+ Result := GetByteArrayPixel(Self, X, Y)
+ else
+ Result := GetRGBLinePixel(Self, X, Y)
+ end {with}
+ else Result := 0
+end;
+
+{Returns the image palette}
+function TPngObject.GetPalette: HPALETTE;
+var
+ LogPalette: TMaxLogPalette;
+ i: Integer;
+begin
+ {Palette is avaliable for COLOR_PALETTE and COLOR_GRAYSCALE modes}
+ if (Header.ColorType in [COLOR_PALETTE, COLOR_GRAYSCALE]) then
+ begin
+ {In case the pal}
+ if TempPalette = 0 then
+ with LogPalette do
+ begin
+ {Prepares the new palette}
+ palVersion := $300;
+ palNumEntries := 256;
+ {Copy entries}
+ for i := 0 to LogPalette.palNumEntries - 1 do
+ begin
+ palPalEntry[i].peRed := Header.BitmapInfo.bmiColors[i].rgbRed;
+ palPalEntry[i].peGreen := Header.BitmapInfo.bmiColors[i].rgbGreen;
+ palPalEntry[i].peBlue := Header.BitmapInfo.bmiColors[i].rgbBlue;
+ palPalEntry[i].peFlags := 0;
+ end {for i};
+ {Creates the palette}
+ TempPalette := CreatePalette(pLogPalette(@LogPalette)^);
+ end {with LogPalette, if Temppalette = 0}
+ end {if Header.ColorType in ...};
+ Result := TempPalette;
+end;
+
+initialization
+ {Initialize}
+ ChunkClasses := nil;
+ {crc table has not being computed yet}
+ crc_table_computed := FALSE;
+ {Register the necessary chunks for png}
+ RegisterCommonChunks;
+ {Registers TPNGObject to use with TPicture}
+ {$IFDEF UseDelphi}{$IFDEF RegisterGraphic}
+ TPicture.RegisterFileFormat('PNG', 'Portable Network Graphics', TPNGObject);
+ {$ENDIF}{$ENDIF}
+finalization
+ {$IFDEF UseDelphi}{$IFDEF RegisterGraphic}
+ TPicture.UnregisterGraphicClass(TPNGObject);
+ {$ENDIF}{$ENDIF}
+ {Free chunk classes}
+ FreeChunkClassList;
+end.
+
+
diff --git a/Game/Code/lib/PngImage/pnglang.pas b/Game/Code/lib/PngImage/pnglang.pas
new file mode 100644
index 00000000..7a9c5078
--- /dev/null
+++ b/Game/Code/lib/PngImage/pnglang.pas
@@ -0,0 +1,301 @@
+{Portable Network Graphics Delphi Language Info (24 July 2002)}
+
+{Feel free to change the text bellow to adapt to your language}
+{Also if you have a translation to other languages and want to}
+{share it, send me: gubadaud@terra.com.br }
+unit pnglang;
+
+interface
+
+{$DEFINE English}
+{.$DEFINE Portuguese}
+{.$DEFINE German}
+{.$DEFINE French}
+{.$DEFINE Slovenian}
+
+{Language strings for english}
+resourcestring
+ {$IFDEF English}
+ EPngInvalidCRCText = 'This "Portable Network Graphics" image is not valid ' +
+ 'because it contains invalid pieces of data (crc error)';
+ EPNGInvalidIHDRText = 'The "Portable Network Graphics" image could not be ' +
+ 'loaded because one of its main piece of data (ihdr) might be corrupted';
+ EPNGMissingMultipleIDATText = 'This "Portable Network Graphics" image is ' +
+ 'invalid because it has missing image parts.';
+ EPNGZLIBErrorText = 'Could not decompress the image because it contains ' +
+ 'invalid compressed data.'#13#10 + ' Description: ';
+ EPNGInvalidPaletteText = 'The "Portable Network Graphics" image contains ' +
+ 'an invalid palette.';
+ EPNGInvalidFileHeaderText = 'The file being readed is not a valid '+
+ '"Portable Network Graphics" image because it contains an invalid header.' +
+ ' This file may be corruped, try obtaining it again.';
+ EPNGIHDRNotFirstText = 'This "Portable Network Graphics" image is not ' +
+ 'supported or it might be invalid.'#13#10 + '(IHDR chunk is not the first)';
+ EPNGNotExistsText = 'The png file could not be loaded because it does not ' +
+ 'exists.';
+ EPNGSizeExceedsText = 'This "Portable Network Graphics" image is not ' +
+ 'supported because either it''s width or height exceeds the maximum ' +
+ 'size, which is 65535 pixels length.';
+ EPNGUnknownPalEntryText = 'There is no such palette entry.';
+ EPNGMissingPaletteText = 'This "Portable Network Graphics" could not be ' +
+ 'loaded because it uses a color table which is missing.';
+ EPNGUnknownCriticalChunkText = 'This "Portable Network Graphics" image ' +
+ 'contains an unknown critical part which could not be decoded.';
+ EPNGUnknownCompressionText = 'This "Portable Network Graphics" image is ' +
+ 'encoded with an unknown compression scheme which could not be decoded.';
+ EPNGUnknownInterlaceText = 'This "Portable Network Graphics" image uses ' +
+ 'an unknown interlace scheme which could not be decoded.';
+ EPNGCannotAssignChunkText = 'The chunks must be compatible to be assigned.';
+ EPNGUnexpectedEndText = 'This "Portable Network Graphics" image is invalid ' +
+ 'because the decoder found an unexpected end of the file.';
+ EPNGNoImageDataText = 'This "Portable Network Graphics" image contains no ' +
+ 'data.';
+ EPNGCannotChangeSizeText = 'The "Portable Network Graphics" image can not ' +
+ 'be resize by changing width and height properties. Try assigning the ' +
+ 'image from a bitmap.';
+ EPNGCannotAddChunkText = 'The program tried to add a existent critical ' +
+ 'chunk to the current image which is not allowed.';
+ EPNGCannotAddInvalidImageText = 'It''s not allowed to add a new chunk ' +
+ 'because the current image is invalid.';
+ EPNGCouldNotLoadResourceText = 'The png image could not be loaded from the ' +
+ 'resource ID.';
+ EPNGOutMemoryText = 'Some operation could not be performed because the ' +
+ 'system is out of resources. Close some windows and try again.';
+ EPNGCannotChangeTransparentText = 'Setting bit transparency color is not ' +
+ 'allowed for png images containing alpha value for each pixel ' +
+ '(COLOR_RGBALPHA and COLOR_GRAYSCALEALPHA)';
+ EPNGHeaderNotPresentText = 'This operation is not valid because the ' +
+ 'current image contains no valid header.';
+ {$ENDIF}
+ {$IFDEF Portuguese}
+ EPngInvalidCRCText = 'Essa imagem "Portable Network Graphics" não é válida ' +
+ 'porque contém chunks inválidos de dados (erro crc)';
+ EPNGInvalidIHDRText = 'A imagem "Portable Network Graphics" não pode ser ' +
+ 'carregada porque um dos seus chunks importantes (ihdr) pode estar '+
+ 'inválido';
+ EPNGMissingMultipleIDATText = 'Essa imagem "Portable Network Graphics" é ' +
+ 'inválida porque tem chunks de dados faltando.';
+ EPNGZLIBErrorText = 'Não foi possível descomprimir os dados da imagem ' +
+ 'porque ela contém dados inválidos.'#13#10 + ' Descrição: ';
+ EPNGInvalidPaletteText = 'A imagem "Portable Network Graphics" contém ' +
+ 'uma paleta inválida.';
+ EPNGInvalidFileHeaderText = 'O arquivo sendo lido não é uma imagem '+
+ '"Portable Network Graphics" válida porque contém um cabeçalho inválido.' +
+ ' O arquivo pode estar corrompida, tente obter ela novamente.';
+ EPNGIHDRNotFirstText = 'Essa imagem "Portable Network Graphics" não é ' +
+ 'suportada ou pode ser inválida.'#13#10 + '(O chunk IHDR não é o ' +
+ 'primeiro)';
+ EPNGNotExistsText = 'A imagem png não pode ser carregada porque ela não ' +
+ 'existe.';
+ EPNGSizeExceedsText = 'Essa imagem "Portable Network Graphics" não é ' +
+ 'suportada porque a largura ou a altura ultrapassam o tamanho máximo, ' +
+ 'que é de 65535 pixels de diâmetro.';
+ EPNGUnknownPalEntryText = 'Não existe essa entrada de paleta.';
+ EPNGMissingPaletteText = 'Essa imagem "Portable Network Graphics" não pode ' +
+ 'ser carregada porque usa uma paleta que está faltando.';
+ EPNGUnknownCriticalChunkText = 'Essa imagem "Portable Network Graphics" ' +
+ 'contém um chunk crítico desconheçido que não pode ser decodificado.';
+ EPNGUnknownCompressionText = 'Essa imagem "Portable Network Graphics" está ' +
+ 'codificada com um esquema de compressão desconheçido e não pode ser ' +
+ 'decodificada.';
+ EPNGUnknownInterlaceText = 'Essa imagem "Portable Network Graphics" usa um ' +
+ 'um esquema de interlace que não pode ser decodificado.';
+ EPNGCannotAssignChunkText = 'Os chunk devem ser compatíveis para serem ' +
+ 'copiados.';
+ EPNGUnexpectedEndText = 'Essa imagem "Portable Network Graphics" é ' +
+ 'inválida porque o decodificador encontrou um fim inesperado.';
+ EPNGNoImageDataText = 'Essa imagem "Portable Network Graphics" não contém ' +
+ 'dados.';
+ EPNGCannotChangeSizeText = 'A imagem "Portable Network Graphics" não pode ' +
+ 'ser redimensionada mudando as propriedades width e height. Tente ' +
+ 'copiar a imagem de um bitmap usando a função assign.';
+ EPNGCannotAddChunkText = 'O programa tentou adicionar um chunk crítico ' +
+ 'já existente para a imagem atual, oque não é permitido.';
+ EPNGCannotAddInvalidImageText = 'Não é permitido adicionar um chunk novo ' +
+ 'porque a imagem atual é inválida.';
+ EPNGCouldNotLoadResourceText = 'A imagem png não pode ser carregada apartir' +
+ ' do resource.';
+ EPNGOutMemoryText = 'Uma operação não pode ser completada porque o sistema ' +
+ 'está sem recursos. Fecha algumas janelas e tente novamente.';
+ EPNGCannotChangeTransparentText = 'Definir transparência booleana não é ' +
+ 'permitido para imagens png contendo informação alpha para cada pixel ' +
+ '(COLOR_RGBALPHA e COLOR_GRAYSCALEALPHA)';
+ EPNGHeaderNotPresentText = 'Essa operação não é válida porque a ' +
+ 'imagem atual não contém um cabeçalho válido.';
+ {$ENDIF}
+ {Language strings for German}
+ {$IFDEF German}
+ EPngInvalidCRCText = 'Dieses "Portable Network Graphics" Image ist ' +
+ 'ungültig, weil Teile der Daten ungültig sind (CRC-Fehler).';
+ EPNGInvalidIHDRText = 'Dieses "Portable Network Graphics" Image konnte ' +
+ 'nicht geladen werden, weil eine der Hauptdaten (IHDR) beschädigt ' +
+ 'sein könnte.';
+ EPNGMissingMultipleIDATText = 'Dieses "Portable Network Graphics" Image ' +
+ 'ist ungültig, weil Grafikdaten fehlen.';
+ EPNGZLIBErrorText = 'Die Grafik konnte nicht entpackt werden, weil sie ' +
+ 'fehlerhafte komprimierte Daten enthält.'#13#10 + ' Beschreibung: ';
+ EPNGInvalidPaletteText = 'Das "Portable Network Graphics" Image enthält ' +
+ 'eine ungültige Palette.';
+ EPNGInvalidFileHeaderText = 'Die Datei, die gelesen wird, ist kein ' +
+ 'gültiges "Portable Network Graphics" Image, da es keinen gültigen ' +
+ 'Header enthält. Die Datei könnte beschädigt sein, versuchen Sie, ' +
+ 'eine neue Kopie zu bekommen.';
+ EPNGIHDRNotFirstText = 'Dieses "Portable Network Graphics" Image wird ' +
+ 'nicht unterstützt bzw. es könnte ungültig sein.'#13#10 +
+ '(Der IHDR-Chunk ist nicht der erste Chunk in der Datei).';
+ EPNGNotExistsText = 'Die PNG Datei konnte nicht geladen werden, da sie ' +
+ 'nicht existiert.';
+ EPNGSizeExceedsText = 'Dieses "Portable Network Graphics" Image wird nicht ' +
+ 'unterstützt, weil entweder seine Breite oder seine Höhe das Maximum von ' +
+ '65535 Pixeln überschreitet.';
+ EPNGUnknownPalEntryText = 'Es gibt keinen solchen Palettenwert.';
+ EPNGMissingPaletteText = 'Dieses "Portable Network Graphics" Image konnte ' +
+ 'nicht geladen werden, weil die benötigte Farbtabelle fehlt.';
+ EPNGUnknownCriticalChunkText = 'Dieses "Portable Network Graphics" Image ' +
+ 'enhält einen unbekannten kritischen Teil, welcher nicht entschlüsselt ' +
+ 'werden kann.';
+ EPNGUnknownCompressionText = 'Dieses "Portable Network Graphics" Image ' +
+ 'wurde mit einem unbekannten Komprimierungsalgorithmus kodiert, welcher ' +
+ 'nicht entschlüsselt werden kann.';
+ EPNGUnknownInterlaceText = 'Dieses "Portable Network Graphics" Image ' +
+ 'benutzt ein unbekanntes Interlace-Schema, welcher nicht entschlüsselt ' +
+ 'werden kann.';
+ EPNGCannotAssignChunkText = 'Die Chunks müssen kompatibel sein, um ' +
+ 'zugewiesen werden zu können.';
+ EPNGUnexpectedEndText = 'Dieses "Portable Network Graphics" Image ist ' +
+ 'ungültig, der Dekoder stieß unerwarteterweise auf das Ende der Datei.';
+ EPNGNoImageDataText = 'Dieses "Portable Network Graphics" Image enthält ' +
+ 'keine Daten.';
+ EPNGCannotChangeSizeText = 'Das "Portable Network Graphics" Image kann ' +
+ 'nicht durch Ändern der Eigenschaften Width und Height in seinen ' +
+ 'Abmessungen geändert werden. Versuchen Sie das Image von einer Bitmap ' +
+ 'aus zuzuweisen.';
+ EPNGCannotAddChunkText = 'Das Programm versucht einen existierenden ' +
+ 'kritischen Chunk zum aktuellen Image hinzuzufügen. Dies ist nicht ' +
+ 'zulässig.';
+ EPNGCannotAddInvalidImageText = 'Es ist nicht zulässig, dem aktuellen ' +
+ 'Image einen neuen Chunk hinzuzufügen, da es ungültig ist.';
+ EPNGCouldNotLoadResourceText = 'Das PNG Image konnte nicht von den ' +
+ 'Resourcendaten geladen werden.';
+ EPNGOutMemoryText = 'Es stehen nicht genügend Resourcen im System zur ' +
+ 'Verfügung, um die Operation auszuführen. Schließen Sie einige Fenster '+
+ 'und versuchen Sie es erneut.';
+ EPNGCannotChangeTransparentText = 'Das Setzen der Bit-' +
+ 'Transparent-Farbe ist fuer PNG-Images die Alpha-Werte fuer jedes ' +
+ 'Pixel enthalten (COLOR_RGBALPHA und COLOR_GRAYSCALEALPHA) nicht ' +
+ 'zulaessig';
+ EPNGHeaderNotPresentText = 'Die Datei, die gelesen wird, ist kein ' +
+ 'gültiges "Portable Network Graphics" Image, da es keinen gültigen ' +
+ 'Header enthält.';
+ {$ENDIF}
+ {Language strings for French}
+ {$IFDEF French}
+ EPngInvalidCRCText = 'Cette image "Portable Network Graphics" n''est pas valide ' +
+ 'car elle contient des données invalides (erreur crc)';
+ EPNGInvalidIHDRText = 'Cette image "Portable Network Graphics" n''a pu être ' +
+ 'chargée car l''une de ses principale donnée (ihdr) doit être corrompue';
+ EPNGMissingMultipleIDATText = 'Cette image "Portable Network Graphics" est ' +
+ 'invalide car elle contient des parties d''image manquantes.';
+ EPNGZLIBErrorText = 'Impossible de décompresser l''image car elle contient ' +
+ 'des données compressées invalides.'#13#10 + ' Description: ';
+ EPNGInvalidPaletteText = 'L''image "Portable Network Graphics" contient ' +
+ 'une palette invalide.';
+ EPNGInvalidFileHeaderText = 'Le fichier actuellement lu est une image '+
+ '"Portable Network Graphics" invalide car elle contient un en-tête invalide.' +
+ ' Ce fichier doit être corrompu, essayer de l''obtenir à nouveau.';
+ EPNGIHDRNotFirstText = 'Cette image "Portable Network Graphics" n''est pas ' +
+ 'supportée ou doit être invalide.'#13#10 + '(la partie IHDR n''est pas la première)';
+ EPNGNotExistsText = 'Le fichier png n''a pu être chargé car il n''éxiste pas.';
+ EPNGSizeExceedsText = 'Cette image "Portable Network Graphics" n''est pas supportée ' +
+ 'car sa longueur ou sa largeur excède la taille maximale, qui est de 65535 pixels.';
+ EPNGUnknownPalEntryText = 'Il n''y a aucune entrée pour cette palette.';
+ EPNGMissingPaletteText = 'Cette image "Portable Network Graphics" n''a pu être ' +
+ 'chargée car elle utilise une table de couleur manquante.';
+ EPNGUnknownCriticalChunkText = 'Cette image "Portable Network Graphics" ' +
+ 'contient une partie critique inconnue qui n'' pu être décodée.';
+ EPNGUnknownCompressionText = 'Cette image "Portable Network Graphics" est ' +
+ 'encodée à l''aide d''un schémas de compression inconnu qui ne peut être décodé.';
+ EPNGUnknownInterlaceText = 'Cette image "Portable Network Graphics" utilise ' +
+ 'un schémas d''entrelacement inconnu qui ne peut être décodé.';
+ EPNGCannotAssignChunkText = 'Ce morceau doit être compatible pour être assigné.';
+ EPNGUnexpectedEndText = 'Cette image "Portable Network Graphics" est invalide ' +
+ 'car le decodeur est arrivé à une fin de fichier non attendue.';
+ EPNGNoImageDataText = 'Cette image "Portable Network Graphics" ne contient pas de ' +
+ 'données.';
+ EPNGCannotChangeSizeText = 'Cette image "Portable Network Graphics" ne peut pas ' +
+ 'être retaillée en changeant ses propriétés width et height. Essayer d''assigner l''image depuis ' +
+ 'un bitmap.';
+ EPNGCannotAddChunkText = 'Le programme a essayé d''ajouter un morceau critique existant ' +
+ 'à l''image actuelle, ce qui n''est pas autorisé.';
+ EPNGCannotAddInvalidImageText = 'Il n''est pas permis d''ajouter un nouveau morceau ' +
+ 'car l''image actuelle est invalide.';
+ EPNGCouldNotLoadResourceText = 'L''image png n''a pu être chargée depuis ' +
+ 'l''ID ressource.';
+ EPNGOutMemoryText = 'Certaines opérations n''ont pu être effectuée car le ' +
+ 'système n''a plus de ressources. Fermez quelques fenêtres et essayez à nouveau.';
+ EPNGCannotChangeTransparentText = 'Définir le bit de transparence n''est pas ' +
+ 'permis pour des images png qui contiennent une valeur alpha pour chaque pixel ' +
+ '(COLOR_RGBALPHA et COLOR_GRAYSCALEALPHA)';
+ EPNGHeaderNotPresentText = 'Cette opération n''est pas valide car l''image ' +
+ 'actuelle ne contient pas de header valide.';
+ EPNGAlphaNotSupportedText = 'Le type de couleur de l''image "Portable Network Graphics" actuelle ' +
+ 'contient déjà des informations alpha ou il ne peut être converti.';
+ {$ENDIF}
+ {Language strings for slovenian}
+ {$IFDEF Slovenian}
+ EPngInvalidCRCText = 'Ta "Portable Network Graphics" slika je neveljavna, ' +
+ 'ker vsebuje neveljavne dele podatkov (CRC napaka).';
+ EPNGInvalidIHDRText = 'Slike "Portable Network Graphics" ni bilo možno ' +
+ 'naložiti, ker je eden od glavnih delov podatkov (IHDR) verjetno pokvarjen.';
+ EPNGMissingMultipleIDATText = 'Ta "Portable Network Graphics" slika je ' +
+ 'naveljavna, ker manjkajo deli slike.';
+ EPNGZLIBErrorText = 'Ne morem raztegniti slike, ker vsebuje ' +
+ 'neveljavne stisnjene podatke.'#13#10 + ' Opis: ';
+ EPNGInvalidPaletteText = 'Slika "Portable Network Graphics" vsebuje ' +
+ 'neveljavno barvno paleto.';
+ EPNGInvalidFileHeaderText = 'Datoteka za branje ni veljavna '+
+ '"Portable Network Graphics" slika, ker vsebuje neveljavno glavo.' +
+ ' Datoteka je verjetno pokvarjena, poskusite jo ponovno naložiti.';
+ EPNGIHDRNotFirstText = 'Ta "Portable Network Graphics" slika ni ' +
+ 'podprta ali pa je neveljavna.'#13#10 + '(IHDR del datoteke ni prvi).';
+ EPNGNotExistsText = 'Ne morem naložiti png datoteke, ker ta ne ' +
+ 'obstaja.';
+ EPNGSizeExceedsText = 'Ta "Portable Network Graphics" slika ni ' +
+ 'podprta, ker ali njena širina ali višina presega najvecjo možno vrednost ' +
+ '65535 pik.';
+ EPNGUnknownPalEntryText = 'Slika nima vnešene take barvne palete.';
+ EPNGMissingPaletteText = 'Te "Portable Network Graphics" ne morem ' +
+ 'naložiti, ker uporablja manjkajoco barvno paleto.';
+ EPNGUnknownCriticalChunkText = 'Ta "Portable Network Graphics" slika ' +
+ 'vsebuje neznan kriticni del podatkov, ki ga ne morem prebrati.';
+ EPNGUnknownCompressionText = 'Ta "Portable Network Graphics" slika je ' +
+ 'kodirana z neznano kompresijsko shemo, ki je ne morem prebrati.';
+ EPNGUnknownInterlaceText = 'Ta "Portable Network Graphics" slika uporablja ' +
+ 'neznano shemo za preliv, ki je ne morem prebrati.';
+ EPNGCannotAssignChunkText = Košcki morajo biti med seboj kompatibilni za prireditev vrednosti.';
+ EPNGUnexpectedEndText = 'Ta "Portable Network Graphics" slika je neveljavna, ' +
+ 'ker je bralnik prišel do nepricakovanega konca datoteke.';
+ EPNGNoImageDataText = 'Ta "Portable Network Graphics" ne vsebuje nobenih ' +
+ 'podatkov.';
+ EPNGCannotChangeSizeText = 'Te "Portable Network Graphics" sliki ne morem ' +
+ 'spremeniti velikosti s spremembo lastnosti višine in širine. Poskusite ' +
+ 'sliko prirediti v bitno sliko.';
+ EPNGCannotAddChunkText = 'Program je poskusil dodati obstojeci kriticni ' +
+ 'kos podatkov k trenutni sliki, kar ni dovoljeno.';
+ EPNGCannotAddInvalidImageText = 'Ni dovoljeno dodati nov kos podatkov, ' +
+ 'ker trenutna slika ni veljavna.';
+ EPNGCouldNotLoadResourceText = 'Ne morem naložiti png slike iz ' +
+ 'skladišca.';
+ EPNGOutMemoryText = 'Ne morem izvesti operacije, ker je ' +
+ 'sistem ostal brez resorjev. Zaprite nekaj oken in poskusite znova.';
+ EPNGCannotChangeTransparentText = 'Ni dovoljeno nastaviti prosojnosti posamezne barve ' +
+ 'za png slike, ki vsebujejo alfa prosojno vrednost za vsako piko ' +
+ '(COLOR_RGBALPHA and COLOR_GRAYSCALEALPHA)';
+ EPNGHeaderNotPresentText = 'Ta operacija ni veljavna, ker ' +
+ 'izbrana slika ne vsebuje veljavne glave.';
+ {$ENDIF}
+
+
+implementation
+
+end.
diff --git a/Game/Code/lib/PngImage/pngzlib.pas b/Game/Code/lib/PngImage/pngzlib.pas
new file mode 100644
index 00000000..3155946a
--- /dev/null
+++ b/Game/Code/lib/PngImage/pngzlib.pas
@@ -0,0 +1,172 @@
+{Portable Network Graphics Delphi ZLIB linking (16 May 2002) }
+
+{This unit links ZLIB to pngimage unit in order to implement }
+{the library. It's now using the new ZLIB version, 1.1.4 }
+{Note: The .obj files must be located in the subdirectory \obj}
+
+unit pngzlib;
+
+{$IFDEF FPC}
+ {$MODE DELPHI}
+{$ENDIF}
+
+interface
+
+type
+
+ TAlloc = function (AppData: Pointer; Items, Size: Integer): Pointer;
+ TFree = procedure (AppData, Block: Pointer);
+
+ // Internal structure. Ignore.
+ TZStreamRec = packed record
+ next_in: PChar; // next input byte
+ avail_in: Integer; // number of bytes available at next_in
+ total_in: Integer; // total nb of input bytes read so far
+
+ next_out: PChar; // next output byte should be put here
+ avail_out: Integer; // remaining free space at next_out
+ total_out: Integer; // total nb of bytes output so far
+
+ msg: PChar; // last error message, NULL if no error
+ internal: Pointer; // not visible by applications
+
+ zalloc: TAlloc; // used to allocate the internal state
+ zfree: TFree; // used to free the internal state
+ AppData: Pointer; // private data object passed to zalloc and zfree
+
+ data_type: Integer; // best guess about the data type: ascii or binary
+ adler: Integer; // adler32 value of the uncompressed data
+ reserved: Integer; // reserved for future use
+ end;
+
+function inflateInit_(var strm: TZStreamRec; version: PChar; recsize: Integer): Integer; // forward;
+function inflate(var strm: TZStreamRec; flush: Integer): Integer; //forward;
+function inflateEnd(var strm: TZStreamRec): Integer; //forward;
+function deflateInit_(var strm: TZStreamRec; level: Integer; version: PChar; recsize: Integer): Integer; //forward;
+function deflate(var strm: TZStreamRec; flush: Integer): Integer; //forward;
+function deflateEnd(var strm: TZStreamRec): Integer; //forward;
+
+const
+ zlib_version = '1.1.4';
+
+function adler32(adler: Integer; buf: PChar; len: Integer): Integer;
+
+
+const
+ Z_NO_FLUSH = 0;
+ Z_PARTIAL_FLUSH = 1;
+ Z_SYNC_FLUSH = 2;
+ Z_FULL_FLUSH = 3;
+ Z_FINISH = 4;
+
+ Z_OK = 0;
+ Z_STREAM_END = 1;
+ Z_NEED_DICT = 2;
+ Z_ERRNO = (-1);
+ Z_STREAM_ERROR = (-2);
+ Z_DATA_ERROR = (-3);
+ Z_MEM_ERROR = (-4);
+ Z_BUF_ERROR = (-5);
+ Z_VERSION_ERROR = (-6);
+
+ Z_NO_COMPRESSION = 0;
+ Z_BEST_SPEED = 1;
+ Z_BEST_COMPRESSION = 9;
+ Z_DEFAULT_COMPRESSION = (-1);
+
+ Z_FILTERED = 1;
+ Z_HUFFMAN_ONLY = 2;
+ Z_DEFAULT_STRATEGY = 0;
+
+ Z_BINARY = 0;
+ Z_ASCII = 1;
+ Z_UNKNOWN = 2;
+
+ Z_DEFLATED = 8;
+
+ _z_errmsg: array[0..9] of PChar = (
+ 'need dictionary', // Z_NEED_DICT (2)
+ 'stream end', // Z_STREAM_END (1)
+ '', // Z_OK (0)
+ 'file error', // Z_ERRNO (-1)
+ 'stream error', // Z_STREAM_ERROR (-2)
+ 'data error', // Z_DATA_ERROR (-3)
+ 'insufficient memory', // Z_MEM_ERROR (-4)
+ 'buffer error', // Z_BUF_ERROR (-5)
+ 'incompatible version', // Z_VERSION_ERROR (-6)
+ ''
+ );
+
+implementation
+
+{$IFNDef FPC}
+ {$L obj\deflate.obj}
+ {$L obj\trees.obj}
+ {$L obj\inflate.obj}
+ {$L obj\inftrees.obj}
+ {$L obj\adler32.obj}
+ {$L obj\infblock.obj}
+ {$L obj\infcodes.obj}
+ {$L obj\infutil.obj}
+ {$L obj\inffast.obj}
+{$ENDIF}
+
+procedure _tr_init; external;
+procedure _tr_tally; external;
+procedure _tr_flush_block; external;
+procedure _tr_align; external;
+procedure _tr_stored_block; external;
+function adler32; external;
+procedure inflate_blocks_new; external;
+procedure inflate_blocks; external;
+procedure inflate_blocks_reset; external;
+procedure inflate_blocks_free; external;
+procedure inflate_set_dictionary; external;
+procedure inflate_trees_bits; external;
+procedure inflate_trees_dynamic; external;
+procedure inflate_trees_fixed; external;
+procedure inflate_codes_new; external;
+procedure inflate_codes; external;
+procedure inflate_codes_free; external;
+procedure _inflate_mask; external;
+procedure inflate_flush; external;
+procedure inflate_fast; external;
+
+procedure _memset(P: Pointer; B: Byte; count: Integer);cdecl;
+begin
+ FillChar(P^, count, B);
+end;
+
+procedure _memcpy(dest, source: Pointer; count: Integer);cdecl;
+begin
+ Move(source^, dest^, count);
+end;
+
+
+// deflate compresses data
+function deflateInit_(var strm: TZStreamRec; level: Integer; version: PChar;
+ recsize: Integer): Integer; external;
+function deflate(var strm: TZStreamRec; flush: Integer): Integer; external;
+function deflateEnd(var strm: TZStreamRec): Integer; external;
+
+// inflate decompresses data
+function inflateInit_(var strm: TZStreamRec; version: PChar; recsize: Integer): Integer; external;
+function inflate(var strm: TZStreamRec; flush: Integer): Integer; external;
+function inflateEnd(var strm: TZStreamRec): Integer; external;
+function inflateReset(var strm: TZStreamRec): Integer; external;
+
+
+function zcalloc(AppData: Pointer; Items, Size: Integer): Pointer;
+begin
+ GetMem(Result, Items*Size);
+end;
+
+procedure zcfree(AppData, Block: Pointer);
+begin
+ FreeMem(Block);
+end;
+
+end.
+
+
+
diff --git a/Game/Code/lib/SQLite/SQLite3.pas b/Game/Code/lib/SQLite/SQLite3.pas
new file mode 100644
index 00000000..b7f9d375
--- /dev/null
+++ b/Game/Code/lib/SQLite/SQLite3.pas
@@ -0,0 +1,189 @@
+unit SQLite3;
+
+{
+ Simplified interface for SQLite.
+ Updated for Sqlite 3 by Tim Anderson (tim@itwriting.com)
+ Note: NOT COMPLETE for version 3, just minimal functionality
+ Adapted from file created by Pablo Pissanetzky (pablo@myhtpc.net)
+ which was based on SQLite.pas by Ben Hochstrasser (bhoc@surfeu.ch)
+}
+
+interface
+
+const
+
+ SQLiteDLL = 'sqlite3.dll';
+
+// Return values for sqlite3_exec() and sqlite3_step()
+
+ SQLITE_OK = 0; // Successful result
+ SQLITE_ERROR = 1; // SQL error or missing database
+ SQLITE_INTERNAL = 2; // An internal logic error in SQLite
+ SQLITE_PERM = 3; // Access permission denied
+ SQLITE_ABORT = 4; // Callback routine requested an abort
+ SQLITE_BUSY = 5; // The database file is locked
+ SQLITE_LOCKED = 6; // A table in the database is locked
+ SQLITE_NOMEM = 7; // A malloc() failed
+ SQLITE_READONLY = 8; // Attempt to write a readonly database
+ SQLITE_INTERRUPT = 9; // Operation terminated by sqlite3_interrupt()
+ SQLITE_IOERR = 10; // Some kind of disk I/O error occurred
+ SQLITE_CORRUPT = 11; // The database disk image is malformed
+ SQLITE_NOTFOUND = 12; // (Internal Only) Table or record not found
+ SQLITE_FULL = 13; // Insertion failed because database is full
+ SQLITE_CANTOPEN = 14; // Unable to open the database file
+ SQLITE_PROTOCOL = 15; // Database lock protocol error
+ SQLITE_EMPTY = 16; // Database is empty
+ SQLITE_SCHEMA = 17; // The database schema changed
+ SQLITE_TOOBIG = 18; // Too much data for one row of a table
+ SQLITE_CONSTRAINT = 19; // Abort due to contraint violation
+ SQLITE_MISMATCH = 20; // Data type mismatch
+ SQLITE_MISUSE = 21; // Library used incorrectly
+ SQLITE_NOLFS = 22; // Uses OS features not supported on host
+ SQLITE_AUTH = 23; // Authorization denied
+ SQLITE_FORMAT = 24; // Auxiliary database format error
+ SQLITE_RANGE = 25; // 2nd parameter to sqlite3_bind out of range
+ SQLITE_NOTADB = 26; // File opened that is not a database file
+ SQLITE_ROW = 100; // sqlite3_step() has another row ready
+ SQLITE_DONE = 101; // sqlite3_step() has finished executing
+
+ SQLITE_INTEGER = 1;
+ SQLITE_FLOAT = 2;
+ SQLITE_TEXT = 3;
+ SQLITE_BLOB = 4;
+ SQLITE_NULL = 5;
+
+type
+ TSQLiteDB = Pointer;
+ TSQLiteResult = ^PChar;
+ TSQLiteStmt = Pointer;
+
+function SQLite3_Open(dbname: PChar; var db: TSqliteDB): integer; cdecl; external 'sqlite3.dll' name 'sqlite3_open';
+function SQLite3_Close(db: TSQLiteDB): integer; cdecl; external 'sqlite3.dll' name 'sqlite3_close';
+function SQLite3_Exec(db: TSQLiteDB; SQLStatement: PChar; CallbackPtr: Pointer; Sender: TObject; var ErrMsg: PChar): integer; cdecl; external 'sqlite3.dll' name 'sqlite3_exec';
+function SQLite3_Version(): PChar; cdecl; external 'sqlite3.dll' name 'sqlite3_libversion';
+function SQLite3_ErrMsg(db: TSQLiteDB): PChar; cdecl; external 'sqlite3.dll' name 'sqlite3_errmsg';
+function SQLite3_ErrCode(db: TSQLiteDB): integer; cdecl; external 'sqlite3.dll' name 'sqlite3_errcode';
+procedure SQlite3_Free(P: PChar); cdecl; external 'sqlite3.dll' name 'sqlite3_free';
+function SQLite3_GetTable(db: TSQLiteDB; SQLStatement: PChar; var ResultPtr: TSQLiteResult; var RowCount: Cardinal; var ColCount: Cardinal; var ErrMsg: PChar): integer; cdecl; external 'sqlite3.dll' name 'sqlite3_get_table';
+procedure SQLite3_FreeTable(Table: TSQLiteResult); cdecl; external 'sqlite3.dll' name 'sqlite3_free_table';
+function SQLite3_Complete(P: PChar): boolean; cdecl; external 'sqlite3.dll' name 'sqlite3_complete';
+function SQLite3_LastInsertRowID(db: TSQLiteDB): int64; cdecl; external 'sqlite3.dll' name 'sqlite3_last_insert_rowid';
+procedure SQLite3_Interrupt(db: TSQLiteDB); cdecl; external 'sqlite3.dll' name 'sqlite3_interrupt';
+procedure SQLite3_BusyHandler(db: TSQLiteDB; CallbackPtr: Pointer; Sender: TObject); cdecl; external 'sqlite3.dll' name 'sqlite3_busy_handler';
+procedure SQLite3_BusyTimeout(db: TSQLiteDB; TimeOut: integer); cdecl; external 'sqlite3.dll' name 'sqlite3_busy_timeout';
+function SQLite3_Changes(db: TSQLiteDB): integer; cdecl; external 'sqlite3.dll' name 'sqlite3_changes';
+function SQLite3_TotalChanges(db: TSQLiteDB): integer; cdecl; external 'sqlite3.dll' name 'sqlite3_total_changes';
+function SQLite3_Prepare(db: TSQLiteDB; SQLStatement: PChar; nBytes: integer; var hStmt: TSqliteStmt; var pzTail: PChar): integer; cdecl; external 'sqlite3.dll' name 'sqlite3_prepare';
+function SQLite3_ColumnCount(hStmt: TSqliteStmt): integer; cdecl; external 'sqlite3.dll' name 'sqlite3_column_count';
+function Sqlite3_ColumnName(hStmt: TSqliteStmt; ColNum: integer): pchar; cdecl; external 'sqlite3.dll' name 'sqlite3_column_name';
+function Sqlite3_ColumnDeclType(hStmt: TSqliteStmt; ColNum: integer): pchar; cdecl; external 'sqlite3.dll' name 'sqlite3_column_decltype';
+function Sqlite3_Step(hStmt: TSqliteStmt): integer; cdecl; external 'sqlite3.dll' name 'sqlite3_step';
+function SQLite3_DataCount(hStmt: TSqliteStmt): integer; cdecl; external 'sqlite3.dll' name 'sqlite3_data_count';
+
+function Sqlite3_ColumnBlob(hStmt: TSqliteStmt; ColNum: integer): pointer; cdecl; external 'sqlite3.dll' name 'sqlite3_column_blob';
+function Sqlite3_ColumnBytes(hStmt: TSqliteStmt; ColNum: integer): integer; cdecl; external 'sqlite3.dll' name 'sqlite3_column_bytes';
+function Sqlite3_ColumnDouble(hStmt: TSqliteStmt; ColNum: integer): double; cdecl; external 'sqlite3.dll' name 'sqlite3_column_double';
+function Sqlite3_ColumnInt(hStmt: TSqliteStmt; ColNum: integer): integer; cdecl; external 'sqlite3.dll' name 'sqlite3_column_int';
+function Sqlite3_ColumnText(hStmt: TSqliteStmt; ColNum: integer): pchar; cdecl; external 'sqlite3.dll' name 'sqlite3_column_text';
+function Sqlite3_ColumnType(hStmt: TSqliteStmt; ColNum: integer): integer; cdecl; external 'sqlite3.dll' name 'sqlite3_column_type';
+function Sqlite3_ColumnInt64(hStmt: TSqliteStmt; ColNum: integer): Int64; cdecl; external 'sqlite3.dll' name 'sqlite3_column_int64';
+function SQLite3_Finalize(hStmt: TSqliteStmt): integer; cdecl; external 'sqlite3.dll' name 'sqlite3_finalize';
+function SQLite3_Reset(hStmt: TSqliteStmt): integer; cdecl; external 'sqlite3.dll' name 'sqlite3_reset';
+
+//
+// In the SQL strings input to sqlite3_prepare() and sqlite3_prepare16(),
+// one or more literals can be replace by a wildcard "?" or ":N:" where
+// N is an integer. These value of these wildcard literals can be set
+// using the routines listed below.
+//
+// In every case, the first parameter is a pointer to the sqlite3_stmt
+// structure returned from sqlite3_prepare(). The second parameter is the
+// index of the wildcard. The first "?" has an index of 1. ":N:" wildcards
+// use the index N.
+//
+ // The fifth parameter to sqlite3_bind_blob(), sqlite3_bind_text(), and
+ //sqlite3_bind_text16() is a destructor used to dispose of the BLOB or
+//text after SQLite has finished with it. If the fifth argument is the
+// special value SQLITE_STATIC, then the library assumes that the information
+// is in static, unmanaged space and does not need to be freed. If the
+// fifth argument has the value SQLITE_TRANSIENT, then SQLite makes its
+// own private copy of the data.
+//
+// The sqlite3_bind_* routine must be called before sqlite3_step() after
+// an sqlite3_prepare() or sqlite3_reset(). Unbound wildcards are interpreted
+// as NULL.
+//
+
+function SQLite3_BindBlob(hStmt: TSqliteStmt; ParamNum: integer;
+ ptrData: pointer; numBytes: integer; ptrDestructor: pointer): integer;
+cdecl; external 'sqlite3.dll' name 'sqlite3_bind_blob';
+
+function SQLiteFieldType(SQLiteFieldTypeCode: Integer): AnsiString;
+function SQLiteErrorStr(SQLiteErrorCode: Integer): AnsiString;
+
+implementation
+
+uses
+ SysUtils;
+
+function SQLiteFieldType(SQLiteFieldTypeCode: Integer): AnsiString;
+begin
+ case SQLiteFieldTypeCode of
+ SQLITE_INTEGER: Result := 'Integer';
+ SQLITE_FLOAT: Result := 'Float';
+ SQLITE_TEXT: Result := 'Text';
+ SQLITE_BLOB: Result := 'Blob';
+ SQLITE_NULL: Result := 'Null';
+ else
+ Result := 'Unknown SQLite Field Type Code "' + IntToStr(SQLiteFieldTypeCode) + '"';
+ end;
+end;
+
+function SQLiteErrorStr(SQLiteErrorCode: Integer): AnsiString;
+begin
+ case SQLiteErrorCode of
+ SQLITE_OK: Result := 'Successful result';
+ SQLITE_ERROR: Result := 'SQL error or missing database';
+ SQLITE_INTERNAL: Result := 'An internal logic error in SQLite';
+ SQLITE_PERM: Result := 'Access permission denied';
+ SQLITE_ABORT: Result := 'Callback routine requested an abort';
+ SQLITE_BUSY: Result := 'The database file is locked';
+ SQLITE_LOCKED: Result := 'A table in the database is locked';
+ SQLITE_NOMEM: Result := 'A malloc() failed';
+ SQLITE_READONLY: Result := 'Attempt to write a readonly database';
+ SQLITE_INTERRUPT: Result := 'Operation terminated by sqlite3_interrupt()';
+ SQLITE_IOERR: Result := 'Some kind of disk I/O error occurred';
+ SQLITE_CORRUPT: Result := 'The database disk image is malformed';
+ SQLITE_NOTFOUND: Result := '(Internal Only) Table or record not found';
+ SQLITE_FULL: Result := 'Insertion failed because database is full';
+ SQLITE_CANTOPEN: Result := 'Unable to open the database file';
+ SQLITE_PROTOCOL: Result := 'Database lock protocol error';
+ SQLITE_EMPTY: Result := 'Database is empty';
+ SQLITE_SCHEMA: Result := 'The database schema changed';
+ SQLITE_TOOBIG: Result := 'Too much data for one row of a table';
+ SQLITE_CONSTRAINT: Result := 'Abort due to contraint violation';
+ SQLITE_MISMATCH: Result := 'Data type mismatch';
+ SQLITE_MISUSE: Result := 'Library used incorrectly';
+ SQLITE_NOLFS: Result := 'Uses OS features not supported on host';
+ SQLITE_AUTH: Result := 'Authorization denied';
+ SQLITE_FORMAT: Result := 'Auxiliary database format error';
+ SQLITE_RANGE: Result := '2nd parameter to sqlite3_bind out of range';
+ SQLITE_NOTADB: Result := 'File opened that is not a database file';
+ SQLITE_ROW: Result := 'sqlite3_step() has another row ready';
+ SQLITE_DONE: Result := 'sqlite3_step() has finished executing';
+ else
+ Result := 'Unknown SQLite Error Code "' + IntToStr(SQLiteErrorCode) + '"';
+ end;
+end;
+
+function ColValueToStr(Value: PChar): AnsiString;
+begin
+ if (Value = nil) then
+ Result := 'NULL'
+ else
+ Result := Value;
+end;
+
+
+end.
+
diff --git a/Game/Code/lib/SQLite/SQLiteTable3.pas b/Game/Code/lib/SQLite/SQLiteTable3.pas
new file mode 100644
index 00000000..9f2b86b3
--- /dev/null
+++ b/Game/Code/lib/SQLite/SQLiteTable3.pas
@@ -0,0 +1,805 @@
+unit SQLiteTable3;
+
+{
+ Simple classes for using SQLite's exec and get_table.
+
+ TSQLiteDatabase wraps the calls to open and close an SQLite database.
+ It also wraps SQLite_exec for queries that do not return a result set
+
+ TSQLiteTable wraps sqlite_get_table.
+ It allows accessing fields by name as well as index and can step through a
+ result set with the Next procedure.
+
+ Adapted by Tim Anderson (tim@itwriting.com)
+ Originally created by Pablo Pissanetzky (pablo@myhtpc.net)
+ Modified and enhanced by Lukas Gebauer
+}
+
+interface
+
+{$IFDEF FPC}
+ {$MODE Delphi}
+{$ENDIF}
+
+uses
+ {$ifdef win32}
+ Windows,
+ {$endif}
+ SQLite3,
+ Classes,
+ SysUtils;
+
+const
+
+ dtInt = 1;
+ dtNumeric = 2;
+ dtStr = 3;
+ dtBlob = 4;
+ dtNull = 5;
+
+type
+
+ ESQLiteException = class(Exception)
+ end;
+
+ TSQLiteTable = class;
+
+ TSQLiteDatabase = class
+ private
+ fDB: TSQLiteDB;
+ fInTrans: boolean;
+ procedure RaiseError(s: string; SQL: string);
+ public
+ constructor Create(const FileName: string);
+ destructor Destroy; override;
+ function GetTable(const SQL: string): TSQLiteTable;
+ procedure ExecSQL(const SQL: string);
+ function GetTableValue(const SQL: string): int64;
+ function GetTableFloat(const SQL: string): real;
+ function GetTableString(const SQL: string): string;
+ procedure UpdateBlob(const SQL: string; BlobData: TStream);
+ procedure BeginTransaction;
+ procedure Commit;
+ procedure Rollback;
+ function TableExists(TableName: string): boolean;
+ function ContainsColumn(Table: String; Column: String) : boolean;
+ function GetLastInsertRowID: int64;
+ procedure SetTimeout(Value: integer);
+ function version: string;
+ published
+ property isTransactionOpen: boolean read fInTrans;
+ end;
+
+ TSQLiteTable = class
+ private
+ fResults: TList;
+ fRowCount: cardinal;
+ fColCount: cardinal;
+ fCols: TStringList;
+ fColTypes: TList;
+ fRow: cardinal;
+ function GetFields(I: cardinal): string;
+ function GetEOF: boolean;
+ function GetBOF: boolean;
+ function GetColumns(I: integer): string;
+ function GetFieldByName(FieldName: string): string;
+ function GetFieldIndex(FieldName: string): integer;
+ function GetCount: integer;
+ function GetCountResult: integer;
+ public
+ constructor Create(DB: TSQLiteDatabase; const SQL: string);
+ destructor Destroy; override;
+ function FieldAsInteger(I: cardinal): int64;
+ function FieldAsBlob(I: cardinal): TMemoryStream;
+ function FieldAsBlobText(I: cardinal): string;
+ function FieldIsNull(I: cardinal): boolean;
+ function FieldAsString(I: cardinal): string;
+ function FieldAsDouble(I: cardinal): double;
+ function Next: boolean;
+ function Previous: boolean;
+ property EOF: boolean read GetEOF;
+ property BOF: boolean read GetBOF;
+ property Fields[I: cardinal]: string read GetFields;
+ property FieldByName[FieldName: string]: string read GetFieldByName;
+ property FieldIndex[FieldName: string]: integer read GetFieldIndex;
+ property Columns[I: integer]: string read GetColumns;
+ property ColCount: cardinal read fColCount;
+ property RowCount: cardinal read fRowCount;
+ property Row: cardinal read fRow;
+ function MoveFirst: boolean;
+ function MoveLast: boolean;
+ property Count: integer read GetCount;
+ // The property CountResult is used when you execute count(*) queries.
+ // It returns 0 if the result set is empty or the value of the
+ // first field as an integer.
+ property CountResult: integer read GetCountResult;
+ end;
+
+procedure DisposePointer(ptr: pointer); cdecl;
+
+
+implementation
+
+procedure DisposePointer(ptr: pointer); cdecl;
+begin
+ if assigned(ptr) then
+ freemem(ptr);
+end;
+
+//------------------------------------------------------------------------------
+// TSQLiteDatabase
+//------------------------------------------------------------------------------
+
+constructor TSQLiteDatabase.Create(const FileName: string);
+var
+ Msg: pchar;
+ iResult: integer;
+begin
+ inherited Create;
+
+ self.fInTrans := False;
+
+ Msg := nil;
+ try
+ iResult := SQLite3_Open(PChar(FileName), Fdb);
+
+ if iResult <> SQLITE_OK then
+ if Assigned(Fdb) then
+ begin
+ Msg := Sqlite3_ErrMsg(Fdb);
+ raise ESqliteException.CreateFmt('Failed to open database "%s" : %s',
+ [FileName, Msg]);
+ end
+ else
+ raise ESqliteException.CreateFmt('Failed to open database "%s" : unknown error',
+ [FileName]);
+
+ //set a few configs
+ self.ExecSQL('PRAGMA SYNCHRONOUS=NORMAL;');
+// self.ExecSQL('PRAGMA full_column_names = 1;');
+ self.ExecSQL('PRAGMA temp_store = MEMORY;');
+
+ finally
+ if Assigned(Msg) then
+ SQLite3_Free(Msg);
+ end;
+
+end;
+
+
+//..............................................................................
+
+destructor TSQLiteDatabase.Destroy;
+begin
+
+ if self.fInTrans then
+ self.ExecSQL('ROLLBACK;'); //assume rollback
+
+ if Assigned(fDB) then
+ SQLite3_Close(fDB);
+
+ inherited;
+end;
+
+function TSQLiteDatabase.GetLastInsertRowID: int64;
+begin
+ Result := Sqlite3_LastInsertRowID(self.fDB);
+end;
+
+//..............................................................................
+
+procedure TSQLiteDatabase.RaiseError(s: string; SQL: string);
+//look up last error and raise an exception with an appropriate message
+var
+ Msg: PChar;
+begin
+
+ Msg := nil;
+
+ if sqlite3_errcode(self.fDB) <> SQLITE_OK then
+ Msg := sqlite3_errmsg(self.fDB);
+
+ if Msg <> nil then
+ raise ESqliteException.CreateFmt(s + ' "%s" : %s', [SQL, Msg])
+ else
+ raise ESqliteException.CreateFmt(s, [SQL, 'No message']);
+
+end;
+
+procedure TSQLiteDatabase.ExecSQL(const SQL: string);
+var
+ Stmt: TSQLiteStmt;
+ NextSQLStatement: Pchar;
+ iStepResult: integer;
+begin
+ try
+
+ if Sqlite3_Prepare(self.fDB, PChar(SQL), -1, Stmt, NextSQLStatement) <>
+ SQLITE_OK then
+ RaiseError('Error executing SQL', SQL);
+
+ if (Stmt = nil) then
+ RaiseError('Could not prepare SQL statement', SQL);
+
+ iStepResult := Sqlite3_step(Stmt);
+
+ if (iStepResult <> SQLITE_DONE) then
+ RaiseError('Error executing SQL statement', SQL);
+
+ finally
+
+ if Assigned(Stmt) then
+ Sqlite3_Finalize(stmt);
+
+ end;
+end;
+
+procedure TSQLiteDatabase.UpdateBlob(const SQL: string; BlobData: TStream);
+var
+ iSize: integer;
+ ptr: pointer;
+ Stmt: TSQLiteStmt;
+ Msg: Pchar;
+ NextSQLStatement: Pchar;
+ iStepResult: integer;
+ iBindResult: integer;
+begin
+ //expects SQL of the form 'UPDATE MYTABLE SET MYFIELD = ? WHERE MYKEY = 1'
+
+ if pos('?', SQL) = 0 then
+ RaiseError('SQL must include a ? parameter', SQL);
+
+ Msg := nil;
+ try
+
+ if Sqlite3_Prepare(self.fDB, PChar(SQL), -1, Stmt, NextSQLStatement) <>
+ SQLITE_OK then
+ RaiseError('Could not prepare SQL statement', SQL);
+
+ if (Stmt = nil) then
+ RaiseError('Could not prepare SQL statement', SQL);
+
+ //now bind the blob data
+ iSize := BlobData.size;
+
+ GetMem(ptr, iSize);
+
+ if (ptr = nil) then
+ raise ESqliteException.CreateFmt('Error getting memory to save blob',
+ [SQL, 'Error']);
+
+ BlobData.position := 0;
+ BlobData.Read(ptr^, iSize);
+
+ iBindResult := SQLite3_BindBlob(stmt, 1, ptr, iSize, @DisposePointer);
+
+ if iBindResult <> SQLITE_OK then
+ RaiseError('Error binding blob to database', SQL);
+
+ iStepResult := Sqlite3_step(Stmt);
+
+ if (iStepResult <> SQLITE_DONE) then
+ RaiseError('Error executing SQL statement', SQL);
+
+ finally
+
+ if Assigned(Stmt) then
+ Sqlite3_Finalize(stmt);
+
+ if Assigned(Msg) then
+ SQLite3_Free(Msg);
+ end;
+
+end;
+
+//..............................................................................
+
+function TSQLiteDatabase.GetTable(const SQL: string): TSQLiteTable;
+begin
+ Result := TSQLiteTable.Create(Self, SQL);
+end;
+
+function TSQLiteDatabase.GetTableValue(const SQL: string): int64;
+var
+ Table: TSQLiteTable;
+begin
+ Table := self.GetTable(SQL);
+ try
+ Result := Table.FieldAsInteger(0);
+ finally
+ Table.Free;
+ end;
+end;
+
+function TSQLiteDatabase.GetTableFloat(const SQL: string): real;
+var
+ Table: TSQLiteTable;
+begin
+ Table := self.GetTable(SQL);
+ try
+ Result := Table.FieldAsDouble(0);
+ finally
+ Table.Free;
+ end;
+end;
+
+function TSQLiteDatabase.GetTableString(const SQL: string): string;
+var
+ Table: TSQLiteTable;
+begin
+ Table := self.GetTable(SQL);
+ try
+ Result := Table.FieldAsString(0);
+ finally
+ Table.Free;
+ end;
+end;
+
+
+procedure TSQLiteDatabase.BeginTransaction;
+begin
+ if not self.fInTrans then
+ begin
+ self.ExecSQL('BEGIN TRANSACTION;');
+ self.fInTrans := True;
+ end
+ else
+ raise ESqliteException.Create('Transaction already open');
+end;
+
+procedure TSQLiteDatabase.Commit;
+begin
+ self.ExecSQL('COMMIT;');
+ self.fInTrans := False;
+end;
+
+procedure TSQLiteDatabase.Rollback;
+begin
+ self.ExecSQL('ROLLBACK;');
+ self.fInTrans := False;
+end;
+
+function TSQLiteDatabase.TableExists(TableName: string): boolean;
+var
+ sql: string;
+ ds: TSqliteTable;
+begin
+ //returns true if table exists in the database
+ sql := 'select [sql] from sqlite_master where [type] = ''table'' and lower(name) = ''' +
+ lowercase(TableName) + ''' ';
+ ds := self.GetTable(sql);
+ try
+ Result := (ds.Count > 0);
+ finally
+ ds.Free;
+ end;
+end;
+
+//from usdx 1.1 alpha
+function TSQLiteDatabase.ContainsColumn(Table: String; Column: String) : boolean;
+var
+ sql: string;
+ ds: TSqliteTable;
+ i : integer;
+begin
+ sql := 'PRAGMA TABLE_INFO('+Table+');';
+ ds := self.GetTable(sql);
+ try
+ Result := false;
+ while (ds.Next() and not Result and not ds.EOF) do
+ begin
+ if ds.FieldAsString(1) = Column then
+ Result := true;
+ end;
+ finally
+ ds.Free;
+ end;
+end;
+
+procedure TSQLiteDatabase.SetTimeout(Value: integer);
+begin
+ SQLite3_BusyTimeout(self.fDB, Value);
+end;
+
+function TSQLiteDatabase.version: string;
+begin
+ Result := SQLite3_Version;
+end;
+
+
+//------------------------------------------------------------------------------
+// TSQLiteTable
+//------------------------------------------------------------------------------
+
+constructor TSQLiteTable.Create(DB: TSQLiteDatabase; const SQL: string);
+var
+ Stmt: TSQLiteStmt;
+ NextSQLStatement: Pchar;
+ iStepResult: integer;
+ ptr: pointer;
+ iNumBytes: integer;
+ thisBlobValue: TMemoryStream;
+ thisStringValue: pstring;
+ thisDoubleValue: pDouble;
+ thisIntValue: pInt64;
+ thisColType: pInteger;
+ i: integer;
+ DeclaredColType: Pchar;
+ ActualColType: integer;
+ ptrValue: Pchar;
+begin
+ try
+ self.fRowCount := 0;
+ self.fColCount := 0;
+ //if there are several SQL statements in SQL, NextSQLStatment points to the
+ //beginning of the next one. Prepare only prepares the first SQL statement.
+ if Sqlite3_Prepare(DB.fDB, PChar(SQL), -1, Stmt, NextSQLStatement) <> SQLITE_OK then
+ DB.RaiseError('Error executing SQL', SQL);
+ if (Stmt = nil) then
+ DB.RaiseError('Could not prepare SQL statement', SQL);
+ iStepResult := Sqlite3_step(Stmt);
+ while (iStepResult <> SQLITE_DONE) do
+ begin
+ case iStepResult of
+ SQLITE_ROW:
+ begin
+ Inc(fRowCount);
+ if (fRowCount = 1) then
+ begin
+ //get data types
+ fCols := TStringList.Create;
+ fColTypes := TList.Create;
+ fColCount := SQLite3_ColumnCount(stmt);
+ for i := 0 to Pred(fColCount) do
+ fCols.Add(AnsiUpperCase(Sqlite3_ColumnName(stmt, i)));
+ for i := 0 to Pred(fColCount) do
+ begin
+ new(thisColType);
+ DeclaredColType := Sqlite3_ColumnDeclType(stmt, i);
+ if DeclaredColType = nil then
+ thisColType^ := Sqlite3_ColumnType(stmt, i) //use the actual column type instead
+ //seems to be needed for last_insert_rowid
+ else
+ if (DeclaredColType = 'INTEGER') or (DeclaredColType = 'INT') or (DeclaredColType = 'BOOLEAN') then
+ thisColType^ := dtInt
+ else
+ if (DeclaredColType = 'NUMERIC') or
+ (DeclaredColType = 'FLOAT') or
+ (DeclaredColType = 'DOUBLE') or
+ (DeclaredColType = 'REAL') then
+ thisColType^ := dtNumeric
+ else
+ if DeclaredColType = 'BLOB' then
+ thisColType^ := dtBlob
+ else
+ thisColType^ := dtStr;
+ fColTypes.Add(thiscoltype);
+ end;
+ fResults := TList.Create;
+ end;
+
+ //get column values
+ for i := 0 to Pred(ColCount) do
+ begin
+ ActualColType := Sqlite3_ColumnType(stmt, i);
+ if (ActualColType = SQLITE_NULL) then
+ fResults.Add(nil)
+ else
+ if pInteger(fColTypes[i])^ = dtInt then
+ begin
+ new(thisintvalue);
+ thisintvalue^ := Sqlite3_ColumnInt64(stmt, i);
+ fResults.Add(thisintvalue);
+ end
+ else
+ if pInteger(fColTypes[i])^ = dtNumeric then
+ begin
+ new(thisdoublevalue);
+ thisdoublevalue^ := Sqlite3_ColumnDouble(stmt, i);
+ fResults.Add(thisdoublevalue);
+ end
+ else
+ if pInteger(fColTypes[i])^ = dtBlob then
+ begin
+ iNumBytes := Sqlite3_ColumnBytes(stmt, i);
+ if iNumBytes = 0 then
+ thisblobvalue := nil
+ else
+ begin
+ thisblobvalue := TMemoryStream.Create;
+ thisblobvalue.position := 0;
+ ptr := Sqlite3_ColumnBlob(stmt, i);
+ thisblobvalue.writebuffer(ptr^, iNumBytes);
+ end;
+ fResults.Add(thisblobvalue);
+ end
+ else
+ begin
+ new(thisstringvalue);
+ ptrValue := Sqlite3_ColumnText(stmt, i);
+ setstring(thisstringvalue^, ptrvalue, strlen(ptrvalue));
+ fResults.Add(thisstringvalue);
+ end;
+ end;
+ end;
+ SQLITE_BUSY:
+ raise ESqliteException.CreateFmt('Could not prepare SQL statement',
+ [SQL, 'SQLite is Busy']);
+ else
+ DB.RaiseError('Could not retrieve data', SQL);
+ end;
+ iStepResult := Sqlite3_step(Stmt);
+ end;
+ fRow := 0;
+ finally
+ if Assigned(Stmt) then
+ Sqlite3_Finalize(stmt);
+ end;
+end;
+
+//..............................................................................
+
+destructor TSQLiteTable.Destroy;
+var
+ i: cardinal;
+ iColNo: integer;
+begin
+ if Assigned(fResults) then
+ begin
+ for i := 0 to fResults.Count - 1 do
+ begin
+ //check for blob type
+ iColNo := (i mod fColCount);
+ case pInteger(self.fColTypes[iColNo])^ of
+ dtBlob:
+ TMemoryStream(fResults[i]).Free;
+ dtStr:
+ if fResults[i] <> nil then
+ begin
+ setstring(string(fResults[i]^), nil, 0);
+ dispose(fResults[i]);
+ end;
+ else
+ dispose(fResults[i]);
+ end;
+ end;
+ fResults.Free;
+ end;
+ if Assigned(fCols) then
+ fCols.Free;
+ if Assigned(fColTypes) then
+ for i := 0 to fColTypes.Count - 1 do
+ dispose(fColTypes[i]);
+ fColTypes.Free;
+ inherited;
+end;
+
+//..............................................................................
+
+function TSQLiteTable.GetColumns(I: integer): string;
+begin
+ Result := fCols[I];
+end;
+
+//..............................................................................
+
+function TSQLiteTable.GetCountResult: integer;
+begin
+ if not EOF then
+ Result := StrToInt(Fields[0])
+ else
+ Result := 0;
+end;
+
+function TSQLiteTable.GetCount: integer;
+begin
+ Result := FRowCount;
+end;
+
+//..............................................................................
+
+function TSQLiteTable.GetEOF: boolean;
+begin
+ Result := fRow >= fRowCount;
+end;
+
+function TSQLiteTable.GetBOF: boolean;
+begin
+ Result := fRow <= 0;
+end;
+
+//..............................................................................
+
+function TSQLiteTable.GetFieldByName(FieldName: string): string;
+begin
+ Result := GetFields(self.GetFieldIndex(FieldName));
+end;
+
+function TSQLiteTable.GetFieldIndex(FieldName: string): integer;
+begin
+
+ if (fCols = nil) then
+ begin
+ raise ESqliteException.Create('Field ' + fieldname + ' Not found. Empty dataset');
+ exit;
+ end;
+
+ if (fCols.count = 0) then
+ begin
+ raise ESqliteException.Create('Field ' + fieldname + ' Not found. Empty dataset');
+ exit;
+ end;
+
+ Result := fCols.IndexOf(AnsiUpperCase(FieldName));
+
+ if (result < 0) then
+ begin raise ESqliteException.Create('Field not found in dataset: ' + fieldname) end;
+
+end;
+
+//..............................................................................
+
+function TSQLiteTable.GetFields(I: cardinal): string;
+var
+ thisvalue: pstring;
+ thistype: integer;
+begin
+ Result := '';
+ if EOF then
+ raise ESqliteException.Create('Table is at End of File');
+ //integer types are not stored in the resultset
+ //as strings, so they should be retrieved using the type-specific
+ //methods
+ thistype := pInteger(self.fColTypes[I])^;
+
+ case thistype of
+ dtStr:
+ begin
+ thisvalue := self.fResults[(self.frow * self.fColCount) + I];
+ if (thisvalue <> nil) then
+ Result := thisvalue^
+ else
+ Result := '';
+ end;
+ dtInt:
+ Result := IntToStr(self.FieldAsInteger(I));
+ dtNumeric:
+ Result := FloatToStr(self.FieldAsDouble(I));
+ dtBlob:
+ Result := self.FieldAsBlobText(I);
+ else
+ Result := '';
+ end;
+end;
+
+function TSqliteTable.FieldAsBlob(I: cardinal): TMemoryStream;
+begin
+ if EOF then
+ raise ESqliteException.Create('Table is at End of File');
+ if (self.fResults[(self.frow * self.fColCount) + I] = nil) then
+ Result := nil
+ else
+ if pInteger(self.fColTypes[I])^ = dtBlob then
+ Result := TMemoryStream(self.fResults[(self.frow * self.fColCount) + I])
+ else
+ raise ESqliteException.Create('Not a Blob field');
+end;
+
+function TSqliteTable.FieldAsBlobText(I: cardinal): string;
+var
+ MemStream: TMemoryStream;
+ Buffer: PChar;
+begin
+ Result := '';
+ MemStream := self.FieldAsBlob(I);
+ if MemStream <> nil then
+ if MemStream.Size > 0 then
+ begin
+ MemStream.position := 0;
+ Buffer := stralloc(MemStream.Size + 1);
+ MemStream.readbuffer(Buffer[0], MemStream.Size);
+ (Buffer + MemStream.Size)^ := chr(0);
+ SetString(Result, Buffer, MemStream.size);
+ strdispose(Buffer);
+ end;
+end;
+
+
+function TSqliteTable.FieldAsInteger(I: cardinal): int64;
+begin
+ if EOF then
+ //raise ESqliteException.Create('Table is at End of File');
+ Result := 0
+ else if (self.fResults[(self.frow * self.fColCount) + I] = nil) then
+ Result := 0
+ else
+ if pInteger(self.fColTypes[I])^ = dtInt then
+ Result := pInt64(self.fResults[(self.frow * self.fColCount) + I])^
+ else
+ if pInteger(self.fColTypes[I])^ = dtNumeric then
+ Result := trunc(strtofloat(pString(self.fResults[(self.frow * self.fColCount) + I])^))
+ else
+ raise ESqliteException.Create('Not an integer or numeric field');
+end;
+
+function TSqliteTable.FieldAsDouble(I: cardinal): double;
+begin
+ if EOF then
+ raise ESqliteException.Create('Table is at End of File');
+ if (self.fResults[(self.frow * self.fColCount) + I] = nil) then
+ Result := 0
+ else
+ if pInteger(self.fColTypes[I])^ = dtInt then
+ Result := pInt64(self.fResults[(self.frow * self.fColCount) + I])^
+ else
+ if pInteger(self.fColTypes[I])^ = dtNumeric then
+ Result := pDouble(self.fResults[(self.frow * self.fColCount) + I])^
+ else
+ raise ESqliteException.Create('Not an integer or numeric field');
+end;
+
+function TSqliteTable.FieldAsString(I: cardinal): string;
+begin
+ if EOF then
+ raise ESqliteException.Create('Table is at End of File');
+ if (self.fResults[(self.frow * self.fColCount) + I] = nil) then
+ Result := ''
+ else
+ Result := self.GetFields(I);
+end;
+
+function TSqliteTable.FieldIsNull(I: cardinal): boolean;
+var
+ thisvalue: pointer;
+begin
+ if EOF then
+ raise ESqliteException.Create('Table is at End of File');
+ thisvalue := self.fResults[(self.frow * self.fColCount) + I];
+ Result := (thisvalue = nil);
+end;
+
+//..............................................................................
+
+function TSQLiteTable.Next: boolean;
+begin
+ Result := False;
+ if not EOF then
+ begin
+ Inc(fRow);
+ Result := True;
+ end;
+end;
+
+function TSQLiteTable.Previous: boolean;
+begin
+ Result := False;
+ if not BOF then
+ begin
+ Dec(fRow);
+ Result := True;
+ end;
+end;
+
+function TSQLiteTable.MoveFirst: boolean;
+begin
+ Result := False;
+ if self.fRowCount > 0 then
+ begin
+ fRow := 0;
+ Result := True;
+ end;
+end;
+
+function TSQLiteTable.MoveLast: boolean;
+begin
+ Result := False;
+ if self.fRowCount > 0 then
+ begin
+ fRow := fRowCount - 1;
+ Result := True;
+ end;
+end;
+
+
+end.
+
diff --git a/Game/Code/lib/SQLite/readme.txt b/Game/Code/lib/SQLite/readme.txt
new file mode 100644
index 00000000..80e5b3a1
--- /dev/null
+++ b/Game/Code/lib/SQLite/readme.txt
@@ -0,0 +1,82 @@
+14 Aug 2005
+
+The following changes were made by Lukas Gebauer (geby@volny.cz). In addition, some changes from a previous D5-compatible version were merged, and the supplied sqlite3.dll is updated to version 3.2.2
+
+Notes from Lukas:
+
+- added support for delphi 4+
+
+- datatype constants matches SQlite datatypes contants. (otherwise in some situations you got bad column datatype!)
+
+- removed dependency on strutils
+
+- code is reformated to better look (official borland formationg
+rules)
+
+- added some pragma's after database is open (temp is in memory)
+
+- TSQLiteDatabase.GetTableValue(const SQL: string): int64 for easy call of SQL commands what returning one number only. (like select
+count(*)...)
+
+- TSQLiteDatabase.GetTableString(const SQL: string): String for easy call of SQL commands what returning one string only. (like PRAGMA
+integrity_check)
+
+- TSQLiteDatabase.SetTimeout(Value: integer); you can set timeout for accessing to some table. Good for database sharing!
+
+- TSQLiteDatabase.version: string; returns SQLITE version string
+
+- removed bool fieldtype (it is not natural SQLite3 type)
+
+- fild type detection by Sqite3_columnType knows REAL too.
+
+- integer filedtype is based on Int64
+
+- GetFields can get data from any supported fieldtype
+
+- changed some integers to cardinal for avoid signed and unsigned mismatch
+
+- TSqliteTable.FieldAsInteger(I: cardinal): int64; returns int64
+
+
+3 May 2005 Fixed bug where strupper called on column type before checking for nil
+
+2 May 2005 Add extra check for nil in TSqliteTable.Destroy, thanks to Tim Maddrell
+
+22 Apr 2005 Revise TSqliteTable.Destroy to fix memory leak with dtStr type (thanks to
+Jose Brito)
+
+21 Apr 2005 Quick revision to fix case sensitivity in detecting column type,
+and remove PRAGMA full_column_names = 1 which is deprecated. Warning: may break code. Fix your SQL code so that all column names in a result set are unique.
+
+21 Feb 2005 Sqlite DLL now 3.1.3
+
+19 Feb 2005 Revised for Sqlite 3.1.2
+
+21 Dec 2004 First public release
+
+The following notice appears in the Sqlite source code:
+
+*
+** 2001 September 15
+**
+**
+** The author disclaims copyright to this source code. In place of
+
+** a legal notice, here is a blessing:
+
+**
+ May you do good and not evil.
+
+** May you find forgiveness for yourself and forgive others.
+
+** May you share freely, never taking more than you give.
+
+
+For more information about SQLite, see http://www.sqlite.org
+
+For more information about this simple wrapper, see http://www.itwriting.com/sqlitesimple.php
+
+
+
+
+
diff --git a/Game/Code/lib/acinerella/acinerella.c b/Game/Code/lib/acinerella/acinerella.c
new file mode 100644
index 00000000..ef03e98e
--- /dev/null
+++ b/Game/Code/lib/acinerella/acinerella.c
@@ -0,0 +1,783 @@
+/*
+ This file is part of Acinerella.
+
+ Acinerella is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Acinerella is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Acinerella. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#include <stdlib.h>
+#include <stdbool.h>
+#include "acinerella.h"
+#include <libavformat/avformat.h>
+#include <libavformat/avio.h>
+#include <libavcodec/avcodec.h>
+#include <libavutil/avutil.h>
+#include <libswscale/swscale.h>
+#include <string.h>
+
+#define AUDIO_BUFFER_BASE_SIZE ((AVCODEC_MAX_AUDIO_FRAME_SIZE * 3) / 2)
+
+//This struct represents one Acinerella video object.
+//It contains data needed by FFMpeg.
+struct _ac_data {
+ ac_instance instance;
+
+ AVFormatContext *pFormatCtx;
+
+ void *sender;
+ ac_openclose_callback open_proc;
+ ac_read_callback read_proc;
+ ac_seek_callback seek_proc;
+ ac_openclose_callback close_proc;
+
+ URLProtocol protocol;
+ char protocol_name[9];
+};
+
+typedef struct _ac_data ac_data;
+typedef ac_data* lp_ac_data;
+
+struct _ac_decoder_data {
+ ac_decoder decoder;
+ int sought;
+ double last_timecode;
+};
+
+typedef struct _ac_decoder_data ac_decoder_data;
+typedef ac_decoder_data* lp_ac_decoder_data;
+
+struct _ac_video_decoder {
+ ac_decoder decoder;
+ int sought;
+ double last_timecode;
+ AVCodec *pCodec;
+ AVCodecContext *pCodecCtx;
+ AVFrame *pFrame;
+ AVFrame *pFrameRGB;
+ struct SwsContext *pSwsCtx;
+};
+
+typedef struct _ac_video_decoder ac_video_decoder;
+typedef ac_video_decoder* lp_ac_video_decoder;
+
+struct _ac_audio_decoder {
+ ac_decoder decoder;
+ int sought;
+ double last_timecode;
+ int max_buffer_size;
+ AVCodec *pCodec;
+ AVCodecContext *pCodecCtx;
+};
+
+typedef struct _ac_audio_decoder ac_audio_decoder;
+typedef ac_audio_decoder* lp_ac_audio_decoder;
+
+struct _ac_package_data {
+ ac_package package;
+ AVPacket ffpackage;
+ int pts;
+};
+
+typedef struct _ac_package_data ac_package_data;
+typedef ac_package_data* lp_ac_package_data;
+
+//
+//---Small functions that are missing in FFMpeg ;-) ---
+//
+
+//Deletes a protocol from the FFMpeg protocol list
+void unregister_protocol(URLProtocol *protocol) {
+ URLProtocol *pcurrent = first_protocol;
+ URLProtocol *plast = NULL;
+
+ while (pcurrent != NULL) {
+ //Search for the protocol that is given as parameter
+ if (pcurrent == protocol) {
+ if (plast != NULL) {
+ plast->next = pcurrent->next;
+ return;
+ } else {
+ first_protocol = pcurrent->next;
+ return;
+ }
+ }
+ plast = pcurrent;
+ pcurrent = pcurrent->next;
+ }
+}
+
+void unique_protocol_name(char *name) {
+ URLProtocol *p = first_protocol;
+ int i = 0;
+
+ //Copy the string "acinx" to the string
+ strcpy(name, "acinx");
+
+ while (1) {
+ //Replace the "x" in the string with a character
+ name[4] = (char)(65 + i);
+
+ while (1) {
+ //There is no element in the list or we are at the end of the list. In this case the string
+ //is unique
+ if (p == NULL) {
+ return;
+ }
+ //We got an element from the list, compare its name to our string. If they are the same,
+ //the string isn't unique and we have to create a new one.
+ if (strcmp(p->name, name) == 0) {
+ p = first_protocol;
+ break;
+ }
+ p = p->next;
+ }
+ i++;
+ }
+}
+
+//
+//--- Memory manager ---
+//
+
+ac_malloc_callback mgr_malloc = &malloc;
+ac_realloc_callback mgr_realloc = &realloc;
+ac_free_callback mgr_free = &free;
+
+void CALL_CONVT ac_mem_mgr(ac_malloc_callback mc, ac_realloc_callback rc, ac_free_callback fc) {
+ mgr_malloc = mc;
+ mgr_realloc = rc;
+ mgr_free = fc;
+}
+
+//
+//--- Initialization and Stream opening---
+//
+
+void init_info(lp_ac_file_info info) {
+ info->title[0] = 0;
+ info->author[0] = 0;
+ info->copyright[0] = 0;
+ info->comment[0] = 0;
+ info->album[0] = 0;
+ info->year = -1;
+ info->track = -1;
+ info->genre[0] = 0;
+ info->duration = -1;
+ info->bitrate = -1;
+}
+
+lp_ac_instance CALL_CONVT ac_init(void) {
+ //Initialize FFMpeg libraries
+ av_register_all();
+
+ //Allocate a new instance of the videoplayer data and return it
+ lp_ac_data ptmp;
+ ptmp = (lp_ac_data)mgr_malloc(sizeof(ac_data));
+ ptmp->instance.opened = 0;
+ ptmp->instance.stream_count = 0;
+ ptmp->instance.output_format = AC_OUTPUT_BGR24;
+ init_info(&(ptmp->instance.info));
+ return (lp_ac_instance)ptmp;
+}
+
+void CALL_CONVT ac_free(lp_ac_instance pacInstance) {
+ //Close the decoder. If it is already closed, this won't be a problem as ac_close checks the streams state
+ ac_close(pacInstance);
+
+ if (pacInstance != NULL) {
+ mgr_free((lp_ac_data)pacInstance);
+ }
+}
+
+lp_ac_data last_instance;
+
+//Function called by FFMpeg when opening an ac stream.
+static int file_open(URLContext *h, const char *filename, int flags)
+{
+ h->priv_data = last_instance;
+ h->is_streamed = last_instance->seek_proc == NULL;
+
+ if (last_instance->open_proc != NULL) {
+ last_instance->open_proc(last_instance->sender);
+ }
+
+ return 0;
+}
+
+//Function called by FFMpeg when reading from the stream
+static int file_read(URLContext *h, unsigned char *buf, int size)
+{
+ if (((lp_ac_data)(h->priv_data))->read_proc != NULL) {
+ return ((lp_ac_data)(h->priv_data))->read_proc(((lp_ac_data)(h->priv_data))->sender, buf, size);
+ }
+
+ return -1;
+}
+
+//Function called by FFMpeg when seeking the stream
+
+int64_t file_seek(URLContext *h, int64_t pos, int whence)
+{
+ if ((whence >= 0) && (whence <= 2)) {
+ if (((lp_ac_data)(h->priv_data))->seek_proc != NULL) {
+ return ((lp_ac_data)(h->priv_data))->seek_proc(((lp_ac_data)(h->priv_data))->sender, pos, whence);
+ }
+ }
+
+ return -1;
+}
+
+uint64_t global_video_pkt_pts = AV_NOPTS_VALUE;
+
+int ac_get_buffer(struct AVCodecContext *c, AVFrame *pic) {
+ int ret = avcodec_default_get_buffer(c, pic);
+ uint64_t *pts = av_malloc(sizeof(uint64_t));
+ *pts = global_video_pkt_pts;
+ pic->opaque = pts;
+ return ret;
+}
+
+void ac_release_buffer(struct AVCodecContext *c, AVFrame *pic){
+ if (pic) av_freep(&pic->opaque);
+ avcodec_default_release_buffer(c, pic);
+}
+
+//Function called by FFMpeg when the stream should be closed
+static int file_close(URLContext *h)
+{
+ if (((lp_ac_data)(h->priv_data))->close_proc != NULL) {
+ return ((lp_ac_data)(h->priv_data))->close_proc(((lp_ac_data)(h->priv_data))->sender);
+ }
+
+ return 0;
+}
+
+int CALL_CONVT ac_open(
+ lp_ac_instance pacInstance,
+ void *sender,
+ ac_openclose_callback open_proc,
+ ac_read_callback read_proc,
+ ac_seek_callback seek_proc,
+ ac_openclose_callback close_proc) {
+
+ pacInstance->opened = 0;
+
+ //Set last instance
+ last_instance = (lp_ac_data)pacInstance;
+
+ //Store the given parameters in the ac Instance
+ ((lp_ac_data)pacInstance)->sender = sender;
+ ((lp_ac_data)pacInstance)->open_proc = open_proc;
+ ((lp_ac_data)pacInstance)->read_proc = read_proc;
+ ((lp_ac_data)pacInstance)->seek_proc = seek_proc;
+ ((lp_ac_data)pacInstance)->close_proc = close_proc;
+
+ //Create a new protocol name
+ unique_protocol_name(((lp_ac_data)pacInstance)->protocol_name);
+
+ //Create a new protocol
+ ((lp_ac_data)pacInstance)->protocol.name = ((lp_ac_data)pacInstance)->protocol_name;
+ ((lp_ac_data)pacInstance)->protocol.url_open = &file_open;
+ ((lp_ac_data)pacInstance)->protocol.url_read = &file_read;
+ ((lp_ac_data)pacInstance)->protocol.url_write = NULL;
+ if (!(seek_proc == NULL)) {
+ ((lp_ac_data)pacInstance)->protocol.url_seek = &file_seek;
+ } else {
+ ((lp_ac_data)pacInstance)->protocol.url_seek = NULL;
+ }
+ ((lp_ac_data)pacInstance)->protocol.url_close = &file_close;
+
+ //Register the generated protocol
+ av_register_protocol(&((lp_ac_data)pacInstance)->protocol);
+
+ //Generate a unique filename
+ char filename[50];
+ strcpy(filename, ((lp_ac_data)pacInstance)->protocol_name);
+ strcat(filename, "://dummy.file");
+
+ if(av_open_input_file(
+ &(((lp_ac_data)pacInstance)->pFormatCtx), filename, NULL, 0, NULL) != 0 ) {
+ return -1;
+ }
+
+ //Retrieve stream information
+ if(av_find_stream_info(((lp_ac_data)pacInstance)->pFormatCtx)<0) {
+ return -1;
+ }
+
+ //Set some information in the instance variable
+ pacInstance->stream_count = ((lp_ac_data)pacInstance)->pFormatCtx->nb_streams;
+ pacInstance->opened = pacInstance->stream_count > 0;
+
+ //Try to obtain even more stream information (duration, author, album etc.)
+ if (av_find_stream_info(((lp_ac_data)pacInstance)->pFormatCtx) >= 0) {
+ AVFormatContext *ctx = ((lp_ac_data)pacInstance)->pFormatCtx;
+ strcpy(pacInstance->info.title, ctx->title);
+ strcpy(pacInstance->info.author, ctx->author);
+ strcpy(pacInstance->info.copyright, ctx->copyright);
+ strcpy(pacInstance->info.comment, ctx->comment);
+ strcpy(pacInstance->info.album, ctx->album);
+ strcpy(pacInstance->info.genre, ctx->genre);
+
+ pacInstance->info.year = ctx->year;
+ pacInstance->info.track = ctx->track;
+ pacInstance->info.bitrate = ctx->bit_rate;
+
+ pacInstance->info.duration = ctx->duration * 1000 / AV_TIME_BASE;
+ }
+}
+
+void CALL_CONVT ac_close(lp_ac_instance pacInstance) {
+ if (pacInstance->opened) {
+ unregister_protocol(&((lp_ac_data)(pacInstance))->protocol);
+ av_close_input_file(((lp_ac_data)(pacInstance))->pFormatCtx);
+ pacInstance->opened = 0;
+ }
+}
+void CALL_CONVT ac_get_stream_info(lp_ac_instance pacInstance, int nb, lp_ac_stream_info info) {
+ if (!(pacInstance->opened)) {
+ return;
+ }
+
+ switch (((lp_ac_data)pacInstance)->pFormatCtx->streams[nb]->codec->codec_type) {
+ case CODEC_TYPE_VIDEO:
+ //Set stream type to "VIDEO"
+ info->stream_type = AC_STREAM_TYPE_VIDEO;
+
+ //Store more information about the video stream
+ info->additional_info.video_info.frame_width =
+ ((lp_ac_data)pacInstance)->pFormatCtx->streams[nb]->codec->width;
+ info->additional_info.video_info.frame_height =
+ ((lp_ac_data)pacInstance)->pFormatCtx->streams[nb]->codec->height;
+ info->additional_info.video_info.pixel_aspect =
+ av_q2d(((lp_ac_data)pacInstance)->pFormatCtx->streams[nb]->codec->sample_aspect_ratio);
+ //Sometime "pixel aspect" may be zero. Correct this.
+ if (info->additional_info.video_info.pixel_aspect == 0.0) {
+ info->additional_info.video_info.pixel_aspect = 1.0;
+ }
+
+ info->additional_info.video_info.frames_per_second =
+ (double)((lp_ac_data)pacInstance)->pFormatCtx->streams[nb]->r_frame_rate.den /
+ (double)((lp_ac_data)pacInstance)->pFormatCtx->streams[nb]->r_frame_rate.num;
+ break;
+ case CODEC_TYPE_AUDIO:
+ //Set stream type to "AUDIO"
+ info->stream_type = AC_STREAM_TYPE_AUDIO;
+
+ //Store more information about the video stream
+ info->additional_info.audio_info.samples_per_second =
+ ((lp_ac_data)pacInstance)->pFormatCtx->streams[nb]->codec->sample_rate;
+ info->additional_info.audio_info.channel_count =
+ ((lp_ac_data)pacInstance)->pFormatCtx->streams[nb]->codec->channels;
+
+ // Set bit depth
+ switch (((lp_ac_data)pacInstance)->pFormatCtx->streams[nb]->codec->sample_fmt) {
+ //8-Bit
+ case SAMPLE_FMT_U8:
+ info->additional_info.audio_info.bit_depth =
+ 8;
+ break;
+
+ //16-Bit
+ case SAMPLE_FMT_S16:
+ info->additional_info.audio_info.bit_depth =
+ 16;
+ break;
+
+/* //24-Bit (removed in the newest ffmpeg version)
+ case SAMPLE_FMT_S24:
+ info->additional_info.audio_info.bit_depth =
+ 24;
+ break; */
+
+ //32-Bit
+ case SAMPLE_FMT_S32: case SAMPLE_FMT_FLT:
+ info->additional_info.audio_info.bit_depth =
+ 32;
+ break;
+
+ //Unknown format, return zero
+ default:
+ info->additional_info.audio_info.bit_depth =
+ 0;
+ }
+
+ break;
+ default:
+ info->stream_type = AC_STREAM_TYPE_UNKNOWN;
+ }
+}
+
+//
+//---Package management---
+//
+
+lp_ac_package CALL_CONVT ac_read_package(lp_ac_instance pacInstance) {
+ //Try to read package
+ AVPacket Package;
+ if (av_read_frame(((lp_ac_data)(pacInstance))->pFormatCtx, &Package) >= 0) {
+ //Reserve memory
+ lp_ac_package_data pTmp = (lp_ac_package_data)(mgr_malloc(sizeof(ac_package_data)));
+
+ //Set package data
+ pTmp->package.data = Package.data;
+ pTmp->package.size = Package.size;
+ pTmp->package.stream_index = Package.stream_index;
+ pTmp->ffpackage = Package;
+ if (Package.dts != AV_NOPTS_VALUE) {
+ pTmp->pts = Package.dts;
+ }
+
+ return (lp_ac_package)(pTmp);
+ } else {
+ return NULL;
+ }
+}
+
+//Frees the currently loaded package
+void CALL_CONVT ac_free_package(lp_ac_package pPackage) {
+ //Free the packet
+ if (pPackage != NULL) {
+ av_free_packet(&((lp_ac_package_data)pPackage)->ffpackage);
+ mgr_free((lp_ac_package_data)pPackage);
+ }
+}
+
+//
+//--- Decoder management ---
+//
+
+enum PixelFormat convert_pix_format(ac_output_format fmt) {
+ switch (fmt) {
+ case AC_OUTPUT_RGB24: return PIX_FMT_RGB24;
+ case AC_OUTPUT_BGR24: return PIX_FMT_BGR24;
+ case AC_OUTPUT_RGBA32: return PIX_FMT_RGB32;
+ case AC_OUTPUT_BGRA32: return PIX_FMT_BGR32;
+ }
+ return PIX_FMT_RGB24;
+}
+
+//Init a video decoder
+void* ac_create_video_decoder(lp_ac_instance pacInstance, lp_ac_stream_info info, int nb) {
+ //Allocate memory for a new decoder instance
+ lp_ac_video_decoder pDecoder;
+ pDecoder = (lp_ac_video_decoder)(mgr_malloc(sizeof(ac_video_decoder)));
+
+ //Set a few properties
+ pDecoder->decoder.pacInstance = pacInstance;
+ pDecoder->decoder.type = AC_DECODER_TYPE_VIDEO;
+ pDecoder->decoder.stream_index = nb;
+ pDecoder->pCodecCtx = ((lp_ac_data)(pacInstance))->pFormatCtx->streams[nb]->codec;
+ pDecoder->pCodecCtx->get_buffer = ac_get_buffer;
+ pDecoder->pCodecCtx->release_buffer = ac_release_buffer;
+ pDecoder->decoder.stream_info = *info;
+
+ //Find correspondenting codec
+ if (!(pDecoder->pCodec = avcodec_find_decoder(pDecoder->pCodecCtx->codec_id))) {
+ return NULL; //Codec could not have been found
+ }
+
+ //Open codec
+ if (avcodec_open(pDecoder->pCodecCtx, pDecoder->pCodec) < 0) {
+ return NULL; //Codec could not have been opened
+ }
+
+ //Reserve frame variables
+ pDecoder->pFrame = avcodec_alloc_frame();
+ pDecoder->pFrameRGB = avcodec_alloc_frame();
+
+ pDecoder->pSwsCtx = NULL;
+
+ //Reserve buffer memory
+ pDecoder->decoder.buffer_size = avpicture_get_size(convert_pix_format(pacInstance->output_format),
+ pDecoder->pCodecCtx->width, pDecoder->pCodecCtx->height);
+ pDecoder->decoder.pBuffer = (uint8_t*)mgr_malloc(pDecoder->decoder.buffer_size);
+
+ //Link decoder to buffer
+ avpicture_fill(
+ (AVPicture*)(pDecoder->pFrameRGB),
+ pDecoder->decoder.pBuffer, convert_pix_format(pacInstance->output_format),
+ pDecoder->pCodecCtx->width, pDecoder->pCodecCtx->height);
+
+ return (void*)pDecoder;
+}
+
+//Init a audio decoder
+void* ac_create_audio_decoder(lp_ac_instance pacInstance, lp_ac_stream_info info, int nb) {
+ //Allocate memory for a new decoder instance
+ lp_ac_audio_decoder pDecoder;
+ pDecoder = (lp_ac_audio_decoder)(mgr_malloc(sizeof(ac_audio_decoder)));
+
+ //Set a few properties
+ pDecoder->decoder.pacInstance = pacInstance;
+ pDecoder->decoder.type = AC_DECODER_TYPE_AUDIO;
+ pDecoder->decoder.stream_index = nb;
+ pDecoder->decoder.stream_info = *info;
+
+ //Temporary store codec context pointer
+ AVCodecContext *pCodecCtx = ((lp_ac_data)(pacInstance))->pFormatCtx->streams[nb]->codec;
+ pDecoder->pCodecCtx = pCodecCtx;
+
+ //Find correspondenting codec
+ if (!(pDecoder->pCodec = avcodec_find_decoder(pCodecCtx->codec_id))) {
+ return NULL;
+ }
+
+ //Open codec
+ if (avcodec_open(pCodecCtx, pDecoder->pCodec) < 0) {
+ return NULL;
+ }
+
+ //Reserve a buffer
+ pDecoder->max_buffer_size = AUDIO_BUFFER_BASE_SIZE;
+ pDecoder->decoder.pBuffer = (uint8_t*)(mgr_malloc(pDecoder->max_buffer_size));
+ pDecoder->decoder.buffer_size = 0;
+
+ return (void*)pDecoder;
+}
+
+lp_ac_decoder CALL_CONVT ac_create_decoder(lp_ac_instance pacInstance, int nb) {
+ //Get information about the chosen data stream and create an decoder that can
+ //handle this kind of stream.
+ ac_stream_info info;
+ ac_get_stream_info(pacInstance, nb, &info);
+
+ lp_ac_decoder result;
+
+ if (info.stream_type == AC_STREAM_TYPE_VIDEO) {
+ result = ac_create_video_decoder(pacInstance, &info, nb);
+ }
+ else if (info.stream_type == AC_STREAM_TYPE_AUDIO) {
+ result = ac_create_audio_decoder(pacInstance, &info, nb);
+ }
+
+ ((lp_ac_decoder_data)result)->last_timecode = 0;
+ ((lp_ac_decoder_data)result)->sought = 1;
+ result->video_clock = 0;
+
+ return result;
+}
+
+double ac_sync_video(lp_ac_package pPackage, lp_ac_decoder pDec, AVFrame *src_frame, double pts){
+ double frame_delay;
+
+ if(pts != 0){
+ pDec->video_clock = pts;
+ } else {
+ pts = pDec->video_clock;
+ }
+
+ frame_delay = av_q2d(((lp_ac_data)pDec->pacInstance)->pFormatCtx->streams[pPackage->stream_index]->time_base);
+ frame_delay += src_frame->repeat_pict * (frame_delay * 0.5);
+ pDec->video_clock += frame_delay;
+ return pts;
+}
+
+int ac_decode_video_package(lp_ac_package pPackage, lp_ac_video_decoder pDecoder, lp_ac_decoder pDec) {
+ int finished;
+ double pts;
+
+ avcodec_decode_video2(
+ pDecoder->pCodecCtx, pDecoder->pFrame, &finished,
+ &((lp_ac_package_data)pPackage)->ffpackage);
+
+
+
+
+ if (finished) {
+ pts=0;
+ global_video_pkt_pts = ((lp_ac_package_data)pPackage)->ffpackage.pts;
+
+ if(((lp_ac_package_data)pPackage)->ffpackage.dts == AV_NOPTS_VALUE &&
+ *(uint64_t*)pDecoder->pFrame->opaque != AV_NOPTS_VALUE ){
+ pts = *(uint64_t*)pDecoder->pFrame->opaque;
+ } else if(((lp_ac_package_data)pPackage)->ffpackage.dts != AV_NOPTS_VALUE){
+ pts = ((lp_ac_package_data)pPackage)->ffpackage.dts;
+ } else {
+ pts = 0;
+ }
+
+ if(((lp_ac_data)pDec->pacInstance)->pFormatCtx->streams[pPackage->stream_index]->start_time != AV_NOPTS_VALUE){
+ pts -= ((lp_ac_data)pDec->pacInstance)->pFormatCtx->streams[pPackage->stream_index]->start_time;
+ }
+
+ pts *= av_q2d(((lp_ac_data)pDec->pacInstance)->pFormatCtx->streams[pPackage->stream_index]->time_base);
+
+ pts = ac_sync_video(pPackage, pDec, pDecoder->pFrame, pts);
+ pDec->timecode = pts;
+/* img_convert(
+ (AVPicture*)(pDecoder->pFrameRGB), convert_pix_format(pDecoder->decoder.pacInstance->output_format),
+ (AVPicture*)(pDecoder->pFrame), pDecoder->pCodecCtx->pix_fmt,
+ pDecoder->pCodecCtx->width, pDecoder->pCodecCtx->height);*/
+
+ pDecoder->pSwsCtx = sws_getCachedContext(pDecoder->pSwsCtx,
+ pDecoder->pCodecCtx->width, pDecoder->pCodecCtx->height, pDecoder->pCodecCtx->pix_fmt,
+ pDecoder->pCodecCtx->width, pDecoder->pCodecCtx->height, convert_pix_format(pDecoder->decoder.pacInstance->output_format),
+ SWS_BICUBIC, NULL, NULL, NULL);
+
+ sws_scale(
+ pDecoder->pSwsCtx,
+ pDecoder->pFrame->data,
+ pDecoder->pFrame->linesize,
+ 0, //?
+ pDecoder->pCodecCtx->height,
+ pDecoder->pFrameRGB->data,
+ pDecoder->pFrameRGB->linesize);
+ return 1;
+ }
+ return 0;
+}
+
+int ac_decode_audio_package(lp_ac_package pPackage, lp_ac_audio_decoder pDecoder) {
+ int len1;
+ int dest_buffer_size = pDecoder->max_buffer_size;
+ int dest_buffer_pos = 0;
+ int size;
+ uint8_t *src_buffer = pPackage->data;
+ int src_buffer_size = pPackage->size;
+
+ pDecoder->decoder.buffer_size = 0;
+
+ while (src_buffer_size > 0) {
+ //Set the size of bytes that can be written to the current size of the destination buffer
+ size = dest_buffer_size;
+
+ //Decode a piece of the audio buffer. len1 contains the count of bytes read from the soure buffer.
+ /*
+ len1 = avcodec_decode_audio2(
+ pDecoder->pCodecCtx, (uint16_t*)(pDecoder->decoder.pBuffer + dest_buffer_pos), &size,
+ src_buffer, src_buffer_size);*/
+
+ len1 = avcodec_decode_audio3(
+ pDecoder->pCodecCtx, (uint16_t*)(pDecoder->decoder.pBuffer + dest_buffer_pos), &size,
+ &((lp_ac_package_data)pPackage)->ffpackage);
+
+ src_buffer_size = pPackage->size - len1;
+ src_buffer = pPackage->data + len1;
+
+ dest_buffer_size -= size;
+ dest_buffer_pos += size;
+ pDecoder->decoder.buffer_size = dest_buffer_pos;
+
+ if (dest_buffer_size <= AUDIO_BUFFER_BASE_SIZE) {
+ pDecoder->decoder.pBuffer = mgr_realloc(pDecoder->decoder.pBuffer, pDecoder->max_buffer_size * 2);
+ dest_buffer_size += pDecoder->max_buffer_size;
+ pDecoder->max_buffer_size *= 2;
+ }
+
+ if (len1 <= 0) {
+ return 1;
+ }
+ }
+
+ return 1;
+}
+
+int CALL_CONVT ac_decode_package(lp_ac_package pPackage, lp_ac_decoder pDecoder) {
+ if (pDecoder->type == AC_DECODER_TYPE_AUDIO) {
+
+ double timebase =
+ av_q2d(((lp_ac_data)pDecoder->pacInstance)->pFormatCtx->streams[pPackage->stream_index]->time_base);
+
+ //Create a valid timecode
+ if (((lp_ac_package_data)pPackage)->pts > 0) {
+ lp_ac_decoder_data dec_dat = (lp_ac_decoder_data)pDecoder;
+
+ dec_dat->last_timecode = pDecoder->timecode;
+ pDecoder->timecode = ((lp_ac_package_data)pPackage)->pts * timebase;
+
+ double delta = pDecoder->timecode - dec_dat->last_timecode;
+ double max_delta, min_delta;
+
+ if (dec_dat->sought > 0) {
+ max_delta = 120.0;
+ min_delta = -120.0;
+ --dec_dat->sought;
+ } else {
+ max_delta = 4.0;
+ min_delta = 0.0;
+ }
+
+ if ((delta < min_delta) || (delta > max_delta)) {
+ pDecoder->timecode = dec_dat->last_timecode;
+ if (dec_dat->sought > 0) {
+ ++dec_dat->sought;
+ }
+ }
+ }
+ return ac_decode_audio_package(pPackage, (lp_ac_audio_decoder)pDecoder);
+ } else if (pDecoder->type == AC_DECODER_TYPE_VIDEO) {
+ return ac_decode_video_package(pPackage, (lp_ac_video_decoder)pDecoder, pDecoder);
+ }
+ return 0;
+}
+
+//Seek function
+int CALL_CONVT ac_seek(lp_ac_decoder pDecoder, int dir, int64_t target_pos) {
+ AVRational timebase =
+ ((lp_ac_data)pDecoder->pacInstance)->pFormatCtx->streams[pDecoder->stream_index]->time_base;
+
+ int flags = dir < 0 ? AVSEEK_FLAG_BACKWARD : 0;
+
+ int64_t pos = av_rescale(target_pos, AV_TIME_BASE, 1000);
+
+ ((lp_ac_decoder_data)pDecoder)->sought = 100;
+ pDecoder->timecode = target_pos / 1000;
+ //pDecoder->timecode = 0;
+ if (av_seek_frame(((lp_ac_data)pDecoder->pacInstance)->pFormatCtx, pDecoder->stream_index,
+ av_rescale_q(pos, AV_TIME_BASE_Q, timebase), flags) >= 0) {
+ avcodec_flush_buffers(((lp_ac_video_decoder)pDecoder)->pCodecCtx);
+ return 1;
+ }
+
+ return 0;
+}
+
+//Free video decoder
+void ac_free_video_decoder(lp_ac_video_decoder pDecoder) {
+// av_free(pDecoder->decoder.pBuffer);
+ av_free(pDecoder->pFrame);
+ av_free(pDecoder->pFrameRGB);
+ if (pDecoder->pSwsCtx != NULL) {
+ sws_freeContext(pDecoder->pSwsCtx);
+ }
+ avcodec_close(pDecoder->pCodecCtx);
+
+
+ //Free reserved memory for the buffer
+ mgr_free(pDecoder->decoder.pBuffer);
+
+ //Free reserved memory for decoder record
+ mgr_free(pDecoder);
+}
+
+//Free video decoder
+void ac_free_audio_decoder(lp_ac_audio_decoder pDecoder) {
+// av_free(pDecoder->decoder.pBuffer);
+ avcodec_close(pDecoder->pCodecCtx);
+
+ //Free reserved memory for the buffer
+ mgr_free(pDecoder->decoder.pBuffer);
+
+ //Free reserved memory for decoder record
+ mgr_free(pDecoder);
+}
+
+void CALL_CONVT ac_free_decoder(lp_ac_decoder pDecoder) {
+ if (pDecoder->type == AC_DECODER_TYPE_VIDEO) {
+ ac_free_video_decoder((lp_ac_video_decoder)pDecoder);
+ }
+ else if (pDecoder->type == AC_DECODER_TYPE_AUDIO) {
+ ac_free_audio_decoder((lp_ac_audio_decoder)pDecoder);
+ }
+}
diff --git a/Game/Code/lib/acinerella/acinerella.h b/Game/Code/lib/acinerella/acinerella.h
new file mode 100644
index 00000000..778d0be1
--- /dev/null
+++ b/Game/Code/lib/acinerella/acinerella.h
@@ -0,0 +1,257 @@
+/*
+ This file is part of Acinerella.
+
+ Acinerella is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Acinerella is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Acinerella. If not, see <http://www.gnu.org/licenses/>.
+*/
+
+#ifndef VIDEOPLAY_H
+#define VIDEOPLAY_H
+
+#include <stdint.h>
+#include <stdio.h>
+#include <stdbool.h>
+
+#ifdef _WIN32
+#define CALL_CONVT __cdecl
+#else
+#define CALL_CONVT
+#endif
+
+typedef long long int64;
+
+/*Defines the type of an Acinerella media stream. Currently only video and
+ audio streams are supported, subtitle and data streams will be marked as
+ "unknown".*/
+enum _ac_stream_type {
+ /*The type of the media stream is not known. This kind of stream can not be
+ decoded.*/
+ AC_STREAM_TYPE_VIDEO = 0,
+ /*This media stream is a video stream.*/
+ AC_STREAM_TYPE_AUDIO = 1,
+ /*This media stream is an audio stream.*/
+ AC_STREAM_TYPE_UNKNOWN = -1
+};
+
+typedef enum _ac_stream_type ac_stream_type;
+
+/*Defines the type of an Acinerella media decoder.*/
+enum _ac_decoder_type {
+ /*This decoder is used to decode a video stream.*/
+ AC_DECODER_TYPE_VIDEO = 0,
+ /* This decoder is used to decode an audio stram.*/
+ AC_DECODER_TYPE_AUDIO = 1
+};
+
+typedef enum _ac_decoder_type ac_decoder_type;
+
+/*Defines the format video/image data is outputted in*/
+enum _ac_output_format {
+ AC_OUTPUT_RGB24 = 0,
+ AC_OUTPUT_BGR24 = 1,
+ AC_OUTPUT_RGBA32 = 2,
+ AC_OUTPUT_BGRA32 = 3
+};
+
+typedef enum _ac_output_format ac_output_format;
+
+/*Contains information about the whole file/stream that has been opened. Default values are ""
+for strings and -1 for integer values.*/
+struct _ac_file_info {
+ /*Information about the file*/
+ char title[512];
+ char author[512];
+ char copyright[512];
+ char comment[512];
+ char album[512];
+ int year;
+ int track;
+ char genre[32];
+
+ /*Length of the file*/
+ int64_t duration;
+
+ /*Bitrate*/
+ int bitrate;
+};
+
+typedef struct _ac_file_info ac_file_info;
+typedef ac_file_info* lp_ac_file_info;
+
+/*TAc_instance represents an Acinerella instance. Each instance can open and
+ decode one file at once. There can be only 26 Acinerella instances opened at
+ once.*/
+struct _ac_instance {
+ /*If true, the instance currently opened a media file.*/
+ bool opened;
+ /*Contains the count of streams the media file has. This value is available
+ after calling the ac_open function.*/
+ int stream_count;
+ /*Set this value to change the image output format */
+ ac_output_format output_format;
+ /*Contains information about the opened stream/file*/
+ ac_file_info info;
+};
+
+typedef struct _ac_instance ac_instance;
+/*Pointer on the Acinerella instance record.*/
+typedef ac_instance* lp_ac_instance;
+
+/*Contains information about an Acinerella video stream.*/
+struct _ac_video_stream_info {
+ /*The width of one frame.*/
+ int frame_width;
+ /*The height of one frame.*/
+ int frame_height;
+ /*The width of one pixel. 1.07 for 4:3 format, 1,42 for the 16:9 format*/
+ float pixel_aspect;
+ /*Frames per second that should be played.*/
+ double frames_per_second;
+};
+
+/*Contains information about an Acinerella audio stream.*/
+struct _ac_audio_stream_info {
+ /*Samples per second. Default values are 44100 or 48000.*/
+ int samples_per_second;
+ /*Bits per sample. Can be 8 or 16 Bit.*/
+ int bit_depth;
+ /*Count of channels in the audio stream.*/
+ int channel_count;
+};
+
+/*Additional info about the stream - use "video_info" when the stream
+ is an video stream, "audio_info" when the stream is an audio stream.*/
+union _ac_additional_stream_info {
+ struct _ac_audio_stream_info audio_info;
+ struct _ac_video_stream_info video_info;
+};
+
+/*Contains information about an Acinerella stream.*/
+struct _ac_stream_info {
+ /*Contains the type of the stream.*/
+ ac_stream_type stream_type;
+ union _ac_additional_stream_info additional_info;
+};
+
+typedef struct _ac_stream_info ac_stream_info;
+/*Pointer on TAc_stream_info*/
+typedef ac_stream_info* lp_ac_stream_info;
+
+/*Contains information about an Acinerella video/audio decoder.*/
+struct _ac_decoder {
+ /*Pointer on the Acinerella instance*/
+ lp_ac_instance pacInstance;
+ /*Contains the type of the decoder.*/
+ ac_decoder_type type;
+
+ /*The timecode of the currently decoded picture in seconds */
+ double timecode;
+
+ double video_clock;
+
+ /*Contains information about the stream the decoder is attached to.*/
+ ac_stream_info stream_info;
+ /*The index of the stream the decoder is attached to.*/
+ int stream_index;
+
+ /*Pointer to the buffer which contains the data.*/
+ char *pBuffer;
+ /*Size of the data in the buffer.*/
+ int buffer_size;
+};
+
+typedef struct _ac_decoder ac_decoder;
+/*Pointer on TAc_decoder.*/
+typedef ac_decoder* lp_ac_decoder;
+
+/*Contains information about an Acinerella package.*/
+struct _ac_package {
+ /*The data of the package. This data may not be accessible in other programming languages, because
+ currently FFMpeg doesn't reserve this memory area using the Acinerella
+ memory manager.*/
+ char *data;
+ /*The size of the package data.*/
+ int size;
+ /*The stream the package belongs to.*/
+ int stream_index;
+};
+
+typedef struct _ac_package ac_package;
+/*Pointer on TAc_package*/
+typedef ac_package* lp_ac_package;
+
+/*Callback function used to ask the application to read data. Should return
+ the number of bytes read or an value smaller than zero if an error occured.*/
+typedef int CALL_CONVT (*ac_read_callback)(void *sender, char *buf, int size);
+/*Callback function used to ask the application to seek. return 0 if succeed , -1 on failure.*/
+typedef int64_t CALL_CONVT (*ac_seek_callback)(void *sender, int64_t pos, int whence);
+/*Callback function that is used to notify the application when the data stream
+ is opened or closed. For example the file pointer should be resetted to zero
+ when the "open" function is called.*/
+typedef int CALL_CONVT (*ac_openclose_callback)(void *sender);
+
+typedef void* CALL_CONVT (*ac_malloc_callback)(size_t size);
+typedef void* CALL_CONVT (*ac_realloc_callback)(void *ptr, size_t size);
+typedef void CALL_CONVT (*ac_free_callback)(void *ptr);
+
+//Memory manager function. This allows you to bind the library to your applications memory interface.
+extern void CALL_CONVT ac_mem_mgr(ac_malloc_callback, ac_realloc_callback, ac_free_callback);
+
+/*Initializes an Acinerella instance.*/
+extern lp_ac_instance CALL_CONVT ac_init(void);
+extern void CALL_CONVT ac_free(lp_ac_instance pacInstance);
+
+/*Opens a media file.
+ @param(inst specifies the Acinerella Instance the stream should be opened for)
+ @param(sender specifies a pointer that is sent to all callback functions to
+ allow you to do object orientated programming. May be NULL.)
+ @param(open_proc specifies the callback function that is called, when the
+ media file is opened. May be NULL.)
+ @param(seek_proc specifies the callback function that is called, when the ffmpeg decoder
+ wants to seek in the file. May be NULL)
+ @param(close_proc specifies the callback function that is called when the media
+ file is closed. May be NULL.)*/
+extern int CALL_CONVT ac_open(
+ lp_ac_instance pacInstance,
+ void *sender,
+ ac_openclose_callback open_proc,
+ ac_read_callback read_proc,
+ ac_seek_callback seek_proc,
+ ac_openclose_callback close_proc);
+/*Closes an opened media file.*/
+extern void CALL_CONVT ac_close(lp_ac_instance pacInstance);
+
+/*Stores information in "pInfo" about stream number "nb".*/
+extern void CALL_CONVT ac_get_stream_info(lp_ac_instance pacInstance, int nb, lp_ac_stream_info info);
+
+/*Reads a package from an opened media file.*/
+extern lp_ac_package CALL_CONVT ac_read_package(lp_ac_instance pacInstance);
+/*Frees a package that has been read.*/
+extern void CALL_CONVT ac_free_package(lp_ac_package pPackage);
+
+/*Creates an decoder for the specified stream number. Returns NIL if no decoder
+ could be found.*/
+extern lp_ac_decoder CALL_CONVT ac_create_decoder(lp_ac_instance pacInstance, int nb);
+/*Frees an created decoder.*/
+extern void CALL_CONVT ac_free_decoder(lp_ac_decoder pDecoder);
+/*Decodes a package using the specified decoder. The decodec data is stored in the
+ "buffer" property of the decoder.*/
+extern int CALL_CONVT ac_decode_package(lp_ac_package pPackage, lp_ac_decoder pDecoder);
+
+/*Seeks to the given target position in the file. The seek funtion is not able to seek a single audio/video stream
+but seeks the whole file forward. The stream number paremter (nb) is only used for the timecode reference.
+The parameter "dir" specifies the seek direction: 0 for forward, -1 for backward.
+The target_pos paremeter is in milliseconds. Returns 1 if the functions succeded.*/
+extern int CALL_CONVT ac_seek(lp_ac_decoder pDecoder, int dir, int64_t target_pos);
+
+#endif /*VIDEOPLAY_H*/
diff --git a/Game/Code/lib/acinerella/acinerella.pas b/Game/Code/lib/acinerella/acinerella.pas
new file mode 100644
index 00000000..678a1ae3
--- /dev/null
+++ b/Game/Code/lib/acinerella/acinerella.pas
@@ -0,0 +1,282 @@
+{
+ This file is part of Acinerella.
+
+ Acinerella is free software: you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation, either version 3 of the License, or
+ (at your option) any later version.
+
+ Acinerella is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with Acinerella. If not, see <http://www.gnu.org/licenses/>.
+}
+
+{Pascal header translation for the Acinerella media decoder system. Acinerella
+ wraps around FFMpeg and allows easy use in other programming languages.}
+unit acinerella;
+
+{$IFDEF FPC}
+ {$MODE DELPHI}
+{$ENDIF}
+
+interface
+
+{$MINENUMSIZE 1}
+{$IFDEF WIN32}
+ {$ALIGN 8}
+{$ELSE}
+ {$ALIGN 4}
+{$ENDIF}
+
+const
+ {$IFDEF WIN32}
+ ac_dll = 'acinerella.dll';
+ {$ELSE}
+ {$IFDEF UNIX}
+ ac_dll = 'libacinerella.so';
+ {$ELSE}
+ {$MESSAGE Error 'Plattform not supported by Acinerella.'}
+ {$ENDIF}
+ {$ENDIF}
+
+type
+ {Defines the type of an Acinerella media stream. Currently only video and
+ audio streams are supported, subtitle and data streams will be marked as
+ "unknown".}
+ TAc_stream_type = (
+ {The type of the media stream is not known. This kind of stream can not be
+ decoded.}
+ AC_STREAM_TYPE_UNKNOWN = -1,
+ {This media stream is a video stream.}
+ AC_STREAM_TYPE_VIDEO = 0,
+ {This media stream is an audio stream.}
+ AC_STREAM_TYPE_AUDIO = 1
+ );
+
+ {Defines the type of an Acinerella media decoder.}
+ TAc_decoder_type = (
+ {This decoder is used to decode a video stream.}
+ AC_DECODER_TYPE_VIDEO = 0,
+ {This decoder is used to decode an audio stram.}
+ AC_DECODER_TYPE_AUDIO = 1
+ );
+
+ {Defines the format video/image data is outputted in}
+ TAc_output_format = (
+ AC_OUTPUT_RGB24 = 0,
+ AC_OUTPUT_BGR24 = 1,
+ AC_OUTPUT_RGBA32 = 2,
+ AC_OUTPUT_BGRA32 = 3
+ );
+
+ TAc_infostr = array[0..511] of Char;
+ TAc_infostr2 = array[0..31] of Char;
+
+ {Contains information about the whole file/stream that has been opened. Default
+ values are "" for strings and -1 for integer values.}
+ TAc_file_info = record
+ title: TAc_infostr;
+ author: TAc_infostr;
+ copyright: TAc_infostr;
+ comment: TAc_infostr;
+ album: TAc_infostr;
+ year: integer;
+ track: integer;
+ genre: TAc_infostr2;
+ duration: int64;
+ bitrate: integer;
+ end;
+
+ {TAc_instance represents an Acinerella instance. Each instance can open and
+ decode one file at once. There can be only 26 Acinerella instances opened at
+ once.}
+ TAc_instance = record
+ {If true, the instance currently opened a media file.}
+ opened: boolean;
+ {Contains the count of streams the media file has. This value is available
+ after calling the ac_open function.}
+ stream_count: integer;
+ {Set this value to change the image output format}
+ output_format: TAc_output_format;
+ {Contains information about the opened stream/file}
+ info: TAc_file_info;
+ end;
+ {Pointer on the Acinerella instance record.}
+ PAc_instance = ^TAc_instance;
+
+ {Contains information about an Acinerella audio stream.}
+ TAc_audio_stream_info = record
+ {Samples per second. Default values are 44100 or 48000.}
+ samples_per_second: integer;
+ {Bits per sample. Can be 8 or 16 Bit.}
+ bit_depth: integer;
+ {Count of channels in the audio stream.}
+ channel_count: integer;
+ end;
+
+ {Contains information about an Acinerella video stream.}
+ TAc_video_stream_info = record
+ {The width of one frame.}
+ frame_width: integer;
+ {The height of one frame.}
+ frame_height: integer;
+ {The width of one pixel. 1.07 for 4:3 format, 1,42 for the 16:9 format}
+ pixel_aspect: single;
+ {Frames per second that should be played.}
+ frames_per_second: double;
+ end;
+
+ {Contains additional info about the video stream. Use "video_info" when the stream
+ is an video stream, "audio_info" when the stream is an audio stream.}
+ TAd_additional_info = record
+ case byte of
+ 0: (video_info: TAc_video_stream_info);
+ 1: (audio_info: TAc_audio_stream_info);
+ end;
+
+ {Contains information about an Acinerella stream.}
+ TAc_stream_info = record
+ {Contains the type of the stream.}
+ stream_type: TAc_stream_type;
+ {Additional info about the stream}
+ additional_info: TAd_additional_info;
+ end;
+ {Pointer on TAc_stream_info}
+ PAc_stream_info = ^TAc_stream_info;
+
+ {Contains information about an Acinerella video/audio decoder.}
+ TAc_decoder = record
+ {Pointer on the Acinerella instance}
+ pAcInstance: pAc_instance;
+ {Contains the type of the decoder.}
+ dec_type: TAc_decoder_type;
+
+ {The timecode of the currently decoded picture in seconds.}
+ timecode: double;
+
+ video_clock: double;
+
+ {Contains information about the stream the decoder is attached to.}
+ stream_info: TAc_stream_info;
+ {The index of the stream the decoder is attached to.}
+ stream_index: integer;
+
+ {Pointer to the buffer which contains the data.}
+ buffer: PByte;
+ {Size of the data in the buffer.}
+ buffer_size: integer;
+ end;
+ {Pointer on TAc_decoder.}
+ PAc_decoder = ^TAc_decoder;
+
+ {Contains information about an Acinerella package.}
+ TAc_package = record
+ {The data of the package. This data may not be accessible, because
+ currently FFMpeg doesn't reserve this memory area using the Acinerella
+ memory manager.}
+ data: PByte;
+ {The size of the package data.}
+ size: integer;
+ {The stream the package belongs to.}
+ stream_index: integer;
+ end;
+ {Pointer on TAc_package}
+ PAc_package = ^TAc_package;
+
+ {Callback function used to ask the application to read data. Should return
+ the number of bytes read or an value smaller than zero if an error occured.}
+ TAc_read_callback = function(sender: Pointer; buf: PByte; size: integer): integer; cdecl;
+
+ {Callback function used to ask the application to seek. return 0 if succeed , -1 on failure.}
+ TAc_seek_callback = function(sender: Pointer; pos: int64; whence: integer): int64; cdecl;
+
+ {Callback function that is used to notify the application when the data stream
+ is opened or closed. For example the file pointer should be resetted to zero
+ when the "open" function is called.}
+ TAc_openclose_callback = function(sender: Pointer): integer; cdecl;
+
+{Initializes an Acinerella instance.}
+function ac_init(): PAc_instance; cdecl; external ac_dll;
+{Frees an Acinerella instance.}
+procedure ac_free(inst: PAc_instance); cdecl; external ac_dll;
+
+{Opens a media file.
+ @param(inst specifies the Acinerella Instance the stream should be opened for)
+ @param(sender specifies a pointer that is sent to all callback functions to
+ allow you to do object orientated programming. May be NULL.)
+ @param(open_proc specifies the callback function that is called, when the
+ media file is opened. May be NULL.)
+ @param(close_proc specifies the callback function that is called when the media
+ file is closed. May be NULL.)}
+function ac_open(
+ inst: PAc_instance;
+ sender: Pointer;
+ open_proc: TAc_openclose_callback;
+ read_proc: TAc_read_callback;
+ seek_proc: TAc_seek_callback;
+ close_proc: TAc_openclose_callback): integer; cdecl; external ac_dll;
+
+{Closes an opened media file.}
+procedure ac_close(inst: PAc_instance);cdecl; external ac_dll;
+
+{Stores information in "pInfo" about stream number "nb".}
+procedure ac_get_stream_info(
+ inst: PAc_instance; nb: integer; pinfo: PAc_stream_info); cdecl; external ac_dll;
+
+{Reads a package from an opened media file.}
+function ac_read_package(inst: PAc_instance): PAc_package; cdecl; external ac_dll;
+{Frees a package that has been read.}
+procedure ac_free_package(package: PAc_package); cdecl; external ac_dll;
+
+{Creates an decoder for the specified stream number. Returns NIL if no decoder
+ could be found.}
+function ac_create_decoder(pacInstance: PAc_instance; nb: integer): PAc_decoder; cdecl; external ac_dll;
+{Frees an created decoder.}
+procedure ac_free_decoder(pDecoder: PAc_decoder); cdecl; external ac_dll;
+{Decodes a package using the specified decoder. The decodec data is stored in the
+ "buffer" property of the decoder.}
+function ac_decode_package(pPackage: PAc_package; pDecoder: PAc_decoder): integer; cdecl; external ac_dll;
+
+{Seeks to the given target position in the file. The seek funtion is not able to seek a single audio/video stream
+but seeks the whole file forward. The deocder parameter is only used as an timecode reference.
+The parameter "dir" specifies the seek direction: 0 for forward, -1 for backward.
+The target_pos paremeter is in milliseconds. Returns 1 if the functions succeded.}
+function ac_seek(pDecoder: PAc_decoder; dir: integer; target_pos: int64): integer; cdecl; external ac_dll;
+
+
+implementation
+
+{Connect the library memory management to the host application. This happens
+ automatically when the application gets initialized and nobody has to care
+ about it.}
+
+function ac_mem_mgr(
+ ptr_malloc: Pointer;
+ ptr_realloc: Pointer;
+ ptr_free: Pointer): PAc_instance; cdecl; external ac_dll;
+
+function malloc(size: integer): Pointer; cdecl;
+begin
+ result := GetMemory(size);
+end;
+
+function realloc(ptr: Pointer; size: integer): pointer; cdecl;
+begin
+ result := ReallocMemory(ptr, size);
+end;
+
+procedure free(ptr: Pointer); cdecl;
+begin
+ FreeMemory(ptr);
+end;
+
+initialization
+ ac_mem_mgr(@malloc, @realloc, @free);
+
+end.
+
+
diff --git a/Game/Code/lib/acinerella/makefile b/Game/Code/lib/acinerella/makefile
new file mode 100644
index 00000000..cc5fde3b
--- /dev/null
+++ b/Game/Code/lib/acinerella/makefile
@@ -0,0 +1,13 @@
+acinerella: acinerella.c acinerella.h
+ gcc -c acinerella.c -I /usr/local/include
+
+ifeq "$(OSTYPE)" "linux"
+ gcc -shared -o libacinerella.so acinerella.o -lavformat -lavcodec -lavutil -lm -lswscale
+ strip libacinerella.so
+else
+ gcc -shared -o acinerella.dll -fPIC acinerella.o -lavformat -lavcodec -lavutil -lm -lswscale -lws2_32
+ strip acinerella.dll
+endif
+
+test: test.c acinerella.h
+ gcc -o test test.c -L. -lacinerella
diff --git a/Game/Code/lib/bass/bass.chm b/Game/Code/lib/bass/bass.chm
new file mode 100644
index 00000000..1e8c5076
--- /dev/null
+++ b/Game/Code/lib/bass/bass.chm
Binary files differ
diff --git a/Game/Code/lib/bass/bass.txt b/Game/Code/lib/bass/bass.txt
new file mode 100644
index 00000000..c60b6594
--- /dev/null
+++ b/Game/Code/lib/bass/bass.txt
@@ -0,0 +1,1546 @@
+BASS 2.3 - Copyright (c) 1999-2007 Ian Luck. All rights reserved.
+
+Files that you should have found in the BASS "package"
+======================================================
+Win32 version
+-------------
+BASS.TXT This file
+BASS.DLL The BASS module
+BASS.CHM BASS documentation
+MP3-FREE
+ BASS.DLL BASS module using the Windows MP3 decoder
+C\ C/C++ API and samples...
+ BASS.H BASS C/C++ header file
+ BASS.LIB BASS import library
+ BASS.DSW Visual C++ workspace for examples
+ MAKEFILE Makefile for all examples
+ MAKEFILE.IN Makefile helper macros
+ 3DTEST\ 3D/EAX example
+ 3DTEST.C
+ 3DTEST.RC
+ 3DTEST.DSP
+ MAKEFILE
+ BASSTEST\ Simple playback example
+ BASSTEST.C
+ BASSTEST.RC
+ BASSTEST.H
+ BASSTEST.DSP
+ MAKEFILE
+ CONTEST\ Console example
+ CONTEST.C
+ CONTEST.DSP
+ MAKEFILE
+ CUSTLOOP\ Custom looping example
+ CUSTLOOP.C
+ CUSTLOOP.DSP
+ MAKEFILE
+ DSPTEST\ DSP example
+ DSPTEST.C
+ DSPTEST.RC
+ DSPTEST.DSP
+ MAKEFILE
+ FXTEST\ DX8 effect example
+ FXTEST.C
+ FXTEST.RC
+ FXTEST.DSP
+ MAKEFILE
+ LIVEFX\ Full-duplex example
+ LIVEFX.C
+ LIVEFX.RC
+ LIVEFX.DSP
+ MAKEFILE
+ LIVESPEC\ "Live" version of spectrum analyser example
+ LIVESPEC.C
+ LIVESPEC.DSP
+ MAKEFILE
+ LOADNGET\ LoadLibrary/GetProcAddress example
+ LOADNGET.C
+ LOADNGET.RC
+ LOADNGET.DSP
+ MAKEFILE
+ MULTI\ Multiple device example
+ MULTI.C
+ MULTI.RC
+ MULTI.DSP
+ MAKEFILE
+ NETRADIO\ Internet streaming example
+ NETRADIO.C
+ NETRADIO.RC
+ NETRADIO.DSP
+ MAKEFILE
+ PLUGINS\ Plugins example
+ PLUGINS.C
+ PLUGINS.RC
+ PLUGINS.DSP
+ MAKEFILE
+ RECTEST\ Recording example
+ RECTEST.C
+ RECTEST.RC
+ RECTEST.DSP
+ MAKEFILE
+ SPEAKERS\ Multi-speaker example
+ SPEAKERS.C
+ SPEAKERS.RC
+ SPEAKERS.DSP
+ MAKEFILE
+ SPECTRUM\ Spectrum analyser example
+ SPECTRUM.C
+ SPECTRUM.DSP
+ MAKEFILE
+ SYNTH\ Synth example
+ SYNTH.C
+ SYNTH.DSP
+ MAKEFILE
+ WRITEWAV\ WAVE writer example
+ WRITEWAV.C
+ WRITEWAV.DSP
+ MAKEFILE
+ BIN\ Precompiled examples
+ 3DTEST.EXE
+ BASSTEST.EXE
+ CONTEST.EXE
+ CUSTLOOP.EXE
+ DSPTEST.EXE
+ FXTEST.EXE
+ LIVEFX.EXE
+ LIVESPEC.EXE
+ LOADNGET.EXE
+ MULTI.EXE
+ NETRADIO.EXE
+ RECTEST.EXE
+ SPEAKERS.EXE
+ SPECTRUM.EXE
+ SYNTH.EXE
+ WRITEWAV.EXE
+VB\ Visual Basic API and samples...
+ BASS.BAS BASS Visual Basic module file
+ 3DTEST\ 3D/EAX example
+ PRJ3DTEST.VBP
+ PRJ3DTEST.FRM
+ PRJDEVICE.FRM
+ BASSTEST\ Simple playback example
+ PRJBASSTEST.VBP
+ FRMBASSTEST.FRM
+ CUSTLOOP\ Custom looping example
+ PRJCUSTLOOP.VBP
+ FRMCUSTLOOP.FRM
+ MODCUSTLOOP.BAS
+ DSPTEST\ DSP example
+ PRJDSPTEST.VBP
+ FRMDSPTEST.FRM
+ MODDSPTEST.BAS
+ FXTEST\ DX8 effect example
+ PRJFXTEST.VBP
+ FRMFXTEST.FRM
+ LIVEFX\ Full-duplex example
+ PRJLIVEFX.VBP
+ FRMLIVEFX.FRM
+ MODLIVEFX.BAS
+ LIVESPEC\ "Live" version of spectrum analyser example
+ PRJLIVESPEC.VBP
+ FRMLIVESPEC.FRM
+ MODLIVESPEC.BAS
+ MULTI\ Multiple device example
+ PRJMULTI.VBP
+ PRJMULTI.FRM
+ PRJDEVICE.FRM
+ NETRADIO\ Internet streaming example
+ PRJNETRADIO.VBP
+ FRMNETRADIO.FRM
+ MODNETRADIO.BAS
+ CLSFILEIO.CLS
+ PLUGINS\ Plugins example
+ PRJPLUGINS.VBP
+ FRMPLUGINS.FRM
+ RECTEST\ Recording example
+ PRJRECTEST.VBP
+ FRMRECTEST.FRM
+ MODRECTEST.BAS
+ SPEAKERS\ Multi-speaker example
+ PRJSPEAKERS.VBP
+ FRMSPEAKERS.FRM
+ SPECTRUM\ Spectrum analyser example
+ PRJSPECTRUM.VBP
+ FRMSPECTRUM.FRM
+ MODSPECTRUM.BAS
+ SYNTH\ Synth example
+ PRJSYNTH.VBP
+ FRMSYNTH.FRM
+ MODSYNTH.BAS
+ WRITEWAV\ WAVE writer example
+ PRJWRITEWAVE.VBP
+ PRJWRITEWAVE.FRM
+ MEMORY\ Playing from memory example by Jobnik
+ PRJMEMORY.VBP
+ FRMMEMORY.FRM
+ SYNCTEST.BAS
+ CBASS_TIME.CLS
+DELPHI\ Delphi API and samples...
+ BASS.PAS BASS Delphi unit
+ 3DTEST\ 3D/EAX example
+ D3TEST.DPR
+ DTMAIN.PAS
+ DTMAIN.DFM
+ DTSELECT.PAS
+ DTSELECT.DFM
+ BASSTEST\ Simple playback example
+ BASSTEST.DPR
+ BTMAIN.PAS
+ BTMAIN.DFM
+ CONTEST\ Console example
+ CONTEST.DPR
+ CUSTLOOP\ Custom looping example
+ CUSTLOOP.DPR
+ UNIT1.PAS
+ UNIT1.DFM
+ DSPTEST\ DSP example
+ DSPTEST.DPR
+ DTMAIN.PAS
+ DTMAIN.DFM
+ FXTEST\ DX8 effect example
+ FXTEST.DPR
+ TEST.PAS
+ TEST.DFM
+ LIVEFX\ Full-duplex example
+ LIVEFX.DPR
+ UNIT1.PAS
+ UNIT1.DFM
+ MULTI\ Multiple device example
+ MULTI.DPR
+ UNIT1.PAS
+ UNIT1.DFM
+ UNIT2.PAS
+ UNIT2.DFM
+ NETRADIO\ Internet streaming example
+ NETRADIO.DPR
+ UNIT1.PAS
+ UNIT1.DFM
+ PLUGINS\ Plugins example
+ PLUGINS.DPR
+ UNIT1.PAS
+ UNIT1.DFM
+ RECORDTEST\ Recording example
+ RECORDTEST.DPR
+ UNIT1.PAS
+ UNIT1.DFM
+ SAMPLEVIS\ Visualisation example
+ SAMPLEVIS.DPR
+ MAIN.PAS
+ MAIN.DFM
+ SPECTRUM_VIS.PAS
+ CIRCLE_VIS.PAS
+ OSC_VIS.PAS
+ COMMONTYPES.PAS
+ SPEAKERS\ Multi-speaker example
+ SPEAKERS.DPR
+ UNIT1.PAS
+ UNIT1.DFM
+ STREAMTEST\ User stream example
+ STREAMTEST.DPR
+ STMAIN.PAS
+ STMAIN.DFM
+ WRITEWAV\ WAVE writer example
+ WRITEWAV.DPR
+ UNITMAIN.PAS
+ UNITMAIN.DFM
+ DYNAMIC\ Dynamic-loading Delphi API
+ DYNAMIC_BASS.PAS Dynamic-loading Delphi unit
+MASM\ MASM API and samples...
+ BASS.INC BASS MASM include file
+ PLAYER\ Example MOD player
+ PLAYER.EXE
+ PLAYER.ASM
+ RSRC.RC
+ TOOLBAR.BMP
+ COMPILE.BAT
+
+NOTE: To run the sample EXEs, first you'll have to copy BASS.DLL into the
+ same directory as the EXEs.
+
+NOTE: To avoid unnecessary bloatage, the BASS DLLs are not digitally signed.
+ Signed versions are available on request (email: bass@un4seen.com).
+
+MacOSX version
+--------------
+BASS.TXT This file
+LIBBASS.DYLIB The BASS module
+BASS.CHM BASS documentation
+CHMOX.APP CHM file viewer
+BASS.H BASS C/C++ header file
+MAKEFILE Makefile for all examples
+MAKEFILE.IN Makefile helper macros
+MP3-FREE
+ LIBBASS.DYLIB BASS module using the OSX MP3 decoder
+3DTEST\ 3D example
+ 3DTEST.C
+ MAKEFILE
+ 3DTEST.NIB
+BASSTEST\ Simple playback example
+ BASSTEST.C
+ MAKEFILE
+ BASSTEST.NIB
+CONTEST\ Console example
+ CONTEST.C
+ MAKEFILE
+CUSTLOOP\ Custom looping example
+ CUSTLOOP.C
+ MAKEFILE
+DSPTEST\ DSP example
+ DSPTEST.C
+ DSPTEST.RC
+ MAKEFILE
+ DSPTEST.NIB
+LIVESPEC\ "Live" version of spectrum analyser example
+ LIVESPEC.C
+ MAKEFILE
+MULTI\ Multiple device example
+ MULTI.C
+ MAKEFILE
+ MULTI.NIB
+NETRADIO\ Internet streaming example
+ NETRADIO.C
+ MAKEFILE
+ NETRADIO.NIB
+PLUGINS\ Plugins example
+ PLUGINS.C
+ MAKEFILE
+ PLUGINS.NIB
+RECTEST\ Recording example
+ RECTEST.C
+ MAKEFILE
+ RECTEST.NIB
+SPEAKERS\ Multi-speaker example
+ SPEAKERS.C
+ MAKEFILE
+ SPEAKERS.NIB
+SPECTRUM\ Spectrum analyser example
+ SPECTRUM.C
+ MAKEFILE
+WRITEWAV\ WAVE writer example
+ WRITEWAV.C
+ MAKEFILE
+
+
+What's the point?
+=================
+BASS is an audio library for use in Windows and MacOSX software. Its
+purpose is to provide the most powerful and efficient (yet easy to use),
+sample, stream, MOD music, and recording functions. All in a tiny DLL,
+under 100KB in size.
+
+See the documentation for descriptions of all the BASS functions. You
+should also look at the included example program source-codes for some
+examples of how to use BASS in your own programs.
+
+
+Requirements
+============
+Win32 version
+-------------
+BASS requires DirectX 3 or above for output. BASS does not require that a
+soundcard with DirectSound/DirectSound3D hardware accelerated drivers is
+installed, but it does improve performance if there is one. BASS also takes
+advantage of MMX, which improves the performance of the MOD music playback.
+
+MacOSX version
+--------------
+OSX 10.3 or above is recommended. BASS uses CoreAudio for output, so there
+are no special library/driver requirements. BASS supports both PowerPC and
+Intel Macs.
+
+
+Main Features
+=============
+* Samples
+- supports WAV/AIFF/MP3/MP2/MP1/OGG and custom generated samples
+
+* Sample streams
+- stream any sample data in 8/16/32 bit
+
+* File streams
+- MP3/MP2/MP1/OGG/WAV/AIFF file streaming
+
+* Internet file streaming
+- stream MP3/MP2/MP1/OGG/WAV/AIFF files from the internet (inc. Shout/Icecast)
+
+* User file streaming
+- stream MP3/MP2/MP1/OGG/WAV/AIFF files from anywhere using any delivery method
+
+* Multi-channel streaming
+- support for more than plain stereo, including multi-channel OGG/WAV/AIFF files
+
+* MOD music
+- uses the same engine as XMPlay = best accuracy, speed and quality
+
+* MO3 music
+- MP3/OGG compressed MOD music
+
+* Add-on system
+- support for more formats is available via add-ons (aka plugins)
+
+* Multiple outputs
+- simultaneously use multiple soundcards, and move channels between them
+
+* Recording
+- flexible recording system, with support for multiple devices
+
+* Decode without playback
+- streams and musics can be outputted in any way you want
+
+* Speaker assignment
+- assign streams and musics to specific speakers
+
+* High precision synchronization
+- synchronize events in your software to the music
+
+* DirectX 8 effects
+- chorus/compressor/distortion/echo/flanger/gargle/parameq/reverb
+
+* User defined DSP functions
+- custom effects may be applied to musics and streams
+
+* 32 bit floating-point decoding and processing
+- floating-point stream/music decoding, DSP, FX, and recording
+
+* 3D sound
+- play samples/streams/musics in any 3D position, with EAX support
+
+* Expandable
+- underlying DirectSound object interfaces are accessible
+
+* Small
+- BASS is under 100KB (on Windows), so won't bloat your distribution
+
+
+Using BASS
+==========
+There is no guarantee that all future BASS versions will be compatible
+with all previous versions, so your program should use BASS_GetVersion
+to check the version that is loaded. This also means that you should
+put the BASS module in the same directory as your executable (not just
+somewhere in the path), to avoid the possibility of a wrong version being
+loaded.
+
+If you are updating your software from a previous BASS version, then
+you should check the "History" section (below), to see if any of the
+functions that you are using have been affected by a change.
+
+Win32 version
+-------------
+C/C++, Visual Basic, Delphi and MASM APIs are provided, to use BASS with
+another language you'll first have to convert the header file. Or, as a
+last resort, you could use LoadLibrary and GetProcAddress.
+
+One benefit of the LoadLibrary method is that it allows you to look for
+the correct BASS version, because you can load and unload BASS.DLL at
+any time. This also allows those who'd prefer not to have a separate
+DLL to store it with the program (eg. in a resource), write it to disk,
+load it, use it, free it and delete it.
+
+The downside is that you have to manually import each function that you
+use, with the GetProcAddress function. But it has been made a lot simpler
+to import BASS this way by the use of the BASSDEF #define. Here's a small
+example:
+
+#define BASSDEF(f) (WINAPI *f) // define the functions as pointers
+#include "bass.h"
+...
+HINSTANCE bass=LoadLibrary("BASS.DLL"); // load BASS
+BASS_Init=GetProcAddress(bass,"BASS_Init"); // get BASS_Init
+BASS_Init(-1,44100,0,hWnd,NULL); // call BASS_Init
+
+See the LOADNGET.C file for a more complete example.
+
+To use BASS with Borland C++ Builder, you'll first have to create a
+Borland C++ Builder import library for it. This is done by using the
+IMPLIB tool that comes with Borland C++ Builder. Simply execute this:
+
+ IMPLIB BASSBCB.LIB BASS.DLL
+
+... and then use BASSBCB.LIB in your projects to import BASS.
+
+To use BASS with LCC-Win32, you'll first have to create a compatible
+import library for it. This is done by using the PEDUMP and BUILDLIB
+tools that come with LCC-Win32. Run these 2 commands:
+
+ PEDUMP /EXP BASS.LIB > BASSLCC.EXP
+ BUILDLIB BASSLCC.EXP BASSLCC.LIB
+
+... and then use BASSLCC.LIB in your projects to import BASS.
+
+For the BASS functions that return strings (char*), VB users should use
+the VBStrFromAnsiPtr function to convert the returned pointer into a VB
+string.
+
+MacOSX version
+--------------
+A separate "LIB" file is not required for OSX. Using XCode, you can simply
+add the DYLIB file to the project. Or using a makefile, you can build your
+programs like this, for example:
+
+ gcc yoursource -L. -lbass -o yourprog
+
+The LIBBASS.DYLIB file must be put in the same directory as the executable
+(it can't just be somewhere in the path). See the example makefiles.
+
+LIBBASS.DYLIB is a universal binary, with support for both PowerPC and
+Intel Macs. If you want PowerPC-only or Intel-only versions, the included
+makefile can create them for you, by typing "make ppc" or "make i386". It
+will also process any BASS add-ons placed in the same directory.
+
+
+Latest Version
+==============
+The latest version of BASS can always be found at the BASS website:
+
+ www.un4seen.com
+
+
+Copyright, disclaimer, and all that other jazz
+==============================================
+The BASS library is free for non-commercial use. If you are a non-
+commercial entity (eg. an individual) and are not charging for your
+product, and the product has no other commercial purpose, then you
+can use BASS in it for free. If you wish to use BASS in commercial
+products, then please also see the next section.
+
+TO THE MAXIMUM EXTENT PERMITTED BY APPLICABLE LAW, BASS IS PROVIDED
+"AS IS", WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED,
+INCLUDING BUT NOT LIMITED TO THE IMPLIED WARRANTIES OF MERCHANTABILITY
+AND/OR FITNESS FOR A PARTICULAR PURPOSE. THE AUTHORS SHALL NOT BE HELD
+LIABLE FOR ANY DAMAGE THAT MAY RESULT FROM THE USE OF BASS. BASICALLY,
+YOU USE BASS ENTIRELY AT YOUR OWN RISK.
+
+Usage of BASS indicates that you agree to the above conditions.
+
+All trademarks and other registered names contained in the BASS
+package are the property of their respective owners.
+
+
+BASS in commercial products?
+============================
+BASS is available for use in your commercial products. The licence
+types available are as follows:
+
+SHAREWARE: Allows the usage of BASS in an unlimited number of your
+shareware products, which must sell for no more than 40 Euros each.
+If you're an individual making and selling your own software (and
+its price is within the limit), this is the licence for you.
+
+SINGLE COMMERCIAL: Allows the usage of BASS in a single commercial
+product.
+
+UNLIMITED COMMERCIAL: Allows the usage of BASS in an unlimited number
+of your commercial products. This licence is on a per site basis. So
+if your company has two sites that use BASS, then two licences are
+required.
+
+Please note the products must be end-user products, eg. not components
+used by other products.
+
+These licences only cover your own software. not the publishing of
+other's software. If you publish other's software, its developers (or
+the software itself) will need to be licensed to use BASS.
+
+These licences are on a per-platform basis, with reductions available
+when licensing for both platforms. In all cases there are no royalties
+to pay, and you can use future BASS updates without further cost. One
+licence covers one person or entity and is not transferable.
+
+These licences do not allow reselling/sublicensing of BASS. For example,
+if a product is a development system, the users of said product are not
+licensed to use BASS in their productions - they will need their own
+licences.
+
+If the standard licences do not meet your requirements, or if you have
+any questions, please get in touch (email: bass@un4seen.com).
+
+Visit the BASS website for the latest pricing:
+
+ www.un4seen.com
+
+
+MP3
+===
+MP3 technology is patented, and Thomson license the use of their and
+Fraunhofer's patents. The inclusion of an MP3 decoder (eg. BASS) in a
+commercial product requires an MP3 patent licence. Contact Thomson for
+details:
+
+ www.mp3licensing.com
+
+Alternatively, the "MP3-FREE" BASS version doesn't include its own MP3
+decoder but instead makes use of the operating system's already licensed
+decoder.
+
+NOTE: When using the OS's MP3 decoder, BASS still does the file handling
+ so all the usual features are still supported, including streaming,
+ tag reading, pre-scanning, gapless playback, etc...
+
+
+History
+=======
+These are the major (and not so major) changes at each version stage.
+There are of course bug fixes and other little improvements made along
+the way too! To make upgrading simpler, all functions affected by a
+change to the BASS interface are listed.
+
+2.3.0.3 - 30/7/2007
+-------------------
+* FX state resetting
+ BASS_FXReset
+* PLS/M3U playlist URL processing
+ BASS_CONFIG_NET_PLAYLIST
+ NETRADIO example updated
+* Internet stream connection status retrieval
+ BASS_FILEPOS_CONNECTED (BASS_StreamGetFilePosition mode)
+* Lyrics3v2 tags
+ BASS_TAG_LYRICS3 (BASS_ChannelGetTags type)
+* IT virtual channel configuration
+ BASS_CONFIG_MUSIC_VIRTUAL
+* Accurate speaker detection on Vista
+ BASS_INFO (speakers member)
+* Device output/input rate retrieval on Vista
+ BASS_INFO (freq member)
+ BASS_RECORDINFO (freq member)
+* Syncing upon position changes
+ BASS_SYNC_SETPOS (BASS_ChannelSetSync type)
+* Improved stall handling
+ BASS_SYNC_STALL
+* Invalid decoding channel flags produce an error instead of being ignored
+ BASS_StreamCreate/File/User/Url
+ BASS_MusicLoad
+
+2.3.0.2 - 22/1/2007
+-------------------
+* Retrieval of a sample's existing channel handles
+ BASS_SampleGetChannels
+* 8192 sample FFT
+ BASS_DATA_FFT8192 (BASS_ChannelGetData flag)
+* Adjustable recording buffer
+ BASS_CONFIG_REC_BUFFER (BASS_SetConfig option)
+* Stopping decoding channels before the end
+ BASS_ChannelStop
+* Sample channels created paused to prevent overriding before playback
+ BASS_SampleGetChannel
+* Separate "MP3-FREE" version using Windows/OSX MP3 decoder
+ BASS_CONFIG_MP3_CODEC *removed*
+
+2.3.0.1 - 12/6/2006
+-------------------
+* Ability to move a channel to another device
+ BASS_ChannelSetDevice
+ MULTI example updated
+* Support for ID3v2.4 tags at end of file
+ BASS_TAG_ID3V2 (BASS_ChannelGetTags type)
+
+2.3 - 21/5/2006
+---------------
+* MOD message/instrument/sample text retrieval, merged with stream tag retrieval function
+ BASS_ChannelGetTags
+ BASS_TAG_MUSIC_NAME/MESSAGE/INST/SAMPLE (BASS_ChannelGetTags types)
+ BASS_MusicGetName *removed*
+ BASS_StreamGetTags *removed*
+* Plugin information retrieval
+ BASS_PluginGetInfo
+ BASS_PLUGININFO/FORM structures
+ BASS_CHANNELINFO (plugin member)
+ PLUGINS example updated
+* RIFF/WAVE "INFO" tag retrieval
+ BASS_TAG_RIFF_INFO (BASS_StreamGetTags type)
+* More specific WAVE format information
+ BASS_CTYPE_STREAM_WAV_PCM/FLOAT (channel types)
+ BASS_CTYPE_STREAM_WAV (channel type flag)
+* Proxy server configuration
+ BASS_CONFIG_NET_PROXY (BASS_SetConfig option)
+ BASS_CONFIG_NET_NOPROXY *removed*
+ NETRADIO example updated
+* Passive FTP mode
+ BASS_CONFIG_NET_PASSIVE (BASS_SetConfig option)
+* Agent changes take immediate effect
+ BASS_CONFIG_NET_AGENT (BASS_SetConfig option)
+* Minimum time gap between creating new sample channels
+ BASS_SAMPLE (mingap member)
+ BASS_SampleGetChannel
+* Support for Unicode plugin filenames
+ BASS_PluginLoad
+* Device output/input rate retrieval (MacOSX only)
+ BASS_INFO (freq member)
+ BASS_RECORDINFO (freq member)
+* Extended version info (minor revision)
+ BASS_GetVersion
+* Unsupported codec error code
+ BASS_ERROR_CODEC
+* Optional use of the Windows MP3 codec
+ BASS_CONFIG_MP3_CODEC (BASS_SetConfig option)
+* 3D support for MacOSX
+ BASS_Set3DFactors
+ BASS_Get3DFactors
+ BASS_Set3DPosition
+ BASS_Get3DPosition
+ BASS_Apply3D
+ BASS_ChannelSet3DAttributes
+ BASS_ChannelGet3DAttributes
+ BASS_ChannelSet3DPosition
+ BASS_ChannelGet3DPosition
+ 3DTEST example added (Win32 example also updated)
+* VB version of SYNTH example added
+
+2.2 - 2/10/2005
+---------------
+* Add-on plugin system
+ BASS_PluginLoad
+ BASS_PluginFree
+ BASS_StreamCreateFile/User/Url
+ BASS_SampleLoad
+ PLUGINS example added
+* MOD position & syncing in bytes
+ BASS_ChannelSetPosition
+ BASS_ChannelGetPosition
+ BASS_MusicGetOrderPosition added for orders position
+ BASS_SYNC_MUSICPOS added for orders syncing
+ MAKEMUSICPOS macro/define
+ CUSTLOOP example updated
+* Stream/MOD "length" functions combined (also works with samples), new MOD orders length function
+ BASS_ChannelGetLength
+ BASS_MusicGetOrders
+ BASS_StreamGetLength *removed*
+ BASS_MusicGetLength *removed*
+* Support for AIFF files
+ BASS_StreamCreateFile/User/Url
+ BASS_SampleLoad
+* Support for 24 and 32-bit (integer) WAV files
+ BASS_StreamCreateFile/User/Url
+ BASS_SampleLoad
+* WAV files are no longer converted to the "device" resolution
+ BASS_StreamCreateFile/User/Url
+* Recording master control
+ BASS_RecordGetInput
+ BASS_RecordSetInput
+* Adjustable prebuffering
+ BASS_ChannelPreBuf
+* Floating-point data retrieval
+ BASS_DATA_FLOAT (BASS_ChannelGetData flag)
+* Support for floating-point samples
+ BASS_SampleLoad
+ BASS_SampleCreate
+* Multi-channel samples
+ BASS_SampleLoad/Create
+ BASS_SAMPLE (chans member)
+* Sample lengths given in bytes
+ BASS_SampleCreate
+ BASS_SAMPLE (length member)
+* MOD music 8-bit resolution option
+ BASS_MusicLoad
+* OGG vendor tag retrieval
+ BASS_TAG_VENDOR (BASS_StreamGetTags type)
+* Configurable "User-Agent" header for internet streams
+ BASS_CONFIG_NET_AGENT (BASS_SetConfig option)
+* Shoutcast metadata is now requested automatically
+ BASS_STREAM_META flag *removed*
+* Download callbacks receive all data from start of file/stream (including any non-audio data)
+ DOWNLOADPROC
+* Length when streaming in blocks is unavailable (BASS_ERROR_NOTAVAIL, not just 0)
+ BASS_ChannelGetLength
+* Support for growing custom file streams
+ BASS_FILE_LEN (STREAMFILEPROC action)
+* Query file action removed
+ BASS_FILE_QUERY *removed*
+* Recording channel syncing
+ BASS_ChannelSetSync
+* Info structure "size" members removed
+ BASS_INFO structure
+ BASS_RECORDINFO structure
+* Little bit of flag reshuffling
+ BASS_MP3_SETPOS renamed to BASS_STREAM_PRESCAN
+ BASS_MUSIC_CALCLEN value changed and renamed to BASS_MUSIC_PRESCAN
+ BASS_MUSIC_POSRESET value changed
+* Add-on API enhancements
+* MacOSX port introduced
+
+2.1 - 28/11/2004
+----------------
+* Improved "mixtime" sync system, allowing custom looping
+ SYNCPROC
+ CUSTLOOP example added
+* FX can now be in the DSP chain, so can be prioritized and applied in floating-point
+ BASS_ChannelSetFX
+ BASS_CONFIG_FLOATDSP (BASS_SetConfig option)
+* Ability to set channel flags (eg. looping) independent of playback
+ BASS_ChannelSetFlags
+ SPEAKERS example updated
+* Stream/MOD "play" and channel "resume" functions combined
+ BASS_ChannelPlay
+ BASS_StreamPlay *removed*
+ BASS_MusicPlay *removed*
+ BASS_MusicPlayEx *removed*
+ BASS_ChannelResume *removed*
+* Stream/MOD prebuffering functions combined
+ BASS_ChannelPreBuf
+ BASS_StreamPreBuf *removed*
+ BASS_MusicPreBuf *removed*
+* MOD attribute functions combined, with added BPM/speed/globalvolume options
+ BASS_MusicSetAttribute
+ BASS_MusicGetAttribute
+ BASS_MUSIC_ATTRIB_AMPLIFY
+ BASS_MUSIC_ATTRIB_PANSEP
+ BASS_MUSIC_ATTRIB_PSCALER
+ BASS_MUSIC_ATTRIB_BPM
+ BASS_MUSIC_ATTRIB_SPEED
+ BASS_MUSIC_ATTRIB_VOL_GLOBAL
+ BASS_MUSIC_ATTRIB_VOL_CHAN
+ BASS_MUSIC_ATTRIB_VOL_INST
+ BASS_MusicSetAmplify *removed*
+ BASS_MusicSetPanSep *removed*
+ BASS_MusicSetPositionScaler *removed*
+ BASS_MusicSetVolume *removed*
+ BASS_MusicGetVolume *removed*
+* Flag to reset bpm/etc as well as notes when seeking in MOD musics
+ BASS_MUSIC_POSRESETEX (BASS_MusicLoad & BASS_ChannelSetFlags flag)
+* More flexible and concise sample channel creation system
+ BASS_SampleGetChannel
+ BASS_SamplePlay *removed*
+ BASS_SamplePlayEx *removed*
+ BASS_SamplePlay3D *removed*
+ BASS_SamplePlay3DEx *removed*
+* Support for up to 30 speakers
+ BASS_SPEAKER_N macro/define
+* More precise level measurement
+ BASS_ChannelGetLevel
+* Level can now be retrieved from decoding channels
+ BASS_ChannelGetLevel
+* Retrieval of a sample/channel's original sample resolution
+ BASS_SAMPLE (origres member)
+ BASS_CHANNELINFO (origres member)
+* Support for streaming WAV files in "blocks"
+ BASS_StreamCreateURL
+ BASS_StreamCreateFileUser
+* Status info (HTTP/ICY tags) available during connection to server
+ BASS_STREAM_STATUS (BASS_StreamCreateURL flag)
+ DOWNLOADPROC
+ NETRADIO example updated (Delphi version also added)
+* Adjustable internet stream prebuffering
+ BASS_CONFIG_NET_PREBUF (BASS_SetConfig option)
+* Option to bypass proxy server
+ BASS_CONFIG_NET_NOPROXY (BASS_SetConfig option)
+* Option whether to allow channels to be played after BASS_Pause
+ BASS_CONFIG_PAUSE_NOPLAY (BASS_SetConfig option)
+* Recording channel count now a separate parameter
+ BASS_RecordStart (chans parameter)
+* Synchronizer for when a channel is freed
+ BASS_SYNC_FREE (BASS_ChannelSetSync type)
+* Data start file position retrieval
+ BASS_FILEPOS_START (BASS_StreamGetFilePosition mode)
+* Performance improvements
+ MP2 decoding ~20% faster
+ MP3/MP1 decoding & FFT processing all up to 10% faster
+ OGG decoding ~3% faster
+* C/C++ examples reorganised, with makefiles & VC++ projects
+* Add-on API enhancements
+* More DLL shrinkage :)
+
+2.0 - 31/10/2003
+----------------
+* Multiple output device support
+ BASS_Init (device number changes)
+ BASS_SetDevice
+ BASS_GetDevice
+ BASS_ChannelGetDevice
+ MULTI example updated (VB version also added)
+* Multiple recording device support
+ BASS_RecordSetDevice
+ BASS_RecordGetDevice
+ BASS_RecordStart
+ BASS_ChannelGetDevice
+ HRECORD handle
+ RECORDPROC (handle parameter)
+* Recording with DSP/FX
+ BASS_ChannelSetDSP
+ BASS_ChannelSetFX
+* Recording position retrieval
+ BASS_ChannelGetPosition
+* Start recording paused
+ BASS_RECORD_PAUSE (BASS_RecordStart flag)
+* Multi-channel streams, inc. support for multichannel OGG & WAV files
+ BASS_StreamCreate
+ BASS_StreamCreateFile/User/Url
+* FFT for individual channels, inc. multi-channel streams
+ BASS_DATA_FFT_INDIVIDUAL (BASS_ChannelGetData flag)
+ BASS_DATA_FFT512S/1024S/2048S/4096S *removed*
+* DSP prioritizing
+ BASS_ChannelSetDSP
+ DSPTEST example updated
+* Seeking in internet streamed files
+ BASS_ChannelSetPosition
+* Enhanced custom file stream systems
+ BASS_StreamCreateFileUser
+ BASS_FILE_SEEK (STREAMFILEPROC action)
+ BASS_STREAM_FILEPROC flag *removed*
+* Enhanced custom stream system with automatic stalling/resuming
+ STREAMPROC
+ BASS_STREAMPROC_END (STREAMPROC flag)
+* Synchronizer for stalled/resumed playback
+ BASS_SYNC_STALL (BASS_ChannelSetSync type)
+* Synchronizer for completed download
+ BASS_SYNC_DOWNLOAD (BASS_ChannelSetSync type)
+* End sync support for custom streams
+ BASS_SYNC_END (BASS_ChannelSetSync type)
+* Synchronizer support for decoding channels
+ BASS_ChannelSetSync
+* Unified configuration function
+ BASS_SetConfig
+ BASS_GetConfig
+ BASS_SetBufferLength *removed*
+ BASS_SetNetConfig *removed*
+ BASS_SetGlobalVolumes *removed*
+ BASS_GetGlobalVolumes *removed*
+ BASS_SetLogCurves *removed*
+ BASS_Set3DAlgorithm *removed*
+ BASS_DEVICE_FLOATDSP flag *removed*
+* Internet stream saving to disk replaced by more flexible callback
+ BASS_StreamCreateURL
+ DOWNLOADPROC
+ VB NETRADIO example updated
+* Buffer length retrieval when "streaming in blocks"
+ BASS_FILEPOS_END (BASS_StreamGetFilePosition mode)
+* Individual sample rate setting for MOD musics
+ BASS_MusicLoad
+* Channel type and default sample rate retrieval
+ BASS_ChannelGetInfo (replaces BASS_ChannelGetFlags)
+ BASS_CHANNELINFO
+* MOD music flag retrieval
+ BASS_CHANNELINFO (flags member)
+* Adjustable instrument volumes in MOD musics
+ BASS_MusicSetVolume (replaces BASS_MusicSetChannelVol)
+ BASS_MusicGetVolume (replaces BASS_MusicGetChannelVol)
+* Automatically free a MOD music when it stops or ends
+ BASS_MUSIC_AUTOFREE (BASS_MusicLoad flag)
+* Class GUID added to initialization parameters
+ BASS_Init
+ BASS_SetCLSID *removed*
+* Update period adjustable at any time
+ BASS_CONFIG_UPDATEPERIOD (BASS_SetConfig option)
+ BASS_DEVICE_NOTHREAD flag *removed*
+* Customizable maximum volume setting
+ BASS_CONFIG_MAXVOL (BASS_SetConfig option)
+ BASS_DEVICE_VOL1000 flag *removed*
+* Device volume is now always left as it is during init/freeing
+ BASS_DEVICE_LEAVEVOL flag *removed*
+* Device driver name retrieval
+ BASS_INFO (driver member)
+ BASS_RECORDINFO (driver member)
+* Error codes are local to the current thread
+ BASS_ErrorGetCode
+* Performance improvements
+ MP2 decoding 15-20% faster
+ MP3 decoding ~5% faster
+* Built-in CD functions removed (replaced in BASSCD)
+ BASS_CDDoor *removed*
+ BASS_CDFree *removed*
+ BASS_CDGetID *removed*
+ BASS_CDGetTrackLength *removed*
+ BASS_CDGetTracks *removed*
+ BASS_CDInDrive *removed*
+ BASS_CDInit *removed*
+ BASS_CDPlay *removed*
+* Force channels to use software mixing
+ BASS_SAMPLE_SOFTWARE (BASS_StreamCreate/File/User/URL & BASS_MusicLoad flag)
+* Support for high-pass filter and forward/reverse (S9E/F) IT/MPT effects
+* BASS_MUSIC flags rearranged to mirror BASS_SAMPLE/STREAM counterparts
+* Output automatically started during initialization
+* BASS_ChannelGetData once again accepts any "length" param
+* All function comments have been removed from the API headers to avoid
+ outdated/incorrect information - the BASS.CHM documentation should be used.
+* TMT Pascal API removed from main distribution - now available on the website
+* A few more 'K' knocked off the DLL size :)
+
+1.8a - 18/6/2003
+----------------
+* Tweaks 'n' fixes, including...
+ Fixed seeking bug on 32-bit OGG streams
+ Fixed seeking on a decoding channel after it has reached the end
+ Low FPU precision (eg. when using Direct3D) issue addressed
+ Improved speakers (BASS_INFO) detection
+ BASS_ChannelSeconds2Bytes return value is rounded down to nearest sample
+ BASS_ChannelGetData "length" param must equal a whole number of samples
+ Slide syncs are triggered by "-2" volume slides on "autofree" streams
+* Support for UNICODE filenames
+ BASS_UNICODE (BASS_SampleLoad/BASS_StreamCreateFile/BASS_MusicLoad flag)
+* 4096 sample FFT
+ BASS_DATA_FFT4096/S (BASS_ChannelGetData flags)
+* Another 'K' knocked off the DLL size
+
+1.8 - 9/3/2003
+--------------
+* 32-bit floating-point channels
+ BASS_SAMPLE_FLOAT (BASS_StreamCreate/URL/File flag)
+ BASS_MUSIC_FLOAT (BASS_MusicLoad flag)
+ BASS_SAMPLE_FLOAT (BASS_RecordStart flag)
+ BASS_DEVICE_FLOATDSP (BASS_Init flag)
+ DSPTEST example updated
+* Support for 32-bit floating-point (type 3) WAV files
+ BASS_StreamCreateFile/URL
+ BASS_SampleLoad
+* Channel speaker assignment
+ BASS_SPEAKER_FRONT (BASS_MusicLoad/BASS_StreamCreate/File/URL flag)
+ BASS_SPEAKER_REAR "
+ BASS_SPEAKER_CENLFE "
+ BASS_SPEAKER_REAR2 "
+ BASS_SPEAKER_FRONTLEFT "
+ BASS_SPEAKER_FRONTRIGHT "
+ BASS_SPEAKER_REARLEFT "
+ BASS_SPEAKER_REARRIGHT "
+ BASS_SPEAKER_CENTER "
+ BASS_SPEAKER_LFE "
+ BASS_SPEAKER_REAR2LEFT "
+ BASS_SPEAKER_REAR2RIGHT "
+ BASS_INFO (speakers member)
+ BASS_DEVICE_SPEAKERS (BASS_Init flag)
+ 4SPEAKER example replaced by SPEAKERS example
+* Recording input type retrieval
+ BASS_INPUT_TYPE_xxx (BASS_RecordGetInput)
+ RECTEST example updated
+* Non-interpolated MOD mixing
+ BASS_MUSIC_NONINTER (BASS_MusicLoad/PlayEx flag)
+* Performance improvements
+ FFT up to 100% faster!
+ MP3(MPEG2/2.5) decoding up to 60% faster
+ MMX mixers 5-10% faster
+ MP3(MPEG1)/MP2/MP1/OGG decoding all ~5% faster
+* Optional disabling of FFT windowing
+ BASS_DATA_FFT_NOWINDOW (BASS_ChannelGetData flag)
+* BASS_ERROR_FILEFORM - error code to distinguish between file and sample format
+ BASS_MusicLoad
+ BASS_SampleLoad
+ BASS_StreamCreate/File/URL
+* BASS_StreamGetFilePosition mode flags added
+ BASS_FILEPOS_DECODE/DOWNLOAD/END
+* DirectX 9 detection
+ BASS_INFO (dsver member)
+* Initialization flags retrieval
+ BASS_INFO (initflags member)
+* Half-rate MP3 playback option removed
+ BASS_MP3_HALFRATE flag *removed*
+* New internal "plugin" system - BASSWMA is further integrated as a result
+* Improved documentation - integrated with BASSWMA, search option added
+* VB version of DSPTEST example added
+* Delphi RECORDTEST example added
+* Guess what... reduced DLL size again :)
+
+1.7 - 27/10/2002
+----------------
+* New alternative DX8 (DMO) effects implementation
+ BASS_StreamCreate/File/URL
+ BASS_MusicLoad
+ BASS_ChannelSetFX
+ SYNTH example updated
+* User file streaming
+ BASS_STREAM_FILEPROC (BASS_StreamCreate flag)
+ STREAMFILEPROC
+* DSP & FX support for decoding channels
+ BASS_ChannelSetDSP
+ BASS_ChannelSetFX
+* Support for DX8 (DMO) effects in IT/XM/MO3 files
+ BASS_MusicLoad
+* Support for chained OGG streaming (and syncing)
+ BASS_StreamCreateURL
+ BASS_SYNC_META (BASS_ChannelSetSync type)
+* Attribute (volume/frequency/pan) sliding
+ BASS_ChannelSlideAttributes
+ BASS_ChannelIsSliding
+ BASS_SYNC_SLIDE (BASS_ChannelSetSync type)
+* Recording without a callback function
+ BASS_RecordStart
+ LIVEFX example added
+* Query a channel's buffered data
+ BASS_DATA_AVAILABLE (BASS_ChannelGetData flag)
+* Discard data from the recording buffer
+ BASS_ChannelGetData
+* Adjustable internet stream config (timeout/buffer lengths)
+ BASS_SetNetConfig
+* Recommended minimum buffer length
+ BASS_INFO (minbuf member)
+* MOD music flags adjustment without changing playback position
+ BASS_MusicPlayEx
+ PLAYER (MASM) example updated
+* More functions are now useable in MOD music "mixtime" syncs
+ SYNCPROC
+ BASS_ChannelSetPosition
+ BASS_MusicPlayEx
+ BASS_MusicSetAmplify
+ BASS_MusicSetPanSep
+* Maximum buffer length increased to 5 seconds
+ BASS_SetBufferLength
+* Support for extended filter range in IT files
+ BASS_MusicLoad
+* Speedier MOD music file verification
+ BASS_MusicLoad
+* Delphi 3DTEST example fixed
+* Magically reduced DLL size again :)
+
+1.6a - 25/8/2002
+----------------
+* OGG support updated to 1.0
+* Stereo FFT
+ BASS_DATA_FFT512S/1024S/2048S (BASS_ChannelGetData flags)
+* Support for "Invert Loop" (EFx) MOD effect
+* Reduced DLL size
+* New Delphi examples
+ WRITEWAV - WAVE writer example
+ SAMPLEVIS - Visualisation example
+
+1.6 - 13/6/2002
+---------------
+* 64-bit stream lengths and positions
+ BASS_StreamGetLength
+ BASS_ChannelBytes2Seconds
+ BASS_ChannelSeconds2Bytes
+ BASS_ChannelGetPosition
+ BASS_ChannelSetPosition
+ BASS_ChannelSetSync
+* Recording input selection
+ BASS_RECORDINFO (inputs & singlein members)
+ BASS_RecordGetInputName
+ BASS_RecordGetInput
+ BASS_RecordSetInput
+* Adjustable recording update period
+ BASS_RecordStart
+* Load OGG files as samples
+ BASS_SampleLoad
+* CD drive door opening & closing
+ BASS_CDDoor
+* CDDB2 ID retrieval
+ BASS_CDID_CDDB2 (BASS_CDGetID flag)
+* Streaming beyond initial file length
+ BASS_StreamCreateFile
+* Recording position bytes<->seconds translation
+ BASS_ChannelBytes2Seconds
+ BASS_ChannelSeconds2Bytes
+* Improved multi-threaded support (play from any thread)
+ BASS_MusicPlay/Ex
+ BASS_SamplePlay/3D/Ex
+ BASS_StreamPlay
+ BASS_DEVICE_NOSYNC flag *removed*
+* Paused channel status
+ BASS_ACTIVE_PAUSED (BASS_ChannelIsActive)
+* Integrated WMA stream freeing
+ BASS_StreamFree
+ BASS_Free
+* Pin-point accurate OGG seeking without BASS_MP3_SETPOS flag
+* Win2k DS buffer bug fix
+
+1.5a - 14/4/2002
+----------------
+* NT4 fix (also enables "nosound" device without DX installed)
+ BASS_ERROR_DX error code
+* MOD music loading without the samples
+ BASS_MUSIC_NOSAMPLE (BASS_MusicLoad flag)
+* Custom decoding channels
+ BASS_STREAM_DECODE (BASS_StreamCreate flag)
+* 5 second HTTP connection timeout
+ BASS_ERROR_TIMEOUT (BASS_StreamCreateURL error code)
+
+1.5 - 31/3/2002
+---------------
+* Improved performance
+ MMX mixers lot faster (over 50% faster in some cases!)
+ OGG decoding 15-20% faster
+ MP3 decoding 5-10% faster
+* Recording
+ BASS_RecordGetDeviceDescription
+ BASS_RecordInit
+ BASS_RecordFree
+ BASS_RecordGetInfo
+ BASS_RecordStart
+* OGG support built-in (OGG/VORBIS DLLs not required)
+ BASS_DEVICE_OGG flag *removed*
+* MOD music seeking in seconds
+ BASS_MusicPlayEx
+ BASS_ChannelSetPosition
+* Shoutcast metadata retrieval
+ BASS_STREAM_META (BASS_StreamCreateURL flag)
+ BASS_TAG_META (BASS_StreamGetTags type)
+ BASS_SYNC_META (BASS_ChannelSetSync type)
+* 1000 volume levels
+ BASS_DEVICE_VOL1000 (BASS_Init/CDInit flag)
+* CDDB ID retrieval
+ BASS_CDID_CDDB (BASS_CDGetID flag)
+* Leave the CD volume as it is during init/closing
+ BASS_DEVICE_LEAVEVOL (BASS_CDInit flag)
+* FFT enabled on decoding channels
+ BASS_ChannelGetData
+* Left level duplicated on right for mono channels
+ BASS_ChannelGetLevel
+* Improved MPEG length estimation without BASS_MP3_SETPOS flag
+ BASS_StreamGetLength
+* Support for Modplug/ADPCM compressed files
+ BASS_MusicLoad
+* Device description function parameter change
+ BASS_GetDeviceDescription
+* MASM API
+
+1.4 - 30/1/2002
+---------------
+* Channel decoding without playback
+ BASS_MUSIC_DECODE (BASS_MusicLoad flag)
+ BASS_STREAM_DECODE (BASS_StreamCreateFile/URL flag)
+ BASS_ChannelGetData
+* Windows message sync callbacks
+ BASS_SYNC_MESSAGE (BASS_ChannelSetSync flag)
+* Adjustable channel volumes in MOD musics
+ BASS_MusicSetChannelVol
+ BASS_MusicGetChannelVol
+* Customizable DirectSound initialization object
+ BASS_SetCLSID
+* Retrieve HMUSIC/HSTREAM/HCHANNEL IDirectSoundBuffer interfaces
+ BASS_GetDSoundObject
+* A3D functions removed (use BASS_SetCLSID/BASS_GetDSoundObject to access A3D)
+ BASS_DEVICE_A3D (BASS_Init flag)
+ BASS_SetA3DResManager
+ BASS_GetA3DResManager
+ BASS_SetA3DHFAbsorbtion
+ BASS_GetA3DHFAbsorbtion
+* Callback functions now work in VB6
+ DSPPROC
+ STREAMPROC
+ SYNCPROC
+* Improved PCM WAVE streaming performance
+ BASS_StreamCreateFile
+ BASS_StreamCreateURL
+* OGG modules updated to RC3
+* Stereo sample support in MO3 format
+* MO3 encoder now distributed separately from BASS
+
+1.3 - 17/11/2001
+----------------
+* Manual buffer updating
+ BASS_DEVICE_NOTHREAD (BASS_Init flag)
+ BASS_Update
+* Adjustable buffer update period (allows small buffer sizes)
+ BASS_Init
+* Output device latency retrieval
+ BASS_INFO (latency member)
+* MPEG/OGG seeking without BASS_MP3_SETPOS flag
+ BASS_ChannelSetPosition
+* Internet file streaming from offsets
+ BASS_StreamCreateURL
+* File stream tag/comment retrieval (ID3/ID3v2/OGG/HTTP/ICY tags)
+ BASS_StreamGetTags
+* Byte<->time position translation
+ BASS_ChannelBytes2Seconds
+ BASS_ChannelSeconds2Bytes
+* UMX (Unreal/Tournament music package) format support
+ BASS_MusicLoad
+* S3M/IT sync fx changed to S2x (S0x conflicted with S00)
+ BASS_SYNC_MUSICFX
+* Stereo sample support in IT/XM/S3M formats
+* MO3: OGG compression supported
+
+1.2 - 25/9/2001
+---------------
+* OGG (Ogg Vorbis) stream support
+ BASS_DEVICE_OGG (BASS_Init flag)
+ BASS_StreamCreateFile
+ BASS_StreamCreateURL
+* Channel linking (start/stop/pause/resume channels together)
+ BASS_ChannelSetLink
+ BASS_ChannelRemoveLink
+* MOD music playback length calculation
+ BASS_MUSIC_CALCLEN (BASS_MusicLoad flag)
+ BASS_MusicGetLength
+* Pre-buffering
+ BASS_MusicPreBuf
+ BASS_StreamPreBuf
+* Samples with single simultaneous playbacks have same HSAMPLE/HCHANNEL handle
+ BASS_SamplePlay/Ex
+* Stopping a custom stream flushes its buffer contents
+ BASS_ChannelStop
+
+1.1a - 31/8/2001
+----------------
+* NT4 bug fixed
+* XM Wxx effect syncing
+ BASS_SYNC_MUSICFX
+* MP3/2/1 rewinding without BASS_MP3_SETPOS
+ BASS_ChannelSetPosition
+
+1.1 - 11/8/2001
+---------------
+* DX8 (DMO) effects
+ BASS_SAMPLE_FX (BASS_StreamCreate/File/URL flag)
+ BASS_MUSIC_FX (BASS_MusicLoad flag)
+ BASS_ChannelSetFX
+ BASS_ChannelRemoveFX
+ BASS_FXSetParameters
+ BASS_FXGetParameters
+ BASS_FXCHORUS structure
+ BASS_FXCOMPRESSOR structure
+ BASS_FXDISTORTION structure
+ BASS_FXECHO structure
+ BASS_FXFLANGER structure
+ BASS_FXGARGLE structure
+ BASS_FXI3DL2REVERB structure
+ BASS_FXPARAMEQ structure
+ BASS_FXREVERB structure
+* Internet file streaming in blocks (inc. Shoutcast/Icecast stream support)
+ BASS_STREAM_BLOCK (BASS_StreamCreateURL flag)
+* 512/1024/2048 sample FFT
+ BASS_DATA_FFT512/1024/2048 (BASS_ChannelGetData flags)
+* CD identification
+ BASS_CDGetID
+* Improved DX version detection
+ BASS_INFO (dsver member)
+
+1.0 - 20/6/2001
+---------------
+* Load MP3/MP2/MP1 files as samples
+ BASS_SampleLoad
+* Internet file streaming from FTP servers
+ BASS_StreamCreateURL
+* Save a local copy of internet file streams
+ BASS_StreamCreateURL
+* Sample accurate file stream seeking
+ BASS_ChannelSetPosition
+ BASS_StreamGetBlockLength *removed*
+* Stream position synchronizer
+ BASS_SYNC_POS
+* Increased synchronizer precision
+* Improved MPEG file detection and error detection
+* Stop MOD musics on a backwards jump effect
+ BASS_MUSIC_STOPBACK (BASS_MusicLoad/PlayEx flag)
+* Leave the volume as it is during closing (as well as initialization)
+ BASS_DEVICE_LEAVEVOL (BASS_Init flag)
+* Optional automatic use of foreground window handle during initialization
+ BASS_Init
+* Reduced DLL size
+* VB API fixes
+
+0.9 - 18/4/2001
+---------------
+* Internet file streaming
+ BASS_StreamCreateURL
+* MP1 & MP2 (MPEG layer 1 & 2) support
+ BASS_StreamCreateFile/URL
+* MPEG 2.5 support (12000/11025/8000hz sample rates)
+ BASS_StreamCreateFile/URL
+* Decoding/download/end file stream position retrieval
+ BASS_StreamGetFilePosition
+* XMPlay surround sound for MOD musics
+ BASS_MUSIC_SURROUND (BASS_MusicLoad/PlayEx flag)
+ BASS_MUSIC_SURROUND2 (BASS_MusicLoad/PlayEx flag)
+* Restrict the download rate of internet file streams
+ BASS_STREAM_RESTRATE (BASS_StreamCreateURL flag)
+* Check if an internet file stream is stalled
+ BASS_ChannelIsActive
+* Automatically free a stream when it stops or ends
+ BASS_STREAM_AUTOFREE (BASS_StreamCreate/File/URL flag)
+* Leave the volume as it is during initialization
+ BASS_DEVICE_LEAVEVOL (BASS_Init flag)
+* Number of CD tracks retrieval
+ BASS_CDGetTracks
+* CD track length retrieval
+ BASS_CDGetTrackLength
+* Exact stream length set after whole file is streamed
+ BASS_StreamGetLength
+* TMT Pascal API and samples
+* Dynamic-loading Delphi API
+
+0.8a - 28/2/2000
+----------------
+* Updated Delphi API and samples
+
+0.8 - 24/1/2000
+---------------
+* Improved MP3 performance on P2/K6 and above CPUs - fast!
+* User DSP functions on streams and MOD musics
+ BASS_ChannelSetDSP
+ BASS_ChannelRemoveDSP
+* DX7 voice allocation & management
+ BASS_SAMPLE_VAM (BASS_SampleLoad/Create flag)
+ BASS_VAM_xxx flags
+ BASS_SAMPLE (vam & priority members)
+* DX7 software 3D algorithm selection
+ BASS_Set3DAlgorithm
+* DirectSound interface retrieval
+ BASS_GetDSoundObject
+* Log/linear volume & panning curves
+ BASS_SetLogCurves
+* User data passed to callback functions
+ STREAMPROC - BASS_StreamCreate
+ SYNCPROC - BASS_ChannelSetSync
+* New synchronizer
+ BASS_SYNC_MUSICFX
+* New synchronizer flag
+ BASS_SYNC_MIXTIME
+* Disable synchronizers option - saves a little CPU time
+ BASS_DEVICE_NOSYNC (BASS_Init flag)
+* Hi-res floating-point CPU usage monitoring
+ BASS_GetCPU
+* Wait for playback to start when playing a CD
+ BASS_CDPlay
+* DirectSound (dsound.dll) version retrieval
+ BASS_INFO (dsver member)
+* Removed volume sliding functions (they were fairly pointless)
+ BASS_SlideVolume
+ BASS_IsSliding
+* MO3: read/write encoder settings
+* MO3: remove inst/samp/message texts now optional
+* MO3: LAME encoder settings
+
+0.7 - 3/10/1999
+---------------
+* MO3 (MP3 compressed MODs)
+* A3D functions
+ BASS_DEVICE_A3D (BASS_Init flag)
+ BASS_INFO (a3d member)
+ BASS_SetA3DResManager
+ BASS_GetA3DResManager
+ BASS_SetA3DHFAbsorbtion
+ BASS_GetA3DHFAbsorbtion
+* Music/stream immediate sample data retrieval
+ BASS_ChannelGetData
+* File stream (WAV/MP3) length retrieval
+ BASS_StreamGetLength
+ BASS_StreamGetBlockLength
+* File stream seeking
+ BASS_ChannelSetPosition
+* Mono MP3 option (lower CPU usage)
+ BASS_StreamCreateFile
+* Music length retrieval
+ BASS_MusicGetLength
+* Music name retrieval
+ BASS_MusicGetName
+* Stop notes when moving MOD music position
+ BASS_MUSIC_POSRESET (BASS_MusicLoad/BASS_MusicPlayEx flag)
+* BASS_ERROR_FREQ - invalid sample rate error code
+ BASS_SampleCreate
+ BASS_SamplePlayEx
+ BASS_SamplePlay3DEx
+ BASS_StreamCreate
+ BASS_ChannelSetAttributes
+* Delphi and VB APIs
+
+0.6a - 26/7/1999
+----------------
+* Half rate MP3 option (lower CPU usage)
+ BASS_MP3_HALFRATE
+* Loading/streaming from file offsets
+ BASS_MusicLoad
+ BASS_SampleLoad
+ BASS_StreamCreateFile
+* Global music/sample/stream volume levels
+ BASS_SetGlobalVolumes
+ BASS_GetGlobalVolumes
+* Other new function
+ BASS_SampleStop
+* New synchronizer
+ BASS_SYNC_END
+* New sample overrider
+ BASS_SAMPLE_OVER_DIST
+* LoadLibrary/GetProcAddress instructions and example
+
+0.5 - 4/7/1999
+--------------
+* Documentation!
+* File streaming (MP3 and WAV)
+ BASS_StreamCreateFile
+* Custom generated samples
+ BASS_SampleCreate
+ BASS_SampleCreateDone
+* Other new function
+ BASS_MusicSetPositionScaler
+* Renamed function
+ BASS_ChannelClearSync -> BASS_ChannelRemoveSync
+* Alterations made to
+ BASS_ChannelGetPosition
+ BASS_SampleLoad
+ BASS_StreamPlay
+
+0.4 - 30/3/1999
+---------------
+* Compressed WAV samples support (using audio CODECs)
+* Updated CD volume handling - now works with SB Live
+* More linear channel volume/pan scales (were slightly off before)
+* "no sound" device option
+* 3D sound functions
+ BASS_Set3DFactors
+ BASS_Get3DFactors
+ BASS_Set3DPosition
+ BASS_Get3DPosition
+ BASS_Apply3D
+ BASS_SamplePlay3D
+ BASS_SamplePlay3DEx
+ BASS_ChannelSet3DAttributes
+ BASS_ChannelGet3DAttributes
+ BASS_ChannelSet3DPosition
+ BASS_ChannelGet3DPosition
+* EAX functions
+ BASS_SetEAXParameters
+ BASS_GetEAXParameters
+ BASS_ChannelSetEAXMix
+ BASS_ChannelGetEAXMix
+* Other new functions
+ BASS_GetDeviceDescription
+ BASS_SetBufferLen
+ BASS_ChannelGetFlags
+ BASS_ChannelPause
+ BASS_ChannelResume
+ BASS_ChannelSetPosition
+* Replaced function
+ BASS_CDResume -> BASS_ChannelResume
+* Alterations made to
+ BASS_Init
+ BASS_CDInit
+ BASS_SampleLoad
+ BASS_StreamPlay
+ BASS_INFO structure
+ BASS_SAMPLE structure
+ BASS_DEVICE_xxx flags
+ BASS_SAMPLE_xxx flags
+
+0.3 - 8/3/1999
+--------------
+* Synchronization functions
+ BASS_ChannelSetSync
+ BASS_ChannelClearSync
+* Other new functions
+ BASS_GetVersion
+ BASS_ChannelGetPosition
+ BASS_ChannelGetLevel
+ BASS_ChannelGetAttributes
+ BASS_ChannelSetAttributes
+* Replaced functions
+ BASS_MusicStop -> BASS_ChannelStop
+ BASS_MusicSetVolume -> BASS_ChannelSetAttributes
+ BASS_CDStop -> BASS_ChannelStop
+ BASS_CDSetVolume -> BASS_ChannelSetAttributes
+ BASS_CDGetVolume -> BASS_ChannelGetAttributes
+ BASS_ChannelUpdate -> BASS_ChannelSetAttributes
+* Alterations made to
+ BASS_MusicPlayEx
+ BASS_StreamPlay
+ BASS_INFO structure
+
+0.2 - 28/2/1999
+---------------
+* First public release
+
+
+Credits - API/Sample Contributors
+=================================
+Visual Basic - Adam Hoult, Hendrik Knaepen, Arthur Aminov,
+ Peter Hebels
+Delphi - Titus Miloi, Rogier Timmermans, Alessandro Cappellozza,
+ Jesse Naranjo, Chris Troesken
+MASM - Octavian Chis
+
+CHMOX is (c)2004 Stéphane Boisson, http://chmox.sourceforge.net/
+
+
+Bug reports, Suggestions, Comments, Enquiries, etc...
+=====================================================
+If you have any of the aforementioned please see the BASS forum (at
+the website). If you can't find an answer there, you can email:
+
+ bass@un4seen.com
+
diff --git a/Game/Code/lib/bass/delphi/bass.bpg b/Game/Code/lib/bass/delphi/bass.bpg
new file mode 100644
index 00000000..55c2e004
--- /dev/null
+++ b/Game/Code/lib/bass/delphi/bass.bpg
@@ -0,0 +1,64 @@
+#------------------------------------------------------------------------------
+VERSION = BWS.01
+#------------------------------------------------------------------------------
+!ifndef ROOT
+ROOT = $(MAKEDIR)\..
+!endif
+#------------------------------------------------------------------------------
+MAKE = $(ROOT)\bin\make.exe -$(MAKEFLAGS) -f$**
+DCC = $(ROOT)\bin\dcc32.exe $**
+BRCC = $(ROOT)\bin\brcc32.exe $**
+#------------------------------------------------------------------------------
+PROJECTS = D3Test.exe BassTest.exe ConTest.exe custloop.exe DspTest.exe \
+ FXtest.exe livefx.exe Multi.exe netradio.exe plugins.exe RecordTest.exe \
+ samplevis.exe Speakers.exe StreamTest.exe writewav.exe
+#------------------------------------------------------------------------------
+default: $(PROJECTS)
+#------------------------------------------------------------------------------
+
+D3Test.exe: 3dTest\D3Test.dpr
+ $(DCC)
+
+BassTest.exe: BassTest\BassTest.dpr
+ $(DCC)
+
+ConTest.exe: ConTest\ConTest.dpr
+ $(DCC)
+
+custloop.exe: custloop\custloop.dpr
+ $(DCC)
+
+DspTest.exe: DspTest\DspTest.dpr
+ $(DCC)
+
+FXtest.exe: fxtest\FXtest.dpr
+ $(DCC)
+
+livefx.exe: livefx\livefx.dpr
+ $(DCC)
+
+Multi.exe: multi\Multi.dpr
+ $(DCC)
+
+netradio.exe: netradio\netradio.dpr
+ $(DCC)
+
+plugins.exe: plugins\plugins.dpr
+ $(DCC)
+
+RecordTest.exe: RecordTest\RecordTest.dpr
+ $(DCC)
+
+samplevis.exe: SampleVis\samplevis.dpr
+ $(DCC)
+
+Speakers.exe: Speakers\Speakers.dpr
+ $(DCC)
+
+StreamTest.exe: StreamTest\StreamTest.dpr
+ $(DCC)
+
+writewav.exe: writewav\writewav.dpr
+ $(DCC)
+
+
diff --git a/Game/Code/lib/bass/delphi/bass.pas b/Game/Code/lib/bass/delphi/bass.pas
new file mode 100644
index 00000000..ba661699
--- /dev/null
+++ b/Game/Code/lib/bass/delphi/bass.pas
@@ -0,0 +1,968 @@
+{
+ BASS 2.3 Audio Library, (c) 1999-2007 Ian Luck.
+ Please report bugs/suggestions/etc... to bass@un4seen.com
+
+ See the BASS.CHM file for more complete documentation
+
+
+ How to install
+ ----------------
+ Copy BASS.PAS to the \LIB subdirectory of your Delphi path or your project dir
+}
+unit Bass;
+
+interface
+
+uses
+ Windows;
+
+const
+ BASSVERSION = $203; // API version
+
+ // Use these to test for error from functions that return a DWORD or QWORD
+ DW_ERROR = Cardinal(-1); // -1 (DWORD)
+ QW_ERROR = Int64(-1); // -1 (QWORD)
+
+ // Error codes returned by BASS_GetErrorCode()
+ BASS_OK = 0; // all is OK
+ BASS_ERROR_MEM = 1; // memory error
+ BASS_ERROR_FILEOPEN = 2; // can't open the file
+ BASS_ERROR_DRIVER = 3; // can't find a free sound driver
+ BASS_ERROR_BUFLOST = 4; // the sample buffer was lost - please report this!
+ BASS_ERROR_HANDLE = 5; // invalid handle
+ BASS_ERROR_FORMAT = 6; // unsupported sample format
+ BASS_ERROR_POSITION = 7; // invalid playback position
+ BASS_ERROR_INIT = 8; // BASS_Init has not been successfully called
+ BASS_ERROR_START = 9; // BASS_Start has not been successfully called
+ BASS_ERROR_ALREADY = 14; // already initialized/paused/whatever
+ BASS_ERROR_NOPAUSE = 16; // not paused
+ BASS_ERROR_NOCHAN = 18; // can't get a free channel
+ BASS_ERROR_ILLTYPE = 19; // an illegal type was specified
+ BASS_ERROR_ILLPARAM = 20; // an illegal parameter was specified
+ BASS_ERROR_NO3D = 21; // no 3D support
+ BASS_ERROR_NOEAX = 22; // no EAX support
+ BASS_ERROR_DEVICE = 23; // illegal device number
+ BASS_ERROR_NOPLAY = 24; // not playing
+ BASS_ERROR_FREQ = 25; // illegal sample rate
+ BASS_ERROR_NOTFILE = 27; // the stream is not a file stream
+ BASS_ERROR_NOHW = 29; // no hardware voices available
+ BASS_ERROR_EMPTY = 31; // the MOD music has no sequence data
+ BASS_ERROR_NONET = 32; // no internet connection could be opened
+ BASS_ERROR_CREATE = 33; // couldn't create the file
+ BASS_ERROR_NOFX = 34; // effects are not enabled
+ BASS_ERROR_PLAYING = 35; // the channel is playing
+ BASS_ERROR_NOTAVAIL = 37; // requested data is not available
+ BASS_ERROR_DECODE = 38; // the channel is a "decoding channel"
+ BASS_ERROR_DX = 39; // a sufficient DirectX version is not installed
+ BASS_ERROR_TIMEOUT = 40; // connection timedout
+ BASS_ERROR_FILEFORM = 41; // unsupported file format
+ BASS_ERROR_SPEAKER = 42; // unavailable speaker
+ BASS_ERROR_VERSION = 43; // invalid BASS version (used by add-ons)
+ BASS_ERROR_CODEC = 44; // codec is not available/supported
+ BASS_ERROR_UNKNOWN = -1; // some other mystery error
+
+ // Initialization flags
+ BASS_DEVICE_8BITS = 1; // use 8 bit resolution, else 16 bit
+ BASS_DEVICE_MONO = 2; // use mono, else stereo
+ BASS_DEVICE_3D = 4; // enable 3D functionality
+ {
+ If the BASS_DEVICE_3D flag is not specified when
+ initilizing BASS, then the 3D flags (BASS_SAMPLE_3D
+ and BASS_MUSIC_3D) are ignored when loading/creating
+ a sample/stream/music.
+ }
+ BASS_DEVICE_LATENCY = 256; // calculate device latency (BASS_INFO struct)
+ BASS_DEVICE_SPEAKERS = 2048; // force enabling of speaker assignment
+ BASS_DEVICE_NOSPEAKER = 4096; // ignore speaker arrangement
+
+ // DirectSound interfaces (for use with BASS_GetDSoundObject)
+ BASS_OBJECT_DS = 1; // IDirectSound
+ BASS_OBJECT_DS3DL = 2; // IDirectSound3DListener
+
+ // BASS_INFO flags (from DSOUND.H)
+ DSCAPS_CONTINUOUSRATE = $00000010;
+ { supports all sample rates between min/maxrate }
+ DSCAPS_EMULDRIVER = $00000020;
+ { device does NOT have hardware DirectSound support }
+ DSCAPS_CERTIFIED = $00000040;
+ { device driver has been certified by Microsoft }
+ {
+ The following flags tell what type of samples are
+ supported by HARDWARE mixing, all these formats are
+ supported by SOFTWARE mixing
+ }
+ DSCAPS_SECONDARYMONO = $00000100; // mono
+ DSCAPS_SECONDARYSTEREO = $00000200; // stereo
+ DSCAPS_SECONDARY8BIT = $00000400; // 8 bit
+ DSCAPS_SECONDARY16BIT = $00000800; // 16 bit
+
+ // BASS_RECORDINFO flags (from DSOUND.H)
+ DSCCAPS_EMULDRIVER = DSCAPS_EMULDRIVER;
+ { device does NOT have hardware DirectSound recording support }
+ DSCCAPS_CERTIFIED = DSCAPS_CERTIFIED;
+ { device driver has been certified by Microsoft }
+
+ // defines for formats field of BASS_RECORDINFO (from MMSYSTEM.H)
+ WAVE_FORMAT_1M08 = $00000001; // 11.025 kHz, Mono, 8-bit
+ WAVE_FORMAT_1S08 = $00000002; // 11.025 kHz, Stereo, 8-bit
+ WAVE_FORMAT_1M16 = $00000004; // 11.025 kHz, Mono, 16-bit
+ WAVE_FORMAT_1S16 = $00000008; // 11.025 kHz, Stereo, 16-bit
+ WAVE_FORMAT_2M08 = $00000010; // 22.05 kHz, Mono, 8-bit
+ WAVE_FORMAT_2S08 = $00000020; // 22.05 kHz, Stereo, 8-bit
+ WAVE_FORMAT_2M16 = $00000040; // 22.05 kHz, Mono, 16-bit
+ WAVE_FORMAT_2S16 = $00000080; // 22.05 kHz, Stereo, 16-bit
+ WAVE_FORMAT_4M08 = $00000100; // 44.1 kHz, Mono, 8-bit
+ WAVE_FORMAT_4S08 = $00000200; // 44.1 kHz, Stereo, 8-bit
+ WAVE_FORMAT_4M16 = $00000400; // 44.1 kHz, Mono, 16-bit
+ WAVE_FORMAT_4S16 = $00000800; // 44.1 kHz, Stereo, 16-bit
+
+ // Sample info flags
+ BASS_SAMPLE_8BITS = 1; // 8 bit
+ BASS_SAMPLE_FLOAT = 256; // 32-bit floating-point
+ BASS_SAMPLE_MONO = 2; // mono, else stereo
+ BASS_SAMPLE_LOOP = 4; // looped
+ BASS_SAMPLE_3D = 8; // 3D functionality enabled
+ BASS_SAMPLE_SOFTWARE = 16; // it's NOT using hardware mixing
+ BASS_SAMPLE_MUTEMAX = 32; // muted at max distance (3D only)
+ BASS_SAMPLE_VAM = 64; // uses the DX7 voice allocation & management
+ BASS_SAMPLE_FX = 128; // old implementation of DX8 effects are enabled
+ BASS_SAMPLE_OVER_VOL = $10000; // override lowest volume
+ BASS_SAMPLE_OVER_POS = $20000; // override longest playing
+ BASS_SAMPLE_OVER_DIST = $30000; // override furthest from listener (3D only)
+
+ BASS_STREAM_PRESCAN = $20000; // enable pin-point seeking (MP3/MP2/MP1)
+ BASS_MP3_SETPOS = BASS_STREAM_PRESCAN;
+ BASS_STREAM_AUTOFREE = $40000; // automatically free the stream when it stop/ends
+ BASS_STREAM_RESTRATE = $80000; // restrict the download rate of internet file streams
+ BASS_STREAM_BLOCK = $100000;// download/play internet file stream in small blocks
+ BASS_STREAM_DECODE = $200000;// don't play the stream, only decode (BASS_ChannelGetData)
+ BASS_STREAM_STATUS = $800000;// give server status info (HTTP/ICY tags) in DOWNLOADPROC
+
+ BASS_MUSIC_FLOAT = BASS_SAMPLE_FLOAT; // 32-bit floating-point
+ BASS_MUSIC_MONO = BASS_SAMPLE_MONO; // force mono mixing (less CPU usage)
+ BASS_MUSIC_LOOP = BASS_SAMPLE_LOOP; // loop music
+ BASS_MUSIC_3D = BASS_SAMPLE_3D; // enable 3D functionality
+ BASS_MUSIC_FX = BASS_SAMPLE_FX; // enable old implementation of DX8 effects
+ BASS_MUSIC_AUTOFREE = BASS_STREAM_AUTOFREE; // automatically free the music when it stop/ends
+ BASS_MUSIC_DECODE = BASS_STREAM_DECODE; // don't play the music, only decode (BASS_ChannelGetData)
+ BASS_MUSIC_PRESCAN = BASS_STREAM_PRESCAN; // calculate playback length
+ BASS_MUSIC_CALCLEN = BASS_MUSIC_PRESCAN;
+ BASS_MUSIC_RAMP = $200; // normal ramping
+ BASS_MUSIC_RAMPS = $400; // sensitive ramping
+ BASS_MUSIC_SURROUND = $800; // surround sound
+ BASS_MUSIC_SURROUND2 = $1000; // surround sound (mode 2)
+ BASS_MUSIC_FT2MOD = $2000; // play .MOD as FastTracker 2 does
+ BASS_MUSIC_PT1MOD = $4000; // play .MOD as ProTracker 1 does
+ BASS_MUSIC_NONINTER = $10000; // non-interpolated mixing
+ BASS_MUSIC_POSRESET = $8000; // stop all notes when moving position
+ BASS_MUSIC_POSRESETEX = $400000; // stop all notes and reset bmp/etc when moving position
+ BASS_MUSIC_STOPBACK = $80000; // stop the music on a backwards jump effect
+ BASS_MUSIC_NOSAMPLE = $100000; // don't load the samples
+
+ // Speaker assignment flags
+ BASS_SPEAKER_FRONT = $1000000; // front speakers
+ BASS_SPEAKER_REAR = $2000000; // rear/side speakers
+ BASS_SPEAKER_CENLFE = $3000000; // center & LFE speakers (5.1)
+ BASS_SPEAKER_REAR2 = $4000000; // rear center speakers (7.1)
+ BASS_SPEAKER_LEFT = $10000000; // modifier: left
+ BASS_SPEAKER_RIGHT = $20000000; // modifier: right
+ BASS_SPEAKER_FRONTLEFT = BASS_SPEAKER_FRONT or BASS_SPEAKER_LEFT;
+ BASS_SPEAKER_FRONTRIGHT = BASS_SPEAKER_FRONT or BASS_SPEAKER_RIGHT;
+ BASS_SPEAKER_REARLEFT = BASS_SPEAKER_REAR or BASS_SPEAKER_LEFT;
+ BASS_SPEAKER_REARRIGHT = BASS_SPEAKER_REAR or BASS_SPEAKER_RIGHT;
+ BASS_SPEAKER_CENTER = BASS_SPEAKER_CENLFE or BASS_SPEAKER_LEFT;
+ BASS_SPEAKER_LFE = BASS_SPEAKER_CENLFE or BASS_SPEAKER_RIGHT;
+ BASS_SPEAKER_REAR2LEFT = BASS_SPEAKER_REAR2 or BASS_SPEAKER_LEFT;
+ BASS_SPEAKER_REAR2RIGHT = BASS_SPEAKER_REAR2 or BASS_SPEAKER_RIGHT;
+
+ BASS_UNICODE = $80000000;
+
+ BASS_RECORD_PAUSE = $8000; // start recording paused
+
+ // DX7 voice allocation flags
+ BASS_VAM_HARDWARE = 1;
+ {
+ Play the sample in hardware. If no hardware voices are available then
+ the "play" call will fail
+ }
+ BASS_VAM_SOFTWARE = 2;
+ {
+ Play the sample in software (ie. non-accelerated). No other VAM flags
+ may be used together with this flag.
+ }
+
+ // DX7 voice management flags
+ {
+ These flags enable hardware resource stealing... if the hardware has no
+ available voices, a currently playing buffer will be stopped to make room
+ for the new buffer. NOTE: only samples loaded/created with the
+ BASS_SAMPLE_VAM flag are considered for termination by the DX7 voice
+ management.
+ }
+ BASS_VAM_TERM_TIME = 4;
+ {
+ If there are no free hardware voices, the buffer to be terminated will be
+ the one with the least time left to play.
+ }
+ BASS_VAM_TERM_DIST = 8;
+ {
+ If there are no free hardware voices, the buffer to be terminated will be
+ one that was loaded/created with the BASS_SAMPLE_MUTEMAX flag and is
+ beyond
+ it's max distance. If there are no buffers that match this criteria, then
+ the "play" call will fail.
+ }
+ BASS_VAM_TERM_PRIO = 16;
+ {
+ If there are no free hardware voices, the buffer to be terminated will be
+ the one with the lowest priority.
+ }
+
+ // BASS_CHANNELINFO types
+ BASS_CTYPE_SAMPLE = 1;
+ BASS_CTYPE_RECORD = 2;
+ BASS_CTYPE_STREAM = $10000;
+ BASS_CTYPE_STREAM_OGG = $10002;
+ BASS_CTYPE_STREAM_MP1 = $10003;
+ BASS_CTYPE_STREAM_MP2 = $10004;
+ BASS_CTYPE_STREAM_MP3 = $10005;
+ BASS_CTYPE_STREAM_AIFF = $10006;
+ BASS_CTYPE_STREAM_WAV = $40000; // WAVE flag, LOWORD=codec
+ BASS_CTYPE_STREAM_WAV_PCM = $50001;
+ BASS_CTYPE_STREAM_WAV_FLOAT = $50003;
+ BASS_CTYPE_MUSIC_MOD = $20000;
+ BASS_CTYPE_MUSIC_MTM = $20001;
+ BASS_CTYPE_MUSIC_S3M = $20002;
+ BASS_CTYPE_MUSIC_XM = $20003;
+ BASS_CTYPE_MUSIC_IT = $20004;
+ BASS_CTYPE_MUSIC_MO3 = $00100; // MO3 flag
+
+ // 3D channel modes
+ BASS_3DMODE_NORMAL = 0;
+ { normal 3D processing }
+ BASS_3DMODE_RELATIVE = 1;
+ {
+ The channel's 3D position (position/velocity/
+ orientation) are relative to the listener. When the
+ listener's position/velocity/orientation is changed
+ with BASS_Set3DPosition, the channel's position
+ relative to the listener does not change.
+ }
+ BASS_3DMODE_OFF = 2;
+ {
+ Turn off 3D processing on the channel, the sound will
+ be played in the center.
+ }
+
+ // EAX environments, use with BASS_SetEAXParameters
+ EAX_ENVIRONMENT_GENERIC = 0;
+ EAX_ENVIRONMENT_PADDEDCELL = 1;
+ EAX_ENVIRONMENT_ROOM = 2;
+ EAX_ENVIRONMENT_BATHROOM = 3;
+ EAX_ENVIRONMENT_LIVINGROOM = 4;
+ EAX_ENVIRONMENT_STONEROOM = 5;
+ EAX_ENVIRONMENT_AUDITORIUM = 6;
+ EAX_ENVIRONMENT_CONCERTHALL = 7;
+ EAX_ENVIRONMENT_CAVE = 8;
+ EAX_ENVIRONMENT_ARENA = 9;
+ EAX_ENVIRONMENT_HANGAR = 10;
+ EAX_ENVIRONMENT_CARPETEDHALLWAY = 11;
+ EAX_ENVIRONMENT_HALLWAY = 12;
+ EAX_ENVIRONMENT_STONECORRIDOR = 13;
+ EAX_ENVIRONMENT_ALLEY = 14;
+ EAX_ENVIRONMENT_FOREST = 15;
+ EAX_ENVIRONMENT_CITY = 16;
+ EAX_ENVIRONMENT_MOUNTAINS = 17;
+ EAX_ENVIRONMENT_QUARRY = 18;
+ EAX_ENVIRONMENT_PLAIN = 19;
+ EAX_ENVIRONMENT_PARKINGLOT = 20;
+ EAX_ENVIRONMENT_SEWERPIPE = 21;
+ EAX_ENVIRONMENT_UNDERWATER = 22;
+ EAX_ENVIRONMENT_DRUGGED = 23;
+ EAX_ENVIRONMENT_DIZZY = 24;
+ EAX_ENVIRONMENT_PSYCHOTIC = 25;
+ // total number of environments
+ EAX_ENVIRONMENT_COUNT = 26;
+
+ // software 3D mixing algorithm modes (used with BASS_Set3DAlgorithm)
+ BASS_3DALG_DEFAULT = 0;
+ {
+ default algorithm (currently translates to BASS_3DALG_OFF)
+ }
+ BASS_3DALG_OFF = 1;
+ {
+ Uses normal left and right panning. The vertical axis is ignored except
+ for scaling of volume due to distance. Doppler shift and volume scaling
+ are still applied, but the 3D filtering is not performed. This is the
+ most CPU efficient software implementation, but provides no virtual 3D
+ audio effect. Head Related Transfer Function processing will not be done.
+ Since only normal stereo panning is used, a channel using this algorithm
+ may be accelerated by a 2D hardware voice if no free 3D hardware voices
+ are available.
+ }
+ BASS_3DALG_FULL = 2;
+ {
+ This algorithm gives the highest quality 3D audio effect, but uses more
+ CPU. Requires Windows 98 2nd Edition or Windows 2000 that uses WDM
+ drivers, if this mode is not available then BASS_3DALG_OFF will be used
+ instead.
+ }
+ BASS_3DALG_LIGHT = 3;
+ {
+ This algorithm gives a good 3D audio effect, and uses less CPU than the
+ FULL mode. Requires Windows 98 2nd Edition or Windows 2000 that uses WDM
+ drivers, if this mode is not available then BASS_3DALG_OFF will be used
+ instead.
+ }
+
+ {
+ Sync types (with BASS_ChannelSetSync() "param" and
+ SYNCPROC "data" definitions) & flags.
+ }
+ BASS_SYNC_POS = 0;
+ {
+ Sync when a channel reaches a position.
+ param: position in bytes
+ data : not used
+ }
+ BASS_SYNC_END = 2;
+ {
+ Sync when a channel reaches the end.
+ param: not used
+ data : not used
+ }
+ BASS_SYNC_META = 4;
+ {
+ Sync when metadata is received in a stream.
+ param: not used
+ data : pointer to the metadata
+ }
+ BASS_SYNC_SLIDE = 5;
+ {
+ Sync when an attribute slide is completed.
+ param: not used
+ data : the type of slide completed (one of the BASS_SLIDE_xxx values)
+ }
+ BASS_SYNC_STALL = 6;
+ {
+ Sync when playback has stalled.
+ param: not used
+ data : 0=stalled, 1=resumed
+ }
+ BASS_SYNC_DOWNLOAD = 7;
+ {
+ Sync when downloading of an internet (or "buffered" user file) stream has ended.
+ param: not used
+ data : not used
+ }
+ BASS_SYNC_FREE = 8;
+ {
+ Sync when a channel is freed.
+ param: not used
+ data : not used
+ }
+ BASS_SYNC_SETPOS = 11;
+ {
+ Sync when a channel's position is set.
+ param: not used
+ data : 0 = playback buffer not flushed, 1 = playback buffer flushed
+ }
+ BASS_SYNC_MUSICPOS = 10;
+ {
+ Sync when a MOD music reaches an order:row position.
+ param: LOWORD=order (0=first, -1=all) HIWORD=row (0=first, -1=all)
+ data : LOWORD=order HIWORD=row
+ }
+ BASS_SYNC_MUSICINST = 1;
+ {
+ Sync when an instrument (sample for the non-instrument based formats)
+ is played in a MOD music (not including retrigs).
+ param: LOWORD=instrument (1=first) HIWORD=note (0=c0...119=b9, -1=all)
+ data : LOWORD=note HIWORD=volume (0-64)
+ }
+ BASS_SYNC_MUSICFX = 3;
+ {
+ Sync when the "sync" effect (XM/MTM/MOD: E8x/Wxx, IT/S3M: S2x) is used.
+ param: 0:data=pos, 1:data="x" value
+ data : param=0: LOWORD=order HIWORD=row, param=1: "x" value
+ }
+ BASS_SYNC_MESSAGE = $20000000;
+ { FLAG: post a Windows message (instead of callback)
+ When using a window message "callback", the message to post is given in the "proc"
+ parameter of BASS_ChannelSetSync, and is posted to the window specified in the BASS_Init
+ call. The message parameters are: WPARAM = data, LPARAM = user.
+ }
+ BASS_SYNC_MIXTIME = $40000000;
+ { FLAG: sync at mixtime, else at playtime }
+ BASS_SYNC_ONETIME = $80000000;
+ { FLAG: sync only once, else continuously }
+
+ // BASS_ChannelIsActive return values
+ BASS_ACTIVE_STOPPED = 0;
+ BASS_ACTIVE_PLAYING = 1;
+ BASS_ACTIVE_STALLED = 2;
+ BASS_ACTIVE_PAUSED = 3;
+
+ // BASS_ChannelIsSliding return flags
+ BASS_SLIDE_FREQ = 1;
+ BASS_SLIDE_VOL = 2;
+ BASS_SLIDE_PAN = 4;
+
+ // BASS_ChannelGetData flags
+ BASS_DATA_AVAILABLE = 0; // query how much data is buffered
+ BASS_DATA_FLOAT = $40000000; // flag: return floating-point sample data
+ BASS_DATA_FFT512 = $80000000; // 512 sample FFT
+ BASS_DATA_FFT1024 = $80000001; // 1024 FFT
+ BASS_DATA_FFT2048 = $80000002; // 2048 FFT
+ BASS_DATA_FFT4096 = $80000003; // 4096 FFT
+ BASS_DATA_FFT8192 = $80000004; // 8192 FFT
+ BASS_DATA_FFT_INDIVIDUAL = $10; // FFT flag: FFT for each channel, else all combined
+ BASS_DATA_FFT_NOWINDOW = $20; // FFT flag: no Hanning window
+
+ // BASS_ChannelGetTags types : what's returned
+ BASS_TAG_ID3 = 0; // ID3v1 tags : 128 byte block
+ BASS_TAG_ID3V2 = 1; // ID3v2 tags : variable length block
+ BASS_TAG_OGG = 2; // OGG comments : array of null-terminated strings
+ BASS_TAG_HTTP = 3; // HTTP headers : array of null-terminated strings
+ BASS_TAG_ICY = 4; // ICY headers : array of null-terminated strings
+ BASS_TAG_META = 5; // ICY metadata : null-terminated string
+ BASS_TAG_VENDOR = 9; // OGG encoder : null-terminated string
+ BASS_TAG_LYRICS3 = 10; // Lyric3v2 tag : ASCII string
+ BASS_TAG_RIFF_INFO = $100; // RIFF/WAVE tags : array of null-terminated ANSI strings
+ BASS_TAG_MUSIC_NAME = $10000; // MOD music name : ANSI string
+ BASS_TAG_MUSIC_MESSAGE = $10001; // MOD message : ANSI string
+ BASS_TAG_MUSIC_INST = $10100; // + instrument #, MOD instrument name : ANSI string
+ BASS_TAG_MUSIC_SAMPLE = $10300; // + sample #, MOD sample name : ANSI string
+
+ BASS_FX_CHORUS = 0; // GUID_DSFX_STANDARD_CHORUS
+ BASS_FX_COMPRESSOR = 1; // GUID_DSFX_STANDARD_COMPRESSOR
+ BASS_FX_DISTORTION = 2; // GUID_DSFX_STANDARD_DISTORTION
+ BASS_FX_ECHO = 3; // GUID_DSFX_STANDARD_ECHO
+ BASS_FX_FLANGER = 4; // GUID_DSFX_STANDARD_FLANGER
+ BASS_FX_GARGLE = 5; // GUID_DSFX_STANDARD_GARGLE
+ BASS_FX_I3DL2REVERB = 6; // GUID_DSFX_STANDARD_I3DL2REVERB
+ BASS_FX_PARAMEQ = 7; // GUID_DSFX_STANDARD_PARAMEQ
+ BASS_FX_REVERB = 8; // GUID_DSFX_WAVES_REVERB
+
+ BASS_FX_PHASE_NEG_180 = 0;
+ BASS_FX_PHASE_NEG_90 = 1;
+ BASS_FX_PHASE_ZERO = 2;
+ BASS_FX_PHASE_90 = 3;
+ BASS_FX_PHASE_180 = 4;
+
+ // BASS_RecordSetInput flags
+ BASS_INPUT_OFF = $10000;
+ BASS_INPUT_ON = $20000;
+ BASS_INPUT_LEVEL = $40000;
+
+ BASS_INPUT_TYPE_MASK = $ff000000;
+ BASS_INPUT_TYPE_UNDEF = $00000000;
+ BASS_INPUT_TYPE_DIGITAL = $01000000;
+ BASS_INPUT_TYPE_LINE = $02000000;
+ BASS_INPUT_TYPE_MIC = $03000000;
+ BASS_INPUT_TYPE_SYNTH = $04000000;
+ BASS_INPUT_TYPE_CD = $05000000;
+ BASS_INPUT_TYPE_PHONE = $06000000;
+ BASS_INPUT_TYPE_SPEAKER = $07000000;
+ BASS_INPUT_TYPE_WAVE = $08000000;
+ BASS_INPUT_TYPE_AUX = $09000000;
+ BASS_INPUT_TYPE_ANALOG = $0a000000;
+
+ // BASS_SetNetConfig flags
+ BASS_NET_TIMEOUT = 0;
+ BASS_NET_BUFFER = 1;
+
+ // BASS_StreamGetFilePosition modes
+ BASS_FILEPOS_CURRENT = 0;
+ BASS_FILEPOS_DECODE = BASS_FILEPOS_CURRENT;
+ BASS_FILEPOS_DOWNLOAD = 1;
+ BASS_FILEPOS_END = 2;
+ BASS_FILEPOS_START = 3;
+ BASS_FILEPOS_CONNECTED = 4;
+
+ // STREAMFILEPROC actions
+ BASS_FILE_CLOSE = 0;
+ BASS_FILE_READ = 1;
+ BASS_FILE_LEN = 3;
+ BASS_FILE_SEEK = 4;
+
+ BASS_STREAMPROC_END = $80000000; // end of user stream flag
+
+ // BASS_MusicSet/GetAttribute options
+ BASS_MUSIC_ATTRIB_AMPLIFY = 0;
+ BASS_MUSIC_ATTRIB_PANSEP = 1;
+ BASS_MUSIC_ATTRIB_PSCALER = 2;
+ BASS_MUSIC_ATTRIB_BPM = 3;
+ BASS_MUSIC_ATTRIB_SPEED = 4;
+ BASS_MUSIC_ATTRIB_VOL_GLOBAL = 5;
+ BASS_MUSIC_ATTRIB_VOL_CHAN = $100; // + channel #
+ BASS_MUSIC_ATTRIB_VOL_INST = $200; // + instrument #
+
+ // BASS_Set/GetConfig options
+ BASS_CONFIG_BUFFER = 0;
+ BASS_CONFIG_UPDATEPERIOD = 1;
+ BASS_CONFIG_MAXVOL = 3;
+ BASS_CONFIG_GVOL_SAMPLE = 4;
+ BASS_CONFIG_GVOL_STREAM = 5;
+ BASS_CONFIG_GVOL_MUSIC = 6;
+ BASS_CONFIG_CURVE_VOL = 7;
+ BASS_CONFIG_CURVE_PAN = 8;
+ BASS_CONFIG_FLOATDSP = 9;
+ BASS_CONFIG_3DALGORITHM = 10;
+ BASS_CONFIG_NET_TIMEOUT = 11;
+ BASS_CONFIG_NET_BUFFER = 12;
+ BASS_CONFIG_PAUSE_NOPLAY = 13;
+ BASS_CONFIG_NET_PREBUF = 15;
+ BASS_CONFIG_NET_AGENT = 16;
+ BASS_CONFIG_NET_PROXY = 17;
+ BASS_CONFIG_NET_PASSIVE = 18;
+ BASS_CONFIG_REC_BUFFER = 19;
+ BASS_CONFIG_NET_PLAYLIST = 21;
+ BASS_CONFIG_MUSIC_VIRTUAL = 22;
+
+type
+ DWORD = cardinal;
+ BOOL = LongBool;
+ FLOAT = Single;
+ QWORD = int64; // 64-bit (replace "int64" with "comp" if using Delphi 3)
+
+ HMUSIC = DWORD; // MOD music handle
+ HSAMPLE = DWORD; // sample handle
+ HCHANNEL = DWORD; // playing sample's channel handle
+ HSTREAM = DWORD; // sample stream handle
+ HRECORD = DWORD; // recording handle
+ HSYNC = DWORD; // synchronizer handle
+ HDSP = DWORD; // DSP handle
+ HFX = DWORD; // DX8 effect handle
+ HPLUGIN = DWORD; // Plugin handle
+
+ BASS_INFO = record
+ flags: DWORD; // device capabilities (DSCAPS_xxx flags)
+ hwsize: DWORD; // size of total device hardware memory
+ hwfree: DWORD; // size of free device hardware memory
+ freesam: DWORD; // number of free sample slots in the hardware
+ free3d: DWORD; // number of free 3D sample slots in the hardware
+ minrate: DWORD; // min sample rate supported by the hardware
+ maxrate: DWORD; // max sample rate supported by the hardware
+ eax: BOOL; // device supports EAX? (always FALSE if BASS_DEVICE_3D was not used)
+ minbuf: DWORD; // recommended minimum buffer length in ms (requires BASS_DEVICE_LATENCY)
+ dsver: DWORD; // DirectSound version
+ latency: DWORD; // delay (in ms) before start of playback (requires BASS_DEVICE_LATENCY)
+ initflags: DWORD; // "flags" parameter of BASS_Init call
+ speakers: DWORD; // number of speakers available
+ driver: PChar; // driver
+ freq: DWORD; // current output rate (OSX only)
+ end;
+
+ BASS_RECORDINFO = record
+ flags: DWORD; // device capabilities (DSCCAPS_xxx flags)
+ formats: DWORD; // supported standard formats (WAVE_FORMAT_xxx flags)
+ inputs: DWORD; // number of inputs
+ singlein: BOOL; // only 1 input can be set at a time
+ driver: PChar; // driver
+ freq: DWORD; // current input rate (OSX only)
+ end;
+
+ BASS_CHANNELINFO = record
+ freq: DWORD; // default playback rate
+ chans: DWORD; // channels
+ flags: DWORD; // BASS_SAMPLE/STREAM/MUSIC/SPEAKER flags
+ ctype: DWORD; // type of channel
+ origres: DWORD; // original resolution
+ plugin: HPLUGIN; // plugin
+ end;
+
+ BASS_PLUGINFORM = record
+ ctype: DWORD; // channel type
+ name: PChar; // format description
+ exts: PChar; // file extension filter (*.ext1;*.ext2;etc...)
+ end;
+ PBASS_PLUGINFORMS = ^TBASS_PLUGINFORMS;
+ TBASS_PLUGINFORMS = array[0..maxInt div sizeOf(BASS_PLUGINFORM) - 1] of BASS_PLUGINFORM;
+
+ BASS_PLUGININFO = record
+ version: DWORD; // version (same form as BASS_GetVersion)
+ formatc: DWORD; // number of formats
+ formats: PBASS_PLUGINFORMS; // the array of formats
+ end;
+ PBASS_PLUGININFO = ^BASS_PLUGININFO;
+
+ // Sample info structure
+ BASS_SAMPLE = record
+ freq: DWORD; // default playback rate
+ volume: DWORD; // default volume (0-100)
+ pan: Integer; // default pan (-100=left, 0=middle, 100=right)
+ flags: DWORD; // BASS_SAMPLE_xxx flags
+ length: DWORD; // length (in samples, not bytes)
+ max: DWORD; // maximum simultaneous playbacks
+ origres: DWORD; // original resolution
+ chans: DWORD; // number of channels
+ mingap: DWORD; // minimum gap (ms) between creating channels
+ {
+ The following are the sample's default 3D attributes
+ (if the sample is 3D, BASS_SAMPLE_3D is in flags)
+ see BASS_ChannelSet3DAttributes
+ }
+ mode3d: DWORD; // BASS_3DMODE_xxx mode
+ mindist: FLOAT; // minimum distance
+ maxdist: FLOAT; // maximum distance
+ iangle: DWORD; // angle of inside projection cone
+ oangle: DWORD; // angle of outside projection cone
+ outvol: DWORD; // delta-volume outside the projection cone
+ {
+ The following are the defaults used if the sample uses the DirectX 7
+ voice allocation/management features.
+ }
+ vam: DWORD; // voice allocation/management flags (BASS_VAM_xxx)
+ priority: DWORD; // priority (0=lowest, $ffffffff=highest)
+ end;
+
+ // 3D vector (for 3D positions/velocities/orientations)
+ BASS_3DVECTOR = record
+ x: FLOAT; // +=right, -=left
+ y: FLOAT; // +=up, -=down
+ z: FLOAT; // +=front, -=behind
+ end;
+
+ BASS_FXCHORUS = record
+ fWetDryMix: FLOAT;
+ fDepth: FLOAT;
+ fFeedback: FLOAT;
+ fFrequency: FLOAT;
+ lWaveform: DWORD; // 0=triangle, 1=sine
+ fDelay: FLOAT;
+ lPhase: DWORD; // BASS_FX_PHASE_xxx
+ end;
+
+ BASS_FXCOMPRESSOR = record
+ fGain: FLOAT;
+ fAttack: FLOAT;
+ fRelease: FLOAT;
+ fThreshold: FLOAT;
+ fRatio: FLOAT;
+ fPredelay: FLOAT;
+ end;
+
+ BASS_FXDISTORTION = record
+ fGain: FLOAT;
+ fEdge: FLOAT;
+ fPostEQCenterFrequency: FLOAT;
+ fPostEQBandwidth: FLOAT;
+ fPreLowpassCutoff: FLOAT;
+ end;
+
+ BASS_FXECHO = record
+ fWetDryMix: FLOAT;
+ fFeedback: FLOAT;
+ fLeftDelay: FLOAT;
+ fRightDelay: FLOAT;
+ lPanDelay: BOOL;
+ end;
+
+ BASS_FXFLANGER = record
+ fWetDryMix: FLOAT;
+ fDepth: FLOAT;
+ fFeedback: FLOAT;
+ fFrequency: FLOAT;
+ lWaveform: DWORD; // 0=triangle, 1=sine
+ fDelay: FLOAT;
+ lPhase: DWORD; // BASS_FX_PHASE_xxx
+ end;
+
+ BASS_FXGARGLE = record
+ dwRateHz: DWORD; // Rate of modulation in hz
+ dwWaveShape: DWORD; // 0=triangle, 1=square
+ end;
+
+ BASS_FXI3DL2REVERB = record
+ lRoom: Longint; // [-10000, 0] default: -1000 mB
+ lRoomHF: Longint; // [-10000, 0] default: 0 mB
+ flRoomRolloffFactor: FLOAT; // [0.0, 10.0] default: 0.0
+ flDecayTime: FLOAT; // [0.1, 20.0] default: 1.49s
+ flDecayHFRatio: FLOAT; // [0.1, 2.0] default: 0.83
+ lReflections: Longint; // [-10000, 1000] default: -2602 mB
+ flReflectionsDelay: FLOAT; // [0.0, 0.3] default: 0.007 s
+ lReverb: Longint; // [-10000, 2000] default: 200 mB
+ flReverbDelay: FLOAT; // [0.0, 0.1] default: 0.011 s
+ flDiffusion: FLOAT; // [0.0, 100.0] default: 100.0 %
+ flDensity: FLOAT; // [0.0, 100.0] default: 100.0 %
+ flHFReference: FLOAT; // [20.0, 20000.0] default: 5000.0 Hz
+ end;
+
+ BASS_FXPARAMEQ = record
+ fCenter: FLOAT;
+ fBandwidth: FLOAT;
+ fGain: FLOAT;
+ end;
+
+ BASS_FXREVERB = record
+ fInGain: FLOAT; // [-96.0,0.0] default: 0.0 dB
+ fReverbMix: FLOAT; // [-96.0,0.0] default: 0.0 db
+ fReverbTime: FLOAT; // [0.001,3000.0] default: 1000.0 ms
+ fHighFreqRTRatio: FLOAT; // [0.001,0.999] default: 0.001
+ end;
+
+ // callback function types
+ STREAMPROC = function(handle: HSTREAM; buffer: Pointer; length: DWORD; user: DWORD): DWORD; stdcall;
+ {
+ User stream callback function. NOTE: A stream function should obviously be as
+ quick as possible, other streams (and MOD musics) can't be mixed until
+ it's finished.
+ handle : The stream that needs writing
+ buffer : Buffer to write the samples in
+ length : Number of bytes to write
+ user : The 'user' parameter value given when calling BASS_StreamCreate
+ RETURN : Number of bytes written. Set the BASS_STREAMPROC_END flag to end
+ the stream.
+ }
+
+ STREAMFILEPROC = function(action, param1, param2, user: DWORD): DWORD; stdcall;
+ {
+ User file stream callback function.
+ action : The action to perform, one of BASS_FILE_xxx values.
+ param1 : Depends on "action"
+ param2 : Depends on "action"
+ user : The 'user' parameter value given when calling BASS_StreamCreate
+ RETURN : Depends on "action"
+ }
+
+ DOWNLOADPROC = procedure(buffer: Pointer; length: DWORD; user: DWORD); stdcall;
+ {
+ Internet stream download callback function.
+ buffer : Buffer containing the downloaded data... NULL=end of download
+ length : Number of bytes in the buffer
+ user : The 'user' parameter value given when calling BASS_StreamCreateURL
+ }
+
+ SYNCPROC = procedure(handle: HSYNC; channel, data: DWORD; user: DWORD); stdcall;
+ {
+ Sync callback function. NOTE: a sync callback function should be very
+ quick as other syncs cannot be processed until it has finished. If the
+ sync is a "mixtime" sync, then other streams and MOD musics can not be
+ mixed until it's finished either.
+ handle : The sync that has occured
+ channel: Channel that the sync occured in
+ data : Additional data associated with the sync's occurance
+ user : The 'user' parameter given when calling BASS_ChannelSetSync
+ }
+
+ DSPPROC = procedure(handle: HDSP; channel: DWORD; buffer: Pointer; length: DWORD; user: DWORD); stdcall;
+ {
+ DSP callback function. NOTE: A DSP function should obviously be as quick
+ as possible... other DSP functions, streams and MOD musics can not be
+ processed until it's finished.
+ handle : The DSP handle
+ channel: Channel that the DSP is being applied to
+ buffer : Buffer to apply the DSP to
+ length : Number of bytes in the buffer
+ user : The 'user' parameter given when calling BASS_ChannelSetDSP
+ }
+
+ RECORDPROC = function(handle: HRECORD; buffer: Pointer; length: DWORD; user: DWORD): BOOL; stdcall;
+ {
+ Recording callback function.
+ handle : The recording handle
+ buffer : Buffer containing the recorded sample data
+ length : Number of bytes
+ user : The 'user' parameter value given when calling BASS_RecordStart
+ RETURN : TRUE = continue recording, FALSE = stop
+ }
+
+
+// Functions
+const
+ bassdll = 'bass.dll';
+
+function BASS_SetConfig(option, value: DWORD): DWORD; stdcall; external bassdll;
+function BASS_GetConfig(option: DWORD): DWORD; stdcall; external bassdll;
+function BASS_GetVersion: DWORD; stdcall; external bassdll;
+function BASS_GetDeviceDescription(device: DWORD): PChar; stdcall; external bassdll;
+function BASS_ErrorGetCode: Integer; stdcall; external bassdll;
+function BASS_Init(device: Integer; freq, flags: DWORD; win: HWND; clsid: PGUID): BOOL; stdcall; external bassdll;
+function BASS_SetDevice(device: DWORD): BOOL; stdcall; external bassdll;
+function BASS_GetDevice: DWORD; stdcall; external bassdll;
+function BASS_Free: BOOL; stdcall; external bassdll;
+function BASS_GetDSoundObject(obj: DWORD): Pointer; stdcall; external bassdll;
+function BASS_GetInfo(var info: BASS_INFO): BOOL; stdcall; external bassdll;
+function BASS_Update: BOOL; stdcall; external bassdll;
+function BASS_GetCPU: FLOAT; stdcall; external bassdll;
+function BASS_Start: BOOL; stdcall; external bassdll;
+function BASS_Stop: BOOL; stdcall; external bassdll;
+function BASS_Pause: BOOL; stdcall; external bassdll;
+function BASS_SetVolume(volume: DWORD): BOOL; stdcall; external bassdll;
+function BASS_GetVolume: Integer; stdcall; external bassdll;
+
+function BASS_PluginLoad(filename: PChar; flags: DWORD): HPLUGIN; stdcall; external bassdll;
+function BASS_PluginFree(handle: HPLUGIN): BOOL; stdcall; external bassdll;
+function BASS_PluginGetInfo(handle: HPLUGIN): PBASS_PLUGININFO; stdcall; external bassdll;
+
+function BASS_Set3DFactors(distf, rollf, doppf: FLOAT): BOOL; stdcall; external bassdll;
+function BASS_Get3DFactors(var distf, rollf, doppf: FLOAT): BOOL; stdcall; external bassdll;
+function BASS_Set3DPosition(var pos, vel, front, top: BASS_3DVECTOR): BOOL; stdcall; external bassdll;
+function BASS_Get3DPosition(var pos, vel, front, top: BASS_3DVECTOR): BOOL; stdcall; external bassdll;
+procedure BASS_Apply3D; stdcall; external bassdll;
+function BASS_SetEAXParameters(env: Integer; vol, decay, damp: FLOAT): BOOL; stdcall; external bassdll;
+function BASS_GetEAXParameters(var env: DWORD; var vol, decay, damp: FLOAT): BOOL; stdcall; external bassdll;
+
+function BASS_MusicLoad(mem: BOOL; f: Pointer; offset, length, flags, freq: DWORD): HMUSIC; stdcall; external bassdll;
+function BASS_MusicFree(handle: HMUSIC): BOOL; stdcall; external bassdll;
+function BASS_MusicSetAttribute(handle: HMUSIC; attrib,value: DWORD): DWORD; stdcall; external bassdll;
+function BASS_MusicGetAttribute(handle: HMUSIC; attrib: DWORD): DWORD; stdcall; external bassdll;
+function BASS_MusicGetOrders(handle: HMUSIC): DWORD; stdcall; external bassdll;
+function BASS_MusicGetOrderPosition(handle: HMUSIC): DWORD; stdcall; external bassdll;
+
+function BASS_SampleLoad(mem: BOOL; f: Pointer; offset, length, max, flags: DWORD): HSAMPLE; stdcall; external bassdll;
+function BASS_SampleCreate(length, freq, chans, max, flags: DWORD): Pointer; stdcall; external bassdll;
+function BASS_SampleCreateDone: HSAMPLE; stdcall; external bassdll;
+function BASS_SampleFree(handle: HSAMPLE): BOOL; stdcall; external bassdll;
+function BASS_SampleGetInfo(handle: HSAMPLE; var info: BASS_SAMPLE): BOOL; stdcall; external bassdll;
+function BASS_SampleSetInfo(handle: HSAMPLE; var info: BASS_SAMPLE): BOOL; stdcall; external bassdll;
+function BASS_SampleGetChannel(handle: HSAMPLE; onlynew: BOOL): HCHANNEL; stdcall; external bassdll;
+function BASS_SampleGetChannels(handle: HSAMPLE; channels: Pointer): DWORD; stdcall; external bassdll;
+function BASS_SampleStop(handle: HSAMPLE): BOOL; stdcall; external bassdll;
+
+function BASS_StreamCreate(freq, chans, flags: DWORD; proc: Pointer; user: DWORD): HSTREAM; stdcall; external bassdll;
+function BASS_StreamCreateFile(mem: BOOL; f: Pointer; offset, length, flags: DWORD): HSTREAM; stdcall; external bassdll;
+function BASS_StreamCreateURL(url: PChar; offset: DWORD; flags: DWORD; proc: DOWNLOADPROC; user: DWORD):HSTREAM; stdcall; external bassdll;
+function BASS_StreamCreateFileUser(buffered: BOOL; flags: DWORD; proc: STREAMFILEPROC; user: DWORD): HSTREAM; stdcall; external bassdll;
+function BASS_StreamFree(handle: HSTREAM): BOOL; stdcall; external bassdll;
+function BASS_StreamGetFilePosition(handle:HSTREAM; mode:DWORD) : DWORD;stdcall;external bassdll;
+
+function BASS_RecordGetDeviceDescription(devnum: DWORD):PChar;stdcall;external bassdll;
+function BASS_RecordInit(device: Integer):BOOL;stdcall;external bassdll;
+function BASS_RecordSetDevice(device: DWORD): BOOL; stdcall; external bassdll;
+function BASS_RecordGetDevice: DWORD; stdcall; external bassdll;
+function BASS_RecordFree:BOOL;stdcall;external bassdll;
+function BASS_RecordGetInfo(var info:BASS_RECORDINFO):BOOL;stdcall;external bassdll;
+function BASS_RecordGetInputName(input:Integer):PChar;stdcall;external bassdll;
+function BASS_RecordSetInput(input:Integer; setting:DWORD):BOOL;stdcall;external bassdll;
+function BASS_RecordGetInput(input:Integer):DWORD;stdcall;external bassdll;
+function BASS_RecordStart(freq,chans,flags:DWORD; proc:RECORDPROC; user:DWORD):HRECORD;stdcall;external bassdll;
+
+function BASS_ChannelBytes2Seconds(handle: DWORD; pos: QWORD): FLOAT; stdcall;external bassdll;
+function BASS_ChannelSeconds2Bytes(handle: DWORD; pos: FLOAT): QWORD; stdcall;external bassdll;
+function BASS_ChannelGetDevice(handle: DWORD): DWORD; stdcall; external bassdll;
+function BASS_ChannelSetDevice(handle, device: DWORD): BOOL; stdcall; external bassdll;
+function BASS_ChannelIsActive(handle: DWORD): DWORD; stdcall;external bassdll;
+function BASS_ChannelGetInfo(handle: DWORD; var info:BASS_CHANNELINFO):BOOL;stdcall;external bassdll;
+function BASS_ChannelGetTags(handle: HSTREAM; tags : DWORD): PChar; stdcall; external bassdll;
+function BASS_ChannelSetFlags(handle, flags: DWORD): BOOL; stdcall; external bassdll;
+function BASS_ChannelPreBuf(handle, length: DWORD): BOOL; stdcall; external bassdll;
+function BASS_ChannelPlay(handle: DWORD; restart: BOOL): BOOL; stdcall; external bassdll;
+function BASS_ChannelStop(handle: DWORD): BOOL; stdcall; external bassdll;
+function BASS_ChannelPause(handle: DWORD): BOOL; stdcall; external bassdll;
+function BASS_ChannelSetAttributes(handle: DWORD; freq, volume, pan: Integer): BOOL; stdcall; external bassdll;
+function BASS_ChannelGetAttributes(handle: DWORD; var freq, volume: DWORD; var pan: Integer): BOOL; stdcall; external bassdll;
+function BASS_ChannelSlideAttributes(handle: DWORD; freq, volume, pan: Integer; time: DWORD): BOOL; stdcall; external bassdll;
+function BASS_ChannelIsSliding(handle: DWORD): DWORD; stdcall;external bassdll;
+function BASS_ChannelSet3DAttributes(handle: DWORD; mode: Integer; min, max: FLOAT; iangle, oangle, outvol: Integer): BOOL; stdcall; external bassdll;
+function BASS_ChannelGet3DAttributes(handle: DWORD; var mode: DWORD; var min, max: FLOAT; var iangle, oangle, outvol: DWORD): BOOL; stdcall; external bassdll;
+function BASS_ChannelSet3DPosition(handle: DWORD; var pos, orient, vel: BASS_3DVECTOR): BOOL; stdcall; external bassdll;
+function BASS_ChannelGet3DPosition(handle: DWORD; var pos, orient, vel: BASS_3DVECTOR): BOOL; stdcall; external bassdll;
+function BASS_ChannelGetLength(handle: DWORD): QWORD; stdcall; external bassdll;
+function BASS_ChannelSetPosition(handle: DWORD; pos: QWORD): BOOL; stdcall; external bassdll;
+function BASS_ChannelGetPosition(handle: DWORD): QWORD; stdcall; external bassdll;
+function BASS_ChannelGetLevel(handle: DWORD): DWORD; stdcall; external bassdll;
+function BASS_ChannelGetData(handle: DWORD; buffer: Pointer; length: DWORD): DWORD; stdcall; external bassdll;
+function BASS_ChannelSetSync(handle: DWORD; stype: DWORD; param: QWORD; proc: SYNCPROC; user: DWORD): HSYNC; stdcall; external bassdll;
+function BASS_ChannelRemoveSync(handle: DWORD; sync: HSYNC): BOOL; stdcall; external bassdll;
+function BASS_ChannelSetDSP(handle: DWORD; proc: DSPPROC; user: DWORD; priority: Integer): HDSP; stdcall; external bassdll;
+function BASS_ChannelRemoveDSP(handle: DWORD; dsp: HDSP): BOOL; stdcall; external bassdll;
+function BASS_ChannelSetEAXMix(handle: DWORD; mix: FLOAT): BOOL; stdcall; external bassdll;
+function BASS_ChannelGetEAXMix(handle: DWORD; var mix: FLOAT): BOOL; stdcall; external bassdll;
+function BASS_ChannelSetLink(handle, chan: DWORD): BOOL; stdcall; external bassdll;
+function BASS_ChannelRemoveLink(handle, chan: DWORD): BOOL; stdcall; external bassdll;
+function BASS_ChannelSetFX(handle, etype: DWORD; priority: Integer): HFX; stdcall; external bassdll;
+function BASS_ChannelRemoveFX(handle: DWORD; fx: HFX): BOOL; stdcall; external bassdll;
+
+function BASS_FXSetParameters(handle: HFX; par: Pointer): BOOL; stdcall; external bassdll;
+function BASS_FXGetParameters(handle: HFX; par: Pointer): BOOL; stdcall; external bassdll;
+function BASS_FXReset(handle: HFX): BOOL; stdcall; external bassdll;
+
+
+function BASS_SPEAKER_N(n: DWORD): DWORD;
+function MAKEMUSICPOS(order,row: DWORD): DWORD;
+function BASS_SetEAXPreset(env: Integer): BOOL;
+{
+ This function is defined in the implementation part of this unit.
+ It is not part of BASS.DLL but an extra function which makes it easier
+ to set the predefined EAX environments.
+ env : a EAX_ENVIRONMENT_xxx constant
+}
+
+
+implementation
+
+function BASS_SPEAKER_N(n: DWORD): DWORD;
+begin
+ Result := n shl 24;
+end;
+
+function MAKEMUSICPOS(order,row: DWORD): DWORD;
+begin
+ Result := $80000000 or DWORD(MAKELONG(order,row));
+end;
+
+function BASS_SetEAXPreset(env: Integer): BOOL;
+begin
+ case (env) of
+ EAX_ENVIRONMENT_GENERIC:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_GENERIC, 0.5, 1.493, 0.5);
+ EAX_ENVIRONMENT_PADDEDCELL:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_PADDEDCELL, 0.25, 0.1, 0);
+ EAX_ENVIRONMENT_ROOM:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_ROOM, 0.417, 0.4, 0.666);
+ EAX_ENVIRONMENT_BATHROOM:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_BATHROOM, 0.653, 1.499, 0.166);
+ EAX_ENVIRONMENT_LIVINGROOM:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_LIVINGROOM, 0.208, 0.478, 0);
+ EAX_ENVIRONMENT_STONEROOM:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_STONEROOM, 0.5, 2.309, 0.888);
+ EAX_ENVIRONMENT_AUDITORIUM:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_AUDITORIUM, 0.403, 4.279, 0.5);
+ EAX_ENVIRONMENT_CONCERTHALL:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_CONCERTHALL, 0.5, 3.961, 0.5);
+ EAX_ENVIRONMENT_CAVE:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_CAVE, 0.5, 2.886, 1.304);
+ EAX_ENVIRONMENT_ARENA:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_ARENA, 0.361, 7.284, 0.332);
+ EAX_ENVIRONMENT_HANGAR:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_HANGAR, 0.5, 10.0, 0.3);
+ EAX_ENVIRONMENT_CARPETEDHALLWAY:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_CARPETEDHALLWAY, 0.153, 0.259, 2.0);
+ EAX_ENVIRONMENT_HALLWAY:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_HALLWAY, 0.361, 1.493, 0);
+ EAX_ENVIRONMENT_STONECORRIDOR:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_STONECORRIDOR, 0.444, 2.697, 0.638);
+ EAX_ENVIRONMENT_ALLEY:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_ALLEY, 0.25, 1.752, 0.776);
+ EAX_ENVIRONMENT_FOREST:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_FOREST, 0.111, 3.145, 0.472);
+ EAX_ENVIRONMENT_CITY:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_CITY, 0.111, 2.767, 0.224);
+ EAX_ENVIRONMENT_MOUNTAINS:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_MOUNTAINS, 0.194, 7.841, 0.472);
+ EAX_ENVIRONMENT_QUARRY:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_QUARRY, 1, 1.499, 0.5);
+ EAX_ENVIRONMENT_PLAIN:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_PLAIN, 0.097, 2.767, 0.224);
+ EAX_ENVIRONMENT_PARKINGLOT:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_PARKINGLOT, 0.208, 1.652, 1.5);
+ EAX_ENVIRONMENT_SEWERPIPE:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_SEWERPIPE, 0.652, 2.886, 0.25);
+ EAX_ENVIRONMENT_UNDERWATER:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_UNDERWATER, 1, 1.499, 0);
+ EAX_ENVIRONMENT_DRUGGED:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_DRUGGED, 0.875, 8.392, 1.388);
+ EAX_ENVIRONMENT_DIZZY:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_DIZZY, 0.139, 17.234, 0.666);
+ EAX_ENVIRONMENT_PSYCHOTIC:
+ Result := BASS_SetEAXParameters(EAX_ENVIRONMENT_PSYCHOTIC, 0.486, 7.563, 0.806);
+ else
+ Result := FALSE;
+ end;
+end;
+
+end.
+// END OF FILE /////////////////////////////////////////////////////////////////
+
diff --git a/Game/Code/lib/midi/CIRCBUF.PAS b/Game/Code/lib/midi/CIRCBUF.PAS
new file mode 100644
index 00000000..e84fc2c4
--- /dev/null
+++ b/Game/Code/lib/midi/CIRCBUF.PAS
@@ -0,0 +1,192 @@
+{ $Header: /MidiComp/CIRCBUF.PAS 2 10/06/97 7:33 Davec $ }
+
+{ Written by David Churcher <dchurcher@cix.compulink.co.uk>,
+ released to the public domain. }
+
+
+{ A First-In First-Out circular buffer.
+ Port of circbuf.c from Microsoft's Windows MIDI monitor example.
+ I did do a version of this as an object (see Rev 1.1) but it was getting too
+ complicated and I couldn't see any real benefits to it so I dumped it
+ for an ordinary memory buffer with pointers.
+
+ This unit is a bit C-like, everything is done with pointers and extensive
+ use is made of the undocumented feature of the Inc() function that
+ increments pointers by the size of the object pointed to.
+ All of this could probably be done using Pascal array notation with
+ range-checking turned off, but I'm not sure it's worth it.
+}
+
+Unit Circbuf;
+
+interface
+
+Uses Wintypes, WinProcs, MMSystem;
+
+type
+ {$IFNDEF WIN32}
+ { API types not defined in Delphi 1 }
+ DWORD = Longint;
+ HGLOBAL = THandle;
+ UINT = Word;
+ TFNTimeCallBack = procedure(uTimerID, uMessage: UINT; dwUser, dw1, dw2: DWORD);
+ {$ENDIF}
+
+ { MIDI input event }
+ TMidiBufferItem = record
+ timestamp: DWORD; { Timestamp in milliseconds after midiInStart }
+ data: DWORD; { MIDI message received }
+ sysex: PMidiHdr; { Pointer to sysex MIDIHDR, nil if not sysex }
+ end;
+ PMidiBufferItem = ^TMidiBufferItem;
+
+ { MIDI input buffer }
+ TCircularBuffer = record
+ RecordHandle: HGLOBAL; { Windows memory handle for this record }
+ BufferHandle: HGLOBAL; { Windows memory handle for the buffer }
+ pStart: PMidiBufferItem; { ptr to start of buffer }
+ pEnd: PMidiBufferItem; { ptr to end of buffer }
+ pNextPut: PMidiBufferItem; { next location to fill }
+ pNextGet: PMidiBufferItem; { next location to empty }
+ Error: Word; { error code from MMSYSTEM functions }
+ Capacity: Word; { buffer size (in TMidiBufferItems) }
+ EventCount: Word; { Number of events in buffer }
+ end;
+
+ PCircularBuffer = ^TCircularBuffer;
+
+function GlobalSharedLockedAlloc( Capacity: Word; var hMem: HGLOBAL ): Pointer;
+procedure GlobalSharedLockedFree( hMem: HGLOBAL; ptr: Pointer );
+
+function CircbufAlloc( Capacity: Word ): PCircularBuffer;
+procedure CircbufFree( PBuffer: PCircularBuffer );
+function CircbufRemoveEvent( PBuffer: PCircularBuffer ): Boolean;
+function CircbufReadEvent( PBuffer: PCircularBuffer; PEvent: PMidiBufferItem ): Boolean;
+{ Note: The PutEvent function is in the DLL }
+
+implementation
+
+{ Allocates in global shared memory, returns pointer and handle }
+function GlobalSharedLockedAlloc( Capacity: Word; var hMem: HGLOBAL ): Pointer;
+var
+ ptr: Pointer;
+begin
+ { Allocate the buffer memory }
+ hMem := GlobalAlloc(GMEM_SHARE Or GMEM_MOVEABLE Or GMEM_ZEROINIT, Capacity );
+
+ if (hMem = 0) then
+ ptr := Nil
+ else
+ begin
+ ptr := GlobalLock(hMem);
+ if (ptr = Nil) then
+ GlobalFree(hMem);
+ end;
+
+{$IFNDEF WIN32}
+ if (ptr <> Nil) then
+ GlobalPageLock(HIWORD(DWORD(ptr)));
+{$ENDIF}
+ GlobalSharedLockedAlloc := Ptr;
+end;
+
+procedure GlobalSharedLockedFree( hMem: HGLOBAL; ptr: Pointer );
+begin
+{$IFNDEF WIN32}
+ if (ptr <> Nil) then
+ GlobalPageUnlock(HIWORD(DWORD(ptr)));
+{$ENDIF}
+ if (hMem <> 0) then
+ begin
+ GlobalUnlock(hMem);
+ GlobalFree(hMem);
+ end;
+end;
+
+function CircbufAlloc( Capacity: Word ): PCircularBuffer;
+var
+ NewCircularBuffer: PCircularBuffer;
+ NewMIDIBuffer: PMidiBufferItem;
+ hMem: HGLOBAL;
+begin
+ { TODO: Validate circbuf size, <64K }
+ NewCircularBuffer :=
+ GlobalSharedLockedAlloc( Sizeof(TCircularBuffer), hMem );
+ if (NewCircularBuffer <> Nil) then
+ begin
+ NewCircularBuffer^.RecordHandle := hMem;
+ NewMIDIBuffer :=
+ GlobalSharedLockedAlloc( Capacity * Sizeof(TMidiBufferItem), hMem );
+ if (NewMIDIBuffer = Nil) then
+ begin
+ { TODO: Exception here? }
+ GlobalSharedLockedFree( NewCircularBuffer^.RecordHandle,
+ NewCircularBuffer );
+ NewCircularBuffer := Nil;
+ end
+ else
+ begin
+ NewCircularBuffer^.pStart := NewMidiBuffer;
+ { Point to item at end of buffer }
+ NewCircularBuffer^.pEnd := NewMidiBuffer;
+ Inc(NewCircularBuffer^.pEnd, Capacity);
+ { Start off the get and put pointers in the same position. These
+ will get out of sync as the interrupts start rolling in }
+ NewCircularBuffer^.pNextPut := NewMidiBuffer;
+ NewCircularBuffer^.pNextGet := NewMidiBuffer;
+ NewCircularBuffer^.Error := 0;
+ NewCircularBuffer^.Capacity := Capacity;
+ NewCircularBuffer^.EventCount := 0;
+ end;
+ end;
+ CircbufAlloc := NewCircularBuffer;
+end;
+
+procedure CircbufFree( pBuffer: PCircularBuffer );
+begin
+ if (pBuffer <> Nil) then
+ begin
+ GlobalSharedLockedFree(pBuffer^.BufferHandle, pBuffer^.pStart);
+ GlobalSharedLockedFree(pBuffer^.RecordHandle, pBuffer);
+ end;
+end;
+
+{ Reads first event in queue without removing it.
+ Returns true if successful, False if no events in queue }
+function CircbufReadEvent( PBuffer: PCircularBuffer; PEvent: PMidiBufferItem ): Boolean;
+var
+ PCurrentEvent: PMidiBufferItem;
+begin
+ if (PBuffer^.EventCount <= 0) then
+ CircbufReadEvent := False
+ else
+ begin
+ PCurrentEvent := PBuffer^.PNextget;
+
+ { Copy the object from the "tail" of the buffer to the caller's object }
+ PEvent^.Timestamp := PCurrentEvent^.Timestamp;
+ PEvent^.Data := PCurrentEvent^.Data;
+ PEvent^.Sysex := PCurrentEvent^.Sysex;
+ CircbufReadEvent := True;
+ end;
+end;
+
+{ Remove current event from the queue }
+function CircbufRemoveEvent(PBuffer: PCircularBuffer): Boolean;
+begin
+ if (PBuffer^.EventCount > 0) then
+ begin
+ Dec( Pbuffer^.EventCount);
+
+ { Advance the buffer pointer, with wrap }
+ Inc( Pbuffer^.PNextGet );
+ If (PBuffer^.PNextGet = PBuffer^.PEnd) then
+ PBuffer^.PNextGet := PBuffer^.PStart;
+
+ CircbufRemoveEvent := True;
+ end
+ else
+ CircbufRemoveEvent := False;
+end;
+
+end.
diff --git a/Game/Code/lib/midi/DELPHMCB.PAS b/Game/Code/lib/midi/DELPHMCB.PAS
new file mode 100644
index 00000000..23ce0e1a
--- /dev/null
+++ b/Game/Code/lib/midi/DELPHMCB.PAS
@@ -0,0 +1,140 @@
+{ $Header: /MidiComp/DELPHMCB.PAS 2 10/06/97 7:33 Davec $ }
+
+{MIDI callback for Delphi, was DLL for Delphi 1}
+
+unit Delphmcb;
+
+{ These segment options required for the MIDI callback functions }
+{$C PRELOAD FIXED PERMANENT}
+
+interface
+
+uses WinProcs, WinTypes, MMsystem, Circbuf, MidiDefs, MidiCons;
+
+{$IFDEF WIN32}
+procedure midiHandler(
+ hMidiIn: HMidiIn;
+ wMsg: UINT;
+ dwInstance: DWORD;
+ dwParam1: DWORD;
+ dwParam2: DWORD); stdcall export;
+function CircbufPutEvent(PBuffer: PCircularBuffer; PTheEvent: PMidiBufferItem): Boolean; stdcall; export;
+{$ELSE}
+procedure midiHandler(
+ hMidiIn: HMidiIn;
+ wMsg: Word;
+ dwInstance: DWORD;
+ dwParam1: DWORD;
+ dwParam2: DWORD); export;
+function CircbufPutEvent(PBuffer: PCircularBuffer; PTheEvent: PMidiBufferItem): Boolean; export;
+{$ENDIF}
+
+implementation
+
+{ Add an event to the circular input buffer. }
+function CircbufPutEvent(PBuffer: PCircularBuffer; PTheEvent: PMidiBufferItem): Boolean;
+begin
+ If (PBuffer^.EventCount < PBuffer^.Capacity) Then
+ begin
+ Inc(Pbuffer^.EventCount);
+
+ { Todo: better way of copying this record }
+ with PBuffer^.PNextput^ do
+ begin
+ Timestamp := PTheEvent^.Timestamp;
+ Data := PTheEvent^.Data;
+ Sysex := PTheEvent^.Sysex;
+ end;
+
+ { Move to next put location, with wrap }
+ Inc(Pbuffer^.PNextPut);
+ If (PBuffer^.PNextPut = PBuffer^.PEnd) then
+ PBuffer^.PNextPut := PBuffer^.PStart;
+
+ CircbufPutEvent := True;
+ end
+ else
+ CircbufPutEvent := False;
+end;
+
+{ This is the callback function specified when the MIDI device was opened
+ by midiInOpen. It's called at interrupt time when MIDI input is seen
+ by the MIDI device driver(s). See the docs for midiInOpen for restrictions
+ on the Windows functions that can be called in this interrupt. }
+procedure midiHandler(
+ hMidiIn: HMidiIn;
+ wMsg: UINT;
+ dwInstance: DWORD;
+ dwParam1: DWORD;
+ dwParam2: DWORD);
+
+var
+ thisEvent: TMidiBufferItem;
+ thisCtlInfo: PMidiCtlInfo;
+ thisBuffer: PCircularBuffer;
+
+Begin
+ case wMsg of
+
+ mim_Open: {nothing};
+
+ mim_Error: {TODO: handle (message to trigger exception?) };
+
+ mim_Data, mim_Longdata, mim_Longerror:
+ { Note: mim_Longerror included because there's a bug in the Maui
+ input driver that sends MIM_LONGERROR for subsequent buffers when
+ the input buffer is smaller than the sysex block being received }
+
+ begin
+ { TODO: Make filtered messages customisable, I'm sure someone wants to
+ do something with MTC! }
+ if (dwParam1 <> MIDI_ACTIVESENSING) and
+ (dwParam1 <> MIDI_TIMINGCLOCK) then
+ begin
+
+ { The device driver passes us the instance data pointer we
+ specified for midiInOpen. Use this to get the buffer address
+ and window handle for the MIDI control }
+ thisCtlInfo := PMidiCtlInfo(dwInstance);
+ thisBuffer := thisCtlInfo^.PBuffer;
+
+ { Screen out short messages if we've been asked to }
+ if ((wMsg <> mim_Data) or (thisCtlInfo^.SysexOnly = False))
+ and (thisCtlInfo <> Nil) and (thisBuffer <> Nil) then
+ begin
+ with thisEvent do
+ begin
+ timestamp := dwParam2;
+ if (wMsg = mim_Longdata) or
+ (wMsg = mim_Longerror) then
+ begin
+ data := 0;
+ sysex := PMidiHdr(dwParam1);
+ end
+ else
+ begin
+ data := dwParam1;
+ sysex := Nil;
+ end;
+ end;
+ if CircbufPutEvent( thisBuffer, @thisEvent ) then
+ { Send a message to the control to say input's arrived }
+ PostMessage(thisCtlInfo^.hWindow, mim_Data, 0, 0)
+ else
+ { Buffer overflow }
+ PostMessage(thisCtlInfo^.hWindow, mim_Overflow, 0, 0);
+ end;
+ end;
+ end;
+
+ mom_Done: { Sysex output complete, dwParam1 is pointer to MIDIHDR }
+ begin
+ { Notify the control that its sysex output is finished.
+ The control should call midiOutUnprepareHeader before freeing the buffer }
+ PostMessage(PMidiCtlInfo(dwInstance)^.hWindow, mom_Done, 0, dwParam1);
+ end;
+
+ end; { Case }
+end;
+
+end.
diff --git a/Game/Code/lib/midi/MIDIDEFS.PAS b/Game/Code/lib/midi/MIDIDEFS.PAS
new file mode 100644
index 00000000..4024c547
--- /dev/null
+++ b/Game/Code/lib/midi/MIDIDEFS.PAS
@@ -0,0 +1,47 @@
+{ $Header: /MidiComp/MIDIDEFS.PAS 2 10/06/97 7:33 Davec $ }
+
+{ Written by David Churcher <dchurcher@cix.compulink.co.uk>,
+ released to the public domain. }
+
+
+{ Common definitions used by DELPHMID.DPR and the MIDI components.
+ This must be a separate unit to prevent large chunks of the VCL being
+ linked into the DLL. }
+unit Mididefs;
+
+interface
+
+uses WinProcs, WinTypes, MMsystem, Circbuf;
+
+type
+
+ {-------------------------------------------------------------------}
+ { This is the information about the control that must be accessed by
+ the MIDI input callback function in the DLL at interrupt time }
+ PMidiCtlInfo = ^TMidiCtlInfo;
+ TMidiCtlInfo = record
+ hMem: THandle; { Memory handle for this record }
+ PBuffer: PCircularBuffer; { Pointer to the MIDI input data buffer }
+ hWindow: HWnd; { Control's window handle }
+ SysexOnly: Boolean; { Only process System Exclusive input }
+ end;
+
+ { Information for the output timer callback function, also required at
+ interrupt time. }
+ PMidiOutTimerInfo = ^TMidiOutTimerInfo;
+ TMidiOutTimerInfo = record
+ hMem: THandle; { Memory handle for this record }
+ PBuffer: PCircularBuffer; { Pointer to MIDI output data buffer }
+ hWindow: HWnd; { Control's window handle }
+ TimeToNextEvent: DWORD; { Delay to next event after timer set }
+ MIDIHandle: HMidiOut; { MIDI handle to send output to
+ (copy of component's FMidiHandle property) }
+ PeriodMin: Word; { Multimedia timer minimum period supported }
+ PeriodMax: Word; { Multimedia timer maximum period supported }
+ TimerId: Word; { Multimedia timer ID of current event }
+ end;
+
+implementation
+
+
+end.
diff --git a/Game/Code/lib/midi/MIDITYPE.PAS b/Game/Code/lib/midi/MIDITYPE.PAS
new file mode 100644
index 00000000..0aa9cec3
--- /dev/null
+++ b/Game/Code/lib/midi/MIDITYPE.PAS
@@ -0,0 +1,79 @@
+{ $Header: /MidiComp/MIDITYPE.PAS 2 10/06/97 7:33 Davec $ }
+
+{ Written by David Churcher <dchurcher@cix.compulink.co.uk>,
+ released to the public domain. }
+
+
+unit Miditype;
+
+interface
+
+uses Classes, Wintypes, Messages, MMSystem, MidiDefs, Circbuf;
+
+type
+ {-------------------------------------------------------------------}
+ { A MIDI input/output event }
+ TMyMidiEvent = class(TPersistent)
+ public
+ MidiMessage: Byte; { MIDI message status byte }
+ Data1: Byte; { MIDI message data 1 byte }
+ Data2: Byte; { MIDI message data 2 byte }
+ Time: DWORD; { Time in ms since midiInOpen }
+ SysexLength: Word; { Length of sysex data (0 if none) }
+ Sysex: PChar; { Pointer to sysex data buffer }
+ destructor Destroy; override; { Frees sysex data buffer if nec. }
+ end;
+ PMyMidiEvent = ^TMyMidiEvent;
+
+ {-------------------------------------------------------------------}
+ { Encapsulates the MIDIHDR with its memory handle and sysex buffer }
+ PMyMidiHdr = ^TMyMidiHdr;
+ TMyMidiHdr = class(TObject)
+ public
+ hdrHandle: THandle;
+ hdrPointer: PMIDIHDR;
+ sysexHandle: THandle;
+ sysexPointer: Pointer;
+ constructor Create(BufferSize: Word);
+ destructor Destroy; override;
+ end;
+
+implementation
+
+{-------------------------------------------------------------------}
+{ Free any sysex buffer associated with the event }
+destructor TMyMidiEvent.Destroy;
+begin
+ if (Sysex <> Nil) then
+ Freemem(Sysex, SysexLength);
+
+ inherited Destroy;
+end;
+
+{-------------------------------------------------------------------}
+{ Allocate memory for the sysex header and buffer }
+constructor TMyMidiHdr.Create(BufferSize:Word);
+begin
+ inherited Create;
+
+ if BufferSize > 0 then
+ begin
+ hdrPointer := GlobalSharedLockedAlloc(sizeof(TMIDIHDR), hdrHandle);
+ sysexPointer := GlobalSharedLockedAlloc(BufferSize, sysexHandle);
+
+ hdrPointer^.lpData := sysexPointer;
+ hdrPointer^.dwBufferLength := BufferSize;
+ end;
+end;
+
+{-------------------------------------------------------------------}
+destructor TMyMidiHdr.Destroy;
+begin
+ GlobalSharedLockedFree( hdrHandle, hdrPointer );
+ GlobalSharedLockedFree( sysexHandle, sysexPointer );
+ inherited Destroy;
+end;
+
+
+
+end.
diff --git a/Game/Code/lib/midi/MidiFile.pas b/Game/Code/lib/midi/MidiFile.pas
new file mode 100644
index 00000000..10b64a80
--- /dev/null
+++ b/Game/Code/lib/midi/MidiFile.pas
@@ -0,0 +1,956 @@
+{
+ Load a midifile and get access to tracks and events
+ I did build this component to convert midifiles to wave files
+ or play the files on a software synthesizer which I'm currenly
+ building.
+
+ version 1.0 first release
+
+ version 1.1
+ added some function
+ function KeyToStr(key : integer) : string;
+ function MyTimeToStr(val : integer) : string;
+ Bpm can be set to change speed
+
+ version 1.2
+ added some functions
+ function GetTrackLength:integer;
+ function Ready: boolean;
+
+ version 1.3
+ update by Chulwoong,
+ He knows how to use the MM timer, the timing is much better now, thank you
+
+ for comments/bugs
+ F.Bouwmans
+ fbouwmans@spiditel.nl
+
+ if you think this component is nice and you use it, sent me a short email.
+ I've seen that other of my components have been downloaded a lot, but I've
+ got no clue wether they are actually used.
+ Don't worry because you are free to use these components
+
+ Timing has improved, however because the messages are handled by the normal
+ windows message loop (of the main window) it is still influenced by actions
+ done on the window (minimize/maximize ..).
+ Use of a second thread with higher priority which only handles the
+ timer message should increase performance. If somebody knows such a component
+ which is freeware please let me know.
+
+ interface description:
+
+ procedure ReadFile:
+ actually read the file which is set in Filename
+
+ function GetTrack(index: integer) : TMidiTrack;
+
+ property Filename
+ set/read filename of midifile
+
+ property NumberOfTracks
+ read number of tracks in current file
+
+ property TicksPerQuarter: integer
+ ticks per quarter, tells how to interpret the time value in midi events
+
+ property FileFormat: TFileFormat
+ tells the format of the current midifile
+
+ property Bpm:integer
+ tells Beats per minut
+
+ property OnMidiEvent:TOnMidiEvent
+ called while playing for each midi event
+
+ procedure StartPlaying;
+ start playing the current loaded midifile from the beginning
+
+ procedure StopPlaying;
+ stop playing the current midifile
+
+ procedure PlayToTime(time : integer);
+ if playing yourself then events from last time to this time are produced
+
+
+ function KeyToStr(key : integer) : string;
+ give note string on key value: e.g. C4
+
+ function MyTimeToStr(val : integer) : string;
+ give time string from msec time
+
+ function GetTrackLength:integer;
+ gives the track lenght in msec (assuming the bpm at the start oof the file)
+
+ function Ready: boolean;
+ now you can check wether the playback is finished
+
+}
+
+unit MidiFile;
+
+interface
+
+uses
+ Windows,
+ Messages,
+ SysUtils,
+ Classes,
+ Graphics,
+ Controls,
+ Forms,
+ stdctrls,
+ ExtCtrls,
+ WinProcs;
+
+type
+ TChunkType = (illegal, header, track);
+ TFileFormat = (single, multi_synch, multi_asynch);
+ PByte = ^byte;
+
+ TMidiEvent = record
+ event: byte;
+ data1: byte;
+ data2: byte;
+ str: string;
+ dticks: integer;
+ time: integer;
+ mtime: integer;
+ len: integer;
+ end;
+ PMidiEvent = ^TMidiEvent;
+
+ TOnMidiEvent = procedure(event: PMidiEvent) of object;
+ TEvent = procedure of object;
+
+ TMidiTrack = class(TObject)
+ protected
+ events: TList;
+ name: string;
+ instrument: string;
+ currentTime: integer;
+ currentPos: integer;
+ ready: boolean;
+ trackLenght: integer;
+ procedure checkReady;
+ public
+ OnMidiEvent: TOnMidiEvent;
+ OnTrackReady: TEvent;
+ constructor Create;
+ destructor Destroy; override;
+
+ procedure Rewind(pos: integer);
+ procedure PlayUntil(pos: integer);
+ procedure GoUntil(pos: integer);
+
+ procedure putEvent(event: PMidiEvent);
+ function getEvent(index: integer): PMidiEvent;
+ function getName: string;
+ function getInstrument: string;
+ function getEventCount: integer;
+ function getCurrentTime: integer;
+ function getTrackLength: integer;
+ function isReady:boolean;
+ end;
+
+ TMidiFile = class(TComponent)
+ private
+ { Private declarations }
+ procedure MidiTimer(sender : TObject);
+ procedure WndProc(var Msg : TMessage);
+ protected
+ { Protected declarations }
+ midiFile: file of byte;
+ chunkType: TChunkType;
+ chunkLength: integer;
+ chunkData: PByte;
+ chunkIndex: PByte;
+ chunkEnd: PByte;
+ FPriority: DWORD;
+
+ // midi file attributes
+ FFileFormat: TFileFormat;
+ numberTracks: integer;
+ deltaTicks: integer;
+ FBpm: integer;
+ FBeatsPerMeasure: integer;
+ FusPerTick: double;
+ FFilename: string;
+
+ Tracks: TList;
+ currentTrack: TMidiTrack;
+ FOnMidiEvent: TOnMidiEvent;
+ FOnUpdateEvent: TNotifyEvent;
+
+ // playing attributes
+ playing: boolean;
+ PlayStartTime: integer;
+ currentTime: integer; // Current playtime in msec
+ currentPos: Double; // Current Position in ticks
+
+ procedure OnTrackReady;
+ procedure setFilename(val: string);
+ procedure ReadChunkHeader;
+ procedure ReadChunkContent;
+ procedure ReadChunk;
+ procedure ProcessHeaderChunk;
+ procedure ProcessTrackChunk;
+ function ReadVarLength: integer;
+ function ReadString(l: integer): string;
+ procedure SetOnMidiEvent(handler: TOnMidiEvent);
+ procedure SetBpm(val: integer);
+ public
+ { Public declarations }
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+
+ procedure ReadFile;
+ function GetTrack(index: integer): TMidiTrack;
+
+ procedure StartPlaying;
+ procedure StopPlaying;
+ procedure ContinuePlaying;
+
+ procedure PlayToTime(time: integer);
+ procedure GoToTime(time: integer);
+ function GetCurrentTime: integer;
+ function GetFusPerTick : Double;
+ function GetTrackLength:integer;
+ function Ready: boolean;
+ published
+ { Published declarations }
+ property Filename: string read FFilename write setFilename;
+ property NumberOfTracks: integer read numberTracks;
+ property TicksPerQuarter: integer read deltaTicks;
+ property FileFormat: TFileFormat read FFileFormat;
+ property Bpm: integer read FBpm write SetBpm;
+ property OnMidiEvent: TOnMidiEvent read FOnMidiEvent write SetOnMidiEvent;
+ property OnUpdateEvent: TNotifyEvent read FOnUpdateEvent write FOnUpdateEvent;
+ end;
+
+function KeyToStr(key: integer): string;
+function MyTimeToStr(val: integer): string;
+procedure Register;
+
+implementation
+
+uses mmsystem;
+
+type TTimerProc=procedure(uTimerID,uMsg: Integer; dwUser,dwParam1,dwParam2:DWORD);stdcall;
+
+const TIMER_RESOLUTION=10;
+const WM_MULTIMEDIA_TIMER=WM_USER+127;
+
+var MIDIFileHandle : HWND;
+ TimerProc : TTimerProc;
+ MIDITimerID : Integer;
+ TimerPeriod : Integer;
+
+procedure TimerCallBackProc(uTimerID,uMsg: Integer; dwUser,dwParam1,dwParam2:DWORD);stdcall;
+begin
+ PostMessage(HWND(dwUser),WM_MULTIMEDIA_TIMER,0,0);
+end;
+
+procedure SetMIDITimer;
+ var TimeCaps : TTimeCaps ;
+begin
+ timeGetDevCaps(@TimeCaps,SizeOf(TimeCaps));
+ if TIMER_RESOLUTION < TimeCaps.wPeriodMin then
+ TimerPeriod:=TimeCaps.wPeriodMin
+ else if TIMER_RESOLUTION > TimeCaps.wPeriodMax then
+ TimerPeriod:=TimeCaps.wPeriodMax
+ else
+ TimerPeriod:=TIMER_RESOLUTION;
+
+ timeBeginPeriod(TimerPeriod);
+ MIDITimerID:=timeSetEvent(TimerPeriod,TimerPeriod,@TimerProc,
+ DWORD(MIDIFileHandle),TIME_PERIODIC);
+ if MIDITimerID=0 then
+ timeEndPeriod(TimerPeriod);
+end;
+
+procedure KillMIDITimer;
+begin
+ timeKillEvent(MIDITimerID);
+ timeEndPeriod(TimerPeriod);
+end;
+
+constructor TMidiTrack.Create;
+begin
+ inherited Create;
+ events := TList.Create;
+ currentTime := 0;
+ currentPos := 0;
+end;
+
+destructor TMidiTrack.Destroy;
+var
+ i: integer;
+begin
+ for i := 0 to events.count - 1 do
+ Dispose(PMidiEvent(events.items[i]));
+ events.Free;
+ inherited Destroy;
+end;
+
+procedure TMidiTRack.putEvent(event: PMidiEvent);
+var
+ command: integer;
+ i: integer;
+ pevent: PMidiEvent;
+begin
+ if (event.event = $FF) then
+ begin
+ if (event.data1 = 3) then
+ name := event.str;
+ if (event.data1 = 4) then
+ instrument := event.str;
+ end;
+ currentTime := currentTime + event.dticks;
+ event.time := currentTime; // for the moment just add dticks
+ event.len := 0;
+ events.add(TObject(event));
+ command := event.event and $F0;
+
+ if ((command = $80) // note off
+ or ((command = $90) and (event.data2 = 0))) //note on with speed 0
+ then
+ begin
+ // this is a note off, try to find the accompanion note on
+ command := event.event or $90;
+ i := events.count - 2;
+ while i >= 0 do
+ begin
+ pevent := PMidiEvent(events[i]);
+ if (pevent.event = command) and
+ (pevent.data1 = event.data1)
+ then
+ begin
+ pevent.len := currentTIme - pevent.time;
+ i := 0;
+ event.len := -1;
+ end;
+ dec(i);
+ end;
+ end;
+end;
+
+function TMidiTrack.getName: string;
+begin
+ result := name;
+end;
+
+function TMidiTrack.getInstrument: string;
+begin
+ result := instrument;
+end;
+
+function TMiditrack.getEventCount: integer;
+begin
+ result := events.count;
+end;
+
+function TMiditrack.getEvent(index: integer): PMidiEvent;
+begin
+ if ((index < events.count) and (index >= 0)) then
+ result := events[index]
+ else
+ result := nil;
+end;
+
+function TMiditrack.getCurrentTime: integer;
+begin
+ result := currentTime;
+end;
+
+procedure TMiditrack.Rewind(pos: integer);
+begin
+ if currentPos = events.count then
+ dec(currentPos);
+ while ((currentPos > 0) and
+ (PMidiEvent(events[currentPos]).time > pos))
+ do
+ begin
+ dec(currentPos);
+ end;
+ checkReady;
+end;
+
+procedure TMiditrack.PlayUntil(pos: integer);
+begin
+ if assigned(OnMidiEvent) then
+ begin
+ while ((currentPos < events.count) and
+ (PMidiEvent(events[currentPos]).time < pos)) do
+ begin
+ OnMidiEvent(PMidiEvent(events[currentPos]));
+ inc(currentPos);
+ end;
+ end;
+ checkReady;
+end;
+
+procedure TMidiTrack.GoUntil(pos: integer);
+begin
+ while ((currentPos < events.count) and
+ (PMidiEvent(events[currentPos]).time < pos)) do
+ begin
+ inc(currentPos);
+ end;
+ checkReady;
+end;
+
+procedure TMidiTrack.checkReady;
+begin
+ if currentPos >= events.count then
+ begin
+ ready := true;
+ if assigned(OnTrackReady) then
+ OnTrackReady;
+ end
+ else
+ ready := false;
+end;
+
+function TMidiTrack.getTrackLength: integer;
+begin
+ result := PMidiEvent(events[events.count-1]).time
+end;
+
+function TMidiTrack.isReady: boolean;
+begin
+ result := ready;
+end;
+
+constructor TMidifile.Create(AOwner: TComponent);
+begin
+ inherited Create(AOWner);
+ MIDIFileHandle:=AllocateHWnd(WndProc);
+ chunkData := nil;
+ chunkType := illegal;
+ Tracks := TList.Create;
+ TimerProc:=TimerCallBackProc;
+ FPriority:=GetPriorityClass(MIDIFileHandle);
+end;
+
+destructor TMidifile.Destroy;
+var
+ i: integer;
+begin
+ if not (chunkData = nil) then FreeMem(chunkData);
+ for i := 0 to Tracks.Count - 1 do
+ TMidiTrack(Tracks.Items[i]).Free;
+ Tracks.Free;
+ SetPriorityClass(MIDIFileHandle,FPriority);
+
+ if MIDITimerID<>0 then KillMIDITimer;
+
+ DeallocateHWnd(MIDIFileHandle);
+
+ inherited Destroy;
+end;
+
+function TMidiFile.GetTrack(index: integer): TMidiTrack;
+begin
+ result := Tracks.Items[index];
+end;
+
+procedure TMidifile.setFilename(val: string);
+begin
+ FFilename := val;
+// ReadFile;
+end;
+
+procedure TMidifile.SetOnMidiEvent(handler: TOnMidiEvent);
+var
+ i: integer;
+begin
+// if not (FOnMidiEvent = handler) then
+// begin
+ FOnMidiEvent := handler;
+ for i := 0 to tracks.count - 1 do
+ TMidiTrack(tracks.items[i]).OnMidiEvent := handler;
+// end;
+end;
+
+procedure TMidifile.MidiTimer(Sender: TObject);
+begin
+ if playing then
+ begin
+ PlayToTime(GetTickCount - PlayStartTime);
+ if assigned(FOnUpdateEvent) then FOnUpdateEvent(self);
+ end;
+end;
+
+procedure TMidifile.StartPlaying;
+var
+ i: integer;
+begin
+ for i := 0 to tracks.count - 1 do
+ TMidiTrack(tracks[i]).Rewind(0);
+ playStartTime := getTickCount;
+ playing := true;
+
+ SetPriorityClass(MIDIFileHandle,REALTIME_PRIORITY_CLASS);
+
+ SetMIDITimer;
+ currentPos := 0.0;
+ currentTime := 0;
+end;
+
+procedure TMidifile.ContinuePlaying;
+begin
+ PlayStartTime := GetTickCount - currentTime;
+ playing := true;
+
+ SetPriorityClass(MIDIFileHandle,REALTIME_PRIORITY_CLASS);
+
+ SetMIDITimer;
+end;
+
+procedure TMidifile.StopPlaying;
+begin
+ playing := false;
+ KillMIDITimer;
+ SetPriorityClass(MIDIFileHandle,FPriority);
+end;
+
+function TMidiFile.GetCurrentTime: integer;
+begin
+ Result := currentTime;
+end;
+
+procedure TMidifile.PlayToTime(time: integer);
+var
+ i: integer;
+ track: TMidiTrack;
+ pos: integer;
+ deltaTime: integer;
+begin
+ // calculate the pos in the file.
+ // pos is actually tick
+ // Current FusPerTick is uses to determine the actual pos
+
+ deltaTime := time - currentTime;
+ currentPos := currentPos + (deltaTime * 1000) / FusPerTick;
+ pos := round(currentPos);
+
+ for i := 0 to tracks.count - 1 do
+ begin
+ TMidiTrack(tracks.items[i]).PlayUntil(pos);
+ end;
+ currentTime := time;
+end;
+
+procedure TMidifile.GoToTime(time: integer);
+var
+ i: integer;
+ track: TMidiTrack;
+ pos: integer;
+begin
+ // this function should be changed because FusPerTick might not be constant
+ pos := round((time * 1000) / FusPerTick);
+ for i := 0 to tracks.count - 1 do
+ begin
+ TMidiTrack(tracks.items[i]).Rewind(0);
+ TMidiTrack(tracks.items[i]).GoUntil(pos);
+ end;
+end;
+
+procedure TMidifile.SetBpm(val: integer);
+var
+ us_per_quarter: integer;
+begin
+ if not (val = FBpm) then
+ begin
+ us_per_quarter := 60000000 div val;
+
+ FBpm := 60000000 div us_per_quarter;
+ FusPerTick := us_per_quarter / deltaTicks;
+ end;
+end;
+
+procedure TMidifile.ReadChunkHeader;
+var
+ theByte: array[0..7] of byte;
+begin
+ BlockRead(midiFile, theByte, 8);
+ if (theByte[0] = $4D) and (theByte[1] = $54) then
+ begin
+ if (theByte[2] = $68) and (theByte[3] = $64) then
+ chunkType := header
+ else if (theByte[2] = $72) and (theByte[3] = $6B) then
+ chunkType := track
+ else
+ chunkType := illegal;
+ end
+ else
+ begin
+ chunkType := illegal;
+ end;
+ chunkLength := theByte[7] + theByte[6] * $100 + theByte[5] * $10000 + theByte[4] * $1000000;
+end;
+
+procedure TMidifile.ReadChunkContent;
+begin
+ if not (chunkData = nil) then
+ FreeMem(chunkData);
+ GetMem(chunkData, chunkLength + 10);
+ BlockRead(midiFile, chunkData^, chunkLength);
+ chunkIndex := chunkData;
+ chunkEnd := PByte(integer(chunkIndex) + integer(chunkLength) - 1);
+end;
+
+procedure TMidifile.ReadChunk;
+begin
+ ReadChunkHeader;
+ ReadChunkContent;
+ case chunkType of
+ header:
+ ProcessHeaderChunk;
+ track:
+ ProcessTrackCHunk;
+ end;
+end;
+
+procedure TMidifile.ProcessHeaderChunk;
+begin
+ chunkIndex := chunkData;
+ inc(chunkIndex);
+ if chunkType = header then
+ begin
+ case chunkIndex^ of
+ 0: FfileFormat := single;
+ 1: FfileFormat := multi_synch;
+ 2: FfileFormat := multi_asynch;
+ end;
+ inc(chunkIndex);
+ numberTracks := chunkIndex^ * $100;
+ inc(chunkIndex);
+ numberTracks := numberTracks + chunkIndex^;
+ inc(chunkIndex);
+ deltaTicks := chunkIndex^ * $100;
+ inc(chunkIndex);
+ deltaTicks := deltaTicks + chunkIndex^;
+ end;
+end;
+
+procedure TMidifile.ProcessTrackChunk;
+var
+ dTime: integer;
+ event: integer;
+ len: integer;
+ str: string;
+ midiEvent: PMidiEvent;
+ i: integer;
+ us_per_quarter: integer;
+begin
+ chunkIndex := chunkData;
+// inc(chunkIndex);
+ event := 0;
+ if chunkType = track then
+ begin
+ currentTrack := TMidiTrack.Create;
+ currentTrack.OnMidiEvent := FOnMidiEvent;
+ Tracks.add(currentTrack);
+ while integer(chunkIndex) < integer(chunkEnd) do
+ begin
+ // each event starts with var length delta time
+ dTime := ReadVarLength;
+ if chunkIndex^ >= $80 then
+ begin
+ event := chunkIndex^;
+ inc(chunkIndex);
+ end;
+ // else it is a running status event (just the same event as before)
+
+ if event = $FF then
+ begin
+{ case chunkIndex^ of
+ $00: // sequence number, not implemented jet
+ begin
+ inc(chunkIndex); // $02
+ inc(chunkIndex);
+ end;
+ $01 .. $0f: // text events FF ty len text
+ begin
+ New(midiEvent);
+ midiEvent.event := $FF;
+ midiEvent.data1 := chunkIndex^; // type is stored in data1
+ midiEvent.dticks := dtime;
+
+ inc(chunkIndex);
+ len := ReadVarLength;
+ midiEvent.str := ReadString(len);
+
+ currentTrack.putEvent(midiEvent);
+ end;
+ $20: // Midi channel prefix FF 20 01 cc
+ begin
+ inc(chunkIndex); // $01
+ inc(chunkIndex); // channel
+ inc(chunkIndex);
+ end;
+ $2F: // End of track FF 2F 00
+ begin
+ inc(chunkIndex); // $00
+ inc(chunkIndex);
+ end;
+ $51: // Set Tempo FF 51 03 tttttt
+ begin
+ inc(chunkIndex); // $03
+ inc(chunkIndex); // tt
+ inc(chunkIndex); // tt
+ inc(chunkIndex); // tt
+ inc(chunkIndex);
+ end;
+ $54: // SMPTE offset FF 54 05 hr mn se fr ff
+ begin
+ inc(chunkIndex); // $05
+ inc(chunkIndex); // hr
+ inc(chunkIndex); // mn
+ inc(chunkIndex); // se
+ inc(chunkIndex); // fr
+ inc(chunkIndex); // ff
+ inc(chunkIndex);
+ end;
+ $58: // Time signature FF 58 04 nn dd cc bb
+ begin
+ inc(chunkIndex); // $04
+ inc(chunkIndex); // nn
+ inc(chunkIndex); // dd
+ inc(chunkIndex); // cc
+ inc(chunkIndex); // bb
+ inc(chunkIndex);
+ end;
+ $59: // Key signature FF 59 02 df mi
+ begin
+ inc(chunkIndex); // $02
+ inc(chunkIndex); // df
+ inc(chunkIndex); // mi
+ inc(chunkIndex);
+ end;
+ $7F: // Sequence specific Meta-event
+ begin
+ inc(chunkIndex);
+ len := ReadVarLength;
+ str := ReadString(len);
+ end;
+ else // unknown meta event
+ }
+ begin
+ New(midiEvent);
+ midiEvent.event := $FF;
+ midiEvent.data1 := chunkIndex^; // type is stored in data1
+ midiEvent.dticks := dtime;
+
+ inc(chunkIndex);
+ len := ReadVarLength;
+ midiEvent.str := ReadString(len);
+ currentTrack.putEvent(midiEvent);
+
+ case midiEvent.data1 of
+ $51:
+ begin
+ us_per_quarter :=
+ (integer(byte(midiEvent.str[1])) shl 16 +
+ integer(byte(midiEvent.str[2])) shl 8 +
+ integer(byte(midiEvent.str[3])));
+ FBpm := 60000000 div us_per_quarter;
+ FusPerTick := us_per_quarter / deltaTicks;
+ end;
+ end;
+ end;
+// end;
+ end
+ else
+ begin
+ // these are all midi events
+ New(midiEvent);
+ midiEvent.event := event;
+ midiEvent.dticks := dtime;
+// inc(chunkIndex);
+ case event of
+ $80..$8F, // note off
+ $90..$9F, // note on
+ $A0..$AF, // key aftertouch
+ $B0..$BF, // control change
+ $E0..$EF: // pitch wheel change
+ begin
+ midiEvent.data1 := chunkIndex^; inc(chunkIndex);
+ midiEvent.data2 := chunkIndex^; inc(chunkIndex);
+ end;
+ $C0..$CF, // program change
+ $D0..$DF: // channel aftertouch
+ begin
+ midiEvent.data1 := chunkIndex^; inc(chunkIndex);
+ end;
+ else
+ // error
+ end;
+ currentTrack.putEvent(midiEvent);
+ end;
+ end;
+ end;
+end;
+
+
+function TMidifile.ReadVarLength: integer;
+var
+ i: integer;
+ b: byte;
+begin
+ b := 128;
+ i := 0;
+ while b > 127 do
+ begin
+ i := i shl 7;
+ b := chunkIndex^;
+ i := i + b and $7F;
+ inc(chunkIndex);
+ end;
+ result := i;
+end;
+
+function TMidifile.ReadString(l: integer): string;
+var
+ s: PChar;
+ i: integer;
+begin
+ GetMem(s, l + 1); ;
+ s[l] := chr(0);
+ for i := 0 to l - 1 do
+ begin
+ s[i] := Chr(chunkIndex^);
+ inc(chunkIndex);
+ end;
+ result := string(s);
+end;
+
+procedure TMidifile.ReadFile;
+var
+ i: integer;
+begin
+ for i := 0 to Tracks.Count - 1 do
+ TMidiTrack(Tracks.Items[i]).Free;
+ Tracks.Clear;
+ chunkType := illegal;
+
+ AssignFile(midiFile, FFilename);
+ FileMode := 0;
+ Reset(midiFile);
+ while not eof(midiFile) do
+ ReadChunk;
+ CloseFile(midiFile);
+ numberTracks := Tracks.Count;
+end;
+
+function KeyToStr(key: integer): string;
+var
+ n: integer;
+ str: string;
+begin
+ n := key mod 12;
+ case n of
+ 0: str := 'C';
+ 1: str := 'C#';
+ 2: str := 'D';
+ 3: str := 'D#';
+ 4: str := 'E';
+ 5: str := 'F';
+ 6: str := 'F#';
+ 7: str := 'G';
+ 8: str := 'G#';
+ 9: str := 'A';
+ 10: str := 'A#';
+ 11: str := 'B';
+ end;
+ Result := str + IntToStr(key div 12);
+end;
+
+function IntToLenStr(val: integer; len: integer): string;
+var
+ str: string;
+begin
+ str := IntToStr(val);
+ while Length(str) < len do
+ str := '0' + str;
+ Result := str;
+end;
+
+function MyTimeToStr(val: integer): string;
+ var
+ hour: integer;
+ min: integer;
+ sec: integer;
+ msec: integer;
+begin
+ msec := val mod 1000;
+ sec := val div 1000;
+ min := sec div 60;
+ sec := sec mod 60;
+ hour := min div 60;
+ min := min mod 60;
+ Result := IntToStr(hour) + ':' + IntToLenStr(min, 2) + ':' + IntToLenStr(sec, 2) + '.' + IntToLenStr(msec, 3);
+end;
+
+function TMidiFIle.GetFusPerTick : Double;
+begin
+ Result := FusPerTick;
+end;
+
+function TMidiFIle.GetTrackLength:integer;
+var i,length : integer;
+ time : extended;
+begin
+ length := 0;
+ for i := 0 to Tracks.Count - 1 do
+ if TMidiTrack(Tracks.Items[i]).getTrackLength > length then
+ length := TMidiTrack(Tracks.Items[i]).getTrackLength;
+ time := length * FusPerTick;
+ time := time / 1000.0;
+ result := round(time);
+end;
+
+function TMidiFIle.Ready: boolean;
+var i : integer;
+begin
+ result := true;
+ for i := 0 to Tracks.Count - 1 do
+ if not TMidiTrack(Tracks.Items[i]).isready then
+ result := false;
+end;
+
+procedure TMidiFile.OnTrackReady;
+begin
+ if ready then
+ if assigned(FOnUpdateEvent) then FOnUpdateEvent(self);
+end;
+
+procedure TMidiFile.WndProc(var Msg : TMessage);
+begin
+ with MSG do
+ begin
+ case Msg of
+ WM_MULTIMEDIA_TIMER:
+ begin
+ try
+ MidiTimer(self);
+ except
+ Application.HandleException(Self);
+ end;
+ end;
+ else
+ begin
+ Result := DefWindowProc(MIDIFileHandle, Msg, wParam, lParam);
+ end;
+ end;
+ end;
+end;
+
+procedure Register;
+begin
+ RegisterComponents('Synth', [TMidiFile]);
+end;
+
+end.
+
diff --git a/Game/Code/lib/midi/MidiScope.pas b/Game/Code/lib/midi/MidiScope.pas
new file mode 100644
index 00000000..0caa430f
--- /dev/null
+++ b/Game/Code/lib/midi/MidiScope.pas
@@ -0,0 +1,193 @@
+{
+ Shows a large black area where midi note/controller events are shown
+ just to monitor midi activity (for the MidiPlayer)
+
+ version 1.0 first release
+
+ for comments/bugs
+ F.Bouwmans
+ fbouwmans@spiditel.nl
+
+ if you think this component is nice and you use it, sent me a short email.
+ I've seen that other of my components have been downloaded a lot, but I've
+ got no clue wether they are actually used.
+ Don't worry because you are free to use these components
+}
+
+unit MidiScope;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;
+
+type
+ TMidiScope = class(TGraphicControl)
+ private
+ { Private declarations }
+ protected
+ { Protected declarations }
+ notes : array[0..15,0..127] of integer;
+ controllers : array[0..15,0..17] of integer;
+ aftertouch : array[0..15,0..127] of integer;
+
+ selectedChannel : integer;
+
+ procedure PaintSlide(ch,pos,val: integer);
+
+ procedure NoteOn(channel, note, speed : integer);
+ procedure Controller(channel,number,value : integer);
+ procedure AfterTch(channel, note, value : integer);
+
+ public
+ { Public declarations }
+ constructor Create(AOwner: TComponent); override;
+ procedure MidiEvent(event,data1,data2 : integer);
+ procedure Paint; override;
+ published
+ { Published declarations }
+ end;
+
+
+procedure Register;
+
+const
+ BarHeight = 16;
+ BarHeightInc = BarHeight+2;
+ BarWidth = 3;
+ BarWidthInc = BarWidth+1;
+ HeightDiv = 128 div BarHeight;
+
+implementation
+
+uses Midicons;
+
+procedure Register;
+begin
+ RegisterComponents('Synth', [TMidiScope]);
+end;
+
+constructor TMidiScope.Create(AOwner: TComponent);
+var
+ i,j : integer;
+begin
+ inherited Create(AOwner);
+ Height := BarHeightinc * 16 + 4;
+ Width := 147*BarWidthInc + 4 + 20; // for channel number
+ for i := 0 to 15 do
+ begin
+ for j := 0 to 127 do
+ begin
+ notes[i,j] := 0;
+ aftertouch[i,j] := 0;
+ end;
+ end;
+ for i := 0 to 17 do
+ begin
+ for j := 0 to 15 do
+ controllers[i,j] := 0;
+ end;
+end;
+
+procedure TMidiScope.PaintSlide(ch,pos,val: integer);
+var x,y:integer;
+begin
+ Canvas.Brush.Color := clBlack;
+ Canvas.Pen.color := clBlack;
+ x := pos * BarWidthInc + 2;
+ y := 2 + ch * BarHeightInc;
+ Canvas.Rectangle(x, y, x+BarWidthInc, y+BarHeightInc);
+ Canvas.Brush.Color := clGreen;
+ Canvas.Pen.Color := clGreen;
+ Canvas.Rectangle(x, y + (BarHeight - (val div HeightDiv )), x + BarWidth, y + BarHeight)
+end;
+
+procedure TMidiScope.Paint;
+var i,j : integer;
+x : integer;
+begin
+ Canvas.Brush.color := clBlack;
+ Canvas.Rectangle(0,0,Width,Height);
+ Canvas.Pen.Color := clGreen;
+ x := 128*BarWidthInc+2;
+ Canvas.MoveTo(x,0);
+ Canvas.LineTo(x,Height);
+ x := 148*BarWIdthInc+2;
+ canvas.Font.Color := clGreen;
+ for i := 0 to 15 do
+ Canvas.TextOut(x,((i+1)*BarHeightInc) - Canvas.font.size-3,IntToStr(i+1));
+ canvas.Pen.color := clBlack;
+ begin
+ for j := 0 to 127 do
+ begin
+ PaintSlide(i,j,notes[i,j]);
+ end;
+ for j := 0 to 17 do
+ begin
+ PaintSlide(i,j+129,controllers[i,j]);
+ end;
+ end;
+end;
+procedure TMidiScope.NoteOn(channel, note, speed : integer);
+begin
+ notes[channel,note] := speed;
+ PaintSlide(channel,note,notes[channel,note]);
+end;
+procedure TMidiScope.AfterTch(channel, note, value : integer);
+begin
+ aftertouch[channel,note] := value;
+end;
+
+procedure TMidiScope.Controller(channel,number,value : integer);
+var i : integer;
+begin
+ if number < 18 then
+ begin
+ controllers[channel,number] := value;
+ PaintSlide(channel,number+129,value);
+ end
+ else if number >= $7B then
+ begin
+ // all notes of for channel
+ for i := 0 to 127 do
+ begin
+ if notes[channel,i] > 0 then
+ begin
+ notes[channel,i] := 0;
+ PaintSlide(channel,i,0);
+ end;
+ end;
+ end;
+end;
+
+procedure TMidiScope.MidiEvent(event,data1,data2 : integer);
+begin
+ case (event AND $F0) of
+ MIDI_NOTEON :
+ begin
+ NoteOn((event AND $F),data1,data2);
+ end;
+ MIDI_NOTEOFF:
+ begin
+ NoteOn((event AND $F),data1,0);
+ end;
+ MIDI_CONTROLCHANGE :
+ begin
+ Controller((event AND $F),data1,data2);
+ end;
+ MIDI_CHANAFTERTOUCH:
+ begin
+ Controller((Event AND $F),16,Data1);
+ end;
+ MIDI_PITCHBEND:
+ begin
+ begin
+ Controller((Event AND $F),17,data2);
+ end;
+ end;
+ MIDI_KEYAFTERTOUCH:
+ begin
+ end;
+ end;
+end;
+end.
diff --git a/Game/Code/lib/midi/Midicons.pas b/Game/Code/lib/midi/Midicons.pas
new file mode 100644
index 00000000..41dda9e1
--- /dev/null
+++ b/Game/Code/lib/midi/Midicons.pas
@@ -0,0 +1,42 @@
+{ $Header: /MidiComp/MIDICONS.PAS 2 10/06/97 7:33 Davec $ }
+
+{ Written by David Churcher <dchurcher@cix.compulink.co.uk>,
+ released to the public domain. }
+
+
+{ MIDI Constants }
+unit Midicons;
+
+interface
+
+uses Messages;
+
+const
+ MIDI_ALLNOTESOFF = $7B;
+ MIDI_NOTEON = $90;
+ MIDI_NOTEOFF = $80;
+ MIDI_KEYAFTERTOUCH = $a0;
+ MIDI_CONTROLCHANGE = $b0;
+ MIDI_PROGRAMCHANGE = $c0;
+ MIDI_CHANAFTERTOUCH = $d0;
+ MIDI_PITCHBEND = $e0;
+ MIDI_SYSTEMMESSAGE = $f0;
+ MIDI_BEGINSYSEX = $f0;
+ MIDI_MTCQUARTERFRAME = $f1;
+ MIDI_SONGPOSPTR = $f2;
+ MIDI_SONGSELECT = $f3;
+ MIDI_ENDSYSEX = $F7;
+ MIDI_TIMINGCLOCK = $F8;
+ MIDI_START = $FA;
+ MIDI_CONTINUE = $FB;
+ MIDI_STOP = $FC;
+ MIDI_ACTIVESENSING = $FE;
+ MIDI_SYSTEMRESET = $FF;
+
+ MIM_OVERFLOW = WM_USER; { Input buffer overflow }
+ MOM_PLAYBACK_DONE = WM_USER+1; { Timed playback complete }
+
+
+implementation
+
+end.
diff --git a/Game/Code/lib/midi/Midiin.pas b/Game/Code/lib/midi/Midiin.pas
new file mode 100644
index 00000000..32a17c51
--- /dev/null
+++ b/Game/Code/lib/midi/Midiin.pas
@@ -0,0 +1,712 @@
+{ $Header: /MidiComp/Midiin.pas 2 10/06/97 7:33 Davec $ }
+
+{ Written by David Churcher <dchurcher@cix.compulink.co.uk>,
+ released to the public domain. }
+
+unit MidiIn;
+
+{
+ Properties:
+ DeviceID: Windows numeric device ID for the MIDI input device.
+ Between 0 and NumDevs-1.
+ Read-only while device is open, exception when changed while open
+
+ MIDIHandle: The input handle to the MIDI device.
+ 0 when device is not open
+ Read-only, runtime-only
+
+ MessageCount: Number of input messages waiting in input buffer
+
+ Capacity: Number of messages input buffer can hold
+ Defaults to 1024
+ Limited to (64K/event size)
+ Read-only when device is open (exception when changed while open)
+
+ SysexBufferSize: Size in bytes of each sysex buffer
+ Defaults to 10K
+ Minimum 0K (no buffers), Maximum 64K-1
+
+ SysexBufferCount: Number of sysex buffers
+ Defaults to 16
+ Minimum 0 (no buffers), Maximum (avail mem/SysexBufferSize)
+ Check where these buffers are allocated?
+
+ SysexOnly: True to ignore all non-sysex input events. May be changed while
+ device is open. Handy for patch editors where you have lots of short MIDI
+ events on the wire which you are always going to ignore anyway.
+
+ DriverVersion: Version number of MIDI device driver. High-order byte is
+ major version, low-order byte is minor version.
+
+ ProductName: Name of product (e.g. 'MPU 401 In')
+
+ MID and PID: Manufacturer ID and Product ID, see
+ "Manufacturer and Product IDs" in MMSYSTEM.HLP for list of possible values.
+
+ Methods:
+ GetMidiEvent: Read Midi event at the head of the FIFO input buffer.
+ Returns a TMyMidiEvent object containing MIDI message data, timestamp,
+ and sysex data if applicable.
+ This method automatically removes the event from the input buffer.
+ It makes a copy of the received sysex buffer and puts the buffer back
+ on the input device.
+ The TMyMidiEvent object must be freed by calling MyMidiEvent.Free.
+
+ Open: Opens device. Note no input will appear until you call the Start
+ method.
+
+ Close: Closes device. Any pending system exclusive output will be cancelled.
+
+ Start: Starts receiving MIDI input.
+
+ Stop: Stops receiving MIDI input.
+
+ Events:
+ OnMidiInput: Called when MIDI input data arrives. Use the GetMidiEvent to
+ get the MIDI input data.
+
+ OnOverflow: Called if the MIDI input buffer overflows. The caller must
+ clear the buffer before any more MIDI input can be received.
+
+ Notes:
+ Buffering: Uses a circular buffer, separate pointers for next location
+ to fill and next location to empty because a MIDI input interrupt may
+ be adding data to the buffer while the buffer is being read. Buffer
+ pointers wrap around from end to start of buffer automatically. If
+ buffer overflows then the OnBufferOverflow event is triggered and no
+ further input will be received until the buffer is emptied by calls
+ to GetMidiEvent.
+
+ Sysex buffers: There are (SysexBufferCount) buffers on the input device.
+ When sysex events arrive these buffers are removed from the input device and
+ added to the circular buffer by the interrupt handler in the DLL. When the sysex events
+ are removed from the circular buffer by the GetMidiEvent method the buffers are
+ put back on the input. If all the buffers are used up there will be no
+ more sysex input until at least one sysex event is removed from the input buffer.
+ In other words if you're expecting lots of sysex input you need to set the
+ SysexBufferCount property high enough so that you won't run out of
+ input buffers before you get a chance to read them with GetMidiEvent.
+
+ If the synth sends a block of sysex that's longer than SysexBufferSize it
+ will be received as separate events.
+ TODO: Component derived from this one that handles >64K sysex blocks cleanly
+ and can stream them to disk.
+
+ Midi Time Code (MTC) and Active Sensing: The DLL is currently hardcoded
+ to filter these short events out, so that we don't spend all our time
+ processing them.
+ TODO: implement a filter property to select the events that will be filtered
+ out.
+}
+
+interface
+
+uses
+ Classes, SysUtils, WinTypes, Messages, WinProcs, MMSystem, MidiDefs, MidiType,
+ MidiCons, Circbuf, Delphmcb;
+
+type
+ MidiInputState = (misOpen, misClosed, misCreating, misDestroying);
+ EMidiInputError = class(Exception);
+
+ {-------------------------------------------------------------------}
+ TMidiInput = class(TComponent)
+ private
+ Handle: THandle; { Window handle used for callback notification }
+ FDeviceID: Word; { MIDI device ID }
+ FMIDIHandle: HMIDIIn; { Handle to input device }
+ FState: MidiInputState; { Current device state }
+
+ FError: Word;
+ FSysexOnly: Boolean;
+
+ { Stuff from MIDIINCAPS }
+ FDriverVersion: Version;
+ FProductName: string;
+ FMID: Word; { Manufacturer ID }
+ FPID: Word; { Product ID }
+
+ { Queue }
+ FCapacity: Word; { Buffer capacity }
+ PBuffer: PCircularBuffer; { Low-level MIDI input buffer created by Open method }
+ FNumdevs: Word; { Number of input devices on system }
+
+ { Events }
+ FOnMIDIInput: TNotifyEvent; { MIDI Input arrived }
+ FOnOverflow: TNotifyEvent; { Input buffer overflow }
+ { TODO: Some sort of error handling event for MIM_ERROR }
+
+ { Sysex }
+ FSysexBufferSize: Word;
+ FSysexBufferCount: Word;
+ MidiHdrs: Tlist;
+
+ PCtlInfo: PMidiCtlInfo; { Pointer to control info for DLL }
+
+ protected
+ procedure Prepareheaders;
+ procedure UnprepareHeaders;
+ procedure AddBuffers;
+ procedure SetDeviceID(DeviceID: Word);
+ procedure SetProductName(NewProductName: string);
+ function GetEventCount: Word;
+ procedure SetSysexBufferSize(BufferSize: Word);
+ procedure SetSysexBufferCount(BufferCount: Word);
+ procedure SetSysexOnly(bSysexOnly: Boolean);
+ function MidiInErrorString(WError: Word): string;
+
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+
+ property MIDIHandle: HMIDIIn read FMIDIHandle;
+
+ property DriverVersion: Version read FDriverVersion;
+ property MID: Word read FMID; { Manufacturer ID }
+ property PID: Word read FPID; { Product ID }
+
+ property Numdevs: Word read FNumdevs;
+
+ property MessageCount: Word read GetEventCount;
+ { TODO: property to select which incoming messages get filtered out }
+
+ procedure Open;
+ procedure Close;
+ procedure Start;
+ procedure Stop;
+ { Get first message in input queue }
+ function GetMidiEvent: TMyMidiEvent;
+ procedure MidiInput(var Message: TMessage);
+
+ { Some functions to decode and classify incoming messages would be good }
+
+ published
+
+ { TODO: Property editor with dropdown list of product names }
+ property ProductName: string read FProductName write SetProductName;
+
+ property DeviceID: Word read FDeviceID write SetDeviceID default 0;
+ property Capacity: Word read FCapacity write FCapacity default 1024;
+ property Error: Word read FError;
+ property SysexBufferSize: Word
+ read FSysexBufferSize
+ write SetSysexBufferSize
+ default 10000;
+ property SysexBufferCount: Word
+ read FSysexBufferCount
+ write SetSysexBufferCount
+ default 16;
+ property SysexOnly: Boolean
+ read FSysexOnly
+ write SetSysexOnly
+ default False;
+
+ { Events }
+ property OnMidiInput: TNotifyEvent read FOnMidiInput write FOnMidiInput;
+ property OnOverflow: TNotifyEvent read FOnOverflow write FOnOverflow;
+
+ end;
+
+procedure Register;
+
+{====================================================================}
+implementation
+
+uses Controls,
+ Forms,
+ Graphics;
+
+(* Not used in Delphi 3
+{ This is the callback procedure in the external DLL.
+ It's used when midiInOpen is called by the Open method.
+ There are special requirements and restrictions for this callback
+ procedure (see midiInOpen in MMSYSTEM.HLP) so it's impractical to
+ make it an object method }
+{$IFDEF WIN32}
+function midiHandler(
+ hMidiIn: HMidiIn;
+ wMsg: UINT;
+ dwInstance: DWORD;
+ dwParam1: DWORD;
+ dwParam2: DWORD): Boolean; stdcall; external 'DELMID32.DLL';
+{$ELSE}
+procedure midiHandler(
+ hMidiIn: HMidiIn;
+ wMsg: Word;
+ dwInstance: DWORD;
+ dwParam1: DWORD;
+ dwParam2: DWORD); far; external 'DELPHMID';
+{$ENDIF}
+*)
+{-------------------------------------------------------------------}
+
+constructor TMidiInput.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FState := misCreating;
+
+ FSysexOnly := False;
+ FNumDevs := midiInGetNumDevs;
+ MidiHdrs := nil;
+
+ { Set defaults }
+ if (FNumDevs > 0) then
+ SetDeviceID(0);
+ FCapacity := 1024;
+ FSysexBufferSize := 4096;
+ FSysexBufferCount := 16;
+
+ { Create the window for callback notification }
+ if not (csDesigning in ComponentState) then
+ begin
+ Handle := AllocateHwnd(MidiInput);
+ end;
+
+ FState := misClosed;
+
+end;
+
+{-------------------------------------------------------------------}
+{ Close the device if it's open }
+
+destructor TMidiInput.Destroy;
+begin
+ if (FMidiHandle <> 0) then
+ begin
+ Close;
+ FMidiHandle := 0;
+ end;
+
+ if (PCtlInfo <> nil) then
+ GlobalSharedLockedFree(PCtlinfo^.hMem, PCtlInfo);
+
+ DeallocateHwnd(Handle);
+ inherited Destroy;
+end;
+
+{-------------------------------------------------------------------}
+{ Convert the numeric return code from an MMSYSTEM function to a string
+ using midiInGetErrorText. TODO: These errors aren't very helpful
+ (e.g. "an invalid parameter was passed to a system function") so
+ sort out some proper error strings. }
+
+function TMidiInput.MidiInErrorString(WError: Word): string;
+var
+ errorDesc: PChar;
+begin
+ errorDesc := nil;
+ try
+ errorDesc := StrAlloc(MAXERRORLENGTH);
+ if midiInGetErrorText(WError, errorDesc, MAXERRORLENGTH) = 0 then
+ result := StrPas(errorDesc)
+ else
+ result := 'Specified error number is out of range';
+ finally
+ if errorDesc <> nil then StrDispose(errorDesc);
+ end;
+end;
+
+{-------------------------------------------------------------------}
+{ Set the sysex buffer size, fail if device is already open }
+
+procedure TMidiInput.SetSysexBufferSize(BufferSize: Word);
+begin
+ if FState = misOpen then
+ raise EMidiInputError.Create('Change to SysexBufferSize while device was open')
+ else
+ { TODO: Validate the sysex buffer size. Is this necessary for WIN32? }
+ FSysexBufferSize := BufferSize;
+end;
+
+{-------------------------------------------------------------------}
+{ Set the sysex buffer count, fail if device is already open }
+
+procedure TMidiInput.SetSysexBuffercount(Buffercount: Word);
+begin
+ if FState = misOpen then
+ raise EMidiInputError.Create('Change to SysexBuffercount while device was open')
+ else
+ { TODO: Validate the sysex buffer count }
+ FSysexBuffercount := Buffercount;
+end;
+
+{-------------------------------------------------------------------}
+{ Set the Sysex Only flag to eliminate unwanted short MIDI input messages }
+
+procedure TMidiInput.SetSysexOnly(bSysexOnly: Boolean);
+begin
+ FSysexOnly := bSysexOnly;
+ { Update the interrupt handler's copy of this property }
+ if PCtlInfo <> nil then
+ PCtlInfo^.SysexOnly := bSysexOnly;
+end;
+
+{-------------------------------------------------------------------}
+{ Set the Device ID to select a new MIDI input device
+ Note: If no MIDI devices are installed, throws an 'Invalid Device ID' exception }
+
+procedure TMidiInput.SetDeviceID(DeviceID: Word);
+var
+ MidiInCaps: TMidiInCaps;
+begin
+ if FState = misOpen then
+ raise EMidiInputError.Create('Change to DeviceID while device was open')
+ else
+ if (DeviceID >= midiInGetNumDevs) then
+ raise EMidiInputError.Create('Invalid device ID')
+ else
+ begin
+ FDeviceID := DeviceID;
+
+ { Set the name and other MIDIINCAPS properties to match the ID }
+ FError :=
+ midiInGetDevCaps(DeviceID, @MidiInCaps, sizeof(TMidiInCaps));
+ if Ferror <> MMSYSERR_NOERROR then
+ raise EMidiInputError.Create(MidiInErrorString(FError));
+
+ FProductName := StrPas(MidiInCaps.szPname);
+ FDriverVersion := MidiInCaps.vDriverVersion;
+ FMID := MidiInCaps.wMID;
+ FPID := MidiInCaps.wPID;
+
+ end;
+end;
+
+{-------------------------------------------------------------------}
+{ Set the product name and put the matching input device number in FDeviceID.
+ This is handy if you want to save a configured input/output device
+ by device name instead of device number, because device numbers may
+ change if users add or remove MIDI devices.
+ Exception if input device with matching name not found,
+ or if input device is open }
+
+procedure TMidiInput.SetProductName(NewProductName: string);
+var
+ MidiInCaps: TMidiInCaps;
+ testDeviceID: Word;
+ testProductName: string;
+begin
+ if FState = misOpen then
+ raise EMidiInputError.Create('Change to ProductName while device was open')
+ else
+ { Don't set the name if the component is reading properties because
+ the saved Productname will be from the machine the application was compiled
+ on, which may not be the same for the corresponding DeviceID on the user's
+ machine. The FProductname property will still be set by SetDeviceID }
+ if not (csLoading in ComponentState) then
+ begin
+ begin
+ for testDeviceID := 0 to (midiInGetNumDevs - 1) do
+ begin
+ FError :=
+ midiInGetDevCaps(testDeviceID, @MidiInCaps, sizeof(TMidiInCaps));
+ if Ferror <> MMSYSERR_NOERROR then
+ raise EMidiInputError.Create(MidiInErrorString(FError));
+ testProductName := StrPas(MidiInCaps.szPname);
+ if testProductName = NewProductName then
+ begin
+ FProductName := NewProductName;
+ Break;
+ end;
+ end;
+ if FProductName <> NewProductName then
+ raise EMidiInputError.Create('MIDI Input Device ' +
+ NewProductName + ' not installed ')
+ else
+ SetDeviceID(testDeviceID);
+ end;
+ end;
+end;
+
+
+{-------------------------------------------------------------------}
+{ Get the sysex buffers ready }
+
+procedure TMidiInput.PrepareHeaders;
+var
+ ctr: Word;
+ MyMidiHdr: TMyMidiHdr;
+begin
+ if (FSysexBufferCount > 0) and (FSysexBufferSize > 0)
+ and (FMidiHandle <> 0) then
+ begin
+ Midihdrs := TList.Create;
+ for ctr := 1 to FSysexBufferCount do
+ begin
+ { Initialize the header and allocate buffer memory }
+ MyMidiHdr := TMyMidiHdr.Create(FSysexBufferSize);
+
+ { Store the address of the MyMidiHdr object in the contained MIDIHDR
+ structure so we can get back to the object when a pointer to the
+ MIDIHDR is received.
+ E.g. see TMidiOutput.Output method }
+ MyMidiHdr.hdrPointer^.dwUser := DWORD(MyMidiHdr);
+
+ { Get MMSYSTEM's blessing for this header }
+ FError := midiInPrepareHeader(FMidiHandle, MyMidiHdr.hdrPointer,
+ sizeof(TMIDIHDR));
+ if Ferror <> MMSYSERR_NOERROR then
+ raise EMidiInputError.Create(MidiInErrorString(FError));
+
+ { Save it in our list }
+ MidiHdrs.Add(MyMidiHdr);
+ end;
+ end;
+
+end;
+
+{-------------------------------------------------------------------}
+{ Clean up from PrepareHeaders }
+
+procedure TMidiInput.UnprepareHeaders;
+var
+ ctr: Word;
+begin
+ if (MidiHdrs <> nil) then { will be Nil if 0 sysex buffers }
+ begin
+ for ctr := 0 to MidiHdrs.Count - 1 do
+ begin
+ FError := midiInUnprepareHeader(FMidiHandle,
+ TMyMidiHdr(MidiHdrs.Items[ctr]).hdrPointer,
+ sizeof(TMIDIHDR));
+ if Ferror <> MMSYSERR_NOERROR then
+ raise EMidiInputError.Create(MidiInErrorString(FError));
+ TMyMidiHdr(MidiHdrs.Items[ctr]).Free;
+ end;
+ MidiHdrs.Free;
+ MidiHdrs := nil;
+ end;
+end;
+
+{-------------------------------------------------------------------}
+{ Add sysex buffers, if required, to input device }
+
+procedure TMidiInput.AddBuffers;
+var
+ ctr: Word;
+begin
+ if MidiHdrs <> nil then { will be Nil if 0 sysex buffers }
+ begin
+ if MidiHdrs.Count > 0 then
+ begin
+ for ctr := 0 to MidiHdrs.Count - 1 do
+ begin
+ FError := midiInAddBuffer(FMidiHandle,
+ TMyMidiHdr(MidiHdrs.Items[ctr]).hdrPointer,
+ sizeof(TMIDIHDR));
+ if FError <> MMSYSERR_NOERROR then
+ raise EMidiInputError.Create(MidiInErrorString(FError));
+ end;
+ end;
+ end;
+end;
+
+{-------------------------------------------------------------------}
+
+procedure TMidiInput.Open;
+var
+ hMem: THandle;
+begin
+ try
+ { Create the buffer for the MIDI input messages }
+ if (PBuffer = nil) then
+ PBuffer := CircBufAlloc(FCapacity);
+
+ { Create the control info for the DLL }
+ if (PCtlInfo = nil) then
+ begin
+ PCtlInfo := GlobalSharedLockedAlloc(Sizeof(TMidiCtlInfo), hMem);
+ PctlInfo^.hMem := hMem;
+ end;
+ PctlInfo^.pBuffer := PBuffer;
+ Pctlinfo^.hWindow := Handle; { Control's window handle }
+ PCtlInfo^.SysexOnly := FSysexOnly;
+ FError := midiInOpen(@FMidiHandle, FDeviceId,
+ DWORD(@midiHandler),
+ DWORD(PCtlInfo),
+ CALLBACK_FUNCTION);
+
+ if (FError <> MMSYSERR_NOERROR) then
+ { TODO: use CreateFmtHelp to add MIDI device name/ID to message }
+ raise EMidiInputError.Create(MidiInErrorString(FError));
+
+ { Get sysex buffers ready }
+ PrepareHeaders;
+
+ { Add them to the input }
+ AddBuffers;
+
+ FState := misOpen;
+
+ except
+ if PBuffer <> nil then
+ begin
+ CircBufFree(PBuffer);
+ PBuffer := nil;
+ end;
+
+ if PCtlInfo <> nil then
+ begin
+ GlobalSharedLockedFree(PCtlInfo^.hMem, PCtlInfo);
+ PCtlInfo := nil;
+ end;
+
+ end;
+
+end;
+
+{-------------------------------------------------------------------}
+
+function TMidiInput.GetMidiEvent: TMyMidiEvent;
+var
+ thisItem: TMidiBufferItem;
+begin
+ if (FState = misOpen) and
+ CircBufReadEvent(PBuffer, @thisItem) then
+ begin
+ Result := TMyMidiEvent.Create;
+ with thisItem do
+ begin
+ Result.Time := Timestamp;
+ if (Sysex = nil) then
+ begin
+ { Short message }
+ Result.MidiMessage := LoByte(LoWord(Data));
+ Result.Data1 := HiByte(LoWord(Data));
+ Result.Data2 := LoByte(HiWord(Data));
+ Result.Sysex := nil;
+ Result.SysexLength := 0;
+ end
+ else
+ { Long Sysex message }
+ begin
+ Result.MidiMessage := MIDI_BEGINSYSEX;
+ Result.Data1 := 0;
+ Result.Data2 := 0;
+ Result.SysexLength := Sysex^.dwBytesRecorded;
+ if Sysex^.dwBytesRecorded <> 0 then
+ begin
+ { Put a copy of the sysex buffer in the object }
+ GetMem(Result.Sysex, Sysex^.dwBytesRecorded);
+ StrMove(Result.Sysex, Sysex^.lpData, Sysex^.dwBytesRecorded);
+ end;
+
+ { Put the header back on the input buffer }
+ FError := midiInPrepareHeader(FMidiHandle, Sysex,
+ sizeof(TMIDIHDR));
+ if Ferror = 0 then
+ FError := midiInAddBuffer(FMidiHandle,
+ Sysex, sizeof(TMIDIHDR));
+ if Ferror <> MMSYSERR_NOERROR then
+ raise EMidiInputError.Create(MidiInErrorString(FError));
+ end;
+ end;
+ CircbufRemoveEvent(PBuffer);
+ end
+ else
+ { Device isn't open, return a nil event }
+ Result := nil;
+end;
+
+{-------------------------------------------------------------------}
+
+function TMidiInput.GetEventCount: Word;
+begin
+ if FState = misOpen then
+ Result := PBuffer^.EventCount
+ else
+ Result := 0;
+end;
+
+{-------------------------------------------------------------------}
+
+procedure TMidiInput.Close;
+begin
+ if FState = misOpen then
+ begin
+ FState := misClosed;
+
+ { MidiInReset cancels any pending output.
+ Note that midiInReset causes an MIM_LONGDATA callback for each sysex
+ buffer on the input, so the callback function and Midi input buffer
+ should still be viable at this stage.
+ All the resulting MIM_LONGDATA callbacks will be completed by the time
+ MidiInReset returns, though. }
+ FError := MidiInReset(FMidiHandle);
+ if Ferror <> MMSYSERR_NOERROR then
+ raise EMidiInputError.Create(MidiInErrorString(FError));
+
+ { Remove sysex buffers from input device and free them }
+ UnPrepareHeaders;
+
+ { Close the device (finally!) }
+ FError := MidiInClose(FMidiHandle);
+ if Ferror <> MMSYSERR_NOERROR then
+ raise EMidiInputError.Create(MidiInErrorString(FError));
+
+ FMidiHandle := 0;
+
+ if (PBuffer <> nil) then
+ begin
+ CircBufFree(PBuffer);
+ PBuffer := nil;
+ end;
+ end;
+end;
+
+{-------------------------------------------------------------------}
+
+procedure TMidiInput.Start;
+begin
+ if FState = misOpen then
+ begin
+ FError := MidiInStart(FMidiHandle);
+ if Ferror <> MMSYSERR_NOERROR then
+ raise EMidiInputError.Create(MidiInErrorString(FError));
+ end;
+end;
+
+{-------------------------------------------------------------------}
+
+procedure TMidiInput.Stop;
+begin
+ if FState = misOpen then
+ begin
+ FError := MidiInStop(FMidiHandle);
+ if Ferror <> MMSYSERR_NOERROR then
+ raise EMidiInputError.Create(MidiInErrorString(FError));
+ end;
+end;
+
+{-------------------------------------------------------------------}
+
+procedure TMidiInput.MidiInput(var Message: TMessage);
+{ Triggered by incoming message from DLL.
+ Note DLL has already put the message in the queue }
+begin
+ case Message.Msg of
+ mim_data:
+ { Trigger the user's MIDI input event, if they've specified one and
+ we're not in the process of closing the device. The check for
+ GetEventCount > 0 prevents unnecessary event calls where the user has
+ already cleared all the events from the input buffer using a GetMidiEvent
+ loop in the OnMidiInput event handler }
+ if Assigned(FOnMIDIInput) and (FState = misOpen)
+ and (GetEventCount > 0) then
+ FOnMIDIInput(Self);
+
+ mim_Overflow: { input circular buffer overflow }
+ if Assigned(FOnOverflow) and (FState = misOpen) then
+ FOnOverflow(Self);
+ end;
+end;
+
+{-------------------------------------------------------------------}
+
+procedure Register;
+begin
+ RegisterComponents('Synth', [TMIDIInput]);
+end;
+
+end.
+
diff --git a/Game/Code/lib/midi/Midiout.pas b/Game/Code/lib/midi/Midiout.pas
new file mode 100644
index 00000000..91b75073
--- /dev/null
+++ b/Game/Code/lib/midi/Midiout.pas
@@ -0,0 +1,600 @@
+{ $Header: /MidiComp/MidiOut.pas 2 10/06/97 7:33 Davec $ }
+
+{ Written by David Churcher <dchurcher@cix.compulink.co.uk>,
+ released to the public domain. }
+
+{ Thanks very much to Fred Kohler for the Technology code. }
+
+unit MidiOut;
+
+{
+ MIDI Output component.
+
+ Properties:
+ DeviceID: Windows numeric device ID for the MIDI output device.
+ Between 0 and (midioutGetNumDevs-1), or MIDI_MAPPER (-1).
+ Special value MIDI_MAPPER specifies output to the Windows MIDI mapper
+ Read-only while device is open, exception if changed while open
+
+ MIDIHandle: The output handle to the MIDI device.
+ 0 when device is not open
+ Read-only, runtime-only
+
+ ProductName: Name of the output device product that corresponds to the
+ DeviceID property (e.g. 'MPU 401 out').
+ You can write to this while the device is closed to select a particular
+ output device by name (the DeviceID property will change to match).
+ Exception if this property is changed while the device is open.
+
+ Numdevs: Number of MIDI output devices installed on the system. This
+ is the value returned by midiOutGetNumDevs. It's included for
+ completeness.
+
+ Technology: Type of technology used by the MIDI device. You can set this
+ property to one of the values listed for OutportTech (below) and the component
+ will find an appropriate MIDI device. For example:
+ MidiOutput.Technology := opt_FMSynth;
+ will set MidiInput.DeviceID to the MIDI device ID of the FM synth, if one
+ is installed. If no such device is available an exception is raised,
+ see MidiOutput.SetTechnology.
+
+ See the MIDIOUTCAPS entry in MMSYSTEM.HLP for descriptions of the
+ following properties:
+ DriverVersion
+ Voices
+ Notes
+ ChannelMask
+ Support
+
+ Error: The error code for the last MMSYSTEM error. See the MMSYSERR_
+ entries in MMSYSTEM.INT for possible values.
+
+ Methods:
+ Open: Open MIDI device specified by DeviceID property for output
+
+ Close: Close device
+
+ PutMidiEvent(Event:TMyMidiEvent): Output a note or sysex message to the
+ device. This method takes a TMyMidiEvent object and transmits it.
+ Notes:
+ 1. If the object contains a sysex event the OnMidiOutput event will
+ be triggered when the sysex transmission is complete.
+ 2. You can queue up multiple blocks of system exclusive data for
+ transmission by chucking them at this method; they will be
+ transmitted as quickly as the device can manage.
+ 3. This method will not free the TMyMidiEvent object, the caller
+ must do that. Any sysex data in the TMyMidiEvent is copied before
+ transmission so you can free the TMyMidiEvent immediately after
+ calling PutMidiEvent, even if output has not yet finished.
+
+ PutShort(MidiMessage: Byte; Data1: Byte; Data2: Byte): Output a short
+ MIDI message. Handy when you can't be bothered to build a TMyMidiEvent.
+ If the message you're sending doesn't use Data1 or Data2, set them to 0.
+
+ PutLong(TheSysex: Pointer; msgLength: Word): Output sysex data.
+ SysexPointer: Pointer to sysex data to send
+ msgLength: Length of sysex data.
+ This is handy when you don't have a TMyMidiEvent.
+
+ SetVolume(Left: Word, Right: Word): Set the volume of the
+ left and right channels on the output device (only on internal devices?).
+ 0xFFFF is maximum volume. If the device doesn't support separate
+ left/right volume control, the value of the Left parameter will be used.
+ Check the Support property to see whether the device supports volume
+ control. See also other notes on volume control under midiOutSetVolume()
+ in MMSYSTEM.HLP.
+
+ Events:
+ OnMidiOutput: Procedure called when output of a system exclusive block
+ is completed.
+
+ Notes:
+ I haven't implemented any methods for midiOutCachePatches and
+ midiOutCacheDrumpatches, mainly 'cause I don't have any way of testing
+ them. Does anyone really use these?
+}
+
+interface
+
+uses
+ SysUtils, WinTypes, WinProcs, Messages, Classes, Controls, Forms,
+ MMSystem, Circbuf, MidiType, MidiDefs, Delphmcb;
+
+type
+ midioutputState = (mosOpen, mosClosed);
+ EmidioutputError = class(Exception);
+
+ { These are the equivalent of constants prefixed with mod_
+ as defined in MMSystem. See SetTechnology }
+ OutPortTech = (
+ opt_None, { none }
+ opt_MidiPort, { output port }
+ opt_Synth, { generic internal synth }
+ opt_SQSynth, { square wave internal synth }
+ opt_FMSynth, { FM internal synth }
+ opt_Mapper); { MIDI mapper }
+ TechNameMap = array[OutPortTech] of string[18];
+
+
+const
+ TechName: TechNameMap = (
+ 'None', 'MIDI Port', 'Generic Synth', 'Square Wave Synth',
+ 'FM Synth', 'MIDI Mapper');
+
+{-------------------------------------------------------------------}
+type
+ TMidiOutput = class(TComponent)
+ protected
+ Handle: THandle; { Window handle used for callback notification }
+ FDeviceID: Integer; { MIDI device ID }
+ FMIDIHandle: Hmidiout; { Handle to output device }
+ FState: midioutputState; { Current device state }
+ PCtlInfo: PMidiCtlInfo; { Pointer to control info for DLL }
+
+ PBuffer: PCircularBuffer; { Output queue for PutTimedEvent, set by Open }
+
+ FError: Word; { Last MMSYSTEM error }
+
+ { Stuff from midioutCAPS }
+ FDriverVersion: Version; { Driver version from midioutGetDevCaps }
+ FProductName: string; { product name }
+ FTechnology: OutPortTech; { Type of MIDI output device }
+ FVoices: Word; { Number of voices (internal synth) }
+ FNotes: Word; { Number of notes (internal synth) }
+ FChannelMask: Word; { Bit set for each MIDI channels that the
+ device responds to (internal synth) }
+ FSupport: DWORD; { Technology supported (volume control,
+ patch caching etc. }
+ FNumdevs: Word; { Number of MIDI output devices on system }
+
+
+ FOnMIDIOutput: TNotifyEvent; { Sysex output finished }
+
+ procedure MidiOutput(var Message: TMessage);
+ procedure SetDeviceID(DeviceID: Integer);
+ procedure SetProductName(NewProductName: string);
+ procedure SetTechnology(NewTechnology: OutPortTech);
+ function midioutErrorString(WError: Word): string;
+
+ public
+ { Properties }
+ property MIDIHandle: Hmidiout read FMIDIHandle;
+ property DriverVersion: Version { Driver version from midioutGetDevCaps }
+ read FDriverVersion;
+ property Technology: OutPortTech { Type of MIDI output device }
+ read FTechnology
+ write SetTechnology
+ default opt_Synth;
+ property Voices: Word { Number of voices (internal synth) }
+ read FVoices;
+ property Notes: Word { Number of notes (internal synth) }
+ read FNotes;
+ property ChannelMask: Word { Bit set for each MIDI channels that the }
+ read FChannelMask; { device responds to (internal synth) }
+ property Support: DWORD { Technology supported (volume control, }
+ read FSupport; { patch caching etc. }
+ property Error: Word read FError;
+ property Numdevs: Word read FNumdevs;
+
+ { Methods }
+ function Open: Boolean; virtual;
+ function Close: Boolean; virtual;
+ procedure PutMidiEvent(theEvent: TMyMidiEvent); virtual;
+ procedure PutShort(MidiMessage: Byte; Data1: Byte; Data2: Byte); virtual;
+ procedure PutLong(TheSysex: Pointer; msgLength: Word); virtual;
+ procedure SetVolume(Left: Word; Right: Word);
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+
+ { Some functions to decode and classify incoming messages would be nice }
+
+ published
+ { TODO: Property editor with dropdown list of product names }
+ property ProductName: string read FProductName write SetProductName;
+
+ property DeviceID: Integer read FDeviceID write SetDeviceID default 0;
+ { TODO: midiOutGetVolume? Or two properties for Left and Right volume?
+ Is it worth it??
+ midiOutMessage?? Does anyone use this? }
+
+ { Events }
+ property Onmidioutput: TNotifyEvent
+ read FOnmidioutput
+ write FOnmidioutput;
+ end;
+
+procedure Register;
+
+{-------------------------------------------------------------------}
+implementation
+
+(* Not used in Delphi 3
+
+{ This is the callback procedure in the external DLL.
+ It's used when midioutOpen is called by the Open method.
+ There are special requirements and restrictions for this callback
+ procedure (see midioutOpen in MMSYSTEM.HLP) so it's impractical to
+ make it an object method }
+{$IFDEF WIN32}
+function midiHandler(
+ hMidiIn: HMidiIn;
+ wMsg: UINT;
+ dwInstance: DWORD;
+ dwParam1: DWORD;
+ dwParam2: DWORD): Boolean; stdcall; external 'DELMID32.DLL';
+{$ELSE}
+function midiHandler(
+ hMidiIn: HMidiIn;
+ wMsg: Word;
+ dwInstance: DWORD;
+ dwParam1: DWORD;
+ dwParam2: DWORD): Boolean; far; external 'DELPHMID.DLL';
+{$ENDIF}
+*)
+
+{-------------------------------------------------------------------}
+
+constructor Tmidioutput.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FState := mosClosed;
+ FNumdevs := midiOutGetNumDevs;
+
+ { Create the window for callback notification }
+ if not (csDesigning in ComponentState) then
+ begin
+ Handle := AllocateHwnd(MidiOutput);
+ end;
+
+end;
+
+{-------------------------------------------------------------------}
+
+destructor Tmidioutput.Destroy;
+begin
+ if FState = mosOpen then
+ Close;
+ if (PCtlInfo <> nil) then
+ GlobalSharedLockedFree(PCtlinfo^.hMem, PCtlInfo);
+ DeallocateHwnd(Handle);
+ inherited Destroy;
+end;
+
+{-------------------------------------------------------------------}
+{ Convert the numeric return code from an MMSYSTEM function to a string
+ using midioutGetErrorText. TODO: These errors aren't very helpful
+ (e.g. "an invalid parameter was passed to a system function") so
+ some proper error strings would be nice. }
+
+
+function Tmidioutput.midioutErrorString(WError: Word): string;
+var
+ errorDesc: PChar;
+begin
+ errorDesc := nil;
+ try
+ errorDesc := StrAlloc(MAXERRORLENGTH);
+ if midioutGetErrorText(WError, errorDesc, MAXERRORLENGTH) = 0 then
+ result := StrPas(errorDesc)
+ else
+ result := 'Specified error number is out of range';
+ finally
+ if errorDesc <> nil then StrDispose(errorDesc);
+ end;
+end;
+
+{-------------------------------------------------------------------}
+{ Set the output device ID and change the other properties to match }
+
+procedure Tmidioutput.SetDeviceID(DeviceID: Integer);
+var
+ midioutCaps: TmidioutCaps;
+begin
+ if FState = mosOpen then
+ raise EmidioutputError.Create('Change to DeviceID while device was open')
+ else
+ if (DeviceID >= midioutGetNumDevs) and (DeviceID <> MIDI_MAPPER) then
+ raise EmidioutputError.Create('Invalid device ID')
+ else
+ begin
+ FDeviceID := DeviceID;
+
+ { Set the name and other midioutCAPS properties to match the ID }
+ FError :=
+ midioutGetDevCaps(DeviceID, @midioutCaps, sizeof(TmidioutCaps));
+ if Ferror > 0 then
+ raise EmidioutputError.Create(midioutErrorString(FError));
+
+ with midiOutCaps do
+ begin
+ FProductName := StrPas(szPname);
+ FDriverVersion := vDriverVersion;
+ FTechnology := OutPortTech(wTechnology);
+ FVoices := wVoices;
+ FNotes := wNotes;
+ FChannelMask := wChannelMask;
+ FSupport := dwSupport;
+ end;
+
+ end;
+end;
+
+{-------------------------------------------------------------------}
+{ Set the product name property and put the matching output device number
+ in FDeviceID.
+ This is handy if you want to save a configured output/output device
+ by device name instead of device number, because device numbers may
+ change if users install or remove MIDI devices.
+ Exception if output device with matching name not found,
+ or if output device is open }
+
+procedure Tmidioutput.SetProductName(NewProductName: string);
+var
+ midioutCaps: TmidioutCaps;
+ testDeviceID: Integer;
+ testProductName: string;
+begin
+ if FState = mosOpen then
+ raise EmidioutputError.Create('Change to ProductName while device was open')
+ else
+ { Don't set the name if the component is reading properties because
+ the saved Productname will be from the machine the application was compiled
+ on, which may not be the same for the corresponding DeviceID on the user's
+ machine. The FProductname property will still be set by SetDeviceID }
+ if not (csLoading in ComponentState) then
+ begin
+ { Loop uses -1 to test for MIDI_MAPPER as well }
+ for testDeviceID := -1 to (midioutGetNumDevs - 1) do
+ begin
+ FError :=
+ midioutGetDevCaps(testDeviceID, @midioutCaps, sizeof(TmidioutCaps));
+ if Ferror > 0 then
+ raise EmidioutputError.Create(midioutErrorString(FError));
+ testProductName := StrPas(midioutCaps.szPname);
+ if testProductName = NewProductName then
+ begin
+ FProductName := NewProductName;
+ Break;
+ end;
+ end;
+ if FProductName <> NewProductName then
+ raise EmidioutputError.Create('MIDI output Device ' +
+ NewProductName + ' not installed')
+ else
+ SetDeviceID(testDeviceID);
+ end;
+end;
+
+{-------------------------------------------------------------------}
+{ Set the output technology property and put the matching output device
+ number in FDeviceID.
+ This is handy, for example, if you want to be able to switch between a
+ sound card and a MIDI port }
+
+procedure TMidiOutput.SetTechnology(NewTechnology: OutPortTech);
+var
+ midiOutCaps: TMidiOutCaps;
+ testDeviceID: Integer;
+ testTechnology: OutPortTech;
+begin
+ if FState = mosOpen then
+ raise EMidiOutputError.Create(
+ 'Change to Product Technology while device was open')
+ else
+ begin
+ { Loop uses -1 to test for MIDI_MAPPER as well }
+ for testDeviceID := -1 to (midiOutGetNumDevs - 1) do
+ begin
+ FError :=
+ midiOutGetDevCaps(testDeviceID,
+ @midiOutCaps, sizeof(TMidiOutCaps));
+ if Ferror > 0 then
+ raise EMidiOutputError.Create(MidiOutErrorString(FError));
+ testTechnology := OutPortTech(midiOutCaps.wTechnology);
+ if testTechnology = NewTechnology then
+ begin
+ FTechnology := NewTechnology;
+ Break;
+ end;
+ end;
+ if FTechnology <> NewTechnology then
+ raise EMidiOutputError.Create('MIDI output technology ' +
+ TechName[NewTechnology] + ' not installed')
+ else
+ SetDeviceID(testDeviceID);
+ end;
+end;
+
+{-------------------------------------------------------------------}
+
+function Tmidioutput.Open: Boolean;
+var
+ hMem: THandle;
+begin
+ Result := False;
+ try
+ { Create the control info for the DLL }
+ if (PCtlInfo = nil) then
+ begin
+ PCtlInfo := GlobalSharedLockedAlloc(Sizeof(TMidiCtlInfo), hMem);
+ PctlInfo^.hMem := hMem;
+ end;
+
+ Pctlinfo^.hWindow := Handle; { Control's window handle }
+
+ FError := midioutOpen(@FMidiHandle, FDeviceId,
+ DWORD(@midiHandler),
+ DWORD(PCtlInfo),
+ CALLBACK_FUNCTION);
+{ FError := midioutOpen(@FMidiHandle, FDeviceId,
+ Handle,
+ DWORD(PCtlInfo),
+ CALLBACK_WINDOW); }
+ if (FError <> 0) then
+ { TODO: use CreateFmtHelp to add MIDI device name/ID to message }
+ raise EmidioutputError.Create(midioutErrorString(FError))
+ else
+ begin
+ Result := True;
+ FState := mosOpen;
+ end;
+
+ except
+ if PCtlInfo <> nil then
+ begin
+ GlobalSharedLockedFree(PCtlInfo^.hMem, PCtlInfo);
+ PCtlInfo := nil;
+ end;
+ end;
+
+end;
+
+{-------------------------------------------------------------------}
+
+procedure TMidiOutput.PutShort(MidiMessage: Byte; Data1: Byte; Data2: Byte);
+var
+ thisMsg: DWORD;
+begin
+ thisMsg := DWORD(MidiMessage) or
+ (DWORD(Data1) shl 8) or
+ (DWORD(Data2) shl 16);
+
+ FError := midiOutShortMsg(FMidiHandle, thisMsg);
+ if Ferror > 0 then
+ raise EmidioutputError.Create(midioutErrorString(FError));
+end;
+
+{-------------------------------------------------------------------}
+
+procedure TMidiOutput.PutLong(TheSysex: Pointer; msgLength: Word);
+{ Notes: This works asynchronously; you send your sysex output by
+calling this function, which returns immediately. When the MIDI device
+driver has finished sending the data the MidiOutPut function in this
+component is called, which will in turn call the OnMidiOutput method
+if the component user has defined one. }
+{ TODO: Combine common functions with PutTimedLong into subroutine }
+
+var
+ MyMidiHdr: TMyMidiHdr;
+begin
+ { Initialize the header and allocate buffer memory }
+ MyMidiHdr := TMyMidiHdr.Create(msgLength);
+
+ { Copy the data over to the MidiHdr buffer
+ We can't just use the caller's PChar because the buffer memory
+ has to be global, shareable, and locked. }
+ StrMove(MyMidiHdr.SysexPointer, TheSysex, msgLength);
+
+ { Store the MyMidiHdr address in the header so we can find it again quickly
+ (see the MidiOutput proc) }
+ MyMidiHdr.hdrPointer^.dwUser := DWORD(MyMidiHdr);
+
+ { Get MMSYSTEM's blessing for this header }
+ FError := midiOutPrepareHeader(FMidiHandle, MyMidiHdr.hdrPointer,
+ sizeof(TMIDIHDR));
+ if Ferror > 0 then
+ raise EMidiOutputError.Create(MidiOutErrorString(FError));
+
+ { Send it }
+ FError := midiOutLongMsg(FMidiHandle, MyMidiHdr.hdrPointer,
+ sizeof(TMIDIHDR));
+ if Ferror > 0 then
+ raise EMidiOutputError.Create(MidiOutErrorString(FError));
+
+end;
+
+{-------------------------------------------------------------------}
+
+procedure Tmidioutput.PutMidiEvent(theEvent: TMyMidiEvent);
+begin
+ if FState <> mosOpen then
+ raise EMidiOutputError.Create('MIDI Output device not open');
+
+ with theEvent do
+ begin
+ if Sysex = nil then
+ begin
+ PutShort(MidiMessage, Data1, Data2)
+ end
+ else
+ PutLong(Sysex, SysexLength);
+ end;
+end;
+
+{-------------------------------------------------------------------}
+
+function Tmidioutput.Close: Boolean;
+begin
+ Result := False;
+ if FState = mosOpen then
+ begin
+
+ { Note this sends a lot of fast control change messages which some synths can't handle.
+ TODO: Make this optional. }
+{ FError := midioutReset(FMidiHandle);
+ if Ferror <> 0 then
+ raise EMidiOutputError.Create(MidiOutErrorString(FError)); }
+
+ FError := midioutClose(FMidiHandle);
+ if Ferror <> 0 then
+ raise EMidiOutputError.Create(MidiOutErrorString(FError))
+ else
+ Result := True;
+ end;
+
+ FMidiHandle := 0;
+ FState := mosClosed;
+
+end;
+
+{-------------------------------------------------------------------}
+
+procedure TMidiOutput.SetVolume(Left: Word; Right: Word);
+var
+ dwVolume: DWORD;
+begin
+ dwVolume := (DWORD(Left) shl 16) or Right;
+ FError := midiOutSetVolume(DeviceID, dwVolume);
+ if Ferror <> 0 then
+ raise EMidiOutputError.Create(MidiOutErrorString(FError));
+end;
+
+{-------------------------------------------------------------------}
+
+procedure Tmidioutput.midioutput(var Message: TMessage);
+{ Triggered when sysex output from PutLong is complete }
+var
+ MyMidiHdr: TMyMidiHdr;
+ thisHdr: PMidiHdr;
+begin
+ if Message.Msg = Mom_Done then
+ begin
+ { Find the MIDIHDR we used for the output. Message.lParam is its address }
+ thisHdr := PMidiHdr(Message.lParam);
+
+ { Remove it from the output device }
+ midiOutUnprepareHeader(FMidiHandle, thisHdr, sizeof(TMIDIHDR));
+
+ { Get the address of the MyMidiHdr object containing this MIDIHDR structure.
+ We stored this address in the PutLong procedure }
+ MyMidiHdr := TMyMidiHdr(thisHdr^.dwUser);
+
+ { Header and copy of sysex data no longer required since output is complete }
+ MyMidiHdr.Free;
+
+ { Call the user's event handler if any }
+ if Assigned(FOnmidioutput) then
+ FOnmidioutput(Self);
+ end;
+ { TODO: Case for MOM_PLAYBACK_DONE }
+end;
+
+{-------------------------------------------------------------------}
+
+procedure Register;
+begin
+ RegisterComponents('Synth', [Tmidioutput]);
+end;
+
+end.
+
diff --git a/Game/Code/lib/midi/midiComp.cfg b/Game/Code/lib/midi/midiComp.cfg
new file mode 100644
index 00000000..2ee4ea3a
--- /dev/null
+++ b/Game/Code/lib/midi/midiComp.cfg
@@ -0,0 +1,35 @@
+-$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-
+-$Z1
+-cg
+-AWinTypes=Windows;WinProcs=Windows;DbiTypes=BDE;DbiProcs=BDE;DbiErrs=BDE;
+-H+
+-W+
+-M
+-$M16384,1048576
+-K$00400000
+-LE"d:\program files\borland\delphi5\Projects\Bpl"
+-LN"d:\program files\borland\delphi5\Projects\Bpl"
diff --git a/Game/Code/lib/midi/midiComp.dpk b/Game/Code/lib/midi/midiComp.dpk
new file mode 100644
index 00000000..7c403eae
--- /dev/null
+++ b/Game/Code/lib/midi/midiComp.dpk
@@ -0,0 +1,45 @@
+package midiComp;
+
+{$R *.RES}
+{$R 'MidiFile.dcr'}
+{$R 'Midiin.dcr'}
+{$R 'Midiout.dcr'}
+{$R 'MidiScope.dcr'}
+{$ALIGN ON}
+{$ASSERTIONS ON}
+{$BOOLEVAL OFF}
+{$DEBUGINFO ON}
+{$EXTENDEDSYNTAX ON}
+{$IMPORTEDDATA ON}
+{$IOCHECKS ON}
+{$LOCALSYMBOLS ON}
+{$LONGSTRINGS ON}
+{$OPENSTRINGS ON}
+{$OPTIMIZATION ON}
+{$OVERFLOWCHECKS OFF}
+{$RANGECHECKS OFF}
+{$REFERENCEINFO OFF}
+{$SAFEDIVIDE OFF}
+{$STACKFRAMES OFF}
+{$TYPEDADDRESS OFF}
+{$VARSTRINGCHECKS ON}
+{$WRITEABLECONST ON}
+{$MINENUMSIZE 1}
+{$IMAGEBASE $400000}
+{$DESCRIPTION 'Midi related components'}
+{$DESIGNONLY}
+{$IMPLICITBUILD ON}
+
+requires
+ vcl50;
+
+contains
+ Miditype in 'Miditype.pas',
+ Mididefs in 'Mididefs.pas',
+ MidiFile in 'MidiFile.pas',
+ Midiin in 'Midiin.pas',
+ Midiout in 'Midiout.pas',
+ MidiScope in 'MidiScope.pas',
+ Midicons in 'Midicons.pas';
+
+end.
diff --git a/Game/Code/lib/midi/midiComp.res b/Game/Code/lib/midi/midiComp.res
new file mode 100644
index 00000000..91fb756e
--- /dev/null
+++ b/Game/Code/lib/midi/midiComp.res
Binary files differ
diff --git a/Game/Code/lib/midi/readme.txt b/Game/Code/lib/midi/readme.txt
new file mode 100644
index 00000000..5e4207f6
--- /dev/null
+++ b/Game/Code/lib/midi/readme.txt
@@ -0,0 +1,60 @@
+
+Midi components
+ TMidiFile, TMidiScope
+ TMidiIn and TMidiOut of david Churcher are included because they are used in
+ the demo application
+
+Freeware.
+
+100% source code, demo application.
+
+Included Components/Classes
+
+TMidiFile, read a midifile and have the contents available in memory
+ list of Tracks, track is list of events
+
+
+TMidiScope, show all activity on a midi device
+
+TMidiIn and TMidiOut of David Churcher are included because they are used
+in the demo application
+
+Midiplayer is a demo application which plays a midifile on a midi output
+ it is build fairly simple with the included components. The timer is used
+ to time the midievents. The timing is therefor as good as the windows timer.
+
+
+ The header of midifile,midiscope contains help information on the properties/functions
+ The example Midiplayer gives a good idea how to use the components
+
+Installation
+ open midiComp.dpk with file/open
+ compile and install the package
+ make sure that the directory where the files are located is in the library path
+ (tools/environment options/library)
+
+to run the demo
+ open project1.dpr in the demo directory and press run.
+
+
+
+history
+1.0 18-1-1999 first release
+
+1.1 5-3-1999 update
+ added some functions for display purposes
+ improved demo to include event viewer
+ bpm can be changed
+
+1.2 24-2-2000 update
+ added some functions to see the length of a song and ready function to know when playback is ready
+
+for comments/bugs in these components:
+
+Frans Bouwmans
+fbouwmans@spiditel.nl
+
+I'm busy building a software music synthesizer, which will be available in source
+to the public. If you are interrested in helping me with certain soundmodules
+(effects, filters, sound generators) just sent me an email.
+
diff --git a/Game/Code/lib/requirements.txt b/Game/Code/lib/requirements.txt
new file mode 100644
index 00000000..ebaffea7
--- /dev/null
+++ b/Game/Code/lib/requirements.txt
@@ -0,0 +1,48 @@
+Not Included in SVN ( to many potential updates )
+---------------------------------------------------------------------------
+
+Jedi-sdl
+ http://sourceforge.net/projects/jedi-sdl
+ Make sure to download VERSION 1, beta...
+ not version 0.5
+
+
+Included in SVN ..
+---------------------------------------------------------------------------
+
+pngImage
+ http://pngdelphi.sourceforge.net/
+
+BASS.pas
+ http://www.un4seen.com/download.php?bass23
+
+zlportio
+ http://www.specosoft.com/en/download.html
+
+ffmpeg
+ http://www.iversenit.dk/dev/ffmpeg-headers/
+
+SQLLite Wrapper
+ http://www.itwriting.com/sqlitesimple.php
+
+======================================
+For LINUX build
+======================================
+On top of the above pas files, you will need development libraries for them.
+
+here are the instructions needed to compile on ubunty ( 7.04 )
+
+ffmpeg :
+ sudo apt-get install libavcodec-dev libavformat-dev
+
+sqlite :
+ sudo apt-get install libsqlite3-dev
+
+sdl development libraries :
+ sudo apt-get install libsdl-ttf2.0-dev libsdl-image1.2-dev
+ THERE WILL be more of them... oops I forgot to list them :P
+
+For the Lazy... who use Debian or Ubuntu.... here is a single line
+ sudo apt-get install libavcodec-dev libavformat-dev libsqlite3-dev libsdl-ttf2.0-dev libsdl-image1.2-dev
+
+ \ No newline at end of file
diff --git a/Game/Code/lib/zlportio/README.TXT b/Game/Code/lib/zlportio/README.TXT
new file mode 100644
index 00000000..137f5c07
--- /dev/null
+++ b/Game/Code/lib/zlportio/README.TXT
@@ -0,0 +1,27 @@
+
+ZLPortIO
+Copyright (C) 2001 Zloba Alexander
+http://www.specosoft.com
+Description
+-----------
+ This unit allow your application direct access port input and output under
+ all versions of Microsoft Windows,
+
+Terms of Use
+------------
+
+This software is provided "as is", without any guarantee made
+as to its suitability or fitness for any particular use. It may
+contain bugs, so use of this tool is at your own risk. We take
+no responsilbity for any damage that may unintentionally be caused
+through its use.
+
+Reporting Problems
+------------------
+
+If you encounter problems, please visit http://www.specosoft.com
+and download the latest version to see if the issue has been resolved.
+If not, please send a bug report to:
+
+ zal@specosoft.com
+
diff --git a/Game/Code/lib/zlportio/Sys/zlportio.sys b/Game/Code/lib/zlportio/Sys/zlportio.sys
new file mode 100644
index 00000000..a897a020
--- /dev/null
+++ b/Game/Code/lib/zlportio/Sys/zlportio.sys
Binary files differ
diff --git a/Game/Code/lib/zlportio/ddkint.pas b/Game/Code/lib/zlportio/ddkint.pas
new file mode 100644
index 00000000..2b70ee54
--- /dev/null
+++ b/Game/Code/lib/zlportio/ddkint.pas
@@ -0,0 +1,253 @@
+{ -----------------------------------------------------------------------------}
+{ Copyright 2000-2001, Zloba Alexander. All Rights Reserved. }
+{ This unit can be freely used and distributed in commercial and private }
+{ environments, provided this notice is not modified in any way. }
+{ -----------------------------------------------------------------------------}
+{ Feel free to contact me if you have any questions, comments or suggestions at}
+{ zal@specosoft.com (Zloba Alexander) }
+{ You can always find the latest version of this unit at: }
+{ http://www.specosoft.com }
+
+{ -----------------------------------------------------------------------------}
+{ Date last modified: 08/10/2001 }
+{ -----------------------------------------------------------------------------}
+{ Description: }
+{ This unit include service function to work with NT drivers and some }
+{ constant from ntddk.h }
+{------------------------------------------------------------------------------}
+{ Revision History: }
+{ 1.00: + First public release }
+{ 1.10: + added compiler directives for correct compilation }
+{ 1.20: + optimized code }
+{ 1.30: + added constant for compatibility with delphi 3.0 }
+{------------------------------------------------------------------------------}
+
+{$A-,H-}
+unit ddkint;
+
+interface
+uses
+ windows,
+ winsvc;
+
+function CTL_CODE(const DeviceType,Func,Method,Access:Cardinal):cardinal;
+
+const
+ FILE_DEVICE_BEEP = $00000001;
+ FILE_DEVICE_CD_ROM = $00000002;
+ FILE_DEVICE_CD_ROM_FILE_SYSTEM = $00000003;
+ FILE_DEVICE_CONTROLLER = $00000004;
+ FILE_DEVICE_DATALINK = $00000005;
+ FILE_DEVICE_DFS = $00000006;
+ FILE_DEVICE_DISK = $00000007;
+ FILE_DEVICE_DISK_FILE_SYSTEM = $00000008;
+ FILE_DEVICE_FILE_SYSTEM = $00000009;
+ FILE_DEVICE_INPORT_PORT = $0000000a;
+ FILE_DEVICE_KEYBOARD = $0000000b;
+ FILE_DEVICE_MAILSLOT = $0000000c;
+ FILE_DEVICE_MIDI_IN = $0000000d;
+ FILE_DEVICE_MIDI_OUT = $0000000e;
+ FILE_DEVICE_MOUSE = $0000000f;
+ FILE_DEVICE_MULTI_UNC_PROVIDER = $00000010;
+ FILE_DEVICE_NAMED_PIPE = $00000011;
+ FILE_DEVICE_NETWORK = $00000012;
+ FILE_DEVICE_NETWORK_BROWSER = $00000013;
+ FILE_DEVICE_NETWORK_FILE_SYSTEM= $00000014;
+ FILE_DEVICE_NULL = $00000015;
+ FILE_DEVICE_PARALLEL_PORT = $00000016;
+ FILE_DEVICE_PHYSICAL_NETCARD = $00000017;
+ FILE_DEVICE_PRINTER = $00000018;
+ FILE_DEVICE_SCANNER = $00000019;
+ FILE_DEVICE_SERIAL_MOUSE_PORT = $0000001a;
+ FILE_DEVICE_SERIAL_PORT = $0000001b;
+ FILE_DEVICE_SCREEN = $0000001c;
+ FILE_DEVICE_SOUND = $0000001d;
+ FILE_DEVICE_STREAMS = $0000001e;
+ FILE_DEVICE_TAPE = $0000001f;
+ FILE_DEVICE_TAPE_FILE_SYSTEM = $00000020;
+ FILE_DEVICE_TRANSPORT = $00000021;
+ FILE_DEVICE_UNKNOWN = $00000022;
+ FILE_DEVICE_VIDEO = $00000023;
+ FILE_DEVICE_VIRTUAL_DISK = $00000024;
+ FILE_DEVICE_WAVE_IN = $00000025;
+ FILE_DEVICE_WAVE_OUT = $00000026;
+ FILE_DEVICE_8042_PORT = $00000027;
+ FILE_DEVICE_NETWORK_REDIRECTOR = $00000028;
+ FILE_DEVICE_BATTERY = $00000029;
+ FILE_DEVICE_BUS_EXTENDER = $0000002a;
+ FILE_DEVICE_MODEM = $0000002b;
+ FILE_DEVICE_VDM = $0000002c;
+ FILE_DEVICE_MASS_STORAGE = $0000002d;
+ FILE_DEVICE_SMB = $0000002e;
+ FILE_DEVICE_KS = $0000002f;
+ FILE_DEVICE_CHANGER = $00000030;
+ FILE_DEVICE_SMARTCARD = $00000031;
+ FILE_DEVICE_ACPI = $00000032;
+ FILE_DEVICE_DVD = $00000033;
+ FILE_DEVICE_FULLSCREEN_VIDEO = $00000034;
+ FILE_DEVICE_DFS_FILE_SYSTEM = $00000035;
+ FILE_DEVICE_DFS_VOLUME = $00000036;
+ FILE_DEVICE_SERENUM = $00000037;
+ FILE_DEVICE_TERMSRV = $00000038;
+ FILE_DEVICE_KSEC = $00000039;
+
+ FILE_DEVICE_KRNLDRVR = $80ff;
+
+ METHOD_BUFFERED = 0;
+ METHOD_IN_DIRECT = 1;
+ METHOD_OUT_DIRECT = 2;
+ METHOD_NEITHER = 3;
+
+ FILE_ANY_ACCESS = 0;
+ FILE_SPECIAL_ACCESS = (FILE_ANY_ACCESS);
+ FILE_READ_ACCESS = ( $0001 ); // file & pipe
+ FILE_WRITE_ACCESS = ( $0002 ); // file & pipe
+
+ {$IFDEF VER100 or VER110}
+ // for compatibilty with delphi 3.0
+const
+ SERVICE_KERNEL_DRIVER = $00000001;
+ SERVICE_DEMAND_START = $00000003;
+ SERVICE_ERROR_NORMAL = $00000001;
+
+{$ENDIF}
+
+function driverstart(const name:pchar):integer;
+function driverstop(const name:pchar):integer;
+
+// for this function must have Administrators or Power users rigths
+function driverinstall(const path,name:pchar):integer;
+function driverremove(const name:pchar):integer;
+
+
+// exlpanation function
+function messagestring(const error:integer):string;
+
+implementation
+
+function CTL_CODE(const DeviceType,Func,Method,Access:Cardinal):cardinal;
+begin
+ Result := DeviceType shl 16 or Access shl 14 or Func shl 2 or Method;
+end;
+
+
+function driverinstall(const path,name:pchar):integer;
+var hService: SC_HANDLE;
+ hSCMan : SC_HANDLE;
+begin
+
+ Result := 0;
+
+ hSCMan := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
+ if hSCMan = 0 then begin
+ result := getlasterror;
+ exit;
+ end;
+
+ hService := CreateService(hSCMan, name,name,
+ SERVICE_ALL_ACCESS, SERVICE_KERNEL_DRIVER, SERVICE_DEMAND_START,
+ SERVICE_ERROR_NORMAL, path,
+ nil, nil, nil, nil, nil);
+
+ if (hService = 0) then begin
+ result := getlasterror;
+ CloseServiceHandle(hSCMan);
+ exit;
+ end
+ else
+ CloseServiceHandle(hService);
+ CloseServiceHandle(hSCMan);
+end;
+
+function driverstart(const name:pchar):integer;
+var
+ hService: SC_HANDLE;
+ hSCMan : SC_HANDLE;
+ args:pchar;
+begin
+
+ hSCMan := OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
+ if hSCMan = 0 then begin
+ result := getlasterror;
+ exit;
+ end;
+
+ // get a handle to the service
+ hService := OpenService(hSCMan, name, SERVICE_START);
+ if hService <> 0 then Begin
+ // start the driver
+ args := nil;
+ Result := 0;
+ if integer(StartService(hService, 0, args ))=0 then
+ result := getlasterror;
+ CloseServiceHandle(hService);
+ end
+ else
+ result := getlasterror;
+ CloseServiceHandle(hSCMan);
+end;
+
+function driverstop(const name:pchar):integer;
+Var
+ serviceStatus: TServiceStatus;
+ hService: SC_HANDLE;
+ hSCMan : SC_HANDLE;
+begin
+
+ hSCMan := OpenSCManager(nil, nil, SC_MANAGER_CONNECT);
+ if hSCMan = 0 then begin
+ result := getlasterror;
+ exit;
+ end;
+
+ // get a handle to the service
+ hService := OpenService(hSCMan, Name, SERVICE_STOP);
+ if hService <> 0 then Begin
+ // start the driver
+ Result := 0;
+ if integer(ControlService(hService, SERVICE_CONTROL_STOP, serviceStatus))=0 then
+ result := getlasterror;
+ CloseServiceHandle(hService);
+ end
+ else
+ result := getlasterror;
+ CloseServiceHandle(hSCMan);
+end;
+
+function driverremove(const name:pchar):integer;
+Var
+ hService: SC_HANDLE;
+ hSCMan : SC_HANDLE;
+begin
+
+ hSCMan := OpenSCManager(nil, nil, SC_MANAGER_ALL_ACCESS);
+ if hSCMan = 0 then begin
+ result := getlasterror;
+ exit;
+ end;
+
+ // get a handle to the service
+ hService := OpenService(hSCMan, Name, SERVICE_ALL_ACCESS);
+ if hService <> 0 then Begin
+ // remove driver description from the registry
+ Result := 0;
+ if integer(DeleteService(hService)) = 0 then
+ result := getlasterror;
+ CloseServiceHandle(hService);
+ end
+ else
+ result := getlasterror;
+ CloseServiceHandle(hSCMan);
+end;
+
+function messagestring(const error:integer):string;
+var p:pchar;
+begin
+ GetMem(p, 200);
+ FillChar(p^, 200, 0);
+ formatmessage(FORMAT_MESSAGE_FROM_SYSTEM,nil,error,0,p,199,nil);
+ Result := p;
+ freemem(p,200);
+end;
+
+end.
diff --git a/Game/Code/lib/zlportio/zlportio.pas b/Game/Code/lib/zlportio/zlportio.pas
new file mode 100644
index 00000000..2cf57334
--- /dev/null
+++ b/Game/Code/lib/zlportio/zlportio.pas
@@ -0,0 +1,285 @@
+{ -----------------------------------------------------------------------------}
+{ Copyright 2000-2001, Zloba Alexander. All Rights Reserved. }
+{ This unit can be freely used and distributed in commercial and private }
+{ environments, provided this notice is not modified in any way. }
+{ -----------------------------------------------------------------------------}
+{ Feel free to contact me if you have any questions, comments or suggestions at}
+{ zal@specosoft.com (Zloba Alexander) }
+{ You can always find the latest version of this unit at: }
+{ http://www.specosoft.com }
+
+{ -----------------------------------------------------------------------------}
+{ Date last modified: 08/10/2001 }
+{ -----------------------------------------------------------------------------}
+{ ZLPortIO driver interface unit v1.20 }
+{ -----------------------------------------------------------------------------}
+{ Description: }
+{ This unit allow your application direct access port input and output under }
+{ all versions of Microsoft Windows® }
+{ Depends: }
+{ zlportio.sys ddkint.pas }
+{ You must distribute zlportio.sys with your application }
+{ Procedures and functions: }
+{ procedure zlioportread( const Port,DataType:dword ):dword; }
+{ procedure zlioportwrite( const Port,DataType,Data:dword ); }
+{ }
+{ function portreadb( const Port:dword ):byte; }
+{ function portreadw( const Port:dword ):word; }
+{ function portreadl( const Port:dword ):dword; }
+{ }
+{ procedure portwriteb( const Port:Dword;const Data:byte ); }
+{ procedure portwritew( const Port:dword;const Data:word ); }
+{ procedure portwritel( const Port,Data:dword ); }
+{ }
+{ Examples: }
+{ // get data bits from LPT port }
+{ databits := portreadb( $378 ) }
+{ // set data bits from LPT port }
+{ portwriteb( $378, databits ) }
+{ // The second parameter determine the databus length for operation }
+{ -----------------------------------------------------------------------------}
+{ Revision History: }
+{ 1.00: + First public release }
+{ 1.10: + Added new functions (portreadX,portwriteX) for convenience of usage }
+{ 1.20: + Added new function (zliosetiopm) for enabling direct access to ports}
+{ 1.30: + added compiler directives for correct compilation }
+{ 1.40: + added opportunity to run multiply instances client to driver }
+{ 1.50: - fixed bug with work under win98 }
+{------------------------------------------------------------------------------}
+
+{$A-,H-}
+unit zlportio;
+
+interface
+
+uses windows,
+ sysutils,
+ ddkint;
+
+Const
+ ZLIO_BYTE = 0;
+ ZLIO_WORD = 1;
+ ZLIO_DWORD = 2;
+
+var
+
+// if TRUE then driver was started
+// in other case something wrong
+// We start driver in initialization section of unit.
+
+ ZlIOStarted:boolean = false;
+
+// if TRUE then we can use asm IN,OUT under NT/2000
+// see zliosetiopm for more details
+ ZlIODirect:boolean = false;
+
+// handle to opened driver
+
+ HZLIO:THandle;
+
+
+function portreadb( const Port:dword ):byte;
+function portreadw( const Port:dword ):word;
+function portreadl( const Port:dword ):dword;
+
+procedure portwriteb( const Port:Dword;const Data:byte );
+procedure portwritew( const Port:dword;const Data:word );
+procedure portwritel( const Port,Data:dword );
+
+
+procedure zlioportwrite( const Port,DataType,Data:dword );
+function zlioportread( const Port,DataType:dword ):dword;
+
+// if you need the best perfomance for your IO operations
+// call zliosetiopm(TRUE). This allow your application
+// to use asm command IN,OUT directly in your code.
+
+procedure zliosetiopm( const Direct:boolean );
+
+// internal
+
+function zliostart:boolean;
+procedure zliostop;
+
+
+implementation
+
+const
+ ZLIODriverName='zlportio';
+
+var
+ IOCTL_ZLUNI_PORT_READ:cardinal;
+ IOCTL_ZLUNI_PORT_WRITE:cardinal;
+ IOCTL_ZLUNI_IOPM_ON:cardinal;
+ IOCTL_ZLUNI_IOPM_OFF:cardinal;
+
+type
+TzlIOData = record
+ Port,DataType,Data:dword;
+end;
+
+
+procedure zlioportwrite( const Port,DataType,Data:dword );
+var resdata:TZLIOData;
+ cBR:cardinal;
+begin
+ if (not ZLIODirect) then begin
+ resdata.Port := Port;
+ resdata.Data := Data;
+ resdata.DataType := DataType;
+ if ZLIOStarted then
+ DeviceIoControl(HZLIO,IOCTL_ZLUNI_PORT_WRITE,@resdata,sizeof(resdata),nil,0,cBR,nil );
+ end
+ else begin
+ Case DataType of
+ ZLIO_BYTE : asm mov edx,Port;mov eax,data;out dx,al; end;
+ ZLIO_WORD : asm mov edx,Port;mov eax,data;out dx,ax; end;
+ ZLIO_DWORD: asm mov edx,Port;mov eax,data;out dx,eax; end;
+ end;
+ end;
+end;
+
+function zlioportread(const Port,DataType:dword):dword;
+var resdata:TZLIOData;
+ cBR:cardinal;i:dword;
+begin
+ if (not ZLIODirect) then begin
+ resdata.Port := Port;
+ resdata.DataType := DataType;
+ if ZLIOStarted then
+ DeviceIoControl(HZLIO,IOCTL_ZLUNI_PORT_READ,@resdata,sizeof(resdata),@i,sizeof(dword),cBR,nil );
+ end
+ else begin
+ Case DataType of
+ ZLIO_BYTE : asm mov edx,Port;xor eax,eax;in al,dx;mov i,eax; end;
+ ZLIO_WORD : asm mov edx,Port;xor eax,eax;in ax,dx;mov i,eax; end;
+ ZLIO_DWORD: asm mov edx,Port;xor eax,eax;in eax,dx;mov i,eax end;
+ end;
+ end;
+ result := i;
+end;
+
+function portreadb( const Port:dword ):byte;
+begin
+ Result := zlioportread(Port,ZLIO_BYTE);
+end;
+
+function portreadw( const Port:dword ):word;
+begin
+ Result := zlioportread(Port,ZLIO_WORD);
+end;
+
+function portreadl( const Port:dword ):dword;
+begin
+ Result := zlioportread(Port,ZLIO_DWORD);
+end;
+
+procedure portwriteb( const Port:Dword;const Data:byte );
+begin
+ zlioportwrite(Port,ZLIO_BYTE,Data);
+end;
+
+procedure portwritew( const Port:dword;const Data:word );
+begin
+ zlioportwrite(Port,ZLIO_WORD,Data);
+end;
+
+procedure portwritel( const Port,Data:dword );
+begin
+ zlioportwrite(Port,ZLIO_DWORD,Data);
+end;
+
+procedure zliosetiopm( const Direct:boolean );
+var cBR:cardinal;
+begin
+ if Win32Platform=VER_PLATFORM_WIN32_NT then
+ if ZLIOStarted then begin
+ if Direct then
+ DeviceIoControl(HZLIO,IOCTL_ZLUNI_IOPM_ON,nil,0,nil,0,cBR,nil )
+ else
+ DeviceIoControl(HZLIO,IOCTL_ZLUNI_IOPM_OFF,nil,0,nil,0,cBR,nil );
+ ZLIODirect := Direct;
+ end
+end;
+
+
+
+
+function zliostart;
+var dir:shortstring;
+begin
+ if Win32Platform<>VER_PLATFORM_WIN32_NT then begin
+ result := true;
+ exit;
+ end;
+// Result := false;
+ zliostop;
+ dir := ExtractFileDir(ParamStr(0))+'\'+ZLIODriverName+'.sys'#0;
+ driverinstall(pchar(@dir[1]),ZLIODriverName+#0);
+ Result := driverstart(ZLIODriverName) = 0;
+end;
+
+procedure zliostop;
+begin
+ if Win32Platform<>VER_PLATFORM_WIN32_NT then
+ exit;
+ driverstop(ZLIODriverName);
+ driverremove(ZLIODriverName);
+end;
+
+function zlioopen( var Handle:thandle):boolean;
+var cERR:integer;
+ s:string;
+begin
+ if Win32Platform<>VER_PLATFORM_WIN32_NT then begin
+ result := true;
+ exit;
+ end;
+ Result := false;
+ Handle := THandle(-1);
+ Handle := createFile('\\.\ZLPORTIO',
+ GENERIC_READ or GENERIC_WRITE,
+ 0,
+ nil,
+ OPEN_EXISTING,
+ FILE_ATTRIBUTE_NORMAL,
+ 0 );
+ cERR := getlasterror;
+ s := messagestring( cerr);
+ if (cERR = ERROR_ALREADY_EXISTS)or(cERR = ERROR_SUCCESS) then Result := True;
+end;
+
+procedure zlioclose( const Handle:thandle);
+begin
+ if (Win32Platform=VER_PLATFORM_WIN32_NT) then
+ closehandle(Handle);
+end;
+
+
+initialization
+
+IOCTL_ZLUNI_PORT_READ := CTL_CODE(FILE_DEVICE_KRNLDRVR, 1, METHOD_BUFFERED, FILE_ANY_ACCESS);
+IOCTL_ZLUNI_PORT_WRITE := CTL_CODE(FILE_DEVICE_KRNLDRVR, 2, METHOD_BUFFERED, FILE_ANY_ACCESS);
+IOCTL_ZLUNI_IOPM_ON := CTL_CODE(FILE_DEVICE_KRNLDRVR, 3, METHOD_BUFFERED, FILE_ANY_ACCESS);
+IOCTL_ZLUNI_IOPM_OFF := CTL_CODE(FILE_DEVICE_KRNLDRVR, 4, METHOD_BUFFERED, FILE_ANY_ACCESS);
+
+ if Win32Platform<>VER_PLATFORM_WIN32_NT then begin
+ zliostarted := true;
+ zliodirect := true;
+ end
+ else begin
+ if not zlioopen(HZLIO) then begin
+ if zliostart then
+ ZLIOStarted := zlioopen(HZLIO) or (Win32Platform<>VER_PLATFORM_WIN32_NT);
+ end
+ else
+ ZLIOStarted := true;
+ end;
+finalization
+
+if ZLIOStarted then
+ zliostop;
+
+
+
+end.
diff --git a/Game/Code/rccompillieren.bat b/Game/Code/rccompillieren.bat
new file mode 100644
index 00000000..4e2f2584
--- /dev/null
+++ b/Game/Code/rccompillieren.bat
@@ -0,0 +1 @@
+BRC32 -r UltraStar.RC \ No newline at end of file
diff --git a/Game/Fonts/Bold/Font 1024 Bold 16.png b/Game/Fonts/Bold/Font 1024 Bold 16.png
new file mode 100644
index 00000000..148cf1c1
--- /dev/null
+++ b/Game/Fonts/Bold/Font 1024 Bold 16.png
Binary files differ
diff --git a/Game/Fonts/Bold/Font 1024 Bold.dat b/Game/Fonts/Bold/Font 1024 Bold.dat
new file mode 100644
index 00000000..ea9f2484
--- /dev/null
+++ b/Game/Fonts/Bold/Font 1024 Bold.dat
Binary files differ
diff --git a/Game/Fonts/Bold/Thumbs.db b/Game/Fonts/Bold/Thumbs.db
new file mode 100644
index 00000000..4c73eecb
--- /dev/null
+++ b/Game/Fonts/Bold/Thumbs.db
Binary files differ
diff --git a/Game/Fonts/Bold/eurostar_regular_bold.dat b/Game/Fonts/Bold/eurostar_regular_bold.dat
new file mode 100644
index 00000000..1b2023e2
--- /dev/null
+++ b/Game/Fonts/Bold/eurostar_regular_bold.dat
Binary files differ
diff --git a/Game/Fonts/Bold/eurostar_regular_bold.png b/Game/Fonts/Bold/eurostar_regular_bold.png
new file mode 100644
index 00000000..ef460c70
--- /dev/null
+++ b/Game/Fonts/Bold/eurostar_regular_bold.png
Binary files differ
diff --git a/Game/Fonts/Normal/Font Normal 16.png b/Game/Fonts/Normal/Font Normal 16.png
new file mode 100644
index 00000000..f4a8a713
--- /dev/null
+++ b/Game/Fonts/Normal/Font Normal 16.png
Binary files differ
diff --git a/Game/Fonts/Normal/Font Normal.dat b/Game/Fonts/Normal/Font Normal.dat
new file mode 100644
index 00000000..b4f02d90
--- /dev/null
+++ b/Game/Fonts/Normal/Font Normal.dat
Binary files differ
diff --git a/Game/Fonts/Normal/Thumbs.db b/Game/Fonts/Normal/Thumbs.db
new file mode 100644
index 00000000..9c899eab
--- /dev/null
+++ b/Game/Fonts/Normal/Thumbs.db
Binary files differ
diff --git a/Game/Fonts/Normal/eurostar_regular.dat b/Game/Fonts/Normal/eurostar_regular.dat
new file mode 100644
index 00000000..f44ae7d8
--- /dev/null
+++ b/Game/Fonts/Normal/eurostar_regular.dat
Binary files differ
diff --git a/Game/Fonts/Normal/eurostar_regular.png b/Game/Fonts/Normal/eurostar_regular.png
new file mode 100644
index 00000000..fcf45d7a
--- /dev/null
+++ b/Game/Fonts/Normal/eurostar_regular.png
Binary files differ
diff --git a/Game/Fonts/Outline 1/Outline 1.dat b/Game/Fonts/Outline 1/Outline 1.dat
new file mode 100644
index 00000000..ea9f2484
--- /dev/null
+++ b/Game/Fonts/Outline 1/Outline 1.dat
Binary files differ
diff --git a/Game/Fonts/Outline 1/Outline 1.png b/Game/Fonts/Outline 1/Outline 1.png
new file mode 100644
index 00000000..1e213823
--- /dev/null
+++ b/Game/Fonts/Outline 1/Outline 1.png
Binary files differ
diff --git a/Game/Fonts/Outline 1/Thumbs.db b/Game/Fonts/Outline 1/Thumbs.db
new file mode 100644
index 00000000..7356d135
--- /dev/null
+++ b/Game/Fonts/Outline 1/Thumbs.db
Binary files differ
diff --git a/Game/Fonts/Outline 2/Outline 2.dat b/Game/Fonts/Outline 2/Outline 2.dat
new file mode 100644
index 00000000..062f1629
--- /dev/null
+++ b/Game/Fonts/Outline 2/Outline 2.dat
Binary files differ
diff --git a/Game/Fonts/Outline 2/Outline 2.png b/Game/Fonts/Outline 2/Outline 2.png
new file mode 100644
index 00000000..4e111f27
--- /dev/null
+++ b/Game/Fonts/Outline 2/Outline 2.png
Binary files differ
diff --git a/Game/Fonts/Outline 2/Thumbs.db b/Game/Fonts/Outline 2/Thumbs.db
new file mode 100644
index 00000000..b0c5b599
--- /dev/null
+++ b/Game/Fonts/Outline 2/Thumbs.db
Binary files differ
diff --git a/Game/Graphics/NoCover.jpg b/Game/Graphics/NoCover.jpg
new file mode 100644
index 00000000..0a424708
--- /dev/null
+++ b/Game/Graphics/NoCover.jpg
Binary files differ
diff --git a/Game/Graphics/credits_v5_bg.png b/Game/Graphics/credits_v5_bg.png
new file mode 100644
index 00000000..23dfedd7
--- /dev/null
+++ b/Game/Graphics/credits_v5_bg.png
Binary files differ
diff --git a/Game/Graphics/credits_v5_overlay.png b/Game/Graphics/credits_v5_overlay.png
new file mode 100644
index 00000000..6dad2a4f
--- /dev/null
+++ b/Game/Graphics/credits_v5_overlay.png
Binary files differ
diff --git a/Game/Graphics/intro-l-01.png b/Game/Graphics/intro-l-01.png
new file mode 100644
index 00000000..91561598
--- /dev/null
+++ b/Game/Graphics/intro-l-01.png
Binary files differ
diff --git a/Game/Graphics/intro-l-02.png b/Game/Graphics/intro-l-02.png
new file mode 100644
index 00000000..57a63175
--- /dev/null
+++ b/Game/Graphics/intro-l-02.png
Binary files differ
diff --git a/Game/Graphics/intro-l-03.png b/Game/Graphics/intro-l-03.png
new file mode 100644
index 00000000..d4d0757e
--- /dev/null
+++ b/Game/Graphics/intro-l-03.png
Binary files differ
diff --git a/Game/Graphics/intro-l-04.png b/Game/Graphics/intro-l-04.png
new file mode 100644
index 00000000..8c98b00a
--- /dev/null
+++ b/Game/Graphics/intro-l-04.png
Binary files differ
diff --git a/Game/Graphics/intro-l-05.png b/Game/Graphics/intro-l-05.png
new file mode 100644
index 00000000..52e361c9
--- /dev/null
+++ b/Game/Graphics/intro-l-05.png
Binary files differ
diff --git a/Game/Graphics/intro-l-06.png b/Game/Graphics/intro-l-06.png
new file mode 100644
index 00000000..c8e55c01
--- /dev/null
+++ b/Game/Graphics/intro-l-06.png
Binary files differ
diff --git a/Game/Graphics/intro-l-07.png b/Game/Graphics/intro-l-07.png
new file mode 100644
index 00000000..dd6286ae
--- /dev/null
+++ b/Game/Graphics/intro-l-07.png
Binary files differ
diff --git a/Game/Graphics/intro-l-08.png b/Game/Graphics/intro-l-08.png
new file mode 100644
index 00000000..034f9d24
--- /dev/null
+++ b/Game/Graphics/intro-l-08.png
Binary files differ
diff --git a/Game/Graphics/intro-l-09.png b/Game/Graphics/intro-l-09.png
new file mode 100644
index 00000000..7cd1f7f5
--- /dev/null
+++ b/Game/Graphics/intro-l-09.png
Binary files differ
diff --git a/Game/Graphics/names_blindy.png b/Game/Graphics/names_blindy.png
new file mode 100644
index 00000000..29624db4
--- /dev/null
+++ b/Game/Graphics/names_blindy.png
Binary files differ
diff --git a/Game/Graphics/names_canni.png b/Game/Graphics/names_canni.png
new file mode 100644
index 00000000..6988a3d6
--- /dev/null
+++ b/Game/Graphics/names_canni.png
Binary files differ
diff --git a/Game/Graphics/names_ggkfc.png b/Game/Graphics/names_ggkfc.png
new file mode 100644
index 00000000..bab87604
--- /dev/null
+++ b/Game/Graphics/names_ggkfc.png
Binary files differ
diff --git a/Game/Graphics/names_jaybinks.png b/Game/Graphics/names_jaybinks.png
new file mode 100644
index 00000000..fd204ebe
--- /dev/null
+++ b/Game/Graphics/names_jaybinks.png
Binary files differ
diff --git a/Game/Graphics/names_linnex.png b/Game/Graphics/names_linnex.png
new file mode 100644
index 00000000..3c1b8ec4
--- /dev/null
+++ b/Game/Graphics/names_linnex.png
Binary files differ
diff --git a/Game/Graphics/names_mog.png b/Game/Graphics/names_mog.png
new file mode 100644
index 00000000..954ac2a1
--- /dev/null
+++ b/Game/Graphics/names_mog.png
Binary files differ
diff --git a/Game/Graphics/names_omgdutch.png b/Game/Graphics/names_omgdutch.png
new file mode 100644
index 00000000..f8ba038a
--- /dev/null
+++ b/Game/Graphics/names_omgdutch.png
Binary files differ
diff --git a/Game/Graphics/names_skillmaster.png b/Game/Graphics/names_skillmaster.png
new file mode 100644
index 00000000..469df9db
--- /dev/null
+++ b/Game/Graphics/names_skillmaster.png
Binary files differ
diff --git a/Game/Graphics/names_whiteshark.png b/Game/Graphics/names_whiteshark.png
new file mode 100644
index 00000000..a713d607
--- /dev/null
+++ b/Game/Graphics/names_whiteshark.png
Binary files differ
diff --git a/Game/Graphics/outro-bg.png b/Game/Graphics/outro-bg.png
new file mode 100644
index 00000000..212e0c71
--- /dev/null
+++ b/Game/Graphics/outro-bg.png
Binary files differ
diff --git a/Game/Graphics/outro-esc.png b/Game/Graphics/outro-esc.png
new file mode 100644
index 00000000..01ce735a
--- /dev/null
+++ b/Game/Graphics/outro-esc.png
Binary files differ
diff --git a/Game/Graphics/outro-exit-dark.png b/Game/Graphics/outro-exit-dark.png
new file mode 100644
index 00000000..306ad638
--- /dev/null
+++ b/Game/Graphics/outro-exit-dark.png
Binary files differ
diff --git a/Game/Graphics/us.ico b/Game/Graphics/us.ico
new file mode 100644
index 00000000..e21ed5e8
--- /dev/null
+++ b/Game/Graphics/us.ico
Binary files differ
diff --git a/Game/Graphics/ustar-icon_v01.ico b/Game/Graphics/ustar-icon_v01.ico
new file mode 100644
index 00000000..e5b21364
--- /dev/null
+++ b/Game/Graphics/ustar-icon_v01.ico
Binary files differ
diff --git a/Game/Output/Changelog.german.txt b/Game/Output/Changelog.german.txt
new file mode 100644
index 00000000..04cd36bc
--- /dev/null
+++ b/Game/Output/Changelog.german.txt
@@ -0,0 +1,389 @@
+Ultrastar Deluxe v1.0.1a Challenge MOD r6b vom 17.02.2010
+-----------------------------
+Fix: (Medley) #Relative und Medley vertragen sich (noch) nicht. Wird nun abgefangen.
+Fix: (Videos) Es wurde oft fälschlicherweise Crop eingestellt.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r6a vom 16.02.2010
+-----------------------------
+New: (Allgemein) Medley Surprise und Medley Surprise Blind als "Plugin".
+Upd: (Videos) Neue FFmpeg-Version.
+Fix: (Allgemein) Ab und zu ist das Programm in der Songauswahl abgestürzt.
+Fix: (Challenge) Plugins konnten nicht komplett abgeschaltet werden.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r6 vom 15.02.2010
+-----------------------------
+New: (Allgemein) Medley-Modus als Plugin: Medley normal, Medley blind und Medley no score.
+New: (Allgemein) Plugins sind nun in den Party-Optionen an/abwählbar (über Leertaste bzw. Links/Rechts).
+New: (Medley) Die Medley-Playliste lässt sich in der Songauswahl mit F frei zusammenstellen. Bis zu 99 Songs sind möglich. Mit Shif+F wird das zuletzt hinzugefügte wieder entfernt bzw. der Modus deaktiviert.
+Upd: (Challenge) Spielerauswahl verbessert. Der maximaler Abstand zwischen den Sängern, die am öftesten und am seltesten gesungen haben, beträgt nun maximal 1.
+Upd: (Challenge) Spielerpaarungen werden erst in der aktuellen Runde angezeigt.
+Upd: (Hilfe) JumpTo- und Popup-Menu mit eigenen Hilfetexten.
+Upd: (Party) Per Joker übersprungene Lieder werden nicht noch einmal in der gleichen Auswahlrunde vorgeschlagen.
+Upd: (Songauswahl) Bei Random wird nicht sofort wieder das gleiche Lied vorgeschlagen.
+Fix: (Videos) Videodarstellung bei Verwendung von zwei Bildschirmen korrigiert.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r5c vom 06.02.2010
+-----------------------------
+Upd: (Videos) Aspect-Einstellung wird nun für jedes Lied einzeln gespeichert. Vorwahl im Menu dient lediglich als Vorwahl, wenn ein Video noch nicht gespielt worden ist. Speichertort ist die Datenbank.
+Upd: (Videos) Die Videos lassen sich nun auch komplett abschalten (Option).
+Fix: (Challenge) Medley-Symbole werden im Challenge-Modus ausgeblendet.
+Fix: (Songauswahl) Performance beim Scrollen mit Videovorschau verbessert.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r5b vom 05.02.2010
+-----------------------------
+Upd: (Party) Pluginname wird bei Songauswahl angezeigt
+Upd: (Songauswahl) Videovorschau wird nun eingeblendet
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r5a vom 05.02.2010
+-----------------------------
+New: (Sonauswahl) Videovorschau (maximieren/verkleinern mit V)
+Fix: (Videos) Alle Videos müssten nun synchron laufen.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r5 vom 23.01.2010
+-----------------------------
+New: (Allgemein) Erste Version eines Hilfesystems für jeden Bildschirm (mit TAB aufrufbar). Es sind noch nicht alle Texte vorhanden (keine englischen Texte).
+New: (Medley) Countdownziffern beim Starten während FadeIn.
+Upd: (Party) Maximale Rundenanzahl von 7 auf 32 erhöht.
+Fix: (Challenge) Im Zusammnhang mit Plugins wurde der falsche Sieger gekürt. Punkte wurden doppelt berechnet.
+Fix: (Editor) FixTimings korrigiert: Wenn zwischen zwei Zeilen exakt 4 Beats waren, hat die Funktion den Zeilenübergang auf den Anfang der ersten Note gelegt.
+Fix: (Editor) Medley-tags ließen sich nicht entfernen.
+Fix: (Editor) Wenn man die letzte Note verlängert, verkürzt oder verschoben hat, so ist der Editor weiter gesprungen. Egal ob es eine Überschneidung gab oder die nächste Note in weiter Ferne lag. Das Problem war, dass die Timings zwischen den Sätzen dann nicht mehr stimmten.
+Fix: (Medley) Bei Medley-Start am Anfang eines Liedes gab es keinen FadeIn.
+Fix: (Medley) Freestyle- Passagen werden nun von der Medley-Berechnung ausgeschlossen.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4g vom 13.01.2010
+-----------------------------
+Fix: (Videos) Spuleffekt am Anfang mancher Lieder beseitigt. Es müssten nun mehr Videos wieder laufen. Bei einigen Videos gibt es aber nach wie vor Probleme beim Spulen und mit der Synchronität. Diese sind aber meist nicht sauber codiert oder falsch geschnitten.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4f vom 13.01.2010
+-----------------------------
+Fix: (Editor) Zeilensprung, wenn Noten "nur" aneinander kleben beseitigt.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4e vom 12.01.2010
+-----------------------------
+Upd: (Editor) Grelle, blaue Augenkrebsfarbe abgeschwächt.
+Fix: (Editor) Midi-Noten wurden nicht richtig abgespielt. Führte zur Instabilität.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4d vom 12.01.2010
+-----------------------------
+Fix: (Editor) Beim speichern sind manchmal TXTs zerstört worden (blöder Fehler...).
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4c vom 11.01.2010
+-----------------------------
+Fix: (Editor) Beim Abspielen einer einzelnen Note im Editor ist die ausgewählte Note weggesprungen.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4b vom 10.01.2010
+-----------------------------
+Upd: (Allgemein) Doppelte Zeilenumbrüche in txts werden nun erkannt und in der Error.log protokolliert.
+Upd: (Editor) Die aktuell ausgewählte Note wandert mit, wenn mit P die ganze Zeile gespielt wird. Springt am Ende wieder zurück zur zuletzt ausgewählten Note.
+Upd: (Editor) Die aktuell bearbeitete Note hat nun die Farbe rot.
+Upd: (Editor) Esc dient im TextEditMode (F4) nicht mehr dazu, den Editor komplett zu verlassen, sondern, um die gerade gemachten Änderungen an der aktuellen Silbe rückgängig zu machen.
+Upd: (Editor) Medley-Tags nun in Klartext statt "MS" und "ME"
+Upd: (Editor) Mit Alt+J kann man nun die Medley-Passage am Stück im Editor abspielen.
+Upd: (Editor) Wenn man Medley-tags setzt/rücksetzt oder zu den Medley-tags springt, wird unten die aktuelle Länge des Medleys in Sekunden angezeigt.
+Upd: (Editor) Zusätzlich zu den bekannten P+(Shif bzw. Strg) kann man nun die Taste ALT drücken. Hierbei bleiben die bestehenden Funktionen, wobei das Lied aber ab dem aktuellen Satz bis zu Ende gespielt wird.
+Upd: (Medley) Titelanzeige ist nur noch während des FadeIn sichtbar.
+Upd: (Videos) Neuere FFmpeg-Version.
+Fix: (Allgemein) Die Zeit lief im Party und Challenge-Modus nicht rückwärts.
+Fix: (Allgemein) PopUps (Lineboni) gingen schräg nach oben weg.
+Fix: (Challenge) Manchmal wurde der falsche Spieler zum Sieger erklärt, wenn Plugins gewählt waren.
+Fix: (Editor) Bei Textänderungen wird die Lyriczeile nun komplett aktualisiert, statt nur der gerade editierten Silbe.
+Fix: (Editor) Bug beim speichern behoben: In der Songauswahl kam es hinterher zu Fehlern.
+Fix: (Editor) Nun sind alle Zeichen der Tastatur nutzbar. Zuvor gingen u.a. "ö", "ü", "." und "'" (Apostroph) nicht.
+Fix: (Medley) Das FadeOut war nicht immer optimal.
+Fix: (Videos) Aspect-Ratio wird nun richtig aus der INI geladen.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4a vom 08.01.2010
+-----------------------------
+Fix: (Fading) Die Musik wird nach verlassen des Top-Screens im Challenge mode nun "ausgefaded".
+Fix: (Fading) In der Songauswahl "schepperte" die Musik manchmal.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4 vom 07.01.2010
+-----------------------------
+New: (Editor) Unterstützung für Preview-tag. Setzen mit K. Springen zum Previewtag mit SHIFT+K. Ist dieses Tag gesetzt, so wird in der Songauswahl von diesem Zeitstempel an die Preview gestartet. Ist kompatibel mit dem Tag aus der Version 0.7
+New: (Editor) Unterstützung von Medley-Tags. Medley-Start-Tag setzen/rücksetzen mit A, End-Tag setzen/rücksetzen mit SHIFT+A. Springen zum Medley Start mit J, Sprung zum Medley-End mit SHIFT+J. Bei den Medley-Tags handelt es sich um Beat-Angaben. Das Start-Tag liegt immer auf dem Anfang einer Note. Das End-Tag auf dem Ende einer Note (Notenstart-Beat+Notenlänge). Die Standard FadeIn und -Out-Zeiten betragen 8 bzw 4 Sekunden.
+New: (Medley) Medley-Modus: Das Refrain von bis zu fünf verschiedenen Liedern hintereinander singen. Solange keine Medley-Tags gesetzt sind, versucht das Programm die Medley-Stellen zu errechnen (klappt besonders gut bei Pop-Liedern). Im Editor können diese Stellen dann korrigiert werden. Start eines einzelnen getaggten Refrains mit S, eines errechneten mit SHIFT+S. Bis zu fünf aus einem Ordner/Kategorie entsprechend mit D bzw. SHIFT+D. Wendet man das auf eine Kategorie/Ordner an, so wird die Playlist kunterbund aus allen Ordnern gebildet.
+New: (Videos) AspectRatio-Umschaltung beim Singen mit A (Stretch, Crop, LetterBox). Wird beim Umschalten für 3 Sekunden oben im SingScreen eingeblendet.
+Upd: (Allgemein) Im Scorescreen und Highscore-Screen wird das gerade gesungene Lied abgespielt. Im Medley-Modus umschaltbar.
+Upd: (Editor) Kann nur noch mit der Esc-Taste verlassen werden
+Upd: (Editor) Optisch etwas aufgefrischt.
+Upd: (Editor) Song neu laden mit R.
+Upd: (Medley) FadeIn und FadeOut wird immer auf den Anfang bzw. Ende eines Satzes gelegt.
+Upd: (Stats) Bei "Highscores" wird nun auch das Datum angezeigt. Bei "Beste Sänger" wird angezeigt, wie oft jemand gesungen hat.
+Fix: (Allgemein) Zeitfortschrittsbalken fängt nun ganz links an zu laufen. Zeit läuft rückwärts bis Null.
+Fix: (Videos) Einige Videos (divx, mp4) starteten mit einem Standbild.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r3 vom 04.01.2010
+-----------------------------
+Upd: (Challenge) Bei weniger als 9 Spielern werden nicht benutzte Tabellenelemente ausgeblendet.
+Upd: (Challenge) Handicap Modus entschäft. Jetzt werden nur noch maximal die letzten 10 Highscores eines Spielers berücksichtigt.
+Upd: (Party) Plugin-Auswahl nicht mehr so "zufällig", dafür kommt jetzt keins mehr 3x hintereinander.
+Upd: (Videos) Aktualisierte FFmpeg Version (über acinerella). Performance und Kompatibilität für Videos gesteigert, MKV wird nun unterstützt.
+Fix: (Challenge) PARTY_END hat nun auch einen Eintrag in der Language.txt
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r2 vom 02.01.2010
+-----------------------------
+New: (Challenge) Handicap-Modus: Wenn mehr als 3 Highscore-Einträge für beide Spieler vorhanden sind, so werden dem schlechteren Spieler nach dem Singen prozentual Punkte abgezogen (macht leider bei Hold The Line wenig Sinn).
+Fix: (Allgemein) Screenshots funktionieren nun wieder.
+Fix: (Allgemein) Spielernamen werden im Party- und Challenge-Modus in Templates gespeichert (ALT+F1..F12).
+Fix: (Challenge) Wenn Plugins abgewählt sind, so muss zumindest das Plugin "Duell" vorhanden sein.
+Fix: (ScreenScore) Mit eingeschaltetem Fade und 4/6 Spielern ist das Spiel nach dem zweiten Song abgestürzt. Wenn es nicht gerade abgestürzt ist, so gab es Darstellungsfehler und Highscores wurden doppelt eingetragen.
+Fix: (ScreenScore) Spielernummern der Spieler 4 bis 6 wurden als P1..P3 dargestellt
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r1 vom 31.12.2009
+-----------------------------
+New: (Challenge) Ein Algorithmus sorgt dafür, dass ein Spieler nicht allzu oft hintereinander singt und nicht allzu oft hintereinander P1 ist (=Lied aussuchen darf)
+New: (Challenge) Es wird nach jeder Runde eine Tabelle mit den Platzierungen angezeigt (wie bei Fussball mit 2-Punkte-System)
+New: (Challenge) Es wird nie während einer Partie ein Lied 2x gesungen! Es sei denn die Lieder gehen einem "aus".
+New: (Challenge) Jeder singt nach Möglichkeit gegen jeden - mit Hin- und Rückrunde: Hinrunde bedeutet, dass der Spieler P1 das Lied aussuchen darf, Rückrunde bedeutet, dass der Gegenspieler P1 ist, und somit aussuchen darf
+New: (Challenge) Lied "aussuchen" mit R (random) oder J (Joker)
+New: (Challenge) Man kann auswählen, ob die Plugins benutzt werden sollen oder nicht (Duell-Plugin ist Standard-Plugin)
+New: (Challenge) Solange random nicht angewendet worden ist, kann zwischen Ordnern hin- und hergeschaltet werden (Kategoriewechsel). Es sei denn man nutzt eine Playlist oder hat eine Kategorie vorgegeben.
+New: (Challenge) Verbesserte "Würfel-Funktion" bei der Auswahl der Plugins: die Plugins sind nicht mehr ganz zufällig, dafür gibt es aber auch mehr Abwechslung.
+New: (Challenge) Wenn jemand P1 ist und somit das Lied aussuchen darf, so hat er jedes mal 5 Joker (plus einmal frei)
+New: (Challenge) Während einer Aussucherei wird nie ein Lied 2x per random vorgeschlagen.
+Upd: (Highscores) Aus der Top-5 Liste ist eine Top-8 Liste geworden.
+Upd: (Highscores) Ein Lied muss erstmal komplett bis zur letzten Note gesungen werden, damit es als gesungen gezählt und in die DB übernommen wird.
+Upd: (Highscores) Ergebnisse unter 100 Punkte werden nicht mehr in die DB eingetragen und das Lied zählt als nicht gesungen!
+Upd: (Highscores) Es werden keine Einträge mehr aus der DB gelöscht (jaja... es wurden immer nur 5 pro Spieler und Lied gespeichert..)
+Upd: (Highscores) Es wird jeweils pro Spieler mit dem jeweils besten Score zusammengefasst (Top-8 Liste).
+Upd: (Highscores) Zu jedem Highscore wird auch das Datum gespeichert! Anzeige in Highscoreliste (in Stats kommt bald).
+Upd: (Party) "Cheaten" im Classic-Modus mit ALT+1, +2, +3
+Info: (Allgemein) Bisher nur Deluxe-Theme und Spachen deutsch und englisch.
+
+UltraStar Deluxe 1.01a
+-----------------------------
+Fix: VideoGap funktioniert wieder mit Mpeg Videos
+Fix: Video Start wird nun richtig berechnet wenn der Start-Tag benutzt wird
+
+UltraStar Deluxe 1.01
+-----------------------------
+Upd: Neue SDL-Lib
+Upd: Neue Bass.dll
+Upd: Video support neu geschrieben (FFMpeg anstatt SMPeg)
+ ->Fast alle Videoformate werden nun unterstützt. Bessere Synchronisation der meisten Videos.
+Upd: Theme, Skin und Farbe können ohne Neustart geändert werden
+Upd: Einige Geschwindigkeitsverbesserungen
+Upd: Backspace ist nun identisch mit ESC bei den meisten Screens
+Upd: Editor: Singlenote-playback (SHIFT + Leertaste / STRG + SHIFT + Leertaste)
+Upd: Editor: Mehr Buchstaben funktionieren nun im Texteditmodus z.B. '~'
+Upd: Deluxe-Theme verschönert.
+ - Neue Texturen für die Leiste
+ - Neue Hintergründe für die Deluxe Skins
+ - Farbe ist nun im Deluxe-Theme änderbar \o/
+Upd: Executable Name zu USdx.exe geändert
+Upd: Neue Sounds für die Menüs
+Upd: 3 neue Skins von Skar/Alajasam hinzugefügt
+Upd: TeamDuell (ähnlich Gib das Mikro weiter) Modiplugin hinzugefügt
+
+Add: Installer verfügbar
+
+Fix: 4/6 Spieler: Richtige Punktzahlen werden auf dem Scorescreen angezeigt
+Fix: Doppeltes hinzufügen der Scores bei Screens=2
+Fix: Überlappen einiger Artistennamen mit den Songname sollte nun in den meisten Fällen gefixed sein.
+Fix: License- und Readme.txt Dateien tauchen nicht mehr in der error.log auf
+Fix: Einige Sounds, (hauptsächlich der Editor 'klick'-Sound) waren zu leise
+Fix: USdx sollte nun mit Girder funktionieren
+
+UltraStar Deluxe 1.00 (by Ultrastar Deluxe Team)
+-----------------------------
+
+--------------
+Theme System
+--------------
+Upd: Neues Skin/Theme System aus Ultrastar 0.5.1
+Upd: Laden von selbsterstellten Themes ermöglicht
+Upd: Covereigenschaften in Theme.ini ausgelagert (z.B. Position)
+Upd: Optionale Coverspiegelungen hinzugefügt
+Upd: Neue Coveranordnung (Bessereres Aussehen mit vielen Songs). (Kann im Theme an und ausgeschaltet werden)
+Upd: SongScreen Equalizer Objekt hinzugefügt
+Upd: Optionale Spiegelungen zu Buttons und Statics hinzugefügt. (Reflection = 1)
+Upd: Buttons können nun im Theme zu Gruppen zusammengefasst werden.z.B. Deluxe Theme Main Menu Tools Collection.
+Upd: Buttons könen vom Theme ausgeblendet werden. z.B. für den Exit Button, oder falls Hotkeys existieren.
+Upd: Texte können nun eine Länge (w= ..) erhalten. Sie werden dann bei der gegebenen Länge umgebrochen.
+
+--------------
+Aufnahme Optionen
+--------------
+Upd: Ultrastar 0.5.2 Recording Optionen hinzugefügt
+Fix: Soundcard Einträge wurden mehrmals in die Config.Ini eingetragen
+Fix: Mehr als ein Singstaradapter sind jetzt möglich(2 Soundkarten mit dem selben Namen)
+
+--------------
+Song Screen
+--------------
+Upd: Playlist Support hinzugefügt
+
+Upd: Song Suche (mit Interface)
+Upd: Jump to Letter Hotkey
+Upd: Songscreen Menu ähnlich wie bei Singstar
+Upd: Spielernamen können nun vor dem Singen geändert werden
+Upd: Song Vorschau Lautstärke kann nun geändert werden
+Upd: Song Vorschau kann eingefadet werden
+
+--------------
+Party Modus
+--------------
+Upd: Party Modus hinzugefügt:
+ 3 Teams mit bis zu 4 Spielern möglich
+ => insgesamt 12 Spieler
+Upd: Modi SDK: Party Modi können mit etwas Programmiererfahrung leicht erstellt werden.
+Upd: 4 Standard Party Modi Plugins: Duell, Hold the Line, Until 5000, Blind Mode
+
+--------------
+Effekte
+--------------
+Upd: Neue Perfect Note Effekte
+Upd: Effekt bei perfekt gesungenem Satz hinzugefügt
+Upd: Goldene Noten haben jetzt einen Singstar ähnlichen Glitzereffekt, und sind nicht mehr gelb.
+Upd: Neuer Effekt bei getroffenen Goldenen Noten
+Upd: Neuer Menü-Übergangs-Effekt: Screen verschwimmt und "fliegt aus dem Bild heraus". Neue Möglichkeiten für Theme-Ersteller
+
+--------------
+Sonstiges
+--------------
+Upd: Deluxe Theme hinzugefügt: Theme mit PS3 ähnlichem Aussehen
+Upd: Neues Score Speicherungssystem (basierend auf SQLite)
+Upd: Statistiken hinzugefügt. Generelle Statistiken und
+ Beste Scores, Beste Sänger, beliebteste Songs, beliebteste Bands
+Upd: Einige On Screen Fehler Benachrichtigungen hinzugefügt, die neuen Spielern helfen sollten.
+Upd: Neuer Erweiterter Options Screen hinzugefügt
+Upd: Abfrage vor dem Beenden hinzugefügt
+Upd: Song Hintergrundbilder können jetzt auch auf voller Bildschrimfläche dargestellt werden.
+Upd: Im Editor werden jetzt zusätzlich die richtigen Notennamen ausgegeben (C, F#, etc.)
+Upd: Neue Schriftarten
+Upd: Bessere Unterstützung für Kommandozeilen Parameter
+Fix: Nahezu keine Abstürze mehr wegen fehlerhaften TXT-Dateien.
+ In Game Popup hinzugefügt und einen Rücksprunk zum Songscreen.
+ Selbst der Partymodus wird nicht unterbrochen.
+Fix: Workaround für Cover und Hintergrund JPEG-Errors
+Fix: Videosize kann wieder geändert werden.
+Fix: Bug in LineBonus Popup behoben das zu Speicherüberläufen führen kann.
+Fix: Bug in SelectSlide behoben der zu Fehlern mit weniger als 3 optionen führen kann.
+ Automatisches Resizing hinzugefügt
+Fix: Backgrounds can be used now in option Screens, too
+Fix: Unnützer Speicherverbauch wenn ein Song mit Video abgespielt wird. Einige Videodaten blieben im Speicher nachdem der Song beendet wurde.
+ Dies könnte zu einem Out Of Memory Error führen wenn viele Songs mit Video gespielt werden.
+Fix: Einige Speichernutzungs und Ladezeit Updates
+Fix: Falsche Satzübergänge wenn T im Editor benutzt wurde und sich 2 Noten von verschiedenen
+ Sätzen überlagerten.
+Fix: Editor stürzte ab wenn die letzte Note eines Satzes gelöscht wurde.
+Fix: [Midi Converter]Noten wurden mehrmals hinzugefügt wenn eine Datei mehrmals geöffnet wurde
+ oder der Save Button mehrmals gedrückt wurde.
+Fix: [Midi Converter]Satzübergänge werden nun vom Mide Converter automatisch berechnet.
+
+UltraStar 0.5.0 ultra-star.dl.am Mod X-Mas Edition (by Mota und Whiteshark)
+-----------------------------
+Upd: Neue schnellerer und fehlerresistenter Headereinlesefunktion
+Upd: Bewertungs Bar (Singstar Like)
+Upd: PhrasenBonus + Popups
+
+Upd: Skin verschönert
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r10 (by Mota und Whiteshark)
+-----------------------------
+Fix: Ein kleiner Bug bei der Pause Funktion wurde gefixt.
+Fix: Ein Bug im Theme System wurde behoben. (SelectSlide konnte nicht weniger als 3 Einträge enthalten.)
+Fix: Skin, Beschränkung auf 4 Skins aufgehoben
+Fix: Noten Texturen werden anders/besser eingelesen
+
+Upd: Zahlen bei der Songauswahl sind jetzt sinnvoller.
+Upd: Anzahl der Songs die eine Kategorie beinhaltet wird in der Übersicht angezeigt
+Upd: Neuer Notenskin
+
+Upd: LanguageTag + Sortierung
+Upd: Unterstützung der Covers.ini aus 0.5.1 - Für alle Sortier-Funtionen. Die alte Möglichkeit ohne die Covers.ini ist weiterhin möglich, genauso wie eine Kombination beider Methoden.
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r9 (Release by Whiteshark)
+-----------------------------
+
+Upd: BPM und VideoGap Angaben mit Punkt werden jetzt auch eingelesen. Es wird aber in diesem Fall in der Error.log eine meldung mit dem Namen des Fehlerhaften Songs ausgegeben.
+Upd: Sollte beim Einlesen eines Songs(speziell beim Header) ein Fehler auftreten wird in der Error.log der Songname + Zeile ausgegeben.
+
+Upd, Beta: Pause. P drücken und der Song wird pausiert, nocheinmal P und es kann wieder gesungen werden. Noch keine Anzeige ob Pause aktiviert wird, und noch kein Pause Menü.
+
+bekannte Probleme:
+Stellt man die Aufnahme Funktion ein, kommt es zu einem extremen CPU-Zeit verbrauch und es fängt an zu Laggen
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r8b (Release by Whiteshark)
+-----------------------------
+Fix: Random Funktionen funktionieren alle ohne Fehler
+Fix: In der Kategorieauswahl wird jetzt beim Start immer die erste Kategorie angezeigt
+Fix: Musik wird nach Kategoriewechsel korrekt abgespielt
+Fix: Richtiger Text wird jetzt nicht mehr zu falscher Musik abgespielt
+Fix: Nach Beenden eines Songs ist dieser jetzt wieder in der Übersicht angewählt
+Fix: Midi-konvertor Bug behoben (Nur Freestyle Noten anstatt Normalen)
+
+Thx to: dennisthemenace und mota für die super Bug-Reports :P
+
+Upd: doomhammers Cover sind Integriert: thx to doomhammer
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r8a (Release by Whiteshark)
+-----------------------------
+Fix: Theme System konnte nicht ausgewählt werden (workaround: Nur bis zu 4 Themes möglich)
+Fix: Richtige Kategorie wird angezeigt nach Druck von Escape
+
+Upd: Neue Random Funktionen: R + [Strg]: Random in allen Kategorien (Hier wird die Kategorie oben noch falsch angezeigt); R + [Shift]: Zufällige Kategorie
+Upd: Gerade gewählte Kategorie wird oben links in der Ecke gezeigt
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r8 (Release by Whiteshark)
+-----------------------------
+Fix: Creatorbug behoben
+Fix: Wenn Tabs=on kam es manchmal vor das der angewählte Song nicht mit dem Angezeigten übereingestimmt hat
+
+Upd: Theme System komplett
+ -Bei Start nach Themes Suchen
+ -Den ThemeOptions Screen ändern
+Upd: Neue Farben für Themes :)
+Upd: kleine änderungen am Editor
+ -Leerzeichen im Header werden automatisch korrigiert
+ -Header ist nicht mehr Case Sensitive
+
+Upd: Skin Ordner gesäubert, Es gibt jetzt 2 Skins: Motas und der Original Skin
+Upd: Ordner haben ihr eigenes Cover, welches angezeigt wird falls kein spezielles Cover vorhanden ist
+Upd: Der BewertungsText (Ultrastar, Singstar, etc.) kann jetzt übersetzt werden
+
+Upd: Falls eine Sprache nicht komplett ist werden die nicht übersetzten Texte, mit der Englischen Sprachdatei übersetzt. (Falls es zu nicht kompletten Sprachdateien kommt)
+
+Upd: neues Kategorie System:
+ -Wenn eine Kategorie angewählt wird, werden nur die enthaltenden Songs angezeigt.
+ -Mit Escape gehts zurück in die Kategorie Auswahl
+ -Mit Hoch und Runter kann die Kategorie gewechselt werden.
+
+UltraStar 0.5.0 mota patch r7 (Release by Mota)
+-----------------------------
+- Neues Notendesign.
+- versch. Neue Grafiken.
+- Neue Bewertung "Ultrastar" ab 9810 Punkte.
+- Textgröße-Bug im Editor behoben.
+
+UltraStar 0.5.0 mota patch r6 - 17.11.06 (Release by Mota)
+----------------------------------------
+- Editiorfunktionen für Goldene/Freestyle-Noten. (Tasten [G] und [F])
+- Speicherfunktion des Editors angepasst.
+- Verändertes Theme "SingStar".
+
+UltraStar 0.5.0 mota patch r5 - 16.11.06 (Release by Mota)
+----------------------------------------
+- Goldene Noten werden dargestellt
+- Zufallsauswahl verbessert
+
+UltraStar 0.5.0 mota patch r4 (Release by Mota)
+-----------------------------
+- Perfekt-Stern animation
+
+UltraStar 0.5.0 mota patch r3 (Release by Mota)
+-----------------------------
+- Sortierung Title2 und Artist2 -> Zahlen in Ordner "#"
+
+UltraStar 0.5.0 mota patch r2 (Release by Mota)
+-----------------------------
+- Eigene Cover für alle Sortierungen
+
+UltraStar 0.5.0 mota patch (Release by Mota)
+--------------------------
+- Eigene Cover für Sortierung nach Edition.
+
+UltraStar 0.5.0 (by Corvus5)
+--------------------------
+- Original Code \ No newline at end of file
diff --git a/Game/Output/Changelog.txt b/Game/Output/Changelog.txt
new file mode 100644
index 00000000..302d3bff
--- /dev/null
+++ b/Game/Output/Changelog.txt
@@ -0,0 +1,392 @@
+Ultrastar Deluxe v1.0.1a Challenge MOD r6b (17.02.2010)
+-----------------------------
+Fix: (Medley) #Relative tag and medley does not work (for now). Added message and fixed crash.
+Fix: (Videos) Wrong video-aspect (crop) in singscreen.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r6a (16.02.2010)
+-----------------------------
+New: (General) Medley Surprise and Medley Surprise Blind as "Plugin".
+Upd: (Videos) Newer FFmpeg-version.
+Fix: (General) Fixed crashes in song-menu.
+Fix: (Challenge) Deactivating the plugins in challenge-mode.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r6 (15.02.2010)
+-----------------------------
+New: (General) Medley-mode as plugin: medley normal, medley blind and medley no score.
+New: (General) Plugins are choosable in the party-options (space or left/right).
+New: (Medley) You can build up the medley-playlist manually in the song-menu. Add up to 99 songs with F. Delete tehe last added song with Shift+F. You can deactivate the medley-mode if you delete the last song from the medley-playlist.
+Upd: (Challenge) Better choosing of players. No one should sing more then one time more than any other.
+Upd: (Challenge) The choosing of the players will only appear on the actual round.
+Upd: (Help) JumpTo- and Popup-Menu with their own help texts (the help system is still in german, a translation into english will follow soon).
+Upd: (Party) If you skip a song using a joker, the skipped song will not appear again in the same round.
+Upd: (Song-menu) If you use random, the skipped song is not suggested again in the same selection round.
+Fix: (Videos) Fixed video aspect when using two screens.
+
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r5c (06.02.2010)
+-----------------------------
+Upd: (Videos) The aspect-correction will be safed individually for each song in the database.
+Upd: (Videos) Ability to switch-off the videos (option).
+Fix: (Challenge) Medley-symbols are no longer shown in challenge-mode.
+Fix: (Song-menu) Enhanced performance when scrolling with video-preview on.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r5b (05.02.2010)
+-----------------------------
+Upd: (Party) Plugin name is shown in the song selection
+Upd: (Song-menu) Video preview will be faded in
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r5a (05.02.2010)
+-----------------------------
+New: (Song-menu) Video preview (max/min with V)
+Upd: (General) Italian translation (thx to Claudio)
+Fix: (Videos) Videos should be in sync now.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r5 (23.01.2010):
+-----------------------------
+New: (General) First version of a help-system, but there is no english translation so far.
+New: (Medley) Countdown during fade-in in medley mode.
+Upd: (Party) You can play now up to 32 rounds instead of 7.
+Fix: (Challenge) Fix double scores und wrong winner when using plugins.
+Fix: (Editor) Correction of FixTimings: If the space between two sentences were 4 beats than the beginning of next sentence was on first note.
+Fix: (Editor) Deleting of Medley-tags is now possible.
+Fix: (Editor) If note-length was changed and you have tried to play that note, then the focus moved to next sentence.
+Fix: (Medley) Fix fadeIn if start was on first note of song.
+Fix: (Medley) Excluding freestyle-notes from calculation of chorus-tags.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4g (13.01.2010):
+-----------------------------
+Fix: (Videos) Removed fast-forwarding effect at the beginning of some songs. Now more videos should run without problems. Problems with fast-forwarding and synchronicity remain for some videos. Those videos are mostly poorly coded or wrongly cut.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4f (13.01.2010):
+-----------------------------
+Fix: (Editor) Removed line jump when notes where only touching.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4e (12.01.2010):
+-----------------------------
+Upd: (Editor) Changed glary blue (eye cancer provoking) background color.
+Fix: (Editor) Midi notes were note played correctly and caused instability.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4d (12.01.2010):
+-----------------------------
+Fix: (Editor) TXTs were sometimes destroyed when saving (stupid mistake...).
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4c (11.01.2010):
+-----------------------------
+Fix: (Editor) Playing a single note in the editor caused the current selection to jump away.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4b (10.01.2010):
+-----------------------------
+Upd: (General) Duplicate line breaks in TXT files are now detected and are logged in the error.log.
+Upd: (Editor) The currently selected note moves along when an entire lyrics line is played with P. It jumps back to the last selected note afterwards.
+Upd: (Editor) The current note is now highlighted in red.
+Upd: (Editor) ESC in text edit mode (F4) now longer exits the editor completely. Instead, it is used to undo the changes made to the currently edited syllable.
+Upd: (Editor) Medley tags are now in plain language instead of "MS" and "ME"
+Upd: (Editor) The medley section can be played in one piece with ALT+J.
+Upd: (Editor) If medley tags are set/reset or if you jump to the medley tags, the current length of the medley in seconeds is displayed at the bottom.
+Upd: (Editor) In addition to the exisiting P+(Shift / Strg), the ALT key can be pressed. The function of the existing modifiers remains unchanged, however the song is played from the current line until the very end.
+Upd: (Medley) Song artist and title are only visible during fade-in.
+Upd: (Videos) Updated FFmpeg version.
+Fix: (General) The time did not count backwards in party and challenge mode.
+Fix: (General) Pop-ups (line bonuses) flew out diagonally.
+Fix: (Challenge) Sometimes the wrong player was incorrectly declared the winner, when plugins were used.
+Fix: (Editor) When changing lyrics, the entire lyrics line instead of only the currently edited syllable is updated.
+Fix: (Editor) Fixed bug then saving: errors occured during song selection afterwards.
+Fix: (Editor) Now all keyboard characters can be used. Before the fix, "ö", "ü", "." and "'" (apostrophe), amongst others, did not work.
+Fix: (Medley) Fade out was not always optimal.
+Fix: (Videos) Aspect ratio is now successfully loaded from the INI.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4a (08.01.2010):
+-----------------------------
+Fix: (Fading) Music will be faded out after quitting the top screen in challenge mode.
+Fix: (Fading) In the song selection, the music sometimes clanked.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r4 (07.01.2010):
+-----------------------------
+New: (Editor) Support of the PREVIEW tag. Set tag with K, jump to preview with SHIFT+K. If this tag is set, the song preview in the song selection starts with this time stamp. Tag is compatible with the PREVIEW tag from Ultrastar version 0.7.
+New: (Editor) Support of medley tags. Set/reset medley start tag with A, set/reset medley end tag with SHIFT+A. Jump to medley start with J, jump to medley end with SHIFT+J. Medley tags refer to beats. The medley start tag always coincides with the beginning of a note. The medley end tag always coincides with the end of a note (note start beat + note length). The default fade in and fade out times are 8 and 4 seconds, respectively.
+New: (Medley) Medley mode: Sing chorus of up to five different songs subsequently. As long as no medley tags are set, the program will try to calculate medley sections automatically (works particularly well with pop songs). These sections can then be corrected in the song editor. Start of a single tagged chorus with S, of a calculated chorus with SHIFT+S. Up to five songs of one folder/category with D and SHIFT+D, respectively. Applying this to a category/folder, the playlist will be a mix of all folders.
+New: (Videos) Aspect ratio of video switchable while singing with the A key (Stretch, Crop, LetterBox). Current selection will be displayed at the top of the singscreen for 3 seconds when switched.
+Upd: (General) During the diplay of the scorescreen and the highscore screen, the current song is played. Switchable in medley mode.
+Upd: (Editor) Exiting the editor is only possible using the ESC key.
+Upd: (Editor) Visual/cosmetic enhancements.
+Upd: (Editor) Reload song with R.
+Upd: (Medley) FadeIn and FadeOut will always be placed on the beginning and the end of a complete lyric line respectively.
+Upd: (Stats) "Highscores" include dates. "Beste singers" includes the informatin, how many times one has sung the song.
+Fix: (General) Time progress bar now starts at the very left. Time counts down towards zero.
+Fix: (Videos) Some videos (divx, mp4) started with a freeze image.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r3b (06.01.2010):
+-----------------------------
+Fix: (Videos) With a negative GAP and if a song has played entirely before, the following video was not displayed.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r3a (05.01.2010):
+-----------------------------
+Fix: (Videos) Corrected the processing of the START-tag. Videos are now synchronous again.
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r3 (04.01.2010):
+-----------------------------
+Upd: (Challenge) With less than 9 players, unused table elements are hidden.
+Upd: (Challenge) Handicap Modus defused. Now only the last 10 highscores of a player will be taken into account at maximum.
+Upd: (Party) Plugin selection less "random", none will appear more than three times in a row.
+Upd: (Videos) Updated FFmpeg version (through acinerella). Performance and compatibility for video files increased, MKV container format now supported.
+Fix: (Challenge) PARTY_END now also has an entry in the language.txt
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r2 (02.01.2010):
+-----------------------------
+New: (Challenge) Handicap-Mode: if more than 3 highscore entries exist for both players, the player with the lower score will be punished by reducing his score by a certain percentage (makes hardly any sense with the "Hold The Line" mode).
+Fix: (General) Screenshots are working again.
+Fix: (General) Player names are stored in templates in party and challenge mode (ALT+F1..F12).
+Fix: (Challenge) If plugins are disabled, at least the duel plugin has to exist.
+Fix: (ScreenScore) With activated fade and 4 or 6 players, the game crashed after the second song. Even if it didn't crash, there were display problems and highscores were recorded twice.
+Fix: (ScreenScore) Numbers of players 4 to 6 were displayed as P1 to P3
+
+Ultrastar Deluxe v1.0.1a Challenge MOD r1 (31.12.2009):
+-----------------------------
+New: (Challenge) An algorithm assures that a certain player does not sing too many times in a row and is not too often P1 (= can decide on the song)
+New: (Challenge) After each round, a table of rankings is displayed (using the two point soccer system: 2 points (win), 0 points (lose), 1 point (tie))
+New: (Challenge) In a challenge, no song is played twice, unless you're running out of songs!
+New: (Challenge) Each player sings against everybody, if possible. First round, P1 gets to decide on the song, secound round the choice is up to the opponent
+New: (Challenge) Song "selection" with R (random) or J (Joker)
+New: (Challenge) Choose, if plugins should be enabled or disabled (duel plugin is standard)
+New: (Challenge) As long as the random search has not been used, switching between folders (change of category) is possible, unless a playlist is in use or a category is set
+New: (Challenge) Improved "randomness" in the selection of plugins: plugins are chosen less randomly, resulting in a greater diversity of plugins
+New: (Challenge) Player P1, who choses the next song, can use 5 jokers in each round (plus 1 additionally)
+New: (Challenge) No duplicate songs on subsequent random song searches.
+Upd: (Highscores) Top-5 list changed to a Top-8 list.
+Upd: (Highscores) A song has to be sung completely to the last note that it counts as being sung and that it is stored into the database.
+Upd: (Highscores) Scores below 100 will not be stored into the database and the song is not counted as sung.
+Upd: (Highscores) No entries will deleted from the database (only 5 entries per player and song were stored..)
+Upd: (Highscores) Best scores are combined for each player (Top-8 list).
+Upd: (Highscores) Every highscore is stored with corresponding date. Date is displayed in highscore list (display in stats coming soon).
+Upd: (Party) "Cheating" in classic mode using ALT+1, +2, +3
+
+
+UltraStar Deluxe 1.01a
+-----------------------------
+Fix: VideoGap works now again with mpeg videos
+Fix: Video start is calculated correctly now if start tag is used
+
+UltraStar Deluxe 1.01
+-----------------------------
+Upd: SDL-Lib update
+Upd: Bass update
+Upd: New video support (FFMpeg instead of SMPeg)
+ ->nearly all video formats are supported. Better synchronisation of most vids.
+Upd: On demand theme, skin and color changing
+Upd: Some speed improvements
+Upd: Backspace works now like ESC on most screens
+Upd: Editor: Singlenote-playback (SHIFT + Space / CTRL + SHIFT + Space)
+Upd: Editor: More characters work in text-edit-mode e.g. '~'
+Upd: Beautified Deluxe theme.
+ - New textures for the bar
+ - New backgrounds for the Deluxe skins
+ - Color is changeable in Deluxe theme now \o/
+Upd: Executable name changed to USdx.exe
+Upd: New menusounds
+Upd: Added 3 new skins by Skar/Alajasam
+Upd: Added TeamDuell modi-plugin
+
+Add: Installer available
+
+Fix: 4/6 Players: Scores are shown correctly on the scorescreen
+Fix: Double adding of Highscores if screens=2
+Fix: Overlapping of some artists names with songs should be fixed in most cases
+Fix: License and Readme files caused error messages in error.log
+Fix: Some sounds, (mainly the editors 'click' sound) were to quiet
+Fix: Should now work with Girder
+
+UltraStar Deluxe 1.00 (by Ultrastar Deluxe Team)
+-----------------------------
+
+--------------
+Theme System
+--------------
+Upd: New Ultrastar 0.5.1 Skin/Theme Sytem
+Upd: Add ability to 0.5.1 System to load third party Themes to add usability
+Upd: Add ability to change Positions and some other things relating to Covers within the Theme
+Upd: Add ability to add reflections to the Covers
+Upd: New Method for displaying Covers in a Circle. Looks better with many Songs. (Turn Off On within the Theme)
+Upd: Add Equalizer Object to SongScreen
+Upd: Add ability to add reflection to Buttons and Statics (Reflection = 1)
+Upd: Add ability to Group Buttons to a Buttonmenu, see Deluxe Theme Main Menu Tools Collection
+Upd: Add ability to Hide Buttons within Theme. Useful for example for Mainscreen Exit Button
+Upd: Add ability to give Texts a Width, so the Text breaks at the given Position.
+
+--------------
+Recording Options
+--------------
+Upd: Ultrastar 0.5.2 Recording Options added
+Fix: Write Soundcards more then one Time to Ini
+Fix: Use of more then one SingStar Mic. adapter now Possible(2 Soundcards with same Name Patch)
+
+--------------
+Song Screen
+--------------
+Upd: Added Playlist Support
+
+Upd: Song Search (with Screen interface)
+Upd: Jump to Letter Hotkey
+Upd: Menu in Songscreen similar to Singstars
+Upd: Ability to change Playernames before singing
+Upd: Ability to change Song Preview Volume
+Upd: Song Preview Fade in
+
+--------------
+Party Mode
+--------------
+Upd: Added Party Mode:
+ 3 Teams possible with up to 4 Players
+ => total of 12 Players
+Upd: Modi SDK: Possibility to create nearly any Modi with some Programming Skill
+Upd: 4 Custom Party Modi Plugins: Duell, Hold the Line, Until 5000, Blind Mode
+
+--------------
+Effects
+--------------
+Upd: New Perfect Note Effects
+Upd: Add Perfect Sentence Effect
+Upd: Golden Notes now with Singstar like Star Twinkle Effect, instead of just Yellow coloring
+Upd: Add Effect: Golden notes "Glow" when they are hit
+Upd: New Screen Fading Effect: Screen Blurs and "Flys" out of the Screen
+ looks better with every Background. More possibility for Theme Creators
+
+--------------
+Other
+--------------
+Upd: Added Deluxe Theme: Theme that has a look similiar to PS3 Singstar.
+Upd: New Score Saving System (SQLite Based)
+Upd: Statistic Screen with general Statistics and some Tables:
+ Best Scores, Best Singers, Most Popular Songs, Most Popular Bands
+Upd: Add some on Screen Error Messages helping new Peoples
+Upd: Add Advanced Screen with some new Options.
+Upd: Add a Question PopUp before exiting
+Upd: Add ability to scale Background Images in Singscreen to Fullsize
+Upd: Show real Note in Editor (C, F#, etc.)
+Upd: New fonts added
+Upd: Add better support for Command-Line Parameters
+Fix: No crashes caused by corrupted Textfiles anymore.
+ Added inGame Errormessage Popup and Jump Back to Songscreen. So even the Party Mode,
+ isn't interuppted.
+Fix: Workaround for Cover and BG JPG Errors
+Fix: Videosize can now be changed again
+Fix: Bug in LineBonus Popup that can end up in a Memory Overflow
+Fix: Bug in SelectSlide with less then 3 Options, No Overlapping anymore. Automatic resizing
+Fix: Backgrounds can be used now in option Screens, too
+Fix: useless Memory usement when Song with Video is Played. When a Song with Video is played
+ there was some Memory that was not freeed at the End of the Song. This could have caused
+ too much Memory usement when many Songs with Video are Played.
+Fix: Some Changes in Memory usement and better Loading speed.
+Fix: Wrong Timings pressing T in Editor if 2 Notes from different Sentences overlap
+Fix: Editor crashes when last note of a sentence is deleted
+Fix: [Midi Converter]Notes are added more than once when a File is opened twice or the save button is pressed multiple times.
+Fix: [Midi Converter]Sentence Timings are calculated automaticly when Midi File is converted
+
+UltraStar 0.5.0 ultra-star.dl.am Mod X-Mas Edition (by Mota und Whiteshark)
+-----------------------------
+Upd: New faster and Error resistant Header reader
+Upd: Bewertungs Bar (Singstar Like)
+Upd: LineBonus + Popups
+
+Upd: Skin beautified
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r10 (by Mota und Whiteshark)
+-----------------------------
+Fix: Minor Bug in Pause Method fixed.
+Fix: Fixed a Bug in Theme System
+Fix: New Note Texture Reading
+
+Upd: Numbers in SongSelection are now more meaningful
+Upd: Show Count of Songs in Category in Category Overview
+Upd: New Note Texture
+
+Upd: LanguageTag + Sorting
+Upd: Support for the Covers.ini from 0.5.1 - for all sorting options. The old behaviour without Covers.ini is also possible, just as well as a combination of both methods.
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r9 (Release by Whiteshark)
+-----------------------------
+
+Upd: BPM and VideoGap Can now be read, too. But there will be an Errormessage in Error.log
+
+Upd, Beta: Pause. Press P and the Song will be paused, press P again and it will be continued. Pause Display and Menu missing.
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r8b (Release by Whiteshark)
+-----------------------------
+Fix: Random Methods now work without Errors
+Fix: First Category is now shown at Startup.
+Fix: Music is played correctly after categorychange
+Fix: No wrong MP3 playing anymore
+Fix: After exit Singing Mode the Song is chossen in Song Screen
+Fix: Midi-konvertor Bug (Only Freestyle Notes instead of normal)
+
+Thx to: dennisthemenace and mota for Bug-Reports :P
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r8a (Release by Whiteshark)
+-----------------------------
+Fix: Themes could not be Selected (workaround: Only 4 Themes possible)
+Fix: Correct category is displayed after pressing Escape
+
+Upd: new Random functions: R + [Strg]: Random in all Categorys;
+ R + [Shift]: Random Category
+Upd: Chossen Category is displayed in the top left
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r8 (Release by Whiteshark)
+-----------------------------
+Fix: Creatorbug fixed
+Fix: Tabs=on Preview Bug
+
+Upd: Theme System ready
+ -Look for Themes at Startup
+ -ThemeOptions Screen working
+Upd: New Theme Colors :)
+Upd: Little changes at Editor
+ -Spaces in Header are corrected automaticaly
+ -Header is not Case Sensitive anymore
+
+Upd: Skin Folder Cleaned up, There are 2 Skins now: Motas and the Original Skin
+Upd: Categorys have their own noCover Image
+Upd: Rating Text (Ultrastar, Singstar, etc.) can now be Translated
+
+Upd: Inomplete Languages are corrected with Entrys from the English Language File
+
+Upd: new Category System:
+ -If a category is choosen only the Songs from this category are shown
+ -Press Escape to leave a category
+ -Press up or down to change the category.
+
+UltraStar 0.5.0 mota patch r7 (Release by Mota)
+-----------------------------
+- New Note Texture.
+- other new grafics.
+- New rating "Ultrastar" with more than 9810 Points.
+- Textsize-Bug in editor fixed.
+
+UltraStar 0.5.0 mota patch r6 - 17.11.06 (Release by Mota)
+----------------------------------------
+- Editiorfunctions for Golden/Freestyle-Notes. (Press [G] or [F])
+- Saving Methods of Editor changed
+- Changed Theme "SingStar".
+
+UltraStar 0.5.0 mota patch r5 - 16.11.06 (Release by Mota)
+----------------------------------------
+- Goldene Notes are displayed
+- Randomizing improved
+
+UltraStar 0.5.0 mota patch r4 (Release by Mota)
+-----------------------------
+- Perfect-Star animation
+
+UltraStar 0.5.0 mota patch r3 (Release by Mota)
+-----------------------------
+- Sorting Title2 and Artist2 -> Numbers in Category "#"
+
+UltraStar 0.5.0 mota patch r2 (Release by Mota)
+-----------------------------
+- Cover for all Categorys and Sortings can be choosen
+
+UltraStar 0.5.0 mota patch (Release by Mota)
+--------------------------
+- Cover for Edition sorting can be choosen
+
+UltraStar 0.5.0 (by Corvus5)
+--------------------------
+- Original Code \ No newline at end of file
diff --git a/Game/Output/Covers/Covers.ini b/Game/Output/Covers/Covers.ini
new file mode 100644
index 00000000..a81cf002
--- /dev/null
+++ b/Game/Output/Covers/Covers.ini
@@ -0,0 +1,19 @@
+[Edition]
+Singstar=Singstar.jpg
+Singstar Part 2=Singstar.jpg
+Singstar German=Singstar.jpg
+Singstar Spanish=Singstar.jpg
+Singstar Italian=Singstar.jpg
+Singstar French=Singstar.jpg
+Singstar Party=Singstar Party.jpg
+Singstar Popworld=Singstar Popworld.jpg
+Singstar 80s=Singstar 80s.jpg
+Singstar 80s Polish=Singstar 80s.jpg
+Singstar Rocks=Singstar Rocks.jpg
+Singstar Anthems=Singstar Anthems.jpg
+Singstar Deutsch Rock-Pop=Singstar Deutsch Rock-Pop.jpg
+Singstar Norske Hits=Singstar Norske Hits.jpg
+Singstar Svenska Hits=Singstar Svenska Hits.jpg
+[Genre]
+[Language]
+[Folder] \ No newline at end of file
diff --git a/Game/Output/Covers/NoCover.jpg b/Game/Output/Covers/NoCover.jpg
new file mode 100644
index 00000000..0a424708
--- /dev/null
+++ b/Game/Output/Covers/NoCover.jpg
Binary files differ
diff --git a/Game/Output/Covers/Thumbs.db b/Game/Output/Covers/Thumbs.db
new file mode 100644
index 00000000..e4a996de
--- /dev/null
+++ b/Game/Output/Covers/Thumbs.db
Binary files differ
diff --git a/Game/Output/Languages/English.ini b/Game/Output/Languages/English.ini
new file mode 100644
index 00000000..de09f399
--- /dev/null
+++ b/Game/Output/Languages/English.ini
@@ -0,0 +1,1389 @@
+[Text]
+SING_LOADING=Loading...
+
+SING_CHOOSE_MODE=choose mode
+SING_SING=sing
+SING_SING_DESC=quick game: sing solo or duet
+
+SING_TOOLS=tools
+
+SING_STATS=stats
+SING_STATS_DESC=view the statistics
+
+SING_EDITOR=editor
+SING_EDITOR_DESC=create your own songs
+
+SING_GAME_OPTIONS=game options
+SING_GAME_OPTIONS_DESC=change game settings
+
+SING_EXIT=quit
+SING_EXIT_DESC=quit game
+
+SING_OPTIONS=options
+SING_OPTIONS_DESC=change settings
+SING_OPTIONS_WHEREAMI=Options
+
+SING_OPTIONS_GAME=game
+SING_OPTIONS_GRAPHICS=graphics
+SING_OPTIONS_SOUND=sound
+SING_OPTIONS_LYRICS=lyrics
+SING_OPTIONS_THEMES=themes
+SING_OPTIONS_RECORD=record
+SING_OPTIONS_ADVANCED=advanced
+SING_OPTIONS_EXIT=back
+
+SING_OPTIONS_GAME_WHEREAMI=Options Game
+SING_OPTIONS_GAME_DESC=general game settings
+SING_OPTIONS_GAME_PLAYERS=Players
+SING_OPTIONS_GAME_DIFFICULTY=Difficulty
+SING_OPTIONS_GAME_LANGUAGE=Language
+SING_OPTIONS_GAME_TABS=Tabs
+SING_OPTIONS_GAME_SORTING=Sorting
+SING_OPTIONS_GAME_DEBUG=Debug
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Options Graphics
+SING_OPTIONS_GRAPHICS_DESC=graphic settings
+SING_OPTIONS_GRAPHICS_RESOLUTION=Resolution
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Fullscreen
+SING_OPTIONS_GRAPHICS_DEPTH=Depth
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Oscilloscope
+SING_OPTIONS_GRAPHICS_LINEBONUS=Line Bonus
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Movie size
+
+SING_OPTIONS_SOUND_WHEREAMI=Options Sound
+SING_OPTIONS_SOUND_DESC=sound settings
+SING_OPTIONS_SOUND_MIC_BOOST=Mic boost
+SING_OPTIONS_SOUND_CLICK_ASSIST=Click assist
+SING_OPTIONS_SOUND_BEAT_CLICK=Beat click
+SING_OPTIONS_SOUND_THRESHOLD=Threshold
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Two players mode
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Preview Volume
+SING_OPTIONS_SOUND_PREVIEWFADING=Preview Fading
+
+SING_OPTIONS_LYRICS_WHEREAMI=Options Lyrics
+SING_OPTIONS_LYRICS_DESC=lyrics settings
+SING_OPTIONS_LYRICS_FONT=Font
+SING_OPTIONS_LYRICS_EFFECT=Effect
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmization
+
+SING_OPTIONS_THEMES_WHEREAMI=Options Themes
+SING_OPTIONS_THEMES_DESC=theme and skin settings
+SING_OPTIONS_THEMES_THEME=Theme
+SING_OPTIONS_THEMES_SKIN=Skin
+SING_OPTIONS_THEMES_COLOR=Color
+
+SING_OPTIONS_RECORD_WHEREAMI=Options Record
+SING_OPTIONS_RECORD_DESC=microphone settings
+SING_OPTIONS_RECORD_CARD=Soundcard
+SING_OPTIONS_RECORD_INPUT=Input
+SING_OPTIONS_RECORD_CHANNELL=Left channel
+SING_OPTIONS_RECORD_CHANNELR=Right channel
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Options Advanced
+SING_OPTIONS_ADVANCED_DESC=advanced settings
+SING_OPTIONS_ADVANCED_EFFECTSING=Sing Effects
+SING_OPTIONS_ADVANCED_SCREENFADE=Screen Fading
+SING_OPTIONS_ADVANCED_LOADANIMATION=Load Animation
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Safety Questions
+SING_OPTIONS_ADVANCED_LINEBONUS=Line Bonus
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=after Song Select
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto PartyMenu
+
+SING_LEGEND_SELECT=select
+SING_LEGEND_NAVIGATE=navigate
+SING_LEGEND_CONTINUE=continue
+SING_LEGEND_ESC=back
+
+SING_PLAYER_DESC=enter player name/s
+SING_PLAYER_WHEREAMI=Playernames
+SING_PLAYER_ENTER_NAME=enter name
+
+SING_DIFFICULTY_DESC=select difficulty
+SING_DIFFICULTY_WHEREAMI=Difficulty
+SING_DIFFICULTY_CONTINUE=to song selection
+SING_EASY=Easy
+SING_MEDIUM=Medium
+SING_HARD=Hard
+
+SING_SONG_SELECTION_DESC=choose your song
+SING_SONG_SELECTION_WHEREAMI=Song Selection
+SING_SONG_SELECTION_GOTO=go to ..
+SING_SONG_SELECTION=song selection
+SING_SONG_SELECTION_MENU=menu
+SING_SONG_SELECTION_PLAYLIST=playlist
+SING_SONGS_IN_CAT=Songs
+PLAYLIST_CATTEXT=Playlist: %s
+
+SING_TIME=TIME
+SING_TOTAL=total
+SING_MODE=sing solo
+SING_NOTES=notes
+SING_GOLDEN_NOTES=golden notes
+SING_PHRASE_BONUS=line bonus
+
+SING_MENU=Main Menu
+
+SONG_SCORE=song score
+SONG_SCORE_WHEREAMI=Score
+
+SING_SCORE_TONE_DEAF=Tone Deaf
+SING_SCORE_AMATEUR=Amateur
+SING_SCORE_RISING_STAR=Rising Star
+SING_SCORE_LEAD_SINGER=Lead Singer
+SING_SCORE_HIT_ARTIST=Hit Artist
+SING_SCORE_SUPERSTAR=Superstar
+SING_SCORE_ULTRASTAR=Ultrastar
+
+POPUP_PERFECT=perfect!
+POPUP_AWESOME=awesome!
+POPUP_GREAT=great!
+POPUP_GOOD=good!
+POPUP_NOTBAD=not bad!
+POPUP_BAD=bad!
+POPUP_POOR=poor!
+POPUP_AWFUL=awful!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= and
+
+SONG_MENU_NAME_MAIN=song menu
+SONG_MENU_PLAY=Sing
+SONG_MENU_CHANGEPLAYERS=Change Players
+SONG_MENU_EDIT=Edit
+SONG_MENU_MODI=Sing a Modi
+SONG_MENU_CANCEL=Cancel
+
+SONG_MENU_NAME_PLAYLIST=Song Menu
+SONG_MENU_PLAYLIST_ADD=Add Song
+SONG_MENU_PLAYLIST_DEL=Delete Song
+
+SONG_MENU_NAME_PLAYLIST_ADD=Add Song
+SONG_MENU_PLAYLIST_ADD_NEW=to new playlist
+SONG_MENU_PLAYLIST_ADD_EXISTING=to existing playlist
+SONG_MENU_PLAYLIST_NOEXISTING=No playlist available
+
+SONG_MENU_NAME_PLAYLIST_NEW=New Playlist
+SONG_MENU_PLAYLIST_NEW_CREATE=Create
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Unnamed
+
+SONG_MENU_NAME_PLAYLIST_DEL=Really Delete?
+SONG_MENU_YES=Yes
+SONG_MENU_NO=No
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Open Playlist
+SONG_MENU_PLAYLIST_LOAD=open
+SONG_MENU_PLAYLIST_DELCURRENT=delete current Playlist
+
+SONG_MENU_NAME_PLAYLIST_DEL=Delete Playlist?
+
+SONG_MENU_NAME_PARTY_MAIN=Party Menu
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=take joker
+
+SONG_JUMPTO_DESC=search song
+SONG_JUMPTO_TYPE_DESC=Search for:
+SONG_JUMPTO_TYPE1=All
+SONG_JUMPTO_TYPE2=Title
+SONG_JUMPTO_TYPE3=Artist
+SONG_JUMPTO_SONGSFOUND=%d Song(s) found
+SONG_JUMPTO_NOSONGSFOUND=No Song found
+SONG_JUMPTO_HELP=Type Text to Search for
+SONG_JUMPTO_CATTEXT=Search for: %s
+
+PARTY_MODE=party mode
+PARTY_DIFFICULTY=Difficulty
+PARTY_PLAYLIST=Playlist Mode
+PARTY_PLAYLIST_ALL=All songs
+PARTY_PLAYLIST_CATEGORY=Folder
+PARTY_PLAYLIST_PLAYLIST=Playlist
+PARTY_ROUNDS=Rounds
+PARTY_TEAMS=Teams
+PARTY_TEAMS_PLAYER1=Player Team1
+PARTY_TEAMS_PLAYER2=Player Team2
+PARTY_TEAMS_PLAYER3=Player Team3
+
+PARTY_LEGEND_CONTINUE=continue
+
+PARTY_OPTIONS_DESC=settings for the party-game
+PARTY_OPTIONS_WHEREAMI=Party Options
+
+PARTY_PLAYER_DESC=enter player- and teamnames!
+PARTY_PLAYER_WHEREAMI=Party Names
+PARTY_PLAYER_ENTER_NAME=enter names
+PARTY_PLAYER_LEGEND_CONTINUE=start party-game
+
+PARTY_ROUND_DESC=next players to the mics
+PARTY_ROUND_WHEREAMI=Party Next Round
+PARTY_ROUND_LEGEND_CONTINUE=start round
+
+PARTY_SONG_WHEREAMI=Party Song-Selection
+PARTY_SONG_LEGEND_CONTINUE=sing
+PARTY_SONG_MENU=party menu
+
+PARTY_SCORE_DESC=score of the last round
+PARTY_SCORE_WHEREAMI=Party Points
+
+PARTY_WIN_DESC=winner of the party-game
+PARTY_WIN_WHEREAMI=Party Winner
+PARTY_WIN_LEGEND_CONTINUE=back to main-menu
+
+PARTY_ROUND=Round
+PARTY_ROUND_WINNER=Winner
+PARTY_NOTPLAYEDYET=not played yet
+PARTY_NOBODY=nobody
+NEXT_ROUND=Next round:
+
+PARTY_DISMISSED=Dismissed!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=wins!
+
+PLUGIN_HDL_NAME=Hold the Line
+PLUGIN_HDL_DESC=Don't get worse than the pointer at the rating bar shows you.
+
+PLUGIN_UNTIL5000_NAME=Until 5000
+PLUGIN_UNTIL5000_DESC=Who gets 5000 points first wins the match.
+
+PLUGIN_DUELL_NAME=Duell
+PLUGIN_DUELL_DESC=Sing a duell until 10000 points.
+
+PLUGIN_TEAMDUELL_NAME=Team Duell
+PLUGIN_TEAMDUELL_DESC=Pass The Mic!
+
+PLUGIN_BLIND_NAME=Blind Mode
+PLUGIN_BLIND_DESC=Duell without seeing the notes.
+
+STAT_MAIN=Statistics
+STAT_MAIN_DESC=General
+STAT_MAIN_WHEREAMI=Statistics
+
+STAT_OVERVIEW_INTRO=%0:s Statistics. \n Last Reset at %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Songs(%3:d with Video), whereof %1:d already were played and %2:d were not played yet.\n The most popular Song is %5:s from %4:s.
+STAT_OVERVIEW_PLAYER=Since the last Reset there were/was %0:d different Player(s).\n The best Player is %1:s with an average Score of %2:d Points.\n %3:s did the highest Score with %4:d Points.
+
+STAT_DETAIL=Statistics
+STAT_DETAIL_WHEREAMI=Detail Statistics
+
+STAT_NEXT=Next Page
+STAT_PREV=Previous Page
+STAT_REVERSE=Reverse Order
+STAT_PAGE=Seite %0:d of %1:d Pages\n (%2:d of %3:d Entrys)
+
+STAT_DESC_SONGS=Most popular Songs
+STAT_DESC_SONGS_REVERSED=Least popular Songs
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx sung
+
+STAT_DESC_BANDS=Most popular Bands
+STAT_DESC_BANDS_REVERSED=Least popular Bands
+STAT_FORMAT_BANDS=%0:s \n %1:dx Sung
+
+MSG_ERROR_TITLE=Error
+MSG_QUESTION_TITLE=Question
+MSG_QUIT_USDX=Really leave UltraStar?
+MSG_END_PARTY=Really end Party Mode?
+ERROR_NO_SONGS=No Songs loaded
+ERROR_NO_PLUGINS=No Plugins loaded
+ERROR_CORRUPT_SONG=Song could not be loaded.
+
+#########################################################
+# NEW/CHANGED TEXTS for M2-MOD #
+#########################################################
+
+#### ScreenOptionsGraphic ####
+;new:
+SING_OPTIONS_GRAPHICS_MOVIE_PREVIEW=video preview
+
+#### ScreenMain ####
+;new:
+SING_PARTY=party
+;delete old ones!
+SING_MULTI=classic
+SING_MULTI_DESC=sing in party classic-mode
+
+;new:
+SING_MULTI_M2=challenge
+SING_MULTI_M2_DESC=sing in party challenge-mode
+
+#### ScreenPartyOptionsM2 ####
+;new:
+PARTY_MODE_M2=Party Challenge-Mode
+PARTY_OPTIONS_M2_DESC=choose challenge options
+PARTY_OPTIONS_M2_WHEREAMI=Challenge Options
+PARTY_TEAMS_PLAYER_M2=Players
+PARTY_OPTIONS_M2_SELECT_PLUGIN=allow plugins
+PARTY_OPTIONS_M2_SELECT_HANDICAP=allow handicap
+
+#### ScreenPartyPlayerM2 ####
+;new:
+PARTY_PLAYERM2_DESC=enter challenge names
+PARTY_PLAYERM2_WHEREAMI=Challenge Names
+
+#### ScreenPartyNewRoundM2 ####
+;new:
+PARTY_ROUNDM2_DESC=challenge overview
+PARTY_ROUNDM2_WHEREAMI=Challenge Next Round
+PARTY_ROUNDM2_LEGEND_CONTINUE=continue
+PARTY_ROUNDM2=Round
+PARTY_ROUNDM2_RESULT=Result
+PARTY_ROUNDM2_NUMBER=
+PARTY_ROUNDM2_NAME=Name
+PARTY_ROUNDM2_WINS=W
+PARTY_ROUNDM2_DRAFTS=D
+PARTY_ROUNDM2_DEFEATS=L
+PARTY_ROUNDM2_SCORE_DIFF=P-diff
+PARTY_ROUNDM2_POINTS=P
+PARTY_ROUNDM2_LEGEND_SCROLL=scroll
+PARTY_ROUNDM2_END=end
+
+#### SreenSong in M2 mode ####
+;new:
+PARTY_SONG_WHEREAMI_M2=Challange Song-Selection
+
+#### ScreenTop ####
+;delete old ones!
+SING_TOP_CHARTS=top 8 Players
+SING_TOP_CHARTS_WHEREAMI=top 8
+SING_TOP_CHARTS_CONTINUE=to song selection
+
+#### Stats ####
+;new:
+STAT_FORMAT_DATE=%1:.2d.%0:.2d.%2:d
+;delete old ones!
+STAT_DESC_SCORES=HighScores
+STAT_DESC_SCORES_REVERSED=LowScores
+STAT_FORMAT_SCORES=%0:s - %1:d (on %5:s) [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Best Singers
+STAT_DESC_SINGERS_REVERSED=Worst Singers
+STAT_FORMAT_SINGERS=%0:s \n Average Score: %1:d (sung %2:d times)
+
+#### Plugins ####
+;new:
+PLUGIN_NOSCORE_NAME=No Score
+PLUGIN_NOSCORE_DESC=Duel without seeing the scores.
+
+PLUGIN_MORE500_NAME=More than 500
+PLUGIN_MORE500_DESC=Run more than 500 away.
+
+PLUGIN_MORE1000_NAME=More than 1000
+PLUGIN_MORE1000_DESC=Run more than 1000 away.
+
+PLUGIN_HAUDENLUKAS_NAME=Hit the Lukas
+PLUGIN_HAUDENLUKAS_DESC=Get all tones and win the game!
+
+PLUGIN_MEDLEY_NAME=Medley
+PLUGIN_MEDLEY_DESC=Sing up to 5 songs in a medley.
+
+PLUGIN_MEDLEYBLIND_NAME=Medley blind
+PLUGIN_MEDLEYBLIND_DESC=Sing up to 5 songs in a medley blind.
+
+PLUGIN_MEDLEYNOSCORE_NAME=Medley no score
+PLUGIN_MEDLEYNOSCORE_DESC=Up to 5 songs medley without seeing the scores.
+
+PLUGIN_MEDLEYSURPRISE_NAME=Medley Surprise
+PLUGIN_MEDLEYSURPRISE_DESC=Up to 5 songs medley, only selecting the 1st song.
+
+PLUGIN_MEDLEYSURPRISEBLIND_NAME=Medley Surprise 2
+PLUGIN_MEDLEYSURPRISEBLIND_DESC=Up to 5 songs medley blind, only selecting the 1st song.
+
+#### ScreenSing ####
+;new
+VIDEO_ASPECT_STRETCH=Stretch
+VIDEO_ASPECT_CROP=Crop
+VIDEO_ASPECT_LETTER_BOX=Letter Box
+
+#### ScreenScore ####
+;new
+SCORE_LEGEND_SCROLL=Scroll
+
+#### ScreenEditSub ####
+;new
+INFO_FILE_SAVED=File Saved
+ERROR_SAVE_FILE_FAILED=Error saving File
+
+#### HelpPopup ####
+;new
+MSG_HELP_TITLE=Help-System
+MSG_HELP_KEYMAP=Key mapping
+
+#########################################################
+# Help System #
+#########################################################
+
+[config]
+NumIDs = 33
+
+[Keymap]
+ESC=Esc
+CTRL=Ctrl
+ALT=Alt
+SHIFT=Shift
+BACKQUOTE=\
+BACKSPACE=Backspace
+EQUALS==
+MINUS=-
+SLASH=/
+PERIOD=.
+RIGHT=Right
+LEFT=Left
+DOWN=Down
+UP=Up
+SPACE=Space
+KPPLUS=Key-Pad +
+KPMINUS=Key-Pad -
+DELETE = Del
+RETURN = Enter
+F1F12 = F1..F12
+PAGEUP=Page Up
+PAGEDOWN=Page Down
+AZ = A..Z
+A=A
+B=B
+C=C
+D=D
+E=E
+F=F
+G=G
+H=H
+I=I
+J=J
+K=K
+L=L
+M=M
+N=N
+O=O
+P=P
+Q=Q
+R=R
+S=S
+T=T
+U=U
+V=V
+W=W
+X=X
+Y=Y
+Z=Z
+0=0
+1=1
+2=2
+3=3
+4=4
+5=5
+6=6
+7=7
+8=8
+9=9
+F1=F1
+F2=F2
+F3=F3
+F4=F4
+F5=F5
+F6=F6
+F7=F7
+F8=F8
+F9=F9
+F10=F10
+F11=F11
+F12=F12
+
+#### IDs must have the format: 'ID_###'
+
+#-------------------------------------------------------#
+# ID_001: UScreenEdit #
+#-------------------------------------------------------#
+[ID_001]
+Title = Song-Editor
+Description = Hier können Songs editiert werden.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+S = Song speichern (#RELATIVE:No)
+SHIFT_S = Song speichern (#RELATIVE:Yes)
+ESC = Editor verlassen / Im Textmodus: Bearbeitung abbrechen
+R = Song neu laden
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Medley/PreviewStart
+A = gewählte Note als Medley-Anfang setzen/löschen
+SHIFT_A = gewählte Note als Medley-Ende setzen/löschen
+J = Zum Medley-Anfang springen
+SHIFT_J = Zum Medley-Ende springen
+ALT_J = Medley abspielen
+K = gewählte Note als PreviewStart setzen
+SHIFT_K = Zum PreviewStart springen
+#-------------------------------------------------------#
+SEC_020 = Grundsteuerung
+P = MP3+Noteneinsatzklicks der gesamten Zeile abspielen
+SHIFT_P = MIDI der gesamten Zeile abspielen
+CTRL_SHIFT_P = MP3+Noteneinsatzklicks+MIDI der gesamten Zeile abspielen
+ALT_P = MP3+Noteneinsatzclicks ab aktueller Zeile bis zum Liedende abspielen
+SHIFT_ALT_P = MIDI ab aktueller Zeile bis zum Liedende abspielen
+CTRL_SHIFT_ALT_P = MP3+Noteneinsatzklicks+MIDI ab aktueller Zeile bis zum Liedende abspielen
+SPACE = MP3 der gewählten Note/Silbe abspielen
+SHIFT_SPACE = MIDI der gewählten Note/Silbe abspielen
+CTRL_SHIFT_SPACE = MP3+MIDI der gewählten Note/Silbe abspielen
+RIGHT = Zur nächsten Note/Silbe springen
+LEFT = Zur vorhergehenden Note/Silbe springen
+DOWN = Zur nächsten Liedzeile springen
+UP = Zur vorhergehenden Zeile springen
+#-------------------------------------------------------#
+SEC_030 = Noten
+G = Goldenen Ton setzen/löschen
+F = Freestyle Note setzten/löschen
+SHIFT_C = Überflüssige Leerzeichen in aktueller Zeile löschen
+CTRL_DELETE = Markierte Note/Silbe löschen
+CTRL_SLASH = Note teilen
+SHIFT_LEFT = Note nach links veschieben
+SHIFT_RIGHT = Note nach rechts veschieben
+CTRL_LEFT = Notenanfang nach links verschieben (Note verlängern)
+CTRL_RIGHT = Notenanfang nach rechts verschieben (Note verkürzen)
+ALT_LEFT = Notenende nach links verschieben (Note verkürzen)
+ALT_RIGHT = Notenende nach rechts verschieben (Note verlängern)
+BACKQUOTE = Note verlängern (wie [ALT]+[Rechts])
+CTRL_ALT_SHIFT_LEFT = Alle Noten ab der gewählten Note bis zum Liedende nach links verschieben
+CTRL_ALT_SHIFT_RIGHT = Alle Noten ab der gewählten Note bis zum Liedende nach rechts verschieben
+#-------------------------------------------------------#
+SEC_040 = Tonhöhe
+KPPLUS = Tonhöhe aller Noten um einen Halbtonschritt erhöhen
+KPMINUS = Tonhöhe aller Noten um einen Halbtonschritt verringern
+CTRL_UP = Tonhöhe der markierten Note um einen Halbtonschritt erhöhen
+CTRL_DOWN = Tonhöhe der markierten Note um einen Halbtonschritt verringern
+SHIFT_KPMINUS = Tonhöhe aller Noten um eine Oktave (12 Halbtonschritte) verringern
+SHIFT_KPPLUS = Tonhöhe aller Noten um eine Oktave (12 Halbtonschritte) erhöhen
+#-------------------------------------------------------#
+SEC_050 = Songtext
+F4 = Textbearbeitungs Modus starten (bzw. ohne Speichern beenden)
+RETURN = Textmodus beenden und Änderungen speichern
+BACKSPACE = Im Textmodus: Zeichen löschen
+C = Anfangsbuchstaben der Zeile groß schreiben
+PERIOD = Den ausgewählten Text dem nächsten Ton zuordnen
+T = Zeiten für Zeilenwechsel korrigieren
+SLASH = Zeilenumbruch vor der markierten Note einfügen
+SHIFT_SLASH = Aktuelle Zeile mit der darauffolgenden zusammenführen
+#-------------------------------------------------------#
+SEC_060 = GAP (Zeitverzögerung)
+0 = GAP um 10ms erhöhen
+SHIFT_0 = GAP um 1000ms erhöhen
+9 = GAP um 10ms reduzieren
+SHIFT_9 = GAP um 1000ms reduzieren
+#-------------------------------------------------------#
+SEC_070 = BPM (Beats per minute)
+CTRL_EQUALS = BPM um 0,01 erhöhen
+CTRL_MINUS = BPM um 0,01 reduzieren
+EQUALS = BPM um 0,05 erhöhen
+MINUS = BPM um 0,05 reduzieren
+SHIFT_EQUALS = BPM um 1,00 erhöhen
+SHIFT_MINUS = BPM um 1,00 reduzieren
+M = BMP und Notenzeitwerte verdoppeln
+D = BMP und Notenzeitwerte halbieren
+#-------------------------------------------------------#
+SEC_080 = Sonstiges
+CTRL_C = Zeile kopieren
+CTRL_V = Zeile einfügen
+CTRL_SHIFT_V = unbekannt
+CTRL_SHIFT_4 = unbekannt
+CTRL_SHIFT_ALT_4 = unbekannt
+CTRL_SHIFT_5 = unbekannt
+CTRL_SHIFT_ALT_5 = unbekannt
+
+#-------------------------------------------------------#
+# ID_002: UScreenLevel #
+#-------------------------------------------------------#
+[ID_002]
+Title = Level auswählen
+Description = Hier kann der Schwierigkeitsgrad eingestellt werden. Die Schwierigkeitsgrade beeinflussen die notwendige Treffgenauigkeit der Notenhöhen.
+#-------------------------------------------------------#
+SUB_010=Leicht
+ENT_011=Erlaubt eine Abweichung von bis zu zwei Halbtönen in beide Richtungen, um Punkte für die Note zu bekommen.
+#-------------------------------------------------------#
+SUB_020=Mittel
+ENT_021=Erlaubt eine Abweichung von bis zu einem Halbton in beide Richtungen, um Punkte für die Note zu bekommen.
+#-------------------------------------------------------#
+SUB_030=Schwierig
+ENT_031=Die Note muss exakt getroffen werden, um Punkte für die Note zu bekommen.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Levelauswahl
+LEFT = Linksherum durch die Auswahl gehen
+UP = Linksherum durch die Auswahl gehen
+RIGHT = Rechtsherum durch die Auswahl gehen
+DOWN = Rechtsherum durch die Auswahl gehen
+RETURN = Level setzen und weiter zur Songauswahl
+
+#-------------------------------------------------------#
+# ID_003: UScreenMain #
+#-------------------------------------------------------#
+[ID_003]
+Title = Hauptbildschirm
+Description = Dies ist das UltraStar Deluxe Startmenü.
+#-------------------------------------------------------#
+SUB_010=Singen
+ENT_011=Freie Wahl von Liedern und Spielern.
+ENT_012=Man kann hier die Lieder normal singen oder den Medley-Modus starten.
+#-------------------------------------------------------#
+SUB_020=Party
+ENT_021=Hier hat man die Wahl zwischen zwei unterschiedlichen Party-Modi.
+ENT_022=Classic: Spiele mit bis zu 12 Spielern in 3 Teams. Verschiedene Party-Plugins sorgen für Abwechslung.
+ENT_023=Challenge: Spiele mit bis zu 9 Spielern eine Art Meisterschaft bei der, ähnlich wie beim Fußball, die Rundenergebnisse tabellarisch zusammengefasst werden.
+#-------------------------------------------------------#
+SUB_030=Tools
+ENT_031=Über diesen Menüpunkt können Spielstatistiken, der interne Editor und das Optionsmenü aufgerufen werden.
+ENT_032=Statistiken: beinhalten Informationen über Highscores, beste Sänger, beliebteste Songs und Bands.
+ENT_033=Editor: hiermit lassen sich vorhandene MIDI-Dateien in UltraStar Lieder konvertieren.
+ENT_034=Optionen: hier lassen sich viele Einstellungen für das Verhalten von UltraStar Deluxe vornehmen.
+#-------------------------------------------------------#
+SUB_040=Beenden
+ENT_041=Hiermit beendet man UltraStar Deluxe nach Bestätigen einer Sicherheitsabfrage.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahl links
+UP = Auswahl hoch
+RIGHT = Auswahl rechts
+DOWN = Auswahl runter
+RETURN = aktuelle Auswahl bestätigen
+#-------------------------------------------------------#
+SEC_020 = Tastenkürzel
+M = Party --> Classic: startet den Classic Party Modus
+SHIFT_M = Party --> Challenge: startet den Challenge Modus
+S = Tools --> Statistiken: zeigt die Statistiken direkt an
+E = Tools --> Editor: startet den Editor
+ALT_C = Credits aufrufen
+
+#-------------------------------------------------------#
+# ID_004: UScreenName #
+#-------------------------------------------------------#
+[ID_004]
+Title = Spielernamen eingeben
+Description = Hier können die Spielernamen eingegeben werden. Die Anzahl der Spieler richtet sich nach der Einstellung unter Optionen --> Spiel --> Spieler.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahl links
+UP = Auswahl hoch
+RIGHT = Auswahl rechts
+DOWN = Auswahl runter
+RETURN = alle Spielernamen bestätigen und weiter
+#-------------------------------------------------------#
+SEC_020 = Namen ändern
+BACKSPACE = letzten Buchstaben löschen
+ALT_F1F12 = aktuellen Namen als Template 1..12 speichern
+F1F12 = Template 1..12 in gewähltes Namensfeld übernehmen
+
+#-------------------------------------------------------#
+# ID_006: UScreenOptions #
+#-------------------------------------------------------#
+[ID_006]
+Title = Hauptmenü Optionen
+Description = Von hier aus gelangt man zu allen Einstellungen, die das Aussehen und Verhalten von UltraStar Deluxe beeinflussen.
+#-------------------------------------------------------#
+SUB_010=Spiel
+ENT_011=Einstellungen zur Spieleranzahl, zur Standardschwierigkeitsstufe, zur Spielsprache, zur Anzeige von Kategorien, zur Liedsortierung und zum Debugmodus.
+#-------------------------------------------------------#
+SUB_020=Grafik
+ENT_021=Einstellungen zur Spielauflösung, zum Vollbildmodus, zur Farbtiefe, zur Anzeige eines Oszilloskop, zur Videogröße und zur Videovorschau.
+#-------------------------------------------------------#
+SUB_030=Sound
+ENT_031=Einstellungen zur Mikrofonverstärkung, zum Click-Assistenten, zu den Beat-Clicks, zur Rauschunterdrückung, zur Vorschau-Lautstärke und zum Vorschau-Fading.
+#-------------------------------------------------------#
+SUB_040=Lyrics
+ENT_041=Einstellungen zur Schriftart, zum Animationseffekt und zur Solmisation des Liedtextes
+#-------------------------------------------------------#
+SUB_050=Themes
+ENT_051=Einstellungen zum Theme, zum Skin und zur Farbe
+#-------------------------------------------------------#
+SUB_060=Aufnahme
+ENT_061=Einstellungen zu verwendeten Soundkarten, zu Audioeingängen und zu Kanalbelegungen
+#-------------------------------------------------------#
+SUB_070=Erweitert
+ENT_071=Einstellungen zum Bildschirm-Fade, zu den Singeffekten, zum Phrasenbonus, etc.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahl links
+UP = Auswahl hoch
+RIGHT = Auswahl rechts
+DOWN = Auswahl runter
+RETURN = aktuelle Auswahl bestätigen
+
+#-------------------------------------------------------#
+# ID_007: UScreenOptionsAdvanced #
+#-------------------------------------------------------#
+[ID_007]
+Title = Erweiterte Optionen
+Description = Hier findet man die erweiterten Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Bildschirm-Fade
+ENT_011=Schaltet die Überblendung zwischen den einzelnen Screens an oder aus.
+#-------------------------------------------------------#
+SUB_020=Singeffekte
+ENT_021=Schaltet Animationen bei Goldenen Noten und Ähnliches an oder aus.
+#-------------------------------------------------------#
+SUB_030=Phrasenbonus
+ENT_031=Legt fest, an welcher Stelle der Phrasenbonus angezeigt wird.
+#-------------------------------------------------------#
+SUB_040=nach Song-Wahl
+ENT_041=Legt fest, ob nach der Songauswahl direkt gesungen wird oder erst die Spieler festgelegt werden.
+#-------------------------------------------------------#
+SUB_050=Sicherheitsabfrage
+ENT_051=Legt fest, ob beim Verlassen von Ultrastar Deluxe eine Sicherheitsabfrage stattfindet.
+#-------------------------------------------------------#
+SUB_060=Auto Party-Menü
+ENT_061=Legt fest, ob das Party-Menü zur Jokerauswahl bei jedem neuen Lied automatisch angezeigt werden soll.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlmöglichkeiten der gewählten Einstellung nach links durchgehen
+UP = Vorherige Einstellungsoption wählen
+RIGHT = Auswahlmöglichkeiten der gewählten Einstellung nach rechts durchgehen
+DOWN = Nächste Einstellungsoption wählen
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_008: UScreenOptionsGame #
+#-------------------------------------------------------#
+[ID_008]
+Title = Spiel-Optionen
+Description = Hier findet man die grundlegenden Spiel-Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Spieler
+ENT_011=Legt die Anzahl der Spieler fest. Auf einem Bildschirm können maximal 3 Spieler gleichzeitig singen, auf zwei Bildschirmen sind es 4 bzw. 6 Spieler.
+#-------------------------------------------------------#
+SUB_020=Schwierigkeit
+ENT_021=Legt die standardmäßig eingestellte Schwierigkeitsstufe fest.
+#-------------------------------------------------------#
+SUB_030=Sprache
+ENT_031=Legt die Spielsprache fest.
+#-------------------------------------------------------#
+SUB_040=Ordner
+ENT_041=Legt fest, ob die Lieder gemäß der Sortierung in einzelnen Ordnern/Kategorien angezeigt werden oder nicht (Neustart erforderlich).
+#-------------------------------------------------------#
+SUB_050=Sortierung
+ENT_051=Legt fest, nach welchen Kriterium die Lieder sortiert werden.
+#-------------------------------------------------------#
+SUB_060=Debug
+ENT_061=Legt fest, ob Debug-Informationen wie Bildwiederholfrequenz angezeigt werden.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_009: UScreenOptionsGraphics #
+#-------------------------------------------------------#
+[ID_009]
+Title = Grafik-Optionen
+Description = Hier findet man die Grafik-Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Auflösung
+ENT_011=Legt die Auflösung des Spiels fest. Das Spiel wird in jedem Fall auf eine Auflösung von 800x600 gerendet und anschließend nur noch auf die gewählte Auflösung skaliert.
+#-------------------------------------------------------#
+SUB_020=Vollbild
+ENT_021=Legt fest, ob das Spiel im Vollbild- oder im Fenstermodus angezeigt werden soll (Neustart erforderlich).
+#-------------------------------------------------------#
+SUB_030=Farbtiefe
+ENT_031=Legt die Farbtiefe des Spiels fest.
+#-------------------------------------------------------#
+SUB_040=Oszilloskop
+ENT_041=Legt fest, ob beim Singen ein Oszilloskop für den Mikrofonausschlag angezeigt wird.
+#-------------------------------------------------------#
+SUB_050=Videogröße
+ENT_051=Legt fest, ob und in welcher Größe Videos angezeigt werden.
+#-------------------------------------------------------#
+SUB_060=Videovorschau
+ENT_061=Legt fest, ob bei der Liedauswahl eine Videovorschau angezeigt wird.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_010: UScreenOptionsLyrics #
+#-------------------------------------------------------#
+[ID_010]
+Title = Liedtext-Optionen
+Description = Hier findet man die Liedtext-Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Schriftart
+ENT_011=Legt die Schriftart des Liedtextes fest.
+#-------------------------------------------------------#
+SUB_020=Effekt
+ENT_021=Legt den Animationseffekt für die zu singende Silbe fest.
+#-------------------------------------------------------#
+SUB_030=Solmisation
+ENT_031=Legt fest, ob und wenn ja, welche Solmisation verwendet werden soll. Dabei wird der Liedtext durch die entsprechenden Tonsilben ersetzt.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_011: UScreenOptionsRecord #
+#-------------------------------------------------------#
+[ID_011]
+Title = Aufnahme Optionen
+Description = Hier findet man die Aufnahme- und Mikrofon-Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Soundkarte
+ENT_011=Legt die einzustellende Soundkarte fest.
+#-------------------------------------------------------#
+SUB_020=Eingang
+ENT_021=Legt den verwendeten Eingang der Soundkarte fest.
+#-------------------------------------------------------#
+SUB_030=Linker Kanal
+ENT_031=Legt fest, welcher Spielernummer der linke Aufnahmekanal zugeordnet ist.
+#-------------------------------------------------------#
+SUB_040=Rechter Kanals
+ENT_041=Legt fest, welcher Spielernummer der rechte Aufnahmekanal zugeordnet ist.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_012: UScreenOptionsSound #
+#-------------------------------------------------------#
+[ID_012]
+Title = Sound Optionen
+Description = Hier findet man die Sound-Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Mic-Anhebung
+ENT_011=Legt die Mikrofonverstärkung innerhalb von UltraStar Deluxe fest.
+#-------------------------------------------------------#
+SUB_020=Click-Assistent
+ENT_021=Legt fest, ob mit jedem Noteneinsatz ein Klick abgespielt wird.
+#-------------------------------------------------------#
+SUB_030=Beat-Click
+ENT_031=Legt fest, ob mit jedem Vierteltakt ein Klick abgespielt wird.
+#-------------------------------------------------------#
+SUB_040=Rauschunterdrückung
+ENT_041=Legt die Rauschumnterdrückung beim Mikrofonsignal fest.
+#-------------------------------------------------------#
+SUB_050=Vorschau-Lautstärke
+ENT_051=Legt die Lautstärke bei der Liedvorschau in der Liedauswahl fest.
+#-------------------------------------------------------#
+SUB_060=Vorschau-Fading
+ENT_061=Legt die Wartezeit bis zum Abspielen der Liedvorschau fest.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_013: UScreenOptionsThemes #
+#-------------------------------------------------------#
+[ID_013]
+Title = Themes Optionen
+Description = Hier findet man die Theme- und Skin-Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Theme
+ENT_011=Legt das Spiel-Theme und damit die Anordnung der einzelnen Elemente fest.
+#-------------------------------------------------------#
+SUB_020=Skin
+ENT_021=Legt das Skin für das gewählte Theme fest.
+#-------------------------------------------------------#
+SUB_030=Farbe
+ENT_031=Legt die Hauptfarbe für das gewählte Theme und Skin fest.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_014: UScreenPartyNewRound #
+#-------------------------------------------------------#
+[ID_014]
+Title = Party Übersicht
+Description = Hier wird die Übersicht über den aktuellen Stand des Party-Modus angezeigt. Neben dem aktuellen Punktestand wird eine Liste über alle gespielten und noch zu spielenden Runden mit den zugehörigen Plugins sowie die folgende Runde und deren Spieler und Plugin angezeigt.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = Partymodus beenden (mit Sicherheitsabfrage)
+BACKSPACE = Partymodus beenden (mit Sicherheitsabfrage)
+RETURN = Nächste Runde starten
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_015: UScreenPartyOptions #
+#-------------------------------------------------------#
+[ID_015]
+Title = Optionen Party-Modus
+Description = Hier könnten die Optionen für den Party-Modus festgelegt werden.
+#-------------------------------------------------------#
+SUB_010=Schwierigkeit
+ENT_011=Legt das Schwierigkeitslevel für alle Runden des Party-Modus' fest.
+#-------------------------------------------------------#
+SUB_020=Playlist-Modus
+ENT_021=Legt fest, welche Liederauswahl für den Party-Modus zur Verfügung stehen. Werden Ordner oder Playlist gewählt, so wird im nächsten Punkt festgelegt, welcher Ordner bzw. welche Playlist verwendet wird.
+#-------------------------------------------------------#
+SUB_030=Runden
+ENT_031=Legt die Anzahl der zu spielenden Runden fest.
+#-------------------------------------------------------#
+SUB_040=Teams
+ENT_041=Legt die Anzahl der Teams fest.
+#-------------------------------------------------------#
+SUB_050=Spieler Team 1
+ENT_051=Legt die Anzahl der Spieler in Team 1 fest.
+#-------------------------------------------------------#
+SUB_060=Spieler Team 2
+ENT_061=Legt die Anzahl der Spieler in Team 2 fest.
+#-------------------------------------------------------#
+SUB_060=Spieler Team 3
+ENT_061=Legt die Anzahl der Spieler in Team 3 fest (nur, falls 3 Teams gewählt wurden).
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = weiter
+
+#-------------------------------------------------------#
+# ID_016: UScreenPartyPlayer #
+#-------------------------------------------------------#
+[ID_016]
+Title = Spielernameneingabe Party-Modus
+Description = Hier können die Team- und Spielernamen eingegeben werden.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahl links
+UP = Auswahl hoch
+RIGHT = Auswahl rechts
+DOWN = Auswahl runter
+RETURN = alle Spielernamen bestätigen und weiter
+#-------------------------------------------------------#
+SEC_020 = Namen ändern
+BACKSPACE = letzten Buchstaben löschen
+ALT_F1F12 = aktuellen Namen als Template 1..12 speichern
+F1F12 = Template 1..12 in gewähltes Namensfeld übernehmen
+
+#-------------------------------------------------------#
+# ID_017: UScreenPartyScore #
+#-------------------------------------------------------#
+[ID_017]
+Title = Ergebnis Party-Modus
+Description = Hier wird das Ergebnis und der Sieger der letzten Party-Runde angezeigt.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = weiter
+BACKSPACE = weiter
+RETURN = weiter
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_010: UScreenPartyWin #
+#-------------------------------------------------------#
+[ID_018]
+Title = Sieger Party-Modus
+Description = Hier wird der endgültige Sieger nach allen gespielten Party-Runden angezeigt.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_019: UScreenPartyNewRoundM2 #
+#-------------------------------------------------------#
+[ID_019]
+Title = Übersicht Challenge-Modus
+Description = Hier wird die Übersicht über den aktuellen Stand des Challenge-Modus' angezeigt. Es wird die Punktetabelle und die Begegnungstabelle sowie folgende Runde mit Spielern angezeigt.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_020: UScreenPartyOptionsM2 #
+#-------------------------------------------------------#
+[ID_020]
+Title = Optionen Challenge-Modus
+Description = Hier könnten die Optionen für den Challenge-Modus festgelegt werden.
+#-------------------------------------------------------#
+SUB_010=Schwierigkeit
+ENT_011=Legt das Schwierigkeitslevel für alle Runden des Challenge-Modus' fest.
+#-------------------------------------------------------#
+SUB_020=Playlist-Modus
+ENT_021=Legt fest, welche Liederauswahl für den Challenge-Modus zur Verfügung stehen. Werden Ordner oder Playlist gewählt, so wird im nächsten Punkt festgelegt, welcher Ordner bzw. welche Playlist verwendet wird.
+#-------------------------------------------------------#
+SUB_030=Spieler
+ENT_031=Legt die Anzahl der Spieler für den Challenge-Modus fest.
+#-------------------------------------------------------#
+SUB_040=Runden
+ENT_041=Legt die Anzahl der zu spielenden Runden fest.
+#-------------------------------------------------------#
+SUB_050=Plugins zulassen
+ENT_051=Legt fest, ob Party-Plugins verwendet werden.
+#-------------------------------------------------------#
+SUB_060=Handicap Modus
+ENT_061=Legt fest, ob schlechte Spieler bevorzugt und gute Spieler bei der Punktevergabe im Sinne der Chancenangleichung benachteiligt werden.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_021: UScreenPartyPlayerM2 #
+#-------------------------------------------------------#
+[ID_021]
+Title = Spielernamen Challenge-Modus
+Description = Hier können die Team- und Spielernamen eingegeben werden.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahl links
+UP = Auswahl hoch
+RIGHT = Auswahl rechts
+DOWN = Auswahl runter
+RETURN = alle Spielernamen bestätigen und weiter
+#-------------------------------------------------------#
+SEC_020 = Namen ändern
+BACKSPACE = letzten Buchstaben löschen
+ALT_F1F12 = aktuellen Namen als Template 1..12 speichern
+F1F12 = Template 1..12 in gewähltes Namensfeld übernehmen
+
+#-------------------------------------------------------#
+# ID_022: UScreenScore #
+#-------------------------------------------------------#
+[ID_022]
+Title = Ergebnisse
+Description = Hier werden die Punktzahlen der einzelnen Spieler nach dem Singen angezeigt. Dabei wird nicht nur die Gesamtpunktzahl, sondern ebenfalls der erreichte Phrasenbonus sowie die Bonuspunkte durch Goldene Noten angezeigt.
+#-------------------------------------------------------#
+SUB_010=Mögliche Gesangsbewertungen
+ENT_011=Anti-Talent (bis 2000 Punkte)
+ENT_012=Amateur (2010 bis 4000 Punkte)
+ENT_013=Möchtegern (4010 bis 6000 Punkte)
+ENT_014=Sternchen (6010 bis 8000 Punkte)
+ENT_015=Hit-Künstler (8010 bis 9000 Punkte)
+ENT_016=Superstar (9010 bis 9800 Punkte)
+ENT_017=UltraStar (9810 bis 10000 Punkte)
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+RETURN = zurück
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_023: UScreenSing #
+#-------------------------------------------------------#
+[ID_023]
+Title = Singbildschirm
+Description = Hier wird das ausgewählte Lied abgespielt. Dabei wird der Text des Liedes zeilenweise mit den zugehörigen Noten angezeigt.
+#-------------------------------------------------------#
+SUB_010=Punktevergabe
+ENT_011=Die maximal erreichbare Punktzahl inklusive aller Bonuspunkte ist für jedes Lied normiert auf 10000 Punkte.
+ENT_012=Jede Note, die richtig gesungen wird (in Abhängigkeit der eingestellten Schwierigkeitsstufe), gibt Punkte. Je länger die Note richtig gesungen wurde, desto mehr Punkte bekommt der Spieler.
+#-------------------------------------------------------#
+SUB_020=Phrasenbonus
+ENT_021=Zusätzlich erhält man für jede Zeile, die fehlerfrei gesungen wurden, einen Phrasenbonus.
+#-------------------------------------------------------#
+SUB_030=Goldene Noten
+ENT_031=Goldene Noten sind meist etwas schwerer zu treffen und geben daher ebenfalls Bonuspunkte.
+#-------------------------------------------------------#
+SUB_040=Freestyle Noten
+ENT_041=Freestyle Noten werden oft für gesprochene oder kaum bewertbare Passagen verwendet. Es werden hierfür keine Tonhöhen angezeigt, der Liedtext wird kursiv dargestellt und diese Teile geben keine Punkte. Hier darf nach Belieben mitgesprochen oder mitgegrölt werden!
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+P = Pause / Weiter
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+# ID_024: UScreenSong #
+#-------------------------------------------------------#
+[ID_024]
+Title = Liedauswahl
+Description = Hier werden alle vorhandenen Lieder für das normale Singen angezeigt. Scrollt durch die Liste oder verwendet die Suche, um euren Lieblingssong zu finden.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+V = Videovorschau vergrößern/verkleinern (falls vorhanden)
+A = Bildseitenverhältnis umschalten (nur im Vollbildmodus, wird gespeichert)
+#-------------------------------------------------------#
+SEC_010 = Songauswahl
+LEFT = Linksherum durch die Liedauswahl blättern
+RIGHT = Rechtsherum durch die Liedauswahl blättern
+UP = Zur vorherigen Kategorie wechseln (falls Kategorien aktiviert)
+DOWN = Zur nächsten Kategorie wechseln (falls Kategorien aktiviert)
+RETURN = Lied singen
+ALT_AZ = Zu Interpreten mit gewähltem Anfangsbuchstaben springen
+SHIFT_ALT_AZ = Zu Titeln mit gewähltem Anfangsbuchstaben springen
+M = Menü aufrufen (Singen / Spieler wechseln / Song zu Playlist hinzufügen / Editor)
+J = Suchmenü aufrufen
+P = Playliste öffnen
+R = Zufällig ein neues Lied anzeigen
+E = Editor mit ausgewähltem Lied starten
+#-------------------------------------------------------#
+SEC_020 = Medley
+S = Aktuelles Lied im Medley-Modus starten (falls Medley-Tags gesetzt)
+SHIFT_S = Aktuelles Lied im Medley-Modus starten (falls Medley-Tags gesetzt oder berechnet)
+D = Ein Medley mit bis zu 5 zufällig gewählten Liedern (mit gesetzten Medley-Tags) aus der aktuellen Kategorie starten
+SHIFT_D = Ein Medley mit bis zu 5 zufällig gewählten Liedern (mit gesetzten oder berechneten Medley-Tags) aus der aktuellen Kategorie starten
+F = Ein Medley mit bis zu 99 selbst gewählten Liedern (mit gesetzten Medley-Tags) zusammenstellen
+SHIFT_F = Letztes hinzugefügte Lied von der Medley-Playlist entfernen bzw. Medley-Modus deaktivieren, wenn die Playliste leer ist
+
+#-------------------------------------------------------#
+# ID_025: UScreenSong Party #
+#-------------------------------------------------------#
+[ID_025]
+Title = Liedauswahl Party-Modus
+Description = Hier werden alle vorhandenen Lieder im klassischen Party-Modus angezeigt.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = Party-Modus beenden (Menü aufrufen, falls geöffnet)
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+V = Videovorschau vergrößern/verkleinern (falls vorhanden)
+A = Bildseitenverhältnis umschalten (nur im Vollbildmodus, wird gespeichert)
+#-------------------------------------------------------#
+SEC_010 = Songauswahl
+RETURN = Menü aufrufen (Singen / Joker)
+ESC = Geöffnetes Song-Menü schließen
+M = Menü aufrufen (Singen / Joker)
+1 = per Zufall ein neues Lied aussuchen (Team 1 verwendet einen Joker)
+2 = per Zufall ein neues Lied aussuchen (Team 2 verwendet einen Joker)
+3 = per Zufall ein neues Lied aussuchen (Team 3 verwendet einen Joker; falls 3 Teams vorhanden)
+ALT_1 = per Zufall ein neues Lied aussuchen (kein Team verwendet einen Joker)
+ALT_2 = per Zufall ein neues Lied aussuchen (kein Team verwendet einen Joker)
+ALT_3 = per Zufall ein neues Lied aussuchen (kein Team verwendet einen Joker; falls 3 Teams vorhanden)
+
+#-------------------------------------------------------#
+# ID_026: UScreenSong Challenge #
+#-------------------------------------------------------#
+[ID_026]
+Title = Liedauswahl Challenge-Modus
+Description = Hier werden alle vorhandenen Lieder im Challenge-Modus angezeigt. Die Liedauswahl liegt bei Spieler P1.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = Party-Modus beenden (Menü aufrufen, falls geöffnet)
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+V = Videovorschau vergrößern/verkleinern (falls vorhanden)
+A = Bildseitenverhältnis umschalten (nur im Vollbildmodus, wird gespeichert)
+#-------------------------------------------------------#
+SEC_010 = Songauswahl
+RETURN = Aktuelles Lied singen
+R = per Zufall ein neues Lied aussuchen
+J = per Zufall ein neues Lied aussuchen
+
+#-------------------------------------------------------#
+# ID_027: UScreenStatDetail #
+#-------------------------------------------------------#
+[ID_027]
+Title = Detaillierte Statistiken
+Description = Hier werden themenbezogen detailliertere Statistiken angezeigt.
+#-------------------------------------------------------#
+SUB_010=Nächste Seite
+ENT_011=Blättert zur nächsten Statistikseite.
+#-------------------------------------------------------#
+SUB_020=Vorherige Seite
+ENT_021=Blättert zur vorherigen Statistikseite.
+#-------------------------------------------------------#
+SUB_030=Umkehren
+ENT_031=Kehrt die Sortierreihenfolge um.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_002 = Navigation
+LEFT = Zum vorherigen Punkt wechseln.
+RIGHT = Zur nächsten Punkt wechseln.
+UP = Zur vorherigen Punkt wechseln.
+DOWN = Zur nächsten Punkt wechseln.
+
+#-------------------------------------------------------#
+# ID_028: UScreenStatMain #
+#-------------------------------------------------------#
+[ID_028]
+Title = Hauptbildschirm Statistiken
+Description = Hier werden die wichtigsten Statistiken über die Lieder, Spieler und Punktzahlen auf einen Blick angezeigt.
+#-------------------------------------------------------#
+SUB_010=Highscores
+ENT_011=Zeigt alle vorhandenen Highscores mit Datum und Schwierigkeitsstufe an.
+#-------------------------------------------------------#
+SUB_020=Beste Sänger
+ENT_021=Zeigt die besten Sänger mit durchschnittlicher Punktezahl an.
+#-------------------------------------------------------#
+SUB_030=Beliebteste Songs
+ENT_031=Zeigt die beliebtesten Songs mit Singhäufigkeit an.
+#-------------------------------------------------------#
+SUB_040=Beliebteste Bands
+ENT_041=Zeigt die beliebtesten Bands mit der Anzahl gesungener Lieder an.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_002 = Navigation
+LEFT = Zur vorherigen Statistik wechseln.
+RIGHT = Zur nächsten Statistik wechseln.
+UP = Zur vorherigen Statistik wechseln.
+DOWN = Zur nächsten Statistik wechseln.
+
+#-------------------------------------------------------#
+# ID_029: UScreenTop #
+#-------------------------------------------------------#
+[ID_029]
+Title = Highscores
+Description = Hier wird die Highscoreliste der besten acht Sänger mit Datum angezeigt. Falls weniger als 100 Punkte erreicht wurden oder das Lied nicht bis zur letzten Liedzeile gesungen wurde, wird es nicht gewertet.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+RETURN = weiter
+ESC = weiter
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_030: Select Plugins #
+#-------------------------------------------------------#
+[ID_030]
+Title = Pluginauswahl
+Description = Hier können die Plugins einzeln aktiviert/deaktiviert werden.
+#-------------------------------------------------------#
+SEC_010 = Navigation
+UP = Plugins nach oben durchscrollen
+DOWN = Plugins nach unten durchscrollen
+ESC = Zurück zu den Optionen
+RETURN = Weiter zur Namenseingabe
+#-------------------------------------------------------#
+SEC_020 = Pluginauswahl
+SPACE = Plugin aktivieren/deaktivieren
+LEFT = Plugin deaktivieren
+RIGHT = Plugin aktivieren
+
+#-------------------------------------------------------#
+# ID_031: ScreenSongJumpTo #
+#-------------------------------------------------------#
+[ID_031]
+Title = Filter?
+Description = blah
+#-------------------------------------------------------#
+SEC_010 = Navigation
+ESC = raus hier...
+
+#-------------------------------------------------------#
+# ID_032: ScreenSongMenu #
+#-------------------------------------------------------#
+[ID_032]
+Title = PopupMenu Main?
+Description = blah
+#-------------------------------------------------------#
+SEC_010 = Navigation
+ESC = raus hier...
+
+#-------------------------------------------------------#
+# ID_033: ScreenSongMenu Party #
+#-------------------------------------------------------#
+[ID_033]
+Title = PopupMenu Party?
+Description = blah
+#-------------------------------------------------------#
+SEC_010 = Navigation
+ESC = raus hier... \ No newline at end of file
diff --git a/Game/Output/Languages/German.ini b/Game/Output/Languages/German.ini
new file mode 100644
index 00000000..1f5a19f6
--- /dev/null
+++ b/Game/Output/Languages/German.ini
@@ -0,0 +1,1393 @@
+[Text]
+SING_LOADING=Lade...
+
+SING_CHOOSE_MODE=Modus wählen
+SING_SING=Singen
+SING_SING_DESC=Singen
+
+SING_TOOLS=Tools
+
+SING_STATS=Statistiken
+SING_STATS_DESC=Die Statistiken anschauen
+
+SING_EDITOR=Editor
+SING_EDITOR_DESC=Mach deinen eigenen Song
+
+SING_GAME_OPTIONS=Spiel-Optionen
+SING_GAME_OPTIONS_DESC=Verändere die Spieleinstellungen
+
+SING_EXIT=Beenden
+SING_EXIT_DESC=Spiel verlassen
+
+SING_OPTIONS=Optionen
+SING_OPTIONS_DESC=Einstellungen verändern
+SING_OPTIONS_WHEREAMI=Optionen
+
+SING_OPTIONS_GAME=Spiel
+SING_OPTIONS_GRAPHICS=Grafik
+SING_OPTIONS_SOUND=Sound
+SING_OPTIONS_LYRICS=Lyrics
+SING_OPTIONS_THEMES=Themes
+SING_OPTIONS_RECORD=Aufnahme
+SING_OPTIONS_ADVANCED=Erweitert
+SING_OPTIONS_EXIT=zurück
+
+SING_OPTIONS_GAME_WHEREAMI=Optionen Spiel
+SING_OPTIONS_GAME_DESC=Allgemeine Spieleinstellungen
+SING_OPTIONS_GAME_PLAYERS=Spieler
+SING_OPTIONS_GAME_DIFFICULTY=Schwierigkeit
+SING_OPTIONS_GAME_LANGUAGE=Sprache
+SING_OPTIONS_GAME_TABS=Ordner
+SING_OPTIONS_GAME_SORTING=Sortierung
+SING_OPTIONS_GAME_DEBUG=Debug
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Optionen Grafik
+SING_OPTIONS_GRAPHICS_DESC=Einstellungen für die Grafik
+SING_OPTIONS_GRAPHICS_RESOLUTION=Auflösung
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Vollbild
+SING_OPTIONS_GRAPHICS_DEPTH=Farbtiefe
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Oszilloskop
+SING_OPTIONS_GRAPHICS_LINEBONUS=Phrasenbonus
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Videogröße
+
+SING_OPTIONS_SOUND_WHEREAMI=Optionen Sound
+SING_OPTIONS_SOUND_DESC=Einstellungen für den Sound
+SING_OPTIONS_SOUND_MIC_BOOST=Mic-Anhebung
+SING_OPTIONS_SOUND_CLICK_ASSIST=Click-Assistent
+SING_OPTIONS_SOUND_BEAT_CLICK=Beat-Click
+SING_OPTIONS_SOUND_THRESHOLD=Rauschunterdr.
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=2-Spieler-Modus
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Vorschau Lautst.
+SING_OPTIONS_SOUND_PREVIEWFADING=Vorschau Fading
+
+SING_OPTIONS_LYRICS_WHEREAMI=Optionen Lyrics
+SING_OPTIONS_LYRICS_DESC=Einstellungen für die Lyrics
+SING_OPTIONS_LYRICS_FONT=Schriftart
+SING_OPTIONS_LYRICS_EFFECT=Effekt
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmisation
+
+SING_OPTIONS_THEMES_WHEREAMI=Optionen Themes
+SING_OPTIONS_THEMES_DESC=Einstellungen für Theme und Skin
+SING_OPTIONS_THEMES_THEME=Theme
+SING_OPTIONS_THEMES_SKIN=Skin
+SING_OPTIONS_THEMES_COLOR=Farbe
+
+SING_OPTIONS_RECORD_WHEREAMI=Optionen Aufnahme
+SING_OPTIONS_RECORD_DESC=Einstellungen für die Mikrofone
+SING_OPTIONS_RECORD_CARD=Soundkarte
+SING_OPTIONS_RECORD_INPUT=Eingang
+SING_OPTIONS_RECORD_CHANNELL=Linker Kanal
+SING_OPTIONS_RECORD_CHANNELR=Rechter Kanal
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Optionen Erweitert
+SING_OPTIONS_ADVANCED_DESC=Erweiterte Einstellungen
+SING_OPTIONS_ADVANCED_EFFECTSING=Singeffekte
+SING_OPTIONS_ADVANCED_SCREENFADE=Bildschirm-Fade
+SING_OPTIONS_ADVANCED_LOADANIMATION=Lade-Animation
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Sicherheitsabfr.
+SING_OPTIONS_ADVANCED_LINEBONUS=Phrasenbonus
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=Wie oft gesungen mitzählen
+SING_OPTIONS_ADVANCED_ONSONGCLICK=nach Song-Wahl
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto Party-Menü
+
+SING_LEGEND_SELECT=Auswählen
+SING_LEGEND_NAVIGATE=Navigieren
+SING_LEGEND_CONTINUE=Weiter
+SING_LEGEND_ESC=Zurück
+
+SING_PLAYER_DESC=Spielernamen eingeben.
+SING_PLAYER_WHEREAMI=Spielernamen
+SING_PLAYER_ENTER_NAME=Namen eingeben
+
+SING_DIFFICULTY_DESC=Schwierigkeitsgrad auswählen
+SING_DIFFICULTY_WHEREAMI=Schwierigkeitsgrad
+SING_DIFFICULTY_CONTINUE=zur Song-Auswahl
+SING_EASY=Einfach
+SING_MEDIUM=Mittel
+SING_HARD=Schwierig
+
+SING_SONG_SELECTION_DESC=Wähle deinen Song
+SING_SONG_SELECTION_WHEREAMI=Song-Auswahl
+SING_SONG_SELECTION_GOTO=Gehe zu ..
+SING_SONG_SELECTION=Song-Auswahl
+SING_SONG_SELECTION_MENU=Menü
+SING_SONG_SELECTION_PLAYLIST=Playlist
+SING_SONGS_IN_CAT=Songs
+PLAYLIST_CATTEXT=Playlist: %s
+
+SING_TIME=ZEIT
+SING_TOTAL=Gesamt
+SING_MODE=Singmodus
+SING_NOTES=Noten
+SING_GOLDEN_NOTES=Goldener Ton
+SING_PHRASE_BONUS=Phrasenbonus
+
+SING_MENU=Hauptmenü
+
+SONG_SCORE=Song Punkte
+SONG_SCORE_WHEREAMI=Punkte
+
+SING_SCORE_TONE_DEAF=Anti-Talent
+SING_SCORE_AMATEUR=Amateur
+SING_SCORE_RISING_STAR=Möchtegern
+SING_SCORE_LEAD_SINGER=Sternchen
+SING_SCORE_HIT_ARTIST=Hit-Künstler
+SING_SCORE_SUPERSTAR=Superstar
+SING_SCORE_ULTRASTAR=UltraStar
+
+POPUP_PERFECT=Perfekt!
+POPUP_AWESOME=Super!
+POPUP_GREAT=Cool!
+POPUP_GOOD=Gut!
+POPUP_NOTBAD=O.K.!
+POPUP_BAD=Schlecht!
+POPUP_POOR=Mies!
+POPUP_AWFUL=Grausam!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= und
+
+SONG_MENU_NAME_MAIN=Menü
+SONG_MENU_PLAY=Singen
+SONG_MENU_CHANGEPLAYERS=Spieler wechseln
+SONG_MENU_EDIT=Editor
+SONG_MENU_MODI=Einen Modus singen
+SONG_MENU_CANCEL=Abbrechen
+
+SONG_MENU_NAME_PLAYLIST=Menü
+SONG_MENU_PLAYLIST_ADD=Song zu Playlist hinzufügen
+SONG_MENU_PLAYLIST_DEL=Song aus Playlist löschen
+
+SONG_MENU_NAME_PLAYLIST_ADD=Song hinzufügen
+SONG_MENU_PLAYLIST_ADD_NEW=Zu neuer Playlist
+SONG_MENU_PLAYLIST_ADD_EXISTING=Zu existierender Playlist
+SONG_MENU_PLAYLIST_NOEXISTING=Keine Playlist vorhanden
+
+SONG_MENU_NAME_PLAYLIST_NEW=Neue Playlist
+SONG_MENU_PLAYLIST_NEW_CREATE=Erstellen
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Unbenannt
+
+SONG_MENU_NAME_PLAYLIST_DELITEM=Wirklich löschen?
+SONG_MENU_YES=Ja
+SONG_MENU_NO=Nein
+
+SONG_MENU_NAME_PLAYLIST_DEL=Playlist löschen?
+
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Playlist öffnen
+SONG_MENU_PLAYLIST_LOAD=Öffnen
+SONG_MENU_PLAYLIST_DELCURRENT=Aktuelle Playlist löschen
+
+SONG_MENU_NAME_PARTY_MAIN=Party-Menü
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=Joker spielen
+
+SONG_JUMPTO_DESC=Song suchen
+SONG_JUMPTO_TYPE_DESC=Suchen in:
+SONG_JUMPTO_TYPE1=Allem
+SONG_JUMPTO_TYPE2=Titel
+SONG_JUMPTO_TYPE3=Artist
+SONG_JUMPTO_SONGSFOUND=%d Song(s) gefunden
+SONG_JUMPTO_NOSONGSFOUND=Keinen Song gefunden
+SONG_JUMPTO_HELP=Text eingeben um zu suchen
+SONG_JUMPTO_CATTEXT=Suche nach: %s
+
+PARTY_MODE=Party-Modus
+PARTY_DIFFICULTY=Schwierigkeit
+PARTY_PLAYLIST=Playlist-Modus
+PARTY_PLAYLIST_ALL=Alle Lieder
+PARTY_PLAYLIST_CATEGORY=Ordner
+PARTY_PLAYLIST_PLAYLIST=Playlist
+PARTY_ROUNDS=Runden
+PARTY_TEAMS=Teams
+PARTY_TEAMS_PLAYER1=Spieler Team 1
+PARTY_TEAMS_PLAYER2=Spieler Team 2
+PARTY_TEAMS_PLAYER3=Spieler Team 3
+
+PARTY_LEGEND_CONTINUE=weiter
+
+PARTY_OPTIONS_DESC=Einstellungen für das Partyspiel.
+PARTY_OPTIONS_WHEREAMI=Party Optionen
+
+PARTY_PLAYER_DESC=Team- und Spielernamen eingeben.
+PARTY_PLAYER_WHEREAMI=Party Spielernamen
+PARTY_PLAYER_ENTER_NAME=Namen eingeben
+PARTY_PLAYER_LEGEND_CONTINUE=Party-Spiel starten
+
+PARTY_ROUND_DESC=Die nächsten Spieler an die Mikros!
+PARTY_ROUND_WHEREAMI=Party nächste Runde
+PARTY_ROUND_LEGEND_CONTINUE=Runde starten
+
+PARTY_SONG_WHEREAMI=Party Song-Auswahl
+PARTY_SONG_LEGEND_CONTINUE=Singen
+PARTY_SONG_MENU=Party-Menü
+
+PARTY_SCORE_DESC=Punkte der letzten Runde.
+PARTY_SCORE_WHEREAMI=Party Punkte
+
+PARTY_WIN_DESC=Sieger des Partyspiels.
+PARTY_WIN_WHEREAMI=Party Sieger
+PARTY_WIN_LEGEND_CONTINUE=zurück zum Hauptmenü
+
+PARTY_ROUND=Runde
+PARTY_ROUND_WINNER=Sieger
+PARTY_NOTPLAYEDYET=Noch nicht gespielt
+PARTY_NOBODY=Niemand
+NEXT_ROUND=Nächste Runde:
+
+PARTY_DISMISSED=Ausgeschieden
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=hat gewonnen!
+
+PLUGIN_HDL_NAME=Balken halten
+PLUGIN_HDL_DESC=Halte die Bewertungsanzeige im angezeigten Bereich.
+
+PLUGIN_UNTIL5000_NAME=Bis 5000
+PLUGIN_UNTIL5000_DESC=Wer zuerst 5000 Punkte hat, gewinnt.
+
+PLUGIN_DUELL_NAME=Duell
+PLUGIN_DUELL_DESC=Normales Spiel. Höchste Punktzahl gewinnt.
+
+PLUGIN_BLIND_NAME=Blind Mode
+PLUGIN_BLIND_DESC=Erreiche blind die höchste Punktzahl.
+
+PLUGIN_TEAMDUELL_NAME=Teamsingen
+PLUGIN_TEAMDUELL_DESC=Gib das Mikro weiter!
+
+STAT_MAIN=Statistiken
+STAT_MAIN_DESC=Allgemein
+STAT_MAIN_WHEREAMI=Statistiken
+
+STAT_OVERVIEW_INTRO=%0:s Statistiken. \n Letzter Reset am %1:.2d.%2:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Songs(%3:d mit Video), davon wurden %1:d schon einmal gesungen und %2:d noch nicht. \n Der am häufigsten gesungene Song ist %5:s von %4:s.
+STAT_OVERVIEW_PLAYER=Seit dem letzten Reset haben %0:d verschiedene Spieler gesungen. \n Der beste Spieler ist %1:s mit %2:d Punkten. \n Die höchste Punktzahl, %4:d, wurde von %3:s erreicht.
+
+STAT_DETAIL=Statistiken
+STAT_DETAIL_WHEREAMI=Detaillierte Statistiken
+
+STAT_NEXT=Nächste Seite
+STAT_PREV=Vorherige Seite
+STAT_REVERSE=Umkehren
+STAT_PAGE=Seite %0:d von %1:d \n (%2:d von %3:d Einträgen)
+
+STAT_DESC_SONGS=Beliebteste Songs
+STAT_DESC_SONGS_REVERSED=Unbeliebteste Songs
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx gesungen
+
+STAT_DESC_BANDS=Beliebteste Bands
+STAT_DESC_BANDS_REVERSED=Unbeliebteste Bands
+STAT_FORMAT_BANDS=%0:s \n Gesungene Songs: %1:d
+
+MSG_ERROR_TITLE=Fehler
+MSG_QUESTION_TITLE=Frage
+MSG_QUIT_USDX=UltraStar wirklich verlassen?
+MSG_END_PARTY=Party-Modus beenden?
+ERROR_NO_SONGS=Keine Songs vorhanden.
+ERROR_NO_PLUGINS=Keine Plugins vorhanden.
+ERROR_CORRUPT_SONG=Song konnte nicht geladen werden.
+
+#-------------------------------------------------------#
+# NEW/CHANGED TEXTS for M2-MOD #
+#-------------------------------------------------------#
+
+#### ScreenOptionsGraphic ####
+;new:
+SING_OPTIONS_GRAPHICS_MOVIE_PREVIEW=Videovorschau
+
+#### ScreenMain ####
+;new:
+SING_PARTY=Party
+;delete old ones!
+SING_MULTI=Classic
+SING_MULTI_DESC=Party Classic-Modus singen
+
+;new:
+SING_MULTI_M2=Challenge
+SING_MULTI_M2_DESC=Party Challenge-Modus singen
+
+#### ScreenPartyOptionsM2 ####
+;new:
+PARTY_MODE_M2=Party Challenge-Modus
+PARTY_OPTIONS_M2_DESC=wähle Challenge Optionen
+PARTY_OPTIONS_M2_WHEREAMI=Challenge Optionen
+PARTY_TEAMS_PLAYER_M2=Spieler
+PARTY_OPTIONS_M2_SELECT_PLUGIN=Plugins zulassen
+PARTY_OPTIONS_M2_SELECT_HANDICAP=Handicap Modus
+
+#### ScreenPartyPlayerM2 ####
+;new:
+PARTY_PLAYERM2_DESC=Spielernamen eingeben
+PARTY_PLAYERM2_WHEREAMI=Spielernamen
+
+#### ScreenPartyNewRoundM2 ####
+;new:
+PARTY_ROUNDM2_DESC=Übersicht
+PARTY_ROUNDM2_WHEREAMI=Challenge Übersicht
+PARTY_ROUNDM2_LEGEND_CONTINUE=Nächste Runde
+PARTY_ROUNDM2=Runde
+PARTY_ROUNDM2_RESULT=Ergebnis
+PARTY_ROUNDM2_NUMBER=
+PARTY_ROUNDM2_NAME=Name
+PARTY_ROUNDM2_WINS=S
+PARTY_ROUNDM2_DRAFTS=U
+PARTY_ROUNDM2_DEFEATS=N
+PARTY_ROUNDM2_SCORE_DIFF=P-diff
+PARTY_ROUNDM2_POINTS=P
+PARTY_ROUNDM2_LEGEND_SCROLL=Scrollen
+PARTY_ROUNDM2_END=Ende
+
+#### SreenSong in M2 mode ####
+;new:
+PARTY_SONG_WHEREAMI_M2=Challange Songauswahl
+
+#### ScreenTop ####
+;delete old ones!
+SING_TOP_CHARTS=Top 8 Spieler
+SING_TOP_CHARTS_WHEREAMI=Top 8
+SING_TOP_CHARTS_CONTINUE=Zur Songauswahl
+
+#### Stats ####
+;new:
+STAT_FORMAT_DATE=%0:.2d.%1:.2d.%2:d
+;delete old ones!
+STAT_DESC_SCORES=Highscores
+STAT_DESC_SCORES_REVERSED=Lowscores
+STAT_FORMAT_SCORES=%0:s - %1:d (am %5:s) [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Beste Sänger
+STAT_DESC_SINGERS_REVERSED=Schlechteste Sänger
+STAT_FORMAT_SINGERS=%0:s \n Durchschnittliche Punktzahl: %1:d (%2:dx gesungen)
+
+#### Plugins ####
+;new:
+PLUGIN_NOSCORE_NAME=No Score
+PLUGIN_NOSCORE_DESC=Ein Duell ohne Punkteanzeige.
+
+PLUGIN_MORE500_NAME=Mehr als 500
+PLUGIN_MORE500_DESC=Erreiche einen Abstand von 500 Punkten.
+
+PLUGIN_MORE1000_NAME=Mehr als 1000
+PLUGIN_MORE1000_DESC=Erreiche einen Abstand von 1000 Punkten.
+
+PLUGIN_HAUDENLUKAS_NAME=Hau den Lukas
+PLUGIN_HAUDENLUKAS_DESC=Triff die Töne und gewinne!
+
+PLUGIN_MEDLEY_NAME=Medley
+PLUGIN_MEDLEY_DESC=Singe bis zu 5 Lieder in einem Medley
+
+PLUGIN_MEDLEYBLIND_NAME=Medley blind
+PLUGIN_MEDLEYBLIND_DESC=Singe bis zu 5 Lieder blind in einem Medley
+
+PLUGIN_MEDLEYNOSCORE_NAME=Medley no score
+PLUGIN_MEDLEYNOSCORE_DESC=Singe bis zu 5 Lieder ohne Punkteanzeige in einem Medley
+
+PLUGIN_MEDLEYSURPRISE_NAME=Medley Surprise
+PLUGIN_MEDLEYSURPRISE_DESC=Nur das erste Lied darf man aussuchen.
+
+PLUGIN_MEDLEYSURPRISEBLIND_NAME=Medley Surprise 2
+PLUGIN_MEDLEYSURPRISEBLIND_DESC=Nur das erste Lied darf man aussuchen, blind.
+
+#### ScreenSing ####
+;new
+VIDEO_ASPECT_STRETCH=Stretch
+VIDEO_ASPECT_CROP=Crop
+VIDEO_ASPECT_LETTER_BOX=Letter Box
+
+#### ScreenScore ####
+;new
+SCORE_LEGEND_SCROLL=Scrollen
+
+#### ScreenEditSub ####
+;new
+INFO_FILE_SAVED=Datei gespeichert
+ERROR_SAVE_FILE_FAILED=Fehler beim Speichern
+
+#### HelpPopup ####
+;new
+MSG_HELP_TITLE=Hilfe-System
+MSG_HELP_KEYMAP=Tastenbelegung
+
+#-------------------------------------------------------#
+# Help System #
+#-------------------------------------------------------#
+
+[config]
+NumIDs = 33
+
+[Keymap]
+ESC=Esc
+CTRL=Strg
+ALT=Alt
+SHIFT=Shift
+BACKQUOTE=#
+BACKSPACE=Rück
+EQUALS=`
+MINUS=ß
+SLASH=-
+PERIOD=.
+RIGHT=Rechts
+LEFT=Links
+DOWN=Runter
+UP=Hoch
+SPACE=Leertaste
+KPPLUS=Key-Pad +
+KPMINUS=Key-Pad -
+DELETE=Del
+RETURN=Enter
+PRINT=Druck
+F1F12=F1..F12
+PAGEUP=Bild Rauf
+PAGEDOWN=Bild Runter
+AZ=A..Z
+A=A
+B=B
+C=C
+D=D
+E=E
+F=F
+G=G
+H=H
+I=I
+J=J
+K=K
+L=L
+M=M
+N=N
+O=O
+P=P
+Q=Q
+R=R
+S=S
+T=T
+U=U
+V=V
+W=W
+X=X
+Y=Z
+Z=Y
+0=0
+1=1
+2=2
+3=3
+4=4
+5=5
+6=6
+7=7
+8=8
+9=9
+F1=F1
+F2=F2
+F3=F3
+F4=F4
+F5=F5
+F6=F6
+F7=F7
+F8=F8
+F9=F9
+F10=F10
+F11=F11
+F12=F12
+
+#### IDs must have the format: 'ID_###'
+
+#-------------------------------------------------------#
+# ID_001: UScreenEdit #
+#-------------------------------------------------------#
+[ID_001]
+Title = Song-Editor
+Description = Hier können Songs editiert werden.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+S = Song speichern (#RELATIVE:No)
+SHIFT_S = Song speichern (#RELATIVE:Yes)
+ESC = Editor verlassen / Im Textmodus: Bearbeitung abbrechen
+R = Song neu laden
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+PAGEUP = MP3-Lautstärke um 5% erhöhen
+PAGEDOWN = MP3-Lautstärke um 5% reduzieren
+#-------------------------------------------------------#
+SEC_010 = Medley/PreviewStart
+A = gewählte Note als Medley-Anfang setzen/löschen
+SHIFT_A = gewählte Note als Medley-Ende setzen/löschen
+J = Zum Medley-Anfang springen
+SHIFT_J = Zum Medley-Ende springen
+ALT_J = Medley abspielen
+K = gewählte Note als PreviewStart setzen
+SHIFT_K = Zum PreviewStart springen
+#-------------------------------------------------------#
+SEC_020 = Grundsteuerung
+P = MP3+Noteneinsatzklicks der gesamten Zeile abspielen
+SHIFT_P = MIDI der gesamten Zeile abspielen
+CTRL_SHIFT_P = MP3+Noteneinsatzklicks+MIDI der gesamten Zeile abspielen
+ALT_P = MP3+Noteneinsatzclicks ab aktueller Zeile bis zum Liedende abspielen
+SHIFT_ALT_P = MIDI ab aktueller Zeile bis zum Liedende abspielen
+CTRL_SHIFT_ALT_P = MP3+Noteneinsatzklicks+MIDI ab aktueller Zeile bis zum Liedende abspielen
+SPACE = MP3 der gewählten Note/Silbe abspielen
+SHIFT_SPACE = MIDI der gewählten Note/Silbe abspielen
+CTRL_SHIFT_SPACE = MP3+MIDI der gewählten Note/Silbe abspielen
+RIGHT = Zur nächsten Note/Silbe springen
+LEFT = Zur vorhergehenden Note/Silbe springen
+DOWN = Zur nächsten Liedzeile springen
+UP = Zur vorhergehenden Zeile springen
+#-------------------------------------------------------#
+SEC_030 = Noten
+G = Goldenen Ton setzen/löschen
+F = Freestyle Note setzten/löschen
+SHIFT_C = Überflüssige Leerzeichen in aktueller Zeile löschen
+CTRL_DELETE = Markierte Note/Silbe löschen
+CTRL_SLASH = Note teilen
+SHIFT_LEFT = Note nach links veschieben
+SHIFT_RIGHT = Note nach rechts veschieben
+CTRL_LEFT = Notenanfang nach links verschieben (Note verlängern)
+CTRL_RIGHT = Notenanfang nach rechts verschieben (Note verkürzen)
+ALT_LEFT = Notenende nach links verschieben (Note verkürzen)
+ALT_RIGHT = Notenende nach rechts verschieben (Note verlängern)
+BACKQUOTE = Note verlängern (wie [ALT]+[Rechts])
+CTRL_ALT_SHIFT_LEFT = Alle Noten ab der gewählten Note bis zum Liedende nach links verschieben
+CTRL_ALT_SHIFT_RIGHT = Alle Noten ab der gewählten Note bis zum Liedende nach rechts verschieben
+#-------------------------------------------------------#
+SEC_040 = Tonhöhe
+KPPLUS = Tonhöhe aller Noten um einen Halbtonschritt erhöhen
+KPMINUS = Tonhöhe aller Noten um einen Halbtonschritt verringern
+CTRL_UP = Tonhöhe der markierten Note um einen Halbtonschritt erhöhen
+CTRL_DOWN = Tonhöhe der markierten Note um einen Halbtonschritt verringern
+SHIFT_KPMINUS = Tonhöhe aller Noten um eine Oktave (12 Halbtonschritte) verringern
+SHIFT_KPPLUS = Tonhöhe aller Noten um eine Oktave (12 Halbtonschritte) erhöhen
+#-------------------------------------------------------#
+SEC_050 = Songtext
+F4 = Textbearbeitungs Modus starten (bzw. ohne Speichern beenden)
+RETURN = Textmodus beenden und Änderungen speichern
+BACKSPACE = Im Textmodus: Zeichen löschen
+C = Anfangsbuchstaben der Zeile groß schreiben
+PERIOD = Den ausgewählten Text dem nächsten Ton zuordnen
+T = Zeiten für Zeilenwechsel korrigieren
+SLASH = Zeilenumbruch vor der markierten Note einfügen
+SHIFT_SLASH = Aktuelle Zeile mit der darauffolgenden zusammenführen
+#-------------------------------------------------------#
+SEC_060 = GAP (Zeitverzögerung)
+0 = GAP um 10ms erhöhen
+SHIFT_0 = GAP um 1000ms erhöhen
+9 = GAP um 10ms reduzieren
+SHIFT_9 = GAP um 1000ms reduzieren
+#-------------------------------------------------------#
+SEC_070 = BPM (Beats per minute)
+CTRL_EQUALS = BPM um 0,01 erhöhen
+CTRL_MINUS = BPM um 0,01 reduzieren
+EQUALS = BPM um 0,05 erhöhen
+MINUS = BPM um 0,05 reduzieren
+SHIFT_EQUALS = BPM um 1,00 erhöhen
+SHIFT_MINUS = BPM um 1,00 reduzieren
+M = BMP und Notenzeitwerte verdoppeln
+D = BMP und Notenzeitwerte halbieren
+#-------------------------------------------------------#
+SEC_080 = Sonstiges
+CTRL_C = Zeile kopieren
+CTRL_V = Zeile einfügen
+CTRL_SHIFT_V = unbekannt
+CTRL_SHIFT_4 = unbekannt
+CTRL_SHIFT_ALT_4 = unbekannt
+CTRL_SHIFT_5 = unbekannt
+CTRL_SHIFT_ALT_5 = unbekannt
+
+#-------------------------------------------------------#
+# ID_002: UScreenLevel #
+#-------------------------------------------------------#
+[ID_002]
+Title = Level auswählen
+Description = Hier kann der Schwierigkeitsgrad eingestellt werden. Die Schwierigkeitsgrade beeinflussen die notwendige Treffgenauigkeit der Notenhöhen.
+#-------------------------------------------------------#
+SUB_010=Leicht
+ENT_011=Erlaubt eine Abweichung von bis zu zwei Halbtönen in beide Richtungen, um Punkte für die Note zu bekommen.
+#-------------------------------------------------------#
+SUB_020=Mittel
+ENT_021=Erlaubt eine Abweichung von bis zu einem Halbton in beide Richtungen, um Punkte für die Note zu bekommen.
+#-------------------------------------------------------#
+SUB_030=Schwierig
+ENT_031=Die Note muss exakt getroffen werden, um Punkte für die Note zu bekommen.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Levelauswahl
+LEFT = Linksherum durch die Auswahl gehen
+UP = Linksherum durch die Auswahl gehen
+RIGHT = Rechtsherum durch die Auswahl gehen
+DOWN = Rechtsherum durch die Auswahl gehen
+RETURN = Level setzen und weiter zur Songauswahl
+
+#-------------------------------------------------------#
+# ID_003: UScreenMain #
+#-------------------------------------------------------#
+[ID_003]
+Title = Hauptbildschirm
+Description = Dies ist das UltraStar Deluxe Startmenü.
+#-------------------------------------------------------#
+SUB_010=Singen
+ENT_011=Freie Wahl von Liedern und Spielern.
+ENT_012=Man kann hier die Lieder normal singen oder den Medley-Modus starten.
+#-------------------------------------------------------#
+SUB_020=Party
+ENT_021=Hier hat man die Wahl zwischen zwei unterschiedlichen Party-Modi.
+ENT_022=Classic: Spiele mit bis zu 12 Spielern in 3 Teams. Verschiedene Party-Plugins sorgen für Abwechslung.
+ENT_023=Challenge: Spiele mit bis zu 9 Spielern eine Art Meisterschaft bei der, ähnlich wie beim Fußball, die Rundenergebnisse tabellarisch zusammengefasst werden.
+#-------------------------------------------------------#
+SUB_030=Tools
+ENT_031=Über diesen Menüpunkt können Spielstatistiken, der interne Editor und das Optionsmenü aufgerufen werden.
+ENT_032=Statistiken: beinhalten Informationen über Highscores, beste Sänger, beliebteste Songs und Bands.
+ENT_033=Editor: hiermit lassen sich vorhandene MIDI-Dateien in UltraStar Lieder konvertieren.
+ENT_034=Optionen: hier lassen sich viele Einstellungen für das Verhalten von UltraStar Deluxe vornehmen.
+#-------------------------------------------------------#
+SUB_040=Beenden
+ENT_041=Hiermit beendet man UltraStar Deluxe nach Bestätigen einer Sicherheitsabfrage.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahl links
+UP = Auswahl hoch
+RIGHT = Auswahl rechts
+DOWN = Auswahl runter
+RETURN = aktuelle Auswahl bestätigen
+#-------------------------------------------------------#
+SEC_020 = Tastenkürzel
+M = Party --> Classic: startet den Classic Party Modus
+SHIFT_M = Party --> Challenge: startet den Challenge Modus
+S = Tools --> Statistiken: zeigt die Statistiken direkt an
+E = Tools --> Editor: startet den Editor
+ALT_C = Credits aufrufen
+
+#-------------------------------------------------------#
+# ID_004: UScreenName #
+#-------------------------------------------------------#
+[ID_004]
+Title = Spielernamen eingeben
+Description = Hier können die Spielernamen eingegeben werden. Die Anzahl der Spieler richtet sich nach der Einstellung unter Optionen --> Spiel --> Spieler.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahl links
+UP = Auswahl hoch
+RIGHT = Auswahl rechts
+DOWN = Auswahl runter
+RETURN = alle Spielernamen bestätigen und weiter
+#-------------------------------------------------------#
+SEC_020 = Namen ändern
+BACKSPACE = letzten Buchstaben löschen
+ALT_F1F12 = aktuellen Namen als Template 1..12 speichern
+F1F12 = Template 1..12 in gewähltes Namensfeld übernehmen
+
+#-------------------------------------------------------#
+# ID_006: UScreenOptions #
+#-------------------------------------------------------#
+[ID_006]
+Title = Hauptmenü Optionen
+Description = Von hier aus gelangt man zu allen Einstellungen, die das Aussehen und Verhalten von UltraStar Deluxe beeinflussen.
+#-------------------------------------------------------#
+SUB_010=Spiel
+ENT_011=Einstellungen zur Spieleranzahl, zur Standardschwierigkeitsstufe, zur Spielsprache, zur Anzeige von Kategorien, zur Liedsortierung und zum Debugmodus.
+#-------------------------------------------------------#
+SUB_020=Grafik
+ENT_021=Einstellungen zur Spielauflösung, zum Vollbildmodus, zur Farbtiefe, zur Anzeige eines Oszilloskop, zur Videogröße und zur Videovorschau.
+#-------------------------------------------------------#
+SUB_030=Sound
+ENT_031=Einstellungen zur Mikrofonverstärkung, zum Click-Assistenten, zu den Beat-Clicks, zur Rauschunterdrückung, zur Vorschau-Lautstärke und zum Vorschau-Fading.
+#-------------------------------------------------------#
+SUB_040=Lyrics
+ENT_041=Einstellungen zur Schriftart, zum Animationseffekt und zur Solmisation des Liedtextes
+#-------------------------------------------------------#
+SUB_050=Themes
+ENT_051=Einstellungen zum Theme, zum Skin und zur Farbe
+#-------------------------------------------------------#
+SUB_060=Aufnahme
+ENT_061=Einstellungen zu verwendeten Soundkarten, zu Audioeingängen und zu Kanalbelegungen
+#-------------------------------------------------------#
+SUB_070=Erweitert
+ENT_071=Einstellungen zum Bildschirm-Fade, zu den Singeffekten, zum Phrasenbonus, etc.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahl links
+UP = Auswahl hoch
+RIGHT = Auswahl rechts
+DOWN = Auswahl runter
+RETURN = aktuelle Auswahl bestätigen
+
+#-------------------------------------------------------#
+# ID_007: UScreenOptionsAdvanced #
+#-------------------------------------------------------#
+[ID_007]
+Title = Erweiterte Optionen
+Description = Hier findet man die erweiterten Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Bildschirm-Fade
+ENT_011=Schaltet die Überblendung zwischen den einzelnen Screens an oder aus.
+#-------------------------------------------------------#
+SUB_020=Singeffekte
+ENT_021=Schaltet Animationen bei Goldenen Noten und Ähnliches an oder aus.
+#-------------------------------------------------------#
+SUB_030=Phrasenbonus
+ENT_031=Legt fest, an welcher Stelle der Phrasenbonus angezeigt wird.
+#-------------------------------------------------------#
+SUB_040=nach Song-Wahl
+ENT_041=Legt fest, ob nach der Songauswahl direkt gesungen wird oder erst die Spieler festgelegt werden.
+#-------------------------------------------------------#
+SUB_050=Sicherheitsabfrage
+ENT_051=Legt fest, ob beim Verlassen von Ultrastar Deluxe eine Sicherheitsabfrage stattfindet.
+#-------------------------------------------------------#
+SUB_060=Auto Party-Menü
+ENT_061=Legt fest, ob das Party-Menü zur Jokerauswahl bei jedem neuen Lied automatisch angezeigt werden soll.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlmöglichkeiten der gewählten Einstellung nach links durchgehen
+UP = Vorherige Einstellungsoption wählen
+RIGHT = Auswahlmöglichkeiten der gewählten Einstellung nach rechts durchgehen
+DOWN = Nächste Einstellungsoption wählen
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_008: UScreenOptionsGame #
+#-------------------------------------------------------#
+[ID_008]
+Title = Spiel-Optionen
+Description = Hier findet man die grundlegenden Spiel-Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Spieler
+ENT_011=Legt die Anzahl der Spieler fest. Auf einem Bildschirm können maximal 3 Spieler gleichzeitig singen, auf zwei Bildschirmen sind es 4 bzw. 6 Spieler.
+#-------------------------------------------------------#
+SUB_020=Schwierigkeit
+ENT_021=Legt die standardmäßig eingestellte Schwierigkeitsstufe fest.
+#-------------------------------------------------------#
+SUB_030=Sprache
+ENT_031=Legt die Spielsprache fest.
+#-------------------------------------------------------#
+SUB_040=Ordner
+ENT_041=Legt fest, ob die Lieder gemäß der Sortierung in einzelnen Ordnern/Kategorien angezeigt werden oder nicht (Neustart erforderlich).
+#-------------------------------------------------------#
+SUB_050=Sortierung
+ENT_051=Legt fest, nach welchen Kriterium die Lieder sortiert werden.
+#-------------------------------------------------------#
+SUB_060=Debug
+ENT_061=Legt fest, ob Debug-Informationen wie Bildwiederholfrequenz angezeigt werden.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_009: UScreenOptionsGraphics #
+#-------------------------------------------------------#
+[ID_009]
+Title = Grafik-Optionen
+Description = Hier findet man die Grafik-Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Auflösung
+ENT_011=Legt die Auflösung des Spiels fest. Das Spiel wird in jedem Fall auf eine Auflösung von 800x600 gerendet und anschließend nur noch auf die gewählte Auflösung skaliert.
+#-------------------------------------------------------#
+SUB_020=Vollbild
+ENT_021=Legt fest, ob das Spiel im Vollbild- oder im Fenstermodus angezeigt werden soll (Neustart erforderlich).
+#-------------------------------------------------------#
+SUB_030=Farbtiefe
+ENT_031=Legt die Farbtiefe des Spiels fest.
+#-------------------------------------------------------#
+SUB_040=Oszilloskop
+ENT_041=Legt fest, ob beim Singen ein Oszilloskop für den Mikrofonausschlag angezeigt wird.
+#-------------------------------------------------------#
+SUB_050=Videogröße
+ENT_051=Legt fest, ob und in welcher Größe Videos angezeigt werden.
+#-------------------------------------------------------#
+SUB_060=Videovorschau
+ENT_061=Legt fest, ob bei der Liedauswahl eine Videovorschau angezeigt wird.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_010: UScreenOptionsLyrics #
+#-------------------------------------------------------#
+[ID_010]
+Title = Liedtext-Optionen
+Description = Hier findet man die Liedtext-Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Schriftart
+ENT_011=Legt die Schriftart des Liedtextes fest.
+#-------------------------------------------------------#
+SUB_020=Effekt
+ENT_021=Legt den Animationseffekt für die zu singende Silbe fest.
+#-------------------------------------------------------#
+SUB_030=Solmisation
+ENT_031=Legt fest, ob und wenn ja, welche Solmisation verwendet werden soll. Dabei wird der Liedtext durch die entsprechenden Tonsilben ersetzt.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_011: UScreenOptionsRecord #
+#-------------------------------------------------------#
+[ID_011]
+Title = Aufnahme Optionen
+Description = Hier findet man die Aufnahme- und Mikrofon-Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Soundkarte
+ENT_011=Legt die einzustellende Soundkarte fest.
+#-------------------------------------------------------#
+SUB_020=Eingang
+ENT_021=Legt den verwendeten Eingang der Soundkarte fest.
+#-------------------------------------------------------#
+SUB_030=Linker Kanal
+ENT_031=Legt fest, welcher Spielernummer der linke Aufnahmekanal zugeordnet ist.
+#-------------------------------------------------------#
+SUB_040=Rechter Kanals
+ENT_041=Legt fest, welcher Spielernummer der rechte Aufnahmekanal zugeordnet ist.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_012: UScreenOptionsSound #
+#-------------------------------------------------------#
+[ID_012]
+Title = Sound Optionen
+Description = Hier findet man die Sound-Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Mic-Anhebung
+ENT_011=Legt die Mikrofonverstärkung innerhalb von UltraStar Deluxe fest.
+#-------------------------------------------------------#
+SUB_020=Click-Assistent
+ENT_021=Legt fest, ob mit jedem Noteneinsatz ein Klick abgespielt wird.
+#-------------------------------------------------------#
+SUB_030=Beat-Click
+ENT_031=Legt fest, ob mit jedem Vierteltakt ein Klick abgespielt wird.
+#-------------------------------------------------------#
+SUB_040=Rauschunterdrückung
+ENT_041=Legt die Rauschumnterdrückung beim Mikrofonsignal fest.
+#-------------------------------------------------------#
+SUB_050=Vorschau-Lautstärke
+ENT_051=Legt die Lautstärke bei der Liedvorschau in der Liedauswahl fest.
+#-------------------------------------------------------#
+SUB_060=Vorschau-Fading
+ENT_061=Legt die Wartezeit bis zum Abspielen der Liedvorschau fest.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_013: UScreenOptionsThemes #
+#-------------------------------------------------------#
+[ID_013]
+Title = Themes Optionen
+Description = Hier findet man die Theme- und Skin-Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Theme
+ENT_011=Legt das Spiel-Theme und damit die Anordnung der einzelnen Elemente fest.
+#-------------------------------------------------------#
+SUB_020=Skin
+ENT_021=Legt das Skin für das gewählte Theme fest.
+#-------------------------------------------------------#
+SUB_030=Farbe
+ENT_031=Legt die Hauptfarbe für das gewählte Theme und Skin fest.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_014: UScreenPartyNewRound #
+#-------------------------------------------------------#
+[ID_014]
+Title = Party Übersicht
+Description = Hier wird die Übersicht über den aktuellen Stand des Party-Modus angezeigt. Neben dem aktuellen Punktestand wird eine Liste über alle gespielten und noch zu spielenden Runden mit den zugehörigen Plugins sowie die folgende Runde und deren Spieler und Plugin angezeigt.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = Partymodus beenden (mit Sicherheitsabfrage)
+BACKSPACE = Partymodus beenden (mit Sicherheitsabfrage)
+RETURN = Nächste Runde starten
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_015: UScreenPartyOptions #
+#-------------------------------------------------------#
+[ID_015]
+Title = Optionen Party-Modus
+Description = Hier könnten die Optionen für den Party-Modus festgelegt werden.
+#-------------------------------------------------------#
+SUB_010=Schwierigkeit
+ENT_011=Legt das Schwierigkeitslevel für alle Runden des Party-Modus' fest.
+#-------------------------------------------------------#
+SUB_020=Playlist-Modus
+ENT_021=Legt fest, welche Liederauswahl für den Party-Modus zur Verfügung stehen. Werden Ordner oder Playlist gewählt, so wird im nächsten Punkt festgelegt, welcher Ordner bzw. welche Playlist verwendet wird.
+#-------------------------------------------------------#
+SUB_030=Runden
+ENT_031=Legt die Anzahl der zu spielenden Runden fest.
+#-------------------------------------------------------#
+SUB_040=Teams
+ENT_041=Legt die Anzahl der Teams fest.
+#-------------------------------------------------------#
+SUB_050=Spieler Team 1
+ENT_051=Legt die Anzahl der Spieler in Team 1 fest.
+#-------------------------------------------------------#
+SUB_060=Spieler Team 2
+ENT_061=Legt die Anzahl der Spieler in Team 2 fest.
+#-------------------------------------------------------#
+SUB_060=Spieler Team 3
+ENT_061=Legt die Anzahl der Spieler in Team 3 fest (nur, falls 3 Teams gewählt wurden).
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = weiter
+
+#-------------------------------------------------------#
+# ID_016: UScreenPartyPlayer #
+#-------------------------------------------------------#
+[ID_016]
+Title = Spielernameneingabe Party-Modus
+Description = Hier können die Team- und Spielernamen eingegeben werden.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahl links
+UP = Auswahl hoch
+RIGHT = Auswahl rechts
+DOWN = Auswahl runter
+RETURN = alle Spielernamen bestätigen und weiter
+#-------------------------------------------------------#
+SEC_020 = Namen ändern
+BACKSPACE = letzten Buchstaben löschen
+ALT_F1F12 = aktuellen Namen als Template 1..12 speichern
+F1F12 = Template 1..12 in gewähltes Namensfeld übernehmen
+
+#-------------------------------------------------------#
+# ID_017: UScreenPartyScore #
+#-------------------------------------------------------#
+[ID_017]
+Title = Ergebnis Party-Modus
+Description = Hier wird das Ergebnis und der Sieger der letzten Party-Runde angezeigt.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = weiter
+BACKSPACE = weiter
+RETURN = weiter
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_010: UScreenPartyWin #
+#-------------------------------------------------------#
+[ID_018]
+Title = Sieger Party-Modus
+Description = Hier wird der endgültige Sieger nach allen gespielten Party-Runden angezeigt.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_019: UScreenPartyNewRoundM2 #
+#-------------------------------------------------------#
+[ID_019]
+Title = Übersicht Challenge-Modus
+Description = Hier wird die Übersicht über den aktuellen Stand des Challenge-Modus' angezeigt. Es wird die Punktetabelle und die Begegnungstabelle sowie folgende Runde mit Spielern angezeigt.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_020: UScreenPartyOptionsM2 #
+#-------------------------------------------------------#
+[ID_020]
+Title = Optionen Challenge-Modus
+Description = Hier könnten die Optionen für den Challenge-Modus festgelegt werden.
+#-------------------------------------------------------#
+SUB_010=Schwierigkeit
+ENT_011=Legt das Schwierigkeitslevel für alle Runden des Challenge-Modus' fest.
+#-------------------------------------------------------#
+SUB_020=Playlist-Modus
+ENT_021=Legt fest, welche Liederauswahl für den Challenge-Modus zur Verfügung stehen. Werden Ordner oder Playlist gewählt, so wird im nächsten Punkt festgelegt, welcher Ordner bzw. welche Playlist verwendet wird.
+#-------------------------------------------------------#
+SUB_030=Spieler
+ENT_031=Legt die Anzahl der Spieler für den Challenge-Modus fest.
+#-------------------------------------------------------#
+SUB_040=Runden
+ENT_041=Legt die Anzahl der zu spielenden Runden fest.
+#-------------------------------------------------------#
+SUB_050=Plugins zulassen
+ENT_051=Legt fest, ob Party-Plugins verwendet werden.
+#-------------------------------------------------------#
+SUB_060=Handicap Modus
+ENT_061=Legt fest, ob schlechte Spieler bevorzugt und gute Spieler bei der Punktevergabe im Sinne der Chancenangleichung benachteiligt werden.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_021: UScreenPartyPlayerM2 #
+#-------------------------------------------------------#
+[ID_021]
+Title = Spielernamen Challenge-Modus
+Description = Hier können die Team- und Spielernamen eingegeben werden.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahl links
+UP = Auswahl hoch
+RIGHT = Auswahl rechts
+DOWN = Auswahl runter
+RETURN = alle Spielernamen bestätigen und weiter
+#-------------------------------------------------------#
+SEC_020 = Namen ändern
+BACKSPACE = letzten Buchstaben löschen
+ALT_F1F12 = aktuellen Namen als Template 1..12 speichern
+F1F12 = Template 1..12 in gewähltes Namensfeld übernehmen
+
+#-------------------------------------------------------#
+# ID_022: UScreenScore #
+#-------------------------------------------------------#
+[ID_022]
+Title = Ergebnisse
+Description = Hier werden die Punktzahlen der einzelnen Spieler nach dem Singen angezeigt. Dabei wird nicht nur die Gesamtpunktzahl, sondern ebenfalls der erreichte Phrasenbonus sowie die Bonuspunkte durch Goldene Noten angezeigt.
+#-------------------------------------------------------#
+SUB_010=Mögliche Gesangsbewertungen
+ENT_011=Anti-Talent (bis 2000 Punkte)
+ENT_012=Amateur (2010 bis 4000 Punkte)
+ENT_013=Möchtegern (4010 bis 6000 Punkte)
+ENT_014=Sternchen (6010 bis 8000 Punkte)
+ENT_015=Hit-Künstler (8010 bis 9000 Punkte)
+ENT_016=Superstar (9010 bis 9800 Punkte)
+ENT_017=UltraStar (9810 bis 10000 Punkte)
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+RETURN = zurück
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_023: UScreenSing #
+#-------------------------------------------------------#
+[ID_023]
+Title = Singbildschirm
+Description = Hier wird das ausgewählte Lied abgespielt. Dabei wird der Text des Liedes zeilenweise mit den zugehörigen Noten angezeigt.
+#-------------------------------------------------------#
+SUB_010=Punktevergabe
+ENT_011=Die maximal erreichbare Punktzahl inklusive aller Bonuspunkte ist für jedes Lied normiert auf 10000 Punkte.
+ENT_012=Jede Note, die richtig gesungen wird (in Abhängigkeit der eingestellten Schwierigkeitsstufe), gibt Punkte. Je länger die Note richtig gesungen wurde, desto mehr Punkte bekommt der Spieler.
+#-------------------------------------------------------#
+SUB_020=Phrasenbonus
+ENT_021=Zusätzlich erhält man für jede Zeile, die fehlerfrei gesungen wurden, einen Phrasenbonus.
+#-------------------------------------------------------#
+SUB_030=Goldene Noten
+ENT_031=Goldene Noten sind meist etwas schwerer zu treffen und geben daher ebenfalls Bonuspunkte.
+#-------------------------------------------------------#
+SUB_040=Freestyle Noten
+ENT_041=Freestyle Noten werden oft für gesprochene oder kaum bewertbare Passagen verwendet. Es werden hierfür keine Tonhöhen angezeigt, der Liedtext wird kursiv dargestellt und diese Teile geben keine Punkte. Hier darf nach Belieben mitgesprochen oder mitgegrölt werden!
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+P = Pause / Weiter
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+# ID_024: UScreenSong #
+#-------------------------------------------------------#
+[ID_024]
+Title = Liedauswahl
+Description = Hier werden alle vorhandenen Lieder für das normale Singen angezeigt. Scrollt durch die Liste oder verwendet die Suche, um euren Lieblingssong zu finden.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+V = Videovorschau vergrößern/verkleinern (falls vorhanden)
+A = Bildseitenverhältnis umschalten (nur im Vollbildmodus, wird gespeichert)
+#-------------------------------------------------------#
+SEC_010 = Songauswahl
+LEFT = Linksherum durch die Liedauswahl blättern
+RIGHT = Rechtsherum durch die Liedauswahl blättern
+UP = Zur vorherigen Kategorie wechseln (falls Kategorien aktiviert)
+DOWN = Zur nächsten Kategorie wechseln (falls Kategorien aktiviert)
+RETURN = Lied singen
+ALT_AZ = Zu Interpreten mit gewähltem Anfangsbuchstaben springen
+SHIFT_ALT_AZ = Zu Titeln mit gewähltem Anfangsbuchstaben springen
+M = Menü aufrufen (Singen / Spieler wechseln / Song zu Playlist hinzufügen / Editor)
+J = Suchmenü aufrufen
+P = Playliste öffnen
+R = Zufällig ein neues Lied anzeigen
+E = Editor mit ausgewähltem Lied starten
+#-------------------------------------------------------#
+SEC_020 = Medley
+S = Aktuelles Lied im Medley-Modus starten (falls Medley-Tags gesetzt)
+SHIFT_S = Aktuelles Lied im Medley-Modus starten (falls Medley-Tags gesetzt oder berechnet)
+D = Ein Medley mit bis zu 5 zufällig gewählten Liedern (mit gesetzten Medley-Tags) aus der aktuellen Kategorie starten
+SHIFT_D = Ein Medley mit bis zu 5 zufällig gewählten Liedern (mit gesetzten oder berechneten Medley-Tags) aus der aktuellen Kategorie starten
+F = Ein Medley mit bis zu 99 selbst gewählten Liedern (mit gesetzten Medley-Tags) zusammenstellen
+SHIFT_F = Letztes hinzugefügte Lied von der Medley-Playlist entfernen bzw. Medley-Modus deaktivieren, wenn die Playliste leer ist
+
+#-------------------------------------------------------#
+# ID_025: UScreenSong Party #
+#-------------------------------------------------------#
+[ID_025]
+Title = Liedauswahl Party-Modus
+Description = Hier werden alle vorhandenen Lieder im klassischen Party-Modus angezeigt.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = Party-Modus beenden (Menü aufrufen, falls geöffnet)
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+V = Videovorschau vergrößern/verkleinern (falls vorhanden)
+A = Bildseitenverhältnis umschalten (nur im Vollbildmodus, wird gespeichert)
+#-------------------------------------------------------#
+SEC_010 = Songauswahl
+RETURN = Menü aufrufen (Singen / Joker)
+ESC = Geöffnetes Song-Menü schließen
+M = Menü aufrufen (Singen / Joker)
+1 = per Zufall ein neues Lied aussuchen (Team 1 verwendet einen Joker)
+2 = per Zufall ein neues Lied aussuchen (Team 2 verwendet einen Joker)
+3 = per Zufall ein neues Lied aussuchen (Team 3 verwendet einen Joker; falls 3 Teams vorhanden)
+ALT_1 = per Zufall ein neues Lied aussuchen (kein Team verwendet einen Joker)
+ALT_2 = per Zufall ein neues Lied aussuchen (kein Team verwendet einen Joker)
+ALT_3 = per Zufall ein neues Lied aussuchen (kein Team verwendet einen Joker; falls 3 Teams vorhanden)
+
+#-------------------------------------------------------#
+# ID_026: UScreenSong Challenge #
+#-------------------------------------------------------#
+[ID_026]
+Title = Liedauswahl Challenge-Modus
+Description = Hier werden alle vorhandenen Lieder im Challenge-Modus angezeigt. Die Liedauswahl liegt bei Spieler P1.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = Party-Modus beenden (Menü aufrufen, falls geöffnet)
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+V = Videovorschau vergrößern/verkleinern (falls vorhanden)
+A = Bildseitenverhältnis umschalten (nur im Vollbildmodus, wird gespeichert)
+#-------------------------------------------------------#
+SEC_010 = Songauswahl
+RETURN = Aktuelles Lied singen
+R = per Zufall ein neues Lied aussuchen
+J = per Zufall ein neues Lied aussuchen
+
+#-------------------------------------------------------#
+# ID_027: UScreenStatDetail #
+#-------------------------------------------------------#
+[ID_027]
+Title = Detaillierte Statistiken
+Description = Hier werden themenbezogen detailliertere Statistiken angezeigt.
+#-------------------------------------------------------#
+SUB_010=Nächste Seite
+ENT_011=Blättert zur nächsten Statistikseite.
+#-------------------------------------------------------#
+SUB_020=Vorherige Seite
+ENT_021=Blättert zur vorherigen Statistikseite.
+#-------------------------------------------------------#
+SUB_030=Umkehren
+ENT_031=Kehrt die Sortierreihenfolge um.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_002 = Navigation
+LEFT = Zum vorherigen Punkt wechseln.
+RIGHT = Zur nächsten Punkt wechseln.
+UP = Zur vorherigen Punkt wechseln.
+DOWN = Zur nächsten Punkt wechseln.
+
+#-------------------------------------------------------#
+# ID_028: UScreenStatMain #
+#-------------------------------------------------------#
+[ID_028]
+Title = Hauptbildschirm Statistiken
+Description = Hier werden die wichtigsten Statistiken über die Lieder, Spieler und Punktzahlen auf einen Blick angezeigt.
+#-------------------------------------------------------#
+SUB_010=Highscores
+ENT_011=Zeigt alle vorhandenen Highscores mit Datum und Schwierigkeitsstufe an.
+#-------------------------------------------------------#
+SUB_020=Beste Sänger
+ENT_021=Zeigt die besten Sänger mit durchschnittlicher Punktezahl an.
+#-------------------------------------------------------#
+SUB_030=Beliebteste Songs
+ENT_031=Zeigt die beliebtesten Songs mit Singhäufigkeit an.
+#-------------------------------------------------------#
+SUB_040=Beliebteste Bands
+ENT_041=Zeigt die beliebtesten Bands mit der Anzahl gesungener Lieder an.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_002 = Navigation
+LEFT = Zur vorherigen Statistik wechseln.
+RIGHT = Zur nächsten Statistik wechseln.
+UP = Zur vorherigen Statistik wechseln.
+DOWN = Zur nächsten Statistik wechseln.
+
+#-------------------------------------------------------#
+# ID_029: UScreenTop #
+#-------------------------------------------------------#
+[ID_029]
+Title = Highscores
+Description = Hier wird die Highscoreliste der besten acht Sänger mit Datum angezeigt. Falls weniger als 100 Punkte erreicht wurden oder das Lied nicht bis zur letzten Liedzeile gesungen wurde, wird es nicht gewertet.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+RETURN = weiter
+ESC = weiter
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_030: Select Plugins #
+#-------------------------------------------------------#
+[ID_030]
+Title = Pluginauswahl
+Description = Hier können die Plugins einzeln aktiviert/deaktiviert werden.
+#-------------------------------------------------------#
+SEC_010 = Navigation
+UP = Plugins nach oben durchscrollen
+DOWN = Plugins nach unten durchscrollen
+ESC = Zurück zu den Optionen
+RETURN = Weiter zur Namenseingabe
+#-------------------------------------------------------#
+SEC_020 = Pluginauswahl
+SPACE = Plugin aktivieren/deaktivieren
+LEFT = Plugin deaktivieren
+RIGHT = Plugin aktivieren
+
+#-------------------------------------------------------#
+# ID_031: ScreenSongJumpTo #
+#-------------------------------------------------------#
+[ID_031]
+Title = Filter?
+Description = blah
+#-------------------------------------------------------#
+SEC_010 = Navigation
+ESC = raus hier...
+
+#-------------------------------------------------------#
+# ID_032: ScreenSongMenu #
+#-------------------------------------------------------#
+[ID_032]
+Title = PopupMenu Main?
+Description = blah
+#-------------------------------------------------------#
+SEC_010 = Navigation
+ESC = raus hier...
+
+#-------------------------------------------------------#
+# ID_033: ScreenSongMenu Party #
+#-------------------------------------------------------#
+[ID_033]
+Title = PopupMenu Party?
+Description = blah
+#-------------------------------------------------------#
+SEC_010 = Navigation
+ESC = raus hier...
diff --git a/Game/Output/Languages/Italian.ini b/Game/Output/Languages/Italian.ini
new file mode 100644
index 00000000..c35495b1
--- /dev/null
+++ b/Game/Output/Languages/Italian.ini
@@ -0,0 +1,1381 @@
+[Text]
+SING_LOADING=Caricamento...
+
+SING_CHOOSE_MODE=Scegli la modalità
+SING_SING=Canta
+SING_SING_DESC=Gioco veloce: canta da solo o in gruppo
+
+SING_TOOLS=Strumenti
+
+SING_STATS=Statistiche
+SING_STATS_DESC=Vedi le statistiche
+
+SING_EDITOR=Editor
+SING_EDITOR_DESC=Crea le tue canzoni
+
+SING_GAME_OPTIONS=Opzioni di gioco
+SING_GAME_OPTIONS_DESC=Cambia le opzioni
+
+SING_EXIT=Esci
+SING_EXIT_DESC=Esci dal gioco
+
+SING_OPTIONS=Opzioni
+SING_OPTIONS_DESC=Cambia le opzioni
+SING_OPTIONS_WHEREAMI=Opzioni
+
+SING_OPTIONS_GAME=Gioco
+SING_OPTIONS_GRAPHICS=Grafica
+SING_OPTIONS_SOUND=Suono
+SING_OPTIONS_LYRICS=Testi
+SING_OPTIONS_THEMES=Temi
+SING_OPTIONS_RECORD=Input sonoro
+SING_OPTIONS_ADVANCED=Avanzate
+SING_OPTIONS_EXIT=Indietro
+
+SING_OPTIONS_GAME_WHEREAMI=Opzioni di gioco
+SING_OPTIONS_GAME_DESC=Opzioni generali di gioco
+SING_OPTIONS_GAME_PLAYERS=Giocatori
+SING_OPTIONS_GAME_DIFFICULTY=Difficoltà
+SING_OPTIONS_GAME_LANGUAGE=Lingua
+SING_OPTIONS_GAME_TABS=Tabs
+SING_OPTIONS_GAME_SORTING=Ordinamento
+SING_OPTIONS_GAME_DEBUG=Debug
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Opzioni grafiche
+SING_OPTIONS_GRAPHICS_DESC=Settaggi grafici
+SING_OPTIONS_GRAPHICS_RESOLUTION=Risoluzione
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Schermo intero
+SING_OPTIONS_GRAPHICS_DEPTH=Profondità colore
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Oscilloscopio
+SING_OPTIONS_GRAPHICS_LINEBONUS=Line Bonus
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Dimensione filmati
+
+SING_OPTIONS_SOUND_WHEREAMI=Opzioni suono
+SING_OPTIONS_SOUND_DESC=Opzioni suono
+SING_OPTIONS_SOUND_MIC_BOOST=Amplificazione mic
+SING_OPTIONS_SOUND_CLICK_ASSIST=Aiuto click
+SING_OPTIONS_SOUND_BEAT_CLICK=Suono metronomo
+SING_OPTIONS_SOUND_THRESHOLD=Soglia
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Modalità a due
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Volume anteprima
+SING_OPTIONS_SOUND_PREVIEWFADING=Fading anteprima
+
+SING_OPTIONS_LYRICS_WHEREAMI=Opzioni testi
+SING_OPTIONS_LYRICS_DESC=Opzioni testi
+SING_OPTIONS_LYRICS_FONT=Carattere
+SING_OPTIONS_LYRICS_EFFECT=Effetto
+SING_OPTIONS_LYRICS_SOLMIZATION=Solfeggio
+
+SING_OPTIONS_THEMES_WHEREAMI=Opzioni temi
+SING_OPTIONS_THEMES_DESC=Opzioni temi e skin
+SING_OPTIONS_THEMES_THEME=Tema
+SING_OPTIONS_THEMES_SKIN=Skin
+SING_OPTIONS_THEMES_COLOR=Colore
+
+SING_OPTIONS_RECORD_WHEREAMI=Opzioni input sonoro
+SING_OPTIONS_RECORD_DESC=Opzioni microfono
+SING_OPTIONS_RECORD_CARD=Scheda audio
+SING_OPTIONS_RECORD_INPUT=Input
+SING_OPTIONS_RECORD_CHANNELL=Canale sinistro
+SING_OPTIONS_RECORD_CHANNELR=Canale destro
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Opzioni avanzate
+SING_OPTIONS_ADVANCED_DESC=Opzioni avanzate
+SING_OPTIONS_ADVANCED_EFFECTSING=Effetti canto
+SING_OPTIONS_ADVANCED_SCREENFADE=Fading schermo
+SING_OPTIONS_ADVANCED_LOADANIMATION=Animazioni caricamento
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Avviso uscita
+SING_OPTIONS_ADVANCED_LINEBONUS=Line Bonus
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=Contatore
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Dopo selezione
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto PartyMenu
+
+SING_LEGEND_SELECT=Seleziona
+SING_LEGEND_NAVIGATE=Scegli
+SING_LEGEND_CONTINUE=Continua
+SING_LEGEND_ESC=Indietro
+
+SING_PLAYER_DESC=Inserisci i nomi
+SING_PLAYER_WHEREAMI=Nomi dei giocatori
+SING_PLAYER_ENTER_NAME=Inserisci nome
+
+SING_DIFFICULTY_DESC=Seleziona la difficoltà
+SING_DIFFICULTY_WHEREAMI=Difficoltà
+SING_DIFFICULTY_CONTINUE=Seleziona canzone
+SING_EASY=Facile
+SING_MEDIUM=Medo
+SING_HARD=Difficile
+
+SING_SONG_SELECTION_DESC=Scegli la canzone
+SING_SONG_SELECTION_WHEREAMI=Selezione canzone
+SING_SONG_SELECTION_GOTO=Vai a...
+SING_SONG_SELECTION=Selezione canzone
+SING_SONG_SELECTION_MENU=Menu
+SING_SONG_SELECTION_PLAYLIST=Playlist
+SING_SONGS_IN_CAT=Canzoni
+PLAYLIST_CATTEXT=Playlist: %s
+
+SING_TIME=Tempo
+SING_TOTAL=Totale
+SING_MODE=Singolo
+SING_NOTES=Note
+SING_GOLDEN_NOTES=Note gold
+SING_PHRASE_BONUS=Line bonus
+
+SING_MENU=Menu principale
+
+SONG_SCORE=Punteggio canzone
+SONG_SCORE_WHEREAMI=Punteggio
+
+SING_SCORE_TONE_DEAF=Stonato
+SING_SCORE_AMATEUR=Dilettante
+SING_SCORE_RISING_STAR=Stella nascente
+SING_SCORE_LEAD_SINGER=Prima voce
+SING_SCORE_HIT_ARTIST=Artista di successo
+SING_SCORE_SUPERSTAR=Superstar
+SING_SCORE_ULTRASTAR=Ultrastar
+
+POPUP_PERFECT=Perfetto!
+POPUP_AWESOME=Fantastico!
+POPUP_GREAT=Grande!
+POPUP_GOOD=Buono!
+POPUP_NOTBAD=Non male!
+POPUP_BAD=Male!
+POPUP_POOR=Pessimo!
+POPUP_AWFUL=Terribile!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= e
+
+SONG_MENU_NAME_MAIN=Menu canzone
+SONG_MENU_PLAY=Canta
+SONG_MENU_CHANGEPLAYERS=Cambia giocatori
+SONG_MENU_EDIT=Modifica
+SONG_MENU_MODI=Modalità
+SONG_MENU_CANCEL=Cancella
+
+SONG_MENU_NAME_PLAYLIST=Menu canzone
+SONG_MENU_PLAYLIST_ADD=Aggiungi canzone
+SONG_MENU_PLAYLIST_DEL=Cancella canzone
+
+SONG_MENU_NAME_PLAYLIST_ADD=Aggiungi canzone
+SONG_MENU_PLAYLIST_ADD_NEW=Nuova playlist
+SONG_MENU_PLAYLIST_ADD_EXISTING=Playlist esistente
+SONG_MENU_PLAYLIST_NOEXISTING=Nessuna playlist
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nuova playlist
+SONG_MENU_PLAYLIST_NEW_CREATE=Crea
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Senza nome
+
+SONG_MENU_NAME_PLAYLIST_DEL=Confermi la cancellazione?
+SONG_MENU_YES=Sì
+SONG_MENU_NO=No
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Apri playlist
+SONG_MENU_PLAYLIST_LOAD=Apri
+SONG_MENU_PLAYLIST_DELCURRENT=Cancella playlist corrente
+
+SONG_MENU_NAME_PLAYLIST_DEL=Cancella playlist?
+
+SONG_MENU_NAME_PARTY_MAIN=Party Menu
+SONG_MENU_JOKER=Jolly
+
+SONG_MENU_NAME_PARTY_JOKER=Usa Jolly
+
+SONG_JUMPTO_DESC=Cerca canzone
+SONG_JUMPTO_TYPE_DESC=Cerca:
+SONG_JUMPTO_TYPE1=Tutto
+SONG_JUMPTO_TYPE2=Titolo
+SONG_JUMPTO_TYPE3=Artista
+SONG_JUMPTO_SONGSFOUND=%d Canzone(i) trovata(e)
+SONG_JUMPTO_NOSONGSFOUND=Nessuna canzone trovata
+SONG_JUMPTO_HELP=Inserisci testo da cercare
+SONG_JUMPTO_CATTEXT=Cerca: %s
+
+PARTY_MODE=Modalità Party
+PARTY_DIFFICULTY=Difficoltà
+PARTY_PLAYLIST=Modalità playlist
+PARTY_PLAYLIST_ALL=Tutte
+PARTY_PLAYLIST_CATEGORY=Cartella
+PARTY_PLAYLIST_PLAYLIST=Playlist
+PARTY_ROUNDS=Round
+PARTY_TEAMS=Squadre
+PARTY_TEAMS_PLAYER1=Gioc. squadra 1
+PARTY_TEAMS_PLAYER2=Gioc. squadra 2
+PARTY_TEAMS_PLAYER3=Gioc. squadra 3
+
+PARTY_LEGEND_CONTINUE=Continua
+
+PARTY_OPTIONS_DESC=Opzioni Party
+PARTY_OPTIONS_WHEREAMI=Opzioni Party
+
+PARTY_PLAYER_DESC=Inserisci nomi
+PARTY_PLAYER_WHEREAMI=Nomi Party
+PARTY_PLAYER_ENTER_NAME=Inserisci i nomi
+PARTY_PLAYER_LEGEND_CONTINUE=Inizia Party
+
+PARTY_ROUND_DESC=Prossimi giocatori
+PARTY_ROUND_WHEREAMI=Prossimo round
+PARTY_ROUND_LEGEND_CONTINUE=Inizia round
+
+PARTY_SONG_WHEREAMI=Selezione canzone
+PARTY_SONG_LEGEND_CONTINUE=Canta
+PARTY_SONG_MENU=Party Menu
+
+PARTY_SCORE_DESC=Risultato ultimo round
+PARTY_SCORE_WHEREAMI=Punteggio Party
+
+PARTY_WIN_DESC=Vincitore Party
+PARTY_WIN_WHEREAMI=Vincitore Party
+PARTY_WIN_LEGEND_CONTINUE=Torna al menu principale
+
+PARTY_ROUND=Round
+PARTY_ROUND_WINNER=Vincitore
+PARTY_NOTPLAYEDYET=Ancora da giocare
+PARTY_NOBODY=Nessuno
+NEXT_ROUND=Prossimo round:
+
+PARTY_DISMISSED=Abbandonato!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=vince!
+
+PLUGIN_HDL_NAME=Tieni il passo
+PLUGIN_HDL_DESC=Non lasciare che l'indicatore scenda al di sotto del livello indicato.
+
+PLUGIN_UNTIL5000_NAME=Fino a 5000
+PLUGIN_UNTIL5000_DESC=Chi arriva per primo a 5000 punti vince.
+
+PLUGIN_DUELL_NAME=Duello
+PLUGIN_DUELL_DESC=Duello classico fino a 10000 punti.
+
+PLUGIN_TEAMDUELL_NAME=Team Duell
+PLUGIN_TEAMDUELL_DESC=Passa il microfono!
+
+PLUGIN_BLIND_NAME=Alla cieca
+PLUGIN_BLIND_DESC=Duello senza le note visualizzate.
+
+STAT_MAIN=Statistiche
+STAT_MAIN_DESC=Generale
+STAT_MAIN_WHEREAMI=Statistiche
+
+STAT_OVERVIEW_INTRO=%0:s Statistiche. \n Ultimo reset alle %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Canzoni(%3:d con Video), di cui %1:d già cantate e %2:d Non ancora cantate.\n La canzone più popolare è %5:s di %4:s.
+STAT_OVERVIEW_PLAYER=Dall'ultimo reset ci sono stati %0:d differenti giocatori.\n Il miglior giocatore è %1:s con un punteggio medio di %2:d punti.\n %3:s Ha ottenuto il punteggio maggiore con %4:d punti.
+
+STAT_DETAIL=Statistiche
+STAT_DETAIL_WHEREAMI=Dettagli statistiche
+
+STAT_NEXT=Prossima pagina
+STAT_PREV=Pagina precedente
+STAT_REVERSE=Ordine inverso
+STAT_PAGE=Pagina %0:d di %1:d Pagine (%2:d di %3:d elementi)
+
+STAT_DESC_SONGS=Canzoni più popolari
+STAT_DESC_SONGS_REVERSED=Canzoni meno popolari
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx cantate
+
+STAT_DESC_BANDS=Artisti più popolari
+STAT_DESC_BANDS_REVERSED=Artisti meno popolari
+STAT_FORMAT_BANDS=%0:s \n %1:dx cantate
+
+MSG_ERROR_TITLE=Errore
+MSG_QUESTION_TITLE=Domanda
+MSG_QUIT_USDX=Vuoi davvero uscire?
+MSG_END_PARTY=Vuoi davvero uscire dal Party?
+ERROR_NO_SONGS=Nessuna canzone presente
+ERROR_NO_PLUGINS=Nessun plugin caricato
+ERROR_CORRUPT_SONG=Errore caricamento canzone
+
+#########################################################
+# NEW/CHANGED TEXTS for M2-MOD #
+#########################################################
+
+#### ScreenMain ####
+;new:
+SING_PARTY=Party
+;delete old ones!
+SING_MULTI=Classico
+SING_MULTI_DESC=Party classico
+
+;new:
+SING_MULTI_M2=Sfida
+SING_MULTI_M2_DESC=Modalità sfida
+
+#### ScreenPartyOptionsM2 ####
+;new:
+PARTY_MODE_M2=Modalità Sfida
+PARTY_OPTIONS_M2_DESC=Scegli opzioni
+PARTY_OPTIONS_M2_WHEREAMI=Opzioni Sfida
+PARTY_TEAMS_PLAYER_M2=Giocatori
+PARTY_OPTIONS_M2_SELECT_PLUGIN=Usa plugin
+PARTY_OPTIONS_M2_SELECT_HANDICAP=Usa handicap
+
+#### ScreenPartyPlayerM2 ####
+;new:
+PARTY_PLAYERM2_DESC=Inserisci nomi
+PARTY_PLAYERM2_WHEREAMI=Nomi
+
+#### ScreenPartyNewRoundM2 ####
+;new:
+PARTY_ROUNDM2_DESC=Sfida in corso
+PARTY_ROUNDM2_WHEREAMI=Prossimo round
+PARTY_ROUNDM2_LEGEND_CONTINUE=Continua
+PARTY_ROUNDM2=Round
+PARTY_ROUNDM2_RESULT=Risultato
+PARTY_ROUNDM2_NUMBER=
+PARTY_ROUNDM2_NAME=Nome
+PARTY_ROUNDM2_WINS=V
+PARTY_ROUNDM2_DRAFTS=N
+PARTY_ROUNDM2_DEFEATS=P
+PARTY_ROUNDM2_SCORE_DIFF=P-diff
+PARTY_ROUNDM2_POINTS=P
+PARTY_ROUNDM2_LEGEND_SCROLL=Scorri
+PARTY_ROUNDM2_END=Fine
+
+#### SreenSong in M2 mode ####
+;new:
+PARTY_SONG_WHEREAMI_M2=Selezione canzone
+
+#### ScreenTop ####
+;delete old ones!
+SING_TOP_CHARTS=I migliori 8 giocatori
+SING_TOP_CHARTS_WHEREAMI=Top 8
+SING_TOP_CHARTS_CONTINUE=Vai alla selezione canzoni
+
+#### Stats ####
+;new:
+STAT_FORMAT_DATE=%1:.2d.%0:.2d.%2:d
+;delete old ones!
+STAT_DESC_SCORES=Punteggi migliori
+STAT_DESC_SCORES_REVERSED=Punteggi peggiori
+STAT_FORMAT_SCORES=%0:s - %1:d (on %5:s) [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Cantanti migliori
+STAT_DESC_SINGERS_REVERSED=Cantanti peggiori
+STAT_FORMAT_SINGERS=%0:s \n Punteggio medio: %1:d (cantato %2:d volte)
+
+#### Plugins ####
+;new:
+PLUGIN_NOSCORE_NAME=Niente punteggio
+PLUGIN_NOSCORE_DESC=Duello senza vedere il punteggio
+
+PLUGIN_MORE500_NAME=Più di 500
+PLUGIN_MORE500_DESC=Avanza di 500 punti in più dell'altro.
+
+PLUGIN_MORE1000_NAME=Più di 1000
+PLUGIN_MORE1000_DESC=Avanza di 1000 punti in più dell'altro.
+
+PLUGIN_HAUDENLUKAS_NAME=Hit the Lukas
+PLUGIN_HAUDENLUKAS_DESC=Get all tones and win the game!
+
+PLUGIN_MEDLEY_NAME=Medley
+PLUGIN_MEDLEY_DESC=Sing up to 5 songs in a medley
+
+PLUGIN_MEDLEYBLIND_NAME=Medley blind
+PLUGIN_MEDLEYBLIND_DESC=Sing up to 5 songs in a medley blind
+
+PLUGIN_MEDLEYNOSCORE_NAME=Medley no score
+PLUGIN_MEDLEYNOSCORE_DESC=Sing up to 5 songs in a medley without seeing the scores
+
+PLUGIN_MEDLEYSURPRISE_NAME=Medley Surprise
+PLUGIN_MEDLEYSURPRISE_DESC=Up to 5 songs medley, only selecting the 1st song.
+
+PLUGIN_MEDLEYSURPRISEBLIND_NAME=Medley Surprise 2
+PLUGIN_MEDLEYSURPRISEBLIND_DESC=Up to 5 songs medley blind, only selecting the 1st song.
+
+#### ScreenSing ####
+;new
+VIDEO_ASPECT_STRETCH=Schiaccia
+VIDEO_ASPECT_CROP=Taglia
+VIDEO_ASPECT_LETTER_BOX=Adatta
+
+#### ScreenScore ####
+;new
+SCORE_LEGEND_SCROLL=Scorri
+
+#### ScreenEditSub ####
+;new
+INFO_FILE_SAVED=File salvato
+ERROR_SAVE_FILE_FAILED=Errore salvataggio file
+
+#-------------------------------------------------------#
+# Help System #
+#-------------------------------------------------------#
+
+[config]
+NumIDs = 33
+
+[Keymap]
+ESC=Esc
+CTRL=Strg
+ALT=Alt
+SHIFT=Shift
+BACKQUOTE=#
+BACKSPACE=Rück
+EQUALS=`
+MINUS=ß
+SLASH=-
+PERIOD=.
+RIGHT=Rechts
+LEFT=Links
+DOWN=Runter
+UP=Hoch
+SPACE=Leertaste
+KPPLUS=Key-Pad +
+KPMINUS=Key-Pad -
+DELETE=Del
+RETURN=Enter
+PRINT=Druck
+F1F12=F1..F12
+PAGEUP=Page Up
+PAGEDOWN=Page Down
+AZ=A..Z
+A=A
+B=B
+C=C
+D=D
+E=E
+F=F
+G=G
+H=H
+I=I
+J=J
+K=K
+L=L
+M=M
+N=N
+O=O
+P=P
+Q=Q
+R=R
+S=S
+T=T
+U=U
+V=V
+W=W
+X=X
+Y=Z
+Z=Y
+0=0
+1=1
+2=2
+3=3
+4=4
+5=5
+6=6
+7=7
+8=8
+9=9
+F1=F1
+F2=F2
+F3=F3
+F4=F4
+F5=F5
+F6=F6
+F7=F7
+F8=F8
+F9=F9
+F10=F10
+F11=F11
+F12=F12
+
+#### IDs must have the format: 'ID_###'
+
+#-------------------------------------------------------#
+# ID_001: UScreenEdit #
+#-------------------------------------------------------#
+[ID_001]
+Title = Song-Editor
+Description = Hier können Songs editiert werden.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+S = Song speichern (#RELATIVE:No)
+SHIFT_S = Song speichern (#RELATIVE:Yes)
+ESC = Editor verlassen / Im Textmodus: Bearbeitung abbrechen
+R = Song neu laden
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Medley/PreviewStart
+A = gewählte Note als Medley-Anfang setzen/löschen
+SHIFT_A = gewählte Note als Medley-Ende setzen/löschen
+J = Zum Medley-Anfang springen
+SHIFT_J = Zum Medley-Ende springen
+ALT_J = Medley abspielen
+K = gewählte Note als PreviewStart setzen
+SHIFT_K = Zum PreviewStart springen
+#-------------------------------------------------------#
+SEC_020 = Grundsteuerung
+P = MP3+Noteneinsatzklicks der gesamten Zeile abspielen
+SHIFT_P = MIDI der gesamten Zeile abspielen
+CTRL_SHIFT_P = MP3+Noteneinsatzklicks+MIDI der gesamten Zeile abspielen
+ALT_P = MP3+Noteneinsatzclicks ab aktueller Zeile bis zum Liedende abspielen
+SHIFT_ALT_P = MIDI ab aktueller Zeile bis zum Liedende abspielen
+CTRL_SHIFT_ALT_P = MP3+Noteneinsatzklicks+MIDI ab aktueller Zeile bis zum Liedende abspielen
+SPACE = MP3 der gewählten Note/Silbe abspielen
+SHIFT_SPACE = MIDI der gewählten Note/Silbe abspielen
+CTRL_SHIFT_SPACE = MP3+MIDI der gewählten Note/Silbe abspielen
+RIGHT = Zur nächsten Note/Silbe springen
+LEFT = Zur vorhergehenden Note/Silbe springen
+DOWN = Zur nächsten Liedzeile springen
+UP = Zur vorhergehenden Zeile springen
+#-------------------------------------------------------#
+SEC_030 = Noten
+G = Goldenen Ton setzen/löschen
+F = Freestyle Note setzten/löschen
+SHIFT_C = Überflüssige Leerzeichen in aktueller Zeile löschen
+CTRL_DELETE = Markierte Note/Silbe löschen
+CTRL_SLASH = Note teilen
+SHIFT_LEFT = Note nach links veschieben
+SHIFT_RIGHT = Note nach rechts veschieben
+CTRL_LEFT = Notenanfang nach links verschieben (Note verlängern)
+CTRL_RIGHT = Notenanfang nach rechts verschieben (Note verkürzen)
+ALT_LEFT = Notenende nach links verschieben (Note verkürzen)
+ALT_RIGHT = Notenende nach rechts verschieben (Note verlängern)
+BACKQUOTE = Note verlängern (wie [ALT]+[Rechts])
+CTRL_ALT_SHIFT_LEFT = Alle Noten ab der gewählten Note bis zum Liedende nach links verschieben
+CTRL_ALT_SHIFT_RIGHT = Alle Noten ab der gewählten Note bis zum Liedende nach rechts verschieben
+#-------------------------------------------------------#
+SEC_040 = Tonhöhe
+KPPLUS = Tonhöhe aller Noten um einen Halbtonschritt erhöhen
+KPMINUS = Tonhöhe aller Noten um einen Halbtonschritt verringern
+CTRL_UP = Tonhöhe der markierten Note um einen Halbtonschritt erhöhen
+CTRL_DOWN = Tonhöhe der markierten Note um einen Halbtonschritt verringern
+SHIFT_KPMINUS = Tonhöhe aller Noten um eine Oktave (12 Halbtonschritte) verringern
+SHIFT_KPPLUS = Tonhöhe aller Noten um eine Oktave (12 Halbtonschritte) erhöhen
+#-------------------------------------------------------#
+SEC_050 = Songtext
+F4 = Textbearbeitungs Modus starten (bzw. ohne Speichern beenden)
+RETURN = Textmodus beenden und Änderungen speichern
+BACKSPACE = Im Textmodus: Zeichen löschen
+C = Anfangsbuchstaben der Zeile groß schreiben
+PERIOD = Den ausgewählten Text dem nächsten Ton zuordnen
+T = Zeiten für Zeilenwechsel korrigieren
+SLASH = Zeilenumbruch vor der markierten Note einfügen
+SHIFT_SLASH = Aktuelle Zeile mit der darauffolgenden zusammenführen
+#-------------------------------------------------------#
+SEC_060 = GAP (Zeitverzögerung)
+0 = GAP um 10ms erhöhen
+SHIFT_0 = GAP um 1000ms erhöhen
+9 = GAP um 10ms reduzieren
+SHIFT_9 = GAP um 1000ms reduzieren
+#-------------------------------------------------------#
+SEC_070 = BPM (Beats per minute)
+CTRL_EQUALS = BPM um 0,01 erhöhen
+CTRL_MINUS = BPM um 0,01 reduzieren
+EQUALS = BPM um 0,05 erhöhen
+MINUS = BPM um 0,05 reduzieren
+SHIFT_EQUALS = BPM um 1,00 erhöhen
+SHIFT_MINUS = BPM um 1,00 reduzieren
+M = BMP und Notenzeitwerte verdoppeln
+D = BMP und Notenzeitwerte halbieren
+#-------------------------------------------------------#
+SEC_080 = Sonstiges
+CTRL_C = Zeile kopieren
+CTRL_V = Zeile einfügen
+CTRL_SHIFT_V = unbekannt
+CTRL_SHIFT_4 = unbekannt
+CTRL_SHIFT_ALT_4 = unbekannt
+CTRL_SHIFT_5 = unbekannt
+CTRL_SHIFT_ALT_5 = unbekannt
+
+#-------------------------------------------------------#
+# ID_002: UScreenLevel #
+#-------------------------------------------------------#
+[ID_002]
+Title = Level auswählen
+Description = Hier kann der Schwierigkeitsgrad eingestellt werden. Die Schwierigkeitsgrade beeinflussen die notwendige Treffgenauigkeit der Notenhöhen.
+#-------------------------------------------------------#
+SUB_010=Leicht
+ENT_011=Erlaubt eine Abweichung von bis zu zwei Halbtönen in beide Richtungen, um Punkte für die Note zu bekommen.
+#-------------------------------------------------------#
+SUB_020=Mittel
+ENT_021=Erlaubt eine Abweichung von bis zu einem Halbton in beide Richtungen, um Punkte für die Note zu bekommen.
+#-------------------------------------------------------#
+SUB_030=Schwierig
+ENT_031=Die Note muss exakt getroffen werden, um Punkte für die Note zu bekommen.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Levelauswahl
+LEFT = Linksherum durch die Auswahl gehen
+UP = Linksherum durch die Auswahl gehen
+RIGHT = Rechtsherum durch die Auswahl gehen
+DOWN = Rechtsherum durch die Auswahl gehen
+RETURN = Level setzen und weiter zur Songauswahl
+
+#-------------------------------------------------------#
+# ID_003: UScreenMain #
+#-------------------------------------------------------#
+[ID_003]
+Title = Hauptbildschirm
+Description = Dies ist das UltraStar Deluxe Startmenü.
+#-------------------------------------------------------#
+SUB_010=Singen
+ENT_011=Freie Wahl von Liedern und Spielern.
+ENT_012=Man kann hier die Lieder normal singen oder den Medley-Modus starten.
+#-------------------------------------------------------#
+SUB_020=Party
+ENT_021=Hier hat man die Wahl zwischen zwei unterschiedlichen Party-Modi.
+ENT_022=Classic: Spiele mit bis zu 12 Spielern in 3 Teams. Verschiedene Party-Plugins sorgen für Abwechslung.
+ENT_023=Challenge: Spiele mit bis zu 9 Spielern eine Art Meisterschaft bei der, ähnlich wie beim Fußball, die Rundenergebnisse tabellarisch zusammengefasst werden.
+#-------------------------------------------------------#
+SUB_030=Tools
+ENT_031=Über diesen Menüpunkt können Spielstatistiken, der interne Editor und das Optionsmenü aufgerufen werden.
+ENT_032=Statistiken: beinhalten Informationen über Highscores, beste Sänger, beliebteste Songs und Bands.
+ENT_033=Editor: hiermit lassen sich vorhandene MIDI-Dateien in UltraStar Lieder konvertieren.
+ENT_034=Optionen: hier lassen sich viele Einstellungen für das Verhalten von UltraStar Deluxe vornehmen.
+#-------------------------------------------------------#
+SUB_040=Beenden
+ENT_041=Hiermit beendet man UltraStar Deluxe nach Bestätigen einer Sicherheitsabfrage.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahl links
+UP = Auswahl hoch
+RIGHT = Auswahl rechts
+DOWN = Auswahl runter
+RETURN = aktuelle Auswahl bestätigen
+#-------------------------------------------------------#
+SEC_020 = Tastenkürzel
+M = Party --> Classic: startet den Classic Party Modus
+SHIFT_M = Party --> Challenge: startet den Challenge Modus
+S = Tools --> Statistiken: zeigt die Statistiken direkt an
+E = Tools --> Editor: startet den Editor
+ALT_C = Credits aufrufen
+
+#-------------------------------------------------------#
+# ID_004: UScreenName #
+#-------------------------------------------------------#
+[ID_004]
+Title = Spielernamen eingeben
+Description = Hier können die Spielernamen eingegeben werden. Die Anzahl der Spieler richtet sich nach der Einstellung unter Optionen --> Spiel --> Spieler.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahl links
+UP = Auswahl hoch
+RIGHT = Auswahl rechts
+DOWN = Auswahl runter
+RETURN = alle Spielernamen bestätigen und weiter
+#-------------------------------------------------------#
+SEC_020 = Namen ändern
+BACKSPACE = letzten Buchstaben löschen
+ALT_F1F12 = aktuellen Namen als Template 1..12 speichern
+F1F12 = Template 1..12 in gewähltes Namensfeld übernehmen
+
+#-------------------------------------------------------#
+# ID_006: UScreenOptions #
+#-------------------------------------------------------#
+[ID_006]
+Title = Hauptmenü Optionen
+Description = Von hier aus gelangt man zu allen Einstellungen, die das Aussehen und Verhalten von UltraStar Deluxe beeinflussen.
+#-------------------------------------------------------#
+SUB_010=Spiel
+ENT_011=Einstellungen zur Spieleranzahl, zur Standardschwierigkeitsstufe, zur Spielsprache, zur Anzeige von Kategorien, zur Liedsortierung und zum Debugmodus.
+#-------------------------------------------------------#
+SUB_020=Grafik
+ENT_021=Einstellungen zur Spielauflösung, zum Vollbildmodus, zur Farbtiefe, zur Anzeige eines Oszilloskop, zur Videogröße und zur Videovorschau.
+#-------------------------------------------------------#
+SUB_030=Sound
+ENT_031=Einstellungen zur Mikrofonverstärkung, zum Click-Assistenten, zu den Beat-Clicks, zur Rauschunterdrückung, zur Vorschau-Lautstärke und zum Vorschau-Fading.
+#-------------------------------------------------------#
+SUB_040=Lyrics
+ENT_041=Einstellungen zur Schriftart, zum Animationseffekt und zur Solmisation des Liedtextes
+#-------------------------------------------------------#
+SUB_050=Themes
+ENT_051=Einstellungen zum Theme, zum Skin und zur Farbe
+#-------------------------------------------------------#
+SUB_060=Aufnahme
+ENT_061=Einstellungen zu verwendeten Soundkarten, zu Audioeingängen und zu Kanalbelegungen
+#-------------------------------------------------------#
+SUB_070=Erweitert
+ENT_071=Einstellungen zum Bildschirm-Fade, zu den Singeffekten, zum Phrasenbonus, etc.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahl links
+UP = Auswahl hoch
+RIGHT = Auswahl rechts
+DOWN = Auswahl runter
+RETURN = aktuelle Auswahl bestätigen
+
+#-------------------------------------------------------#
+# ID_007: UScreenOptionsAdvanced #
+#-------------------------------------------------------#
+[ID_007]
+Title = Erweiterte Optionen
+Description = Hier findet man die erweiterten Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Bildschirm-Fade
+ENT_011=Schaltet die Überblendung zwischen den einzelnen Screens an oder aus.
+#-------------------------------------------------------#
+SUB_020=Singeffekte
+ENT_021=Schaltet Animationen bei Goldenen Noten und Ähnliches an oder aus.
+#-------------------------------------------------------#
+SUB_030=Phrasenbonus
+ENT_031=Legt fest, an welcher Stelle der Phrasenbonus angezeigt wird.
+#-------------------------------------------------------#
+SUB_040=nach Song-Wahl
+ENT_041=Legt fest, ob nach der Songauswahl direkt gesungen wird oder erst die Spieler festgelegt werden.
+#-------------------------------------------------------#
+SUB_050=Sicherheitsabfrage
+ENT_051=Legt fest, ob beim Verlassen von Ultrastar Deluxe eine Sicherheitsabfrage stattfindet.
+#-------------------------------------------------------#
+SUB_060=Auto Party-Menü
+ENT_061=Legt fest, ob das Party-Menü zur Jokerauswahl bei jedem neuen Lied automatisch angezeigt werden soll.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlmöglichkeiten der gewählten Einstellung nach links durchgehen
+UP = Vorherige Einstellungsoption wählen
+RIGHT = Auswahlmöglichkeiten der gewählten Einstellung nach rechts durchgehen
+DOWN = Nächste Einstellungsoption wählen
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_008: UScreenOptionsGame #
+#-------------------------------------------------------#
+[ID_008]
+Title = Spiel-Optionen
+Description = Hier findet man die grundlegenden Spiel-Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Spieler
+ENT_011=Legt die Anzahl der Spieler fest. Auf einem Bildschirm können maximal 3 Spieler gleichzeitig singen, auf zwei Bildschirmen sind es 4 bzw. 6 Spieler.
+#-------------------------------------------------------#
+SUB_020=Schwierigkeit
+ENT_021=Legt die standardmäßig eingestellte Schwierigkeitsstufe fest.
+#-------------------------------------------------------#
+SUB_030=Sprache
+ENT_031=Legt die Spielsprache fest.
+#-------------------------------------------------------#
+SUB_040=Ordner
+ENT_041=Legt fest, ob die Lieder gemäß der Sortierung in einzelnen Ordnern/Kategorien angezeigt werden oder nicht (Neustart erforderlich).
+#-------------------------------------------------------#
+SUB_050=Sortierung
+ENT_051=Legt fest, nach welchen Kriterium die Lieder sortiert werden.
+#-------------------------------------------------------#
+SUB_060=Debug
+ENT_061=Legt fest, ob Debug-Informationen wie Bildwiederholfrequenz angezeigt werden.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_009: UScreenOptionsGraphics #
+#-------------------------------------------------------#
+[ID_009]
+Title = Grafik-Optionen
+Description = Hier findet man die Grafik-Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Auflösung
+ENT_011=Legt die Auflösung des Spiels fest. Das Spiel wird in jedem Fall auf eine Auflösung von 800x600 gerendet und anschließend nur noch auf die gewählte Auflösung skaliert.
+#-------------------------------------------------------#
+SUB_020=Vollbild
+ENT_021=Legt fest, ob das Spiel im Vollbild- oder im Fenstermodus angezeigt werden soll (Neustart erforderlich).
+#-------------------------------------------------------#
+SUB_030=Farbtiefe
+ENT_031=Legt die Farbtiefe des Spiels fest.
+#-------------------------------------------------------#
+SUB_040=Oszilloskop
+ENT_041=Legt fest, ob beim Singen ein Oszilloskop für den Mikrofonausschlag angezeigt wird.
+#-------------------------------------------------------#
+SUB_050=Videogröße
+ENT_051=Legt fest, ob und in welcher Größe Videos angezeigt werden.
+#-------------------------------------------------------#
+SUB_060=Videovorschau
+ENT_061=Legt fest, ob bei der Liedauswahl eine Videovorschau angezeigt wird.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_010: UScreenOptionsLyrics #
+#-------------------------------------------------------#
+[ID_010]
+Title = Liedtext-Optionen
+Description = Hier findet man die Liedtext-Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Schriftart
+ENT_011=Legt die Schriftart des Liedtextes fest.
+#-------------------------------------------------------#
+SUB_020=Effekt
+ENT_021=Legt den Animationseffekt für die zu singende Silbe fest.
+#-------------------------------------------------------#
+SUB_030=Solmisation
+ENT_031=Legt fest, ob und wenn ja, welche Solmisation verwendet werden soll. Dabei wird der Liedtext durch die entsprechenden Tonsilben ersetzt.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_011: UScreenOptionsRecord #
+#-------------------------------------------------------#
+[ID_011]
+Title = Aufnahme Optionen
+Description = Hier findet man die Aufnahme- und Mikrofon-Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Soundkarte
+ENT_011=Legt die einzustellende Soundkarte fest.
+#-------------------------------------------------------#
+SUB_020=Eingang
+ENT_021=Legt den verwendeten Eingang der Soundkarte fest.
+#-------------------------------------------------------#
+SUB_030=Linker Kanal
+ENT_031=Legt fest, welcher Spielernummer der linke Aufnahmekanal zugeordnet ist.
+#-------------------------------------------------------#
+SUB_040=Rechter Kanals
+ENT_041=Legt fest, welcher Spielernummer der rechte Aufnahmekanal zugeordnet ist.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_012: UScreenOptionsSound #
+#-------------------------------------------------------#
+[ID_012]
+Title = Sound Optionen
+Description = Hier findet man die Sound-Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Mic-Anhebung
+ENT_011=Legt die Mikrofonverstärkung innerhalb von UltraStar Deluxe fest.
+#-------------------------------------------------------#
+SUB_020=Click-Assistent
+ENT_021=Legt fest, ob mit jedem Noteneinsatz ein Klick abgespielt wird.
+#-------------------------------------------------------#
+SUB_030=Beat-Click
+ENT_031=Legt fest, ob mit jedem Vierteltakt ein Klick abgespielt wird.
+#-------------------------------------------------------#
+SUB_040=Rauschunterdrückung
+ENT_041=Legt die Rauschumnterdrückung beim Mikrofonsignal fest.
+#-------------------------------------------------------#
+SUB_050=Vorschau-Lautstärke
+ENT_051=Legt die Lautstärke bei der Liedvorschau in der Liedauswahl fest.
+#-------------------------------------------------------#
+SUB_060=Vorschau-Fading
+ENT_061=Legt die Wartezeit bis zum Abspielen der Liedvorschau fest.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_013: UScreenOptionsThemes #
+#-------------------------------------------------------#
+[ID_013]
+Title = Themes Optionen
+Description = Hier findet man die Theme- und Skin-Optionen von UltraStar Deluxe.
+#-------------------------------------------------------#
+SUB_010=Theme
+ENT_011=Legt das Spiel-Theme und damit die Anordnung der einzelnen Elemente fest.
+#-------------------------------------------------------#
+SUB_020=Skin
+ENT_021=Legt das Skin für das gewählte Theme fest.
+#-------------------------------------------------------#
+SUB_030=Farbe
+ENT_031=Legt die Hauptfarbe für das gewählte Theme und Skin fest.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = Wenn aktuelle Auswahl auf "zurück": Zum Optionsmenü zurückkehren
+
+#-------------------------------------------------------#
+# ID_014: UScreenPartyNewRound #
+#-------------------------------------------------------#
+[ID_014]
+Title = Party Übersicht
+Description = Hier wird die Übersicht über den aktuellen Stand des Party-Modus angezeigt. Neben dem aktuellen Punktestand wird eine Liste über alle gespielten und noch zu spielenden Runden mit den zugehörigen Plugins sowie die folgende Runde und deren Spieler und Plugin angezeigt.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = Partymodus beenden (mit Sicherheitsabfrage)
+BACKSPACE = Partymodus beenden (mit Sicherheitsabfrage)
+RETURN = Nächste Runde starten
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_015: UScreenPartyOptions #
+#-------------------------------------------------------#
+[ID_015]
+Title = Optionen Party-Modus
+Description = Hier könnten die Optionen für den Party-Modus festgelegt werden.
+#-------------------------------------------------------#
+SUB_010=Schwierigkeit
+ENT_011=Legt das Schwierigkeitslevel für alle Runden des Party-Modus' fest.
+#-------------------------------------------------------#
+SUB_020=Playlist-Modus
+ENT_021=Legt fest, welche Liederauswahl für den Party-Modus zur Verfügung stehen. Werden Ordner oder Playlist gewählt, so wird im nächsten Punkt festgelegt, welcher Ordner bzw. welche Playlist verwendet wird.
+#-------------------------------------------------------#
+SUB_030=Runden
+ENT_031=Legt die Anzahl der zu spielenden Runden fest.
+#-------------------------------------------------------#
+SUB_040=Teams
+ENT_041=Legt die Anzahl der Teams fest.
+#-------------------------------------------------------#
+SUB_050=Spieler Team 1
+ENT_051=Legt die Anzahl der Spieler in Team 1 fest.
+#-------------------------------------------------------#
+SUB_060=Spieler Team 2
+ENT_061=Legt die Anzahl der Spieler in Team 2 fest.
+#-------------------------------------------------------#
+SUB_060=Spieler Team 3
+ENT_061=Legt die Anzahl der Spieler in Team 3 fest (nur, falls 3 Teams gewählt wurden).
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahlliste nach links durchgehen
+UP = Option hoch
+RIGHT = Auswahlliste nach rechts durchgehen
+DOWN = Option runter
+RETURN = weiter
+
+#-------------------------------------------------------#
+# ID_016: UScreenPartyPlayer #
+#-------------------------------------------------------#
+[ID_016]
+Title = Spielernameneingabe Party-Modus
+Description = Hier können die Team- und Spielernamen eingegeben werden.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahl links
+UP = Auswahl hoch
+RIGHT = Auswahl rechts
+DOWN = Auswahl runter
+RETURN = alle Spielernamen bestätigen und weiter
+#-------------------------------------------------------#
+SEC_020 = Namen ändern
+BACKSPACE = letzten Buchstaben löschen
+ALT_F1F12 = aktuellen Namen als Template 1..12 speichern
+F1F12 = Template 1..12 in gewähltes Namensfeld übernehmen
+
+#-------------------------------------------------------#
+# ID_017: UScreenPartyScore #
+#-------------------------------------------------------#
+[ID_017]
+Title = Ergebnis Party-Modus
+Description = Hier wird das Ergebnis und der Sieger der letzten Party-Runde angezeigt.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = weiter
+BACKSPACE = weiter
+RETURN = weiter
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_010: UScreenPartyWin #
+#-------------------------------------------------------#
+[ID_018]
+Title = Sieger Party-Modus
+Description = Hier wird der endgültige Sieger nach allen gespielten Party-Runden angezeigt.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_019: UScreenPartyNewRoundM2 #
+#-------------------------------------------------------#
+[ID_019]
+Title = Übersicht Challenge-Modus
+Description = Hier wird die Übersicht über den aktuellen Stand des Challenge-Modus' angezeigt. Es wird die Punktetabelle und die Begegnungstabelle sowie folgende Runde mit Spielern angezeigt.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_020: UScreenPartyOptionsM2 #
+#-------------------------------------------------------#
+[ID_020]
+Title = Optionen Challenge-Modus
+Description = Hier könnten die Optionen für den Challenge-Modus festgelegt werden.
+#-------------------------------------------------------#
+SUB_010=Schwierigkeit
+ENT_011=Legt das Schwierigkeitslevel für alle Runden des Challenge-Modus' fest.
+#-------------------------------------------------------#
+SUB_020=Playlist-Modus
+ENT_021=Legt fest, welche Liederauswahl für den Challenge-Modus zur Verfügung stehen. Werden Ordner oder Playlist gewählt, so wird im nächsten Punkt festgelegt, welcher Ordner bzw. welche Playlist verwendet wird.
+#-------------------------------------------------------#
+SUB_030=Spieler
+ENT_031=Legt die Anzahl der Spieler für den Challenge-Modus fest.
+#-------------------------------------------------------#
+SUB_040=Runden
+ENT_041=Legt die Anzahl der zu spielenden Runden fest.
+#-------------------------------------------------------#
+SUB_050=Plugins zulassen
+ENT_051=Legt fest, ob Party-Plugins verwendet werden.
+#-------------------------------------------------------#
+SUB_060=Handicap Modus
+ENT_061=Legt fest, ob schlechte Spieler bevorzugt und gute Spieler bei der Punktevergabe im Sinne der Chancenangleichung benachteiligt werden.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_021: UScreenPartyPlayerM2 #
+#-------------------------------------------------------#
+[ID_021]
+Title = Spielernamen Challenge-Modus
+Description = Hier können die Team- und Spielernamen eingegeben werden.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_010 = Navigation
+LEFT = Auswahl links
+UP = Auswahl hoch
+RIGHT = Auswahl rechts
+DOWN = Auswahl runter
+RETURN = alle Spielernamen bestätigen und weiter
+#-------------------------------------------------------#
+SEC_020 = Namen ändern
+BACKSPACE = letzten Buchstaben löschen
+ALT_F1F12 = aktuellen Namen als Template 1..12 speichern
+F1F12 = Template 1..12 in gewähltes Namensfeld übernehmen
+
+#-------------------------------------------------------#
+# ID_022: UScreenScore #
+#-------------------------------------------------------#
+[ID_022]
+Title = Ergebnisse
+Description = Hier werden die Punktzahlen der einzelnen Spieler nach dem Singen angezeigt. Dabei wird nicht nur die Gesamtpunktzahl, sondern ebenfalls der erreichte Phrasenbonus sowie die Bonuspunkte durch Goldene Noten angezeigt.
+#-------------------------------------------------------#
+SUB_010=Mögliche Gesangsbewertungen
+ENT_011=Anti-Talent (bis 2000 Punkte)
+ENT_012=Amateur (2010 bis 4000 Punkte)
+ENT_013=Möchtegern (4010 bis 6000 Punkte)
+ENT_014=Sternchen (6010 bis 8000 Punkte)
+ENT_015=Hit-Künstler (8010 bis 9000 Punkte)
+ENT_016=Superstar (9010 bis 9800 Punkte)
+ENT_017=UltraStar (9810 bis 10000 Punkte)
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+RETURN = zurück
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_023: UScreenSing #
+#-------------------------------------------------------#
+[ID_023]
+Title = Singbildschirm
+Description = Hier wird das ausgewählte Lied abgespielt. Dabei wird der Text des Liedes zeilenweise mit den zugehörigen Noten angezeigt.
+#-------------------------------------------------------#
+SUB_010=Punktevergabe
+ENT_011=Die maximal erreichbare Punktzahl inklusive aller Bonuspunkte ist für jedes Lied normiert auf 10000 Punkte.
+ENT_012=Jede Note, die richtig gesungen wird (in Abhängigkeit der eingestellten Schwierigkeitsstufe), gibt Punkte. Je länger die Note richtig gesungen wurde, desto mehr Punkte bekommt der Spieler.
+#-------------------------------------------------------#
+SUB_020=Phrasenbonus
+ENT_021=Zusätzlich erhält man für jede Zeile, die fehlerfrei gesungen wurden, einen Phrasenbonus.
+#-------------------------------------------------------#
+SUB_030=Goldene Noten
+ENT_031=Goldene Noten sind meist etwas schwerer zu treffen und geben daher ebenfalls Bonuspunkte.
+#-------------------------------------------------------#
+SUB_040=Freestyle Noten
+ENT_041=Freestyle Noten werden oft für gesprochene oder kaum bewertbare Passagen verwendet. Es werden hierfür keine Tonhöhen angezeigt, der Liedtext wird kursiv dargestellt und diese Teile geben keine Punkte. Hier darf nach Belieben mitgesprochen oder mitgegrölt werden!
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+P = Pause / Weiter
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+# ID_024: UScreenSong #
+#-------------------------------------------------------#
+[ID_024]
+Title = Liedauswahl
+Description = Hier werden alle vorhandenen Lieder für das normale Singen angezeigt. Scrollt durch die Liste oder verwendet die Suche, um euren Lieblingssong zu finden.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+V = Videovorschau vergrößern/verkleinern (falls vorhanden)
+A = Bildseitenverhältnis umschalten (nur im Vollbildmodus, wird gespeichert)
+#-------------------------------------------------------#
+SEC_010 = Songauswahl
+LEFT = Linksherum durch die Liedauswahl blättern
+RIGHT = Rechtsherum durch die Liedauswahl blättern
+UP = Zur vorherigen Kategorie wechseln (falls Kategorien aktiviert)
+DOWN = Zur nächsten Kategorie wechseln (falls Kategorien aktiviert)
+RETURN = Lied singen
+ALT_AZ = Zu Interpreten mit gewähltem Anfangsbuchstaben springen
+SHIFT_ALT_AZ = Zu Titeln mit gewähltem Anfangsbuchstaben springen
+M = Menü aufrufen (Singen / Spieler wechseln / Song zu Playlist hinzufügen / Editor)
+J = Suchmenü aufrufen
+P = Playliste öffnen
+R = Zufällig ein neues Lied anzeigen
+E = Editor mit ausgewähltem Lied starten
+#-------------------------------------------------------#
+SEC_020 = Medley
+S = Aktuelles Lied im Medley-Modus starten (falls Medley-Tags gesetzt)
+SHIFT_S = Aktuelles Lied im Medley-Modus starten (falls Medley-Tags gesetzt oder berechnet)
+D = Ein Medley mit bis zu 5 zufällig gewählten Liedern (mit gesetzten Medley-Tags) aus der aktuellen Kategorie starten
+SHIFT_D = Ein Medley mit bis zu 5 zufällig gewählten Liedern (mit gesetzten oder berechneten Medley-Tags) aus der aktuellen Kategorie starten
+F = Ein Medley mit bis zu 99 selbst gewählten Liedern (mit gesetzten Medley-Tags) zusammenstellen
+SHIFT_F = Letztes hinzugefügte Lied von der Medley-Playlist entfernen bzw. Medley-Modus deaktivieren, wenn die Playliste leer ist
+
+#-------------------------------------------------------#
+# ID_025: UScreenSong Party #
+#-------------------------------------------------------#
+[ID_025]
+Title = Liedauswahl Party-Modus
+Description = Hier werden alle vorhandenen Lieder im klassischen Party-Modus angezeigt.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = Party-Modus beenden (Menü aufrufen, falls geöffnet)
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+V = Videovorschau vergrößern/verkleinern (falls vorhanden)
+A = Bildseitenverhältnis umschalten (nur im Vollbildmodus, wird gespeichert)
+#-------------------------------------------------------#
+SEC_010 = Songauswahl
+RETURN = Menü aufrufen (Singen / Joker)
+ESC = Geöffnetes Song-Menü schließen
+M = Menü aufrufen (Singen / Joker)
+1 = per Zufall ein neues Lied aussuchen (Team 1 verwendet einen Joker)
+2 = per Zufall ein neues Lied aussuchen (Team 2 verwendet einen Joker)
+3 = per Zufall ein neues Lied aussuchen (Team 3 verwendet einen Joker; falls 3 Teams vorhanden)
+ALT_1 = per Zufall ein neues Lied aussuchen (kein Team verwendet einen Joker)
+ALT_2 = per Zufall ein neues Lied aussuchen (kein Team verwendet einen Joker)
+ALT_3 = per Zufall ein neues Lied aussuchen (kein Team verwendet einen Joker; falls 3 Teams vorhanden)
+
+#-------------------------------------------------------#
+# ID_026: UScreenSong Challenge #
+#-------------------------------------------------------#
+[ID_026]
+Title = Liedauswahl Challenge-Modus
+Description = Hier werden alle vorhandenen Lieder im Challenge-Modus angezeigt. Die Liedauswahl liegt bei Spieler P1.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = Party-Modus beenden (Menü aufrufen, falls geöffnet)
+BACKSPACE = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+V = Videovorschau vergrößern/verkleinern (falls vorhanden)
+A = Bildseitenverhältnis umschalten (nur im Vollbildmodus, wird gespeichert)
+#-------------------------------------------------------#
+SEC_010 = Songauswahl
+RETURN = Aktuelles Lied singen
+R = per Zufall ein neues Lied aussuchen
+J = per Zufall ein neues Lied aussuchen
+
+#-------------------------------------------------------#
+# ID_027: UScreenStatDetail #
+#-------------------------------------------------------#
+[ID_027]
+Title = Detaillierte Statistiken
+Description = Hier werden themenbezogen detailliertere Statistiken angezeigt.
+#-------------------------------------------------------#
+SUB_010=Nächste Seite
+ENT_011=Blättert zur nächsten Statistikseite.
+#-------------------------------------------------------#
+SUB_020=Vorherige Seite
+ENT_021=Blättert zur vorherigen Statistikseite.
+#-------------------------------------------------------#
+SUB_030=Umkehren
+ENT_031=Kehrt die Sortierreihenfolge um.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_002 = Navigation
+LEFT = Zum vorherigen Punkt wechseln.
+RIGHT = Zur nächsten Punkt wechseln.
+UP = Zur vorherigen Punkt wechseln.
+DOWN = Zur nächsten Punkt wechseln.
+
+#-------------------------------------------------------#
+# ID_028: UScreenStatMain #
+#-------------------------------------------------------#
+[ID_028]
+Title = Hauptbildschirm Statistiken
+Description = Hier werden die wichtigsten Statistiken über die Lieder, Spieler und Punktzahlen auf einen Blick angezeigt.
+#-------------------------------------------------------#
+SUB_010=Highscores
+ENT_011=Zeigt alle vorhandenen Highscores mit Datum und Schwierigkeitsstufe an.
+#-------------------------------------------------------#
+SUB_020=Beste Sänger
+ENT_021=Zeigt die besten Sänger mit durchschnittlicher Punktezahl an.
+#-------------------------------------------------------#
+SUB_030=Beliebteste Songs
+ENT_031=Zeigt die beliebtesten Songs mit Singhäufigkeit an.
+#-------------------------------------------------------#
+SUB_040=Beliebteste Bands
+ENT_041=Zeigt die beliebtesten Bands mit der Anzahl gesungener Lieder an.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+ESC = zurück
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+#-------------------------------------------------------#
+SEC_002 = Navigation
+LEFT = Zur vorherigen Statistik wechseln.
+RIGHT = Zur nächsten Statistik wechseln.
+UP = Zur vorherigen Statistik wechseln.
+DOWN = Zur nächsten Statistik wechseln.
+
+#-------------------------------------------------------#
+# ID_029: UScreenTop #
+#-------------------------------------------------------#
+[ID_029]
+Title = Highscores
+Description = Hier wird die Highscoreliste der besten acht Sänger mit Datum angezeigt. Falls weniger als 100 Punkte erreicht wurden oder das Lied nicht bis zur letzten Liedzeile gesungen wurde, wird es nicht gewertet.
+#-------------------------------------------------------#
+SEC_001 = Allgemein
+RETURN = weiter
+ESC = weiter
+PRINT = Screenshot erstellen
+Q = UltraStar Deluxe beenden
+
+#-------------------------------------------------------#
+# ID_030: Select Plugins #
+#-------------------------------------------------------#
+[ID_030]
+Title = Pluginauswahl
+Description = Hier können die Plugins einzeln aktiviert/deaktiviert werden.
+#-------------------------------------------------------#
+SEC_010 = Navigation
+UP = Plugins nach oben durchscrollen
+DOWN = Plugins nach unten durchscrollen
+ESC = Zurück zu den Optionen
+RETURN = Weiter zur Namenseingabe
+#-------------------------------------------------------#
+SEC_020 = Pluginauswahl
+SPACE = Plugin aktivieren/deaktivieren
+LEFT = Plugin deaktivieren
+RIGHT = Plugin aktivieren
+
+#-------------------------------------------------------#
+# ID_031: ScreenSongJumpTo #
+#-------------------------------------------------------#
+[ID_031]
+Title = Filter?
+Description = blah
+#-------------------------------------------------------#
+SEC_010 = Navigation
+ESC = raus hier...
+
+#-------------------------------------------------------#
+# ID_032: ScreenSongMenu #
+#-------------------------------------------------------#
+[ID_032]
+Title = PopupMenu Main?
+Description = blah
+#-------------------------------------------------------#
+SEC_010 = Navigation
+ESC = raus hier...
+
+#-------------------------------------------------------#
+# ID_033: ScreenSongMenu Party #
+#-------------------------------------------------------#
+[ID_033]
+Title = PopupMenu Party?
+Description = blah
+#-------------------------------------------------------#
+SEC_010 = Navigation
+ESC = raus hier... \ No newline at end of file
diff --git a/Game/Output/Languages/TODOs/Catalan.ini b/Game/Output/Languages/TODOs/Catalan.ini
new file mode 100644
index 00000000..713aec51
--- /dev/null
+++ b/Game/Output/Languages/TODOs/Catalan.ini
@@ -0,0 +1,299 @@
+[Text]
+SING_LOADING=Carregant...
+
+SING_CHOOSE_MODE=Triar mode
+SING_SING=cantar
+SING_SING_DESC=joc ràpid: cantar un solo o un duet
+
+SING_MULTI=festa
+SING_MULTI_DESC=cantar en mode festa
+
+SING_TOOLS=eines
+
+SING_STATS=estadístiques
+SING_STATS_DESC=veure estadístiques
+
+SING_EDITOR=editor
+SING_EDITOR_DESC=crea les teves propies cançons
+
+SING_GAME_OPTIONS=opcions de joc
+SING_GAME_OPTIONS_DESC=canviar preferències de joc
+
+SING_EXIT=sortir
+SING_EXIT_DESC=sortir del joc
+
+SING_OPTIONS=opcions
+SING_OPTIONS_DESC=canviar preferències
+SING_OPTIONS_WHEREAMI=Opcions
+
+SING_OPTIONS_GAME=joc
+SING_OPTIONS_GRAPHICS=gràfics
+SING_OPTIONS_SOUND=so
+SING_OPTIONS_LYRICS=lletres
+SING_OPTIONS_THEMES=aparença
+SING_OPTIONS_RECORD=gravar
+SING_OPTIONS_ADVANCED=avançat
+SING_OPTIONS_EXIT=enrere
+
+SING_OPTIONS_GAME_WHEREAMI=Opcions de joc
+SING_OPTIONS_GAME_DESC=opcions generals del joc
+SING_OPTIONS_GAME_PLAYERS=Jugadors
+SING_OPTIONS_GAME_DIFFICULTY=Dificultat
+SING_OPTIONS_GAME_LANGUAGE=Idioma
+SING_OPTIONS_GAME_TABS=Pestanyes
+SING_OPTIONS_GAME_SORTING=Ordenació
+SING_OPTIONS_GAME_DEBUG=Debug
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Opcions Gràfiques
+SING_OPTIONS_GRAPHICS_DESC=configurar gràfics
+SING_OPTIONS_GRAPHICS_RESOLUTION=Resoluciò
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Pantalla complerta
+SING_OPTIONS_GRAPHICS_DEPTH=Profunditat
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Oscil·loscopi
+SING_OPTIONS_GRAPHICS_LINEBONUS=Bonus de línia
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Mida pel·lícula
+
+SING_OPTIONS_SOUND_WHEREAMI=Opcions de so
+SING_OPTIONS_SOUND_DESC=configurar so
+SING_OPTIONS_SOUND_MIC_BOOST=Ampli Micro
+SING_OPTIONS_SOUND_CLICK_ASSIST=Assistència Click
+SING_OPTIONS_SOUND_BEAT_CLICK=Clic de ritme
+SING_OPTIONS_SOUND_THRESHOLD=Llindar
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Mode dos jugadors
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Volum previsualitzar
+SING_OPTIONS_SOUND_PREVIEWFADING=Fos previsualitzar
+
+SING_OPTIONS_LYRICS_WHEREAMI=Opcions Lletra
+SING_OPTIONS_LYRICS_DESC=configuració de lletres
+SING_OPTIONS_LYRICS_FONT=Font
+SING_OPTIONS_LYRICS_EFFECT=Efecte
+SING_OPTIONS_LYRICS_SOLMIZATION=Solfeig
+
+SING_OPTIONS_THEMES_WHEREAMI=Options d'Aparença
+SING_OPTIONS_THEMES_DESC=Configuració d'aparença
+SING_OPTIONS_THEMES_THEME=Aparença
+SING_OPTIONS_THEMES_SKIN=Pell
+SING_OPTIONS_THEMES_COLOR=Color
+
+SING_OPTIONS_RECORD_WHEREAMI=Opcions de micro
+SING_OPTIONS_RECORD_DESC=configuració del micro
+SING_OPTIONS_RECORD_CARD=Tarjeta de so
+SING_OPTIONS_RECORD_INPUT=Entrada
+SING_OPTIONS_RECORD_CHANNELL=Canal esquerre
+SING_OPTIONS_RECORD_CHANNELR=Canal dret
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Opcions Avançades
+SING_OPTIONS_ADVANCED_DESC=opcions avançades
+SING_OPTIONS_ADVANCED_EFFECTSING=Efectes de cantar
+SING_OPTIONS_ADVANCED_SCREENFADE=Fos de pantalla
+SING_OPTIONS_ADVANCED_LOADANIMATION=Animació càrrega
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Prequnta abans d'esborrar
+SING_OPTIONS_ADVANCED_LINEBONUS=Bonus de línia
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=Quantes vegades cantada
+SING_OPTIONS_ADVANCED_ONSONGCLICK=després de triar cançó
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Menú Automàtic de festa
+
+SING_LEGEND_SELECT=seleccionar
+SING_LEGEND_NAVIGATE=navegar
+SING_LEGEND_CONTINUE=continuar
+SING_LEGEND_ESC=enrere
+
+SING_PLAYER_DESC=entrar nom de jugador/s
+SING_PLAYER_WHEREAMI=Nom dels jugadors
+SING_PLAYER_ENTER_NAME=introduir nom
+
+SING_DIFFICULTY_DESC=triar dificultat
+SING_DIFFICULTY_WHEREAMI=Dificultat
+SING_DIFFICULTY_CONTINUE=a selecció de cançó
+SING_EASY=Fàcil
+SING_MEDIUM=Mitjà
+SING_HARD=Difícil
+
+SING_SONG_SELECTION_DESC=triar cançó
+SING_SONG_SELECTION_WHEREAMI=Selecció de cançons
+SING_SONG_SELECTION_GOTO=Anar a ..
+SING_SONG_SELECTION=selecció de cançons
+SING_SONG_SELECTION_MENU=menú
+SING_SONG_SELECTION_PLAYLIST=llista
+SING_SONGS_IN_CAT=Cançons
+PLAYLIST_CATTEXT=Playlist: %s
+
+SING_TIME=TEMPS
+SING_TOTAL=total
+SING_MODE=cantar sol
+SING_NOTES=notes
+SING_GOLDEN_NOTES=notes daurades
+SING_PHRASE_BONUS=bonus de línia
+
+SING_MENU=Menú principal
+
+SONG_SCORE=puntuació cançó
+SONG_SCORE_WHEREAMI=Puntuació
+
+SING_SCORE_TONE_DEAF=Sense oïda
+SING_SCORE_AMATEUR=Aficionat
+SING_SCORE_RISING_STAR=Futura estrella
+SING_SCORE_LEAD_SINGER=Bon cantant
+SING_SCORE_HIT_ARTIST=Líder de grup
+SING_SCORE_SUPERSTAR=Super estrella
+SING_SCORE_ULTRASTAR=Ultra estrella
+
+SING_TOP_5_CHARTS=millors 5 jugadors
+SING_TOP_5_CHARTS_WHEREAMI=millors 5
+SING_TOP_5_CHARTS_CONTINUE=a selecció de cançó
+
+POPUP_PERFECT=perfecte!
+POPUP_AWESOME=genial!
+POPUP_GREAT=molt bo!
+POPUP_GOOD=esta bé!
+POPUP_NOTBAD=pots millorar!
+POPUP_BAD=malament!
+POPUP_POOR=pobre!
+POPUP_AWFUL=boo fora!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= i
+
+SONG_MENU_NAME_MAIN=menú de cançons
+SONG_MENU_PLAY=Cantar
+SONG_MENU_CHANGEPLAYERS=Canviar jugadors
+SONG_MENU_EDIT=Editar
+SONG_MENU_MODI=Cantar un Modi
+SONG_MENU_CANCEL=Cancel·lar
+
+SONG_MENU_NAME_PLAYLIST=Menú de cançons
+SONG_MENU_PLAYLIST_ADD=Afegir Cançó
+SONG_MENU_PLAYLIST_DEL=Esborrar Cançó
+
+SONG_MENU_NAME_PLAYLIST_ADD=Afegir Song
+SONG_MENU_PLAYLIST_ADD_NEW=a nova llista
+SONG_MENU_PLAYLIST_ADD_EXISTING=a llista existent
+SONG_MENU_PLAYLIST_NOEXISTING=No hi ha llistes
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nova llista
+SONG_MENU_PLAYLIST_NEW_CREATE=Crear
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Sense nom
+
+SONG_MENU_NAME_PLAYLIST_DEL=Segur que vols esborrar?
+SONG_MENU_YES=Si
+SONG_MENU_NO=No
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Obrir llista
+SONG_MENU_PLAYLIST_LOAD=obrir
+SONG_MENU_PLAYLIST_DELCURRENT=esborrar llista
+
+SONG_MENU_NAME_PLAYLIST_DEL=Esborrar llista?
+
+SONG_MENU_NAME_PARTY_MAIN=Menú festa
+SONG_MENU_JOKER=Comodí
+
+SONG_MENU_NAME_PARTY_JOKER=utilitzar comodí
+
+SONG_JUMPTO_DESC=buscar cançó
+SONG_JUMPTO_TYPE_DESC=Buscar:
+SONG_JUMPTO_TYPE1=Tot
+SONG_JUMPTO_TYPE2=Títol
+SONG_JUMPTO_TYPE3=Artista
+SONG_JUMPTO_SONGSFOUND=%d Cançons trobades
+SONG_JUMPTO_NOSONGSFOUND=No s'han trobat cançons
+SONG_JUMPTO_HELP=Introduir text a cercar
+SONG_JUMPTO_CATTEXT=Cercant: %s
+
+PARTY_MODE=mode festa
+PARTY_DIFFICULTY=Dificultat
+PARTY_PLAYLIST=Mode llista
+PARTY_PLAYLIST_ALL=Tot
+PARTY_PLAYLIST_CATEGORY=Directori
+PARTY_PLAYLIST_PLAYLIST=llista
+PARTY_ROUNDS=Rondes
+PARTY_TEAMS=Equips
+PARTY_TEAMS_PLAYER1=Player Team1
+PARTY_TEAMS_PLAYER2=Player Team2
+PARTY_TEAMS_PLAYER3=Player Team3
+
+PARTY_LEGEND_CONTINUE=continuar
+
+PARTY_OPTIONS_DESC=opcions mode festa
+PARTY_OPTIONS_WHEREAMI=Opcions Festa
+
+PARTY_PLAYER_DESC=introduïr noms de jugadors i equips
+PARTY_PLAYER_WHEREAMI=Noms
+PARTY_PLAYER_ENTER_NAME=introduïr noms
+PARTY_PLAYER_LEGEND_CONTINUE=iniciar festa
+
+PARTY_ROUND_DESC=següent jugador al micro
+PARTY_ROUND_WHEREAMI=Següent Ronda
+PARTY_ROUND_LEGEND_CONTINUE=iniciar ronda
+
+PARTY_SONG_WHEREAMI=Selecció de cançó mode festa
+PARTY_SONG_LEGEND_CONTINUE=cantar
+PARTY_SONG_MENU=menú festa
+
+PARTY_SCORE_DESC=puntuació de l'última ronda
+PARTY_SCORE_WHEREAMI=Punts mode festa
+
+PARTY_WIN_DESC=guanyador de la festa
+PARTY_WIN_WHEREAMI=Guanyador
+PARTY_WIN_LEGEND_CONTINUE=tornar al menú principal
+
+PARTY_ROUND=Ronda
+PARTY_ROUND_WINNER=Guanyador
+PARTY_NOTPLAYEDYET=no s'ha jugat encara
+PARTY_NOBODY=ningú
+NEXT_ROUND=Següent ronda:
+
+PARTY_DISMISSED=Abandona!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=guanya!
+
+PLUGIN_HDL_NAME=Aguantar la línia
+PLUGIN_HDL_DESC=No baixis de la fletxa a la barra de qualitat
+
+PLUGIN_UNTIL5000_NAME=Fins a 5000
+PLUGIN_UNTIL5000_DESC=El primer a arribar a 5000 punts guanya
+
+PLUGIN_DUELL_NAME=Duel
+PLUGIN_DUELL_DESC=Cantar un duela fins a 10000 punts
+
+PLUGIN_BLIND_NAME=Mode cec
+PLUGIN_BLIND_DESC=Duel sense veure les notes
+
+STAT_MAIN=Estadístiques
+STAT_MAIN_DESC=General
+STAT_MAIN_WHEREAMI=Estadístiques
+
+STAT_OVERVIEW_INTRO=%0:s Estadístiques\nÚltima reinicialització %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Cançons(%3:d amb Video), de les que %1:d ya han sonat i %2:d encara no s'han jugat mai.\n La cançó més popular és %5:s de %4:s.
+STAT_OVERVIEW_PLAYER=Des de l'última reinicialització hi han hagut %0:d jugadors diferents.\n El millor jugador és %1:s amb una mitjana de %2:d Punts.\n %3:s ha fet la màxima puntuació amb %4:d Punts.
+
+STAT_DETAIL=Estadístques
+STAT_DETAIL_WHEREAMI=Estadístiques
+
+STAT_NEXT=Següent pàgina
+STAT_PREV=Pàgina anterior
+STAT_REVERSE=Ordre invers
+STAT_PAGE=%0:d de %1:d Pàgines\n (%2:d de %3:d Entrades)
+
+STAT_DESC_SCORES=Màximes puntuacions
+STAT_DESC_SCORES_REVERSED=Mínimes puntuacions
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Millors cantants
+STAT_DESC_SINGERS_REVERSED=Pitjors cantants
+STAT_FORMAT_SINGERS=%0:s \n Puntuació mitjana: %1:d
+
+STAT_DESC_SONGS=Cançons més populars
+STAT_DESC_SONGS_REVERSED=Cançons menys populars
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx cantades
+
+STAT_DESC_BANDS=Grups més populars
+STAT_DESC_BANDS_REVERSED=Grups menys populars
+STAT_FORMAT_BANDS=%0:s \n %1:dx Cantades
+
+MSG_ERROR_TITLE=Error
+MSG_QUESTION_TITLE=Qüestió
+MSG_QUIT_USDX=Realment vols sortir d'UltraStar?
+MSG_END_PARTY=Realment vols sortir del mode festa?
+ERROR_NO_SONGS=No hi ha cançons
+ERROR_NO_PLUGINS=No hi ha Plugins
+ERROR_CORRUPT_SONG=No es poden carregar les cançons \ No newline at end of file
diff --git a/Game/Output/Languages/TODOs/Croatian.ini b/Game/Output/Languages/TODOs/Croatian.ini
new file mode 100644
index 00000000..7e2c4225
--- /dev/null
+++ b/Game/Output/Languages/TODOs/Croatian.ini
@@ -0,0 +1,308 @@
+[Text]
+SING_LOADING=Ucitavanje...
+
+SING_CHOOSE_MODE=Izaberi nacin igre
+SING_SING=pjevaj
+SING_SING_DESC=brza igra: pjevaj solo ili duet
+
+SING_MULTI=party
+SING_MULTI_DESC=pjevaj u party mode-u
+
+SING_TOOLS=alati
+
+SING_STATS=statistika
+SING_STATS_DESC=pogledaj statistiku
+
+SING_EDITOR=editor
+SING_EDITOR_DESC=napravi svoje pjesme
+
+SING_GAME_OPTIONS=opcije igre
+SING_GAME_OPTIONS_DESC=promijeni postavke
+
+SING_EXIT=izlaz
+SING_EXIT_DESC=izlaz iz igre
+
+SING_OPTIONS=opcije
+SING_OPTIONS_DESC=promijeni postavke
+SING_OPTIONS_WHEREAMI=Opcije
+
+SING_OPTIONS_GAME=igra
+SING_OPTIONS_GRAPHICS=video
+SING_OPTIONS_SOUND=audio
+SING_OPTIONS_LYRICS=tekstovi
+SING_OPTIONS_THEMES=teme
+SING_OPTIONS_RECORD=snimanje
+SING_OPTIONS_ADVANCED=ostalo
+SING_OPTIONS_EXIT=natrag
+
+SING_OPTIONS_GAME_WHEREAMI=Opcije Igre
+SING_OPTIONS_GAME_DESC=osnovne opcije igre
+SING_OPTIONS_GAME_PLAYERS=Br. igraca
+SING_OPTIONS_GAME_DIFFICULTY=Težina
+SING_OPTIONS_GAME_LANGUAGE=Jezik
+SING_OPTIONS_GAME_TABS=Tabovi
+SING_OPTIONS_GAME_SORTING=Sortiranje
+SING_OPTIONS_GAME_DEBUG=Debug
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Opcije Videa
+SING_OPTIONS_GRAPHICS_DESC=video opcije
+SING_OPTIONS_GRAPHICS_RESOLUTION=Rezolucija
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Cijeli ekran
+SING_OPTIONS_GRAPHICS_DEPTH=Dubina boja
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Osciloskop
+SING_OPTIONS_GRAPHICS_LINEBONUS=Bonus linije
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Velicina videa
+
+SING_OPTIONS_SOUND_WHEREAMI=Opcije Zvuka
+SING_OPTIONS_SOUND_DESC=postavke zvuka
+SING_OPTIONS_SOUND_MIC_BOOST=Mic boost
+SING_OPTIONS_SOUND_CLICK_ASSIST=Pomoc klikovima
+SING_OPTIONS_SOUND_BEAT_CLICK=Klik na udarce
+SING_OPTIONS_SOUND_THRESHOLD=Threshold
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Igra za dva igraca
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Glasnoca prikaza
+SING_OPTIONS_SOUND_PREVIEWFADING=Fade-in vrijeme
+
+SING_OPTIONS_LYRICS_WHEREAMI=Opcije Tekstova
+SING_OPTIONS_LYRICS_DESC=postavke tekstova
+SING_OPTIONS_LYRICS_FONT=Font
+SING_OPTIONS_LYRICS_EFFECT=Efekt
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmizacija
+
+SING_OPTIONS_THEMES_WHEREAMI=Opcije Tema
+SING_OPTIONS_THEMES_DESC=postavke tema i skinova
+SING_OPTIONS_THEMES_THEME=Tema
+SING_OPTIONS_THEMES_SKIN=Skin
+SING_OPTIONS_THEMES_COLOR=Boja
+
+SING_OPTIONS_RECORD_WHEREAMI=Opcije Snimanja
+SING_OPTIONS_RECORD_DESC=postavke mikrofona
+SING_OPTIONS_RECORD_CARD=Zv. kartica
+SING_OPTIONS_RECORD_INPUT=Ulaz
+SING_OPTIONS_RECORD_CHANNELL=Lijevi kanal
+SING_OPTIONS_RECORD_CHANNELR=Desni kanal
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Ostale Opcije
+SING_OPTIONS_ADVANCED_DESC=ostale postavke
+SING_OPTIONS_ADVANCED_EFFECTSING=Efekti kod pjevanja
+SING_OPTIONS_ADVANCED_SCREENFADE=Fade-out ekrana
+SING_OPTIONS_ADVANCED_LOADANIMATION=Anim. tijekom ucit.
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Sigurn. pitanja
+SING_OPTIONS_ADVANCED_LINEBONUS=Bonus linije
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=Zapamti broj pjev.
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Nakon pjesme
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto party meni
+
+SING_LEGEND_SELECT=odaberi
+SING_LEGEND_NAVIGATE=navigacija
+SING_LEGEND_CONTINUE=nastavi
+SING_LEGEND_ESC=natrag
+
+SING_PLAYER_DESC=unesi ime igraca
+SING_PLAYER_WHEREAMI=Imena igraca
+SING_PLAYER_ENTER_NAME=unesi ime
+
+SING_DIFFICULTY_DESC=odaberi težinu
+SING_DIFFICULTY_WHEREAMI=Težina
+SING_DIFFICULTY_CONTINUE=odabir pjesme
+SING_EASY=Lako
+SING_MEDIUM=Srednje
+SING_HARD=Teško
+
+SING_SONG_SELECTION_DESC=odaberi pjesmu
+SING_SONG_SELECTION_WHEREAMI=Odabir Pjesme
+SING_SONG_SELECTION_GOTO=idi na ..
+SING_SONG_SELECTION=odabir pjesme
+SING_SONG_SELECTION_MENU=meni
+SING_SONG_SELECTION_PLAYLIST=playlista
+SING_SONGS_IN_CAT=Pjesme
+PLAYLIST_CATTEXT=Playlista: %s
+
+SING_TIME=TIME
+SING_TOTAL=ukupno
+SING_MODE=pjevaj solo
+SING_NOTES=note
+SING_GOLDEN_NOTES=zlatne note
+SING_PHRASE_BONUS=bonus
+
+SING_MENU=Glavni Meni
+
+SONG_SCORE=bodovi
+SONG_SCORE_WHEREAMI=Rezultat
+
+SING_SCORE_TONE_DEAF=Bez sluha
+SING_SCORE_AMATEUR=Amater
+SING_SCORE_RISING_STAR=Zvijezda u usponu
+SING_SCORE_LEAD_SINGER=Vodeci pjevac
+SING_SCORE_HIT_ARTIST=Hit Artist
+SING_SCORE_SUPERSTAR=Superstar
+SING_SCORE_ULTRASTAR=Ultrastar
+
+SING_TOP_5_CHARTS=top 5 Igraca
+SING_TOP_5_CHARTS_WHEREAMI=top 5
+SING_TOP_5_CHARTS_CONTINUE=odabir pjesme
+
+POPUP_PERFECT=izvanredno!
+POPUP_AWESOME=predivno!
+POPUP_GREAT=odlicno!
+POPUP_GOOD=dobro!
+POPUP_NOTBAD=nije loše!
+POPUP_BAD=loše!
+POPUP_POOR=jadno!
+POPUP_AWFUL=grozno!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= i
+
+SONG_MENU_NAME_MAIN=Kolekcija pjesama
+SONG_MENU_PLAY=Pjevaj
+SONG_MENU_CHANGEPLAYERS=Promijeni igrace
+SONG_MENU_EDIT=Uredi
+SONG_MENU_MODI=Pjevaj Modi
+SONG_MENU_CANCEL=Poništi
+
+SONG_MENU_NAME_PLAYLIST=Playliste
+SONG_MENU_PLAYLIST_ADD=Dodaj Pjesmu
+SONG_MENU_PLAYLIST_DEL=Izbriši Pjesmu
+
+SONG_MENU_NAME_PLAYLIST_ADD=Dodaj Pjesmu
+SONG_MENU_PLAYLIST_ADD_NEW=na novu playlistu
+SONG_MENU_PLAYLIST_ADD_EXISTING=na postojecu playlistu
+SONG_MENU_PLAYLIST_NOEXISTING=Nema playlisti.
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nova Playlista
+SONG_MENU_PLAYLIST_NEW_CREATE=Napravi
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Bez imena
+
+SONG_MENU_NAME_PLAYLIST_DEL=Stvarno obrisati?
+SONG_MENU_YES=Da
+SONG_MENU_NO=Ne
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Otvori Playlistu
+SONG_MENU_PLAYLIST_LOAD=otvori
+SONG_MENU_PLAYLIST_DELCURRENT=obriši trenutnu Playlistu
+
+SONG_MENU_NAME_PLAYLIST_DEL=Obriši Playlistu?
+
+SONG_MENU_NAME_PARTY_MAIN=Party Meni
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=iskoristi joker
+
+SONG_JUMPTO_DESC=pretraži pjesme
+SONG_JUMPTO_TYPE_DESC=Traži :
+SONG_JUMPTO_TYPE1=Sve
+SONG_JUMPTO_TYPE2=Naslov
+SONG_JUMPTO_TYPE3=Izvoðac
+SONG_JUMPTO_SONGSFOUND=%d pjes(a)ma naðeno
+SONG_JUMPTO_NOSONGSFOUND=Niti jedna pjesma nije pronaðena.
+SONG_JUMPTO_HELP=Unesi tekst koji želiš tražiti.
+SONG_JUMPTO_CATTEXT=Traži: %s
+
+PARTY_MODE=party mod
+PARTY_DIFFICULTY=Težina
+PARTY_PLAYLIST=Playlist Mod
+PARTY_PLAYLIST_ALL=Sve pjesme
+PARTY_PLAYLIST_CATEGORY=Folder
+PARTY_PLAYLIST_PLAYLIST=Playliste
+PARTY_ROUNDS=Runde
+PARTY_TEAMS=Br. Timova
+PARTY_TEAMS_PLAYER1=Br. Igraca - Tim1
+PARTY_TEAMS_PLAYER2=Br. Igraca - Tim2
+PARTY_TEAMS_PLAYER3=Br. Igraca - Tim3
+
+PARTY_LEGEND_CONTINUE=nastavi
+
+PARTY_OPTIONS_DESC=postavke za party igru
+PARTY_OPTIONS_WHEREAMI=Party Opcije
+
+PARTY_PLAYER_DESC=unesi imena timova i igraca!
+PARTY_PLAYER_WHEREAMI=Party Imena
+PARTY_PLAYER_ENTER_NAME=unesi imena
+PARTY_PLAYER_LEGEND_CONTINUE=zapocni party-igru
+
+PARTY_ROUND_DESC=sljed. igraci za mikr.
+PARTY_ROUND_WHEREAMI=Party Sljed runda
+PARTY_ROUND_LEGEND_CONTINUE=zapocni rundu
+
+PARTY_SONG_WHEREAMI=Party Odabir pjesme
+PARTY_SONG_LEGEND_CONTINUE=pjevaj
+PARTY_SONG_MENU=party meni
+
+PARTY_SCORE_DESC=bodovi zadnje runde
+PARTY_SCORE_WHEREAMI=Party Bodovi
+
+PARTY_WIN_DESC=pobjednik party igre
+PARTY_WIN_WHEREAMI=Party Pobjednik
+PARTY_WIN_LEGEND_CONTINUE=natrag na glavni meni
+
+PARTY_ROUND=Runda
+PARTY_ROUND_WINNER=Pobjednik
+PARTY_NOTPLAYEDYET=nije još odigr.
+PARTY_NOBODY=nitko ni
+NEXT_ROUND=Sljed. runda:
+
+PARTY_DISMISSED=Izbacen!
+PARTY_SCORE_WINS=%s je
+PARTY_SCORE_WINS2=pobijedio!
+
+PLUGIN_HDL_NAME=Zadrži liniju
+PLUGIN_HDL_DESC=Nemoj biti gori od pointera na rating baru.
+
+PLUGIN_UNTIL5000_NAME=Do 5000
+PLUGIN_UNTIL5000_DESC=Pobjeðuje onaj tko prvi doðe do 5000 bodova.
+
+PLUGIN_DUELL_NAME=Dvoboj
+PLUGIN_DUELL_DESC=Pjevaj dvoboj do 10000 bodova.
+
+PLUGIN_TEAMDUELL_NAME=Dvoboj timova
+PLUGIN_TEAMDUELL_DESC=Dodaj mikrofon!
+
+PLUGIN_BLIND_NAME=Slijepi nacin
+PLUGIN_BLIND_DESC=Dvoboj bez gledanja nota.
+
+PLUGIN_BLIND_NOSCORE_NAME=Slijepi nacin 2
+PLUGIN_BLIND_NOSCORE_DESC=Dvoboj bez gledanja nota i bodova.
+
+PLUGIN_MORE1000_NAME=1000 Više
+PLUGIN_MORE1000_DESC=Pjevajte dok jedan od igraca ne skupi 1000 bod više.
+
+STAT_MAIN=Statistika
+STAT_MAIN_DESC=General
+STAT_MAIN_WHEREAMI=Statistika
+
+STAT_OVERVIEW_INTRO=%0:s Statistika. \n Zadnji reset je bio %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d pjesama (%3:d sa Videom), od cega je %1:d pjesama otpjevano a %2:d nije.\n Najpopularnija pjesma je %5:s od %4:s.
+STAT_OVERVIEW_PLAYER=Od zadnjeg reseta bilo je %0:d razlicitih igraca.\n Najbolji igrac je %1:s sa prosjekom od %2:d bodova.\n %3:s je napravio/la najveci rezultat sa %4:d bodova.
+
+STAT_DETAIL=Statistika
+STAT_DETAIL_WHEREAMI=Detaljna statistika
+
+STAT_NEXT=Sljed. strana
+STAT_PREV=Preth. strana
+STAT_REVERSE=Obrnuti redoslijed
+STAT_PAGE=Strana %0:d od %1:d\n (%2:d od %3:d unosa)
+
+STAT_DESC_SCORES=HighScores
+STAT_DESC_SCORES_REVERSED=LowScores
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Najbolji pjevaci
+STAT_DESC_SINGERS_REVERSED=Najgori pjevaci
+STAT_FORMAT_SINGERS=%0:s \n Prosjecni bodovi: %1:d
+
+STAT_DESC_SONGS=Popularne pjesme
+STAT_DESC_SONGS_REVERSED=Nepopularne pjesme
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx otpjevano
+
+STAT_DESC_BANDS=Popularni bendovi
+STAT_DESC_BANDS_REVERSED=Nepopularni bendovi
+STAT_FORMAT_BANDS=%0:s \n %1:dx otpjevano
+
+MSG_ERROR_TITLE=Greška
+MSG_QUESTION_TITLE=Pitanje
+MSG_QUIT_USDX=Napustiti UltraStar?
+MSG_END_PARTY=Napustiti Party igru?
+ERROR_NO_SONGS=Nema ucitanih pjesama
+ERROR_NO_PLUGINS=Nema ucitanih pluginova
+ERROR_CORRUPT_SONG=Pjesma se ne može ucitati. \ No newline at end of file
diff --git a/Game/Output/Languages/TODOs/Danish.ini b/Game/Output/Languages/TODOs/Danish.ini
new file mode 100644
index 00000000..abf0f20c
--- /dev/null
+++ b/Game/Output/Languages/TODOs/Danish.ini
@@ -0,0 +1,298 @@
+[Text]
+SING_LOADING=Loader...
+
+SING_CHOOSE_MODE=Vælg modus
+SING_SING=Syng
+SING_SING_DESC=Hurtigt spil: Syng solo eller duet
+
+SING_MULTI=Fest
+SING_MULTI_DESC=Syng i fest modus
+
+SING_TOOLS=Værktøjer
+
+SING_STATS=stats
+SING_STATS_DESC=Se statestikker
+
+SING_EDITOR=editor
+SING_EDITOR_DESC=Lav dine egne sange
+SING_GAME_OPTIONS=Spil Indstillinger
+SING_GAME_OPTIONS_DESC=Ændre spil Indstillinger
+
+SING_EXIT=Forlad
+SING_EXIT_DESC=Forlad spillet
+
+SING_OPTIONS=Indstillinger
+SING_OPTIONS_DESC=Ændre Instillinger
+SING_OPTIONS_WHEREAMI=Indstillinger
+
+SING_OPTIONS_GAME=Spil
+SING_OPTIONS_GRAPHICS=Grafik
+SING_OPTIONS_SOUND=Lyd
+SING_OPTIONS_LYRICS=Tekster
+SING_OPTIONS_THEMES=Temaer
+SING_OPTIONS_RECORD=Optag
+SING_OPTIONS_ADVANCED=Advanceret
+SING_OPTIONS_EXIT=Tilbage
+
+SING_OPTIONS_GAME_WHEREAMI=Spil Indstillinger
+SING_OPTIONS_GAME_DESC=Generelle Spil Indstillinger
+SING_OPTIONS_GAME_PLAYERS=Spillere
+SING_OPTIONS_GAME_DIFFICULTY=Sværhedsgrad
+SING_OPTIONS_GAME_LANGUAGE=Sprog
+SING_OPTIONS_GAME_TABS=Tabs
+SING_OPTIONS_GAME_SORTING=Sorting
+SING_OPTIONS_GAME_DEBUG=Debug
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Grafik Indstillinger
+SING_OPTIONS_GRAPHICS_DESC=Grafik Indstillinger
+SING_OPTIONS_GRAPHICS_RESOLUTION=Opløsning
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Fuldskærm
+SING_OPTIONS_GRAPHICS_DEPTH=Farve dybte
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Oscilloskop
+SING_OPTIONS_GRAPHICS_LINEBONUS=Linie Bonus
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Film Størrelse
+
+SING_OPTIONS_SOUND_WHEREAMI=Lyd Indstillinger
+SING_OPTIONS_SOUND_DESC=Lyd Indstillinger
+SING_OPTIONS_SOUND_MIC_BOOST=Mikrofon Boost
+SING_OPTIONS_SOUND_CLICK_ASSIST=Click assist
+SING_OPTIONS_SOUND_BEAT_CLICK=Beat click
+SING_OPTIONS_SOUND_THRESHOLD=Tærskel
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=2 Spiller modus
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Frosmag Volume
+SING_OPTIONS_SOUND_PREVIEWFADING=Forsmag Fader
+
+SING_OPTIONS_LYRICS_WHEREAMI=Tekst Indstillinger
+SING_OPTIONS_LYRICS_DESC=Tekst Indstillinger
+SING_OPTIONS_LYRICS_FONT=Tekst Type
+SING_OPTIONS_LYRICS_EFFECT=Effekt
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmization
+
+SING_OPTIONS_THEMES_WHEREAMI=Tema Indstillinger
+SING_OPTIONS_THEMES_DESC=Tema og Skin Indstillinger
+SING_OPTIONS_THEMES_THEME=Tema
+SING_OPTIONS_THEMES_SKIN=Skin
+SING_OPTIONS_THEMES_COLOR=Farve
+
+SING_OPTIONS_RECORD_WHEREAMI=Optagelses Indstillinger
+SING_OPTIONS_RECORD_DESC=Mikrofon Indstillinger
+SING_OPTIONS_RECORD_CARD=Lydkort
+SING_OPTIONS_RECORD_INPUT=Input
+SING_OPTIONS_RECORD_CHANNELL=Venstre kanal
+SING_OPTIONS_RECORD_CHANNELR=Højre Kanal
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Advancerede Indstillinger
+SING_OPTIONS_ADVANCED_DESC=Advancerede Indstillinger
+SING_OPTIONS_ADVANCED_EFFECTSING=Sang Effekter
+SING_OPTIONS_ADVANCED_SCREENFADE=Skærm Fading
+SING_OPTIONS_ADVANCED_LOADANIMATION=Load Animation
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Savety Questions
+SING_OPTIONS_ADVANCED_LINEBONUS=Linie Bonus
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Efter sang valg
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto Festmodus
+
+SING_LEGEND_SELECT=Vælg
+SING_LEGEND_NAVIGATE=Naviger
+SING_LEGEND_CONTINUE=Fortsæt
+SING_LEGEND_ESC=Tilbage
+
+SING_PLAYER_DESC=Skriv Spiller Navn/e
+SING_PLAYER_WHEREAMI=Spiller Navne
+SING_PLAYER_ENTER_NAME=Skriv navn
+
+SING_DIFFICULTY_DESC=Vælg Sværhedsgrad
+SING_DIFFICULTY_WHEREAMI=Sværhedsgrad
+SING_DIFFICULTY_CONTINUE=Til sang valg
+SING_EASY=Let
+SING_MEDIUM=Normal
+SING_HARD=Svær
+
+SING_SONG_SELECTION_DESC=Vælg Din Sang
+SING_SONG_SELECTION_WHEREAMI=Sang Valg
+SING_SONG_SELECTION_GOTO=Gå Til ..
+SING_SONG_SELECTION=Sang Valg
+SING_SONG_SELECTION_MENU=Menu
+SING_SONG_SELECTION_PLAYLIST=Afspilningsliste
+SING_SONGS_IN_CAT=Songs
+PLAYLIST_CATTEXT=Playlist: %s
+
+SING_TIME=TID
+SING_TOTAL=Total
+SING_MODE=Syng Solo
+SING_NOTES=Noder
+SING_GOLDEN_NOTES=Gyldne Noder
+SING_PHRASE_BONUS=Linie Bonus
+
+SING_MENU=Hoved Menu
+
+SONG_SCORE=Sang score
+SONG_SCORE_WHEREAMI=Score
+
+SING_SCORE_TONE_DEAF=Tone Døv!
+SING_SCORE_AMATEUR=Amatør!
+SING_SCORE_RISING_STAR=Aspirende Stjerne
+SING_SCORE_LEAD_SINGER=Forsanger
+SING_SCORE_HIT_ARTIST=Etableret Stjerne
+SING_SCORE_SUPERSTAR=Super Stjerne
+SING_SCORE_ULTRASTAR=Ultra Stjerne
+
+SING_TOP_5_CHARTS=Top 5 Spillere
+SING_TOP_5_CHARTS_WHEREAMI=Top 5
+SING_TOP_5_CHARTS_CONTINUE=Til Sang Valg
+
+POPUP_PERFECT=Perfekt!
+POPUP_AWESOME=Utroligt!
+POPUP_GREAT=Meget Godt!
+POPUP_GOOD=Godt!
+POPUP_NOTBAD=Ikke dårligt!
+POPUP_BAD=Dårligt!
+POPUP_POOR=Meget Dårligt!
+POPUP_AWFUL=Ringe!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= og
+
+SONG_MENU_NAME_MAIN=Sang Menu
+SONG_MENU_PLAY=Syng
+SONG_MENU_CHANGEPLAYERS=Skift Spillere
+SONG_MENU_EDIT=Ændre
+SONG_MENU_MODI=Sing a Modi
+SONG_MENU_CANCEL=Annuller
+
+SONG_MENU_NAME_PLAYLIST=Sang Menu
+SONG_MENU_PLAYLIST_ADD=Tilføj Sang
+SONG_MENU_PLAYLIST_DEL=Slet Sang
+
+SONG_MENU_NAME_PLAYLIST_ADD=Tilføj Song
+SONG_MENU_PLAYLIST_ADD_NEW=Til Ny Afspilningsliste
+SONG_MENU_PLAYLIST_ADD_EXISTING=Til Eksisterende Afspilningsliste
+SONG_MENU_PLAYLIST_NOEXISTING=Ingen Tilgængelige Afspilningslister
+
+SONG_MENU_NAME_PLAYLIST_NEW=Ny Afspilningsliste
+SONG_MENU_PLAYLIST_NEW_CREATE=Skab
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Unavngiven
+
+SONG_MENU_NAME_PLAYLIST_DEL=Vil Du Virkelig Slette?
+SONG_MENU_YES=Ja
+SONG_MENU_NO=Nej
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Åben Afspilningsliste
+SONG_MENU_PLAYLIST_LOAD=Åben
+SONG_MENU_PLAYLIST_DELCURRENT=Slet Nuværende Afspilningsliste
+
+SONG_MENU_NAME_PLAYLIST_DEL=Slet Afspilningslisten?
+
+SONG_MENU_NAME_PARTY_MAIN=Fest Menu
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=Brug Jokeren
+
+SONG_JUMPTO_DESC=Søg Sang
+SONG_JUMPTO_TYPE_DESC=Søg Efter:
+SONG_JUMPTO_TYPE1=Alle
+SONG_JUMPTO_TYPE2=Titel
+SONG_JUMPTO_TYPE3=Kunstner
+SONG_JUMPTO_SONGSFOUND=%d Sang(e) fundet!
+SONG_JUMPTO_NOSONGSFOUND=Ingen Sange Fundet
+SONG_JUMPTO_HELP=Skriv Teksten Du Vil Søge Efter
+SONG_JUMPTO_CATTEXT=Søg Efter: %s
+
+PARTY_MODE=Fest modus
+PARTY_DIFFICULTY=Sværhedsgrad
+PARTY_PLAYLIST=Afspilningsliste modus
+PARTY_PLAYLIST_ALL=Alle sange
+PARTY_PLAYLIST_CATEGORY=Mappe
+PARTY_PLAYLIST_PLAYLIST=Afspilningsliste
+PARTY_ROUNDS=Runder
+PARTY_TEAMS=Teams
+PARTY_TEAMS_PLAYER1=Spiller Team 1
+PARTY_TEAMS_PLAYER2=Spiller Team 2
+PARTY_TEAMS_PLAYER3=Spiller Team 3
+
+PARTY_LEGEND_CONTINUE=Fortsæt
+
+PARTY_OPTIONS_DESC=Indstillinger for Fest spil
+PARTY_OPTIONS_WHEREAMI=Fest Indstillinger
+
+PARTY_PLAYER_DESC=Skriv Spiller of Team Navn!
+PARTY_PLAYER_WHEREAMI=Fest navne
+PARTY_PLAYER_ENTER_NAME=Skriv Navne
+PARTY_PLAYER_LEGEND_CONTINUE=Start Fest Spil
+
+PARTY_ROUND_DESC=Næste spillere til mikrofonerne
+PARTY_ROUND_WHEREAMI=Fest Næste runde
+PARTY_ROUND_LEGEND_CONTINUE=Start runde
+
+PARTY_SONG_WHEREAMI=Fest Sang-Valg
+PARTY_SONG_LEGEND_CONTINUE=Syng
+PARTY_SONG_MENU=Fest menu
+
+PARTY_SCORE_DESC=Sidste Rundes Score
+PARTY_SCORE_WHEREAMI=Fest Point
+
+PARTY_WIN_DESC=Vinderen Af Fest Spillet
+PARTY_WIN_WHEREAMI=Fest Vinder
+PARTY_WIN_LEGEND_CONTINUE=Tilbage til Hoved Menuen
+
+PARTY_ROUND=Runde
+PARTY_ROUND_WINNER=vinder
+PARTY_NOTPLAYEDYET=Ikke spillet endnu
+PARTY_NOBODY=Ingen
+NEXT_ROUND=Næste Runde:
+
+PARTY_DISMISSED=Afsluttet!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=Vinder!
+
+PLUGIN_HDL_NAME=Hold Linien
+PLUGIN_HDL_DESC=Få ikke værrer end pilen på skalaen peger på
+
+PLUGIN_UNTIL5000_NAME=Until 5000
+PLUGIN_UNTIL5000_DESC=Hvem får 5000 point først vinder the kampen.
+
+PLUGIN_DUELL_NAME=Duell
+PLUGIN_DUELL_DESC=Syng en duel intil 10000 point.
+
+PLUGIN_BLIND_NAME=Blind Modus
+PLUGIN_BLIND_DESC=Duel med usynlige noder.
+
+STAT_MAIN=Statestikker
+STAT_MAIN_DESC=Generelle
+STAT_MAIN_WHEREAMI=Statestikker
+
+STAT_OVERVIEW_INTRO=%0:s Statistics. \n Last Reset at %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Songs(%3:d with Video), whereof %1:d already were played and %2:d were not played yet.\n The most popular Song is %5:s from %4:s.
+STAT_OVERVIEW_PLAYER=Since the last Reset there were/was %0:d different Player(s).\n The best Player is %1:s with an average Score of %2:d Points.\n %3:s did the highest Score with %4:d Points.
+
+STAT_DETAIL=Statestikker
+STAT_DETAIL_WHEREAMI=Detaljerede Statestikker
+
+STAT_NEXT=Næste Side
+STAT_PREV=Tidligere Side
+STAT_REVERSE=Omvendt Orden
+STAT_PAGE=Seite %0:d of %1:d Pages\n (%2:d of %3:d Entrys)
+
+STAT_DESC_SCORES=HighScore
+STAT_DESC_SCORES_REVERSED=LowScore
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Bedste Sangere
+STAT_DESC_SINGERS_REVERSED=Værste Sangere
+STAT_FORMAT_SINGERS=%0:s \n Average Score: %1:d
+
+STAT_DESC_SONGS=Mest Populære Sange
+STAT_DESC_SONGS_REVERSED=Mindst Populære Sange
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx sung
+
+STAT_DESC_BANDS=Mest Populære Bands
+STAT_DESC_BANDS_REVERSED=Mindst Populære Bands
+STAT_FORMAT_BANDS=%0:s \n %1:dx Sung
+
+MSG_ERROR_TITLE=Fejl
+MSG_QUESTION_TITLE=Spørgsmål
+MSG_QUIT_USDX=Vil du virkelig forlade UltraStar?
+MSG_END_PARTY=Vil du virkelig forlade fest Modus?
+ERROR_NO_SONGS=Ingen Sange hentet
+ERROR_NO_PLUGINS=Igen Plugins hentet
+ERROR_CORRUPT_SONG=Sangen kunne ikke hentes. \ No newline at end of file
diff --git a/Game/Output/Languages/TODOs/Dutch.ini b/Game/Output/Languages/TODOs/Dutch.ini
new file mode 100644
index 00000000..1724751a
--- /dev/null
+++ b/Game/Output/Languages/TODOs/Dutch.ini
@@ -0,0 +1,299 @@
+[Text]
+SING_LOADING=Laden...
+
+SING_CHOOSE_MODE=Kies modus
+SING_SING=Zingen
+SING_SING_DESC=Snel spelen: zing een solo of een duet
+
+SING_MULTI=Party
+SING_MULTI_DESC=Zing in party-modus
+
+SING_TOOLS=Extra
+
+SING_STATS=Statistieken
+SING_STATS_DESC=Bekijk de statistieken
+
+SING_EDITOR=Editor
+SING_EDITOR_DESC=Creeër je eigen nummers
+
+SING_GAME_OPTIONS=Spel opties
+SING_GAME_OPTIONS_DESC=Verander de spel instellingen
+
+SING_EXIT=Afsluiten
+SING_EXIT_DESC=Spel beëindigen
+
+SING_OPTIONS=Opties
+SING_OPTIONS_DESC=Verander instellingen
+SING_OPTIONS_WHEREAMI=Opties
+
+SING_OPTIONS_GAME=Spel
+SING_OPTIONS_GRAPHICS=Grafisch
+SING_OPTIONS_SOUND=Geluid
+SING_OPTIONS_LYRICS=Teksten
+SING_OPTIONS_THEMES=Thema's
+SING_OPTIONS_RECORD=Opnamen
+SING_OPTIONS_ADVANCED=Geavanceerd
+SING_OPTIONS_EXIT=Terug
+
+SING_OPTIONS_GAME_WHEREAMI=Opties Spel
+SING_OPTIONS_GAME_DESC=Algemene spelinstellingen
+SING_OPTIONS_GAME_PLAYERS=Spelers
+SING_OPTIONS_GAME_DIFFICULTY=Moeilijkheidsgraad
+SING_OPTIONS_GAME_LANGUAGE=Taal
+SING_OPTIONS_GAME_TABS=Tabbladen
+SING_OPTIONS_GAME_SORTING=Sorteren
+SING_OPTIONS_GAME_DEBUG=Debug
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Opties Grafisch
+SING_OPTIONS_GRAPHICS_DESC=Grafische instellingen
+SING_OPTIONS_GRAPHICS_RESOLUTION=Resolutie
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Volledig scherm
+SING_OPTIONS_GRAPHICS_DEPTH=Kleurdiepte
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Oscilloscoop
+SING_OPTIONS_GRAPHICS_LINEBONUS=Regel Bonus
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Video formaat
+
+SING_OPTIONS_SOUND_WHEREAMI=Opties geluid
+SING_OPTIONS_SOUND_DESC=Geluidsinstellingen
+SING_OPTIONS_SOUND_MIC_BOOST=Mic versterken
+SING_OPTIONS_SOUND_CLICK_ASSIST=Klik assistent
+SING_OPTIONS_SOUND_BEAT_CLICK=Metronoom
+SING_OPTIONS_SOUND_THRESHOLD=Drempelwaarde
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Twee speler modus
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Selectie Volume
+SING_OPTIONS_SOUND_PREVIEWFADING=Crossfading
+
+SING_OPTIONS_LYRICS_WHEREAMI=Opties Teksten
+SING_OPTIONS_LYRICS_DESC=Tekstinstellingen
+SING_OPTIONS_LYRICS_FONT=Lettertype
+SING_OPTIONS_LYRICS_EFFECT=Effect
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmisatie
+
+SING_OPTIONS_THEMES_WHEREAMI=Opties Thema's
+SING_OPTIONS_THEMES_DESC=Thema en Skin instellingen
+SING_OPTIONS_THEMES_THEME=Thema
+SING_OPTIONS_THEMES_SKIN=Skin
+SING_OPTIONS_THEMES_COLOR=Kleur
+
+SING_OPTIONS_RECORD_WHEREAMI=Opties Opnamen
+SING_OPTIONS_RECORD_DESC=Microfoon instellingen
+SING_OPTIONS_RECORD_CARD=Geluidskaart
+SING_OPTIONS_RECORD_INPUT=Aansluiting
+SING_OPTIONS_RECORD_CHANNELL=Linkerkanaal
+SING_OPTIONS_RECORD_CHANNELR=Rechterkanaal
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Opties Geavanceerd
+SING_OPTIONS_ADVANCED_DESC=Geavanceerde instellingen
+SING_OPTIONS_ADVANCED_EFFECTSING=Noot effecten
+SING_OPTIONS_ADVANCED_SCREENFADE=Schermovergang
+SING_OPTIONS_ADVANCED_LOADANIMATION=Laad Animaties
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Veiligheidsvragen
+SING_OPTIONS_ADVANCED_LINEBONUS=Regel Bonus
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Na Selectie
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto Partymenu
+
+SING_LEGEND_SELECT=Selecteer
+SING_LEGEND_NAVIGATE=Navigeer
+SING_LEGEND_CONTINUE=Verder
+SING_LEGEND_ESC=Terug
+
+SING_PLAYER_DESC=Type spelersnaam
+SING_PLAYER_WHEREAMI=Spelernaam
+SING_PLAYER_ENTER_NAME=type de naam
+
+SING_DIFFICULTY_DESC=Selecteer moeilijkheidsgraad
+SING_DIFFICULTY_WHEREAMI=Moeilijkheidsgraad
+SING_DIFFICULTY_CONTINUE=Verder een nummer selecteren
+SING_EASY=Makkelijk
+SING_MEDIUM=Gemiddeld
+SING_HARD=Moeilijk
+
+SING_SONG_SELECTION_DESC=Kies een nummer
+SING_SONG_SELECTION_WHEREAMI=Nummer selecteren
+SING_SONG_SELECTION_GOTO=Ga naar...
+SING_SONG_SELECTION=Nummer Selectie
+SING_SONG_SELECTION_MENU=Menu
+SING_SONG_SELECTION_PLAYLIST=Speellijst
+SING_SONGS_IN_CAT=Nummers
+PLAYLIST_CATTEXT=Speellijst: %s
+
+SING_TIME=TIJD
+SING_TOTAL=Totaal
+SING_MODE=Zing een solo
+SING_NOTES=Noten
+SING_GOLDEN_NOTES=Gouden noten
+SING_PHRASE_BONUS=Regel bonus
+
+SING_MENU=Hoofdmenu
+
+SONG_SCORE=Nummer score
+SONG_SCORE_WHEREAMI=Score
+
+SING_SCORE_TONE_DEAF=Toon Doof
+SING_SCORE_AMATEUR=Amateur
+SING_SCORE_RISING_STAR=Beginnende Ster
+SING_SCORE_LEAD_SINGER=Hoofd Zanger
+SING_SCORE_HIT_ARTIST=Hit Artiest
+SING_SCORE_SUPERSTAR=Superster
+SING_SCORE_ULTRASTAR=Ultrastar
+
+SING_TOP_5_CHARTS=Top 5 Spelers
+SING_TOP_5_CHARTS_WHEREAMI=Top 5
+SING_TOP_5_CHARTS_CONTINUE=Naar de nummer selectie
+
+POPUP_PERFECT=perfect!
+POPUP_AWESOME=super!
+POPUP_GREAT=geweldig!
+POPUP_GOOD=goed!
+POPUP_NOTBAD=niet slecht!
+POPUP_BAD=slecht!
+POPUP_POOR=beroerd!
+POPUP_AWFUL=verschrikking!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= en
+
+SONG_MENU_NAME_MAIN=Nummer menu
+SONG_MENU_PLAY=Zing
+SONG_MENU_CHANGEPLAYERS=Verander spelers
+SONG_MENU_EDIT=Bewerken
+SONG_MENU_MODI=Zing modus
+SONG_MENU_CANCEL=Afbreken
+
+SONG_MENU_NAME_PLAYLIST=Nummer Menu
+SONG_MENU_PLAYLIST_ADD=Nummer toevoegen
+SONG_MENU_PLAYLIST_DEL=Nummer verwijderen
+
+SONG_MENU_NAME_PLAYLIST_ADD=Nummer toevoegen
+SONG_MENU_PLAYLIST_ADD_NEW=Nieuwe speellijst
+SONG_MENU_PLAYLIST_ADD_EXISTING=Afsluiten speellijst
+SONG_MENU_PLAYLIST_NOEXISTING=Geen speellijst aanwezig
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nieuwe speellijst
+SONG_MENU_PLAYLIST_NEW_CREATE=Creeër
+SONG_MENU_PLAYLIST_NEW_UNNAMED=geennaam
+
+SONG_MENU_NAME_PLAYLIST_DEL=Werkelijk verwijderen?
+SONG_MENU_YES=Ja
+SONG_MENU_NO=Nee
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Speellijst openen
+SONG_MENU_PLAYLIST_LOAD=Openen
+SONG_MENU_PLAYLIST_DELCURRENT=Verwijder huidige speellijst
+
+SONG_MENU_NAME_PLAYLIST_DEL=Verwijder speellijst?
+
+SONG_MENU_NAME_PARTY_MAIN=Party Menu
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=Gebruik joker
+
+SONG_JUMPTO_DESC=Zoek nummer
+SONG_JUMPTO_TYPE_DESC=Zoek naar:
+SONG_JUMPTO_TYPE1=Alles
+SONG_JUMPTO_TYPE2=Titel
+SONG_JUMPTO_TYPE3=Artiest
+SONG_JUMPTO_SONGSFOUND=%d Nummer(s) gevonden
+SONG_JUMPTO_NOSONGSFOUND=Geen nummers gevonden
+SONG_JUMPTO_HELP=Type tekst om te zoeken naar
+SONG_JUMPTO_CATTEXT=Zoek naar: %s
+
+PARTY_MODE=Party modus
+PARTY_DIFFICULTY=Moeilijkheidsgraad
+PARTY_PLAYLIST=Speellijst modus
+PARTY_PLAYLIST_ALL=Alle nummers
+PARTY_PLAYLIST_CATEGORY=Map
+PARTY_PLAYLIST_PLAYLIST=Speellijst
+PARTY_ROUNDS=Rondes
+PARTY_TEAMS=Teams
+PARTY_TEAMS_PLAYER1=Spelers Team1
+PARTY_TEAMS_PLAYER2=Spelers Team2
+PARTY_TEAMS_PLAYER3=Spelers Team3
+
+PARTY_LEGEND_CONTINUE=Verder
+
+PARTY_OPTIONS_DESC=Instellingen voor de party-spellen
+PARTY_OPTIONS_WHEREAMI=Party Opties
+
+PARTY_PLAYER_DESC=Type speler- en teamnamen!
+PARTY_PLAYER_WHEREAMI=Party Namen
+PARTY_PLAYER_ENTER_NAME=Type namen
+PARTY_PLAYER_LEGEND_CONTINUE=Start Party spel
+
+PARTY_ROUND_DESC=Volgende spelers naar de microfoons
+PARTY_ROUND_WHEREAMI=Party Volgende Ronde
+PARTY_ROUND_LEGEND_CONTINUE=Start ronde
+
+PARTY_SONG_WHEREAMI=Party nummer selectie
+PARTY_SONG_LEGEND_CONTINUE=Zing
+PARTY_SONG_MENU=Party menu
+
+PARTY_SCORE_DESC=scores van de laatste ronde
+PARTY_SCORE_WHEREAMI=Party Punten
+
+PARTY_WIN_DESC=winnaar van het party spel
+PARTY_WIN_WHEREAMI=Party Winnaar
+PARTY_WIN_LEGEND_CONTINUE=Terug naar het hoofdmenu
+
+PARTY_ROUND=Ronde
+PARTY_ROUND_WINNER=Winnaar
+PARTY_NOTPLAYEDYET=nog niet gespeeld
+PARTY_NOBODY=niemand
+NEXT_ROUND=Volgende ronde:
+
+PARTY_DISMISSED=Verworpen!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=gewonnen!
+
+PLUGIN_HDL_NAME=Houd de Regel
+PLUGIN_HDL_DESC=Zing niet slechter dan de wijzer in de zing-o-meter aangeeft
+
+PLUGIN_UNTIL5000_NAME=Tot 5000
+PLUGIN_UNTIL5000_DESC=Wie het eerst 5000 punten heeft wint het spel.
+
+PLUGIN_DUELL_NAME=Duel
+PLUGIN_DUELL_DESC=Zing een duel tot 10000 punten.
+
+PLUGIN_BLIND_NAME=Blinde Modus
+PLUGIN_BLIND_DESC=Duel zonder de dat je de noten ziet.
+
+STAT_MAIN=Statistieken
+STAT_MAIN_DESC=Algemeen
+STAT_MAIN_WHEREAMI=Statistieken
+
+STAT_OVERVIEW_INTRO=%0:s Statistieken. \n Laaste herstart was op %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d nummers(%3:d met Video), waarvan %1:d al zijn gespeeld en %2:d nog niet gespeeld.\n Het meest populaire nummer is %5:s van %4:s.
+STAT_OVERVIEW_PLAYER=Sinds de laatste herstart zijn er %0:d verschillende speler(s).\n De beste speler is %1:s met een gemiddelde score van %2:d punten.\n %3:s Heeft de hoogste Score behaald met %4:d punten.
+
+STAT_DETAIL=Statistieken
+STAT_DETAIL_WHEREAMI=Gedetaileerde statistieken
+
+STAT_NEXT=Volgende pagina
+STAT_PREV=Vorige pagina
+STAT_REVERSE=Anders om
+STAT_PAGE=Pagina %0:d van %1:d Pagina's\n (%2:d van %3:d records)
+
+STAT_DESC_SCORES=Hoogste scores
+STAT_DESC_SCORES_REVERSED=Laagste scores
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Beste Zangers
+STAT_DESC_SINGERS_REVERSED=Slechtste Zangers
+STAT_FORMAT_SINGERS=%0:s \n Gemiddelde score: %1:d
+
+STAT_DESC_SONGS=Populairste nummer
+STAT_DESC_SONGS_REVERSED=Minst populaire nummer
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx gezongen
+
+STAT_DESC_BANDS=Populairste artiest
+STAT_DESC_BANDS_REVERSED=Minst populaire artiest
+STAT_FORMAT_BANDS=%0:s \n %1:dx gezongen
+
+MSG_ERROR_TITLE=FOUT!
+MSG_QUESTION_TITLE=Vraag
+MSG_QUIT_USDX=Ultrastar afsluiten?
+MSG_END_PARTY=Party modus afsluiten?
+ERROR_NO_SONGS=Geen nummers geladen
+ERROR_NO_PLUGINS=Geen plugins geladen
+ERROR_CORRUPT_SONG=Nummer kan niet worden geladen. \ No newline at end of file
diff --git a/Game/Output/Languages/TODOs/Euskara.ini b/Game/Output/Languages/TODOs/Euskara.ini
new file mode 100644
index 00000000..ed851806
--- /dev/null
+++ b/Game/Output/Languages/TODOs/Euskara.ini
@@ -0,0 +1,298 @@
+[Text]
+SING_LOADING=Kargatzen...
+
+SING_CHOOSE_MODE=Aukeratu
+SING_SING=Kantatu
+SING_SING_DESC=Kantatu
+
+SING_MULTI=Taldea
+SING_MULTI_DESC=Taldean kantatu
+
+SING_TOOLS=Erremintak
+
+SING_STATS=Estatistikak
+SING_STATS_DESC=Estatistikak ikusi
+
+SING_EDITOR=Editorea
+SING_EDITOR_DESC=Zure kantuak sortu
+
+SING_GAME_OPTIONS=Aukerak
+SING_GAME_OPTIONS_DESC=Jokoaren aukerak aldatu
+
+SING_EXIT=Irten
+SING_EXIT_DESC=Jokotik irten
+
+SING_OPTIONS=Aukerak
+SING_OPTIONS_DESC=Aukerak aldatu
+SING_OPTIONS_WHEREAMI=Aukerak
+
+SING_OPTIONS_GAME=Jokoa
+SING_OPTIONS_GRAPHICS=Grafikoak
+SING_OPTIONS_SOUND=Soinua
+SING_OPTIONS_LYRICS=Letrak
+SING_OPTIONS_THEMES=Gaiak
+SING_OPTIONS_RECORD=Grabazioa
+SING_OPTIONS_ADVANCED=Aurreratuak
+SING_OPTIONS_EXIT=Itzuli
+
+SING_OPTIONS_GAME_WHEREAMI=Jokoaren aukerak
+SING_OPTIONS_GAME_DESC=Jokoaren aukera orokorrak
+SING_OPTIONS_GAME_PLAYERS=Jokalariak
+SING_OPTIONS_GAME_DIFFICULTY=Zailtasuna
+SING_OPTIONS_GAME_LANGUAGE=Hizkuntz
+SING_OPTIONS_GAME_TABS=Etiketa
+SING_OPTIONS_GAME_SORTING=Sailkatu
+SING_OPTIONS_GAME_DEBUG=Arazketa era
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Aukera grafikoak
+SING_OPTIONS_GRAPHICS_DESC=Aukera grafikoak
+SING_OPTIONS_GRAPHICS_RESOLUTION=Erresoluzioa
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Pantaila osoa
+SING_OPTIONS_GRAPHICS_DEPTH=Kolorearen kalitatea
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Osziloskopioa
+SING_OPTIONS_GRAPHICS_LINEBONUS=Bonus marra
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Bideoaren tamaina
+
+SING_OPTIONS_SOUND_WHEREAMI=Soinuaren aukerak
+SING_OPTIONS_SOUND_DESC=Soinuaren aukerak
+SING_OPTIONS_SOUND_MIC_BOOST=Mikrofonoa indartu
+SING_OPTIONS_SOUND_CLICK_ASSIST=Noten laguntza
+SING_OPTIONS_SOUND_BEAT_CLICK=Kolpeen laguntza
+SING_OPTIONS_SOUND_THRESHOLD=Mikrofonoa arindu
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Bi jokalariren era
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Bolumen aurreratua
+SING_OPTIONS_SOUND_PREVIEWFADING=Joanaldia
+
+SING_OPTIONS_LYRICS_WHEREAMI=Letren aukerak
+SING_OPTIONS_LYRICS_DESC=Letren aukerak
+SING_OPTIONS_LYRICS_FONT=Iturria
+SING_OPTIONS_LYRICS_EFFECT=Efektua
+SING_OPTIONS_LYRICS_SOLMIZATION=Solfeoa
+
+SING_OPTIONS_THEMES_WHEREAMI=Gaien aukerak
+SING_OPTIONS_THEMES_DESC=Gaien aukerak
+SING_OPTIONS_THEMES_THEME=Gaia
+SING_OPTIONS_THEMES_SKIN=Azala
+SING_OPTIONS_THEMES_COLOR=Kolorea
+
+SING_OPTIONS_RECORD_WHEREAMI=Grabazioaren aukerak
+SING_OPTIONS_RECORD_DESC=Grabazioaren akerak
+SING_OPTIONS_RECORD_CARD=Soinu txartela
+SING_OPTIONS_RECORD_INPUT=Captura
+SING_OPTIONS_RECORD_CHANNELL=Ezkerreko kanala
+SING_OPTIONS_RECORD_CHANNELR=Eskuineko kanala
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Aukera aurreratuak
+SING_OPTIONS_ADVANCED_DESC=Aukera aurreratuak
+SING_OPTIONS_ADVANCED_EFFECTSING=Kantuan efektuak
+SING_OPTIONS_ADVANCED_SCREENFADE=Desvanecimiento
+SING_OPTIONS_ADVANCED_LOADANIMATION=Kargatzearen animazioa
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Galdetu
+SING_OPTIONS_ADVANCED_LINEBONUS=Bonus marra
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Kantua aukeratzean
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Taldearen menu automatikoa
+
+SING_LEGEND_SELECT=Aukeratu
+SING_LEGEND_NAVIGATE=Nabigatu
+SING_LEGEND_CONTINUE=Jarraitu
+SING_LEGEND_ESC=Itzuli
+
+SING_PLAYER_DESC=Jokalarien izenak
+SING_PLAYER_WHEREAMI=Jokalarien izenak
+SING_PLAYER_ENTER_NAME=Izenak idatzi
+
+SING_DIFFICULTY_DESC=Zailtasuna aukeratu
+SING_DIFFICULTY_WHEREAMI=Zailtasuna
+SING_DIFFICULTY_CONTINUE=Hurrengoa
+SING_EASY=Erreza
+SING_MEDIUM=Ertaina
+SING_HARD=Zaila
+
+SING_SONG_SELECTION_DESC=Kantua hautatu
+SING_SONG_SELECTION_WHEREAMI=Kantuaren hautaketa
+SING_SONG_SELECTION_GOTO=Joan...
+SING_SONG_SELECTION=Kantuaren hautaketa
+SING_SONG_SELECTION_MENU=Menua
+SING_SONG_SELECTION_PLAYLIST=Zerrenda
+SING_SONGS_IN_CAT=Kantuak
+PLAYLIST_CATTEXT=Lista: %
+
+SING_TIME=Denbora
+SING_TOTAL=Guztira
+SING_MODE=Bakarrik
+SING_NOTES=Notak
+SING_GOLDEN_NOTES=Urrezko notak
+SING_PHRASE_BONUS=Bonus marra
+
+SING_MENU=Menu nagusia
+
+SONG_SCORE=Puntuak
+SONG_SCORE_WHEREAMI=
+
+SING_SCORE_TONE_DEAF=Desafinatu
+SING_SCORE_AMATEUR=Zale (Aficionado)
+SING_SCORE_RISING_STAR=Hobetzen
+SING_SCORE_LEAD_SINGER=Kantaria
+SING_SCORE_HIT_ARTIST=Kantari handia
+SING_SCORE_SUPERSTAR=Superizarra
+SING_SCORE_ULTRASTAR=Ultraizarra
+
+SING_TOP_5_CHARTS=Onenak
+SING_TOP_5_CHARTS_WHEREAMI=
+SING_TOP_5_CHARTS_CONTINUE=Jarraitu
+
+POPUP_PERFECT=Perfektu!
+POPUP_AWESOME=Txundigarri!
+POPUP_GREAT=Sekulakoa!
+POPUP_GOOD=Ongi!
+POPUP_NOTBAD=Ez dago gaizki!
+POPUP_BAD=Gaizki!
+POPUP_POOR=Oso gaizki!
+POPUP_AWFUL=Gaizkiago ezin!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= eta
+
+SONG_MENU_NAME_MAIN=Kantuaren menua
+SONG_MENU_PLAY=Kantatu
+SONG_MENU_CHANGEPLAYERS=Jokalaria aukeratu
+SONG_MENU_EDIT=Aldatu
+SONG_MENU_MODI=Motza kantatu
+SONG_MENU_CANCEL=Ezeztatu
+
+SONG_MENU_NAME_PLAYLIST=Menua
+SONG_MENU_PLAYLIST_ADD=Kantua gehitu
+SONG_MENU_PLAYLIST_DEL=Kantua kendu
+
+SONG_MENU_NAME_PLAYLIST_ADD=Kantua gehitu
+SONG_MENU_PLAYLIST_ADD_NEW=Zerrenda berrira
+SONG_MENU_PLAYLIST_ADD_EXISTING=Zerrendara
+SONG_MENU_PLAYLIST_NOEXISTING=Ez dago zerrendarik
+
+SONG_MENU_NAME_PLAYLIST_NEW=Zerrenda berria
+SONG_MENU_PLAYLIST_NEW_CREATE=Sortu
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Izen gabe
+
+SONG_MENU_NAME_PLAYLIST_DEL=Kendu?
+SONG_MENU_YES=Bai
+SONG_MENU_NO=Ez
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Zerrenda zabaldu
+SONG_MENU_PLAYLIST_LOAD=Zabaldu
+SONG_MENU_PLAYLIST_DELCURRENT=Zerrenda hau kendu
+SONG_MENU_NAME_PLAYLIST_DEL=Kendu?
+
+SONG_MENU_NAME_PARTY_MAIN=Menua
+SONG_MENU_JOKER=Aleatorio
+
+SONG_MENU_NAME_PARTY_JOKER=Aleatorio
+
+SONG_JUMPTO_DESC=Bilatu
+SONG_JUMPTO_TYPE_DESC=Bilatu:
+SONG_JUMPTO_TYPE1=Dena
+SONG_JUMPTO_TYPE2=Tituloa
+SONG_JUMPTO_TYPE3=Artista
+SONG_JUMPTO_SONGSFOUND=%d kantu aurkitu dira
+SONG_JUMPTO_NOSONGSFOUND=Ez daugo kanturik
+SONG_JUMPTO_HELP=Idatzi hitz gakoak
+SONG_JUMPTO_CATTEXT=Bilatu: %s
+
+PARTY_MODE=Taldeko modua
+PARTY_DIFFICULTY=Zailtasuna
+PARTY_PLAYLIST=Zerrenda modua
+PARTY_PLAYLIST_ALL=Dena
+PARTY_PLAYLIST_CATEGORY=Karpeta
+PARTY_PLAYLIST_PLAYLIST=Zerrendak
+PARTY_ROUNDS=Errondak
+PARTY_TEAMS=Taldeak
+PARTY_TEAMS_PLAYER1=1 taldeko jokalariak
+PARTY_TEAMS_PLAYER2=2 taldeko jokalariak
+PARTY_TEAMS_PLAYER3=3 taldeko jokalariak
+
+PARTY_LEGEND_CONTINUE=Jarraitu
+
+PARTY_OPTIONS_DESC=Taldeko jokoaren aukerak
+PARTY_OPTIONS_WHEREAMI=
+
+PARTY_PLAYER_DESC=Jokalarien eta taldeen izenak idatzi
+PARTY_PLAYER_WHEREAMI=Taldeen izenak
+PARTY_PLAYER_ENTER_NAME=Izena idatzi
+PARTY_PLAYER_LEGEND_CONTINUE=Hasi
+
+PARTY_ROUND_DESC=Hurrengo jokalaria
+PARTY_ROUND_WHEREAMI=Hurrngo erronda
+PARTY_ROUND_LEGEND_CONTINUE=Erronda hasi
+
+PARTY_SONG_WHEREAMI=Kantua aukeratu
+PARTY_SONG_LEGEND_CONTINUE=Kantatu
+PARTY_SONG_MENU=Menua
+
+PARTY_SCORE_DESC=Azkeneko errondaren puntoak
+PARTY_SCORE_WHEREAMI=
+
+PARTY_WIN_DESC=Talde irabazlea
+PARTY_WIN_WHEREAMI=
+PARTY_WIN_LEGEND_CONTINUE=Menu nagusira joan
+
+PARTY_ROUND=Erronda
+PARTY_ROUND_WINNER=Irabazlea
+PARTY_NOTPLAYEDYET=Jokatu gabe
+PARTY_NOBODY=Inor
+NEXT_ROUND=Hurrengo erronda:
+
+PARTY_DISMISSED=Galdu duzu!
+PARTY_SCORE_WINS=%
+PARTY_SCORE_WINS2=Irabazi duzu!
+
+PLUGIN_HDL_NAME=Jarraitu horrela
+PLUGIN_HDL_DESC=Ez jaitsi pantailan markatutako puntuak!
+
+PLUGIN_UNTIL5000_NAME=5000-arte
+PLUGIN_UNTIL5000_DESC=5000 puntu hartzen duena irabazle.
+
+PLUGIN_DUELL_NAME=Duelua
+PLUGIN_DUELL_DESC=Duelu bat egin 10.000 punturarte.
+
+PLUGIN_BLIND_NAME=Itsu modua
+PLUGIN_BLIND_DESC=Notak begiratu gabeko duelua.
+
+STAT_MAIN=Estadistikak
+STAT_MAIN_DESC=Orokorra
+STAT_MAIN_WHEREAMI=Estadistikak
+
+STAT_OVERVIEW_INTRO=%0:s Estatistikak. \n Azkenengo aldiz erabili zen: %3:d-%2:.2d-%1:.2d
+STAT_OVERVIEW_SONG=%0:d Kantu daude (%3:d bideoarekin), eta hauetatik %1:d kantatu dira eta %2:d oraindik ez.\n Kanturik ospetsuena "%5:s" da %4:s taldearena.
+STAT_OVERVIEW_PLAYER= %0:d jokalari daude.\n Onena %1:s da bataz-besteko %2:d punturekin.\n %3:s -(e)k puntu gehien egin ditu: %4:d puntu.
+
+STAT_DETAIL=Estatistikak
+STAT_DETAIL_WHEREAMI=Estatistika zehaztuak
+
+STAT_NEXT=Hurrengoa
+STAT_PREV=Aurrekoa
+STAT_REVERSE=Atzekoz aurrera jarri
+STAT_PAGE=Página %0:d de %1:d \n (%2:d of %3:d Entrys)
+
+STAT_DESC_SCORES=Punturik onenak
+STAT_DESC_SCORES_REVERSED=Punturik txarrenak
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Jokalari onenak
+STAT_DESC_SINGERS_REVERSED=Jokalari txarrenak
+STAT_FORMAT_SINGERS=%0:s \n Bataz-besteko puntuak: %1:d
+
+STAT_DESC_SONGS=Kantu ospetsuenak
+STAT_DESC_SONGS_REVERSED=Kantu ez ospetsuak
+STAT_FORMAT_SONGS=%0: - %1: \n %2: aldi kantatua
+
+STAT_DESC_BANDS=Talde ospetsuena
+STAT_DESC_BANDS_REVERSED=Ospe gutxieneko taldea
+STAT_FORMAT_BANDS=%0: \n %1:d aldi kantatua
+
+MSG_ERROR_TITLE=Errorea
+MSG_QUESTION_TITLE=Galdera
+MSG_QUIT_USDX=Irten nahi duzu?
+MSG_END_PARTY=Bukatu nahi duzu?
+ERROR_NO_SONGS=Kantu gabe
+ERROR_NO_PLUGINS=Plugin gabe
+ERROR_CORRUPT_SONG=Ezin da kantua kargatu \ No newline at end of file
diff --git a/Game/Output/Languages/TODOs/French.ini b/Game/Output/Languages/TODOs/French.ini
new file mode 100644
index 00000000..d9f6ca57
--- /dev/null
+++ b/Game/Output/Languages/TODOs/French.ini
@@ -0,0 +1,300 @@
+[Text]
+SING_LOADING=Charge...
+
+SING_CHOOSE_MODE=Choisir le mode
+SING_SING=Chanter
+SING_SING_DESC=Chanter
+
+SING_MULTI=Groupe
+SING_MULTI_DESC=Chanter en mode groupe
+
+SING_TOOLS=Outils
+
+SING_STATS=Statistiques
+SING_STATS_DESC=Visualiser les statistiques
+
+SING_EDITOR=Éditeur
+SING_EDITOR_DESC=Créer vos propre chansons
+
+SING_GAME_OPTIONS=Options de jeu
+SING_GAME_OPTIONS_DESC=Changer les options de jeu
+
+SING_EXIT=Quitter
+SING_EXIT_DESC=Quitter le jeu
+
+SING_OPTIONS=Options
+SING_OPTIONS_DESC=Changer les paramètres
+SING_OPTIONS_WHEREAMI=Options
+
+SING_OPTIONS_GAME=Jeu
+SING_OPTIONS_GRAPHICS=Graphiques
+SING_OPTIONS_SOUND=Son
+SING_OPTIONS_LYRICS=Paroles
+SING_OPTIONS_THEMES=Titres
+SING_OPTIONS_RECORD=Enregistrem.
+SING_OPTIONS_ADVANCED=Avancé
+SING_OPTIONS_EXIT=Retour
+
+SING_OPTIONS_GAME_WHEREAMI=Options de jeu
+SING_OPTIONS_GAME_DESC=Options générales de jeu
+SING_OPTIONS_GAME_PLAYERS=Joueurs
+SING_OPTIONS_GAME_DIFFICULTY=Difficulté
+SING_OPTIONS_GAME_LANGUAGE=Langue
+SING_OPTIONS_GAME_TABS=Dossier
+SING_OPTIONS_GAME_SORTING=Triage
+SING_OPTIONS_GAME_DEBUG=Débogue
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Options de graphiques
+SING_OPTIONS_GRAPHICS_DESC=Paramètres de graphiques
+SING_OPTIONS_GRAPHICS_RESOLUTION=Résolution
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Ècran total
+SING_OPTIONS_GRAPHICS_DEPTH=Intensité couleur
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Oscilloscope
+SING_OPTIONS_GRAPHICS_LINEBONUS=Bonus de phrase
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Dimension vidéo
+
+SING_OPTIONS_SOUND_WHEREAMI=Options de son
+SING_OPTIONS_SOUND_DESC=Paramètres de son
+SING_OPTIONS_SOUND_MIC_BOOST=Poussée de mic
+SING_OPTIONS_SOUND_CLICK_ASSIST=Clic-Assistant
+SING_OPTIONS_SOUND_BEAT_CLICK=Clic de battement
+SING_OPTIONS_SOUND_THRESHOLD=Suppression bruit
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Mode 2 joueurs
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Prévision de son
+SING_OPTIONS_SOUND_PREVIEWFADING=Prévision éffacer
+
+SING_OPTIONS_LYRICS_WHEREAMI=Options de paroles
+SING_OPTIONS_LYRICS_DESC=Paramètres de paroles
+SING_OPTIONS_LYRICS_FONT=Caractères
+SING_OPTIONS_LYRICS_EFFECT=Effet
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmisation
+
+SING_OPTIONS_THEMES_WHEREAMI=Options de Titres
+SING_OPTIONS_THEMES_DESC=Paramètres de titres
+SING_OPTIONS_THEMES_THEME=Titres
+SING_OPTIONS_THEMES_SKIN=Aspect
+SING_OPTIONS_THEMES_COLOR=Couleur
+
+SING_OPTIONS_RECORD_WHEREAMI=Options d'enregistrement
+SING_OPTIONS_RECORD_DESC=Paramètres micros
+SING_OPTIONS_RECORD_CARD=Carte son
+SING_OPTIONS_RECORD_INPUT=Entrée
+SING_OPTIONS_RECORD_CHANNELL=Canal gauche
+SING_OPTIONS_RECORD_CHANNELR=Canal droit
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Options avancées
+SING_OPTIONS_ADVANCED_DESC=Paramètres avancés
+SING_OPTIONS_ADVANCED_EFFECTSING=Effet de chant
+SING_OPTIONS_ADVANCED_SCREENFADE=Écran éffacé
+SING_OPTIONS_ADVANCED_LOADANIMATION=Charge animation
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Questions séc.
+SING_OPTIONS_ADVANCED_LINEBONUS=Bonus de phrase
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=Compteur de titres chantés
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Choix ap. chanson
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto menu groupe
+
+SING_LEGEND_SELECT=Choisir
+SING_LEGEND_NAVIGATE=Naviguer
+SING_LEGEND_CONTINUE=Suivant
+SING_LEGEND_ESC=Retour
+
+SING_PLAYER_DESC=Entrer nom de joueur
+SING_PLAYER_WHEREAMI=Noms de joueurs
+SING_PLAYER_ENTER_NAME=Entrer nom
+
+SING_DIFFICULTY_DESC=Choisir la difficulté
+SING_DIFFICULTY_WHEREAMI=Difficulté
+SING_DIFFICULTY_CONTINUE=á "Choix de chanson"
+SING_EASY=Facile
+SING_MEDIUM=Moyen
+SING_HARD=Difficile
+
+SING_SONG_SELECTION_DESC=Choisis ta chanson
+SING_SONG_SELECTION_WHEREAMI=Choix de chanson
+SING_SONG_SELECTION_GOTO=Atteindre ..
+SING_SONG_SELECTION=Choix de chanson
+SING_SONG_SELECTION_MENU=Menu
+SING_SONG_SELECTION_PLAYLIST=Liste de titres
+SING_SONGS_IN_CAT=Chansons
+PLAYLIST_CATTEXT=Playlist: %s
+
+SING_TIME=TEMPS
+SING_TOTAL=Total
+SING_MODE=Mode de chant
+SING_NOTES=Notes
+SING_GOLDEN_NOTES=Son doré
+SING_PHRASE_BONUS=Bonus de phrase
+
+SING_MENU=Menu Général
+
+SONG_SCORE=Points de chanson
+SONG_SCORE_WHEREAMI=Points
+
+SING_SCORE_TONE_DEAF=Anti Talent
+SING_SCORE_AMATEUR=Amateur
+SING_SCORE_RISING_STAR=Crâneur
+SING_SCORE_LEAD_SINGER=Starlette
+SING_SCORE_HIT_ARTIST=artiste de tube
+SING_SCORE_SUPERSTAR=Superstar
+SING_SCORE_ULTRASTAR=Ultrastar
+
+SING_TOP_5_CHARTS=Joueurs Top-5
+SING_TOP_5_CHARTS_WHEREAMI=Top-5
+SING_TOP_5_CHARTS_CONTINUE=vers "Choix de chanson"
+
+POPUP_PERFECT=Parfait!
+POPUP_AWESOME=Cool!
+POPUP_GREAT=Grandiose!
+POPUP_GOOD=Bien!
+POPUP_NOTBAD=O.K.!
+POPUP_BAD=Mal!
+POPUP_POOR=Mauvais!
+POPUP_AWFUL=Cruel!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= et
+
+SONG_MENU_NAME_MAIN=Menu
+SONG_MENU_PLAY=Chantez
+SONG_MENU_CHANGEPLAYERS=Échanger le joueur
+SONG_MENU_EDIT=Éditeur
+SONG_MENU_MODI=Chantez un mode
+SONG_MENU_CANCEL=Interrompre
+
+SONG_MENU_NAME_PLAYLIST=Menu
+SONG_MENU_PLAYLIST_ADD=Ajouter une chanson
+SONG_MENU_PLAYLIST_DEL=Supprimer la chanson
+
+SONG_MENU_NAME_PLAYLIST_ADD=Ajouter chanson
+SONG_MENU_PLAYLIST_ADD_NEW=À la nouvelle Playlist
+SONG_MENU_PLAYLIST_ADD_EXISTING=Aller vers liste de titres existent
+SONG_MENU_PLAYLIST_NOEXISTING=Pas de liste de titres
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nouvelle liste
+SONG_MENU_PLAYLIST_NEW_CREATE=Créer
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Innome
+
+SONG_MENU_NAME_PLAYLIST_DELITEM=Supprimer vraiment ?
+SONG_MENU_YES=Oui
+SONG_MENU_NO=Non
+
+SONG_MENU_NAME_PLAYLIST_DEL=Supprimez la liste de titres?
+
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Ouvrez une liste
+SONG_MENU_PLAYLIST_LOAD=Ouvrir
+SONG_MENU_PLAYLIST_DELCURRENT=Supprimez la liste de titres actuel
+
+SONG_MENU_NAME_PARTY_MAIN=Menu de la fête
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=Joue un Joker
+
+SONG_JUMPTO_DESC=Chercher
+SONG_JUMPTO_TYPE_DESC=Chercher du:
+SONG_JUMPTO_TYPE1=Tout
+SONG_JUMPTO_TYPE2=Titre
+SONG_JUMPTO_TYPE3=Artiste
+SONG_JUMPTO_SONGSFOUND=%d Chanson(s) trouvé
+SONG_JUMPTO_NOSONGSFOUND=Pas de chanson trouvé
+SONG_JUMPTO_HELP=Entrez le texte pour chercher
+SONG_JUMPTO_CATTEXT=Recherche: %s
+
+PARTY_MODE=Mode de la fête
+PARTY_DIFFICULTY=Difficulté
+PARTY_PLAYLIST=Liste de titres
+PARTY_PLAYLIST_ALL=Toutes les chansons
+PARTY_PLAYLIST_CATEGORY=Dossier
+PARTY_PLAYLIST_PLAYLIST=liste de titres
+PARTY_ROUNDS=Rondes
+PARTY_TEAMS=Équipes
+PARTY_TEAMS_PLAYER1=Joueur Équipe 1
+PARTY_TEAMS_PLAYER2=Joueur Équipe 2
+PARTY_TEAMS_PLAYER3=Joueur Équipe 3
+
+PARTY_LEGEND_CONTINUE=Suivant
+
+PARTY_OPTIONS_DESC=Réglages pour le jeu de la fête
+PARTY_OPTIONS_WHEREAMI=Options de la fête
+
+PARTY_PLAYER_DESC=Entrez le nom d´équipe et des joueurs
+PARTY_PLAYER_WHEREAMI=Fête: Nom de joueur
+PARTY_PLAYER_ENTER_NAME=Entrez le nom
+PARTY_PLAYER_LEGEND_CONTINUE=Commencez un jeu de fête
+
+PARTY_ROUND_DESC=Les prochains joueurs aux microphones!
+PARTY_ROUND_WHEREAMI=Fête: Prochaine partie
+PARTY_ROUND_LEGEND_CONTINUE=Commencez la partie
+
+PARTY_SONG_WHEREAMI=Fête: Choix de chansons
+PARTY_SONG_LEGEND_CONTINUE=Chantez
+PARTY_SONG_MENU=Menu de la fête
+
+PARTY_SCORE_DESC=Points de la dernière partie.
+PARTY_SCORE_WHEREAMI=Fête: Points
+
+PARTY_WIN_DESC=Gagnant du jeu de fête
+PARTY_WIN_WHEREAMI=Fête: Gagnant
+PARTY_WIN_LEGEND_CONTINUE=Retour au menu générale
+
+PARTY_ROUND=Partie
+PARTY_ROUND_WINNER=Gagnant
+PARTY_NOTPLAYEDYET=Pas encore joué
+PARTY_NOBODY=Personne
+NEXT_ROUND=Prochaine partie:
+
+PARTY_DISMISSED=Rétrogradé
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=a gagné!
+
+PLUGIN_HDL_NAME=Tenez la barre
+PLUGIN_HDL_DESC=Tenez la barre dans le secteur indiqué
+
+PLUGIN_UNTIL5000_NAME=à 5000
+PLUGIN_UNTIL5000_DESC=Celui qui a 5000 points en premier a gagné.
+
+PLUGIN_DUELL_NAME=Duel
+PLUGIN_DUELL_DESC=Jeu normal.Le plus grand nombre de points gagne.
+
+PLUGIN_BLIND_NAME=Mode aveugle
+PLUGIN_BLIND_DESC=Gagne le plus grad nombre de points aveugle.
+
+STAT_MAIN=Statistiques
+STAT_MAIN_DESC=Général
+STAT_MAIN_WHEREAMI=Statistiques
+
+STAT_OVERVIEW_INTRO=%0:s Statistiques. \n Dernières reset á %1:.2d.%2:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d chanson(s) (%3:d avec une vidéo), %1:d ont été chantés déjà une fois et %2:d pas encore. \n La chanson la plus chantée est %5:s de %4:s.
+STAT_OVERVIEW_PLAYER=Depuis la dernière reset %0:d différents joueurs ont chanté. \n Le meilleur joueur est %1:s avec %2:d points. \n Nombre de points maximal, %4:d, atteint de %3:s.
+
+STAT_DETAIL=Les statistiques
+STAT_DETAIL_WHEREAMI=Statistiques détaillée
+
+STAT_NEXT=Page suivante
+STAT_PREV=Page précédent
+STAT_REVERSE=Inverser
+STAT_PAGE=Page %0:d de %1:d \n (%2:d de %3:d Entrées)
+
+STAT_DESC_SCORES=Highscores
+STAT_DESC_SCORES_REVERSED=Lowscores
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Meilleurs chant.
+STAT_DESC_SINGERS_REVERSED=Mauvais chanteurs
+STAT_FORMAT_SINGERS=%0:s \n Nombre de points moyen: %1:d
+
+STAT_DESC_SONGS=Chansons populaires
+STAT_DESC_SONGS_REVERSED=Chansons impopulaires
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx chanté
+
+STAT_DESC_BANDS=Les bands populaires
+STAT_DESC_BANDS_REVERSED=Les bands impopulaires
+STAT_FORMAT_BANDS=%0:s \n Chansons chantées: %1:d
+
+MSG_ERROR_TITLE=Erreur
+MSG_QUESTION_TITLE=Question
+MSG_QUIT_USDX=Quittez UltraStar pour de bon?
+MSG_END_PARTY=Quittez le mode de la fête?
+ERROR_NO_SONGS=Pas de chansons existant.
+ERROR_NO_PLUGINS=Pas de plugins existant .
+ERROR_CORRUPT_SONG=La chanson ne pouvait pas être chargée. \ No newline at end of file
diff --git a/Game/Output/Languages/TODOs/Norwegian.ini b/Game/Output/Languages/TODOs/Norwegian.ini
new file mode 100644
index 00000000..b08db4a8
--- /dev/null
+++ b/Game/Output/Languages/TODOs/Norwegian.ini
@@ -0,0 +1,298 @@
+[Text]
+SING_LOADING=Laster...
+
+SING_CHOOSE_MODE=velg modus
+SING_SING=syng
+SING_SING_DESC=hurtigspill: syng solo eller duett
+
+SING_MULTI=party
+SING_MULTI_DESC=syng i party-modus
+
+SING_TOOLS=verktøy
+
+SING_STATS=statistikk
+SING_STATS_DESC=vis statistikk
+
+SING_EDITOR=editor
+SING_EDITOR_DESC=lag dine egne sanger
+
+SING_GAME_OPTIONS=spillinnstillinger
+SING_GAME_OPTIONS_DESC=endre spillinstillinger
+SING_EXIT=avslutt
+SING_EXIT_DESC=avslutt spillet
+
+SING_OPTIONS=innstillinger
+SING_OPTIONS_DESC=endre innstillinger
+SING_OPTIONS_WHEREAMI=Innstillinger
+
+SING_OPTIONS_GAME=spill
+SING_OPTIONS_GRAPHICS=grafikk
+SING_OPTIONS_SOUND=lyd
+SING_OPTIONS_LYRICS=tekst
+SING_OPTIONS_THEMES=utseende
+SING_OPTIONS_RECORD=opptak
+SING_OPTIONS_ADVANCED=avansert
+SING_OPTIONS_EXIT=tilbake
+
+SING_OPTIONS_GAME_WHEREAMI=Innstillinger Spill
+SING_OPTIONS_GAME_DESC=hovedspillinnstillinger
+SING_OPTIONS_GAME_PLAYERS=Spillere
+SING_OPTIONS_GAME_DIFFICULTY=Vanskelighet
+SING_OPTIONS_GAME_LANGUAGE=Språk
+SING_OPTIONS_GAME_TABS=Mappeinndeling
+SING_OPTIONS_GAME_SORTING=Sortering
+SING_OPTIONS_GAME_DEBUG=Feilsøking
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Innstillinger Grafikk
+SING_OPTIONS_GRAPHICS_DESC=Grafiske innstillinger
+SING_OPTIONS_GRAPHICS_RESOLUTION=Oppløsning
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Fullskjerm
+SING_OPTIONS_GRAPHICS_DEPTH=Fargedybde
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Oscilloskop
+SING_OPTIONS_GRAPHICS_LINEBONUS=Linjebonus
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Filmstørrelse
+
+SING_OPTIONS_SOUND_WHEREAMI=Innstillinger Lyd
+SING_OPTIONS_SOUND_DESC=lydinnstillinger
+SING_OPTIONS_SOUND_MIC_BOOST=Mikrofon-gain
+SING_OPTIONS_SOUND_CLICK_ASSIST=Klikke-assistanse
+SING_OPTIONS_SOUND_BEAT_CLICK=Beat-klikk
+SING_OPTIONS_SOUND_THRESHOLD=Toleransegrense
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Tospiller-modus
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Preview-volum
+SING_OPTIONS_SOUND_PREVIEWFADING=Preview-fading
+
+SING_OPTIONS_LYRICS_WHEREAMI=Innstillinger Tekst
+SING_OPTIONS_LYRICS_DESC=tekstinnstillinger
+SING_OPTIONS_LYRICS_FONT=Fonter
+SING_OPTIONS_LYRICS_EFFECT=Effekter
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmisasjon
+
+SING_OPTIONS_THEMES_WHEREAMI=Innstillinger Utseende
+SING_OPTIONS_THEMES_DESC=tema og skin-innstillinger
+SING_OPTIONS_THEMES_THEME=Tema
+SING_OPTIONS_THEMES_SKIN=Skin
+SING_OPTIONS_THEMES_COLOR=Farge
+
+SING_OPTIONS_RECORD_WHEREAMI=Innstillinger Opptak
+SING_OPTIONS_RECORD_DESC=mikrofoninnstillinger
+SING_OPTIONS_RECORD_CARD=Lydkort
+SING_OPTIONS_RECORD_INPUT=Input
+SING_OPTIONS_RECORD_CHANNELL=Venstre kanal
+SING_OPTIONS_RECORD_CHANNELR=Høyre kanal
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Innstillinger Avansert
+SING_OPTIONS_ADVANCED_DESC=avanserte innstillinger
+SING_OPTIONS_ADVANCED_EFFECTSING=Sangeffekter
+SING_OPTIONS_ADVANCED_SCREENFADE=Skjermfading
+SING_OPTIONS_ADVANCED_LOADANIMATION=Animasjonslasting
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Sikkerhetsspørsmål
+SING_OPTIONS_ADVANCED_LINEBONUS=Linjebonus
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Etter sang:
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto partymeny
+
+SING_LEGEND_SELECT=velg
+SING_LEGEND_NAVIGATE=naviger
+SING_LEGEND_CONTINUE=fortsett
+SING_LEGEND_ESC=tilbake
+
+SING_PLAYER_DESC=velg spillernavn
+SING_PLAYER_WHEREAMI=Spillernavn
+SING_PLAYER_ENTER_NAME=velg navn
+
+SING_DIFFICULTY_DESC=velg vanskelighetsgrad
+SING_DIFFICULTY_WHEREAMI=Vanskelighet
+SING_DIFFICULTY_CONTINUE=til sangvalg
+SING_EASY=Lett
+SING_MEDIUM=Moderat
+SING_HARD=Vanskelig
+
+SING_SONG_SELECTION_DESC=velg sang
+SING_SONG_SELECTION_WHEREAMI=Sangvalg
+SING_SONG_SELECTION_GOTO=gå til ..
+SING_SONG_SELECTION=Sangvalg
+SING_SONG_SELECTION_MENU=meny
+SING_SONG_SELECTION_PLAYLIST=spilleliste
+SING_SONGS_IN_CAT=Sanger
+PLAYLIST_CATTEXT=Spilleliste: %s
+
+SING_TIME=TID
+SING_TOTAL=total
+SING_MODE=syng solo
+SING_NOTES=toner
+SING_GOLDEN_NOTES=gyldne noter
+SING_PHRASE_BONUS=linjebonus
+
+SING_MENU=Hovedmeny
+
+SONG_SCORE=sangscore
+SONG_SCORE_WHEREAMI=Score
+
+SING_SCORE_TONE_DEAF=Tonedøv
+SING_SCORE_AMATEUR=Amatør
+SING_SCORE_RISING_STAR=Stigende stjerne
+SING_SCORE_LEAD_SINGER=Toppvokalist
+SING_SCORE_HIT_ARTIST=Hitartist
+SING_SCORE_SUPERSTAR=Superstjerne
+SING_SCORE_ULTRASTAR=Ultrastjerne
+
+SING_TOP_5_CHARTS=topp 5 spillere
+SING_TOP_5_CHARTS_WHEREAMI=topp 5
+SING_TOP_5_CHARTS_CONTINUE=til sangvalg
+
+POPUP_PERFECT=perfekt!
+POPUP_AWESOME=fantastisk!
+POPUP_GREAT=kjempebra!
+POPUP_GOOD=bra!
+POPUP_NOTBAD=brukbart!
+POPUP_BAD=dårlig!
+POPUP_POOR=elendig!
+POPUP_AWFUL=grusomt!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= og
+
+SONG_MENU_NAME_MAIN=sangmeny
+SONG_MENU_PLAY=Syng
+SONG_MENU_CHANGEPLAYERS=Endre spillere
+SONG_MENU_EDIT=Endre
+SONG_MENU_MODI=Syng en modus
+SONG_MENU_CANCEL=AVbryt
+
+SONG_MENU_NAME_PLAYLIST=Sangmeny
+SONG_MENU_PLAYLIST_ADD=Legg til sang
+SONG_MENU_PLAYLIST_DEL=Ta bort sang
+
+SONG_MENU_NAME_PLAYLIST_ADD=Legg til sang
+SONG_MENU_PLAYLIST_ADD_NEW=til ny spilleliste
+SONG_MENU_PLAYLIST_ADD_EXISTING=til eksisterende spilleliste
+SONG_MENU_PLAYLIST_NOEXISTING=ingen spilleliste eksisterer
+
+SONG_MENU_NAME_PLAYLIST_NEW=Ny spilleliste
+SONG_MENU_PLAYLIST_NEW_CREATE=Opprett
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Uten navn
+
+SONG_MENU_NAME_PLAYLIST_DEL=Virkelig slette?
+SONG_MENU_YES=Ja
+SONG_MENU_NO=Nei
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Åpne spilleliste
+SONG_MENU_PLAYLIST_LOAD=åpne
+SONG_MENU_PLAYLIST_DELCURRENT=slett nåværende spilleliste
+
+SONG_MENU_NAME_PLAYLIST_DEL=Slett spilleliste?
+
+SONG_MENU_NAME_PARTY_MAIN=Partymeny
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=bruk joker
+
+SONG_JUMPTO_DESC=søk etter sang
+SONG_JUMPTO_TYPE_DESC=Søk etter:
+SONG_JUMPTO_TYPE1=Alt
+SONG_JUMPTO_TYPE2=Tittel
+SONG_JUMPTO_TYPE3=Artist
+SONG_JUMPTO_SONGSFOUND=%d Sang(er) funnet
+SONG_JUMPTO_NOSONGSFOUND=Ingen funnet
+SONG_JUMPTO_HELP=Skriv inn tekst å lete etter
+SONG_JUMPTO_CATTEXT=Søk etter: %s
+
+PARTY_MODE=Partymodus
+PARTY_DIFFICULTY=Vanskelighetsgrad
+PARTY_PLAYLIST=Spilleliste-modus
+PARTY_PLAYLIST_ALL=Alle sanger
+PARTY_PLAYLIST_CATEGORY=Mappe
+PARTY_PLAYLIST_PLAYLIST=Spillelist
+PARTY_ROUNDS=Runder
+PARTY_TEAMS=Lag
+PARTY_TEAMS_PLAYER1=Spiller Lag1
+PARTY_TEAMS_PLAYER2=Spiller Lag2
+PARTY_TEAMS_PLAYER3=Spiller Lag3
+
+PARTY_LEGEND_CONTINUE=Fortsett
+
+PARTY_OPTIONS_DESC=Innstillinger for party-spillet
+PARTY_OPTIONS_WHEREAMI=Party-innstillinger
+
+PARTY_PLAYER_DESC=skriv spiller- og lagnavn!
+PARTY_PLAYER_WHEREAMI=Party-navn
+PARTY_PLAYER_ENTER_NAME=skriv navn
+PARTY_PLAYER_LEGEND_CONTINUE=start party-game
+
+PARTY_ROUND_DESC=neste spillere til mikrofonene
+PARTY_ROUND_WHEREAMI=Party neste runde
+PARTY_ROUND_LEGEND_CONTINUE=start runden
+
+PARTY_SONG_WHEREAMI=Party sangvalg
+PARTY_SONG_LEGEND_CONTINUE=syng
+PARTY_SONG_MENU=partymeny
+
+PARTY_SCORE_DESC=Siste rundes poengsum
+PARTY_SCORE_WHEREAMI=Partypoeng
+
+PARTY_WIN_DESC=vinner av partyspillet
+PARTY_WIN_WHEREAMI=Party-vinner
+PARTY_WIN_LEGEND_CONTINUE=tilbake til hovedmenyen
+
+PARTY_ROUND=Runde
+PARTY_ROUND_WINNER=Vinner
+PARTY_NOTPLAYEDYET=Ikke spilt ennå
+PARTY_NOBODY=ingen
+NEXT_ROUND=Neste runde:
+
+PARTY_DISMISSED=Avbrutt!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=Vinner!
+
+PLUGIN_HDL_NAME=Hold linja
+PLUGIN_HDL_DESC=Ikke syng dårligere enn hva markøren på statuslinja viser.
+
+PLUGIN_UNTIL5000_NAME=Først til 5000
+PLUGIN_UNTIL5000_DESC=Førstemann til 5000 poeng vinner.
+
+PLUGIN_DUELL_NAME=Duell
+PLUGIN_DUELL_DESC=Syng en duell - først til 10000.
+
+PLUGIN_BLIND_NAME=Blindemodus
+PLUGIN_BLIND_DESC=Duell der notene ikke vises
+
+STAT_MAIN=Statistikk
+STAT_MAIN_DESC=Hoved
+STAT_MAIN_WHEREAMI=Statistikk
+
+STAT_OVERVIEW_INTRO=%0:s Statistikk. \n Siste avslutning ved %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Sanger(%3:d med video), hvorav %1:d allerede har vært sunget og %2:d ennå ikke har vært sunget.\n Den mest populære sangen er %5:s av %4:s.
+STAT_OVERVIEW_PLAYER=Siden den siste avlutningen var det %0:d ulike spillere.\n Den beste spilleren er %1:s med en gjennomsnitts-score på %2:d poeng.\n %3:s fikk høyeste score med %4:d poeng.
+
+STAT_DETAIL=Statistikk
+STAT_DETAIL_WHEREAMI=Detaljert statistikk
+
+STAT_NEXT=Neste side
+STAT_PREV=Forrige side
+STAT_REVERSE=Bytt rekkefølge
+STAT_PAGE=Side %0:d av %1:d Sider\n (%2:d av %3:d )
+
+STAT_DESC_SCORES=Toppscore
+STAT_DESC_SCORES_REVERSED=Bunnscore
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Beste sangere
+STAT_DESC_SINGERS_REVERSED=Dårligste sangere
+STAT_FORMAT_SINGERS=%0:s \n Gjennomsnitts-score: %1:d
+
+STAT_DESC_SONGS=Mest populære sang
+STAT_DESC_SONGS_REVERSED=Minst populære sang
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx sunget
+
+STAT_DESC_BANDS=Mest populære artist
+STAT_DESC_BANDS_REVERSED=Minst populære artist
+STAT_FORMAT_BANDS=%0:s \n %1:dx Sunget
+
+MSG_ERROR_TITLE=Feil
+MSG_QUESTION_TITLE=Spørsmål
+MSG_QUIT_USDX=Vil du virkelig avslutte UltraStar?
+MSG_END_PARTY=Vil du virkelig forlate party-modusen?
+ERROR_NO_SONGS=Ingen sanger lastet
+ERROR_NO_PLUGINS=Ingen plug-ins lastet
+ERROR_CORRUPT_SONG=Sangen kunne ikke lastes \ No newline at end of file
diff --git a/Game/Output/Languages/TODOs/Polish.ini b/Game/Output/Languages/TODOs/Polish.ini
new file mode 100644
index 00000000..bf9443e7
--- /dev/null
+++ b/Game/Output/Languages/TODOs/Polish.ini
@@ -0,0 +1,305 @@
+[Text]
+SING_LOADING=Wczytywanie...
+
+SING_CHOOSE_MODE=wybierz tryb
+SING_SING=œpiewaj
+SING_SING_DESC=œpiewaj solo lub w kilka osób
+
+SING_MULTI=impreza
+SING_MULTI_DESC=rozkrêæ imprezê!
+
+SING_TOOLS=narzêdzia
+
+SING_STATS=statystyki
+SING_STATS_DESC=zobacz statystyki
+
+SING_EDITOR=edytor
+SING_EDITOR_DESC=stwórz w³asne piosenki
+
+SING_GAME_OPTIONS=opcje
+SING_GAME_OPTIONS_DESC=zmieñ ustawienia
+
+SING_EXIT=wyjœcie
+SING_EXIT_DESC=wyjdŸ z gry
+
+SING_OPTIONS=opcje
+SING_OPTIONS_DESC=zmieñ ustawienia
+SING_OPTIONS_WHEREAMI=Opcje
+
+SING_OPTIONS_GAME=gra
+SING_OPTIONS_GRAPHICS=grafika
+SING_OPTIONS_SOUND=dŸwiêk
+SING_OPTIONS_LYRICS=s³owa
+SING_OPTIONS_THEMES=tematy
+SING_OPTIONS_RECORD=nagrywanie
+SING_OPTIONS_ADVANCED=zaawansowane
+SING_OPTIONS_EXIT=wstecz
+
+SING_OPTIONS_GAME_WHEREAMI=Opcje Gra
+SING_OPTIONS_GAME_DESC=opcje gry
+SING_OPTIONS_GAME_PLAYERS=IloϾ graczy
+SING_OPTIONS_GAME_DIFFICULTY=Poziom trudnoœci
+SING_OPTIONS_GAME_LANGUAGE=Jêzyk
+SING_OPTIONS_GAME_TABS=Zak³adki
+SING_OPTIONS_GAME_SORTING=Sortowanie
+SING_OPTIONS_GAME_DEBUG=Debug
+
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Opcje Grafika
+SING_OPTIONS_GAME_DESC=opcje gry
+SING_OPTIONS_GAME_PLAYERS=IloϾ graczy
+SING_OPTIONS_GAME_DIFFICULTY=Poziom trudnoœci
+SING_OPTIONS_GAME_LANGUAGE=Jêzyk
+SING_OPTIONS_GAME_TABS=Zak³adki
+SING_OPTIONS_GAME_SORTING=Sortowanie
+SING_OPTIONS_GAME_DEBUG=Debug
+
+SING_OPTIONS_GRAPHICS_LINEBONUS=Bonus Linii
+
+SING_OPTIONS_SOUND_WHEREAMI=Opcje DŸwiêk
+SING_OPTIONS_SOUND_DESC=opcje dŸwiêku
+SING_OPTIONS_SOUND_MIC_BOOST=Podbicie mikrofonu
+SING_OPTIONS_SOUND_CLICK_ASSIST=Pomoc klikniêciami
+SING_OPTIONS_SOUND_BEAT_CLICK=Klikniêcia w rytm
+SING_OPTIONS_SOUND_THRESHOLD=Próg
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Tryb dwóch graczy
+SING_OPTIONS_SOUND_PREVIEWVOLUME=G³oœnoœæ w podgl¹dzie
+SING_OPTIONS_SOUND_PREVIEWFADING=Zanikanie w podgl¹dzie
+
+SING_OPTIONS_LYRICS_WHEREAMI=Opcje S³owa
+SING_OPTIONS_LYRICS_DESC=opcje s³ów
+SING_OPTIONS_LYRICS_FONT=Czcionka
+SING_OPTIONS_LYRICS_EFFECT=Efekt
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmizacja
+
+SING_OPTIONS_THEMES_WHEREAMI=Options Tematy
+SING_OPTIONS_THEMES_DESC=opcje tematów
+SING_OPTIONS_THEMES_THEME=Temat
+SING_OPTIONS_THEMES_SKIN=Skóra
+SING_OPTIONS_THEMES_COLOR=Kolor
+
+SING_OPTIONS_RECORD_WHEREAMI=Opcje Nagrywanie
+SING_OPTIONS_RECORD_DESC=opcje nagrywania
+SING_OPTIONS_RECORD_CARD=Karta dŸwiêkowa
+SING_OPTIONS_RECORD_INPUT=Wejœcie
+SING_OPTIONS_RECORD_CHANNELL=Lewy kana³
+SING_OPTIONS_RECORD_CHANNELR=Prawy kana³
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Opcje Zaawansowane
+SING_OPTIONS_ADVANCED_DESC=ustawienia zaawansowane
+SING_OPTIONS_ADVANCED_EFFECTSING=Efekty specjalne
+SING_OPTIONS_ADVANCED_SCREENFADE=Przenikanie
+SING_OPTIONS_ADVANCED_LOADANIMATION=Animacja ³adowania
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Pytania przy wyjœciu
+SING_OPTIONS_ADVANCED_LINEBONUS=Bonus Linii
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=Licznik
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Po wyborze piosenki
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto Menu Imprezy
+
+SING_LEGEND_SELECT=wybierz
+SING_LEGEND_NAVIGATE=nawigacja
+SING_LEGEND_CONTINUE=dalej
+SING_LEGEND_ESC=wstecz
+
+SING_PLAYER_DESC=wprowadŸ imiê gracza
+SING_PLAYER_WHEREAMI=Imiê
+SING_PLAYER_ENTER_NAME=wpisz imiê
+
+SING_DIFFICULTY_DESC=wybierz poziom trudnoœci
+SING_DIFFICULTY_WHEREAMI=Poziom
+SING_DIFFICULTY_CONTINUE=do wyboru piosenki
+SING_EASY=³atwo
+SING_MEDIUM=œrednio
+SING_HARD=trudno
+
+SING_SONG_SELECTION_DESC=wybierz piosenkê
+SING_SONG_SELECTION_WHEREAMI=Wybór Piosenki
+SING_SONG_SELECTION_GOTO=idŸ do...
+SING_SONG_SELECTION=wybór piosenki
+SING_SONG_SELECTION_MENU=menu
+SING_SONG_SELECTION_PLAYLIST=playlista
+SING_SONGS_IN_CAT=Piosenki
+PLAYLIST_CATTEXT=Playlista: %s
+
+SING_TIME=CZAS
+SING_TOTAL=³¹cznie
+SING_MODE=œpiew solo
+SING_NOTES=nuty
+SING_GOLDEN_NOTES=z³ote nuty
+SING_PHRASE_BONUS=Bonus Linii
+
+SING_MENU=Menu G³ówne
+
+SONG_SCORE=wynik
+SONG_SCORE_WHEREAMI=Wynik
+
+SING_SCORE_TONE_DEAF=G³uche nuty
+SING_SCORE_AMATEUR=Amator
+SING_SCORE_RISING_STAR=Wschodz¹ca gwiazda
+SING_SCORE_LEAD_SINGER=Niez³y grajek
+SING_SCORE_HIT_ARTIST=Wielki Artysta
+SING_SCORE_SUPERSTAR=Supergwiazda
+SING_SCORE_ULTRASTAR=Ultrastar
+
+SING_TOP_5_CHARTS=lista 5 najlepszych
+SING_TOP_5_CHARTS_WHEREAMI=top 5
+SING_TOP_5_CHARTS_CONTINUE=do wyboru piosenki
+
+POPUP_PERFECT=idealnie!
+POPUP_AWESOME=niesamowicie!
+POPUP_GREAT=œwietnie!
+POPUP_GOOD=dobrze!
+POPUP_NOTBAD=nieŸle!
+POPUP_BAD=Ÿle!
+POPUP_POOR=s³abo!
+POPUP_AWFUL=okropnie!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= oraz
+
+SONG_MENU_NAME_MAIN=menu piosenki
+SONG_MENU_PLAY=Œpiewaj
+SONG_MENU_CHANGEPLAYERS=Zmieñ graczy
+SONG_MENU_EDIT=Edytuj
+SONG_MENU_MODI=Œpiewaj Modi
+SONG_MENU_CANCEL=Anuluj
+
+SONG_MENU_NAME_PLAYLIST=Menu Piosenki
+SONG_MENU_PLAYLIST_ADD=Dodaj piosenkê
+SONG_MENU_PLAYLIST_DEL=Usuñ piosenkê
+
+SONG_MENU_NAME_PLAYLIST_ADD=Dodaj piosenkê
+SONG_MENU_PLAYLIST_ADD_NEW=do nowej playlisty
+SONG_MENU_PLAYLIST_ADD_EXISTING=do istniej¹cej playlisty
+SONG_MENU_PLAYLIST_NOEXISTING=Brak playlist
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nowa Playlista
+SONG_MENU_PLAYLIST_NEW_CREATE=Stwórz
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Bez nazwy
+
+SONG_MENU_NAME_PLAYLIST_DEL=Usun¹æ?
+SONG_MENU_YES=Tak
+SONG_MENU_NO=Nie
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Otwórz Playlistê
+SONG_MENU_PLAYLIST_LOAD=otwórz
+SONG_MENU_PLAYLIST_DELCURRENT=usuñ tê playlistê
+
+SONG_MENU_NAME_PLAYLIST_DEL=Usun¹æ playlistê?
+
+SONG_MENU_NAME_PARTY_MAIN=Menu Imprezy
+SONG_MENU_JOKER=Jokera
+
+SONG_MENU_NAME_PARTY_JOKER=weŸ jokera
+
+SONG_JUMPTO_DESC=szukaj
+SONG_JUMPTO_TYPE_DESC=Szukaj:
+SONG_JUMPTO_TYPE1=Wszêdzie
+SONG_JUMPTO_TYPE2=Tytu³
+SONG_JUMPTO_TYPE3=Wykonawca
+SONG_JUMPTO_SONGSFOUND=Znaleziono %d utworów
+SONG_JUMPTO_NOSONGSFOUND=Nic nie znaleziono
+SONG_JUMPTO_HELP=Wpisz tekst do wyszukania
+SONG_JUMPTO_CATTEXT=Szukaj: %s
+
+PARTY_MODE=tryb imprezy
+PARTY_DIFFICULTY=Poziom
+PARTY_PLAYLIST=Tryb playlisty
+PARTY_PLAYLIST_ALL=Wszystko
+PARTY_PLAYLIST_CATEGORY=Folder
+PARTY_PLAYLIST_PLAYLIST=Playlista
+PARTY_ROUNDS=Rundy
+PARTY_TEAMS=Dru¿yny
+PARTY_TEAMS_PLAYER1=Dru¿yna 1
+PARTY_TEAMS_PLAYER2=Dru¿yna 2
+PARTY_TEAMS_PLAYER3=Dru¿yna 3
+
+PARTY_LEGEND_CONTINUE=dalej
+
+PARTY_OPTIONS_DESC=ustawienia trybu imprezy
+PARTY_OPTIONS_WHEREAMI=Impreza - Ustawienia
+
+PARTY_PLAYER_DESC=wpisz nazwy graczy i dru¿yn
+PARTY_PLAYER_WHEREAMI=Nazwy dru¿yn
+PARTY_PLAYER_ENTER_NAME=wpisz nazwy
+PARTY_PLAYER_LEGEND_CONTINUE=start!
+
+PARTY_ROUND_DESC=nastêpni do mikrofonów
+PARTY_ROUND_WHEREAMI=Nastêpna Runda
+PARTY_ROUND_LEGEND_CONTINUE=rozpocznij rundê
+
+PARTY_SONG_WHEREAMI=Wybór piosenki
+PARTY_SONG_LEGEND_CONTINUE=œpiewaj
+PARTY_SONG_MENU=menu
+
+PARTY_SCORE_DESC=wynik ostatniej rundy
+PARTY_SCORE_WHEREAMI=Punkty
+
+PARTY_WIN_DESC=zwyciêzca gry
+PARTY_WIN_WHEREAMI=Zwyciêzca
+PARTY_WIN_LEGEND_CONTINUE=do menu g³ównego
+
+PARTY_ROUND=Runda
+PARTY_ROUND_WINNER=Zwyciêzca
+PARTY_NOTPLAYEDYET=jeszcze nie gra³
+PARTY_NOBODY=nikt
+NEXT_ROUND=Nastêpna runda:
+
+PARTY_DISMISSED=Odpada!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=wygrywa!
+
+PLUGIN_HDL_NAME=Trzymaj liniê
+PLUGIN_HDL_DESC=Œpiewaj lepiej ni¿ linia na wykresie.
+
+PLUGIN_UNTIL5000_NAME=Do 5000
+PLUGIN_UNTIL5000_DESC=Wygrywa ten, kto pierwszy uzyska 5000 punktów.
+
+PLUGIN_DUELL_NAME=Pojedynek
+PLUGIN_DUELL_DESC=Œpiewacie w pojedynku do 10000 punktów.
+
+PLUGIN_TEAMDUELL_NAME=Team Duell
+PLUGIN_TEAMDUELL_DESC=Pass The Mic!
+
+PLUGIN_BLIND_NAME=Œlepiec
+PLUGIN_BLIND_DESC=Pojedynek, w którym nie widzicie nut.
+
+STAT_MAIN=Statystyki
+STAT_MAIN_DESC=Ogólne
+STAT_MAIN_WHEREAMI=Statystyki
+
+STAT_OVERVIEW_INTRO=Statystyki dla: %0:d. \n Ostatnio resetowane: %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Piosenek (%3:d z filmem), z czego %1:d by³o granych a %2:d jeszcze nie.\n Najpopularniejsz¹ piosenk¹ jest %5:s z %4:s.
+STAT_OVERVIEW_PLAYER=Od ostatniego resetu:%0:d ró¿nych graczy.\n Najlepszym graczem jest %1:s ze œrednim wynikiem %2:d punktów.\n %3:s ustanowi³ rekord wynikiem %4:d punktów.
+
+STAT_DETAIL=Statystyki
+STAT_DETAIL_WHEREAMI=Statystyki szczegó³owe
+
+STAT_NEXT=Nastêpna strona
+STAT_PREV=Poprzednia strona
+STAT_REVERSE=Odwróæ kolejnoœæ
+STAT_PAGE=Strona %0:d z %1:d \n (%2:d of %3:d wpisów)
+
+STAT_DESC_SCORES=Najwy¿sze wyniki
+STAT_DESC_SCORES_REVERSED=Najni¿sze wyniki
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Najlepsi
+STAT_DESC_SINGERS_REVERSED=Najgorsi
+STAT_FORMAT_SINGERS=%0:s \n Œredni wynik: %1:d
+
+STAT_DESC_SONGS=Najpopularniejsze piosenki
+STAT_DESC_SONGS_REVERSED=Najmniej popularne piosenki
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx œpiewane
+
+STAT_DESC_BANDS=Najpopularniejsi wykonawcy
+STAT_DESC_BANDS_REVERSED=Najmniej popularni wykonawcy
+STAT_FORMAT_BANDS=%0:s \n %1:dx œpiewani
+
+MSG_ERROR_TITLE=B³¹d
+MSG_QUESTION_TITLE=Pytanie
+MSG_QUIT_USDX=Na pewno chcesz wyjϾ?
+MSG_END_PARTY=Na pewno chcesz zakoñczyæ tryb imprezy?
+ERROR_NO_SONGS=Brak piosenek
+ERROR_NO_PLUGINS=Brak wtyczek
+ERROR_CORRUPT_SONG=Piosenka nie mog³a zostaæ za³adowana. \ No newline at end of file
diff --git a/Game/Output/Languages/TODOs/Portuguese.ini b/Game/Output/Languages/TODOs/Portuguese.ini
new file mode 100644
index 00000000..0cabc467
--- /dev/null
+++ b/Game/Output/Languages/TODOs/Portuguese.ini
@@ -0,0 +1,299 @@
+[Text]
+SING_LOADING=A Ler...
+
+SING_CHOOSE_MODE=Escolha o Modo
+SING_SING=Cantar
+SING_SING_DESC=Jogo Rápido: cantar a Solo ou em Dueto
+
+SING_MULTI=Festa
+SING_MULTI_DESC=Cantar em Modo Festa
+
+SING_TOOLS=Ferramentas
+
+SING_STATS=Estatísticas
+SING_STATS_DESC=Ver Estatísticas
+
+SING_EDITOR=Editor
+SING_EDITOR_DESC=Criar canções
+
+SING_GAME_OPTIONS=Opções de Jogo
+SING_GAME_OPTIONS_DESC=Alterar configurações de Jogo
+
+SING_EXIT=Sair
+SING_EXIT_DESC=Sair do Jogo
+
+SING_OPTIONS=Opções
+SING_OPTIONS_DESC=Alterar configurações
+SING_OPTIONS_WHEREAMI=Opções
+
+SING_OPTIONS_GAME=Jogo
+SING_OPTIONS_GRAPHICS=Gráficos
+SING_OPTIONS_SOUND=Som
+SING_OPTIONS_LYRICS=Letras
+SING_OPTIONS_THEMES=Temas
+SING_OPTIONS_RECORD=Gravação
+SING_OPTIONS_ADVANCED=Avançado
+SING_OPTIONS_EXIT=Voltar
+
+SING_OPTIONS_GAME_WHEREAMI=Opções de Jogo
+SING_OPTIONS_GAME_DESC=Configurações Gerais do Jogo
+SING_OPTIONS_GAME_PLAYERS=Jogadores
+SING_OPTIONS_GAME_DIFFICULTY=Dificuldade
+SING_OPTIONS_GAME_LANGUAGE=Linguagem
+SING_OPTIONS_GAME_TABS=Tabulatura
+SING_OPTIONS_GAME_SORTING=Ordenação
+SING_OPTIONS_GAME_DEBUG=Modo Debug
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Opção de Gráficos
+SING_OPTIONS_GRAPHICS_DESC=configuração de Gráficos
+SING_OPTIONS_GRAPHICS_RESOLUTION=Resolução
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Ecrã Total
+SING_OPTIONS_GRAPHICS_DEPTH=Profundidade
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Osciloscópio
+SING_OPTIONS_GRAPHICS_LINEBONUS=Linha Bonus
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Tamanho do Filme
+
+SING_OPTIONS_SOUND_WHEREAMI=Opções de Som
+SING_OPTIONS_SOUND_DESC=configuração de Som
+SING_OPTIONS_SOUND_MIC_BOOST=Microfone boost
+SING_OPTIONS_SOUND_CLICK_ASSIST=Click de Ajuda
+SING_OPTIONS_SOUND_BEAT_CLICK=Click de Batida
+SING_OPTIONS_SOUND_THRESHOLD=Threshold
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Modo de dois jogadores
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Preview Volume
+SING_OPTIONS_SOUND_PREVIEWFADING=Preview Fading
+
+SING_OPTIONS_LYRICS_WHEREAMI=Opções de Letras
+SING_OPTIONS_LYRICS_DESC=configuração de Letras
+SING_OPTIONS_LYRICS_FONT=Fonte
+SING_OPTIONS_LYRICS_EFFECT=Efeitos
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmization
+
+SING_OPTIONS_THEMES_WHEREAMI=Opção de Tema
+SING_OPTIONS_THEMES_DESC=configuração de tema e skin
+SING_OPTIONS_THEMES_THEME=Tema
+SING_OPTIONS_THEMES_SKIN=Skin
+SING_OPTIONS_THEMES_COLOR=Côr
+
+SING_OPTIONS_RECORD_WHEREAMI=Opções de Gravação
+SING_OPTIONS_RECORD_DESC=configuração do microfone
+SING_OPTIONS_RECORD_CARD=Placa de Som
+SING_OPTIONS_RECORD_INPUT=Entrada
+SING_OPTIONS_RECORD_CHANNELL=Canal esquerdo
+SING_OPTIONS_RECORD_CHANNELR=Canal direito
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Opções Avançadas
+SING_OPTIONS_ADVANCED_DESC=opções avançadas
+SING_OPTIONS_ADVANCED_EFFECTSING=Efeitos
+SING_OPTIONS_ADVANCED_SCREENFADE=Fade do Ecrã
+SING_OPTIONS_ADVANCED_LOADANIMATION=Abrir Animação
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Segurança
+SING_OPTIONS_ADVANCED_LINEBONUS=Linha de Bónus
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Escolha da Canção
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Menu de Festa
+
+SING_LEGEND_SELECT=seleccionar
+SING_LEGEND_NAVIGATE=navegar
+SING_LEGEND_CONTINUE=continuar
+SING_LEGEND_ESC=voltar
+
+SING_PLAYER_DESC=introduza nome(s) de jogador(es)
+SING_PLAYER_WHEREAMI=Nome dos Jogadores
+SING_PLAYER_ENTER_NAME=introduzir nome
+
+SING_DIFFICULTY_DESC=escolha a dificuldade
+SING_DIFFICULTY_WHEREAMI=Dificuldade
+SING_DIFFICULTY_CONTINUE=para a escolha da canção
+SING_EASY=Fácil
+SING_MEDIUM=Médio
+SING_HARD=Difícil
+
+SING_SONG_SELECTION_DESC=escolha a canção
+SING_SONG_SELECTION_WHEREAMI=Escolha de Canção
+SING_SONG_SELECTION_GOTO=ir para ..
+SING_SONG_SELECTION=escolha de canção
+SING_SONG_SELECTION_MENU=menu
+SING_SONG_SELECTION_PLAYLIST=playlist
+SING_SONGS_IN_CAT=Canções
+PLAYLIST_CATTEXT=Playlist: %s
+
+SING_TIME=TEMPO
+SING_TOTAL=Total
+SING_MODE=Cantar a Solo
+SING_NOTES=Notas
+SING_GOLDEN_NOTES=Notas de Ouro
+SING_PHRASE_BONUS=Linha de Bónus
+
+SING_MENU=Menu Principal
+
+SONG_SCORE=Pontuação da Canção
+SONG_SCORE_WHEREAMI=Pontuação
+
+SING_SCORE_TONE_DEAF=Ouvido Mouco
+SING_SCORE_AMATEUR=Amador
+SING_SCORE_RISING_STAR=Estrela em Ascenção
+SING_SCORE_LEAD_SINGER=Cantor Principal
+SING_SCORE_HIT_ARTIST=Artista
+SING_SCORE_SUPERSTAR=SuperStar
+SING_SCORE_ULTRASTAR=UltraStar
+
+SING_TOP_5_CHARTS=5 melhores Jogadores
+SING_TOP_5_CHARTS_WHEREAMI=5 melhores
+SING_TOP_5_CHARTS_CONTINUE=para a escolha da Canção
+
+POPUP_PERFECT=Perfeito!
+POPUP_AWESOME=Fantástico!
+POPUP_GREAT=Óptimo!
+POPUP_GOOD=Bom!
+POPUP_NOTBAD=Nada Mal!
+POPUP_BAD=Mau!
+POPUP_POOR=Fraco!
+POPUP_AWFUL=Horrível!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= e
+
+SONG_MENU_NAME_MAIN=menu de canções
+SONG_MENU_PLAY=Cantar
+SONG_MENU_CHANGEPLAYERS=Mudar Jogadores
+SONG_MENU_EDIT=Editar
+SONG_MENU_MODI=Cantar uma Modi
+SONG_MENU_CANCEL=Cancelar
+
+SONG_MENU_NAME_PLAYLIST=Menu de Canções
+SONG_MENU_PLAYLIST_ADD=Adicionar Canção
+SONG_MENU_PLAYLIST_DEL=Apagar Canção
+
+SONG_MENU_NAME_PLAYLIST_ADD=Adicionar Canção
+SONG_MENU_PLAYLIST_ADD_NEW=a uma nova playlist
+SONG_MENU_PLAYLIST_ADD_EXISTING=a uma playlist existente
+SONG_MENU_PLAYLIST_NOEXISTING=Sem playlist disponível
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nova Playlist
+SONG_MENU_PLAYLIST_NEW_CREATE=Criar
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Sem nome
+
+SONG_MENU_NAME_PLAYLIST_DEL=Apagar mesmo?
+SONG_MENU_YES=Sim
+SONG_MENU_NO=Não
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Abrir Playlist
+SONG_MENU_PLAYLIST_LOAD=abrir
+SONG_MENU_PLAYLIST_DELCURRENT=apagar Playlist actual
+
+SONG_MENU_NAME_PLAYLIST_DEL=Apagar Playlist?
+
+SONG_MENU_NAME_PARTY_MAIN=Menu de Festa
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=usar joker
+
+SONG_JUMPTO_DESC=procurar Canção
+SONG_JUMPTO_TYPE_DESC=Procurar por:
+SONG_JUMPTO_TYPE1=Todos
+SONG_JUMPTO_TYPE2=Título
+SONG_JUMPTO_TYPE3=Artista
+SONG_JUMPTO_SONGSFOUND=%d Música(s) encontrada(s)
+SONG_JUMPTO_NOSONGSFOUND=Nenhuma Canção encontrada
+SONG_JUMPTO_HELP=Escreva para procurar
+SONG_JUMPTO_CATTEXT=Procurar por: %s
+
+PARTY_MODE=modo Festa
+PARTY_DIFFICULTY=Dificuldade
+PARTY_PLAYLIST=Modo Playlist
+PARTY_PLAYLIST_ALL=Todas as Canções
+PARTY_PLAYLIST_CATEGORY=Directório
+PARTY_PLAYLIST_PLAYLIST=Playlist
+PARTY_ROUNDS=Rondas
+PARTY_TEAMS=Equipas
+PARTY_TEAMS_PLAYER1=Jogador Equipa1
+PARTY_TEAMS_PLAYER2=Jogador Equipa2
+PARTY_TEAMS_PLAYER3=Jogador Equipa3
+
+PARTY_LEGEND_CONTINUE=continuar
+
+PARTY_OPTIONS_DESC=configurações para o modo festa
+PARTY_OPTIONS_WHEREAMI=Opções de Festa
+
+PARTY_PLAYER_DESC=inserir nomes de jogadores e equipas
+PARTY_PLAYER_WHEREAMI=Nomes de Festa
+PARTY_PLAYER_ENTER_NAME=inserir nomes
+PARTY_PLAYER_LEGEND_CONTINUE=iniciar Festa
+
+PARTY_ROUND_DESC=Jogadores seguintes para os microsfones
+PARTY_ROUND_WHEREAMIFesta - Ronda seguinte
+PARTY_ROUND_LEGEND_CONTINUE=inicio da Ronda
+
+PARTY_SONG_WHEREAMI=Escolha da Canção - Festa
+PARTY_SONG_LEGEND_CONTINUE=cantar
+PARTY_SONG_MENU=menu Festa
+
+PARTY_SCORE_DESC=pontuação da última ronda
+PARTY_SCORE_WHEREAMI=Pontos da Festa
+
+PARTY_WIN_DESC=vencedor do Jogo Festa
+PARTY_WIN_WHEREAMI=Vencedor da Festa
+PARTY_WIN_LEGEND_CONTINUE=voltar ao menu principal
+
+PARTY_ROUND=Ronda
+PARTY_ROUND_WINNER=Vencedor
+PARTY_NOTPLAYEDYET=ainda não tocadas
+PARTY_NOBODY=ninguém
+NEXT_ROUND=Ronda seguinte:
+
+PARTY_DISMISSED=Dispensado!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=ganhou!
+
+PLUGIN_HDL_NAME=Manter a linha
+PLUGIN_HDL_DESC=Não piorar o ponteiro que é mostrado na barra de pontuação
+
+PLUGIN_UNTIL5000_NAME=Até 5000
+PLUGIN_UNTIL5000_DESC=Quem obter primeiro 5000 pontos ganha a partida
+
+PLUGIN_DUELL_NAME=Duelo
+PLUGIN_DUELL_DESC=Fazer um Duelo até aos 10000 pontos.
+
+PLUGIN_BLIND_NAME=Modo Cego
+PLUGIN_BLIND_DESC=Duelo sem ver as notas.
+
+STAT_MAIN=Estatísticas
+STAT_MAIN_DESC=Geral
+STAT_MAIN_WHEREAMI=Estatísticas
+
+STAT_OVERVIEW_INTRO=%0:s Estatisticas. \n Último Reset a %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Canções(%3:d com Video), das quais %1:d já tocaram e %2:d ainda não tocaram.\n A Canção mais popular é %5:s de %4:s.
+STAT_OVERVIEW_PLAYER=Desde o último Reset houve %0:d Jogador(es) diferente(s).\n O Melhor Jogador é %1:s com a Pontuação média de %2:d Pontos.\n %3:s teve a Pontuação mais alta com %4:d Pontos.
+
+STAT_DETAIL=Estatísticas
+STAT_DETAIL_WHEREAMI=Estatísticas Detalhadas
+
+STAT_NEXT=Página Seguinte
+STAT_PREV=Página Anterior
+STAT_REVERSE=Ordem Inversa
+STAT_PAGE=%0:d de %1:d Páginas\n (%2:d de %3:d Entradas)
+
+STAT_DESC_SCORES=Pontuções Altas
+STAT_DESC_SCORES_REVERSED=Pontuações Baixas
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Top Cantores
+STAT_DESC_SINGERS_REVERSED=Piores Cantores
+STAT_FORMAT_SINGERS=%0:s \n Pontuação Média: %1:d
+
+STAT_DESC_SONGS=Top Canções
+STAT_DESC_SONGS_REVERSED=Canções menos populares
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx cantaram
+
+STAT_DESC_BANDS=Top Bandas
+STAT_DESC_BANDS_REVERSED=Bandas menos populares
+STAT_FORMAT_BANDS=%0:s \n %1:dx Cantaram
+
+MSG_ERROR_TITLE=Erro
+MSG_QUESTION_TITLE=Questão
+MSG_QUIT_USDX=Deseja mesmo sair do UltraStar?
+MSG_END_PARTY=Deseja mesmo terminar o modo Festa?
+ERROR_NO_SONGS=Nenhuma Canção lida
+ERROR_NO_PLUGINS=Nenhum Plugin lido
+ERROR_CORRUPT_SONG=Canção não pôde ser lida. \ No newline at end of file
diff --git a/Game/Output/Languages/TODOs/Serbian.ini b/Game/Output/Languages/TODOs/Serbian.ini
new file mode 100644
index 00000000..13fd1bcc
--- /dev/null
+++ b/Game/Output/Languages/TODOs/Serbian.ini
@@ -0,0 +1,299 @@
+[Text]
+SING_LOADING=Ucitava se...
+
+SING_CHOOSE_MODE=izaberi mod
+SING_SING=pevaj
+SING_SING_DESC=brza igra: pevaj solo ili u duetu
+
+SING_MULTI=tim
+SING_MULTI_DESC=pevaj u timskom modu
+
+SING_TOOLS=alati
+
+SING_STATS=statistike
+SING_STATS_DESC=pogledaj statistike
+
+SING_EDITOR=editor
+SING_EDITOR_DESC=napravi svoje pesme
+
+SING_GAME_OPTIONS=oprcije igre
+SING_GAME_OPTIONS_DESC=promeni podesavanja igre
+
+SING_EXIT=izlaz
+SING_EXIT_DESC=izadji iz igre
+
+SING_OPTIONS=opcije
+SING_OPTIONS_DESC=promeni podesavanja
+SING_OPTIONS_WHEREAMI=Opcije
+
+SING_OPTIONS_GAME=igra
+SING_OPTIONS_GRAPHICS=grafika
+SING_OPTIONS_SOUND=zvuk
+SING_OPTIONS_LYRICS=lirike
+SING_OPTIONS_THEMES=teme
+SING_OPTIONS_RECORD=snimanje
+SING_OPTIONS_ADVANCED=ostalo
+SING_OPTIONS_EXIT=nazad
+
+SING_OPTIONS_GAME_WHEREAMI=Opcije Igra
+SING_OPTIONS_GAME_DESC=opsta podesavanja igre
+SING_OPTIONS_GAME_PLAYERS=Igraci
+SING_OPTIONS_GAME_DIFFICULTY=Tezina
+SING_OPTIONS_GAME_LANGUAGE=Jezik
+SING_OPTIONS_GAME_TABS=Tabovi
+SING_OPTIONS_GAME_SORTING=Sortiranje
+SING_OPTIONS_GAME_DEBUG=Dibagiranje
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Opcije Grafika
+SING_OPTIONS_GRAPHICS_DESC=graficka podesavanja
+SING_OPTIONS_GRAPHICS_RESOLUTION=Rezolucija
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Pun Ekran
+SING_OPTIONS_GRAPHICS_DEPTH=Boje
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Osciloskop
+SING_OPTIONS_GRAPHICS_LINEBONUS=Bonus Linija
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Velicina Videa
+
+SING_OPTIONS_SOUND_WHEREAMI=Opcije Zvuk
+SING_OPTIONS_SOUND_DESC=podesavanja zvuka
+SING_OPTIONS_SOUND_MIC_BOOST=Pojacanje mikrofona
+SING_OPTIONS_SOUND_CLICK_ASSIST=Click assist
+SING_OPTIONS_SOUND_BEAT_CLICK=Beat click
+SING_OPTIONS_SOUND_THRESHOLD=Stepen Cujnosti
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Mod za dva igraca
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Provera jacine tona
+SING_OPTIONS_SOUND_PREVIEWFADING=Provera pomracenja
+
+SING_OPTIONS_LYRICS_WHEREAMI=Opcije Lirike
+SING_OPTIONS_LYRICS_DESC=Podesavanja lirika
+SING_OPTIONS_LYRICS_FONT=Font
+SING_OPTIONS_LYRICS_EFFECT=Efekti
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmizacija
+
+SING_OPTIONS_THEMES_WHEREAMI=Opcije Teme
+SING_OPTIONS_THEMES_DESC=podesavanja teme i skina
+SING_OPTIONS_THEMES_THEME=Tema
+SING_OPTIONS_THEMES_SKIN=Skin
+SING_OPTIONS_THEMES_COLOR=Boja
+
+SING_OPTIONS_RECORD_WHEREAMI=Opcije Snimanje
+SING_OPTIONS_RECORD_DESC=podesavanja mikrofona
+SING_OPTIONS_RECORD_CARD=Zvucna Kartica
+SING_OPTIONS_RECORD_INPUT=Ulaz
+SING_OPTIONS_RECORD_CHANNELL=Levi Kanal
+SING_OPTIONS_RECORD_CHANNELR=Desni Kanal
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Opcije Ostalo
+SING_OPTIONS_ADVANCED_DESC=ostala podesavanja
+SING_OPTIONS_ADVANCED_EFFECTSING=Efekti Pevanja
+SING_OPTIONS_ADVANCED_SCREENFADE=Pomracenje Ekrana
+SING_OPTIONS_ADVANCED_LOADANIMATION=Animacija Ucitavanja
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Bezbednosna Pitanja
+SING_OPTIONS_ADVANCED_LINEBONUS=Linijski Bonus
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Posle Odabira Pesme
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Automatski Timski Meni
+
+SING_LEGEND_SELECT=izaberi
+SING_LEGEND_NAVIGATE=biraj
+SING_LEGEND_CONTINUE=nastavi
+SING_LEGEND_ESC=nazad
+
+SING_PLAYER_DESC=unesi ime igraca
+SING_PLAYER_WHEREAMI=Imenaigraca
+SING_PLAYER_ENTER_NAME=unesi ime
+
+SING_DIFFICULTY_DESC=izaberi tezinu
+SING_DIFFICULTY_WHEREAMI=Tezina
+SING_DIFFICULTY_CONTINUE=do odabira pesme
+SING_EASY=Lako
+SING_MEDIUM=Normalno
+SING_HARD=Tesko
+
+SING_SONG_SELECTION_DESC=izaberi svoju pesmu
+SING_SONG_SELECTION_WHEREAMI=Izbor Pesme
+SING_SONG_SELECTION_GOTO=idi na...
+SING_SONG_SELECTION=izbor pesme
+SING_SONG_SELECTION_MENU=meni
+SING_SONG_SELECTION_PLAYLIST=lista pesama
+SING_SONGS_IN_CAT=Pesme
+PLAYLIST_CATTEXT=Playlist: %s
+
+SING_TIME=TIME
+SING_TOTAL=total
+SING_MODE=pevaj solo
+SING_NOTES=note
+SING_GOLDEN_NOTES=zlatne note
+SING_PHRASE_BONUS=linijski bonus
+
+SING_MENU=Glavni Meni
+
+SONG_SCORE=rezultat pesme
+SONG_SCORE_WHEREAMI=Rezultat
+
+SING_SCORE_TONE_DEAF=Antitalenat
+SING_SCORE_AMATEUR=Amater
+SING_SCORE_RISING_STAR=Zvezda U Usponu
+SING_SCORE_LEAD_SINGER=Solista
+SING_SCORE_HIT_ARTIST=Hit Pevac
+SING_SCORE_SUPERSTAR=SuperZvezda
+SING_SCORE_ULTRASTAR=UltraZvezda
+
+SING_TOP_5_CHARTS=najboljih 5 Igraca
+SING_TOP_5_CHARTS_WHEREAMI=najboljih pet
+SING_TOP_5_CHARTS_CONTINUE=do izbora pesme
+
+POPUP_PERFECT=savrseno!
+POPUP_AWESOME=odlicno!
+POPUP_GREAT=sjajno!
+POPUP_GOOD=dobro!
+POPUP_NOTBAD=nije lose!
+POPUP_BAD=lose!
+POPUP_POOR=jedno!
+POPUP_AWFUL=grozno!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= i
+
+SONG_MENU_NAME_MAIN=meni pesme
+SONG_MENU_PLAY=Pevaj
+SONG_MENU_CHANGEPLAYERS=Promeni Igrace
+SONG_MENU_EDIT=Edituj
+SONG_MENU_MODI=Pevaj Modi
+SONG_MENU_CANCEL=Nazad
+
+SONG_MENU_NAME_PLAYLIST=Meni Pesme
+SONG_MENU_PLAYLIST_ADD=Dodaj Pesmu
+SONG_MENU_PLAYLIST_DEL=Obrisi Pesmu
+
+SONG_MENU_NAME_PLAYLIST_ADD=Dodaj Pesmu
+SONG_MENU_PLAYLIST_ADD_NEW=na novu listu
+SONG_MENU_PLAYLIST_ADD_EXISTING=na postojecu listu
+SONG_MENU_PLAYLIST_NOEXISTING=Nema dostupnih lista
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nova Lista
+SONG_MENU_PLAYLIST_NEW_CREATE=Napravi
+SONG_MENU_PLAYLIST_NEW_UNNAMED=BezNaziva
+
+SONG_MENU_NAME_PLAYLIST_DEL=Zaista Obrisati?
+SONG_MENU_YES=Da
+SONG_MENU_NO=Ne
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Otvori Listu
+SONG_MENU_PLAYLIST_LOAD=otvori
+SONG_MENU_PLAYLIST_DELCURRENT=obrisi Trenutnu Listu
+
+SONG_MENU_NAME_PLAYLIST_DEL=Obrisi listu?
+
+SONG_MENU_NAME_PARTY_MAIN=Timski Meni
+SONG_MENU_JOKER=Dzoker
+
+SONG_MENU_NAME_PARTY_JOKER=uzmi dzokera
+
+SONG_JUMPTO_DESC=trazi pesmu
+SONG_JUMPTO_TYPE_DESC=Trazi:
+SONG_JUMPTO_TYPE1=Sve
+SONG_JUMPTO_TYPE2=Naziv
+SONG_JUMPTO_TYPE3=Izvodjac
+SONG_JUMPTO_SONGSFOUND=%d Pesma(pesama) nadjeno
+SONG_JUMPTO_NOSONGSFOUND=Nema nadjenih pesama
+SONG_JUMPTO_HELP=Upisi tekst koji trazis
+SONG_JUMPTO_CATTEXT=Search for: %s
+
+PARTY_MODE=timski mod
+PARTY_DIFFICULTY=Tezina
+PARTY_PLAYLIST=Mod Liste Pesama
+PARTY_PLAYLIST_ALL=Sve Pesme
+PARTY_PLAYLIST_CATEGORY=Direktorijum
+PARTY_PLAYLIST_PLAYLIST=Lista Pesama
+PARTY_ROUNDS=Runde
+PARTY_TEAMS=Timovi
+PARTY_TEAMS_PLAYER1=Igrac Tim1
+PARTY_TEAMS_PLAYER2=Igrac Tim2
+PARTY_TEAMS_PLAYER3=Igrac Tim3
+
+PARTY_LEGEND_CONTINUE=nastavi
+
+PARTY_OPTIONS_DESC=podesavanja za timsku igru
+PARTY_OPTIONS_WHEREAMI=Timske Opcije
+
+PARTY_PLAYER_DESC=unesi imena igraca i timova!
+PARTY_PLAYER_WHEREAMI=Imena Timova
+PARTY_PLAYER_ENTER_NAME=unesi imena
+PARTY_PLAYER_LEGEND_CONTINUE=zapocni timsku igru
+
+PARTY_ROUND_DESC=sledeci igraci za mikrofonom
+PARTY_ROUND_WHEREAMI=Timska Sledeca Runda
+PARTY_ROUND_LEGEND_CONTINUE=pocni rundu
+
+PARTY_SONG_WHEREAMI=Timski Izbor Pesama
+PARTY_SONG_LEGEND_CONTINUE=povaj
+PARTY_SONG_MENU=timski meni
+
+PARTY_SCORE_DESC=rezultat poslednje runde
+PARTY_SCORE_WHEREAMI=Timski Poeni
+
+PARTY_WIN_DESC=pobednik timske igre
+PARTY_WIN_WHEREAMI=Timski Pobednik
+PARTY_WIN_LEGEND_CONTINUE=nazad u glavni meni
+
+PARTY_ROUND=Runda
+PARTY_ROUND_WINNER=Pobednik
+PARTY_NOTPLAYEDYET=nije jos igrao
+PARTY_NOBODY=niko
+NEXT_ROUND=Sledeca runda:
+
+PARTY_DISMISSED=Otpusten!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=Pobedio!
+
+PLUGIN_HDL_NAME=Drzi liniju
+PLUGIN_HDL_DESC=Ne budi losiji nego sto ti strelica pokazuje.
+
+PLUGIN_UNTIL5000_NAME=Do 5000
+PLUGIN_UNTIL5000_DESC=Ko stigne prvi do 5000 poena pobedjuje.
+
+PLUGIN_DUELL_NAME=Duel
+PLUGIN_DUELL_DESC=Pevaj duel do 10000 poena.
+
+PLUGIN_BLIND_NAME=Slepi Mod
+PLUGIN_BLIND_DESC=Duel bez gledanja nota.
+
+STAT_MAIN=Statistike
+STAT_MAIN_DESC=Generalne
+STAT_MAIN_WHEREAMI=Statistike
+
+STAT_OVERVIEW_INTRO=%0:s Statistike. \n Poslednji reset bio je %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Pesme(%3:d sa Videom), gde su %1:d vec igrane i %2:d nisu jos igrane.\n Najpopularnija pesma je %5:s sa %4:s.
+STAT_OVERVIEW_PLAYER=Od poslednjeg reseta bilo je %0:d razlicitih igraca.\n Najbolji igrac je %1:s sa prosecnim rezultatom od %2:d poena.\n %3:s je imao najveci rezultat sa %4:d poena.
+
+STAT_DETAIL=Statistike
+STAT_DETAIL_WHEREAMI=Detalji Statistike
+
+STAT_NEXT=Sledeca Strana
+STAT_PREV=Prethodna Strana
+STAT_REVERSE=Obrnuti Redosled
+STAT_PAGE=Seite %0:d of %1:d strana\n (%2:d od %3:d unosa)
+
+STAT_DESC_SCORES=NajboljiRezultati
+STAT_DESC_SCORES_REVERSED=NajgoriRezultati
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Najbolji Pevaci
+STAT_DESC_SINGERS_REVERSED=Najgori Pevaci
+STAT_FORMAT_SINGERS=%0:s \n Prosecan Rezultat: %1:d
+
+STAT_DESC_SONGS=Najpopularnije Pesme
+STAT_DESC_SONGS_REVERSED=Najmanje Popularne Pesme
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx pevano
+
+STAT_DESC_BANDS=Najpopularniji Bendovi
+STAT_DESC_BANDS_REVERSED=Najmanje Popularni Bendovi
+STAT_FORMAT_BANDS=%0:s \n %1:dx Pevano
+
+MSG_ERROR_TITLE=Greska
+MSG_QUESTION_TITLE=Pitanje
+MSG_QUIT_USDX=Stvarno napustate UltraStar?
+MSG_END_PARTY=Stvarno napustate Timski Mod?
+ERROR_NO_SONGS=Nema ucitanih pesama
+ERROR_NO_PLUGINS=Nema ucitanih plugin-ova
+ERROR_CORRUPT_SONG=Pesma se ne moze ucitati. \ No newline at end of file
diff --git a/Game/Output/Languages/TODOs/Slovak.ini b/Game/Output/Languages/TODOs/Slovak.ini
new file mode 100644
index 00000000..2853bff6
--- /dev/null
+++ b/Game/Output/Languages/TODOs/Slovak.ini
@@ -0,0 +1,302 @@
+[Text]
+SING_LOADING=... nahráva sa hra !
+
+SING_CHOOSE_MODE=vyberte si z možností
+SING_SING=Hra
+SING_SING_DESC=sólo alebo duet
+
+SING_MULTI=Párty
+SING_MULTI_DESC=párty-mód
+
+SING_TOOLS=Nástroje
+
+SING_STATS=štatistika
+SING_STATS_DESC=zobrazi štatistiku
+
+SING_EDITOR=editor
+SING_EDITOR_DESC=vytvorte si vlastnú skladbu
+
+SING_GAME_OPTIONS=nastavenia
+SING_GAME_OPTIONS_DESC=nastavenia hry
+
+SING_EXIT=Koniec
+SING_EXIT_DESC=návrat do systému
+
+SING_OPTIONS=nastavenia
+SING_OPTIONS_DESC=zmeni nastavenia
+SING_OPTIONS_WHEREAMI=Nastavenia
+
+SING_OPTIONS_GAME=hra
+SING_OPTIONS_GRAPHICS=grafika
+SING_OPTIONS_SOUND=zvuk
+SING_OPTIONS_LYRICS=text
+SING_OPTIONS_THEMES=témy
+SING_OPTIONS_RECORD=mikrofón
+SING_OPTIONS_ADVANCED=iné
+SING_OPTIONS_EXIT=spä
+
+SING_OPTIONS_GAME_WHEREAMI=Nastavenia hry
+SING_OPTIONS_GAME_DESC=všeobecné nastavenia
+SING_OPTIONS_GAME_PLAYERS=Poèet hráèov
+SING_OPTIONS_GAME_DIFFICULTY=Obtiažnos
+SING_OPTIONS_GAME_LANGUAGE=Jazyk
+SING_OPTIONS_GAME_TABS=Kategórie
+SING_OPTIONS_GAME_SORTING=Zoradenie
+SING_OPTIONS_GAME_DEBUG=Debug mód
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Grafika
+SING_OPTIONS_GRAPHICS_DESC=nastavenie grafických detailov
+SING_OPTIONS_GRAPHICS_RESOLUTION=Rozlíšenie
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Celá obrazovka
+SING_OPTIONS_GRAPHICS_DEPTH=Far. håbka
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Osciloskop
+SING_OPTIONS_GRAPHICS_LINEBONUS=Èiarový Bonus
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Zobrazenie videa
+
+SING_OPTIONS_SOUND_WHEREAMI=Zvuk
+SING_OPTIONS_SOUND_DESC=nastavenie zvuku
+SING_OPTIONS_SOUND_MIC_BOOST=Zosilnenie mikrof.
+SING_OPTIONS_SOUND_CLICK_ASSIST=Pomocný klik
+SING_OPTIONS_SOUND_BEAT_CLICK=Rytmický klik
+SING_OPTIONS_SOUND_THRESHOLD=Prah poèute¾.
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Mód dvoch hráèov
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Náh¾ad(volume)
+SING_OPTIONS_SOUND_PREVIEWFADING=Prechod skladieb
+
+SING_OPTIONS_LYRICS_WHEREAMI=Text
+SING_OPTIONS_LYRICS_DESC=nastavenia zobrazovania textov piesní
+SING_OPTIONS_LYRICS_FONT=Písmo
+SING_OPTIONS_LYRICS_EFFECT=Efekt zvýraznenia
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmizácia
+
+SING_OPTIONS_THEMES_WHEREAMI=Témy
+SING_OPTIONS_THEMES_DESC=zmena témy
+SING_OPTIONS_THEMES_THEME=Téma
+SING_OPTIONS_THEMES_SKIN=Vzh¾ad
+SING_OPTIONS_THEMES_COLOR=Farba
+
+SING_OPTIONS_RECORD_WHEREAMI=Mikrofón
+SING_OPTIONS_RECORD_DESC=nastavenie mikrofónu
+SING_OPTIONS_RECORD_CARD=Zvuková karta
+SING_OPTIONS_RECORD_INPUT=Vstup
+SING_OPTIONS_RECORD_CHANNELL=¼avý kanál
+SING_OPTIONS_RECORD_CHANNELR=Pravý kanál
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Iné
+SING_OPTIONS_ADVANCED_DESC=rozširujúce nastavenia
+SING_OPTIONS_ADVANCED_EFFECTSING=Efekty pri speve
+SING_OPTIONS_ADVANCED_SCREENFADE=Jemný prechod
+SING_OPTIONS_ADVANCED_LOADANIMATION=Animácia loading(u)
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Potvrdzovanie
+SING_OPTIONS_ADVANCED_LINEBONUS=Bonus za riadok
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Po zvolení skladby
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto PartyMenu
+
+SING_LEGEND_SELECT=výber
+SING_LEGEND_NAVIGATE=navigácia
+SING_LEGEND_CONTINUE=pokraèova
+SING_LEGEND_ESC=spä
+
+SING_PLAYER_DESC=zadajte meno hráèa(ov)
+SING_PLAYER_WHEREAMI=Mená hráèov
+SING_PLAYER_ENTER_NAME=zadávanie mena
+
+SING_DIFFICULTY_DESC=Vyberte obtiažnos
+SING_DIFFICULTY_WHEREAMI=Obtiažnos
+SING_DIFFICULTY_CONTINUE=pokraèova
+SING_EASY=¼ahká
+SING_MEDIUM=Stredná
+SING_HARD=ažká
+
+SING_SONG_SELECTION_DESC=Vyberte skladbu
+SING_SONG_SELECTION_WHEREAMI=výber skladby
+SING_SONG_SELECTION_GOTO=choï na ..
+SING_SONG_SELECTION=výber skladby
+SING_SONG_SELECTION_MENU=menu
+SING_SONG_SELECTION_PLAYLIST=playlist
+SING_SONGS_IN_CAT=Skladba
+PLAYLIST_CATTEXT=Playlist: %s
+
+SING_TIME=Èas
+SING_TOTAL=celkovo
+SING_MODE=spieva sólo
+SING_NOTES=noty
+SING_GOLDEN_NOTES=zlaté noty
+SING_PHRASE_BONUS=bonus za riadok
+
+SING_MENU=Hlavné Menu
+
+SONG_SCORE=hodnotenie
+SONG_SCORE_WHEREAMI=Skóre
+
+SING_SCORE_TONE_DEAF=Antitalent
+SING_SCORE_AMATEUR=Amatér
+SING_SCORE_RISING_STAR=Vychádzajúca hviezda
+SING_SCORE_LEAD_SINGER=Spevák
+SING_SCORE_HIT_ARTIST=Star
+SING_SCORE_SUPERSTAR=Superstar
+SING_SCORE_ULTRASTAR=Ultrastar
+
+SING_TOP_5_CHARTS=najlepších 5
+SING_TOP_5_CHARTS_WHEREAMI=top 5
+SING_TOP_5_CHARTS_CONTINUE=pre výber skladby
+
+POPUP_PERFECT=neskutoèné!
+POPUP_AWESOME=paráda!
+POPUP_GREAT=super!
+POPUP_GOOD=dobré!
+POPUP_NOTBAD=nie zlé!
+POPUP_BAD=zle!
+POPUP_POOR=bieda!
+POPUP_AWFUL=otrasné!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= a
+
+SONG_MENU_NAME_MAIN=Výber hudby
+SONG_MENU_PLAY=Štart
+SONG_MENU_CHANGEPLAYERS=Iný hráè
+SONG_MENU_EDIT=Uprav
+SONG_MENU_MODI=Sing a Modi
+SONG_MENU_CANCEL=Zruši
+
+SONG_MENU_NAME_PLAYLIST=Skladby
+SONG_MENU_PLAYLIST_ADD=Pridaj skladbu
+SONG_MENU_PLAYLIST_DEL=Zmaž skladbu
+
+SONG_MENU_NAME_PLAYLIST_ADD=Pridaj Skladbu
+SONG_MENU_PLAYLIST_ADD_NEW=do nového playlistu
+SONG_MENU_PLAYLIST_ADD_EXISTING=do existujúceho playlistu
+SONG_MENU_PLAYLIST_NOEXISTING=Nie je dostupný žiadny playlist
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nový Playlist
+SONG_MENU_PLAYLIST_NEW_CREATE=Vytvor
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Bez mena
+
+SONG_MENU_NAME_PLAYLIST_DEL=Skutoène Zmaza ?
+SONG_MENU_YES=Áno
+SONG_MENU_NO=Nie
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Naèítaj Playlist
+SONG_MENU_PLAYLIST_LOAD=naèítaj
+SONG_MENU_PLAYLIST_DELCURRENT=zmaž tento Playlist
+
+SONG_MENU_NAME_PLAYLIST_DEL=Zmaza Playlist?
+
+SONG_MENU_NAME_PARTY_MAIN=Party Menu
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=použi jokera
+
+SONG_JUMPTO_DESC=h¾adaj skladbu
+SONG_JUMPTO_TYPE_DESC=h¾adaj:
+SONG_JUMPTO_TYPE1=všade
+SONG_JUMPTO_TYPE2=v názve skladby
+SONG_JUMPTO_TYPE3=v mene autora
+SONG_JUMPTO_SONGSFOUND=%d skladieb vyhovuje filtru
+SONG_JUMPTO_NOSONGSFOUND=Žiadna skladba
+SONG_JUMPTO_HELP=Napíš k¾úèové slovo pre h¾adanie
+SONG_JUMPTO_CATTEXT=H¾adaj: %s
+
+PARTY_MODE=párty mód
+PARTY_DIFFICULTY=Obtiažnos
+PARTY_PLAYLIST=Skladby z playlistu
+PARTY_PLAYLIST_ALL=Všetky skladby
+PARTY_PLAYLIST_CATEGORY=Kategória
+PARTY_PLAYLIST_PLAYLIST=Playlist
+PARTY_ROUNDS=Poèet kôl
+PARTY_TEAMS=Poèet tímov
+PARTY_TEAMS_PLAYER1=Hráèov v Tíme 1
+PARTY_TEAMS_PLAYER2=Hráèov v Tíme 2
+PARTY_TEAMS_PLAYER3=Hráèov v Tíme 3
+
+PARTY_LEGEND_CONTINUE=pokraèova
+
+PARTY_OPTIONS_DESC=nastavenia pre párty-mód
+PARTY_OPTIONS_WHEREAMI=Párty nastavenia
+
+PARTY_PLAYER_DESC=Zadajte mená tímov a hráèov!
+PARTY_PLAYER_WHEREAMI=Párty mená
+PARTY_PLAYER_ENTER_NAME=zadajte mená
+PARTY_PLAYER_LEGEND_CONTINUE=Pokraèova
+
+PARTY_ROUND_DESC=párty pre hráèov
+PARTY_ROUND_WHEREAMI=List párty disciplín
+PARTY_ROUND_LEGEND_CONTINUE=Štart disciplíny
+
+PARTY_SONG_WHEREAMI=Párty - Výver Skladby
+PARTY_SONG_LEGEND_CONTINUE=Štart
+PARTY_SONG_MENU=party menu
+
+PARTY_SCORE_DESC=skóre posledného kola
+PARTY_SCORE_WHEREAMI=Párty skóre
+
+PARTY_WIN_DESC=Víaz párty
+PARTY_WIN_WHEREAMI=Stupeò víazov
+PARTY_WIN_LEGEND_CONTINUE=spä do hlavného menu
+
+PARTY_ROUND=Kolo
+PARTY_ROUND_WINNER=Víaz
+PARTY_NOTPLAYEDYET=nehralo
+PARTY_NOBODY=ani jedno družstvo
+NEXT_ROUND=Ïalšie kolo:
+
+PARTY_DISMISSED=Ukonèené !
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=víaz tohto kola
+
+PLUGIN_HDL_NAME=Superstar
+PLUGIN_HDL_DESC=nesmieš klesnú pod hranicu ukazovate¾a úspešnosti
+
+PLUGIN_UNTIL5000_NAME=Po 5000
+PLUGIN_UNTIL5000_DESC=kto prvý získa 5000 bodov sa stane víazom
+
+PLUGIN_DUELL_NAME=Duel
+PLUGIN_DUELL_DESC=spievaj, kým nedosiahneš 10000 bodov
+
+PLUGIN_TEAMDUELL_NAME=Duel Tímov
+PLUGIN_TEAMDUELL_DESC=každý hráè sa vystrieda za mikrofónom
+
+PLUGIN_BLIND_NAME=Slepý
+PLUGIN_BLIND_DESC=neuvidíš noty pre hlas
+
+STAT_MAIN=Štatistika
+STAT_MAIN_DESC=Všeobecne
+STAT_MAIN_WHEREAMI=Štatistiky
+
+STAT_OVERVIEW_INTRO=%0:s štatistika \n Štatistika od %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=SKLADBY \n Celkove: %0:d z toho %3:d s videom\n Poèet už hraných: %1:d \n Poèet nehraných: %2:d \n Najhranejšia skladba: %5:s od %4:s
+STAT_OVERVIEW_PLAYER=HRÁÈI \n Celkove: %0:d rôznych hráèov.\n Najlepší hráè: %1:s (%2:d - priemer bodov)\n Najvyššie skóre: %3:s (%4:d bodov)
+
+STAT_DETAIL=Štatistiky
+STAT_DETAIL_WHEREAMI=Podrobná štatistika
+
+STAT_NEXT=Ïalšia strana
+STAT_PREV=Predošlá strana
+STAT_REVERSE=Otoè poradie
+STAT_PAGE=%0:d. z %1:d strán\n (%2:d z %3:d položiek)
+
+STAT_DESC_SCORES=Najvyššie skóre
+STAT_DESC_SCORES_REVERSED=Najhoršie skóre
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Najlepší speváci
+STAT_DESC_SINGERS_REVERSED=Najhorší speváci
+STAT_FORMAT_SINGERS=%0:s \n Priemer skóre: %1:d
+
+STAT_DESC_SONGS=Najhranejšie skladby
+STAT_DESC_SONGS_REVERSED=Najmenej hrané skladby
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx spievaná
+
+STAT_DESC_BANDS=Najhranejšia kapela
+STAT_DESC_BANDS_REVERSED=Najmenej hraná kapela
+STAT_FORMAT_BANDS=%0:s \n %1:dx spievaná
+
+MSG_ERROR_TITLE=Chyba
+MSG_QUESTION_TITLE=Otázka
+MSG_QUIT_USDX=Skutoène chcete skonèi UltraStar?
+MSG_END_PARTY=Skutoène chcete skonèit Párty Mód ?
+ERROR_NO_SONGS=Žiadna skladba
+ERROR_NO_PLUGINS=Žiadny zásuvný modul
+ERROR_CORRUPT_SONG=Skladbu sa nepodarilo nahra.
diff --git a/Game/Output/Languages/TODOs/Spanish.ini b/Game/Output/Languages/TODOs/Spanish.ini
new file mode 100644
index 00000000..0eae1d36
--- /dev/null
+++ b/Game/Output/Languages/TODOs/Spanish.ini
@@ -0,0 +1,298 @@
+[Text]
+SING_LOADING=Cargando...
+
+SING_CHOOSE_MODE=Escoge
+SING_SING=¡Canta!
+SING_SING_DESC=Cantar
+
+SING_MULTI=Grupo
+SING_MULTI_DESC=Cantar en grupos
+
+SING_TOOLS=Utilidades
+
+SING_STATS=Estadisticas
+SING_STATS_DESC=Ver las estadisticas
+
+SING_EDITOR=Editor
+SING_EDITOR_DESC=Crea tus propias canciones
+
+SING_GAME_OPTIONS=Opciones
+SING_GAME_OPTIONS_DESC=Cambia las opciones del juego
+
+SING_EXIT=Salir
+SING_EXIT_DESC=Salir del juego
+
+SING_OPTIONS=Opciones
+SING_OPTIONS_DESC=Cambia las opciones
+SING_OPTIONS_WHEREAMI=Opciones
+
+SING_OPTIONS_GAME=Juego
+SING_OPTIONS_GRAPHICS=Gráficos
+SING_OPTIONS_SOUND=Sonido
+SING_OPTIONS_LYRICS=Letras
+SING_OPTIONS_THEMES=Temas
+SING_OPTIONS_RECORD=Grabación
+SING_OPTIONS_ADVANCED=Avanzadas
+SING_OPTIONS_EXIT=Regresar
+
+SING_OPTIONS_GAME_WHEREAMI=Opciones del juego
+SING_OPTIONS_GAME_DESC=Opciones generales del juego
+SING_OPTIONS_GAME_PLAYERS=Jugadores
+SING_OPTIONS_GAME_DIFFICULTY=Dificultad
+SING_OPTIONS_GAME_LANGUAGE=Idioma
+SING_OPTIONS_GAME_TABS=Etiquetas
+SING_OPTIONS_GAME_SORTING=Clasificar por
+SING_OPTIONS_GAME_DEBUG=Modo depuración
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Opciones gráficas
+SING_OPTIONS_GRAPHICS_DESC=Opciones gráficas
+SING_OPTIONS_GRAPHICS_RESOLUTION=Resolución
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Pantalla completa
+SING_OPTIONS_GRAPHICS_DEPTH=Calidad de color
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Osciloscopio
+SING_OPTIONS_GRAPHICS_LINEBONUS=Bonus de línea
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Tamaño del vídeo
+
+SING_OPTIONS_SOUND_WHEREAMI=Opciones de sonido
+SING_OPTIONS_SOUND_DESC=Opciones de sonido
+SING_OPTIONS_SOUND_MIC_BOOST=Potenciar micro.
+SING_OPTIONS_SOUND_CLICK_ASSIST=Asist. de notas
+SING_OPTIONS_SOUND_BEAT_CLICK=Asist. de golpes
+SING_OPTIONS_SOUND_THRESHOLD=Atenuar micro.
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Modo dos jugadores
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Volum. de avance
+SING_OPTIONS_SOUND_PREVIEWFADING=Desvanecimiento
+
+SING_OPTIONS_LYRICS_WHEREAMI=Opciones de letras
+SING_OPTIONS_LYRICS_DESC=Opciones de letras
+SING_OPTIONS_LYRICS_FONT=Fuente
+SING_OPTIONS_LYRICS_EFFECT=Efecto
+SING_OPTIONS_LYRICS_SOLMIZATION=Solfeo
+
+SING_OPTIONS_THEMES_WHEREAMI=Opciones de temas
+SING_OPTIONS_THEMES_DESC=Opciones de temas
+SING_OPTIONS_THEMES_THEME=Tema
+SING_OPTIONS_THEMES_SKIN=Piel
+SING_OPTIONS_THEMES_COLOR=Color
+
+SING_OPTIONS_RECORD_WHEREAMI=Opciones de grabación
+SING_OPTIONS_RECORD_DESC=Opciones del micrófono
+SING_OPTIONS_RECORD_CARD=Tarjeta de sonido
+SING_OPTIONS_RECORD_INPUT=Captura
+SING_OPTIONS_RECORD_CHANNELL=Canal izquierdo
+SING_OPTIONS_RECORD_CHANNELR=Canal derecho
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Opciones avanzadas
+SING_OPTIONS_ADVANCED_DESC=Opciones avanzadas
+SING_OPTIONS_ADVANCED_EFFECTSING=Efectos al cantar
+SING_OPTIONS_ADVANCED_SCREENFADE=Desvanecimiento
+SING_OPTIONS_ADVANCED_LOADANIMATION=Animación de carga
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Preguntar
+SING_OPTIONS_ADVANCED_LINEBONUS=Bonus de línea
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Al selecionar canción
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto menú de grupo
+
+SING_LEGEND_SELECT=Seleccionar
+SING_LEGEND_NAVIGATE=Navegar
+SING_LEGEND_CONTINUE=continuar
+SING_LEGEND_ESC=Regresar
+
+SING_PLAYER_DESC=Nombre(s) de jugador(es)
+SING_PLAYER_WHEREAMI=Nombre(s) de jugador(es)
+SING_PLAYER_ENTER_NAME=Escribe el nombre
+
+SING_DIFFICULTY_DESC=Selecciona la dificultad
+SING_DIFFICULTY_WHEREAMI=Dificultad
+SING_DIFFICULTY_CONTINUE=Siguiente
+SING_EASY=Fácil
+SING_MEDIUM=Normal
+SING_HARD=Difícil
+
+SING_SONG_SELECTION_DESC=Selecciona tu canción
+SING_SONG_SELECTION_WHEREAMI=Selección de canción
+SING_SONG_SELECTION_GOTO=Ir a...
+SING_SONG_SELECTION=Selección de canción
+SING_SONG_SELECTION_MENU=Menú
+SING_SONG_SELECTION_PLAYLIST=Lista
+SING_SONGS_IN_CAT=Canciones
+PLAYLIST_CATTEXT=Lista: %s
+
+SING_TIME=Tiempo
+SING_TOTAL=Total
+SING_MODE=Solo
+SING_NOTES=Notas
+SING_GOLDEN_NOTES=Notas doradas
+SING_PHRASE_BONUS=Bonus de línea
+
+SING_MENU=Menú principal
+
+SONG_SCORE=Puntaje
+SONG_SCORE_WHEREAMI=
+
+SING_SCORE_TONE_DEAF=Desafinado
+SING_SCORE_AMATEUR=Aficionado
+SING_SCORE_RISING_STAR=Progresando
+SING_SCORE_LEAD_SINGER=Cantante
+SING_SCORE_HIT_ARTIST=Gran cantante
+SING_SCORE_SUPERSTAR=Superestrella
+SING_SCORE_ULTRASTAR=Ultraestrella
+
+SING_TOP_5_CHARTS=Los mejores
+SING_TOP_5_CHARTS_WHEREAMI=
+SING_TOP_5_CHARTS_CONTINUE=Continuar
+
+POPUP_PERFECT=¡Perfecto!
+POPUP_AWESOME=¡Asombroso!
+POPUP_GREAT=¡Genial!
+POPUP_GOOD=¡Bien!
+POPUP_NOTBAD=¡No está mal!
+POPUP_BAD=¡Mal!
+POPUP_POOR=¡Pésimo!
+POPUP_AWFUL=¡Horrible!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= y
+
+SONG_MENU_NAME_MAIN=Menú de canto
+SONG_MENU_PLAY=Cantar
+SONG_MENU_CHANGEPLAYERS=Escoger jugador
+SONG_MENU_EDIT=Editar
+SONG_MENU_MODI=Cantar una Modi
+SONG_MENU_CANCEL=Cancelar
+
+SONG_MENU_NAME_PLAYLIST=Menú
+SONG_MENU_PLAYLIST_ADD=Añadir Canción
+SONG_MENU_PLAYLIST_DEL=Eliminar Canción
+
+SONG_MENU_NAME_PLAYLIST_ADD=Añadir canción
+SONG_MENU_PLAYLIST_ADD_NEW=A nueva lista
+SONG_MENU_PLAYLIST_ADD_EXISTING=A lista existente
+SONG_MENU_PLAYLIST_NOEXISTING=No hay listas
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nueva lista
+SONG_MENU_PLAYLIST_NEW_CREATE=Crear
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Sin nombre
+
+SONG_MENU_NAME_PLAYLIST_DEL=¿Suprimir?
+SONG_MENU_YES=Sí
+SONG_MENU_NO=No
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Abrir lista
+SONG_MENU_PLAYLIST_LOAD=Abrir
+SONG_MENU_PLAYLIST_DELCURRENT=Borrar la lista actual
+SONG_MENU_NAME_PLAYLIST_DEL=¿Suprimir?
+
+SONG_MENU_NAME_PARTY_MAIN=Menú
+SONG_MENU_JOKER=Aleatorio
+
+SONG_MENU_NAME_PARTY_JOKER=Aleatorio
+
+SONG_JUMPTO_DESC=Buscar
+SONG_JUMPTO_TYPE_DESC=Buscar por:
+SONG_JUMPTO_TYPE1=Todo
+SONG_JUMPTO_TYPE2=Título
+SONG_JUMPTO_TYPE3=Artista
+SONG_JUMPTO_SONGSFOUND=%d Canción(es) encontrada(as)
+SONG_JUMPTO_NOSONGSFOUND=Sin resultados
+SONG_JUMPTO_HELP=Escribe palabra(s) clave(s)
+SONG_JUMPTO_CATTEXT=Buscar por: %s
+
+PARTY_MODE=Modo Grupo
+PARTY_DIFFICULTY=Dificultad
+PARTY_PLAYLIST=Modo lista
+PARTY_PLAYLIST_ALL=Todo
+PARTY_PLAYLIST_CATEGORY=Carpeta
+PARTY_PLAYLIST_PLAYLIST=Lista
+PARTY_ROUNDS=Rondas
+PARTY_TEAMS=Equipos
+PARTY_TEAMS_PLAYER1=Miembros Eq. 1
+PARTY_TEAMS_PLAYER2=Miembros Eq .2
+PARTY_TEAMS_PLAYER3=Miembros Eq. 3
+
+PARTY_LEGEND_CONTINUE=Continuar
+
+PARTY_OPTIONS_DESC=Opciones del modo grupo
+PARTY_OPTIONS_WHEREAMI=
+
+PARTY_PLAYER_DESC=Escribe los nombre de jugadores y de equipos
+PARTY_PLAYER_WHEREAMI=Nombre equipos
+PARTY_PLAYER_ENTER_NAME=Digita un nombre
+PARTY_PLAYER_LEGEND_CONTINUE=Comenzar
+
+PARTY_ROUND_DESC=Siguientes jugadores
+PARTY_ROUND_WHEREAMI=Siguiente ronda
+PARTY_ROUND_LEGEND_CONTINUE=Iniciar ronda
+
+PARTY_SONG_WHEREAMI=Selección de cacnión
+PARTY_SONG_LEGEND_CONTINUE=Cantar
+PARTY_SONG_MENU=Menú
+
+PARTY_SCORE_DESC=Puntaje de la última ronda
+PARTY_SCORE_WHEREAMI=
+
+PARTY_WIN_DESC=Equipo ganador
+PARTY_WIN_WHEREAMI=
+PARTY_WIN_LEGEND_CONTINUE=Regresar al menú principal
+
+PARTY_ROUND=Ronda
+PARTY_ROUND_WINNER=Ganador
+PARTY_NOTPLAYEDYET=Aún no jugado
+PARTY_NOBODY=Nadie
+NEXT_ROUND=Siguiente ronda:
+
+PARTY_DISMISSED=¡Perdió!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=¡Ganó!
+
+PLUGIN_HDL_NAME=Mantén la línea
+PLUGIN_HDL_DESC=¡No bajes tu puntaje del mostrado en pantalla!
+
+PLUGIN_UNTIL5000_NAME=Hasta 5000
+PLUGIN_UNTIL5000_DESC=Gana quién obtenga 5000 puntos.
+
+PLUGIN_DUELL_NAME=Duelo
+PLUGIN_DUELL_DESC=Canta un duelo hasta 10000 puntos.
+
+PLUGIN_BLIND_NAME=Modo a ciegas
+PLUGIN_BLIND_DESC=Duelo sin mirar las notas.
+
+STAT_MAIN=Estadisticas
+STAT_MAIN_DESC=General
+STAT_MAIN_WHEREAMI=Estadisticas
+
+STAT_OVERVIEW_INTRO=%0:s Estadisticas. \n Último reinicio el %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=Hay %0:d canciones (%3:d con Vídeo), de las cuales %1:d han sido cantadas y %2:d aún no.\n La canción más popular es "%5:s" de %4:s.
+STAT_OVERVIEW_PLAYER=Hay registrados %0:d diferentes jugador(es).\n El mejor es %1:s con un puntaje promedio de %2:d puntos.\n %3:s ha hecho el mejor puntaje: %4:d puntos.
+
+STAT_DETAIL=Estadisticas
+STAT_DETAIL_WHEREAMI=Estadisticas detalladas
+
+STAT_NEXT=Siguiente
+STAT_PREV=Anterior
+STAT_REVERSE=Invertir
+STAT_PAGE=Página %0:d de %1:d \n (%2:d of %3:d Entrys)
+
+STAT_DESC_SCORES=Mejores puntajes
+STAT_DESC_SCORES_REVERSED=Peores puntajes
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Mejores jugadores
+STAT_DESC_SINGERS_REVERSED=Peores jugadores
+STAT_FORMAT_SINGERS=%0:s \n Puntaje promedio: %1:d
+
+STAT_DESC_SONGS=Canciones más populares
+STAT_DESC_SONGS_REVERSED=Canciones menos populares
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:d veces cantada
+
+STAT_DESC_BANDS=Bandas más populares
+STAT_DESC_BANDS_REVERSED=Bandas menos populares
+STAT_FORMAT_BANDS=%0:s \n %1:d veces cantada
+
+MSG_ERROR_TITLE=Error
+MSG_QUESTION_TITLE=Pregunta
+MSG_QUIT_USDX=¿Realmente quieres salir?
+MSG_END_PARTY=¿Realmente quieres terminar?
+ERROR_NO_SONGS=Sin canciones
+ERROR_NO_PLUGINS=Sin plugins
+ERROR_CORRUPT_SONG=Imposible cargar canciones \ No newline at end of file
diff --git a/Game/Output/Languages/TODOs/Swedish.ini b/Game/Output/Languages/TODOs/Swedish.ini
new file mode 100644
index 00000000..47ea996b
--- /dev/null
+++ b/Game/Output/Languages/TODOs/Swedish.ini
@@ -0,0 +1,299 @@
+[Text]
+SING_LOADING=Laddar...
+
+SING_CHOOSE_MODE=välj spelläge
+SING_SING=sjung
+SING_SING_DESC=snabb-spel: sjung solo eller duett
+
+SING_MULTI=party
+SING_MULTI_DESC=sjung i party-läge
+
+SING_TOOLS=verktyg
+
+SING_STATS=statistik
+SING_STATS_DESC=visa statistiken
+
+SING_EDITOR=redigerare
+SING_EDITOR_DESC=skapa egna låtar
+
+SING_GAME_OPTIONS=spelinställningar
+SING_GAME_OPTIONS_DESC=ändra spelinställningarna
+
+SING_EXIT=avsluta
+SING_EXIT_DESC=avsluta spelet
+
+SING_OPTIONS=inställningar
+SING_OPTIONS_DESC=ändra inställningarna
+SING_OPTIONS_WHEREAMI=Inställningar
+
+SING_OPTIONS_GAME=spel
+SING_OPTIONS_GRAPHICS=grafik
+SING_OPTIONS_SOUND=ljud
+SING_OPTIONS_LYRICS=text
+SING_OPTIONS_THEMES=teman
+SING_OPTIONS_RECORD=inspelning
+SING_OPTIONS_ADVANCED=avancerat
+SING_OPTIONS_EXIT=tillbaka
+
+SING_OPTIONS_GAME_WHEREAMI=Inställningar Spel
+SING_OPTIONS_GAME_DESC=allmänna spelinställningar
+SING_OPTIONS_GAME_PLAYERS=Spelare
+SING_OPTIONS_GAME_DIFFICULTY=Svårighetsgrad
+SING_OPTIONS_GAME_LANGUAGE=Språk
+SING_OPTIONS_GAME_TABS=Flikar
+SING_OPTIONS_GAME_SORTING=Sortering efter
+SING_OPTIONS_GAME_DEBUG=Debug
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Inställningar Grafik
+SING_OPTIONS_GRAPHICS_DESC=grafikinställningar
+SING_OPTIONS_GRAPHICS_RESOLUTION=Upplösning
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Fullskärm
+SING_OPTIONS_GRAPHICS_DEPTH=Färgdjup
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Oscilloskåp
+SING_OPTIONS_GRAPHICS_LINEBONUS=Radbonus
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Filmstorlek
+
+SING_OPTIONS_SOUND_WHEREAMI=Inställningar Ljud
+SING_OPTIONS_SOUND_DESC=ljudinställningar
+SING_OPTIONS_SOUND_MIC_BOOST=Öka mikrofonljudet
+SING_OPTIONS_SOUND_CLICK_ASSIST=Hjälpljud
+SING_OPTIONS_SOUND_BEAT_CLICK=Taktljud
+SING_OPTIONS_SOUND_THRESHOLD=Ljudtröskel
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Tvåspelarläge
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Volym i låtvalsmeny
+SING_OPTIONS_SOUND_PREVIEWFADING=Toning i låtvalsmeny
+
+SING_OPTIONS_LYRICS_WHEREAMI=Inställningar Sångtext
+SING_OPTIONS_LYRICS_DESC=sångtextsinställningar
+SING_OPTIONS_LYRICS_FONT=Textstil
+SING_OPTIONS_LYRICS_EFFECT=Effekt
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmisation
+
+SING_OPTIONS_THEMES_WHEREAMI=Inställningar Teman
+SING_OPTIONS_THEMES_DESC=tema- och skalinställningar
+SING_OPTIONS_THEMES_THEME=Tema
+SING_OPTIONS_THEMES_SKIN=Skal
+SING_OPTIONS_THEMES_COLOR=Färg
+
+SING_OPTIONS_RECORD_WHEREAMI=Inställningar Inspelning
+SING_OPTIONS_RECORD_DESC=mikrofoninställningar
+SING_OPTIONS_RECORD_CARD=Ljudkort
+SING_OPTIONS_RECORD_INPUT=Ingång
+SING_OPTIONS_RECORD_CHANNELL=Vänster kanal
+SING_OPTIONS_RECORD_CHANNELR=Höger kanal
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Inställningar Avancerat
+SING_OPTIONS_ADVANCED_DESC=avancerade inställningar
+SING_OPTIONS_ADVANCED_EFFECTSING=Sångeffekt
+SING_OPTIONS_ADVANCED_SCREENFADE=Rutblekning
+SING_OPTIONS_ADVANCED_LOADANIMATION=Ladda animation
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Säkerhetsfråga
+SING_OPTIONS_ADVANCED_LINEBONUS=Radbonus
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Vid låtval
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Automatisk partymeny
+
+SING_LEGEND_SELECT=välj
+SING_LEGEND_NAVIGATE=navigera
+SING_LEGEND_CONTINUE=fortsätt
+SING_LEGEND_ESC=tillbaka
+
+SING_PLAYER_DESC=skriv spelarens/nas namn
+SING_PLAYER_WHEREAMI=Spelarnamn
+SING_PLAYER_ENTER_NAME=skriv namn
+
+SING_DIFFICULTY_DESC=välj svårighetsgrad
+SING_DIFFICULTY_WHEREAMI=Svårighetsgrad
+SING_DIFFICULTY_CONTINUE=fortsätt till låtval
+SING_EASY=Lätt
+SING_MEDIUM=Medel
+SING_HARD=Svår
+
+SING_SONG_SELECTION_DESC=välj låt
+SING_SONG_SELECTION_WHEREAMI=Låtval
+SING_SONG_SELECTION_GOTO=gå till ..
+SING_SONG_SELECTION=låtval
+SING_SONG_SELECTION_MENU=meny
+SING_SONG_SELECTION_PLAYLIST=spellista
+SING_SONGS_IN_CAT=Låtar
+PLAYLIST_CATTEXT=Spellista: %s
+
+SING_TIME=Tid
+SING_TOTAL=total
+SING_MODE=sing solo
+SING_NOTES=noter
+SING_GOLDEN_NOTES=gyllene noter
+SING_PHRASE_BONUS=radbonus
+
+SING_MENU=Huvudmenyn
+
+SONG_SCORE=sångpoäng
+SONG_SCORE_WHEREAMI=Poäng
+
+SING_SCORE_TONE_DEAF=Tondöv
+SING_SCORE_AMATEUR=Amatör
+SING_SCORE_RISING_STAR=Stigande stjärna
+SING_SCORE_LEAD_SINGER=Lead Singer
+SING_SCORE_HIT_ARTIST=Hitartist
+SING_SCORE_SUPERSTAR=Superstjärna
+SING_SCORE_ULTRASTAR=Ultrastar
+
+SING_TOP_5_CHARTS=topp 5 Spelare
+SING_TOP_5_CHARTS_WHEREAMI=topp 5
+SING_TOP_5_CHARTS_CONTINUE=till låtval
+
+POPUP_PERFECT=perfekt!
+POPUP_AWESOME=storartat!
+POPUP_GREAT=riktigt bra!
+POPUP_GOOD=bra!
+POPUP_NOTBAD=godkänt!
+POPUP_BAD=dåligt!
+POPUP_POOR=usel!
+POPUP_AWFUL=avskyvärt!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= och
+
+SONG_MENU_NAME_MAIN=låtmeny
+SONG_MENU_PLAY=Sjung
+SONG_MENU_CHANGEPLAYERS=Ändra spelare
+SONG_MENU_EDIT=Redigera
+SONG_MENU_MODI=Sjung en mod
+SONG_MENU_CANCEL=Ångra
+
+SONG_MENU_NAME_PLAYLIST=Låtmeny
+SONG_MENU_PLAYLIST_ADD=Lägg till en låt
+SONG_MENU_PLAYLIST_DEL=Ta bort en låt
+
+SONG_MENU_NAME_PLAYLIST_ADD=Lägg till en låt
+SONG_MENU_PLAYLIST_ADD_NEW=till en ny spellista
+SONG_MENU_PLAYLIST_ADD_EXISTING=till en existerande spellista
+SONG_MENU_PLAYLIST_NOEXISTING=Ingen spellista tillgänglig
+
+SONG_MENU_NAME_PLAYLIST_NEW=Ny spellist
+SONG_MENU_PLAYLIST_NEW_CREATE=Skapa
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Namnlös
+
+SONG_MENU_NAME_PLAYLIST_DEL=Vill du verkligen ta bort?
+SONG_MENU_YES=Ja
+SONG_MENU_NO=Nej
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Öppna spellista
+SONG_MENU_PLAYLIST_LOAD=öppna
+SONG_MENU_PLAYLIST_DELCURRENT=ta bort nuvarande spellista
+
+SONG_MENU_NAME_PLAYLIST_DEL=Ta bort spellista?
+
+SONG_MENU_NAME_PARTY_MAIN=Partymeny
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=ta joker
+
+SONG_JUMPTO_DESC=sök låt
+SONG_JUMPTO_TYPE_DESC=Sök efter:
+SONG_JUMPTO_TYPE1=Alla
+SONG_JUMPTO_TYPE2=Titel
+SONG_JUMPTO_TYPE3=Artist
+SONG_JUMPTO_SONGSFOUND=%d Låt(ar) hittade
+SONG_JUMPTO_NOSONGSFOUND=Inga låtar hittade
+SONG_JUMPTO_HELP=Skriv text för att söka
+SONG_JUMPTO_CATTEXT=Sök efter: %s
+
+PARTY_MODE=partyläge
+PARTY_DIFFICULTY=Svårighestagrad
+PARTY_PLAYLIST=Spellistsläge
+PARTY_PLAYLIST_ALL=Alla låtar
+PARTY_PLAYLIST_CATEGORY=Mapp
+PARTY_PLAYLIST_PLAYLIST=Spellista
+PARTY_ROUNDS=Omgångar
+PARTY_TEAMS=Lag
+PARTY_TEAMS_PLAYER1=Spelare Lag1
+PARTY_TEAMS_PLAYER2=Spelare Lag2
+PARTY_TEAMS_PLAYER3=Spelare Lag3
+
+PARTY_LEGEND_CONTINUE=fortsätt
+
+PARTY_OPTIONS_DESC=inställningar för partyspel
+PARTY_OPTIONS_WHEREAMI=Partyinställningar
+
+PARTY_PLAYER_DESC=skriv spelar- och lagnamn
+PARTY_PLAYER_WHEREAMI=Partynamn
+PARTY_PLAYER_ENTER_NAME=skriv namn
+PARTY_PLAYER_LEGEND_CONTINUE=starta partyspel
+
+PARTY_ROUND_DESC=nästa spelare till mikrofonerna
+PARTY_ROUND_WHEREAMI=Party Nästa omgång
+PARTY_ROUND_LEGEND_CONTINUE=starta omgång
+
+PARTY_SONG_WHEREAMI=Party Låtval
+PARTY_SONG_LEGEND_CONTINUE=sjung
+PARTY_SONG_MENU=partymeny
+
+PARTY_SCORE_DESC=poäng från senaste omgången
+PARTY_SCORE_WHEREAMI=Partypoäng
+
+PARTY_WIN_DESC=vinnare av partyspelet
+PARTY_WIN_WHEREAMI=Partyvinnare
+PARTY_WIN_LEGEND_CONTINUE=tillbaka till huvudmenyn
+
+PARTY_ROUND=Omgång
+PARTY_ROUND_WINNER=Vinnare
+PARTY_NOTPLAYEDYET=inte spelad än
+PARTY_NOBODY=ingen
+NEXT_ROUND=Nästa omgång:
+
+PARTY_DISMISSED=Avbröt!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=vann!
+
+PLUGIN_HDL_NAME=Håll stånd
+PLUGIN_HDL_DESC=Bli inte sämre än vad omdömesmätaren visar
+
+PLUGIN_UNTIL5000_NAME=Tills 5000
+PLUGIN_UNTIL5000_DESC=Den som först får 5000 poäng vinner matchen
+
+PLUGIN_DUELL_NAME=Duell
+PLUGIN_DUELL_DESC=Sjung en duell tills 10000 poäng
+
+PLUGIN_BLIND_NAME=Blindläge
+PLUGIN_BLIND_DESC=Duell utan att se noterna.
+
+STAT_MAIN=Statistik
+STAT_MAIN_DESC=Allmän
+STAT_MAIN_WHEREAMI=Statistik
+
+STAT_OVERVIEW_INTRO=%0:s Statistik. \n Senast återställd %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Låtar (%3:d med Video), varav %1:d redan har spelats och %2:d inte har spelats än.\n Den mest populära Låten är %5:s av %4:s.
+STAT_OVERVIEW_PLAYER=Sedan den senaste återställningen har %0:d olika spelare sjungit.\n Den bästa spelaren är %1:s med ett genomsnitt på %2:d poäng.\n %3:s har sjungit bäst med %4:d poäng.
+
+STAT_DETAIL=Statistik
+STAT_DETAIL_WHEREAMI=Detaljerad statistik
+
+STAT_NEXT=Nästa sida
+STAT_PREV=Föregående sida
+STAT_REVERSE=Omvänd ordning
+STAT_PAGE=Sida %0:d av %1:d Sidor\n (%2:d av %3:d Poster)
+
+STAT_DESC_SCORES=Högst resultat
+STAT_DESC_SCORES_REVERSED=Lägsta resultaten
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Bästa Låtarna
+STAT_DESC_SINGERS_REVERSED=Sämsta Låtarna
+STAT_FORMAT_SINGERS=%0:s \n Genomsnittlig poäng: %1:d
+
+STAT_DESC_SONGS=Populäraste Låtarna
+STAT_DESC_SONGS_REVERSED=Minst populära Låtarna
+STAT_FORMAT_SONGS=%0:s - %1:s \n Sjungen %2:d gånger
+
+STAT_DESC_BANDS=Populäraste Artisterna
+STAT_DESC_BANDS_REVERSED=Minst populära arrtisterna
+STAT_FORMAT_BANDS=%0:s \n %1:dx sjungna
+
+MSG_ERROR_TITLE=Error
+MSG_QUESTION_TITLE=Fråga
+MSG_QUIT_USDX=Vill du verkligen avsluta UltraStar?
+MSG_END_PARTY=Vill du verkligen avsluta party-läge?
+ERROR_NO_SONGS=Inga Låtar laddade
+ERROR_NO_PLUGINS=No Plugins loaded
+ERROR_CORRUPT_SONG=Song could not be loaded. \ No newline at end of file
diff --git a/Game/Output/Languages/readme.txt b/Game/Output/Languages/readme.txt
new file mode 100644
index 00000000..220001de
--- /dev/null
+++ b/Game/Output/Languages/readme.txt
@@ -0,0 +1,288 @@
+.o0 Ultrastar Deluxe in your Language 0o.
+
+-----------------------
+ Table of Contents
+-----------------------
+1. Introduction
+2. Statistic Wild-Cards
+3. Texts to Add
+
+
+
+-----------------------
+1. Introduction:
+-----------------------
+To translate USD to a new language, take the English Language File, or another one that is up to date and Edit the Texts behind the Equal Mark(=).
+
+-----------------------
+2. Statistic Wild-Cards:
+-----------------------
+Here are some Information about the Wild-Cars in the Language Texts for the Statistic Screens (STAT_...):
+Information that will replace the Wild-Cards:
+
+STAT_OVERVIEW_INTRO:
+ Format:
+ %0:d Ultrastar Version
+ %1:d Day of Reset (A1)
+ %2:d Month of Reset (A2)
+ %3:d Year of Reset (A3)
+
+STAT_OVERVIEW_SONG:
+ Format:
+ %0:d Count Songs (A1)
+ %1:d Count of Sung Songs (A2)
+ %2:d Count of UnSung Songs
+ %3:d Count of Songs with Video (A3)
+ %4:s Name of the most popular Song
+
+STAT_OVERVIEW_PLAYER:
+ Format:
+ %0:d Count Players (A1)
+ %1:s Best Player (Result)
+ %2:d Best Players Score
+ %3:s Best Score Player (Result2)
+ %4:d Best Score
+
+STAT_FORMAT_SCORES:
+ Format:
+ %0:s Singer
+ %1:d Score
+ %2:s Difficulty
+ %3:s Song Artist
+ %4:s Song Title
+
+STAT_FORMAT_SINGERS:
+ Format:
+ %0:s Singer
+ %1:d Average Score
+
+
+STAT_FORMAT_SONGS:
+ Format:
+ %0:s Artist
+ %1:s Title
+ %2:d Times Sung
+
+STAT_FORMAT_BANDS:
+ Format:
+ %0:s Artist Name
+ %1:d Times Sung
+
+Some further Explantation about the Wild-Cards:
+%x:[.y]z
+
+Where X is the Number of the Wildcard,
+Y is optional, it is the number of digits for Decimal Numbers (Z=d). So if y is 2 there and the number is only 0 to 9 there will be a Zero added in front of the number.
+z can be d for Numbers and s for texts
+
+For the date thing in STAT_OVERVIEW_INTRO you may use %1:.2d for the day and %2:.2d for the Month.
+
+-----------------------
+3. Texts to Add:
+-----------------------
+To port a LanguageFile from Ultrastar 0.5.2 or Higher add the following Texts to the end of the file:
+
+#Main Screen
+SING_MENU=Main Menu
+
+SING_MULTI=party
+SING_MULTI_DESC=Sing in PartyMode
+
+SING_TOOLS=Tools
+
+SING_STATS=stats
+SING_STATS_DESC=View the Statistics
+
+#Sound Options Screen
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Preview Volume
+SING_OPTIONS_SOUND_PREVIEWFADING=Preview Fading
+
+#Advanced Options Screen
+SING_OPTIONS_ADVANCED=advanced
+SING_OPTIONS_ADVANCED_DESC=advanced options
+SING_OPTIONS_ADVANCED_EFFECTSING=Singscreen effects
+SING_OPTIONS_ADVANCED_SCREENFADE=Screen Fading
+SING_OPTIONS_ADVANCED_LOADANIMATION=Load Animation
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Savety Questions
+SING_OPTIONS_ADVANCED_LINEBONUS=Line Bonus
+SING_OPTIONS_ADVANCED_ONSONGCLICK=after SongSelection
+
+#Ratings at the Score Screen
+SING_SCORE_TONE_DEAF=Tone Deaf
+SING_SCORE_AMATEUR=Amateur
+SING_SCORE_RISING_STAR=Rising Star
+SING_SCORE_LEAD_SINGER=Lead Singer
+SING_SCORE_HIT_ARTIST=Hit Artist
+SING_SCORE_SUPERSTAR=Superstar
+SING_SCORE_ULTRASTAR=Ultrastar
+
+#Line Bonus PopUps
+POPUP_PERFECT=perfect!
+POPUP_AWESOME=awesome!
+POPUP_GREAT=great!
+POPUP_GOOD=good!
+POPUP_NOTBAD=not bad!
+POPUP_BAD=bad!
+POPUP_POOR=poor!
+POPUP_AWFUL=awful!
+
+#To connect Strigns with, e.g.: He, you and I
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= and
+
+#Song Screen Legend
+PLAYLIST_CATTEXT=Playlist: %s
+
+#Text for the Legend Bar at the bottom
+SING_LEGEND_CONTINUE=Continue
+
+#Texts of the Menu that appears when M is Pressed at the SongSelection
+SONG_MENU_NAME_MAIN=Song Menu
+SONG_MENU_PLAY=Sing
+SONG_MENU_EDIT=Edit
+SONG_MENU_MODI=Sing a Modi
+SONG_MENU_CHANGEPLAYERS=Change Players
+SONG_MENU_CANCEL=Cancel
+
+#Playlist Menu
+SONG_MENU_NAME_MAIN=song menu
+SONG_MENU_PLAY=Sing
+SONG_MENU_CHANGEPLAYERS=Change Players
+SONG_MENU_EDIT=Edit
+SONG_MENU_MODI=Sing a Modi
+SONG_MENU_CANCEL=Cancel
+
+SONG_MENU_NAME_PLAYLIST=Song Menu
+SONG_MENU_PLAYLIST_ADD=Add Song
+SONG_MENU_PLAYLIST_DEL=Delete Song
+
+SONG_MENU_NAME_PLAYLIST_ADD=Add Song
+SONG_MENU_PLAYLIST_ADD_NEW=to new playlist
+SONG_MENU_PLAYLIST_ADD_EXISTING=to exiting playlist
+SONG_MENU_PLAYLIST_NOEXISTING=No playlist available
+
+SONG_MENU_NAME_PLAYLIST_NEW=New Playlist
+SONG_MENU_PLAYLIST_NEW_CREATE=Create
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Unnamed
+
+SONG_MENU_NAME_PLAYLIST_DEL=Really Delete?
+SONG_MENU_YES=Yes
+SONG_MENU_NO=No
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Open Playlist
+SONG_MENU_PLAYLIST_LOAD=open
+SONG_MENU_PLAYLIST_DELCURRENT=delete current Playlist
+
+SONG_MENU_NAME_PLAYLIST_DEL=Delete Playlist?
+
+#Menu Party Modus
+SONG_MENU_NAME_PARTY_MAIN=Menu
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=take Joker
+
+#Texts of the jumpto Window
+SONG_JUMPTO_DESC=Jump to Song
+SONG_JUMPTO_TYPE_DESC=Search for:
+SONG_JUMPTO_TYPE1=All
+SONG_JUMPTO_TYPE2=Title
+SONG_JUMPTO_TYPE3=Artist
+SONG_JUMPTO_SONGSFOUND=%d Song(s) found
+SONG_JUMPTO_NOSONGSFOUND=No Song found
+SONG_JUMPTO_HELP=Type Text to Search for
+SONG_JUMPTO_CATTEXT=Search for: %s
+
+#Texts for Party Mode
+PARTY_MODE=party mode
+PARTY_DIFFICULTY=Difficulty
+PARTY_PLAYLIST=Playlist Mode
+PARTY_PLAYLIST_ALL=All songs
+PARTY_PLAYLIST_CATEGORY=Folder
+PARTY_PLAYLIST_PLAYLIST=Playlist
+PARTY_ROUNDS=Rounds
+PARTY_TEAMS=Teams
+PARTY_TEAMS_PLAYER1=Player Team1
+PARTY_TEAMS_PLAYER2=Player Team2
+PARTY_TEAMS_PLAYER3=Player Team3
+PARTY_LEGEND_CONTINUE=continue
+PARTY_OPTIONS_DESC=settings for the party-game
+PARTY_OPTIONS_WHEREAMI=Party Options
+PARTY_PLAYER_DESC=enter player- and teamnames!
+PARTY_PLAYER_WHEREAMI=Party Names
+PARTY_PLAYER_ENTER_NAME=enter names
+PARTY_PLAYER_LEGEND_CONTINUE=start party-game
+PARTY_SONG_WHEREAMI=Party Song-Selection
+PARTY_SONG_LEGEND_CONTINUE=sing
+PARTY_SONG_MENU=party menu
+PARTY_ROUND_DESC=next players to the mics
+PARTY_ROUND_WHEREAMI=Party Next Round
+PARTY_ROUND_LEGEND_CONTINUE=start round
+PARTY_SCORE_DESC=score of the last round
+PARTY_SCORE_WHEREAMI=Party Points
+PARTY_WIN_DESC=winner of the party-game
+PARTY_WIN_WHEREAMI=Party Winner
+PARTY_WIN_LEGEND_CONTINUE=back to main-menu
+PARTY_ROUND=Round
+PARTY_ROUND_WINNER=Winner
+PARTY_NOTPLAYEDYET=not played yet
+PARTY_NOBODY=nobody
+NEXT_ROUND=Next round:
+PARTY_DISMISSED=Dismissed!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=wins!
+PARTY_SONG_WHEREAMI=Party Song-Selection
+PARTY_SONG_LEGEND_CONTINUE=Party-Menu
+
+#Texts that descripts Plugins or Modis
+PLUGIN_HDL_NAME=Hold the Line
+PLUGIN_HDL_DESC=Don't get worse than the pointer at the rating bar shows you.
+PLUGIN_UNTIL5000_NAME=Until 5000
+PLUGIN_UNTIL5000_DESC=Who gets 5000 points first wins the match.
+PLUGIN_DUELL_NAME=Duell
+PLUGIN_DUELL_DESC=Sing a duell until 10000 points.
+PLUGIN_BLIND_NAME=Blind Mode
+PLUGIN_BLIND_DESC=Duell without seeing the notes.
+PLUGIN_TEAMDUELL_NAME=Team Duell
+PLUGIN_TEAMDUELL_DESC=Pass The Mic!
+
+#Statistics Screen
+#For more Info about the Format Strings look at the SorceCode (UScreenStatMain)
+STAT_MAIN=Statistics
+STAT_MAIN_DESC=General
+STAT_MAIN_WHEREAMI=Statistics
+
+STAT_OVERVIEW_INTRO=%0:s Statistics. \n Last Reset at %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Songs(%3:d with Video), whereof %1:d already were played and %2:d were not played yet.\n The most popular Song is %5:s from %4:s.
+STAT_OVERVIEW_PLAYER=Since the last Reset there were/was %0:d different Player(s).\n The Best Player is %1:s with an average Score of %2:d Points.\n %3:s did the highest Score with %4:d Points.
+
+#Stat Detail Screen
+STAT_DETAIL=Statistics
+STAT_DETAIL_WHEREAMI=Detail Statistics
+
+STAT_NEXT=Next Page
+STAT_PREV=Previous Page
+STAT_REVERSE=Reverse Order
+STAT_PAGE=Seite %0:d of %1:d Pages\n (%2:d of %3:d Entrys)
+
+STAT_DESC_SCORES=HighScores
+STAT_DESC_SCORES_REVERSED=LowScores
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Best Singers
+STAT_DESC_SINGERS_REVERSED=Worst Singers
+STAT_FORMAT_SINGERS=%0:s \n Average Score: %1:d
+
+STAT_DESC_SONGS=Most popular Songs
+STAT_DESC_SONGS_REVERSED=Least popular Songs
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx sung
+
+STAT_DESC_BANDS=Most popular Bands
+STAT_DESC_BANDS_REVERSED=Least popular Bands
+STAT_FORMAT_BANDS=%0:s \n %1:dx Sung
+
+#Messages for Popup Message Boxes
+MSG_QUESTION_TITLE=Chicken Out
+MSG_QUIT_USDX=Really leave\n\nUltraStar?
+MSG_END_PARTY=Really end\n\nParty Mode?
+ERROR_NO_SONGS=Error: \n No Songs \n loaded
+ERROR_NO_PLUGINS=Error: \n No Plugins \n loaded \ No newline at end of file
diff --git a/Game/Output/License.txt b/Game/Output/License.txt
new file mode 100644
index 00000000..4964fc70
--- /dev/null
+++ b/Game/Output/License.txt
@@ -0,0 +1,125 @@
+The GNU General Public License (GPL)
+Version 2, June 1991
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
+
+a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
+
+b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
+
+c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
+
+3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
+
+a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+
+b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+
+c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
+
+one line to give the program's name and a brief idea of what it does.
+Copyright (C)
+
+This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
+
+Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
+
+Yoyodyne, Inc., hereby disclaims all copyright interest
+in the program `Gnomovision' (which makes passes at compilers)
+written by James Hacker.
+
+signature of Ty Coon, 1 April 1989
+Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
diff --git a/Game/Output/Plugins/Blind.dll b/Game/Output/Plugins/Blind.dll
new file mode 100644
index 00000000..593ffed9
--- /dev/null
+++ b/Game/Output/Plugins/Blind.dll
Binary files differ
diff --git a/Game/Output/Plugins/Duell.dll b/Game/Output/Plugins/Duell.dll
new file mode 100644
index 00000000..85b0f342
--- /dev/null
+++ b/Game/Output/Plugins/Duell.dll
Binary files differ
diff --git a/Game/Output/Plugins/HauDenLukas.dll b/Game/Output/Plugins/HauDenLukas.dll
new file mode 100644
index 00000000..6ed119a4
--- /dev/null
+++ b/Game/Output/Plugins/HauDenLukas.dll
Binary files differ
diff --git a/Game/Output/Plugins/Hold_The_Line.dll b/Game/Output/Plugins/Hold_The_Line.dll
new file mode 100644
index 00000000..dceb3959
--- /dev/null
+++ b/Game/Output/Plugins/Hold_The_Line.dll
Binary files differ
diff --git a/Game/Output/Plugins/IDontSeeMyScore.dll b/Game/Output/Plugins/IDontSeeMyScore.dll
new file mode 100644
index 00000000..f480d913
--- /dev/null
+++ b/Game/Output/Plugins/IDontSeeMyScore.dll
Binary files differ
diff --git a/Game/Output/Plugins/More1000.dll b/Game/Output/Plugins/More1000.dll
new file mode 100644
index 00000000..863cdedc
--- /dev/null
+++ b/Game/Output/Plugins/More1000.dll
Binary files differ
diff --git a/Game/Output/Plugins/More500.dll b/Game/Output/Plugins/More500.dll
new file mode 100644
index 00000000..6359a160
--- /dev/null
+++ b/Game/Output/Plugins/More500.dll
Binary files differ
diff --git a/Game/Output/Plugins/TeamDuell.dll b/Game/Output/Plugins/TeamDuell.dll
new file mode 100644
index 00000000..8bf1d0a8
--- /dev/null
+++ b/Game/Output/Plugins/TeamDuell.dll
Binary files differ
diff --git a/Game/Output/Plugins/Until5000.dll b/Game/Output/Plugins/Until5000.dll
new file mode 100644
index 00000000..2fb959b7
--- /dev/null
+++ b/Game/Output/Plugins/Until5000.dll
Binary files differ
diff --git a/Game/Output/Plugins/Until5000Blind.dll b/Game/Output/Plugins/Until5000Blind.dll
new file mode 100644
index 00000000..9029ec3d
--- /dev/null
+++ b/Game/Output/Plugins/Until5000Blind.dll
Binary files differ
diff --git a/Game/Output/Plugins/Until5000BlindScore.dll b/Game/Output/Plugins/Until5000BlindScore.dll
new file mode 100644
index 00000000..efc7873c
--- /dev/null
+++ b/Game/Output/Plugins/Until5000BlindScore.dll
Binary files differ
diff --git a/Game/Output/ReadMe.txt b/Game/Output/ReadMe.txt
new file mode 100644
index 00000000..dcb9f3bc
--- /dev/null
+++ b/Game/Output/ReadMe.txt
@@ -0,0 +1,112 @@
+Ultrastar Deluxe 1.0.1a Readme.txt
+----------------------------
+1. Authors
+2. Release Notes
+3. Command-Line Parameters
+4. Controls
+5. License
+----------------------------
+
+SF.Net Page: http://sourceforge.net/projects/ultrastardx/
+
+This is just a little introduction, for more information open documentation.pdf
+
+----------------------------
+1. Authors
+----------------------------
+This game was introduced by Corvus5 who has written most of the code by himself.
+Basing on the official release 0.5.0 Mota and Whiteshark started to write little patches and modifications, and released this package named ultra-star.dl.am Mod.
+This modification was continued at Sourceforge.net by the Ultrastar Deluxe Team:
+ Blindy
+ Mog
+ Mota
+ Sawyer
+ Whiteshark
+And this piece of software is the Result!
+
+
+----------------------------
+2. Release Notes
+----------------------------
+- To change the path to the song directory add to config.ini:
+ [Path]
+ Songs=[SongFolder] (e.g. C:\Program Files\Ultrastar\Songs)
+
+- To take a screenshot press "PrintScreen" Key
+ Screenshots are saved in the directory "Screenshots".
+
+- To enable joypad support change config.ini:
+
+ [Controller]
+ Joypad=Off
+
+ to
+
+ [Controller]
+ Joypad=On
+
+
+- To Enable 4 to 6 Playermode 2 Screens are needed.
+ Disable the fullscreen mode, extend your desktop horizontaly, set the resolution to fill one
+ screen.
+ Add to Config.ini:
+ [Graphics]
+ Screens=2
+
+- Press Alt + F[1..12] in NameScreen to Save a Playername
+ Press F[1..12] to Load a Playername
+
+- To enable benchmark run the game with -benchmark parameter
+
+
+----------------------------
+3. Command-Line Parameters
+----------------------------
+Command-Line Parameters are passed to the game adding it to the Path of a Shortcut or starting the game within the console.
+
+The following parameters are possible. They can be joined in any possible way.
+
+-Benchmark : Create a benchmark.log file with start timings.
+-NoLog : Do not create any .log files
+-Joypad : Start with Joypad support
+-Language [ID] : Load Language [ID] on startup. Example: -Language german
+
+-Songpath [Path] : Some as config Songpath. Example: -SongPath "C:\Ultrastar Songs"
+-ConfigFile [File] : Load Configfile [File] instead of config.ini. Path to the file have to exist. Example: -ConfigFile config.SongCreation.ini
+-ScoreFile [File] : Use [File] instead of Ultrastar.db. Path to the file have to exist. Example: -ScoreFile HouseParty.db
+
+-FullScreen : Start the game in Fullscreen Mode
+-Depth [16/32] : Force Depth 16 or 32. Example: -Depth 16
+-Resolution [ID] : Force resolution. Example: -Resolution 800x600
+-Screens [1/2] : Force 1 or 2 Screen Mode. Example: -Screens 2
+
+Some Examples:
+
+Start with Resolution 1024x768 32 Bit Depth and Fullscreen:
+ultrastar.exe -Resolution 1024x768 -Depth 32 -Fullscreen
+
+Start without logging and polish Language
+ultrastar.exe -NoLog -Language polish
+
+Start with custom config File and Score DB:
+ultrastar.exe -ConfigFile C:\Ultrastar\Configs\PartyConfig.ini -ScoreFile C:\Ultrastar\Scores\PartyScores.db
+
+
+----------------------------
+4. Controls
+----------------------------
+Use the Arrowkeys to navigate through the Screens.
+Use Enter to select and Escape to go to the previous screen.
+In Songscreen you can use R, Shift + R or Strg + R to select a random song/category
+Use Alt + [Letter] to jump to a songs artist with the first letter [Letter]
+Use Alt + Shift + [Letter] to jump to a song title with the first letter [Letter]
+Press J to open the "Search for a Song" Interface
+
+Editor Controls are described in documentation.pdf
+
+
+----------------------------
+5. License
+----------------------------
+Ultrastar Deluxe is licensed under the terms of the GNU General Public License 2.0
+See License.txt for more Information. \ No newline at end of file
diff --git a/Game/Output/SDL.dll b/Game/Output/SDL.dll
new file mode 100644
index 00000000..a5da7bbd
--- /dev/null
+++ b/Game/Output/SDL.dll
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/Blue.ini b/Game/Output/Skins/Deluxe/Blue.ini
new file mode 100644
index 00000000..a1ee31bc
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/Blue.ini
@@ -0,0 +1,157 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=Deluxe
+Name=Blue
+Color=Blue
+
+[Textures]
+
+
+# # # M A I N # # #
+Button = [main]button.jpg
+ButtonF = [main]buttonf.jpg
+MainBar = [main]mainBar.jpg
+SelectBG = [main]selectbg.jpg
+
+#Backgrounds
+LoadingBG = [bg-load]blue.jpg
+MainBG = [bg-main]blue.jpg
+SongBG = [bg-main]blue.jpg
+ScoreScreenBG = [bg-main]blue.jpg
+TopBG = [bg-main]blue.jpg
+OptionsBG = [bg-main]blue.jpg
+PartyBG = [bg-main]blue.jpg
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu = [icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon = [icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon = [icon]video.jpg
+CalcMedleyIcon = [icon]calcmedley.jpg
+MedleyIcon = [icon]medley.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+
+# # # S O N G S E L E C E T # # #
+SongSelection1 = [main]songSelection1.jpg
+SongSelection2 = [main]songSelection2.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar (not skinned in this theme :P )
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =x_[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =x_[party]winDecoration1.jpg
+PartyWinDeco2 =x_[party]winDecoration1.jpg
+PartyWinDeco3 =x_[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+Leiste1 = [special]bar1.jpg
+Leiste2 = [special]bar2.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg
+ButtonFade = [helper]buttonFade.jpg \ No newline at end of file
diff --git a/Game/Output/Skins/Deluxe/Fall.ini b/Game/Output/Skins/Deluxe/Fall.ini
new file mode 100644
index 00000000..c63aacb6
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/Fall.ini
@@ -0,0 +1,157 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=Deluxe
+Name=Fall
+Color=Orange
+
+[Textures]
+
+
+# # # M A I N # # #
+Button = [main]button.jpg
+ButtonF = [main]buttonf.jpg
+MainBar = [main]mainBar.jpg
+SelectBG = [main]selectbg.jpg
+
+#Backgrounds
+LoadingBG = [bg-load]fall.jpg
+MainBG = [bg-main]fall.jpg
+SongBG = [bg-main]fall.jpg
+ScoreScreenBG = [bg-main]fall.jpg
+TopBG = [bg-main]fall.jpg
+OptionsBG = [bg-main]fall.jpg
+PartyBG = [bg-main]fall.jpg
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu = [icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon = [icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon = [icon]video.jpg
+CalcMedleyIcon = [icon]calcmedley.jpg
+MedleyIcon = [icon]medley.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+
+# # # S O N G S E L E C E T # # #
+SongSelection1 = [main]songSelection1.jpg
+SongSelection2 = [main]songSelection2.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar (not skinned in this theme :P )
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =x_[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =x_[party]winDecoration1.jpg
+PartyWinDeco2 =x_[party]winDecoration1.jpg
+PartyWinDeco3 =x_[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+Leiste1 = [special]bar1_brown.jpg
+Leiste2 = [special]bar2.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg
+ButtonFade = [helper]buttonFade.jpg \ No newline at end of file
diff --git a/Game/Output/Skins/Deluxe/Summer.ini b/Game/Output/Skins/Deluxe/Summer.ini
new file mode 100644
index 00000000..b9bd3dc8
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/Summer.ini
@@ -0,0 +1,157 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=Deluxe
+Name=Summer
+Color=Blue
+
+[Textures]
+
+
+# # # M A I N # # #
+Button = [main]button.jpg
+ButtonF = [main]buttonf.jpg
+MainBar = [main]mainBar.jpg
+SelectBG = [main]selectbg.jpg
+
+#Backgrounds
+LoadingBG = [bg-load]summer.jpg
+MainBG = [bg-main]summer.jpg
+SongBG = [bg-main]summer.jpg
+ScoreScreenBG = [bg-main]summer.jpg
+TopBG = [bg-main]summer.jpg
+OptionsBG = [bg-main]summer.jpg
+PartyBG = [bg-main]summer.jpg
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu = [icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon = [icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon = [icon]video.jpg
+CalcMedleyIcon = [icon]calcmedley.jpg
+MedleyIcon = [icon]medley.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+
+# # # S O N G S E L E C E T # # #
+SongSelection1 = [main]songSelection1.jpg
+SongSelection2 = [main]songSelection2.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar (not skinned in this theme :P )
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =x_[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =x_[party]winDecoration1.jpg
+PartyWinDeco2 =x_[party]winDecoration1.jpg
+PartyWinDeco3 =x_[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+Leiste1 = [special]bar1_pink.jpg
+Leiste2 = [special]bar2.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg
+ButtonFade = [helper]buttonFade.jpg \ No newline at end of file
diff --git a/Game/Output/Skins/Deluxe/Thumbs.db b/Game/Output/Skins/Deluxe/Thumbs.db
new file mode 100644
index 00000000..c2fa3128
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/Thumbs.db
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/Winter.ini b/Game/Output/Skins/Deluxe/Winter.ini
new file mode 100644
index 00000000..79b31ffb
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/Winter.ini
@@ -0,0 +1,156 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=Deluxe
+Name=Winter
+Color=Blue
+
+[Textures]
+
+
+# # # M A I N # # #
+Button = [main]button.jpg
+ButtonF = [main]buttonf.jpg
+MainBar = [main]mainBar.jpg
+SelectBG = [main]selectbg.jpg
+
+#Backgrounds
+LoadingBG = [bg-load]winter.jpg
+MainBG = [bg-main]winter.jpg
+SongBG = [bg-main]winter.jpg
+ScoreScreenBG = [bg-main]winter.jpg
+TopBG = [bg-main]winter.jpg
+OptionsBG = [bg-main]winter.jpg
+PartyBG = [bg-main]winter.jpg
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu = [icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon = [icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon = [icon]video.jpg
+CalcMedleyIcon = [icon]calcmedley.jpg
+MedleyIcon = [icon]medley.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+
+# # # S O N G S E L E C E T # # #
+SongSelection1 = [main]songSelection1.jpg
+SongSelection2 = [main]songSelection2.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar (not skinned in this theme :P )
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =x_[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =x_[party]winDecoration1.jpg
+PartyWinDeco2 =x_[party]winDecoration1.jpg
+PartyWinDeco3 =x_[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+Leiste1 = [special]bar1_blue.jpg
+Leiste2 = [special]bar2.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg
+ButtonFade = [helper]buttonFade.jpg \ No newline at end of file
diff --git a/Game/Output/Skins/Deluxe/[bg-load]blue.jpg b/Game/Output/Skins/Deluxe/[bg-load]blue.jpg
new file mode 100644
index 00000000..bea672c4
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[bg-load]blue.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[bg-load]fall.jpg b/Game/Output/Skins/Deluxe/[bg-load]fall.jpg
new file mode 100644
index 00000000..d205a4e4
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[bg-load]fall.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[bg-load]summer.jpg b/Game/Output/Skins/Deluxe/[bg-load]summer.jpg
new file mode 100644
index 00000000..af7fdaa7
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[bg-load]summer.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[bg-load]winter.jpg b/Game/Output/Skins/Deluxe/[bg-load]winter.jpg
new file mode 100644
index 00000000..826c22a7
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[bg-load]winter.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[bg-main]blue.jpg b/Game/Output/Skins/Deluxe/[bg-main]blue.jpg
new file mode 100644
index 00000000..67c4cbbe
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[bg-main]blue.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[bg-main]fall.jpg b/Game/Output/Skins/Deluxe/[bg-main]fall.jpg
new file mode 100644
index 00000000..e4736d99
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[bg-main]fall.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[bg-main]summer.jpg b/Game/Output/Skins/Deluxe/[bg-main]summer.jpg
new file mode 100644
index 00000000..9939dfcd
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[bg-main]summer.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[bg-main]winter.jpg b/Game/Output/Skins/Deluxe/[bg-main]winter.jpg
new file mode 100644
index 00000000..75cefa82
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[bg-main]winter.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[button]13.jpg b/Game/Output/Skins/Deluxe/[button]13.jpg
new file mode 100644
index 00000000..0d3188e4
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[button]13.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[button]alt.jpg b/Game/Output/Skins/Deluxe/[button]alt.jpg
new file mode 100644
index 00000000..99efd2ae
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[button]alt.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[button]az.jpg b/Game/Output/Skins/Deluxe/[button]az.jpg
new file mode 100644
index 00000000..4cbf3942
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[button]az.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[button]enter.jpg b/Game/Output/Skins/Deluxe/[button]enter.jpg
new file mode 100644
index 00000000..dff7b785
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[button]enter.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[button]esc.jpg b/Game/Output/Skins/Deluxe/[button]esc.jpg
new file mode 100644
index 00000000..21b595d4
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[button]esc.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[button]j.jpg b/Game/Output/Skins/Deluxe/[button]j.jpg
new file mode 100644
index 00000000..465e5972
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[button]j.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[button]m.jpg b/Game/Output/Skins/Deluxe/[button]m.jpg
new file mode 100644
index 00000000..8b657415
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[button]m.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[button]navi.jpg b/Game/Output/Skins/Deluxe/[button]navi.jpg
new file mode 100644
index 00000000..df8803cf
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[button]navi.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[button]p.jpg b/Game/Output/Skins/Deluxe/[button]p.jpg
new file mode 100644
index 00000000..da771ab3
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[button]p.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[effect]goldenNoteStar.jpg b/Game/Output/Skins/Deluxe/[effect]goldenNoteStar.jpg
new file mode 100644
index 00000000..1b31d267
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[effect]goldenNoteStar.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[effect]perfectNoteStar.jpg b/Game/Output/Skins/Deluxe/[effect]perfectNoteStar.jpg
new file mode 100644
index 00000000..189a22a3
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[effect]perfectNoteStar.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[helper]buttonFade.jpg b/Game/Output/Skins/Deluxe/[helper]buttonFade.jpg
new file mode 100644
index 00000000..6de293f7
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[helper]buttonFade.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[helper]rectangle.jpg b/Game/Output/Skins/Deluxe/[helper]rectangle.jpg
new file mode 100644
index 00000000..e03f98fc
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[helper]rectangle.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[icon]calcmedley.jpg b/Game/Output/Skins/Deluxe/[icon]calcmedley.jpg
new file mode 100644
index 00000000..5df92bef
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[icon]calcmedley.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[icon]cd.jpg b/Game/Output/Skins/Deluxe/[icon]cd.jpg
new file mode 100644
index 00000000..d48dc4ff
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[icon]cd.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[icon]error.jpg b/Game/Output/Skins/Deluxe/[icon]error.jpg
new file mode 100644
index 00000000..a5140f0e
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[icon]error.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[icon]main.jpg b/Game/Output/Skins/Deluxe/[icon]main.jpg
new file mode 100644
index 00000000..5941256a
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[icon]main.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[icon]medley.jpg b/Game/Output/Skins/Deluxe/[icon]medley.jpg
new file mode 100644
index 00000000..9f7c12cd
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[icon]medley.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[icon]options.jpg b/Game/Output/Skins/Deluxe/[icon]options.jpg
new file mode 100644
index 00000000..278f0adc
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[icon]options.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[icon]party.jpg b/Game/Output/Skins/Deluxe/[icon]party.jpg
new file mode 100644
index 00000000..2bccd403
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[icon]party.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[icon]question.jpg b/Game/Output/Skins/Deluxe/[icon]question.jpg
new file mode 100644
index 00000000..029172de
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[icon]question.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[icon]score.jpg b/Game/Output/Skins/Deluxe/[icon]score.jpg
new file mode 100644
index 00000000..6402fa9a
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[icon]score.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[icon]search.jpg b/Game/Output/Skins/Deluxe/[icon]search.jpg
new file mode 100644
index 00000000..b5870592
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[icon]search.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[icon]songmenu.jpg b/Game/Output/Skins/Deluxe/[icon]songmenu.jpg
new file mode 100644
index 00000000..35f4b440
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[icon]songmenu.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[icon]stats.jpg b/Game/Output/Skins/Deluxe/[icon]stats.jpg
new file mode 100644
index 00000000..505a6709
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[icon]stats.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[icon]video.jpg b/Game/Output/Skins/Deluxe/[icon]video.jpg
new file mode 100644
index 00000000..12d71add
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[icon]video.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[main]button.jpg b/Game/Output/Skins/Deluxe/[main]button.jpg
new file mode 100644
index 00000000..15a34c66
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[main]button.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[main]buttonf.jpg b/Game/Output/Skins/Deluxe/[main]buttonf.jpg
new file mode 100644
index 00000000..d844add5
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[main]buttonf.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[main]mainBar.jpg b/Game/Output/Skins/Deluxe/[main]mainBar.jpg
new file mode 100644
index 00000000..fa4cbd78
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[main]mainBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[main]playerNumberBox.jpg b/Game/Output/Skins/Deluxe/[main]playerNumberBox.jpg
new file mode 100644
index 00000000..53e7964c
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[main]playerNumberBox.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[main]selectbg.jpg b/Game/Output/Skins/Deluxe/[main]selectbg.jpg
new file mode 100644
index 00000000..98dcb671
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[main]selectbg.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[main]songCover.jpg b/Game/Output/Skins/Deluxe/[main]songCover.jpg
new file mode 100644
index 00000000..426bf22d
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[main]songCover.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[main]songSelection1.jpg b/Game/Output/Skins/Deluxe/[main]songSelection1.jpg
new file mode 100644
index 00000000..533510cb
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[main]songSelection1.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[main]songSelection2.jpg b/Game/Output/Skins/Deluxe/[main]songSelection2.jpg
new file mode 100644
index 00000000..cb3a3396
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[main]songSelection2.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[menu]PopUpBg.JPG b/Game/Output/Skins/Deluxe/[menu]PopUpBg.JPG
new file mode 100644
index 00000000..141d740a
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[menu]PopUpBg.JPG
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[menu]PopUpFg.JPG b/Game/Output/Skins/Deluxe/[menu]PopUpFg.JPG
new file mode 100644
index 00000000..9e9c6dea
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[menu]PopUpFg.JPG
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[menu]jumpToBg.jpg b/Game/Output/Skins/Deluxe/[menu]jumpToBg.jpg
new file mode 100644
index 00000000..a8b93e10
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[menu]jumpToBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[menu]songMenuBg.jpg b/Game/Output/Skins/Deluxe/[menu]songMenuBg.jpg
new file mode 100644
index 00000000..ef530ef5
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[menu]songMenuBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[menu]songMenuSelectBg.jpg b/Game/Output/Skins/Deluxe/[menu]songMenuSelectBg.jpg
new file mode 100644
index 00000000..79966f3b
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[menu]songMenuSelectBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[party]Joker.jpg b/Game/Output/Skins/Deluxe/[party]Joker.jpg
new file mode 100644
index 00000000..e2a18684
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[party]Joker.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[party]playerButton.jpg b/Game/Output/Skins/Deluxe/[party]playerButton.jpg
new file mode 100644
index 00000000..15a34c66
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[party]playerButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[party]playerTeamButton.jpg b/Game/Output/Skins/Deluxe/[party]playerTeamButton.jpg
new file mode 100644
index 00000000..2faf9c4b
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[party]playerTeamButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[party]pointer.bmp b/Game/Output/Skins/Deluxe/[party]pointer.bmp
new file mode 100644
index 00000000..88bbcc3d
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[party]pointer.bmp
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[party]roundBG1.jpg b/Game/Output/Skins/Deluxe/[party]roundBG1.jpg
new file mode 100644
index 00000000..464aabea
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[party]roundBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[party]roundBG2.jpg b/Game/Output/Skins/Deluxe/[party]roundBG2.jpg
new file mode 100644
index 00000000..3413958f
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[party]roundBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[party]roundBG3.jpg b/Game/Output/Skins/Deluxe/[party]roundBG3.jpg
new file mode 100644
index 00000000..c6b53caf
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[party]roundBG3.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[party]roundBG4.jpg b/Game/Output/Skins/Deluxe/[party]roundBG4.jpg
new file mode 100644
index 00000000..5e4da0ac
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[party]roundBG4.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[party]roundTeamButton.jpg b/Game/Output/Skins/Deluxe/[party]roundTeamButton.jpg
new file mode 100644
index 00000000..692db1bd
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[party]roundTeamButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[party]scoreBG1.jpg b/Game/Output/Skins/Deluxe/[party]scoreBG1.jpg
new file mode 100644
index 00000000..f558425d
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[party]scoreBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[party]scoreBG2.jpg b/Game/Output/Skins/Deluxe/[party]scoreBG2.jpg
new file mode 100644
index 00000000..47239d85
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[party]scoreBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[party]scoreDecoration.jpg b/Game/Output/Skins/Deluxe/[party]scoreDecoration.jpg
new file mode 100644
index 00000000..49204e19
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[party]scoreDecoration.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[party]teamPoints.jpg b/Game/Output/Skins/Deluxe/[party]teamPoints.jpg
new file mode 100644
index 00000000..96855bc9
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[party]teamPoints.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[party]winDecoration1.jpg b/Game/Output/Skins/Deluxe/[party]winDecoration1.jpg
new file mode 100644
index 00000000..0277f529
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[party]winDecoration1.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[party]winTeamButton1.jpg b/Game/Output/Skins/Deluxe/[party]winTeamButton1.jpg
new file mode 100644
index 00000000..10c8d80f
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[party]winTeamButton1.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[party]winTeamButton2.jpg b/Game/Output/Skins/Deluxe/[party]winTeamButton2.jpg
new file mode 100644
index 00000000..fbd85056
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[party]winTeamButton2.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[party]winTeamButton3.jpg b/Game/Output/Skins/Deluxe/[party]winTeamButton3.jpg
new file mode 100644
index 00000000..e8dd9566
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[party]winTeamButton3.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[score]Line.jpg b/Game/Output/Skins/Deluxe/[score]Line.jpg
new file mode 100644
index 00000000..61cf33f5
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[score]Line.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[score]box.jpg b/Game/Output/Skins/Deluxe/[score]box.jpg
new file mode 100644
index 00000000..b37f7e46
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[score]box.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[score]endcap.jpg b/Game/Output/Skins/Deluxe/[score]endcap.jpg
new file mode 100644
index 00000000..0cad98a5
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[score]endcap.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[score]level.jpg b/Game/Output/Skins/Deluxe/[score]level.jpg
new file mode 100644
index 00000000..9e9c4086
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[score]level.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[score]levelRound.jpg b/Game/Output/Skins/Deluxe/[score]levelRound.jpg
new file mode 100644
index 00000000..38cfddea
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[score]levelRound.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[sing]LyricsBall.bmp b/Game/Output/Skins/Deluxe/[sing]LyricsBall.bmp
new file mode 100644
index 00000000..5b7d7943
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[sing]LyricsBall.bmp
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[sing]lineBonusPopUp.jpg b/Game/Output/Skins/Deluxe/[sing]lineBonusPopUp.jpg
new file mode 100644
index 00000000..58d93130
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[sing]lineBonusPopUp.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[sing]lyricsHelpBar.bmp b/Game/Output/Skins/Deluxe/[sing]lyricsHelpBar.bmp
new file mode 100644
index 00000000..87a22b6b
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[sing]lyricsHelpBar.bmp
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[sing]notesBgLeft.bmp b/Game/Output/Skins/Deluxe/[sing]notesBgLeft.bmp
new file mode 100644
index 00000000..776e567c
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[sing]notesBgLeft.bmp
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[sing]notesBgMid.bmp b/Game/Output/Skins/Deluxe/[sing]notesBgMid.bmp
new file mode 100644
index 00000000..759ac8a3
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[sing]notesBgMid.bmp
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[sing]notesBgRight.bmp b/Game/Output/Skins/Deluxe/[sing]notesBgRight.bmp
new file mode 100644
index 00000000..9b1ffc18
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[sing]notesBgRight.bmp
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[sing]notesLeft.bmp b/Game/Output/Skins/Deluxe/[sing]notesLeft.bmp
new file mode 100644
index 00000000..c819849b
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[sing]notesLeft.bmp
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[sing]notesMid.bmp b/Game/Output/Skins/Deluxe/[sing]notesMid.bmp
new file mode 100644
index 00000000..2fdce32d
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[sing]notesMid.bmp
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[sing]notesRight.bmp b/Game/Output/Skins/Deluxe/[sing]notesRight.bmp
new file mode 100644
index 00000000..3241beeb
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[sing]notesRight.bmp
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[sing]p.jpg b/Game/Output/Skins/Deluxe/[sing]p.jpg
new file mode 100644
index 00000000..e490fbf4
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[sing]p.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[sing]scoreBg.jpg b/Game/Output/Skins/Deluxe/[sing]scoreBg.jpg
new file mode 100644
index 00000000..01d3ca75
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[sing]scoreBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[sing]singBarBack.jpg b/Game/Output/Skins/Deluxe/[sing]singBarBack.jpg
new file mode 100644
index 00000000..d7dcd791
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[sing]singBarBack.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[sing]singBarBar.jpg b/Game/Output/Skins/Deluxe/[sing]singBarBar.jpg
new file mode 100644
index 00000000..4fd9bde9
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[sing]singBarBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[sing]singBarFront.jpg b/Game/Output/Skins/Deluxe/[sing]singBarFront.jpg
new file mode 100644
index 00000000..eec27b79
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[sing]singBarFront.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[sing]textBar.jpg b/Game/Output/Skins/Deluxe/[sing]textBar.jpg
new file mode 100644
index 00000000..e2734bce
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[sing]textBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[sing]timeBar.jpg b/Game/Output/Skins/Deluxe/[sing]timeBar.jpg
new file mode 100644
index 00000000..e1cc3bf4
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[sing]timeBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[sing]timeBar1.jpg b/Game/Output/Skins/Deluxe/[sing]timeBar1.jpg
new file mode 100644
index 00000000..924a2e9b
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[sing]timeBar1.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[sing]timeBarBG.jpg b/Game/Output/Skins/Deluxe/[sing]timeBarBG.jpg
new file mode 100644
index 00000000..e33352d5
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[sing]timeBarBG.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[special]bar1.jpg b/Game/Output/Skins/Deluxe/[special]bar1.jpg
new file mode 100644
index 00000000..867969b4
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[special]bar1.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[special]bar2.jpg b/Game/Output/Skins/Deluxe/[special]bar2.jpg
new file mode 100644
index 00000000..53069868
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[special]bar2.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[stat]detailBG1.jpg b/Game/Output/Skins/Deluxe/[stat]detailBG1.jpg
new file mode 100644
index 00000000..120dc483
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[stat]detailBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[stat]mainBG1.jpg b/Game/Output/Skins/Deluxe/[stat]mainBG1.jpg
new file mode 100644
index 00000000..a937b24a
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[stat]mainBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[stat]mainBG2.jpg b/Game/Output/Skins/Deluxe/[stat]mainBG2.jpg
new file mode 100644
index 00000000..201d49b8
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[stat]mainBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/Deluxe/[stat]mainBG3.jpg b/Game/Output/Skins/Deluxe/[stat]mainBG3.jpg
new file mode 100644
index 00000000..4fb6bc06
--- /dev/null
+++ b/Game/Output/Skins/Deluxe/[stat]mainBG3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/Simple.ini b/Game/Output/Skins/TODOs/Blue Sensation/Simple.ini
new file mode 100644
index 00000000..e616edb1
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/Simple.ini
@@ -0,0 +1,173 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=Blue Sensation
+Name=Simple
+Color=Blue
+Author=Charis
+
+[Textures]
+
+
+# # # M A I N # # #
+Button =[main]button.jpg
+Buttonmenu1 =[main]buttonmenu1.jpg
+Buttonmenu2 =[main]buttonmenu2.jpg
+Buttonmenu3 =[main]buttonmenu3.jpg
+Buttonmenu4 =[main]buttonmenu4.jpg
+Buttonmenu5 =[main]buttonmenu5.jpg
+ButtonF = [main]buttonf.jpg
+MainBar = [main]mainBar.jpg
+SelectBG = [main]selectbg.jpg
+
+#Backgrounds
+LoadingBG =[bg-load]blue.jpg
+MenuBG = [bg-menu]blue.jpg
+MainBG =[bg-party]blue.jpg
+SingBG = [bg-main]blue.jpg
+SongBG =[bg-song]blue.jpg
+ScoreScreenBG =[bg-party]blue.jpg
+Top5BG =[bg-top5]blue.jpg
+OptionsBG =[bg-party]blue.jpg
+PartyBG =[bg-party]blue.jpg
+PartyBGWin =[bg-party]blue.jpg
+OptionsBG2 =[bg-option]blue.jpg
+StatisticsBG =[bg-party]blue.jpg
+PartyBGNext =[bg-party]blue.jpg
+PartyScoreBG =[bg-party]blue.jpg
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu = [icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon = [icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon =[icon]video.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+# # # S O N G S E L E C E T # # #
+SongSelection = [main]songSelection.jpg
+SongSelection1 = [main]songSelection1.jpg
+SongSelection2 =[main]songSelection2.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar =[sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar (not skinned in this theme :P )
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 =[sing]timeBar1.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine =[score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =x_[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =[party]winDecoration1.jpg
+PartyWinDeco2 =[party]winDecoration1.jpg
+PartyWinDeco3 =[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter =[button]enter.jpg
+ButtonNavi =[button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+Leiste1 =[special]bar1.jpg
+Leiste2 =[special]bar2.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg
+ButtonFade =[helper]buttonFade.jpg
+ButtonFadeMenu =[helper]buttonFade.jpg
+ButtonOptions=[option]button.jpg
+DiffBG=[bg-diff]blue.jpg
+NameBG=[bg-name]blue.jpg
+Buttonmenu=[main]buttonmenu.jpg
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/Thumbs.db b/Game/Output/Skins/TODOs/Blue Sensation/Thumbs.db
new file mode 100644
index 00000000..43e31175
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/Thumbs.db
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[bg-diff]blue.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[bg-diff]blue.jpg
new file mode 100644
index 00000000..ec830547
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[bg-diff]blue.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[bg-load]blue.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[bg-load]blue.jpg
new file mode 100644
index 00000000..33019709
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[bg-load]blue.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[bg-main]blue.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[bg-main]blue.jpg
new file mode 100644
index 00000000..0df4a489
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[bg-main]blue.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[bg-menu]blue.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[bg-menu]blue.jpg
new file mode 100644
index 00000000..72ca0518
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[bg-menu]blue.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[bg-name]blue.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[bg-name]blue.jpg
new file mode 100644
index 00000000..4ad26f6a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[bg-name]blue.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[bg-option]blue.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[bg-option]blue.jpg
new file mode 100644
index 00000000..cee3672a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[bg-option]blue.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[bg-party]blue.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[bg-party]blue.jpg
new file mode 100644
index 00000000..fe341c1e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[bg-party]blue.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[bg-song]blue.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[bg-song]blue.jpg
new file mode 100644
index 00000000..20e70059
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[bg-song]blue.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[bg-top5]blue.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[bg-top5]blue.jpg
new file mode 100644
index 00000000..3c731b9d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[bg-top5]blue.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[button]13.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[button]13.jpg
new file mode 100644
index 00000000..5787bb24
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[button]13.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[button]alt.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[button]alt.jpg
new file mode 100644
index 00000000..ec3e630f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[button]alt.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[button]az.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[button]az.jpg
new file mode 100644
index 00000000..b486604e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[button]az.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[button]enter.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[button]enter.jpg
new file mode 100644
index 00000000..16ee885a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[button]enter.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[button]esc.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[button]esc.jpg
new file mode 100644
index 00000000..7c40487a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[button]esc.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[button]j.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[button]j.jpg
new file mode 100644
index 00000000..b6eed56c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[button]j.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[button]m.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[button]m.jpg
new file mode 100644
index 00000000..ebb7156e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[button]m.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[button]navi.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[button]navi.jpg
new file mode 100644
index 00000000..41b44525
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[button]navi.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[button]p.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[button]p.jpg
new file mode 100644
index 00000000..d2d60c02
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[button]p.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[effect]goldenNoteStar.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[effect]goldenNoteStar.jpg
new file mode 100644
index 00000000..5ec8ba41
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[effect]goldenNoteStar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[effect]perfectNoteStar.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[effect]perfectNoteStar.jpg
new file mode 100644
index 00000000..189a22a3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[effect]perfectNoteStar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[helper]buttonFade.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[helper]buttonFade.jpg
new file mode 100644
index 00000000..c68da668
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[helper]buttonFade.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[helper]buttonFade2.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[helper]buttonFade2.jpg
new file mode 100644
index 00000000..6900f385
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[helper]buttonFade2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[helper]rectangle.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[helper]rectangle.jpg
new file mode 100644
index 00000000..cd636a12
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[helper]rectangle.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[icon]cd.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[icon]cd.jpg
new file mode 100644
index 00000000..387ca788
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[icon]cd.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[icon]error.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[icon]error.jpg
new file mode 100644
index 00000000..a5140f0e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[icon]error.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[icon]main.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[icon]main.jpg
new file mode 100644
index 00000000..0d84f860
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[icon]main.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[icon]options.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[icon]options.jpg
new file mode 100644
index 00000000..6b62bbbd
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[icon]options.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[icon]party.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[icon]party.jpg
new file mode 100644
index 00000000..ab60d5ce
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[icon]party.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[icon]question.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[icon]question.jpg
new file mode 100644
index 00000000..029172de
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[icon]question.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[icon]score.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[icon]score.jpg
new file mode 100644
index 00000000..eb922787
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[icon]score.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[icon]search.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[icon]search.jpg
new file mode 100644
index 00000000..50d237a3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[icon]search.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[icon]songmenu.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[icon]songmenu.jpg
new file mode 100644
index 00000000..bb445cf6
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[icon]songmenu.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[icon]stats.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[icon]stats.jpg
new file mode 100644
index 00000000..44c7556b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[icon]stats.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[icon]video.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[icon]video.jpg
new file mode 100644
index 00000000..526fcacf
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[icon]video.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[main]button.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[main]button.jpg
new file mode 100644
index 00000000..e1487e7b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[main]button.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[main]buttonf.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[main]buttonf.jpg
new file mode 100644
index 00000000..d844add5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[main]buttonf.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[main]buttonmenu.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[main]buttonmenu.jpg
new file mode 100644
index 00000000..b6fe1c10
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[main]buttonmenu.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[main]mainBar.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[main]mainBar.jpg
new file mode 100644
index 00000000..46b9558a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[main]mainBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[main]playerNumberBox.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[main]playerNumberBox.jpg
new file mode 100644
index 00000000..53e7964c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[main]playerNumberBox.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[main]selectbg.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[main]selectbg.jpg
new file mode 100644
index 00000000..c01902f3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[main]selectbg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[main]songCover.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[main]songCover.jpg
new file mode 100644
index 00000000..426bf22d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[main]songCover.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[main]songSelection1.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[main]songSelection1.jpg
new file mode 100644
index 00000000..1fd56d71
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[main]songSelection1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[main]songSelection2.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[main]songSelection2.jpg
new file mode 100644
index 00000000..08c6bc33
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[main]songSelection2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[menu]PopUpBg.JPG b/Game/Output/Skins/TODOs/Blue Sensation/[menu]PopUpBg.JPG
new file mode 100644
index 00000000..141d740a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[menu]PopUpBg.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[menu]PopUpFg.JPG b/Game/Output/Skins/TODOs/Blue Sensation/[menu]PopUpFg.JPG
new file mode 100644
index 00000000..9e9c6dea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[menu]PopUpFg.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[menu]jumpToBg.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[menu]jumpToBg.jpg
new file mode 100644
index 00000000..30a9b377
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[menu]jumpToBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[menu]songMenuBg.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[menu]songMenuBg.jpg
new file mode 100644
index 00000000..d4ac0c24
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[menu]songMenuBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[menu]songMenuSelectBg.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[menu]songMenuSelectBg.jpg
new file mode 100644
index 00000000..79966f3b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[menu]songMenuSelectBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[option]button.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[option]button.jpg
new file mode 100644
index 00000000..757f2dfd
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[option]button.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[party]Joker.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[party]Joker.jpg
new file mode 100644
index 00000000..61faba66
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[party]Joker.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[party]playerButton.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[party]playerButton.jpg
new file mode 100644
index 00000000..8bdb41e3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[party]playerButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[party]playerTeamButton.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[party]playerTeamButton.jpg
new file mode 100644
index 00000000..40fd16ab
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[party]playerTeamButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[party]pointer.bmp b/Game/Output/Skins/TODOs/Blue Sensation/[party]pointer.bmp
new file mode 100644
index 00000000..88bbcc3d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[party]pointer.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[party]roundBG1.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[party]roundBG1.jpg
new file mode 100644
index 00000000..e0926750
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[party]roundBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[party]roundBG2.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[party]roundBG2.jpg
new file mode 100644
index 00000000..a6b61a44
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[party]roundBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[party]roundBG3.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[party]roundBG3.jpg
new file mode 100644
index 00000000..219a5da7
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[party]roundBG3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[party]roundBG4.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[party]roundBG4.jpg
new file mode 100644
index 00000000..90f34109
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[party]roundBG4.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[party]roundTeamButton.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[party]roundTeamButton.jpg
new file mode 100644
index 00000000..c3909d2e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[party]roundTeamButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[party]scoreBG1.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[party]scoreBG1.jpg
new file mode 100644
index 00000000..caf87013
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[party]scoreBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[party]scoreBG2.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[party]scoreBG2.jpg
new file mode 100644
index 00000000..d3005339
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[party]scoreBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[party]scoreDecoration.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[party]scoreDecoration.jpg
new file mode 100644
index 00000000..49204e19
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[party]scoreDecoration.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[party]teamPoints.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[party]teamPoints.jpg
new file mode 100644
index 00000000..96855bc9
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[party]teamPoints.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[party]winDecoration1.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[party]winDecoration1.jpg
new file mode 100644
index 00000000..0277f529
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[party]winDecoration1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[party]winTeamButton1.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[party]winTeamButton1.jpg
new file mode 100644
index 00000000..d063fda5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[party]winTeamButton1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[party]winTeamButton2.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[party]winTeamButton2.jpg
new file mode 100644
index 00000000..41ec1fdd
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[party]winTeamButton2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[party]winTeamButton3.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[party]winTeamButton3.jpg
new file mode 100644
index 00000000..65de9cd5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[party]winTeamButton3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[score]Line.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[score]Line.jpg
new file mode 100644
index 00000000..4e233894
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[score]Line.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[score]box.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[score]box.jpg
new file mode 100644
index 00000000..7a918b47
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[score]box.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[score]endcap.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[score]endcap.jpg
new file mode 100644
index 00000000..0cad98a5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[score]endcap.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[score]level.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[score]level.jpg
new file mode 100644
index 00000000..a9e7e920
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[score]level.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[score]levelRound.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[score]levelRound.jpg
new file mode 100644
index 00000000..e5678689
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[score]levelRound.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[sing]LyricsBall.bmp b/Game/Output/Skins/TODOs/Blue Sensation/[sing]LyricsBall.bmp
new file mode 100644
index 00000000..420b0bb8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[sing]LyricsBall.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[sing]lineBonusPopUp.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[sing]lineBonusPopUp.jpg
new file mode 100644
index 00000000..58d93130
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[sing]lineBonusPopUp.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[sing]lyricsHelpBar.bmp b/Game/Output/Skins/TODOs/Blue Sensation/[sing]lyricsHelpBar.bmp
new file mode 100644
index 00000000..87a22b6b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[sing]lyricsHelpBar.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[sing]notesBgLeft.bmp b/Game/Output/Skins/TODOs/Blue Sensation/[sing]notesBgLeft.bmp
new file mode 100644
index 00000000..776e567c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[sing]notesBgLeft.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[sing]notesBgMid.bmp b/Game/Output/Skins/TODOs/Blue Sensation/[sing]notesBgMid.bmp
new file mode 100644
index 00000000..759ac8a3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[sing]notesBgMid.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[sing]notesBgRight.bmp b/Game/Output/Skins/TODOs/Blue Sensation/[sing]notesBgRight.bmp
new file mode 100644
index 00000000..9b1ffc18
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[sing]notesBgRight.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[sing]notesLeft.bmp b/Game/Output/Skins/TODOs/Blue Sensation/[sing]notesLeft.bmp
new file mode 100644
index 00000000..19c8047c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[sing]notesLeft.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[sing]notesMid.bmp b/Game/Output/Skins/TODOs/Blue Sensation/[sing]notesMid.bmp
new file mode 100644
index 00000000..db1aa074
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[sing]notesMid.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[sing]notesRight.bmp b/Game/Output/Skins/TODOs/Blue Sensation/[sing]notesRight.bmp
new file mode 100644
index 00000000..e4646ff0
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[sing]notesRight.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[sing]p.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[sing]p.jpg
new file mode 100644
index 00000000..5bf3fa97
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[sing]p.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[sing]scoreBg.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[sing]scoreBg.jpg
new file mode 100644
index 00000000..12a93a83
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[sing]scoreBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[sing]singBarBack.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[sing]singBarBack.jpg
new file mode 100644
index 00000000..da07e3a8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[sing]singBarBack.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[sing]singBarBar.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[sing]singBarBar.jpg
new file mode 100644
index 00000000..e00b225b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[sing]singBarBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[sing]singBarFront.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[sing]singBarFront.jpg
new file mode 100644
index 00000000..eec27b79
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[sing]singBarFront.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[sing]textBar.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[sing]textBar.jpg
new file mode 100644
index 00000000..bb368d26
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[sing]textBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[sing]timeBar.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[sing]timeBar.jpg
new file mode 100644
index 00000000..6186b976
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[sing]timeBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[sing]timeBar1.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[sing]timeBar1.jpg
new file mode 100644
index 00000000..de78ca9c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[sing]timeBar1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[sing]timeBarBG.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[sing]timeBarBG.jpg
new file mode 100644
index 00000000..0e66b009
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[sing]timeBarBG.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[special]bar1.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[special]bar1.jpg
new file mode 100644
index 00000000..284c8de1
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[special]bar1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[special]bar2.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[special]bar2.jpg
new file mode 100644
index 00000000..b69883cf
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[special]bar2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[stat]detailBG1.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[stat]detailBG1.jpg
new file mode 100644
index 00000000..dfd0edb1
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[stat]detailBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[stat]mainBG1.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[stat]mainBG1.jpg
new file mode 100644
index 00000000..c0fd3d9f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[stat]mainBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[stat]mainBG2.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[stat]mainBG2.jpg
new file mode 100644
index 00000000..73203141
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[stat]mainBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Blue Sensation/[stat]mainBG3.jpg b/Game/Output/Skins/TODOs/Blue Sensation/[stat]mainBG3.jpg
new file mode 100644
index 00000000..d967177a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Blue Sensation/[stat]mainBG3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/Star.ini b/Game/Output/Skins/TODOs/Classic/Star.ini
new file mode 100644
index 00000000..314fac01
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/Star.ini
@@ -0,0 +1,153 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=Classic
+Name=Star
+Creator=UltraStar Deluxe Team
+Color=Blue
+
+[Textures]
+
+# # # M A I N # # #
+Button = [main]Button.jpg
+ButtonF = [main]ButtonEditor.jpg
+MainBar = [main]Bar.jpg
+Logo = [main]Logo.jpg
+
+#Backgrounds
+#LoadingBG = #Placeholder for new Classic Skins
+#MainBG =
+#SongBG =
+#ScoresBG =
+#Top5BG =
+#OptionsBG =
+#PartyBG =
+
+#Icons on screen
+MainIcon = [icon]Star.jpg
+IconQuestion = [icon]question.jpg
+IconError = [icon]error.jpg
+VideoIcon = [icon]video.jpg
+
+# # # M A I N S C R E E N # # #
+ButtonSolo = [mainbutton]Solo.jpg
+ButtonMulti = [mainbutton]Multi.jpg
+ButtonEditor = [mainbutton]Solo.jpg
+ButtonStats = [mainbutton]Stats.jpg
+ButtonOptions = [mainbutton]Options.jpg
+ButtonExit = [mainbutton]Exit.jpg
+
+# # # S O N G S E L E C E T # # #
+SongSelection = [song]selection.jpg
+SongFade = [song]BGFade.jpg
+SongEqualizerBG= [song]EqualizerBG.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar (not skinned in this theme :P )
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]Box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =[party]winDecoration.jpg
+PartyWinDeco2 =[party]winDecoration.jpg
+PartyWinDeco3 =[party]winDecoration.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonE = [button]e.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+JumpToBG = [menu]JumptoBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuBorder = [menu]songMenuBorder.jpg
+SongMenuButton = [menu]songMenuButtonBG.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg \ No newline at end of file
diff --git a/Game/Output/Skins/TODOs/Classic/Thumbs.db b/Game/Output/Skins/TODOs/Classic/Thumbs.db
new file mode 100644
index 00000000..52c81c74
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/Thumbs.db
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[button]13.jpg b/Game/Output/Skins/TODOs/Classic/[button]13.jpg
new file mode 100644
index 00000000..5787bb24
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[button]13.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[button]alt.jpg b/Game/Output/Skins/TODOs/Classic/[button]alt.jpg
new file mode 100644
index 00000000..ec3e630f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[button]alt.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[button]az.jpg b/Game/Output/Skins/TODOs/Classic/[button]az.jpg
new file mode 100644
index 00000000..b486604e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[button]az.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[button]e.jpg b/Game/Output/Skins/TODOs/Classic/[button]e.jpg
new file mode 100644
index 00000000..7b247260
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[button]e.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[button]enter.jpg b/Game/Output/Skins/TODOs/Classic/[button]enter.jpg
new file mode 100644
index 00000000..16ee885a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[button]enter.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[button]esc.jpg b/Game/Output/Skins/TODOs/Classic/[button]esc.jpg
new file mode 100644
index 00000000..7c40487a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[button]esc.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[button]j.jpg b/Game/Output/Skins/TODOs/Classic/[button]j.jpg
new file mode 100644
index 00000000..b6eed56c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[button]j.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[button]m.jpg b/Game/Output/Skins/TODOs/Classic/[button]m.jpg
new file mode 100644
index 00000000..ebb7156e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[button]m.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[button]navi.jpg b/Game/Output/Skins/TODOs/Classic/[button]navi.jpg
new file mode 100644
index 00000000..41b44525
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[button]navi.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[button]p.jpg b/Game/Output/Skins/TODOs/Classic/[button]p.jpg
new file mode 100644
index 00000000..d2d60c02
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[button]p.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[effect]goldenNoteStar.jpg b/Game/Output/Skins/TODOs/Classic/[effect]goldenNoteStar.jpg
new file mode 100644
index 00000000..1b31d267
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[effect]goldenNoteStar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[effect]perfectNoteStar.jpg b/Game/Output/Skins/TODOs/Classic/[effect]perfectNoteStar.jpg
new file mode 100644
index 00000000..189a22a3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[effect]perfectNoteStar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[helper]rectangle.jpg b/Game/Output/Skins/TODOs/Classic/[helper]rectangle.jpg
new file mode 100644
index 00000000..e03f98fc
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[helper]rectangle.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[icon]Star.jpg b/Game/Output/Skins/TODOs/Classic/[icon]Star.jpg
new file mode 100644
index 00000000..ee98f9d7
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[icon]Star.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[icon]error.jpg b/Game/Output/Skins/TODOs/Classic/[icon]error.jpg
new file mode 100644
index 00000000..5802e312
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[icon]error.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[icon]question.jpg b/Game/Output/Skins/TODOs/Classic/[icon]question.jpg
new file mode 100644
index 00000000..e78fe6a8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[icon]question.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[icon]stats.jpg b/Game/Output/Skins/TODOs/Classic/[icon]stats.jpg
new file mode 100644
index 00000000..cd5e03fb
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[icon]stats.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[icon]video.jpg b/Game/Output/Skins/TODOs/Classic/[icon]video.jpg
new file mode 100644
index 00000000..12d71add
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[icon]video.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[main]Bar.jpg b/Game/Output/Skins/TODOs/Classic/[main]Bar.jpg
new file mode 100644
index 00000000..2453cc3b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[main]Bar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[main]Bar1.jpg b/Game/Output/Skins/TODOs/Classic/[main]Bar1.jpg
new file mode 100644
index 00000000..4e9693e3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[main]Bar1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[main]Button.jpg b/Game/Output/Skins/TODOs/Classic/[main]Button.jpg
new file mode 100644
index 00000000..e6191a95
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[main]Button.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[main]Button2.jpg b/Game/Output/Skins/TODOs/Classic/[main]Button2.jpg
new file mode 100644
index 00000000..e3e9679a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[main]Button2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[main]Button3.jpg b/Game/Output/Skins/TODOs/Classic/[main]Button3.jpg
new file mode 100644
index 00000000..3ac1f442
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[main]Button3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[main]ButtonEditor.jpg b/Game/Output/Skins/TODOs/Classic/[main]ButtonEditor.jpg
new file mode 100644
index 00000000..32e455ef
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[main]ButtonEditor.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[main]Logo.jpg b/Game/Output/Skins/TODOs/Classic/[main]Logo.jpg
new file mode 100644
index 00000000..1902cb02
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[main]Logo.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[main]songCover.jpg b/Game/Output/Skins/TODOs/Classic/[main]songCover.jpg
new file mode 100644
index 00000000..426bf22d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[main]songCover.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[main]square.jpg b/Game/Output/Skins/TODOs/Classic/[main]square.jpg
new file mode 100644
index 00000000..8af62b71
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[main]square.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[mainbutton]Exit.jpg b/Game/Output/Skins/TODOs/Classic/[mainbutton]Exit.jpg
new file mode 100644
index 00000000..55494e65
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[mainbutton]Exit.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[mainbutton]Multi.jpg b/Game/Output/Skins/TODOs/Classic/[mainbutton]Multi.jpg
new file mode 100644
index 00000000..ad5980d7
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[mainbutton]Multi.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[mainbutton]Options.jpg b/Game/Output/Skins/TODOs/Classic/[mainbutton]Options.jpg
new file mode 100644
index 00000000..5e1bff71
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[mainbutton]Options.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[mainbutton]Solo.jpg b/Game/Output/Skins/TODOs/Classic/[mainbutton]Solo.jpg
new file mode 100644
index 00000000..a7e3d82a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[mainbutton]Solo.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[mainbutton]Stats.jpg b/Game/Output/Skins/TODOs/Classic/[mainbutton]Stats.jpg
new file mode 100644
index 00000000..71cc13ad
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[mainbutton]Stats.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[menu]PopUpBg.JPG b/Game/Output/Skins/TODOs/Classic/[menu]PopUpBg.JPG
new file mode 100644
index 00000000..1a23a90c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[menu]PopUpBg.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[menu]PopUpFg.JPG b/Game/Output/Skins/TODOs/Classic/[menu]PopUpFg.JPG
new file mode 100644
index 00000000..530d4cf9
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[menu]PopUpFg.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[menu]jumpToBg.jpg b/Game/Output/Skins/TODOs/Classic/[menu]jumpToBg.jpg
new file mode 100644
index 00000000..d0cd1da8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[menu]jumpToBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[menu]songMenuBg.jpg b/Game/Output/Skins/TODOs/Classic/[menu]songMenuBg.jpg
new file mode 100644
index 00000000..e4242fc5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[menu]songMenuBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[menu]songMenuBorder.jpg b/Game/Output/Skins/TODOs/Classic/[menu]songMenuBorder.jpg
new file mode 100644
index 00000000..11dd0604
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[menu]songMenuBorder.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[menu]songMenuButtonBG.jpg b/Game/Output/Skins/TODOs/Classic/[menu]songMenuButtonBG.jpg
new file mode 100644
index 00000000..53f0da59
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[menu]songMenuButtonBG.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[menu]songMenuSelectBG.jpg b/Game/Output/Skins/TODOs/Classic/[menu]songMenuSelectBG.jpg
new file mode 100644
index 00000000..cd3041e2
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[menu]songMenuSelectBG.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[party]Joker.jpg b/Game/Output/Skins/TODOs/Classic/[party]Joker.jpg
new file mode 100644
index 00000000..78b66936
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[party]Joker.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[party]playerButton.jpg b/Game/Output/Skins/TODOs/Classic/[party]playerButton.jpg
new file mode 100644
index 00000000..15a34c66
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[party]playerButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[party]playerTeamButton.jpg b/Game/Output/Skins/TODOs/Classic/[party]playerTeamButton.jpg
new file mode 100644
index 00000000..2faf9c4b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[party]playerTeamButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[party]pointer.bmp b/Game/Output/Skins/TODOs/Classic/[party]pointer.bmp
new file mode 100644
index 00000000..88bbcc3d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[party]pointer.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[party]roundBG1.jpg b/Game/Output/Skins/TODOs/Classic/[party]roundBG1.jpg
new file mode 100644
index 00000000..464aabea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[party]roundBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[party]roundBG2.jpg b/Game/Output/Skins/TODOs/Classic/[party]roundBG2.jpg
new file mode 100644
index 00000000..3413958f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[party]roundBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[party]roundBG3.jpg b/Game/Output/Skins/TODOs/Classic/[party]roundBG3.jpg
new file mode 100644
index 00000000..c6b53caf
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[party]roundBG3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[party]roundBG4.jpg b/Game/Output/Skins/TODOs/Classic/[party]roundBG4.jpg
new file mode 100644
index 00000000..5e4da0ac
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[party]roundBG4.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[party]roundTeamButton.jpg b/Game/Output/Skins/TODOs/Classic/[party]roundTeamButton.jpg
new file mode 100644
index 00000000..692db1bd
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[party]roundTeamButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[party]scoreBG1.jpg b/Game/Output/Skins/TODOs/Classic/[party]scoreBG1.jpg
new file mode 100644
index 00000000..f558425d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[party]scoreBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[party]scoreBG2.jpg b/Game/Output/Skins/TODOs/Classic/[party]scoreBG2.jpg
new file mode 100644
index 00000000..47239d85
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[party]scoreBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[party]scoreDecoration.jpg b/Game/Output/Skins/TODOs/Classic/[party]scoreDecoration.jpg
new file mode 100644
index 00000000..49204e19
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[party]scoreDecoration.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[party]teamPoints.jpg b/Game/Output/Skins/TODOs/Classic/[party]teamPoints.jpg
new file mode 100644
index 00000000..96855bc9
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[party]teamPoints.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[party]winDecoration.jpg b/Game/Output/Skins/TODOs/Classic/[party]winDecoration.jpg
new file mode 100644
index 00000000..1d48ddb3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[party]winDecoration.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[party]winTeamButton1.jpg b/Game/Output/Skins/TODOs/Classic/[party]winTeamButton1.jpg
new file mode 100644
index 00000000..10c8d80f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[party]winTeamButton1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[party]winTeamButton2.jpg b/Game/Output/Skins/TODOs/Classic/[party]winTeamButton2.jpg
new file mode 100644
index 00000000..fbd85056
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[party]winTeamButton2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[party]winTeamButton3.jpg b/Game/Output/Skins/TODOs/Classic/[party]winTeamButton3.jpg
new file mode 100644
index 00000000..e8dd9566
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[party]winTeamButton3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[score]box.jpg b/Game/Output/Skins/TODOs/Classic/[score]box.jpg
new file mode 100644
index 00000000..b37f7e46
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[score]box.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[score]level.jpg b/Game/Output/Skins/TODOs/Classic/[score]level.jpg
new file mode 100644
index 00000000..e47280cb
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[score]level.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[score]levelround.jpg b/Game/Output/Skins/TODOs/Classic/[score]levelround.jpg
new file mode 100644
index 00000000..dbc5b5af
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[score]levelround.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[score]line.jpg b/Game/Output/Skins/TODOs/Classic/[score]line.jpg
new file mode 100644
index 00000000..2fd951aa
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[score]line.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[sing]LyricsBall.bmp b/Game/Output/Skins/TODOs/Classic/[sing]LyricsBall.bmp
new file mode 100644
index 00000000..5b7d7943
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[sing]LyricsBall.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[sing]lineBonusPopUp.jpg b/Game/Output/Skins/TODOs/Classic/[sing]lineBonusPopUp.jpg
new file mode 100644
index 00000000..58d93130
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[sing]lineBonusPopUp.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[sing]lyricsHelpBar.bmp b/Game/Output/Skins/TODOs/Classic/[sing]lyricsHelpBar.bmp
new file mode 100644
index 00000000..24fa2b52
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[sing]lyricsHelpBar.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[sing]notesBgLeft.bmp b/Game/Output/Skins/TODOs/Classic/[sing]notesBgLeft.bmp
new file mode 100644
index 00000000..776e567c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[sing]notesBgLeft.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[sing]notesBgMid.bmp b/Game/Output/Skins/TODOs/Classic/[sing]notesBgMid.bmp
new file mode 100644
index 00000000..759ac8a3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[sing]notesBgMid.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[sing]notesBgRight.bmp b/Game/Output/Skins/TODOs/Classic/[sing]notesBgRight.bmp
new file mode 100644
index 00000000..9b1ffc18
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[sing]notesBgRight.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[sing]notesLeft.bmp b/Game/Output/Skins/TODOs/Classic/[sing]notesLeft.bmp
new file mode 100644
index 00000000..c819849b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[sing]notesLeft.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[sing]notesMid.bmp b/Game/Output/Skins/TODOs/Classic/[sing]notesMid.bmp
new file mode 100644
index 00000000..2fdce32d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[sing]notesMid.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[sing]notesRight.bmp b/Game/Output/Skins/TODOs/Classic/[sing]notesRight.bmp
new file mode 100644
index 00000000..3241beeb
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[sing]notesRight.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[sing]p.jpg b/Game/Output/Skins/TODOs/Classic/[sing]p.jpg
new file mode 100644
index 00000000..5217c6b1
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[sing]p.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[sing]scoreBg.jpg b/Game/Output/Skins/TODOs/Classic/[sing]scoreBg.jpg
new file mode 100644
index 00000000..01d3ca75
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[sing]scoreBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[sing]singBarBack.jpg b/Game/Output/Skins/TODOs/Classic/[sing]singBarBack.jpg
new file mode 100644
index 00000000..d7dcd791
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[sing]singBarBack.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[sing]singBarBar.jpg b/Game/Output/Skins/TODOs/Classic/[sing]singBarBar.jpg
new file mode 100644
index 00000000..4fd9bde9
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[sing]singBarBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[sing]singBarFront.jpg b/Game/Output/Skins/TODOs/Classic/[sing]singBarFront.jpg
new file mode 100644
index 00000000..eec27b79
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[sing]singBarFront.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[sing]textBar.jpg b/Game/Output/Skins/TODOs/Classic/[sing]textBar.jpg
new file mode 100644
index 00000000..e2734bce
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[sing]textBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[song]BGFade.jpg b/Game/Output/Skins/TODOs/Classic/[song]BGFade.jpg
new file mode 100644
index 00000000..1d6b80ff
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[song]BGFade.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[song]EqualizerBG.jpg b/Game/Output/Skins/TODOs/Classic/[song]EqualizerBG.jpg
new file mode 100644
index 00000000..54ff27f2
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[song]EqualizerBG.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[song]selection.jpg b/Game/Output/Skins/TODOs/Classic/[song]selection.jpg
new file mode 100644
index 00000000..b6c0065e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[song]selection.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[stat]detailBG1.jpg b/Game/Output/Skins/TODOs/Classic/[stat]detailBG1.jpg
new file mode 100644
index 00000000..120dc483
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[stat]detailBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[stat]mainBG1.jpg b/Game/Output/Skins/TODOs/Classic/[stat]mainBG1.jpg
new file mode 100644
index 00000000..a937b24a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[stat]mainBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[stat]mainBG2.jpg b/Game/Output/Skins/TODOs/Classic/[stat]mainBG2.jpg
new file mode 100644
index 00000000..201d49b8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[stat]mainBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Classic/[stat]mainBG3.jpg b/Game/Output/Skins/TODOs/Classic/[stat]mainBG3.jpg
new file mode 100644
index 00000000..812a8d78
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Classic/[stat]mainBG3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/Orange.ini b/Game/Output/Skins/TODOs/Orange/Orange.ini
new file mode 100644
index 00000000..fedd0999
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/Orange.ini
@@ -0,0 +1,162 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=Orange
+Name=Standard
+Color=Orange
+Autor=Skar
+
+[Textures]
+
+
+# # # M A I N # # #
+Button = [main]button.jpg
+ButtonMirror = [main]button2.jpg
+ButtonCollection = [main]button3.jpg
+ButtonF = [main]buttonf.jpg
+MainBar = [main]mainBar.jpg
+SelectBG = [main]selectbg.jpg
+Button-m-1 = [main]button-m-1.jpg
+Button-m-2 = [main]button-m-2.jpg
+Button-m-3 = [main]button-m-3.jpg
+Button-m-4 = [main]button-m-4.jpg
+
+
+#Backgrounds
+LoadingBG = [bg-load].jpg
+MainBG = bg-main.jpg
+SongBG = bg-song.jpg
+ScoreScreenBG = bg-song.jpg
+Top5BG = bg-song.jpg
+OptionsBG = bg-song.jpg
+PartyBG = bg-song.jpg
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu = [icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon = [icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon = [icon]video.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+# # # S O N G S E L E C E T # # #
+SongSelection1 = [main]songSelection1.jpg
+SongSelection2 = [main]songSelection2.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =[party]winDecoration1.jpg
+PartyWinDeco2 =[party]winDecoration1.jpg
+PartyWinDeco3 =[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+Leiste1 = [special]bar1.jpg
+Leiste2 = [special]bar2.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg
+ButtonFade = [helper]buttonFade.jpg \ No newline at end of file
diff --git a/Game/Output/Skins/TODOs/Orange/Thumbs.db b/Game/Output/Skins/TODOs/Orange/Thumbs.db
new file mode 100644
index 00000000..8979a62a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/Thumbs.db
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[bg-load].jpg b/Game/Output/Skins/TODOs/Orange/[bg-load].jpg
new file mode 100644
index 00000000..c58dea03
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[bg-load].jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[button]13.jpg b/Game/Output/Skins/TODOs/Orange/[button]13.jpg
new file mode 100644
index 00000000..dd3453b2
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[button]13.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[button]alt.jpg b/Game/Output/Skins/TODOs/Orange/[button]alt.jpg
new file mode 100644
index 00000000..bb94afa0
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[button]alt.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[button]az.jpg b/Game/Output/Skins/TODOs/Orange/[button]az.jpg
new file mode 100644
index 00000000..34e02271
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[button]az.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[button]enter.jpg b/Game/Output/Skins/TODOs/Orange/[button]enter.jpg
new file mode 100644
index 00000000..70ded774
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[button]enter.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[button]esc.jpg b/Game/Output/Skins/TODOs/Orange/[button]esc.jpg
new file mode 100644
index 00000000..42665788
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[button]esc.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[button]j.jpg b/Game/Output/Skins/TODOs/Orange/[button]j.jpg
new file mode 100644
index 00000000..0c85dcc8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[button]j.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[button]m.jpg b/Game/Output/Skins/TODOs/Orange/[button]m.jpg
new file mode 100644
index 00000000..5d55e476
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[button]m.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[button]navi.jpg b/Game/Output/Skins/TODOs/Orange/[button]navi.jpg
new file mode 100644
index 00000000..387635ac
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[button]navi.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[button]p.jpg b/Game/Output/Skins/TODOs/Orange/[button]p.jpg
new file mode 100644
index 00000000..d6b4d0c7
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[button]p.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[effect]goldenNoteStar.jpg b/Game/Output/Skins/TODOs/Orange/[effect]goldenNoteStar.jpg
new file mode 100644
index 00000000..1b31d267
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[effect]goldenNoteStar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[effect]perfectNoteStar.jpg b/Game/Output/Skins/TODOs/Orange/[effect]perfectNoteStar.jpg
new file mode 100644
index 00000000..189a22a3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[effect]perfectNoteStar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[helper]buttonFade.jpg b/Game/Output/Skins/TODOs/Orange/[helper]buttonFade.jpg
new file mode 100644
index 00000000..6de293f7
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[helper]buttonFade.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[helper]rectangle.jpg b/Game/Output/Skins/TODOs/Orange/[helper]rectangle.jpg
new file mode 100644
index 00000000..e03f98fc
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[helper]rectangle.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[icon]cd.jpg b/Game/Output/Skins/TODOs/Orange/[icon]cd.jpg
new file mode 100644
index 00000000..d48dc4ff
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[icon]cd.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[icon]error.jpg b/Game/Output/Skins/TODOs/Orange/[icon]error.jpg
new file mode 100644
index 00000000..a5140f0e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[icon]error.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[icon]main.jpg b/Game/Output/Skins/TODOs/Orange/[icon]main.jpg
new file mode 100644
index 00000000..5941256a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[icon]main.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[icon]options.jpg b/Game/Output/Skins/TODOs/Orange/[icon]options.jpg
new file mode 100644
index 00000000..278f0adc
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[icon]options.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[icon]party.jpg b/Game/Output/Skins/TODOs/Orange/[icon]party.jpg
new file mode 100644
index 00000000..2bccd403
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[icon]party.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[icon]question.jpg b/Game/Output/Skins/TODOs/Orange/[icon]question.jpg
new file mode 100644
index 00000000..029172de
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[icon]question.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[icon]score.jpg b/Game/Output/Skins/TODOs/Orange/[icon]score.jpg
new file mode 100644
index 00000000..6402fa9a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[icon]score.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[icon]search.jpg b/Game/Output/Skins/TODOs/Orange/[icon]search.jpg
new file mode 100644
index 00000000..b5870592
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[icon]search.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[icon]songmenu.jpg b/Game/Output/Skins/TODOs/Orange/[icon]songmenu.jpg
new file mode 100644
index 00000000..35f4b440
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[icon]songmenu.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[icon]stats.jpg b/Game/Output/Skins/TODOs/Orange/[icon]stats.jpg
new file mode 100644
index 00000000..505a6709
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[icon]stats.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[icon]video.jpg b/Game/Output/Skins/TODOs/Orange/[icon]video.jpg
new file mode 100644
index 00000000..12d71add
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[icon]video.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[main]button-m-1.jpg b/Game/Output/Skins/TODOs/Orange/[main]button-m-1.jpg
new file mode 100644
index 00000000..90c0da80
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[main]button-m-1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[main]button-m-2.jpg b/Game/Output/Skins/TODOs/Orange/[main]button-m-2.jpg
new file mode 100644
index 00000000..78200047
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[main]button-m-2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[main]button-m-3.jpg b/Game/Output/Skins/TODOs/Orange/[main]button-m-3.jpg
new file mode 100644
index 00000000..48d182e8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[main]button-m-3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[main]button-m-4.jpg b/Game/Output/Skins/TODOs/Orange/[main]button-m-4.jpg
new file mode 100644
index 00000000..eae0d41e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[main]button-m-4.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[main]button.jpg b/Game/Output/Skins/TODOs/Orange/[main]button.jpg
new file mode 100644
index 00000000..15a34c66
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[main]button.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[main]button2.jpg b/Game/Output/Skins/TODOs/Orange/[main]button2.jpg
new file mode 100644
index 00000000..384b92fb
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[main]button2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[main]button3.jpg b/Game/Output/Skins/TODOs/Orange/[main]button3.jpg
new file mode 100644
index 00000000..dd6f9f72
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[main]button3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[main]buttonf.jpg b/Game/Output/Skins/TODOs/Orange/[main]buttonf.jpg
new file mode 100644
index 00000000..d844add5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[main]buttonf.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[main]mainBar.jpg b/Game/Output/Skins/TODOs/Orange/[main]mainBar.jpg
new file mode 100644
index 00000000..77c84430
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[main]mainBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[main]playerNumberBox.jpg b/Game/Output/Skins/TODOs/Orange/[main]playerNumberBox.jpg
new file mode 100644
index 00000000..53e7964c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[main]playerNumberBox.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[main]selectbg.jpg b/Game/Output/Skins/TODOs/Orange/[main]selectbg.jpg
new file mode 100644
index 00000000..fef45648
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[main]selectbg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[main]songCover.jpg b/Game/Output/Skins/TODOs/Orange/[main]songCover.jpg
new file mode 100644
index 00000000..426bf22d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[main]songCover.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[main]songSelection1.jpg b/Game/Output/Skins/TODOs/Orange/[main]songSelection1.jpg
new file mode 100644
index 00000000..348737ed
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[main]songSelection1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[main]songSelection2.jpg b/Game/Output/Skins/TODOs/Orange/[main]songSelection2.jpg
new file mode 100644
index 00000000..cb3a3396
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[main]songSelection2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[menu]PopUpBg.JPG b/Game/Output/Skins/TODOs/Orange/[menu]PopUpBg.JPG
new file mode 100644
index 00000000..141d740a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[menu]PopUpBg.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[menu]PopUpFg.JPG b/Game/Output/Skins/TODOs/Orange/[menu]PopUpFg.JPG
new file mode 100644
index 00000000..9e9c6dea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[menu]PopUpFg.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[menu]jumpToBg.jpg b/Game/Output/Skins/TODOs/Orange/[menu]jumpToBg.jpg
new file mode 100644
index 00000000..a8b93e10
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[menu]jumpToBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[menu]songMenuBg.jpg b/Game/Output/Skins/TODOs/Orange/[menu]songMenuBg.jpg
new file mode 100644
index 00000000..ef530ef5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[menu]songMenuBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[menu]songMenuSelectBg.jpg b/Game/Output/Skins/TODOs/Orange/[menu]songMenuSelectBg.jpg
new file mode 100644
index 00000000..79966f3b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[menu]songMenuSelectBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[party]Joker.jpg b/Game/Output/Skins/TODOs/Orange/[party]Joker.jpg
new file mode 100644
index 00000000..e2a18684
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[party]Joker.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[party]playerButton.jpg b/Game/Output/Skins/TODOs/Orange/[party]playerButton.jpg
new file mode 100644
index 00000000..15a34c66
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[party]playerButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[party]playerTeamButton.jpg b/Game/Output/Skins/TODOs/Orange/[party]playerTeamButton.jpg
new file mode 100644
index 00000000..2faf9c4b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[party]playerTeamButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[party]pointer.bmp b/Game/Output/Skins/TODOs/Orange/[party]pointer.bmp
new file mode 100644
index 00000000..88bbcc3d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[party]pointer.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[party]roundBG1.jpg b/Game/Output/Skins/TODOs/Orange/[party]roundBG1.jpg
new file mode 100644
index 00000000..464aabea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[party]roundBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[party]roundBG2.jpg b/Game/Output/Skins/TODOs/Orange/[party]roundBG2.jpg
new file mode 100644
index 00000000..3413958f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[party]roundBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[party]roundBG3.jpg b/Game/Output/Skins/TODOs/Orange/[party]roundBG3.jpg
new file mode 100644
index 00000000..c6b53caf
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[party]roundBG3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[party]roundBG4.jpg b/Game/Output/Skins/TODOs/Orange/[party]roundBG4.jpg
new file mode 100644
index 00000000..5e4da0ac
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[party]roundBG4.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[party]roundTeamButton.jpg b/Game/Output/Skins/TODOs/Orange/[party]roundTeamButton.jpg
new file mode 100644
index 00000000..692db1bd
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[party]roundTeamButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[party]scoreBG1.jpg b/Game/Output/Skins/TODOs/Orange/[party]scoreBG1.jpg
new file mode 100644
index 00000000..f558425d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[party]scoreBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[party]scoreBG2.jpg b/Game/Output/Skins/TODOs/Orange/[party]scoreBG2.jpg
new file mode 100644
index 00000000..47239d85
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[party]scoreBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[party]scoreDecoration.jpg b/Game/Output/Skins/TODOs/Orange/[party]scoreDecoration.jpg
new file mode 100644
index 00000000..49204e19
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[party]scoreDecoration.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[party]teamPoints.jpg b/Game/Output/Skins/TODOs/Orange/[party]teamPoints.jpg
new file mode 100644
index 00000000..96855bc9
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[party]teamPoints.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[party]winDecoration1.jpg b/Game/Output/Skins/TODOs/Orange/[party]winDecoration1.jpg
new file mode 100644
index 00000000..0277f529
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[party]winDecoration1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[party]winTeamButton1.jpg b/Game/Output/Skins/TODOs/Orange/[party]winTeamButton1.jpg
new file mode 100644
index 00000000..10c8d80f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[party]winTeamButton1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[party]winTeamButton2.jpg b/Game/Output/Skins/TODOs/Orange/[party]winTeamButton2.jpg
new file mode 100644
index 00000000..fbd85056
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[party]winTeamButton2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[party]winTeamButton3.jpg b/Game/Output/Skins/TODOs/Orange/[party]winTeamButton3.jpg
new file mode 100644
index 00000000..e8dd9566
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[party]winTeamButton3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[score]Line.jpg b/Game/Output/Skins/TODOs/Orange/[score]Line.jpg
new file mode 100644
index 00000000..61cf33f5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[score]Line.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[score]box.jpg b/Game/Output/Skins/TODOs/Orange/[score]box.jpg
new file mode 100644
index 00000000..b37f7e46
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[score]box.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[score]endcap.jpg b/Game/Output/Skins/TODOs/Orange/[score]endcap.jpg
new file mode 100644
index 00000000..0cad98a5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[score]endcap.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[score]level.jpg b/Game/Output/Skins/TODOs/Orange/[score]level.jpg
new file mode 100644
index 00000000..9e9c4086
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[score]level.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[score]levelRound.jpg b/Game/Output/Skins/TODOs/Orange/[score]levelRound.jpg
new file mode 100644
index 00000000..38cfddea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[score]levelRound.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[sing]LyricsBall.bmp b/Game/Output/Skins/TODOs/Orange/[sing]LyricsBall.bmp
new file mode 100644
index 00000000..5b7d7943
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[sing]LyricsBall.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[sing]lineBonusPopUp.jpg b/Game/Output/Skins/TODOs/Orange/[sing]lineBonusPopUp.jpg
new file mode 100644
index 00000000..58d93130
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[sing]lineBonusPopUp.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[sing]lyricsHelpBar.bmp b/Game/Output/Skins/TODOs/Orange/[sing]lyricsHelpBar.bmp
new file mode 100644
index 00000000..836d3537
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[sing]lyricsHelpBar.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[sing]notesBgLeft.bmp b/Game/Output/Skins/TODOs/Orange/[sing]notesBgLeft.bmp
new file mode 100644
index 00000000..776e567c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[sing]notesBgLeft.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[sing]notesBgMid.bmp b/Game/Output/Skins/TODOs/Orange/[sing]notesBgMid.bmp
new file mode 100644
index 00000000..759ac8a3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[sing]notesBgMid.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[sing]notesBgRight.bmp b/Game/Output/Skins/TODOs/Orange/[sing]notesBgRight.bmp
new file mode 100644
index 00000000..9b1ffc18
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[sing]notesBgRight.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[sing]notesLeft.bmp b/Game/Output/Skins/TODOs/Orange/[sing]notesLeft.bmp
new file mode 100644
index 00000000..3d22e5fc
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[sing]notesLeft.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[sing]notesMid.bmp b/Game/Output/Skins/TODOs/Orange/[sing]notesMid.bmp
new file mode 100644
index 00000000..2daa66b8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[sing]notesMid.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[sing]notesRight.bmp b/Game/Output/Skins/TODOs/Orange/[sing]notesRight.bmp
new file mode 100644
index 00000000..cd936129
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[sing]notesRight.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[sing]p.jpg b/Game/Output/Skins/TODOs/Orange/[sing]p.jpg
new file mode 100644
index 00000000..e490fbf4
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[sing]p.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[sing]scoreBg.jpg b/Game/Output/Skins/TODOs/Orange/[sing]scoreBg.jpg
new file mode 100644
index 00000000..2bcbedaa
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[sing]scoreBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[sing]singBarBack.jpg b/Game/Output/Skins/TODOs/Orange/[sing]singBarBack.jpg
new file mode 100644
index 00000000..d7dcd791
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[sing]singBarBack.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[sing]singBarBar.jpg b/Game/Output/Skins/TODOs/Orange/[sing]singBarBar.jpg
new file mode 100644
index 00000000..4fd9bde9
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[sing]singBarBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[sing]singBarFront.jpg b/Game/Output/Skins/TODOs/Orange/[sing]singBarFront.jpg
new file mode 100644
index 00000000..eec27b79
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[sing]singBarFront.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[sing]textBar.jpg b/Game/Output/Skins/TODOs/Orange/[sing]textBar.jpg
new file mode 100644
index 00000000..596a668a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[sing]textBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[sing]timeBar.jpg b/Game/Output/Skins/TODOs/Orange/[sing]timeBar.jpg
new file mode 100644
index 00000000..6e1e42dd
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[sing]timeBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[sing]timeBarBG.jpg b/Game/Output/Skins/TODOs/Orange/[sing]timeBarBG.jpg
new file mode 100644
index 00000000..5298a0c5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[sing]timeBarBG.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[special]bar1.jpg b/Game/Output/Skins/TODOs/Orange/[special]bar1.jpg
new file mode 100644
index 00000000..9f8d2e02
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[special]bar1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[special]bar2.jpg b/Game/Output/Skins/TODOs/Orange/[special]bar2.jpg
new file mode 100644
index 00000000..e634515b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[special]bar2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[stat]detailBG1.jpg b/Game/Output/Skins/TODOs/Orange/[stat]detailBG1.jpg
new file mode 100644
index 00000000..120dc483
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[stat]detailBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[stat]mainBG1.jpg b/Game/Output/Skins/TODOs/Orange/[stat]mainBG1.jpg
new file mode 100644
index 00000000..a937b24a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[stat]mainBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[stat]mainBG2.jpg b/Game/Output/Skins/TODOs/Orange/[stat]mainBG2.jpg
new file mode 100644
index 00000000..201d49b8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[stat]mainBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/[stat]mainBG3.jpg b/Game/Output/Skins/TODOs/Orange/[stat]mainBG3.jpg
new file mode 100644
index 00000000..4fb6bc06
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/[stat]mainBG3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/bg-main.jpg b/Game/Output/Skins/TODOs/Orange/bg-main.jpg
new file mode 100644
index 00000000..a70150bd
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/bg-main.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Orange/bg-song.jpg b/Game/Output/Skins/TODOs/Orange/bg-song.jpg
new file mode 100644
index 00000000..d07db7eb
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Orange/bg-song.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/Streetlight lite.ini b/Game/Output/Skins/TODOs/Streetlight/Streetlight lite.ini
new file mode 100644
index 00000000..0ffdfe07
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/Streetlight lite.ini
@@ -0,0 +1,156 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=Streetlight lite
+Name=Streetlight lite
+Color=Blue
+Autor=Skar
+
+[Textures]
+
+
+# # # M A I N # # #
+Button = [main]button.jpg
+Button2 = [main]button2.jpg
+ButtonF = [main]buttonf.jpg
+MainBar = [main]mainBar.jpg
+SelectBG = [main]selectbg.jpg
+
+#Backgrounds
+LoadingBG = [bg-load].jpg
+MainBG = bg-main.jpg
+SongBG = bg-song.jpg
+ScoreScreenBG = bg-song.jpg
+Top5BG = bg-song.jpg
+OptionsBG = bg-song.jpg
+PartyBG = bg-song.jpg
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu = [icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon = [icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon = [icon]video.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+# # # S O N G S E L E C E T # # #
+SongSelection1 = [main]songSelection1.jpg
+SongSelection2 = [main]songSelection2.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =[party]winDecoration1.jpg
+PartyWinDeco2 =[party]winDecoration1.jpg
+PartyWinDeco3 =[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+Leiste1 = [special]bar1.jpg
+Leiste2 = [special]bar2.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg
+ButtonFade = [helper]buttonFade.jpg \ No newline at end of file
diff --git a/Game/Output/Skins/TODOs/Streetlight/Streetlight.ini b/Game/Output/Skins/TODOs/Streetlight/Streetlight.ini
new file mode 100644
index 00000000..deb200ce
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/Streetlight.ini
@@ -0,0 +1,156 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=Streetlight
+Name=Streetlight
+Color=Blue
+Autor=Skar
+
+[Textures]
+
+
+# # # M A I N # # #
+Button = [main]button.jpg
+Button2 = [main]button2.jpg
+ButtonF = [main]buttonf.jpg
+MainBar = [main]mainBar.jpg
+SelectBG = [main]selectbg.jpg
+
+#Backgrounds
+LoadingBG = [bg-load].jpg
+MainBG = bg-main.jpg
+SongBG = bg-song.jpg
+ScoreScreenBG = bg-song.jpg
+Top5BG = bg-song.jpg
+OptionsBG = bg-song.jpg
+PartyBG = bg-song.jpg
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu = [icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon = [icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon = [icon]video.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+# # # S O N G S E L E C E T # # #
+SongSelection1 = [main]songSelection1.jpg
+SongSelection2 = [main]songSelection2.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =[party]winDecoration1.jpg
+PartyWinDeco2 =[party]winDecoration1.jpg
+PartyWinDeco3 =[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+Leiste1 = [special]bar1.jpg
+Leiste2 = [special]bar2.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg
+ButtonFade = [helper]buttonFade.jpg \ No newline at end of file
diff --git a/Game/Output/Skins/TODOs/Streetlight/Thumbs.db b/Game/Output/Skins/TODOs/Streetlight/Thumbs.db
new file mode 100644
index 00000000..13e67e0f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/Thumbs.db
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[bg-load].jpg b/Game/Output/Skins/TODOs/Streetlight/[bg-load].jpg
new file mode 100644
index 00000000..b316fb01
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[bg-load].jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[button]13.jpg b/Game/Output/Skins/TODOs/Streetlight/[button]13.jpg
new file mode 100644
index 00000000..dd3453b2
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[button]13.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[button]alt.jpg b/Game/Output/Skins/TODOs/Streetlight/[button]alt.jpg
new file mode 100644
index 00000000..bb94afa0
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[button]alt.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[button]az.jpg b/Game/Output/Skins/TODOs/Streetlight/[button]az.jpg
new file mode 100644
index 00000000..34e02271
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[button]az.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[button]enter.jpg b/Game/Output/Skins/TODOs/Streetlight/[button]enter.jpg
new file mode 100644
index 00000000..70ded774
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[button]enter.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[button]esc.jpg b/Game/Output/Skins/TODOs/Streetlight/[button]esc.jpg
new file mode 100644
index 00000000..42665788
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[button]esc.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[button]j.jpg b/Game/Output/Skins/TODOs/Streetlight/[button]j.jpg
new file mode 100644
index 00000000..0c85dcc8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[button]j.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[button]m.jpg b/Game/Output/Skins/TODOs/Streetlight/[button]m.jpg
new file mode 100644
index 00000000..5d55e476
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[button]m.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[button]navi.jpg b/Game/Output/Skins/TODOs/Streetlight/[button]navi.jpg
new file mode 100644
index 00000000..387635ac
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[button]navi.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[button]p.jpg b/Game/Output/Skins/TODOs/Streetlight/[button]p.jpg
new file mode 100644
index 00000000..d6b4d0c7
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[button]p.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[effect]goldenNoteStar.jpg b/Game/Output/Skins/TODOs/Streetlight/[effect]goldenNoteStar.jpg
new file mode 100644
index 00000000..1b31d267
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[effect]goldenNoteStar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[effect]perfectNoteStar.jpg b/Game/Output/Skins/TODOs/Streetlight/[effect]perfectNoteStar.jpg
new file mode 100644
index 00000000..189a22a3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[effect]perfectNoteStar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[helper]buttonFade.jpg b/Game/Output/Skins/TODOs/Streetlight/[helper]buttonFade.jpg
new file mode 100644
index 00000000..6de293f7
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[helper]buttonFade.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[helper]rectangle.jpg b/Game/Output/Skins/TODOs/Streetlight/[helper]rectangle.jpg
new file mode 100644
index 00000000..e03f98fc
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[helper]rectangle.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[icon]cd.jpg b/Game/Output/Skins/TODOs/Streetlight/[icon]cd.jpg
new file mode 100644
index 00000000..d48dc4ff
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[icon]cd.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[icon]error.jpg b/Game/Output/Skins/TODOs/Streetlight/[icon]error.jpg
new file mode 100644
index 00000000..a5140f0e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[icon]error.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[icon]main.jpg b/Game/Output/Skins/TODOs/Streetlight/[icon]main.jpg
new file mode 100644
index 00000000..5941256a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[icon]main.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[icon]options.jpg b/Game/Output/Skins/TODOs/Streetlight/[icon]options.jpg
new file mode 100644
index 00000000..278f0adc
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[icon]options.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[icon]party.jpg b/Game/Output/Skins/TODOs/Streetlight/[icon]party.jpg
new file mode 100644
index 00000000..2bccd403
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[icon]party.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[icon]question.jpg b/Game/Output/Skins/TODOs/Streetlight/[icon]question.jpg
new file mode 100644
index 00000000..029172de
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[icon]question.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[icon]score.jpg b/Game/Output/Skins/TODOs/Streetlight/[icon]score.jpg
new file mode 100644
index 00000000..6402fa9a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[icon]score.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[icon]search.jpg b/Game/Output/Skins/TODOs/Streetlight/[icon]search.jpg
new file mode 100644
index 00000000..b5870592
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[icon]search.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[icon]songmenu.jpg b/Game/Output/Skins/TODOs/Streetlight/[icon]songmenu.jpg
new file mode 100644
index 00000000..35f4b440
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[icon]songmenu.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[icon]stats.jpg b/Game/Output/Skins/TODOs/Streetlight/[icon]stats.jpg
new file mode 100644
index 00000000..505a6709
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[icon]stats.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[icon]video.jpg b/Game/Output/Skins/TODOs/Streetlight/[icon]video.jpg
new file mode 100644
index 00000000..12d71add
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[icon]video.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[main]button.jpg b/Game/Output/Skins/TODOs/Streetlight/[main]button.jpg
new file mode 100644
index 00000000..15a34c66
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[main]button.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[main]button2.jpg b/Game/Output/Skins/TODOs/Streetlight/[main]button2.jpg
new file mode 100644
index 00000000..de66ec1c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[main]button2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[main]buttonf.jpg b/Game/Output/Skins/TODOs/Streetlight/[main]buttonf.jpg
new file mode 100644
index 00000000..d844add5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[main]buttonf.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[main]mainBar.jpg b/Game/Output/Skins/TODOs/Streetlight/[main]mainBar.jpg
new file mode 100644
index 00000000..77c84430
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[main]mainBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[main]playerNumberBox.jpg b/Game/Output/Skins/TODOs/Streetlight/[main]playerNumberBox.jpg
new file mode 100644
index 00000000..53e7964c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[main]playerNumberBox.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[main]selectbg.jpg b/Game/Output/Skins/TODOs/Streetlight/[main]selectbg.jpg
new file mode 100644
index 00000000..fef45648
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[main]selectbg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[main]songCover.jpg b/Game/Output/Skins/TODOs/Streetlight/[main]songCover.jpg
new file mode 100644
index 00000000..426bf22d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[main]songCover.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[main]songSelection1.jpg b/Game/Output/Skins/TODOs/Streetlight/[main]songSelection1.jpg
new file mode 100644
index 00000000..348737ed
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[main]songSelection1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[main]songSelection2.jpg b/Game/Output/Skins/TODOs/Streetlight/[main]songSelection2.jpg
new file mode 100644
index 00000000..ffd3a6ba
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[main]songSelection2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[menu]PopUpBg.JPG b/Game/Output/Skins/TODOs/Streetlight/[menu]PopUpBg.JPG
new file mode 100644
index 00000000..141d740a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[menu]PopUpBg.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[menu]PopUpFg.JPG b/Game/Output/Skins/TODOs/Streetlight/[menu]PopUpFg.JPG
new file mode 100644
index 00000000..9e9c6dea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[menu]PopUpFg.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[menu]jumpToBg.jpg b/Game/Output/Skins/TODOs/Streetlight/[menu]jumpToBg.jpg
new file mode 100644
index 00000000..a8b93e10
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[menu]jumpToBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[menu]songMenuBg.jpg b/Game/Output/Skins/TODOs/Streetlight/[menu]songMenuBg.jpg
new file mode 100644
index 00000000..ef530ef5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[menu]songMenuBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[menu]songMenuSelectBg.jpg b/Game/Output/Skins/TODOs/Streetlight/[menu]songMenuSelectBg.jpg
new file mode 100644
index 00000000..79966f3b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[menu]songMenuSelectBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[party]Joker.jpg b/Game/Output/Skins/TODOs/Streetlight/[party]Joker.jpg
new file mode 100644
index 00000000..e2a18684
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[party]Joker.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[party]playerButton.jpg b/Game/Output/Skins/TODOs/Streetlight/[party]playerButton.jpg
new file mode 100644
index 00000000..15a34c66
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[party]playerButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[party]playerTeamButton.jpg b/Game/Output/Skins/TODOs/Streetlight/[party]playerTeamButton.jpg
new file mode 100644
index 00000000..2faf9c4b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[party]playerTeamButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[party]pointer.bmp b/Game/Output/Skins/TODOs/Streetlight/[party]pointer.bmp
new file mode 100644
index 00000000..88bbcc3d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[party]pointer.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[party]roundBG1.jpg b/Game/Output/Skins/TODOs/Streetlight/[party]roundBG1.jpg
new file mode 100644
index 00000000..464aabea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[party]roundBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[party]roundBG2.jpg b/Game/Output/Skins/TODOs/Streetlight/[party]roundBG2.jpg
new file mode 100644
index 00000000..3413958f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[party]roundBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[party]roundBG3.jpg b/Game/Output/Skins/TODOs/Streetlight/[party]roundBG3.jpg
new file mode 100644
index 00000000..c6b53caf
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[party]roundBG3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[party]roundBG4.jpg b/Game/Output/Skins/TODOs/Streetlight/[party]roundBG4.jpg
new file mode 100644
index 00000000..5e4da0ac
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[party]roundBG4.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[party]roundTeamButton.jpg b/Game/Output/Skins/TODOs/Streetlight/[party]roundTeamButton.jpg
new file mode 100644
index 00000000..692db1bd
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[party]roundTeamButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[party]scoreBG1.jpg b/Game/Output/Skins/TODOs/Streetlight/[party]scoreBG1.jpg
new file mode 100644
index 00000000..f558425d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[party]scoreBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[party]scoreBG2.jpg b/Game/Output/Skins/TODOs/Streetlight/[party]scoreBG2.jpg
new file mode 100644
index 00000000..47239d85
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[party]scoreBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[party]scoreDecoration.jpg b/Game/Output/Skins/TODOs/Streetlight/[party]scoreDecoration.jpg
new file mode 100644
index 00000000..49204e19
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[party]scoreDecoration.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[party]teamPoints.jpg b/Game/Output/Skins/TODOs/Streetlight/[party]teamPoints.jpg
new file mode 100644
index 00000000..96855bc9
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[party]teamPoints.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[party]winDecoration1.jpg b/Game/Output/Skins/TODOs/Streetlight/[party]winDecoration1.jpg
new file mode 100644
index 00000000..0277f529
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[party]winDecoration1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[party]winTeamButton1.jpg b/Game/Output/Skins/TODOs/Streetlight/[party]winTeamButton1.jpg
new file mode 100644
index 00000000..10c8d80f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[party]winTeamButton1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[party]winTeamButton2.jpg b/Game/Output/Skins/TODOs/Streetlight/[party]winTeamButton2.jpg
new file mode 100644
index 00000000..fbd85056
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[party]winTeamButton2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[party]winTeamButton3.jpg b/Game/Output/Skins/TODOs/Streetlight/[party]winTeamButton3.jpg
new file mode 100644
index 00000000..e8dd9566
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[party]winTeamButton3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[score]Line.jpg b/Game/Output/Skins/TODOs/Streetlight/[score]Line.jpg
new file mode 100644
index 00000000..61cf33f5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[score]Line.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[score]box.jpg b/Game/Output/Skins/TODOs/Streetlight/[score]box.jpg
new file mode 100644
index 00000000..b37f7e46
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[score]box.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[score]endcap.jpg b/Game/Output/Skins/TODOs/Streetlight/[score]endcap.jpg
new file mode 100644
index 00000000..0cad98a5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[score]endcap.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[score]level.jpg b/Game/Output/Skins/TODOs/Streetlight/[score]level.jpg
new file mode 100644
index 00000000..9e9c4086
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[score]level.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[score]levelRound.jpg b/Game/Output/Skins/TODOs/Streetlight/[score]levelRound.jpg
new file mode 100644
index 00000000..38cfddea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[score]levelRound.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[sing]LyricsBall.bmp b/Game/Output/Skins/TODOs/Streetlight/[sing]LyricsBall.bmp
new file mode 100644
index 00000000..5b7d7943
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[sing]LyricsBall.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[sing]lineBonusPopUp.jpg b/Game/Output/Skins/TODOs/Streetlight/[sing]lineBonusPopUp.jpg
new file mode 100644
index 00000000..58d93130
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[sing]lineBonusPopUp.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[sing]lyricsHelpBar.bmp b/Game/Output/Skins/TODOs/Streetlight/[sing]lyricsHelpBar.bmp
new file mode 100644
index 00000000..836d3537
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[sing]lyricsHelpBar.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[sing]notesBgLeft.bmp b/Game/Output/Skins/TODOs/Streetlight/[sing]notesBgLeft.bmp
new file mode 100644
index 00000000..776e567c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[sing]notesBgLeft.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[sing]notesBgMid.bmp b/Game/Output/Skins/TODOs/Streetlight/[sing]notesBgMid.bmp
new file mode 100644
index 00000000..759ac8a3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[sing]notesBgMid.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[sing]notesBgRight.bmp b/Game/Output/Skins/TODOs/Streetlight/[sing]notesBgRight.bmp
new file mode 100644
index 00000000..9b1ffc18
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[sing]notesBgRight.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[sing]notesLeft.bmp b/Game/Output/Skins/TODOs/Streetlight/[sing]notesLeft.bmp
new file mode 100644
index 00000000..3d22e5fc
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[sing]notesLeft.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[sing]notesMid.bmp b/Game/Output/Skins/TODOs/Streetlight/[sing]notesMid.bmp
new file mode 100644
index 00000000..2daa66b8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[sing]notesMid.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[sing]notesRight.bmp b/Game/Output/Skins/TODOs/Streetlight/[sing]notesRight.bmp
new file mode 100644
index 00000000..cd936129
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[sing]notesRight.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[sing]p.jpg b/Game/Output/Skins/TODOs/Streetlight/[sing]p.jpg
new file mode 100644
index 00000000..e490fbf4
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[sing]p.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[sing]scoreBg.jpg b/Game/Output/Skins/TODOs/Streetlight/[sing]scoreBg.jpg
new file mode 100644
index 00000000..2bcbedaa
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[sing]scoreBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[sing]singBarBack.jpg b/Game/Output/Skins/TODOs/Streetlight/[sing]singBarBack.jpg
new file mode 100644
index 00000000..d7dcd791
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[sing]singBarBack.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[sing]singBarBar.jpg b/Game/Output/Skins/TODOs/Streetlight/[sing]singBarBar.jpg
new file mode 100644
index 00000000..4fd9bde9
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[sing]singBarBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[sing]singBarFront.jpg b/Game/Output/Skins/TODOs/Streetlight/[sing]singBarFront.jpg
new file mode 100644
index 00000000..eec27b79
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[sing]singBarFront.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[sing]textBar.jpg b/Game/Output/Skins/TODOs/Streetlight/[sing]textBar.jpg
new file mode 100644
index 00000000..596a668a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[sing]textBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[sing]timeBar.jpg b/Game/Output/Skins/TODOs/Streetlight/[sing]timeBar.jpg
new file mode 100644
index 00000000..6e1e42dd
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[sing]timeBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[sing]timeBarBG.jpg b/Game/Output/Skins/TODOs/Streetlight/[sing]timeBarBG.jpg
new file mode 100644
index 00000000..5298a0c5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[sing]timeBarBG.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[special]bar1.jpg b/Game/Output/Skins/TODOs/Streetlight/[special]bar1.jpg
new file mode 100644
index 00000000..487d12eb
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[special]bar1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[special]bar2.jpg b/Game/Output/Skins/TODOs/Streetlight/[special]bar2.jpg
new file mode 100644
index 00000000..1985fb38
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[special]bar2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[stat]detailBG1.jpg b/Game/Output/Skins/TODOs/Streetlight/[stat]detailBG1.jpg
new file mode 100644
index 00000000..120dc483
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[stat]detailBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[stat]mainBG1.jpg b/Game/Output/Skins/TODOs/Streetlight/[stat]mainBG1.jpg
new file mode 100644
index 00000000..a937b24a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[stat]mainBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[stat]mainBG2.jpg b/Game/Output/Skins/TODOs/Streetlight/[stat]mainBG2.jpg
new file mode 100644
index 00000000..201d49b8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[stat]mainBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/[stat]mainBG3.jpg b/Game/Output/Skins/TODOs/Streetlight/[stat]mainBG3.jpg
new file mode 100644
index 00000000..4fb6bc06
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/[stat]mainBG3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/bg-main.jpg b/Game/Output/Skins/TODOs/Streetlight/bg-main.jpg
new file mode 100644
index 00000000..46bf3a02
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/bg-main.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Streetlight/bg-song.jpg b/Game/Output/Skins/TODOs/Streetlight/bg-song.jpg
new file mode 100644
index 00000000..fdbace75
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Streetlight/bg-song.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/Thumbs.db b/Game/Output/Skins/TODOs/Vistar/Thumbs.db
new file mode 100644
index 00000000..06367c20
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/Thumbs.db
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/Vistar.ini b/Game/Output/Skins/TODOs/Vistar/Vistar.ini
new file mode 100644
index 00000000..a5c5bd38
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/Vistar.ini
@@ -0,0 +1,150 @@
+[Skin]
+Theme=Vistar
+Name=Vistar
+Color=Blue
+
+[Textures]
+
+Button = [main]button.jpg
+ButtonF = [main]buttonf.jpg
+MainBar = [main]mainBar.jpg
+SelectBG = [main]selectbg.jpg
+ButtonSolo = [mainbutton]Solo.jpg
+ButtonMulti = [mainbutton]Multi.jpg
+ButtonStats = [mainbutton]Stats.jpg
+ButtonOptions = [mainbutton]Options.jpg
+ButtonExit = [mainbutton]Exit.jpg
+MainButtons = main-buttons.jpg
+
+
+#Backgrounds
+LoadingBG = bg-load.jpg
+MainBG = bg-main.jpg
+SongBG = bg-song.jpg
+ScoreScreenBG = bg-score.jpg
+Top5BG = bg-score.jpg
+OptionsBG = bg-main.jpg
+PartyBG = bg-lite.jpg
+Options2BG = bg-lite.jpg
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu = [icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon = [icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon = [icon]video.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+# # # S O N G S E L E C E T # # #
+SongSelection1 = [main]songSelection1.jpg
+SongSelection2 = [main]songSelection2.jpg
+SongCover = [main]songCover.jpg
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =[party]winDecoration1.jpg
+PartyWinDeco2 =[party]winDecoration1.jpg
+PartyWinDeco3 =[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg \ No newline at end of file
diff --git a/Game/Output/Skins/TODOs/Vistar/[button]13.jpg b/Game/Output/Skins/TODOs/Vistar/[button]13.jpg
new file mode 100644
index 00000000..dd3453b2
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[button]13.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[button]alt.jpg b/Game/Output/Skins/TODOs/Vistar/[button]alt.jpg
new file mode 100644
index 00000000..bb94afa0
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[button]alt.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[button]az.jpg b/Game/Output/Skins/TODOs/Vistar/[button]az.jpg
new file mode 100644
index 00000000..34e02271
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[button]az.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[button]enter.jpg b/Game/Output/Skins/TODOs/Vistar/[button]enter.jpg
new file mode 100644
index 00000000..70ded774
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[button]enter.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[button]esc.jpg b/Game/Output/Skins/TODOs/Vistar/[button]esc.jpg
new file mode 100644
index 00000000..42665788
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[button]esc.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[button]j.jpg b/Game/Output/Skins/TODOs/Vistar/[button]j.jpg
new file mode 100644
index 00000000..0c85dcc8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[button]j.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[button]m.jpg b/Game/Output/Skins/TODOs/Vistar/[button]m.jpg
new file mode 100644
index 00000000..5d55e476
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[button]m.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[button]navi.jpg b/Game/Output/Skins/TODOs/Vistar/[button]navi.jpg
new file mode 100644
index 00000000..387635ac
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[button]navi.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[button]p.jpg b/Game/Output/Skins/TODOs/Vistar/[button]p.jpg
new file mode 100644
index 00000000..d6b4d0c7
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[button]p.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[effect]goldenNoteStar.jpg b/Game/Output/Skins/TODOs/Vistar/[effect]goldenNoteStar.jpg
new file mode 100644
index 00000000..1b31d267
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[effect]goldenNoteStar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[effect]perfectNoteStar.jpg b/Game/Output/Skins/TODOs/Vistar/[effect]perfectNoteStar.jpg
new file mode 100644
index 00000000..189a22a3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[effect]perfectNoteStar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[helper]rectangle.jpg b/Game/Output/Skins/TODOs/Vistar/[helper]rectangle.jpg
new file mode 100644
index 00000000..e03f98fc
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[helper]rectangle.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[icon]cd.jpg b/Game/Output/Skins/TODOs/Vistar/[icon]cd.jpg
new file mode 100644
index 00000000..d48dc4ff
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[icon]cd.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[icon]error.jpg b/Game/Output/Skins/TODOs/Vistar/[icon]error.jpg
new file mode 100644
index 00000000..a5140f0e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[icon]error.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[icon]main.jpg b/Game/Output/Skins/TODOs/Vistar/[icon]main.jpg
new file mode 100644
index 00000000..5941256a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[icon]main.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[icon]options.jpg b/Game/Output/Skins/TODOs/Vistar/[icon]options.jpg
new file mode 100644
index 00000000..278f0adc
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[icon]options.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[icon]party.jpg b/Game/Output/Skins/TODOs/Vistar/[icon]party.jpg
new file mode 100644
index 00000000..2bccd403
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[icon]party.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[icon]question.jpg b/Game/Output/Skins/TODOs/Vistar/[icon]question.jpg
new file mode 100644
index 00000000..029172de
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[icon]question.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[icon]score.jpg b/Game/Output/Skins/TODOs/Vistar/[icon]score.jpg
new file mode 100644
index 00000000..6402fa9a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[icon]score.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[icon]search.jpg b/Game/Output/Skins/TODOs/Vistar/[icon]search.jpg
new file mode 100644
index 00000000..b5870592
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[icon]search.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[icon]songmenu.jpg b/Game/Output/Skins/TODOs/Vistar/[icon]songmenu.jpg
new file mode 100644
index 00000000..35f4b440
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[icon]songmenu.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[icon]stats.jpg b/Game/Output/Skins/TODOs/Vistar/[icon]stats.jpg
new file mode 100644
index 00000000..505a6709
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[icon]stats.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[icon]video.jpg b/Game/Output/Skins/TODOs/Vistar/[icon]video.jpg
new file mode 100644
index 00000000..12d71add
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[icon]video.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[main]button.jpg b/Game/Output/Skins/TODOs/Vistar/[main]button.jpg
new file mode 100644
index 00000000..a810d63c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[main]button.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[main]buttonf.jpg b/Game/Output/Skins/TODOs/Vistar/[main]buttonf.jpg
new file mode 100644
index 00000000..d844add5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[main]buttonf.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[main]mainBar.jpg b/Game/Output/Skins/TODOs/Vistar/[main]mainBar.jpg
new file mode 100644
index 00000000..ad25c801
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[main]mainBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[main]playerNumberBox.jpg b/Game/Output/Skins/TODOs/Vistar/[main]playerNumberBox.jpg
new file mode 100644
index 00000000..53e7964c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[main]playerNumberBox.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[main]selectbg.jpg b/Game/Output/Skins/TODOs/Vistar/[main]selectbg.jpg
new file mode 100644
index 00000000..b42bf1ce
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[main]selectbg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[main]songCover.jpg b/Game/Output/Skins/TODOs/Vistar/[main]songCover.jpg
new file mode 100644
index 00000000..426bf22d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[main]songCover.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[main]songSelection2.jpg b/Game/Output/Skins/TODOs/Vistar/[main]songSelection2.jpg
new file mode 100644
index 00000000..cb3a3396
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[main]songSelection2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[mainbutton]Exit.jpg b/Game/Output/Skins/TODOs/Vistar/[mainbutton]Exit.jpg
new file mode 100644
index 00000000..55494e65
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[mainbutton]Exit.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[mainbutton]Multi.jpg b/Game/Output/Skins/TODOs/Vistar/[mainbutton]Multi.jpg
new file mode 100644
index 00000000..ad5980d7
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[mainbutton]Multi.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[mainbutton]Options.jpg b/Game/Output/Skins/TODOs/Vistar/[mainbutton]Options.jpg
new file mode 100644
index 00000000..5e1bff71
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[mainbutton]Options.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[mainbutton]Solo.jpg b/Game/Output/Skins/TODOs/Vistar/[mainbutton]Solo.jpg
new file mode 100644
index 00000000..a7e3d82a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[mainbutton]Solo.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[mainbutton]Stats.jpg b/Game/Output/Skins/TODOs/Vistar/[mainbutton]Stats.jpg
new file mode 100644
index 00000000..71cc13ad
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[mainbutton]Stats.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[menu]PopUpBg.JPG b/Game/Output/Skins/TODOs/Vistar/[menu]PopUpBg.JPG
new file mode 100644
index 00000000..141d740a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[menu]PopUpBg.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[menu]PopUpFg.JPG b/Game/Output/Skins/TODOs/Vistar/[menu]PopUpFg.JPG
new file mode 100644
index 00000000..9e9c6dea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[menu]PopUpFg.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[menu]jumpToBg.jpg b/Game/Output/Skins/TODOs/Vistar/[menu]jumpToBg.jpg
new file mode 100644
index 00000000..a8b93e10
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[menu]jumpToBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[menu]songMenuBg.jpg b/Game/Output/Skins/TODOs/Vistar/[menu]songMenuBg.jpg
new file mode 100644
index 00000000..ef530ef5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[menu]songMenuBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[menu]songMenuSelectBg.jpg b/Game/Output/Skins/TODOs/Vistar/[menu]songMenuSelectBg.jpg
new file mode 100644
index 00000000..79966f3b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[menu]songMenuSelectBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[party]Joker.jpg b/Game/Output/Skins/TODOs/Vistar/[party]Joker.jpg
new file mode 100644
index 00000000..e2a18684
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[party]Joker.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[party]playerButton.jpg b/Game/Output/Skins/TODOs/Vistar/[party]playerButton.jpg
new file mode 100644
index 00000000..15a34c66
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[party]playerButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[party]playerTeamButton.jpg b/Game/Output/Skins/TODOs/Vistar/[party]playerTeamButton.jpg
new file mode 100644
index 00000000..2faf9c4b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[party]playerTeamButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[party]pointer.bmp b/Game/Output/Skins/TODOs/Vistar/[party]pointer.bmp
new file mode 100644
index 00000000..88bbcc3d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[party]pointer.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[party]roundBG1.jpg b/Game/Output/Skins/TODOs/Vistar/[party]roundBG1.jpg
new file mode 100644
index 00000000..464aabea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[party]roundBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[party]roundBG2.jpg b/Game/Output/Skins/TODOs/Vistar/[party]roundBG2.jpg
new file mode 100644
index 00000000..3413958f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[party]roundBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[party]roundBG3.jpg b/Game/Output/Skins/TODOs/Vistar/[party]roundBG3.jpg
new file mode 100644
index 00000000..c6b53caf
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[party]roundBG3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[party]roundBG4.jpg b/Game/Output/Skins/TODOs/Vistar/[party]roundBG4.jpg
new file mode 100644
index 00000000..5e4da0ac
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[party]roundBG4.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[party]roundTeamButton.jpg b/Game/Output/Skins/TODOs/Vistar/[party]roundTeamButton.jpg
new file mode 100644
index 00000000..692db1bd
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[party]roundTeamButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[party]scoreBG1.jpg b/Game/Output/Skins/TODOs/Vistar/[party]scoreBG1.jpg
new file mode 100644
index 00000000..f558425d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[party]scoreBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[party]scoreBG2.jpg b/Game/Output/Skins/TODOs/Vistar/[party]scoreBG2.jpg
new file mode 100644
index 00000000..47239d85
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[party]scoreBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[party]scoreDecoration.jpg b/Game/Output/Skins/TODOs/Vistar/[party]scoreDecoration.jpg
new file mode 100644
index 00000000..49204e19
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[party]scoreDecoration.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[party]teamPoints.jpg b/Game/Output/Skins/TODOs/Vistar/[party]teamPoints.jpg
new file mode 100644
index 00000000..96855bc9
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[party]teamPoints.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[party]winDecoration1.jpg b/Game/Output/Skins/TODOs/Vistar/[party]winDecoration1.jpg
new file mode 100644
index 00000000..0277f529
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[party]winDecoration1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[party]winTeamButton1.jpg b/Game/Output/Skins/TODOs/Vistar/[party]winTeamButton1.jpg
new file mode 100644
index 00000000..10c8d80f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[party]winTeamButton1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[party]winTeamButton2.jpg b/Game/Output/Skins/TODOs/Vistar/[party]winTeamButton2.jpg
new file mode 100644
index 00000000..fbd85056
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[party]winTeamButton2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[party]winTeamButton3.jpg b/Game/Output/Skins/TODOs/Vistar/[party]winTeamButton3.jpg
new file mode 100644
index 00000000..e8dd9566
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[party]winTeamButton3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[score]Line.jpg b/Game/Output/Skins/TODOs/Vistar/[score]Line.jpg
new file mode 100644
index 00000000..61cf33f5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[score]Line.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[score]box.jpg b/Game/Output/Skins/TODOs/Vistar/[score]box.jpg
new file mode 100644
index 00000000..b37f7e46
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[score]box.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[score]endcap.jpg b/Game/Output/Skins/TODOs/Vistar/[score]endcap.jpg
new file mode 100644
index 00000000..0cad98a5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[score]endcap.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[score]level.jpg b/Game/Output/Skins/TODOs/Vistar/[score]level.jpg
new file mode 100644
index 00000000..9e9c4086
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[score]level.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[score]levelRound.jpg b/Game/Output/Skins/TODOs/Vistar/[score]levelRound.jpg
new file mode 100644
index 00000000..38cfddea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[score]levelRound.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[sing]LyricsBall.bmp b/Game/Output/Skins/TODOs/Vistar/[sing]LyricsBall.bmp
new file mode 100644
index 00000000..5b7d7943
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[sing]LyricsBall.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[sing]lineBonusPopUp.jpg b/Game/Output/Skins/TODOs/Vistar/[sing]lineBonusPopUp.jpg
new file mode 100644
index 00000000..58d93130
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[sing]lineBonusPopUp.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[sing]lyricsHelpBar.bmp b/Game/Output/Skins/TODOs/Vistar/[sing]lyricsHelpBar.bmp
new file mode 100644
index 00000000..836d3537
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[sing]lyricsHelpBar.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[sing]notesBgLeft.bmp b/Game/Output/Skins/TODOs/Vistar/[sing]notesBgLeft.bmp
new file mode 100644
index 00000000..776e567c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[sing]notesBgLeft.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[sing]notesBgMid.bmp b/Game/Output/Skins/TODOs/Vistar/[sing]notesBgMid.bmp
new file mode 100644
index 00000000..759ac8a3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[sing]notesBgMid.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[sing]notesBgRight.bmp b/Game/Output/Skins/TODOs/Vistar/[sing]notesBgRight.bmp
new file mode 100644
index 00000000..9b1ffc18
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[sing]notesBgRight.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[sing]notesLeft.bmp b/Game/Output/Skins/TODOs/Vistar/[sing]notesLeft.bmp
new file mode 100644
index 00000000..3d22e5fc
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[sing]notesLeft.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[sing]notesMid.bmp b/Game/Output/Skins/TODOs/Vistar/[sing]notesMid.bmp
new file mode 100644
index 00000000..2daa66b8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[sing]notesMid.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[sing]notesRight.bmp b/Game/Output/Skins/TODOs/Vistar/[sing]notesRight.bmp
new file mode 100644
index 00000000..cd936129
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[sing]notesRight.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[sing]p.jpg b/Game/Output/Skins/TODOs/Vistar/[sing]p.jpg
new file mode 100644
index 00000000..e490fbf4
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[sing]p.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[sing]scoreBg.jpg b/Game/Output/Skins/TODOs/Vistar/[sing]scoreBg.jpg
new file mode 100644
index 00000000..2bcbedaa
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[sing]scoreBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[sing]singBarBack.jpg b/Game/Output/Skins/TODOs/Vistar/[sing]singBarBack.jpg
new file mode 100644
index 00000000..d7dcd791
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[sing]singBarBack.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[sing]singBarBar.jpg b/Game/Output/Skins/TODOs/Vistar/[sing]singBarBar.jpg
new file mode 100644
index 00000000..4fd9bde9
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[sing]singBarBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[sing]singBarFront.jpg b/Game/Output/Skins/TODOs/Vistar/[sing]singBarFront.jpg
new file mode 100644
index 00000000..eec27b79
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[sing]singBarFront.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[sing]textBar.jpg b/Game/Output/Skins/TODOs/Vistar/[sing]textBar.jpg
new file mode 100644
index 00000000..596a668a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[sing]textBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[sing]timeBar.jpg b/Game/Output/Skins/TODOs/Vistar/[sing]timeBar.jpg
new file mode 100644
index 00000000..6e1e42dd
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[sing]timeBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[sing]timeBar1.jpg b/Game/Output/Skins/TODOs/Vistar/[sing]timeBar1.jpg
new file mode 100644
index 00000000..924a2e9b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[sing]timeBar1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[sing]timeBarBG.jpg b/Game/Output/Skins/TODOs/Vistar/[sing]timeBarBG.jpg
new file mode 100644
index 00000000..5298a0c5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[sing]timeBarBG.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[stat]detailBG1.jpg b/Game/Output/Skins/TODOs/Vistar/[stat]detailBG1.jpg
new file mode 100644
index 00000000..120dc483
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[stat]detailBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[stat]mainBG1.jpg b/Game/Output/Skins/TODOs/Vistar/[stat]mainBG1.jpg
new file mode 100644
index 00000000..a937b24a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[stat]mainBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[stat]mainBG2.jpg b/Game/Output/Skins/TODOs/Vistar/[stat]mainBG2.jpg
new file mode 100644
index 00000000..201d49b8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[stat]mainBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/[stat]mainBG3.jpg b/Game/Output/Skins/TODOs/Vistar/[stat]mainBG3.jpg
new file mode 100644
index 00000000..4fb6bc06
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/[stat]mainBG3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/bg-lite.jpg b/Game/Output/Skins/TODOs/Vistar/bg-lite.jpg
new file mode 100644
index 00000000..c0369a3a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/bg-lite.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/bg-load.jpg b/Game/Output/Skins/TODOs/Vistar/bg-load.jpg
new file mode 100644
index 00000000..c9d60182
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/bg-load.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/bg-main.jpg b/Game/Output/Skins/TODOs/Vistar/bg-main.jpg
new file mode 100644
index 00000000..fb1d41f8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/bg-main.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/bg-score.jpg b/Game/Output/Skins/TODOs/Vistar/bg-score.jpg
new file mode 100644
index 00000000..754d818f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/bg-score.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/bg-song.jpg b/Game/Output/Skins/TODOs/Vistar/bg-song.jpg
new file mode 100644
index 00000000..facd3a87
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/bg-song.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/Vistar/main-buttons.jpg b/Game/Output/Skins/TODOs/Vistar/main-buttons.jpg
new file mode 100644
index 00000000..d96bb4dc
--- /dev/null
+++ b/Game/Output/Skins/TODOs/Vistar/main-buttons.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/Thumbs.db b/Game/Output/Skins/TODOs/White Sensation/Thumbs.db
new file mode 100644
index 00000000..30feb5d2
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/Thumbs.db
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[bg-load]sensation.jpg b/Game/Output/Skins/TODOs/White Sensation/[bg-load]sensation.jpg
new file mode 100644
index 00000000..3aa74d53
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[bg-load]sensation.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[bg-load]simple.jpg b/Game/Output/Skins/TODOs/White Sensation/[bg-load]simple.jpg
new file mode 100644
index 00000000..f85c76e4
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[bg-load]simple.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[bg-main]sensation.jpg b/Game/Output/Skins/TODOs/White Sensation/[bg-main]sensation.jpg
new file mode 100644
index 00000000..1b9dc468
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[bg-main]sensation.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[bg-main]simple.jpg b/Game/Output/Skins/TODOs/White Sensation/[bg-main]simple.jpg
new file mode 100644
index 00000000..63b8ed20
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[bg-main]simple.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[bg-menu]sensation.jpg b/Game/Output/Skins/TODOs/White Sensation/[bg-menu]sensation.jpg
new file mode 100644
index 00000000..e3fbf59c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[bg-menu]sensation.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[bg-menu]simple.jpg b/Game/Output/Skins/TODOs/White Sensation/[bg-menu]simple.jpg
new file mode 100644
index 00000000..6159986f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[bg-menu]simple.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[button]13.jpg b/Game/Output/Skins/TODOs/White Sensation/[button]13.jpg
new file mode 100644
index 00000000..5787bb24
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[button]13.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[button]alt.jpg b/Game/Output/Skins/TODOs/White Sensation/[button]alt.jpg
new file mode 100644
index 00000000..ec3e630f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[button]alt.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[button]az.jpg b/Game/Output/Skins/TODOs/White Sensation/[button]az.jpg
new file mode 100644
index 00000000..b486604e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[button]az.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[button]e.jpg b/Game/Output/Skins/TODOs/White Sensation/[button]e.jpg
new file mode 100644
index 00000000..7b247260
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[button]e.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[button]enter.jpg b/Game/Output/Skins/TODOs/White Sensation/[button]enter.jpg
new file mode 100644
index 00000000..16ee885a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[button]enter.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[button]esc.jpg b/Game/Output/Skins/TODOs/White Sensation/[button]esc.jpg
new file mode 100644
index 00000000..7c40487a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[button]esc.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[button]j.jpg b/Game/Output/Skins/TODOs/White Sensation/[button]j.jpg
new file mode 100644
index 00000000..b6eed56c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[button]j.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[button]m.jpg b/Game/Output/Skins/TODOs/White Sensation/[button]m.jpg
new file mode 100644
index 00000000..ebb7156e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[button]m.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[button]navi.jpg b/Game/Output/Skins/TODOs/White Sensation/[button]navi.jpg
new file mode 100644
index 00000000..41b44525
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[button]navi.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[button]p.jpg b/Game/Output/Skins/TODOs/White Sensation/[button]p.jpg
new file mode 100644
index 00000000..d2d60c02
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[button]p.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[effect]goldenNoteStar.jpg b/Game/Output/Skins/TODOs/White Sensation/[effect]goldenNoteStar.jpg
new file mode 100644
index 00000000..1b31d267
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[effect]goldenNoteStar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[effect]perfectNoteStar.jpg b/Game/Output/Skins/TODOs/White Sensation/[effect]perfectNoteStar.jpg
new file mode 100644
index 00000000..189a22a3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[effect]perfectNoteStar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[helper]buttonFade.jpg b/Game/Output/Skins/TODOs/White Sensation/[helper]buttonFade.jpg
new file mode 100644
index 00000000..6de293f7
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[helper]buttonFade.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[helper]rectangle.jpg b/Game/Output/Skins/TODOs/White Sensation/[helper]rectangle.jpg
new file mode 100644
index 00000000..e03f98fc
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[helper]rectangle.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[icon]cd.jpg b/Game/Output/Skins/TODOs/White Sensation/[icon]cd.jpg
new file mode 100644
index 00000000..387ca788
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[icon]cd.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[icon]error.jpg b/Game/Output/Skins/TODOs/White Sensation/[icon]error.jpg
new file mode 100644
index 00000000..a5140f0e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[icon]error.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[icon]main.jpg b/Game/Output/Skins/TODOs/White Sensation/[icon]main.jpg
new file mode 100644
index 00000000..0d84f860
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[icon]main.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[icon]options.jpg b/Game/Output/Skins/TODOs/White Sensation/[icon]options.jpg
new file mode 100644
index 00000000..6b62bbbd
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[icon]options.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[icon]party.jpg b/Game/Output/Skins/TODOs/White Sensation/[icon]party.jpg
new file mode 100644
index 00000000..ab60d5ce
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[icon]party.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[icon]question.jpg b/Game/Output/Skins/TODOs/White Sensation/[icon]question.jpg
new file mode 100644
index 00000000..029172de
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[icon]question.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[icon]score.jpg b/Game/Output/Skins/TODOs/White Sensation/[icon]score.jpg
new file mode 100644
index 00000000..eb922787
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[icon]score.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[icon]search.jpg b/Game/Output/Skins/TODOs/White Sensation/[icon]search.jpg
new file mode 100644
index 00000000..50d237a3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[icon]search.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[icon]songmenu.jpg b/Game/Output/Skins/TODOs/White Sensation/[icon]songmenu.jpg
new file mode 100644
index 00000000..bb445cf6
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[icon]songmenu.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[icon]stats.jpg b/Game/Output/Skins/TODOs/White Sensation/[icon]stats.jpg
new file mode 100644
index 00000000..44c7556b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[icon]stats.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[icon]video.jpg b/Game/Output/Skins/TODOs/White Sensation/[icon]video.jpg
new file mode 100644
index 00000000..526fcacf
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[icon]video.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[main]Button.jpg b/Game/Output/Skins/TODOs/White Sensation/[main]Button.jpg
new file mode 100644
index 00000000..70ffc038
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[main]Button.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[main]buttonf.jpg b/Game/Output/Skins/TODOs/White Sensation/[main]buttonf.jpg
new file mode 100644
index 00000000..d844add5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[main]buttonf.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[main]mainBar.jpg b/Game/Output/Skins/TODOs/White Sensation/[main]mainBar.jpg
new file mode 100644
index 00000000..14b0d177
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[main]mainBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[main]playerNumberBox.jpg b/Game/Output/Skins/TODOs/White Sensation/[main]playerNumberBox.jpg
new file mode 100644
index 00000000..53e7964c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[main]playerNumberBox.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[main]selectbg.jpg b/Game/Output/Skins/TODOs/White Sensation/[main]selectbg.jpg
new file mode 100644
index 00000000..56f0c095
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[main]selectbg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[main]songCover.jpg b/Game/Output/Skins/TODOs/White Sensation/[main]songCover.jpg
new file mode 100644
index 00000000..426bf22d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[main]songCover.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[main]songSelection1.jpg b/Game/Output/Skins/TODOs/White Sensation/[main]songSelection1.jpg
new file mode 100644
index 00000000..533510cb
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[main]songSelection1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[main]songSelection2.jpg b/Game/Output/Skins/TODOs/White Sensation/[main]songSelection2.jpg
new file mode 100644
index 00000000..cb3a3396
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[main]songSelection2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[menu]PopUpBg.JPG b/Game/Output/Skins/TODOs/White Sensation/[menu]PopUpBg.JPG
new file mode 100644
index 00000000..141d740a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[menu]PopUpBg.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[menu]PopUpFg.JPG b/Game/Output/Skins/TODOs/White Sensation/[menu]PopUpFg.JPG
new file mode 100644
index 00000000..9e9c6dea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[menu]PopUpFg.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[menu]jumpToBg.jpg b/Game/Output/Skins/TODOs/White Sensation/[menu]jumpToBg.jpg
new file mode 100644
index 00000000..a8b93e10
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[menu]jumpToBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[menu]songMenuBg.jpg b/Game/Output/Skins/TODOs/White Sensation/[menu]songMenuBg.jpg
new file mode 100644
index 00000000..ef530ef5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[menu]songMenuBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[menu]songMenuSelectBg.jpg b/Game/Output/Skins/TODOs/White Sensation/[menu]songMenuSelectBg.jpg
new file mode 100644
index 00000000..79966f3b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[menu]songMenuSelectBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[party]Joker.jpg b/Game/Output/Skins/TODOs/White Sensation/[party]Joker.jpg
new file mode 100644
index 00000000..61faba66
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[party]Joker.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[party]playerButton.jpg b/Game/Output/Skins/TODOs/White Sensation/[party]playerButton.jpg
new file mode 100644
index 00000000..15a34c66
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[party]playerButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[party]playerTeamButton.jpg b/Game/Output/Skins/TODOs/White Sensation/[party]playerTeamButton.jpg
new file mode 100644
index 00000000..2faf9c4b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[party]playerTeamButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[party]pointer.bmp b/Game/Output/Skins/TODOs/White Sensation/[party]pointer.bmp
new file mode 100644
index 00000000..88bbcc3d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[party]pointer.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[party]roundBG1.jpg b/Game/Output/Skins/TODOs/White Sensation/[party]roundBG1.jpg
new file mode 100644
index 00000000..464aabea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[party]roundBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[party]roundBG2.jpg b/Game/Output/Skins/TODOs/White Sensation/[party]roundBG2.jpg
new file mode 100644
index 00000000..3413958f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[party]roundBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[party]roundBG3.jpg b/Game/Output/Skins/TODOs/White Sensation/[party]roundBG3.jpg
new file mode 100644
index 00000000..c6b53caf
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[party]roundBG3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[party]roundBG4.jpg b/Game/Output/Skins/TODOs/White Sensation/[party]roundBG4.jpg
new file mode 100644
index 00000000..5e4da0ac
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[party]roundBG4.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[party]roundTeamButton.jpg b/Game/Output/Skins/TODOs/White Sensation/[party]roundTeamButton.jpg
new file mode 100644
index 00000000..692db1bd
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[party]roundTeamButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[party]scoreBG1.jpg b/Game/Output/Skins/TODOs/White Sensation/[party]scoreBG1.jpg
new file mode 100644
index 00000000..f558425d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[party]scoreBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[party]scoreBG2.jpg b/Game/Output/Skins/TODOs/White Sensation/[party]scoreBG2.jpg
new file mode 100644
index 00000000..47239d85
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[party]scoreBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[party]scoreDecoration.jpg b/Game/Output/Skins/TODOs/White Sensation/[party]scoreDecoration.jpg
new file mode 100644
index 00000000..49204e19
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[party]scoreDecoration.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[party]teamPoints.jpg b/Game/Output/Skins/TODOs/White Sensation/[party]teamPoints.jpg
new file mode 100644
index 00000000..96855bc9
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[party]teamPoints.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[party]winDecoration1.jpg b/Game/Output/Skins/TODOs/White Sensation/[party]winDecoration1.jpg
new file mode 100644
index 00000000..0277f529
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[party]winDecoration1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[party]winTeamButton1.jpg b/Game/Output/Skins/TODOs/White Sensation/[party]winTeamButton1.jpg
new file mode 100644
index 00000000..10c8d80f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[party]winTeamButton1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[party]winTeamButton2.jpg b/Game/Output/Skins/TODOs/White Sensation/[party]winTeamButton2.jpg
new file mode 100644
index 00000000..fbd85056
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[party]winTeamButton2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[party]winTeamButton3.jpg b/Game/Output/Skins/TODOs/White Sensation/[party]winTeamButton3.jpg
new file mode 100644
index 00000000..e8dd9566
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[party]winTeamButton3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[score]Line.jpg b/Game/Output/Skins/TODOs/White Sensation/[score]Line.jpg
new file mode 100644
index 00000000..61cf33f5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[score]Line.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[score]box.jpg b/Game/Output/Skins/TODOs/White Sensation/[score]box.jpg
new file mode 100644
index 00000000..b37f7e46
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[score]box.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[score]endcap.jpg b/Game/Output/Skins/TODOs/White Sensation/[score]endcap.jpg
new file mode 100644
index 00000000..0cad98a5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[score]endcap.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[score]level.jpg b/Game/Output/Skins/TODOs/White Sensation/[score]level.jpg
new file mode 100644
index 00000000..9e9c4086
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[score]level.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[score]levelRound.jpg b/Game/Output/Skins/TODOs/White Sensation/[score]levelRound.jpg
new file mode 100644
index 00000000..38cfddea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[score]levelRound.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[sing]LyricsBall.bmp b/Game/Output/Skins/TODOs/White Sensation/[sing]LyricsBall.bmp
new file mode 100644
index 00000000..420b0bb8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[sing]LyricsBall.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[sing]lineBonusPopUp.jpg b/Game/Output/Skins/TODOs/White Sensation/[sing]lineBonusPopUp.jpg
new file mode 100644
index 00000000..58d93130
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[sing]lineBonusPopUp.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[sing]lyricsHelpBar.bmp b/Game/Output/Skins/TODOs/White Sensation/[sing]lyricsHelpBar.bmp
new file mode 100644
index 00000000..87a22b6b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[sing]lyricsHelpBar.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[sing]notesBgLeft.bmp b/Game/Output/Skins/TODOs/White Sensation/[sing]notesBgLeft.bmp
new file mode 100644
index 00000000..776e567c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[sing]notesBgLeft.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[sing]notesBgMid.bmp b/Game/Output/Skins/TODOs/White Sensation/[sing]notesBgMid.bmp
new file mode 100644
index 00000000..759ac8a3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[sing]notesBgMid.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[sing]notesBgRight.bmp b/Game/Output/Skins/TODOs/White Sensation/[sing]notesBgRight.bmp
new file mode 100644
index 00000000..9b1ffc18
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[sing]notesBgRight.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[sing]notesLeft.bmp b/Game/Output/Skins/TODOs/White Sensation/[sing]notesLeft.bmp
new file mode 100644
index 00000000..19c8047c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[sing]notesLeft.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[sing]notesMid.bmp b/Game/Output/Skins/TODOs/White Sensation/[sing]notesMid.bmp
new file mode 100644
index 00000000..db1aa074
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[sing]notesMid.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[sing]notesRight.bmp b/Game/Output/Skins/TODOs/White Sensation/[sing]notesRight.bmp
new file mode 100644
index 00000000..e4646ff0
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[sing]notesRight.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[sing]p.jpg b/Game/Output/Skins/TODOs/White Sensation/[sing]p.jpg
new file mode 100644
index 00000000..5bf3fa97
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[sing]p.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[sing]scoreBg.jpg b/Game/Output/Skins/TODOs/White Sensation/[sing]scoreBg.jpg
new file mode 100644
index 00000000..0a113f70
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[sing]scoreBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[sing]singBarBack.jpg b/Game/Output/Skins/TODOs/White Sensation/[sing]singBarBack.jpg
new file mode 100644
index 00000000..b4d4f445
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[sing]singBarBack.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[sing]singBarBar.jpg b/Game/Output/Skins/TODOs/White Sensation/[sing]singBarBar.jpg
new file mode 100644
index 00000000..b4d4f445
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[sing]singBarBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[sing]singBarFront.jpg b/Game/Output/Skins/TODOs/White Sensation/[sing]singBarFront.jpg
new file mode 100644
index 00000000..4af5eddf
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[sing]singBarFront.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[sing]textBar.jpg b/Game/Output/Skins/TODOs/White Sensation/[sing]textBar.jpg
new file mode 100644
index 00000000..11bf13fe
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[sing]textBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[sing]timeBar.jpg b/Game/Output/Skins/TODOs/White Sensation/[sing]timeBar.jpg
new file mode 100644
index 00000000..80d5fa86
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[sing]timeBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[sing]timeBar1.jpg b/Game/Output/Skins/TODOs/White Sensation/[sing]timeBar1.jpg
new file mode 100644
index 00000000..80d5fa86
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[sing]timeBar1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[sing]timeBarBG.jpg b/Game/Output/Skins/TODOs/White Sensation/[sing]timeBarBG.jpg
new file mode 100644
index 00000000..255a6aef
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[sing]timeBarBG.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[special]bar1.jpg b/Game/Output/Skins/TODOs/White Sensation/[special]bar1.jpg
new file mode 100644
index 00000000..edce886e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[special]bar1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[special]bar2.jpg b/Game/Output/Skins/TODOs/White Sensation/[special]bar2.jpg
new file mode 100644
index 00000000..f8d9d0c8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[special]bar2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[stat]detailBG1.jpg b/Game/Output/Skins/TODOs/White Sensation/[stat]detailBG1.jpg
new file mode 100644
index 00000000..120dc483
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[stat]detailBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[stat]mainBG1.jpg b/Game/Output/Skins/TODOs/White Sensation/[stat]mainBG1.jpg
new file mode 100644
index 00000000..a937b24a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[stat]mainBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[stat]mainBG2.jpg b/Game/Output/Skins/TODOs/White Sensation/[stat]mainBG2.jpg
new file mode 100644
index 00000000..201d49b8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[stat]mainBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/[stat]mainBG3.jpg b/Game/Output/Skins/TODOs/White Sensation/[stat]mainBG3.jpg
new file mode 100644
index 00000000..4fb6bc06
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/[stat]mainBG3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/White Sensation/sensation.ini b/Game/Output/Skins/TODOs/White Sensation/sensation.ini
new file mode 100644
index 00000000..faa9d696
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/sensation.ini
@@ -0,0 +1,155 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=White Sensation
+Name=sensation
+Color=Blue
+
+[Textures]
+
+
+# # # M A I N # # #
+Button = [main]button.jpg
+ButtonF = [main]buttonf.jpg
+MainBar = [main]mainBar.jpg
+SelectBG = [main]selectbg.jpg
+
+#Backgrounds
+LoadingBG = [bg-load]sensation.jpg
+MainBG = [bg-main]sensation.jpg
+SongBG = [bg-main]sensation.jpg
+ScoreScreenBG = [bg-main]sensation.jpg
+Top5BG = [bg-main]sensation.jpg
+OptionsBG = [bg-main]sensation.jpg
+PartyBG = [bg-main]sensation.jpg
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu = [icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon = [icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon = [icon]video.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+# # # S O N G S E L E C E T # # #
+SongSelection1 = [main]songSelection1.jpg
+SongSelection2 = [main]songSelection2.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar (not skinned in this theme :P )
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =x_[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =x_[party]winDecoration1.jpg
+PartyWinDeco2 =x_[party]winDecoration1.jpg
+PartyWinDeco3 =x_[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+Leiste1 = [special]bar1.jpg
+Leiste2 = [special]bar2.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg
+ButtonFade = [helper]buttonFade.jpg
+MainMenuBG=[bg-menu]sensation.jpg
diff --git a/Game/Output/Skins/TODOs/White Sensation/simple.ini b/Game/Output/Skins/TODOs/White Sensation/simple.ini
new file mode 100644
index 00000000..9533b34b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/White Sensation/simple.ini
@@ -0,0 +1,155 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=White Sensation
+Name=simple
+Color=Blue
+
+[Textures]
+
+
+# # # M A I N # # #
+Button = [main]button.jpg
+ButtonF = [main]buttonf.jpg
+MainBar = [main]mainBar.jpg
+SelectBG = [main]selectbg.jpg
+
+#Backgrounds
+LoadingBG = [bg-load]simple.jpg
+MainBG = [bg-main]simple.jpg
+SongBG = [bg-main]simple.jpg
+ScoreScreenBG = [bg-main]simple.jpg
+Top5BG = [bg-main]simple.jpg
+OptionsBG = [bg-main]simple.jpg
+PartyBG = [bg-main]simple.jpg
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu = [icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon = [icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon = [icon]video.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+# # # S O N G S E L E C E T # # #
+SongSelection1 = [main]songSelection1.jpg
+SongSelection2 = [main]songSelection2.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar (not skinned in this theme :P )
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =x_[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =x_[party]winDecoration1.jpg
+PartyWinDeco2 =x_[party]winDecoration1.jpg
+PartyWinDeco3 =x_[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+Leiste1 = [special]bar1.jpg
+Leiste2 = [special]bar2.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg
+ButtonFade = [helper]buttonFade.jpg
+MainMenuBG=[bg-menu]simple.jpg
diff --git a/Game/Output/Skins/TODOs/WiiStar/Thumbs.db b/Game/Output/Skins/TODOs/WiiStar/Thumbs.db
new file mode 100644
index 00000000..7f3d0709
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/Thumbs.db
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/White.ini b/Game/Output/Skins/TODOs/WiiStar/White.ini
new file mode 100644
index 00000000..b158cb64
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/White.ini
@@ -0,0 +1,157 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=WiiStar
+Name=White
+Color=Blue
+
+[Textures]
+
+
+# # # M A I N # # #
+Button =[main]button.jpg
+ButtonF =[main]buttonf.jpg
+MainBar =[main]mainBar.jpg
+SelectBG =[main]selectbg.jpg
+
+#Backgrounds
+LoadingBG =[bg-load]white.jpg
+MainBG =[bg-main]white.JPG
+SongBG =[bg-song]white.JPG
+StatsBG =[bg-stats]white.jpg
+StatsBGDet =[bg-statsdetail]white.jpg
+Top5BG =
+OptionsBG =[bg-options]white.jpg
+OptionsSubBG =[bg-suboptions]white.jpg
+PartyBG =[bg-partyl]white.JPG
+PartySubBG =[bg-subparty]white.JPG
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu =[icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon =[icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon = [icon]video.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+# # # S O N G S E L E C E T # # #
+SongSelection1 = [main]songSelection1.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar (not skinned in this theme :P )
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =x_[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[bg-partyscore2l]white.JPG
+PartyWinDeco1 =x_[party]winDecoration1.jpg
+PartyWinDeco2 =x_[party]winDecoration1.jpg
+PartyWinDeco3 =x_[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+Leiste1 = [special]bar.jpg
+Leiste2 = [special]bar.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle =[helper]rectangle.jpg
+ButtonFade =[helper]buttonFade.jpg
+PartyScoreBG=[bg-partyscorel]white.JPG
diff --git a/Game/Output/Skins/TODOs/WiiStar/[bg-load]white.jpg b/Game/Output/Skins/TODOs/WiiStar/[bg-load]white.jpg
new file mode 100644
index 00000000..6b010644
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[bg-load]white.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[bg-main]white.JPG b/Game/Output/Skins/TODOs/WiiStar/[bg-main]white.JPG
new file mode 100644
index 00000000..53d84e23
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[bg-main]white.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[bg-options]white.jpg b/Game/Output/Skins/TODOs/WiiStar/[bg-options]white.jpg
new file mode 100644
index 00000000..24878d73
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[bg-options]white.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[bg-partyl]white.JPG b/Game/Output/Skins/TODOs/WiiStar/[bg-partyl]white.JPG
new file mode 100644
index 00000000..a2a3e1cc
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[bg-partyl]white.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[bg-partyscore2l]white.JPG b/Game/Output/Skins/TODOs/WiiStar/[bg-partyscore2l]white.JPG
new file mode 100644
index 00000000..881b2000
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[bg-partyscore2l]white.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[bg-partyscorel]white.JPG b/Game/Output/Skins/TODOs/WiiStar/[bg-partyscorel]white.JPG
new file mode 100644
index 00000000..7a34abea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[bg-partyscorel]white.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[bg-song]white.JPG b/Game/Output/Skins/TODOs/WiiStar/[bg-song]white.JPG
new file mode 100644
index 00000000..ada6767b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[bg-song]white.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[bg-stats]white.JPG b/Game/Output/Skins/TODOs/WiiStar/[bg-stats]white.JPG
new file mode 100644
index 00000000..00ed86bf
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[bg-stats]white.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[bg-statsdetail]white.JPG b/Game/Output/Skins/TODOs/WiiStar/[bg-statsdetail]white.JPG
new file mode 100644
index 00000000..6276fe76
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[bg-statsdetail]white.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[bg-suboptions]white.JPG b/Game/Output/Skins/TODOs/WiiStar/[bg-suboptions]white.JPG
new file mode 100644
index 00000000..b1e7c5d9
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[bg-suboptions]white.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[bg-subparty]white.JPG b/Game/Output/Skins/TODOs/WiiStar/[bg-subparty]white.JPG
new file mode 100644
index 00000000..e32a3604
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[bg-subparty]white.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[button]13.jpg b/Game/Output/Skins/TODOs/WiiStar/[button]13.jpg
new file mode 100644
index 00000000..39382d49
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[button]13.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[button]alt.jpg b/Game/Output/Skins/TODOs/WiiStar/[button]alt.jpg
new file mode 100644
index 00000000..2946a86e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[button]alt.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[button]az.jpg b/Game/Output/Skins/TODOs/WiiStar/[button]az.jpg
new file mode 100644
index 00000000..ce5ea3a0
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[button]az.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[button]enter.jpg b/Game/Output/Skins/TODOs/WiiStar/[button]enter.jpg
new file mode 100644
index 00000000..43c23005
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[button]enter.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[button]esc.jpg b/Game/Output/Skins/TODOs/WiiStar/[button]esc.jpg
new file mode 100644
index 00000000..ea893f42
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[button]esc.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[button]j.jpg b/Game/Output/Skins/TODOs/WiiStar/[button]j.jpg
new file mode 100644
index 00000000..0dc9c612
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[button]j.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[button]m.jpg b/Game/Output/Skins/TODOs/WiiStar/[button]m.jpg
new file mode 100644
index 00000000..e909722e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[button]m.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[button]navi.jpg b/Game/Output/Skins/TODOs/WiiStar/[button]navi.jpg
new file mode 100644
index 00000000..152cd7df
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[button]navi.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[button]p.jpg b/Game/Output/Skins/TODOs/WiiStar/[button]p.jpg
new file mode 100644
index 00000000..7f215563
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[button]p.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[effect]goldenNoteStar.jpg b/Game/Output/Skins/TODOs/WiiStar/[effect]goldenNoteStar.jpg
new file mode 100644
index 00000000..1b31d267
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[effect]goldenNoteStar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[effect]perfectNoteStar.jpg b/Game/Output/Skins/TODOs/WiiStar/[effect]perfectNoteStar.jpg
new file mode 100644
index 00000000..189a22a3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[effect]perfectNoteStar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[helper]buttonFade.jpg b/Game/Output/Skins/TODOs/WiiStar/[helper]buttonFade.jpg
new file mode 100644
index 00000000..6de293f7
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[helper]buttonFade.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[helper]rectangle - Kopie.jpg b/Game/Output/Skins/TODOs/WiiStar/[helper]rectangle - Kopie.jpg
new file mode 100644
index 00000000..e03f98fc
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[helper]rectangle - Kopie.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[helper]rectangle.jpg b/Game/Output/Skins/TODOs/WiiStar/[helper]rectangle.jpg
new file mode 100644
index 00000000..4b4344df
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[helper]rectangle.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[icon]cd.jpg b/Game/Output/Skins/TODOs/WiiStar/[icon]cd.jpg
new file mode 100644
index 00000000..d48dc4ff
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[icon]cd.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[icon]error.jpg b/Game/Output/Skins/TODOs/WiiStar/[icon]error.jpg
new file mode 100644
index 00000000..a5140f0e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[icon]error.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[icon]main.jpg b/Game/Output/Skins/TODOs/WiiStar/[icon]main.jpg
new file mode 100644
index 00000000..ff244095
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[icon]main.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[icon]options.jpg b/Game/Output/Skins/TODOs/WiiStar/[icon]options.jpg
new file mode 100644
index 00000000..b0a7654d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[icon]options.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[icon]party.jpg b/Game/Output/Skins/TODOs/WiiStar/[icon]party.jpg
new file mode 100644
index 00000000..c7647509
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[icon]party.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[icon]question.jpg b/Game/Output/Skins/TODOs/WiiStar/[icon]question.jpg
new file mode 100644
index 00000000..029172de
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[icon]question.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[icon]score.jpg b/Game/Output/Skins/TODOs/WiiStar/[icon]score.jpg
new file mode 100644
index 00000000..61ac5228
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[icon]score.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[icon]search.jpg b/Game/Output/Skins/TODOs/WiiStar/[icon]search.jpg
new file mode 100644
index 00000000..b5870592
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[icon]search.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[icon]songmenu.jpg b/Game/Output/Skins/TODOs/WiiStar/[icon]songmenu.jpg
new file mode 100644
index 00000000..c9c9cf84
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[icon]songmenu.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[icon]stats.jpg b/Game/Output/Skins/TODOs/WiiStar/[icon]stats.jpg
new file mode 100644
index 00000000..dc900126
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[icon]stats.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[icon]video.jpg b/Game/Output/Skins/TODOs/WiiStar/[icon]video.jpg
new file mode 100644
index 00000000..12d71add
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[icon]video.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[main]button.jpg b/Game/Output/Skins/TODOs/WiiStar/[main]button.jpg
new file mode 100644
index 00000000..15a34c66
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[main]button.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[main]buttonf.jpg b/Game/Output/Skins/TODOs/WiiStar/[main]buttonf.jpg
new file mode 100644
index 00000000..d844add5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[main]buttonf.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[main]mainBar.jpg b/Game/Output/Skins/TODOs/WiiStar/[main]mainBar.jpg
new file mode 100644
index 00000000..fa4cbd78
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[main]mainBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[main]playerNumberBox.jpg b/Game/Output/Skins/TODOs/WiiStar/[main]playerNumberBox.jpg
new file mode 100644
index 00000000..ed86e92a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[main]playerNumberBox.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[main]selectbg.jpg b/Game/Output/Skins/TODOs/WiiStar/[main]selectbg.jpg
new file mode 100644
index 00000000..98dcb671
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[main]selectbg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[main]songCover.jpg b/Game/Output/Skins/TODOs/WiiStar/[main]songCover.jpg
new file mode 100644
index 00000000..426bf22d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[main]songCover.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[main]songSelection1.jpg b/Game/Output/Skins/TODOs/WiiStar/[main]songSelection1.jpg
new file mode 100644
index 00000000..ad33798b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[main]songSelection1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[main]songSelection2.jpg b/Game/Output/Skins/TODOs/WiiStar/[main]songSelection2.jpg
new file mode 100644
index 00000000..cb3a3396
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[main]songSelection2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[menu]PopUpBg.JPG b/Game/Output/Skins/TODOs/WiiStar/[menu]PopUpBg.JPG
new file mode 100644
index 00000000..141d740a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[menu]PopUpBg.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[menu]PopUpFg.JPG b/Game/Output/Skins/TODOs/WiiStar/[menu]PopUpFg.JPG
new file mode 100644
index 00000000..9e9c6dea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[menu]PopUpFg.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[menu]jumpToBg.jpg b/Game/Output/Skins/TODOs/WiiStar/[menu]jumpToBg.jpg
new file mode 100644
index 00000000..a8b93e10
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[menu]jumpToBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[menu]songMenuBg.jpg b/Game/Output/Skins/TODOs/WiiStar/[menu]songMenuBg.jpg
new file mode 100644
index 00000000..ef530ef5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[menu]songMenuBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[menu]songMenuSelectBg.jpg b/Game/Output/Skins/TODOs/WiiStar/[menu]songMenuSelectBg.jpg
new file mode 100644
index 00000000..79966f3b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[menu]songMenuSelectBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[party]Joker.jpg b/Game/Output/Skins/TODOs/WiiStar/[party]Joker.jpg
new file mode 100644
index 00000000..926f1f0c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[party]Joker.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[party]playerButton.jpg b/Game/Output/Skins/TODOs/WiiStar/[party]playerButton.jpg
new file mode 100644
index 00000000..15a34c66
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[party]playerButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[party]playerTeamButton.jpg b/Game/Output/Skins/TODOs/WiiStar/[party]playerTeamButton.jpg
new file mode 100644
index 00000000..2faf9c4b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[party]playerTeamButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[party]pointer.bmp b/Game/Output/Skins/TODOs/WiiStar/[party]pointer.bmp
new file mode 100644
index 00000000..88bbcc3d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[party]pointer.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[party]roundBG1.jpg b/Game/Output/Skins/TODOs/WiiStar/[party]roundBG1.jpg
new file mode 100644
index 00000000..464aabea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[party]roundBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[party]roundBG2.jpg b/Game/Output/Skins/TODOs/WiiStar/[party]roundBG2.jpg
new file mode 100644
index 00000000..3413958f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[party]roundBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[party]roundBG3.jpg b/Game/Output/Skins/TODOs/WiiStar/[party]roundBG3.jpg
new file mode 100644
index 00000000..c6b53caf
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[party]roundBG3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[party]roundBG4.jpg b/Game/Output/Skins/TODOs/WiiStar/[party]roundBG4.jpg
new file mode 100644
index 00000000..5e4da0ac
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[party]roundBG4.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[party]roundTeamButton.jpg b/Game/Output/Skins/TODOs/WiiStar/[party]roundTeamButton.jpg
new file mode 100644
index 00000000..692db1bd
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[party]roundTeamButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[party]scoreBG1.jpg b/Game/Output/Skins/TODOs/WiiStar/[party]scoreBG1.jpg
new file mode 100644
index 00000000..4b1c1010
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[party]scoreBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[party]scoreBG2.jpg b/Game/Output/Skins/TODOs/WiiStar/[party]scoreBG2.jpg
new file mode 100644
index 00000000..47239d85
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[party]scoreBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[party]scoreDecoration.jpg b/Game/Output/Skins/TODOs/WiiStar/[party]scoreDecoration.jpg
new file mode 100644
index 00000000..49204e19
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[party]scoreDecoration.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[party]teamPoints.jpg b/Game/Output/Skins/TODOs/WiiStar/[party]teamPoints.jpg
new file mode 100644
index 00000000..96855bc9
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[party]teamPoints.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[party]winDecoration1.jpg b/Game/Output/Skins/TODOs/WiiStar/[party]winDecoration1.jpg
new file mode 100644
index 00000000..0277f529
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[party]winDecoration1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[party]winTeamButton1.jpg b/Game/Output/Skins/TODOs/WiiStar/[party]winTeamButton1.jpg
new file mode 100644
index 00000000..10c8d80f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[party]winTeamButton1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[party]winTeamButton2.jpg b/Game/Output/Skins/TODOs/WiiStar/[party]winTeamButton2.jpg
new file mode 100644
index 00000000..fbd85056
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[party]winTeamButton2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[party]winTeamButton3.jpg b/Game/Output/Skins/TODOs/WiiStar/[party]winTeamButton3.jpg
new file mode 100644
index 00000000..e8dd9566
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[party]winTeamButton3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[score]Line.jpg b/Game/Output/Skins/TODOs/WiiStar/[score]Line.jpg
new file mode 100644
index 00000000..61cf33f5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[score]Line.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[score]box.jpg b/Game/Output/Skins/TODOs/WiiStar/[score]box.jpg
new file mode 100644
index 00000000..b37f7e46
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[score]box.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[score]endcap.jpg b/Game/Output/Skins/TODOs/WiiStar/[score]endcap.jpg
new file mode 100644
index 00000000..0cad98a5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[score]endcap.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[score]level.jpg b/Game/Output/Skins/TODOs/WiiStar/[score]level.jpg
new file mode 100644
index 00000000..9e9c4086
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[score]level.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[score]levelRound.jpg b/Game/Output/Skins/TODOs/WiiStar/[score]levelRound.jpg
new file mode 100644
index 00000000..38cfddea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[score]levelRound.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[sing]LyricsBall.bmp b/Game/Output/Skins/TODOs/WiiStar/[sing]LyricsBall.bmp
new file mode 100644
index 00000000..5b7d7943
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[sing]LyricsBall.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[sing]lineBonusPopUp.jpg b/Game/Output/Skins/TODOs/WiiStar/[sing]lineBonusPopUp.jpg
new file mode 100644
index 00000000..58d93130
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[sing]lineBonusPopUp.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[sing]lyricsHelpBar.bmp b/Game/Output/Skins/TODOs/WiiStar/[sing]lyricsHelpBar.bmp
new file mode 100644
index 00000000..87a22b6b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[sing]lyricsHelpBar.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[sing]notesBgLeft.bmp b/Game/Output/Skins/TODOs/WiiStar/[sing]notesBgLeft.bmp
new file mode 100644
index 00000000..776e567c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[sing]notesBgLeft.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[sing]notesBgMid.bmp b/Game/Output/Skins/TODOs/WiiStar/[sing]notesBgMid.bmp
new file mode 100644
index 00000000..759ac8a3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[sing]notesBgMid.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[sing]notesBgRight.bmp b/Game/Output/Skins/TODOs/WiiStar/[sing]notesBgRight.bmp
new file mode 100644
index 00000000..9b1ffc18
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[sing]notesBgRight.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[sing]notesLeft.bmp b/Game/Output/Skins/TODOs/WiiStar/[sing]notesLeft.bmp
new file mode 100644
index 00000000..c819849b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[sing]notesLeft.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[sing]notesMid.bmp b/Game/Output/Skins/TODOs/WiiStar/[sing]notesMid.bmp
new file mode 100644
index 00000000..2fdce32d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[sing]notesMid.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[sing]notesRight.bmp b/Game/Output/Skins/TODOs/WiiStar/[sing]notesRight.bmp
new file mode 100644
index 00000000..3241beeb
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[sing]notesRight.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[sing]p.jpg b/Game/Output/Skins/TODOs/WiiStar/[sing]p.jpg
new file mode 100644
index 00000000..a72d3de0
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[sing]p.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[sing]scoreBg.jpg b/Game/Output/Skins/TODOs/WiiStar/[sing]scoreBg.jpg
new file mode 100644
index 00000000..01d3ca75
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[sing]scoreBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[sing]singBarBack.jpg b/Game/Output/Skins/TODOs/WiiStar/[sing]singBarBack.jpg
new file mode 100644
index 00000000..d7dcd791
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[sing]singBarBack.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[sing]singBarBar.jpg b/Game/Output/Skins/TODOs/WiiStar/[sing]singBarBar.jpg
new file mode 100644
index 00000000..4fd9bde9
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[sing]singBarBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[sing]singBarFront.jpg b/Game/Output/Skins/TODOs/WiiStar/[sing]singBarFront.jpg
new file mode 100644
index 00000000..eec27b79
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[sing]singBarFront.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[sing]textBar.jpg b/Game/Output/Skins/TODOs/WiiStar/[sing]textBar.jpg
new file mode 100644
index 00000000..e2734bce
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[sing]textBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[sing]timeBar.jpg b/Game/Output/Skins/TODOs/WiiStar/[sing]timeBar.jpg
new file mode 100644
index 00000000..e1cc3bf4
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[sing]timeBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[sing]timeBar1.jpg b/Game/Output/Skins/TODOs/WiiStar/[sing]timeBar1.jpg
new file mode 100644
index 00000000..924a2e9b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[sing]timeBar1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[sing]timeBarBG.jpg b/Game/Output/Skins/TODOs/WiiStar/[sing]timeBarBG.jpg
new file mode 100644
index 00000000..e33352d5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[sing]timeBarBG.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[special]bar.jpg b/Game/Output/Skins/TODOs/WiiStar/[special]bar.jpg
new file mode 100644
index 00000000..14d17a59
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[special]bar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[stat]detailBG1.jpg b/Game/Output/Skins/TODOs/WiiStar/[stat]detailBG1.jpg
new file mode 100644
index 00000000..120dc483
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[stat]detailBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[stat]mainBG1.jpg b/Game/Output/Skins/TODOs/WiiStar/[stat]mainBG1.jpg
new file mode 100644
index 00000000..a937b24a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[stat]mainBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[stat]mainBG2.jpg b/Game/Output/Skins/TODOs/WiiStar/[stat]mainBG2.jpg
new file mode 100644
index 00000000..201d49b8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[stat]mainBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/WiiStar/[stat]mainBG3.jpg b/Game/Output/Skins/TODOs/WiiStar/[stat]mainBG3.jpg
new file mode 100644
index 00000000..4fb6bc06
--- /dev/null
+++ b/Game/Output/Skins/TODOs/WiiStar/[stat]mainBG3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/Apple.ini b/Game/Output/Skins/TODOs/iStar/Apple.ini
new file mode 100644
index 00000000..8e4ec192
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/Apple.ini
@@ -0,0 +1,163 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=iStar
+Name=Apple
+Color=Blue
+Author=MezzoX
+
+[Textures]
+
+
+# # # M A I N # # #
+Button =[main]button.jpg
+Buttonmenu1 =[main]buttonmenu1.jpg
+Buttonmenu2 =[main]buttonmenu2.jpg
+Buttonmenu3 =[main]buttonmenu3.jpg
+Buttonmenu4 =[main]buttonmenu4.jpg
+Buttonmenu5 =[main]buttonmenu5.jpg
+ButtonF = [main]buttonf.jpg
+MainBar = [main]mainBar.jpg
+SelectBG = [main]selectbg.jpg
+
+#Backgrounds
+LoadingBG = [bg-load]blue.jpg
+MenuBG = [bg-menu]blue.jpg
+MainBG = [bg-main]blue.jpg
+SongBG =[bg-main]blue.jpg
+ScoreScreenBG =[bg-main]blue.jpg
+Top5BG = [bg-main]blue.jpg
+OptionsBG = [bg-main]blue.jpg
+PartyBG = [bg-main]blue.jpg
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu = [icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon = [icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon =[icon]video.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+# # # S O N G S E L E C E T # # #
+SongSelection = [main]songSelection.jpg
+SongSelection1 = [main]songSelection1.jpg
+SongSelection2 =[main]songSelection2.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar (not skinned in this theme :P )
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =x_[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =x_[party]winDecoration1.jpg
+PartyWinDeco2 =x_[party]winDecoration1.jpg
+PartyWinDeco3 =x_[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter =[button]enter.jpg
+ButtonNavi =[button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+Leiste1 =[special]bar1.jpg
+Leiste2 =[special]bar2.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg
+ButtonFade = [helper]buttonFade.jpg
+ButtonFadeMenu = [helper]buttonFade.jpg
diff --git a/Game/Output/Skins/TODOs/iStar/Thumbs.db b/Game/Output/Skins/TODOs/iStar/Thumbs.db
new file mode 100644
index 00000000..b71ca328
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/Thumbs.db
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[bg-load]blue.jpg b/Game/Output/Skins/TODOs/iStar/[bg-load]blue.jpg
new file mode 100644
index 00000000..4271dbb4
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[bg-load]blue.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[bg-main]blue.jpg b/Game/Output/Skins/TODOs/iStar/[bg-main]blue.jpg
new file mode 100644
index 00000000..47b88365
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[bg-main]blue.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[bg-menu]blue.jpg b/Game/Output/Skins/TODOs/iStar/[bg-menu]blue.jpg
new file mode 100644
index 00000000..424068dc
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[bg-menu]blue.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[button]13.jpg b/Game/Output/Skins/TODOs/iStar/[button]13.jpg
new file mode 100644
index 00000000..47afc1b8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[button]13.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[button]alt.jpg b/Game/Output/Skins/TODOs/iStar/[button]alt.jpg
new file mode 100644
index 00000000..25138146
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[button]alt.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[button]az.jpg b/Game/Output/Skins/TODOs/iStar/[button]az.jpg
new file mode 100644
index 00000000..eee2d9b9
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[button]az.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[button]enter.jpg b/Game/Output/Skins/TODOs/iStar/[button]enter.jpg
new file mode 100644
index 00000000..44f576aa
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[button]enter.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[button]esc.jpg b/Game/Output/Skins/TODOs/iStar/[button]esc.jpg
new file mode 100644
index 00000000..bbac9b5b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[button]esc.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[button]j.jpg b/Game/Output/Skins/TODOs/iStar/[button]j.jpg
new file mode 100644
index 00000000..fbbf5dfe
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[button]j.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[button]m.jpg b/Game/Output/Skins/TODOs/iStar/[button]m.jpg
new file mode 100644
index 00000000..36e79f82
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[button]m.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[button]navi.jpg b/Game/Output/Skins/TODOs/iStar/[button]navi.jpg
new file mode 100644
index 00000000..6871a0bd
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[button]navi.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[button]p.jpg b/Game/Output/Skins/TODOs/iStar/[button]p.jpg
new file mode 100644
index 00000000..5920df93
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[button]p.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[effect]goldenNoteStar.jpg b/Game/Output/Skins/TODOs/iStar/[effect]goldenNoteStar.jpg
new file mode 100644
index 00000000..1b31d267
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[effect]goldenNoteStar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[effect]perfectNoteStar.jpg b/Game/Output/Skins/TODOs/iStar/[effect]perfectNoteStar.jpg
new file mode 100644
index 00000000..189a22a3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[effect]perfectNoteStar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[helper]buttonFade.jpg b/Game/Output/Skins/TODOs/iStar/[helper]buttonFade.jpg
new file mode 100644
index 00000000..748eaa9e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[helper]buttonFade.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[helper]buttonFade2.jpg b/Game/Output/Skins/TODOs/iStar/[helper]buttonFade2.jpg
new file mode 100644
index 00000000..6900f385
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[helper]buttonFade2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[helper]rectangle.jpg b/Game/Output/Skins/TODOs/iStar/[helper]rectangle.jpg
new file mode 100644
index 00000000..e03f98fc
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[helper]rectangle.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[icon]cd.jpg b/Game/Output/Skins/TODOs/iStar/[icon]cd.jpg
new file mode 100644
index 00000000..d48dc4ff
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[icon]cd.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[icon]error.jpg b/Game/Output/Skins/TODOs/iStar/[icon]error.jpg
new file mode 100644
index 00000000..a5140f0e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[icon]error.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[icon]main.jpg b/Game/Output/Skins/TODOs/iStar/[icon]main.jpg
new file mode 100644
index 00000000..5941256a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[icon]main.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[icon]options.jpg b/Game/Output/Skins/TODOs/iStar/[icon]options.jpg
new file mode 100644
index 00000000..278f0adc
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[icon]options.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[icon]party.jpg b/Game/Output/Skins/TODOs/iStar/[icon]party.jpg
new file mode 100644
index 00000000..2bccd403
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[icon]party.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[icon]question.jpg b/Game/Output/Skins/TODOs/iStar/[icon]question.jpg
new file mode 100644
index 00000000..029172de
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[icon]question.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[icon]score.jpg b/Game/Output/Skins/TODOs/iStar/[icon]score.jpg
new file mode 100644
index 00000000..6402fa9a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[icon]score.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[icon]search.jpg b/Game/Output/Skins/TODOs/iStar/[icon]search.jpg
new file mode 100644
index 00000000..b5870592
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[icon]search.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[icon]songmenu.jpg b/Game/Output/Skins/TODOs/iStar/[icon]songmenu.jpg
new file mode 100644
index 00000000..35f4b440
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[icon]songmenu.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[icon]stats.jpg b/Game/Output/Skins/TODOs/iStar/[icon]stats.jpg
new file mode 100644
index 00000000..505a6709
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[icon]stats.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[icon]video.jpg b/Game/Output/Skins/TODOs/iStar/[icon]video.jpg
new file mode 100644
index 00000000..138ef88e
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[icon]video.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[main]button.jpg b/Game/Output/Skins/TODOs/iStar/[main]button.jpg
new file mode 100644
index 00000000..f54d8101
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[main]button.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[main]buttonf.jpg b/Game/Output/Skins/TODOs/iStar/[main]buttonf.jpg
new file mode 100644
index 00000000..d844add5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[main]buttonf.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[main]buttonmenu1.jpg b/Game/Output/Skins/TODOs/iStar/[main]buttonmenu1.jpg
new file mode 100644
index 00000000..45f10509
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[main]buttonmenu1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[main]buttonmenu2.jpg b/Game/Output/Skins/TODOs/iStar/[main]buttonmenu2.jpg
new file mode 100644
index 00000000..33fd80de
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[main]buttonmenu2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[main]buttonmenu3.jpg b/Game/Output/Skins/TODOs/iStar/[main]buttonmenu3.jpg
new file mode 100644
index 00000000..1a24a583
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[main]buttonmenu3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[main]buttonmenu4.jpg b/Game/Output/Skins/TODOs/iStar/[main]buttonmenu4.jpg
new file mode 100644
index 00000000..a8498a49
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[main]buttonmenu4.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[main]buttonmenu5.jpg b/Game/Output/Skins/TODOs/iStar/[main]buttonmenu5.jpg
new file mode 100644
index 00000000..c1c2a6fd
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[main]buttonmenu5.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[main]mainBar.jpg b/Game/Output/Skins/TODOs/iStar/[main]mainBar.jpg
new file mode 100644
index 00000000..fa4cbd78
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[main]mainBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[main]playerNumberBox.jpg b/Game/Output/Skins/TODOs/iStar/[main]playerNumberBox.jpg
new file mode 100644
index 00000000..53e7964c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[main]playerNumberBox.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[main]selectbg.jpg b/Game/Output/Skins/TODOs/iStar/[main]selectbg.jpg
new file mode 100644
index 00000000..98dcb671
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[main]selectbg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[main]songCover.jpg b/Game/Output/Skins/TODOs/iStar/[main]songCover.jpg
new file mode 100644
index 00000000..426bf22d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[main]songCover.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[main]songSelection1.jpg b/Game/Output/Skins/TODOs/iStar/[main]songSelection1.jpg
new file mode 100644
index 00000000..9b2be10c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[main]songSelection1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[main]songSelection2.jpg b/Game/Output/Skins/TODOs/iStar/[main]songSelection2.jpg
new file mode 100644
index 00000000..f790805d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[main]songSelection2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[menu]PopUpBg.JPG b/Game/Output/Skins/TODOs/iStar/[menu]PopUpBg.JPG
new file mode 100644
index 00000000..141d740a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[menu]PopUpBg.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[menu]PopUpFg.JPG b/Game/Output/Skins/TODOs/iStar/[menu]PopUpFg.JPG
new file mode 100644
index 00000000..9e9c6dea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[menu]PopUpFg.JPG
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[menu]jumpToBg.jpg b/Game/Output/Skins/TODOs/iStar/[menu]jumpToBg.jpg
new file mode 100644
index 00000000..a8b93e10
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[menu]jumpToBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[menu]songMenuBg.jpg b/Game/Output/Skins/TODOs/iStar/[menu]songMenuBg.jpg
new file mode 100644
index 00000000..ef530ef5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[menu]songMenuBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[menu]songMenuSelectBg.jpg b/Game/Output/Skins/TODOs/iStar/[menu]songMenuSelectBg.jpg
new file mode 100644
index 00000000..79966f3b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[menu]songMenuSelectBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[party]Joker.jpg b/Game/Output/Skins/TODOs/iStar/[party]Joker.jpg
new file mode 100644
index 00000000..b33f9196
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[party]Joker.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[party]playerButton.jpg b/Game/Output/Skins/TODOs/iStar/[party]playerButton.jpg
new file mode 100644
index 00000000..15a34c66
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[party]playerButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[party]playerTeamButton.jpg b/Game/Output/Skins/TODOs/iStar/[party]playerTeamButton.jpg
new file mode 100644
index 00000000..2faf9c4b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[party]playerTeamButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[party]pointer.bmp b/Game/Output/Skins/TODOs/iStar/[party]pointer.bmp
new file mode 100644
index 00000000..88bbcc3d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[party]pointer.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[party]roundBG1.jpg b/Game/Output/Skins/TODOs/iStar/[party]roundBG1.jpg
new file mode 100644
index 00000000..464aabea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[party]roundBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[party]roundBG2.jpg b/Game/Output/Skins/TODOs/iStar/[party]roundBG2.jpg
new file mode 100644
index 00000000..3413958f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[party]roundBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[party]roundBG3.jpg b/Game/Output/Skins/TODOs/iStar/[party]roundBG3.jpg
new file mode 100644
index 00000000..c6b53caf
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[party]roundBG3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[party]roundBG4.jpg b/Game/Output/Skins/TODOs/iStar/[party]roundBG4.jpg
new file mode 100644
index 00000000..5e4da0ac
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[party]roundBG4.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[party]roundTeamButton.jpg b/Game/Output/Skins/TODOs/iStar/[party]roundTeamButton.jpg
new file mode 100644
index 00000000..692db1bd
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[party]roundTeamButton.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[party]scoreBG1.jpg b/Game/Output/Skins/TODOs/iStar/[party]scoreBG1.jpg
new file mode 100644
index 00000000..f558425d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[party]scoreBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[party]scoreBG2.jpg b/Game/Output/Skins/TODOs/iStar/[party]scoreBG2.jpg
new file mode 100644
index 00000000..47239d85
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[party]scoreBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[party]scoreDecoration.jpg b/Game/Output/Skins/TODOs/iStar/[party]scoreDecoration.jpg
new file mode 100644
index 00000000..49204e19
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[party]scoreDecoration.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[party]teamPoints.jpg b/Game/Output/Skins/TODOs/iStar/[party]teamPoints.jpg
new file mode 100644
index 00000000..96855bc9
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[party]teamPoints.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[party]winDecoration1.jpg b/Game/Output/Skins/TODOs/iStar/[party]winDecoration1.jpg
new file mode 100644
index 00000000..0277f529
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[party]winDecoration1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[party]winTeamButton1.jpg b/Game/Output/Skins/TODOs/iStar/[party]winTeamButton1.jpg
new file mode 100644
index 00000000..10c8d80f
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[party]winTeamButton1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[party]winTeamButton2.jpg b/Game/Output/Skins/TODOs/iStar/[party]winTeamButton2.jpg
new file mode 100644
index 00000000..fbd85056
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[party]winTeamButton2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[party]winTeamButton3.jpg b/Game/Output/Skins/TODOs/iStar/[party]winTeamButton3.jpg
new file mode 100644
index 00000000..e8dd9566
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[party]winTeamButton3.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[score]Line.jpg b/Game/Output/Skins/TODOs/iStar/[score]Line.jpg
new file mode 100644
index 00000000..61cf33f5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[score]Line.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[score]box.jpg b/Game/Output/Skins/TODOs/iStar/[score]box.jpg
new file mode 100644
index 00000000..b37f7e46
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[score]box.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[score]endcap.jpg b/Game/Output/Skins/TODOs/iStar/[score]endcap.jpg
new file mode 100644
index 00000000..0cad98a5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[score]endcap.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[score]level.jpg b/Game/Output/Skins/TODOs/iStar/[score]level.jpg
new file mode 100644
index 00000000..9e9c4086
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[score]level.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[score]levelRound.jpg b/Game/Output/Skins/TODOs/iStar/[score]levelRound.jpg
new file mode 100644
index 00000000..38cfddea
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[score]levelRound.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[sing]LyricsBall.bmp b/Game/Output/Skins/TODOs/iStar/[sing]LyricsBall.bmp
new file mode 100644
index 00000000..5b7d7943
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[sing]LyricsBall.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[sing]lineBonusPopUp.jpg b/Game/Output/Skins/TODOs/iStar/[sing]lineBonusPopUp.jpg
new file mode 100644
index 00000000..58d93130
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[sing]lineBonusPopUp.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[sing]lyricsHelpBar.bmp b/Game/Output/Skins/TODOs/iStar/[sing]lyricsHelpBar.bmp
new file mode 100644
index 00000000..87a22b6b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[sing]lyricsHelpBar.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[sing]notesBgLeft.bmp b/Game/Output/Skins/TODOs/iStar/[sing]notesBgLeft.bmp
new file mode 100644
index 00000000..776e567c
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[sing]notesBgLeft.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[sing]notesBgMid.bmp b/Game/Output/Skins/TODOs/iStar/[sing]notesBgMid.bmp
new file mode 100644
index 00000000..759ac8a3
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[sing]notesBgMid.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[sing]notesBgRight.bmp b/Game/Output/Skins/TODOs/iStar/[sing]notesBgRight.bmp
new file mode 100644
index 00000000..9b1ffc18
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[sing]notesBgRight.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[sing]notesLeft.bmp b/Game/Output/Skins/TODOs/iStar/[sing]notesLeft.bmp
new file mode 100644
index 00000000..c819849b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[sing]notesLeft.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[sing]notesMid.bmp b/Game/Output/Skins/TODOs/iStar/[sing]notesMid.bmp
new file mode 100644
index 00000000..2fdce32d
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[sing]notesMid.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[sing]notesRight.bmp b/Game/Output/Skins/TODOs/iStar/[sing]notesRight.bmp
new file mode 100644
index 00000000..3241beeb
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[sing]notesRight.bmp
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[sing]p.jpg b/Game/Output/Skins/TODOs/iStar/[sing]p.jpg
new file mode 100644
index 00000000..e490fbf4
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[sing]p.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[sing]scoreBg.jpg b/Game/Output/Skins/TODOs/iStar/[sing]scoreBg.jpg
new file mode 100644
index 00000000..2bcbedaa
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[sing]scoreBg.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[sing]singBarBack.jpg b/Game/Output/Skins/TODOs/iStar/[sing]singBarBack.jpg
new file mode 100644
index 00000000..d7dcd791
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[sing]singBarBack.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[sing]singBarBar.jpg b/Game/Output/Skins/TODOs/iStar/[sing]singBarBar.jpg
new file mode 100644
index 00000000..4fd9bde9
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[sing]singBarBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[sing]singBarFront.jpg b/Game/Output/Skins/TODOs/iStar/[sing]singBarFront.jpg
new file mode 100644
index 00000000..eec27b79
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[sing]singBarFront.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[sing]textBar.jpg b/Game/Output/Skins/TODOs/iStar/[sing]textBar.jpg
new file mode 100644
index 00000000..1f5056ce
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[sing]textBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[sing]timeBar.jpg b/Game/Output/Skins/TODOs/iStar/[sing]timeBar.jpg
new file mode 100644
index 00000000..6e1e42dd
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[sing]timeBar.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[sing]timeBar1.jpg b/Game/Output/Skins/TODOs/iStar/[sing]timeBar1.jpg
new file mode 100644
index 00000000..924a2e9b
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[sing]timeBar1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[sing]timeBarBG.jpg b/Game/Output/Skins/TODOs/iStar/[sing]timeBarBG.jpg
new file mode 100644
index 00000000..5298a0c5
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[sing]timeBarBG.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[special]bar1.jpg b/Game/Output/Skins/TODOs/iStar/[special]bar1.jpg
new file mode 100644
index 00000000..8286d3c6
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[special]bar1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[special]bar2.jpg b/Game/Output/Skins/TODOs/iStar/[special]bar2.jpg
new file mode 100644
index 00000000..e66cc2d2
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[special]bar2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[stat]detailBG1.jpg b/Game/Output/Skins/TODOs/iStar/[stat]detailBG1.jpg
new file mode 100644
index 00000000..120dc483
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[stat]detailBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[stat]mainBG1.jpg b/Game/Output/Skins/TODOs/iStar/[stat]mainBG1.jpg
new file mode 100644
index 00000000..a937b24a
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[stat]mainBG1.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[stat]mainBG2.jpg b/Game/Output/Skins/TODOs/iStar/[stat]mainBG2.jpg
new file mode 100644
index 00000000..201d49b8
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[stat]mainBG2.jpg
Binary files differ
diff --git a/Game/Output/Skins/TODOs/iStar/[stat]mainBG3.jpg b/Game/Output/Skins/TODOs/iStar/[stat]mainBG3.jpg
new file mode 100644
index 00000000..4fb6bc06
--- /dev/null
+++ b/Game/Output/Skins/TODOs/iStar/[stat]mainBG3.jpg
Binary files differ
diff --git a/Game/Output/Sounds/Applause.mp3 b/Game/Output/Sounds/Applause.mp3
new file mode 100644
index 00000000..ba957a68
--- /dev/null
+++ b/Game/Output/Sounds/Applause.mp3
Binary files differ
diff --git a/Game/Output/Sounds/Common back.mp3 b/Game/Output/Sounds/Common back.mp3
new file mode 100644
index 00000000..34354740
--- /dev/null
+++ b/Game/Output/Sounds/Common back.mp3
Binary files differ
diff --git a/Game/Output/Sounds/Common start.mp3 b/Game/Output/Sounds/Common start.mp3
new file mode 100644
index 00000000..34354740
--- /dev/null
+++ b/Game/Output/Sounds/Common start.mp3
Binary files differ
diff --git a/Game/Output/Sounds/PLUGIN_HauDenLukas_Bell.mp3 b/Game/Output/Sounds/PLUGIN_HauDenLukas_Bell.mp3
new file mode 100644
index 00000000..54338513
--- /dev/null
+++ b/Game/Output/Sounds/PLUGIN_HauDenLukas_Bell.mp3
Binary files differ
diff --git a/Game/Output/Sounds/credits-outro-tune.mp3 b/Game/Output/Sounds/credits-outro-tune.mp3
new file mode 100644
index 00000000..fc23561c
--- /dev/null
+++ b/Game/Output/Sounds/credits-outro-tune.mp3
Binary files differ
diff --git a/Game/Output/Sounds/dismissed.mp3 b/Game/Output/Sounds/dismissed.mp3
new file mode 100644
index 00000000..f478e7a3
--- /dev/null
+++ b/Game/Output/Sounds/dismissed.mp3
Binary files differ
diff --git a/Game/Output/Sounds/menu swoosh.mp3 b/Game/Output/Sounds/menu swoosh.mp3
new file mode 100644
index 00000000..1025a86f
--- /dev/null
+++ b/Game/Output/Sounds/menu swoosh.mp3
Binary files differ
diff --git a/Game/Output/Sounds/option change col.mp3 b/Game/Output/Sounds/option change col.mp3
new file mode 100644
index 00000000..c2fcb43b
--- /dev/null
+++ b/Game/Output/Sounds/option change col.mp3
Binary files differ
diff --git a/Game/Output/Sounds/rimshot022b.mp3 b/Game/Output/Sounds/rimshot022b.mp3
new file mode 100644
index 00000000..9f49bab4
--- /dev/null
+++ b/Game/Output/Sounds/rimshot022b.mp3
Binary files differ
diff --git a/Game/Output/Sounds/select music change music 50.mp3 b/Game/Output/Sounds/select music change music 50.mp3
new file mode 100644
index 00000000..ade19a70
--- /dev/null
+++ b/Game/Output/Sounds/select music change music 50.mp3
Binary files differ
diff --git a/Game/Output/Sounds/select music change music.mp3 b/Game/Output/Sounds/select music change music.mp3
new file mode 100644
index 00000000..86a7218d
--- /dev/null
+++ b/Game/Output/Sounds/select music change music.mp3
Binary files differ
diff --git a/Game/Output/Sounds/wome-credits-tune.mp3 b/Game/Output/Sounds/wome-credits-tune.mp3
new file mode 100644
index 00000000..564e8d6f
--- /dev/null
+++ b/Game/Output/Sounds/wome-credits-tune.mp3
Binary files differ
diff --git a/Game/Output/Themes/Deluxe.ini b/Game/Output/Themes/Deluxe.ini
new file mode 100644
index 00000000..79af8fd4
--- /dev/null
+++ b/Game/Output/Themes/Deluxe.ini
@@ -0,0 +1,10278 @@
+;1.0.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Theme]
+Name=Deluxe
+Creator=Ultrastar Deluxe Team
+
+[Colors]
+White = 255 255 255
+LightBlue = 119 187 210
+DarkBlue = 28 126 171
+LightRed = 170 146 146
+DarkRed = 155 113 113
+LightGreen = 136 168 136
+DarkGreen = 106 152 104
+LightPurple = 155 136 168
+DarkPurple = 145 104 152
+LightOrange = 168 155 136
+DarkOrange = 151 131 76
+LightYellow = 168 168 136
+DarkYellow = 150 151 76
+Turkis = 13 186 167
+GrayLightest = 223 223 223
+GrayLight = 191 191 191
+Gray = 127 127 127
+GrayDark = 63 63 63
+Black = 0 0 0
+GrayPopup = 51 51 51
+Gold = 255 223 31
+Silver = 223 223 223
+Bronze = 205 127 50
+
+[Loading]
+Texts =2
+Fade = 1
+
+[LoadingBackground]
+Tex=LoadingBG
+
+[LoadingText1]
+X =30
+Y =552
+Color =Black
+Font =0
+Align =0
+Size =7
+Text =SING_LOADING
+
+[LoadingText2]
+X =790
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=US_VERSION
+
+[Song]
+Texts =3
+
+[SongBackground]
+Tex=SongBG
+
+[SongCover]
+X=303
+Y=125
+W=320
+H=190
+Style=5
+Reflections=1
+
+[SongEqualizer]
+Visible=1
+Direction=1
+Color=White
+Alpha=1
+X=255
+Y=514
+Z=1
+PieceW=6
+PieceH=6
+Space=1
+Bands=6
+Length=18
+
+[SongVideoIcon]
+X =299
+Y =487
+W =32
+H =32
+Z=1
+Color=White
+Tex =VideoIcon
+Type=Font Black
+
+[SongStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[SongStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[SongStatic3]
+X =250
+Y =120
+W =300
+H =200
+Z =0.5
+Color =ColorDark
+Tex =SongSelection1
+Type=Font Black
+
+[SongStatic4]
+X =298
+Y =320
+W =200
+H =200
+Z=0.98
+Color =ColorDark
+Tex =SongSelection2
+Type=Font Black
+
+[SongTextCat]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_SONG_SELECTION_DESC
+
+[SongTextArtist]
+X =400
+Y =320
+W = 190
+Color=White
+Font =1
+Size =9
+Align =1
+Text=
+
+[SongTextTitle]
+X =400
+Y =395
+W = 190
+Color=White
+Font =0
+Size =9
+Align =1
+Text=
+
+[SongTextNumber]
+X =490
+Y =495
+Color=White
+Font =0
+Size =8
+Align =2
+Text=
+
+#Variable statics and texts for song-screen in sing- and partymode
+# There can be an unlimited Number of Statics and Texts, As long
+# as the numbers are in order.
+# Statics that are shown in PartyMode Only are Named_
+# SongStaticParty[No]
+# Texts that are shown in PartyMode Only are Named_
+# SongTextParty[No]
+# Statics that are shown in Normal Mode Only are Named_
+# SongStaticNonParty[No]
+# Texts that are shown in Normal Mode Only are Named_
+# SongTextNonParty[No]
+#Here are the ones for singmode
+
+[SongStaticNonParty1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =SongCD
+Type=Font Black
+
+[SongStaticNonParty2]
+X =260
+Y =553
+W =26
+H =22
+Tex=ButtonAlt
+Color =White
+Type=Plain
+
+[SongStaticNonParty3]
+X =300
+Y =553
+W =26
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Plain
+
+[SongStaticNonParty4]
+X =425
+Y =553
+W =22
+H =22
+Tex=ButtonM
+Color =White
+Type=Plain
+
+[SongStaticNonParty5]
+X =515
+Y =553
+W =22
+H =22
+Tex=ButtonJ
+Color =White
+Type=Plain
+
+[SongStaticNonParty6]
+X =679
+Y =553
+W =22
+H =22
+Tex=ButtonP
+Color =White
+Type=Plain
+
+#Texts Non Party
+[SongTextNonParty1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_SONG_SELECTION
+Align=0
+
+[SongTextNonParty2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_SONG_SELECTION_WHEREAMI
+
+[SongTextNonParty3]
+X =288
+Y =556
+Color=Black
+Font =1
+Size =5
+Align=0
+Text=+
+
+[SongTextNonParty4]
+X =330
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_GOTO
+
+[SongTextNonParty5]
+X =450
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_MENU
+
+[SongTextNonParty6]
+X =540
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SONG_JUMPTO_DESC
+
+[SongTextNonParty7]
+X =705
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_PLAYLIST
+
+
+#and theese are the ones for partymode
+
+[SongStaticParty1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[SongStaticParty2]
+X =260
+Y =553
+W =26
+H =22
+Tex=Button13
+Color =White
+Type=Plain
+
+[SongStaticParty3]
+X =400
+Y =553
+W =22
+H =22
+Tex=ButtonM
+Color =White
+Type=Plain
+
+[SongStaticParty4]
+X =540
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+#Texts for Party Mode
+
+[SongTextParty1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[SongTextParty2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_SONG_WHEREAMI
+
+[SongTextParty3]
+X =288
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SONG_MENU_NAME_PARTY_JOKER
+
+[SongTextParty4]
+X =426
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_MENU
+
+[SongTextParty5]
+X =570
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_LEGEND_CONTINUE
+
+#variable statics end
+
+
+# Jokers, 5 for each team, only shown in party Mode
+[SongStaticTeam1Joker1]
+Tex =Joker
+X =530
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker2]
+Tex =Joker
+X =580
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker3]
+Tex =Joker
+X =630
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker4]
+Tex =Joker
+X =680
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker5]
+Tex =Joker
+X =730
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker1]
+Tex =Joker
+X =530
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker2]
+Tex =Joker
+X =580
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker3]
+Tex =Joker
+X =630
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker4]
+Tex =Joker
+X =680
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker5]
+Tex =Joker
+X =730
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker1]
+Tex =Joker
+X =530
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker2]
+Tex =Joker
+X =580
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker3]
+Tex =Joker
+X =630
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker4]
+Tex =Joker
+X =680
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker5]
+Tex =Joker
+X =730
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+
+[Sing]
+Texts =1
+
+;not used for this skin
+;[SingText1]
+;Text =SING_TIME
+;X =90
+;Y =200
+;Font =1
+;Size =6
+;Color =White
+;Align=1
+
+[SingStatic1]
+;TextBG
+Tex =LyricBar
+X =10
+Y =490
+W =780
+H =85
+Color =GrayLightest
+Type=Font Black
+
+[SingStatic2]
+;TimeBar
+Tex =TimeBar1
+X =10
+Y =577
+W =780
+H =16
+Color =Black
+Type=Font Black
+
+[SingTimeProgress]
+X =20
+Y =581
+W =700
+H =7
+Color=White
+
+[SingStatic3]
+;the thing behind the time progress
+Tex =TimeBar2
+X =20
+Y =581
+W =700
+H =7
+Color=GrayLightest
+Type=Font Black
+
+[SingTimeText]
+Text =SING_TIME
+X =750
+Y =576
+Font =1
+Size =6
+Color =White
+Align=1
+
+# O N E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#PlayerOne
+[SingP1Static]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1Text]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1Static2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1SingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T W O P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1TwoPStatic]
+Tex =P
+X =20
+Y =117
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPText]
+Text =P1
+X =26
+Y =122
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1TwoPStatic2]
+Tex =ScoreBG
+X =680
+Y =102
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPTextScore]
+Text =00000
+X =690
+Y =104
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1TwoPSingBar]
+X =680
+Y =136
+W =100
+H =8
+
+#Player Two
+[SingP2RStatic]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P2Dark
+Type=Transparent
+
+[SingP2RText]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP2RStatic2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2RTextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2RSingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T H R E E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1ThreePStatic]
+Tex =P
+X =16
+Y =59
+W =50
+H =54
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePText]
+Text =P1
+X =27
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP1ThreePStatic2]
+Tex =ScoreBG
+X =75
+Y =61
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePTextScore]
+Text =00000
+X =85
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1ThreePSingBar]
+X =75
+Y =95
+W =100
+H =8
+
+#Player Two
+[SingP2MStatic]
+Tex =P
+X =311
+Y =59
+W =50
+H =54
+Color =P2Dark
+Type=Transparent
+
+[SingP2MText]
+Text =P2
+X =321
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP2MStatic2]
+Tex =ScoreBG
+X =370
+Y =61
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2MTextScore]
+Text =00000
+X =380
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2MSingBar]
+X =370
+Y =95
+W =100
+H =8
+
+#Player Three
+[SingP3RStatic]
+Tex =P
+X =611
+Y =59
+W =50
+H =54
+Color =P3Dark
+Type=Transparent
+
+[SingP3RText]
+Text =P3
+X =621
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP3RStatic2]
+Tex =ScoreBG
+X =670
+Y =61
+W =100
+H =34
+Color =P3Dark
+Type=Transparent
+
+[SingP3RTextScore]
+Text =00000
+X =680
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP3SingBar]
+X =670
+Y =95
+W =100
+H =8
+
+[Score]
+Texts =1
+
+[ScoreBackground]
+Tex=ScoreScreenBG
+
+[ScoreText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SONG_SCORE
+Align=0
+
+[ScoreTextArtistTitle]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=ArtistTitle
+
+[ScoreStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[ScoreStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SONG_SCORE_WHEREAMI
+
+[ScoreStatic4]
+X =260
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[ScoreText3]
+X =290
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+#end of main stuff
+
+# # # # # # # # # # # # # # # # # # One Player Score # # # # # # # # # # # #
+[ScoreTextName1]
+X =175
+Y =260
+Font =0
+Size =14
+Text =P1
+Color =White
+Align=0
+
+[ScoreTextScore1]
+X =175
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes1]
+X =175
+Y =340
+Color=White
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore1]
+X =465
+Y =340
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextLineBonus1]
+X =175
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore1]
+X =465
+Y =370
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextGoldenNotes1]
+X =175
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore1]
+X =465
+Y =400
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextTotal1]
+X =205
+Y =460
+Color=White
+Font =0
+Size =14
+Text=SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore1]
+X =465
+Y =460
+Color=White
+Font =0
+Size =14
+Align =2
+Text =0
+
+#Lines
+[ScorePlayer1Static1]
+Tex =ScoreLine
+X =173
+Y =338
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static2]
+Tex =ScoreLine
+X =173
+Y =368
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static3]
+Tex =ScoreLine
+X =173
+Y =398
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static4]
+Tex =ScoreLine
+X =173
+Y =428
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static5]
+Tex =ScoreLine
+X =173
+Y =458
+W =295
+H =4
+Type =Font Black
+Color =White
+
+[ScoreStaticBoxDark1]
+Tex =PlayerNumberBox
+X =175
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Text1]
+X =179
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel1]
+Tex =ScoreLevel
+X =475
+Y =160
+W =150
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =130
+W =150
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel1]
+Tex =ScoreLevel
+X =475
+Y =410
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =380
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer1Static6]
+Tex =ScoreEndCap
+X =494
+Y =460
+W =112
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Static7]
+Tex =ScoreLine
+X =493
+Y =460
+W =114
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+
+# # # # # # # # # # # # # # # # # # Two Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName2]
+X =20
+Y =260
+Font =0
+Size =14
+Text =P1
+Color =White
+Align=0
+
+[ScoreTextScore2]
+X =20
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes2]
+X =20
+Y =340
+Color=White
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore2]
+X =300
+Y =340
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextLineBonus2]
+X =20
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore2]
+X =300
+Y =370
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextGoldenNotes2]
+X =20
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore2]
+X =300
+Y =400
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextTotal2]
+X =50
+Y =460
+Color=White
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore2]
+X =300
+Y =460
+Color=White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+# Lines
+[ScorePlayer2Static1]
+Tex =ScoreLine
+X =20
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static2]
+Tex =ScoreLine
+X =20
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static3]
+Tex =ScoreLine
+X =20
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static4]
+Tex =ScoreLine
+X =20
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static5]
+Tex =ScoreLine
+X =20
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =White
+
+[ScoreStaticBoxDark2]
+Tex =PlayerNumberBox
+X =20
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Text1]
+X =24
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel2]
+Tex =ScoreLevel
+X =293
+Y =160
+W =120
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =130
+W =120
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScoreStaticLevel2]
+Tex =ScoreLevel
+X =293
+Y =410
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =380
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScorePlayer2Static6]
+Tex =ScoreEndCap
+X =308
+Y =460
+W =90
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Static7]
+Tex =ScoreLine
+X =307
+Y =460
+W =92
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# P L A Y E R T W O
+[ScoreTextName3]
+X =780
+Y =260
+Font =0
+Size =14
+Text =P2
+Color =White
+Align=2
+
+[ScoreTextScore3]
+X =780
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=2
+
+[ScoreTextNotes3]
+X =780
+Y =340
+Color=White
+Font =0
+Size =9
+Text =SING_NOTES
+Align=2
+
+[ScoreTextNotesScore3]
+X =500
+Y =340
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextLineBonus3]
+X =780
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=2
+
+[ScoreTextLineBonusScore3]
+X =500
+Y =370
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextGoldenNotes3]
+X =780
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=2
+
+[ScoreTextGoldenNotesScore3]
+X =500
+Y =400
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextTotal3]
+X =750
+Y =460
+Color=White
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=2
+Reflection=1
+ReflectionSpacing=4
+
+[ScoreTextTotalScore3]
+X =500
+Y =460
+Color=White
+Font =0
+Size =14
+Align =0
+Text =00000
+Reflection=1
+ReflectionSpacing=4
+
+#Lines
+[ScorePlayer3Static1]
+Tex =ScoreLine
+X =500
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static2]
+Tex =ScoreLine
+X =500
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static3]
+Tex =ScoreLine
+X =500
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static4]
+Tex =ScoreLine
+X =500
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static5]
+Tex =ScoreLine
+X =500
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =White
+
+[ScoreStaticBoxDark3]
+Tex =PlayerNumberBox
+X =755
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Text1]
+X =759
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+#ScoreBar
+[ScoreStaticBackLevel3]
+Tex =ScoreLevel
+X =387
+Y =160
+W =120
+H =300
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =130
+W =120
+H =30
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel3]
+Tex =ScoreLevel
+X =387
+Y =410
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =380
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScorePlayer3Static6]
+Tex =ScoreEndCap
+X =402
+Y =460
+W =90
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Static7]
+Tex =ScoreLine
+X =401
+Y =460
+W =92
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# # # # # # # # # # # # # # # # # # Three Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName4]
+X=20
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P1
+Color=P1Dark
+
+[ScoreTextNotes4]
+X=20
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore4]
+X=260
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus4]
+X=20
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore4]
+X=260
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes4]
+X=20
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore4]
+X=260
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore4]
+X=20
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal4]
+X=47
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore4]
+X=260
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark4]
+Tex =PlayerNumberBox
+X =20
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer4Text1]
+X =24
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#lines
+[ScorePlayer4Static1]
+X=20
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static2]
+X=20
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static3]
+X=20
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static4]
+X=20
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static5]
+X=20
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+# P L A Y E R T W O
+[ScoreTextName5]
+X=280
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P2
+Color=P2Dark
+
+[ScoreTextNotes5]
+X=280
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore5]
+X=520
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus5]
+X=280
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore5]
+X=520
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes5]
+X=280
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore5]
+X=520
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore5]
+X=280
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal5]
+X=307
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore5]
+X=520
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark5]
+Tex =PlayerNumberBox
+X =280
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer5Text1]
+X =284
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+[ScorePlayer5Static1]
+X=280
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static2]
+X=280
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static3]
+X=280
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static4]
+X=280
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static5]
+X=280
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+# P L A Y E R T H R E E
+[ScoreTextName6]
+X=540
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P3
+Color=P3Dark
+
+[ScoreTextNotes6]
+X=540
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore6]
+X=780
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus6]
+X=540
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore6]
+X=780
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes6]
+X=540
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore6]
+X=780
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore6]
+X=540
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal6]
+X=567
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore6]
+X=780
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark6]
+Tex =PlayerNumberBox
+X =540
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P3Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer6Text1]
+X =544
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P3
+
+#lines
+[ScorePlayer6Static1]
+X=540
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static2]
+X=540
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static3]
+X=540
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static4]
+X=540
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static5]
+X=540
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[Options]
+Texts = 6
+Fade = 2
+
+[OptionsBackground]
+Tex=OptionsBG
+
+[OptionsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsStatic5]
+X =388
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[OptionsStatic6]
+X =512
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_WHEREAMI
+
+[OptionsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_DESC
+
+[OptionsText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_SELECT
+
+[OptionsText6]
+X =538
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsButtonGame]
+X =100
+Y =215
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonGameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_GAME
+Color=White
+
+[OptionsButtonGraphics]
+X =255
+Y =215
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonGraphicsText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_GRAPHICS
+Color=White
+
+[OptionsButtonSound]
+X =410
+Y =215
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonSoundText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_SOUND
+Color=White
+
+[OptionsButtonLyrics]
+X =565
+Y =215
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonLyricsText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_LYRICS
+Color=White
+
+[OptionsButtonThemes]
+X =100
+Y =335
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonThemesText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_THEMES
+Color=White
+
+[OptionsButtonRecord]
+X =255
+Y =335
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonRecordText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_RECORD
+Color=White
+Texts=1
+
+[OptionsButtonAdvanced]
+X =410
+Y =335
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonAdvancedText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_ADVANCED
+Color=White
+Texts=1
+
+[OptionsButtonExit]
+X =565
+Y =335
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonExitText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[OptionsGame]
+Texts = 5
+
+[OptionsGameBackground]
+Tex=OptionsBG
+
+[OptionsGameStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGameStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGameStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGameStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsGameStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsGameText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGameText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GAME_WHEREAMI
+
+[OptionsGameText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GAME_DESC
+
+[OptionsGameText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGameText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGameSelectPlayers]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_PLAYERS
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDifficulty]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DIFFICULTY
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+
+[OptionsGameSelectSlideLanguage]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_LANGUAGE
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectTabs]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_TABS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectSlideSorting]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_SORTING
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDebug]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DEBUG
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsGraphics]
+Texts = 5
+
+[OptionsGraphicsBackground]
+Tex=OptionsBG
+
+[OptionsGraphicsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGraphicsStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsGraphicsStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsGraphicsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGraphicsText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GRAPHICS_WHEREAMI
+
+[OptionsGraphicsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GRAPHICS_DESC
+
+[OptionsGraphicsText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGraphicsText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGraphicsSelectSlideResolution]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_GRAPHICS_RESOLUTION
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectFullscreen]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_FULLSCREEN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectDepth]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_DEPTH
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectOscilloscope]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_OSCILLOSCOPE
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectMovieSize]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_MOVIE_SIZE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSound]
+Texts = 5
+
+[OptionsSoundBackground]
+Tex=OptionsBG
+
+[OptionsSoundStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsSoundStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsSoundStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsSoundText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsSoundText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_SOUND_WHEREAMI
+
+[OptionsSoundText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_SOUND_DESC
+
+[OptionsSoundText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsSoundText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsSoundSelectMicBoost]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_MIC_BOOST
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectClickAssist]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_CLICK_ASSIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectBeatClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_BEAT_CLICK
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectThreshold]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_THRESHOLD
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectTwoPlayerMode]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_TWO_PLAYERS_MODE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewVolume]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWVOLUME
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewFADING]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWFADING
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsLyrics]
+Texts = 1
+
+[OptionsLyricsBackground]
+Tex=OptionsBG
+
+[OptionsLyricsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsLyricsStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsLyricsStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsLyricsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsLyricsText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_LYRICS_WHEREAMI
+
+[OptionsLyricsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_LYRICS_DESC
+
+[OptionsLyricsText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsLyricsText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsLyricsSelectLyricsFont]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_FONT
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectLyricsEffect]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_EFFECT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectSolmization]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_SOLMIZATION
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsThemes]
+Texts = 5
+
+[OptionsThemesBackground]
+Tex=OptionsBG
+
+[OptionsThemesStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsThemesStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsThemesStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsThemesText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsThemesText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_THEMES_WHEREAMI
+
+[OptionsThemesText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_THEMES_DESC
+
+[OptionsThemesText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsThemesText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsThemesSelectTheme]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_THEME
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectSkin]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_SKIN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectColor]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_COLOR
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsRecord]
+Texts = 5
+
+[OptionsRecordBackground]
+Tex=OptionsBG
+
+[OptionsRecordStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsRecordStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsRecordStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsRecordText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsRecordText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_RECORD_WHEREAMI
+
+[OptionsRecordText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_RECORD_DESC
+
+[OptionsRecordText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsRecordText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsRecordSelectSlideCard]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CARD
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideInput]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_INPUT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelL]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELL
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelR]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELR
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordButtonExit]
+X = 40
+Y = 305
+W = 230
+H = 70
+Tex = MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsAdvanced]
+Texts = 5
+
+[OptionsAdvancedBackground]
+Tex=OptionsBG
+
+[OptionsAdvancedStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsAdvancedStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsAdvancedStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsAdvancedText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsAdvancedText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_ADVANCED_WHEREAMI
+
+[OptionsAdvancedText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_ADVANCED_DESC
+
+[OptionsAdvancedText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsAdvancedText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+
+#########unused at the moment#########
+#[OptionsAdvancedSelectLoadAnimation]
+#Tex =MainBar
+#TexSBG =SelectBG
+#Text=SING_OPTIONS_ADVANCED_LOADANIMATION
+#X = 40
+#Y = 85
+#W = 230
+#H = 70
+#SkipX = 50
+
+#Color = ColorDark
+#DColor = Gray
+#TColor = White
+#TDColor = White
+#SBGTex =MainBar
+#SBGColor = ColorDark
+#SBGDColor = Gray
+#STColor = White
+#STDColor = GrayDark
+
+[OptionsAdvancedSelectScreenFade]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_SCREENFADE
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectEffectSing]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_EFFECTSING
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectLineBonus]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_LINEBONUS
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectSlideOnSongClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_ADVANCED_ONSONGCLICK
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectAskbeforeDel]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_ASKBEFOREDEL
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectPartyPopup]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_PARTYPOPUP
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[Level]
+Texts=5
+
+[LevelBackground]
+Tex=MainBG
+
+[LevelStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[LevelStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[LevelStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =MainIcon
+Type=Font Black
+
+[LevelStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[LevelStatic5]
+X =388
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[LevelText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=SING_MODE
+
+[LevelText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_DIFFICULTY_DESC
+
+[LevelText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_DIFFICULTY_WHEREAMI
+
+[LevelText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[LevelText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_DIFFICULTY_CONTINUE
+
+[LevelButtonEasy]
+X =180
+Y =270
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[LevelButtonMedium]
+X =335
+Y =270
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[LevelButtonHard]
+X =490
+Y =270
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[LevelButtonEasyText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=SING_EASY
+
+[LevelButtonMediumText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=SING_MEDIUM
+
+[LevelButtonHardText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=SING_HARD
+
+[Name]
+Texts=2
+
+[NameBackground]
+Tex=MainBG
+
+[NameStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[NameStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[NameStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =MainIcon
+Type=Font Black
+
+[NameText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=SING_MODE
+
+[NameText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_PLAYER_DESC
+
+[NameText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_PLAYER_WHEREAMI
+
+[NameStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[NameText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[NameStatic5]
+X =388
+Y =553
+W =26
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Plain
+Style=5
+
+[NameText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_PLAYER_ENTER_NAME
+
+[NameStatic6]
+X =556
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[NameText6]
+X =586
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[NameButtonPlayer1]
+X =180
+Y =270
+W =150
+H =50
+Tex =Button
+Color =P1Dark
+DColor = P1Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer1Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer2]
+X =335
+Y =270
+W =150
+H =50
+Tex =Button
+Color =P2Dark
+DColor = P2Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer2Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer3]
+X =490
+Y =270
+W =150
+H =50
+Tex =Button
+Color =P3Dark
+DColor = P3Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer3Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer4]
+X =180
+Y =400
+W =150
+H =50
+Tex =Button
+Color =P4Dark
+DColor = P4Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer4Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer5]
+X =335
+Y =400
+W =150
+H =50
+Tex =Button
+Color =P5Dark
+DColor = P5Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer5Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer6]
+X =490
+Y =400
+W =150
+H =50
+Tex =Button
+Color =P6Dark
+DColor = P6Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer6Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[PartyScore]
+Texts=5
+
+[PartyScoreBackground]
+Tex=PartyBG
+
+[PartyScoreDecoTextures]
+ChangeTextures =1
+
+FirstTexture =PartyScoreDeco
+FirstTyp =Font Black
+FirstColor =Gold
+
+SecondTexture =PartyScoreDeco
+SecondTyp =Font Black
+SecondColor =Silver
+
+ThirdTexture =PartyScoreDeco
+ThirdTyp =Font Black
+ThirdColor =Bronze
+
+[PartyScoreStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyScoreStatic4]
+X =260
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[PartyScoreText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyScoreText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_SCORE_DESC
+
+[PartyScoreText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_SCORE_WHEREAMI
+
+[PartyScoreText4]
+X =290
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_LEGEND_CONTINUE
+
+[PartyScoreStatic5]
+Tex =PartyScoreBG1
+X =50
+Y =100
+W = 700
+H = 80
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[PartyScoreStatic6]
+Tex =PartyScoreBG2
+X =50
+Y =495
+W = 700
+H = 20
+Int=1
+Color =ColorLight
+Type=Font Black
+
+[PartyScoreText5]
+X =400
+Y =136
+Color =White
+Font =0
+Size =15
+Text =PARTY_SCORE_WINS2
+Align=1
+
+[PartyScoreTextWinner]
+X =400
+Y =98
+Color =White
+Font =0
+Size =18
+Text =The Winner is...
+Align=1
+
+[PartyScoreTextScoreTeam1]
+X =568
+Y =198
+Color =White
+Font =0
+Size =12
+Text =3000
+Align=2
+
+[PartyScoreTextScoreTeam2]
+X =568
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyScoreTextScoreTeam3]
+X =568
+Y =398
+Color =White
+Font =0
+Size =12
+Text =1000
+Align=2
+
+[PartyScoreTextNameTeam1]
+X =188
+Y =198
+Font=0
+Size=12
+Align=0
+Text=Team 1
+Color=White
+
+[PartyScoreTextNameTeam2]
+X =188
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyScoreTextNameTeam3]
+X =188
+Y =398
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyScoreStaticTeam1]
+X =188
+Y =230
+W =380
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam1BG]
+Tex=PartyTeamButton2
+X=178
+Y=200
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam1Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 191
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam2]
+X =188
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam2BG]
+Tex=PartyTeamButton2
+X=178
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam2Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam3]
+X =188
+Y =430
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam3BG]
+Tex=PartyTeamButton2
+X=178
+Y=400
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam3Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 391
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyWin]
+Texts=4
+
+[PartyWinBackground]
+Tex=PartyBG
+
+[PartyWinStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyWinStatic4]
+X =260
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[PartyWinText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyWinText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_WIN_DESC
+
+[PartyWinText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_WIN_WHEREAMI
+
+[PartyWinText4]
+X =290
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_WIN_LEGEND_CONTINUE
+
+#[PartyWinTextWinner]
+#X =150
+#Y =120
+#Color =White
+#Font =1
+#Size =14
+#Text =The Winner is...
+#Align=0
+
+[PartyWinTextScoreTeam1]
+X =699
+Y =183
+Color =White
+Font =0
+Size =19
+Text =3000
+Align=2
+
+[PartyWinTextScoreTeam2]
+X =669
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyWinTextScoreTeam3]
+X =649
+Y =398
+Color =White
+Font =0
+Size =9
+Text =1000
+Align=2
+
+[PartyWinTextNameTeam1]
+X =169
+Y =183
+Font=0
+Size=19
+Align=0
+Text=Team 1
+Color=White
+
+[PartyWinTextNameTeam2]
+X =289
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyWinTextNameTeam3]
+X =369
+Y =398
+Color =White
+Font =0
+Size =9
+Text =Team 3
+Align=0
+
+[PartyWinStaticTeam1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BG]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank2]
+Tex=PartyTeamButton3
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank3]
+Tex=PartyTeamButton3
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyWinStaticTeam1Deco]
+Tex =PartyWinDeco1
+X = 91
+Y = 176
+W = 79
+H = 79
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BG]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamButton3
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank1]
+Tex=PartyTeamButton4
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank2]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank3]
+Tex=PartyTeamButton4
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Deco]
+Tex =PartyWinDeco2
+X = 226
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Silver
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BG]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank2]
+Tex=PartyTeamButton5
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank3]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Deco]
+Tex =PartyWinDeco3
+X = 316
+Y = 391
+W = 54
+H = 54
+Type =Font Black
+Color =Bronze
+Reflection=1
+ReflectionSpacing=3
+
+[PartyOptions]
+Texts = 5
+
+[PartyOptionsBackground]
+Tex=PartyBG
+
+[PartyOptionsStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyOptionsStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[PartyOptionsStatic5]
+X =388
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[PartyOptionsText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyOptionsText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_OPTIONS_DESC
+
+[PartyOptionsText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_OPTIONS_WHEREAMI
+
+[PartyOptionsText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyOptionsText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[PartyOptionsSelectLevel]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_DIFFICULTY
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectRounds]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_ROUNDS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectTeams]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers1]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER1
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER2
+X = 40
+Y = 415
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers3]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER3
+X = 40
+Y = 470
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+
+[PartyPlayer]
+Texts=6
+
+[PartyPlayerBackground]
+Tex=PartyBG
+
+[PartyPlayerStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyPlayerStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[PartyPlayerStatic5]
+X =388
+Y =553
+W =26
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Plain
+Style=5
+
+[PartyPlayerStatic6]
+X =556
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[PartyPlayerText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyPlayerText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_PLAYER_DESC
+
+[PartyPlayerText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_PLAYER_WHEREAMI
+
+[PartyPlayerText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyPlayerText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_ENTER_NAME
+
+[PartyPlayerText6]
+X =586
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_LEGEND_CONTINUE
+
+[PartyPlayerTeam1Name]
+Tex=PartyTeamButton2
+X=85
+Y=100
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Dark
+
+[PartyPlayerTeam1NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 1
+Color=White
+
+[PartyPlayerPlayer1Name]
+Tex=Button
+X=85
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer1NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 1
+Color=White
+
+[PartyPlayerPlayer2Name]
+Tex=Button
+X=245
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer2NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 2
+Color=White
+
+[PartyPlayerPlayer3Name]
+Tex=Button
+X=405
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer3NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 3
+Color=White
+
+[PartyPlayerPlayer4Name]
+Tex=Button
+X=565
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer4NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 4
+Color=White
+
+[PartyPlayerTeam2Name]
+Tex=PartyTeamButton2
+X=85
+Y=240
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Dark
+
+[PartyPlayerTeam2NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 2
+Color=White
+
+[PartyPlayerPlayer5Name]
+Tex=Button
+X=85
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer5NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 5
+Color=White
+
+[PartyPlayerPlayer6Name]
+Tex=Button
+X=245
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer6NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 6
+Color=White
+
+[PartyPlayerPlayer7Name]
+Tex=Button
+X=405
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer7NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 7
+Color=White
+
+[PartyPlayerPlayer8Name]
+Tex=Button
+X=565
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer8NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 8
+Color=White
+
+[PartyPlayerTeam3Name]
+Tex=Button
+Tex=PartyTeamButton2
+X=85
+Y=380
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Dark
+
+[PartyPlayerTeam3NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 3
+Color=White
+
+[PartyPlayerPlayer9Name]
+Tex=Button
+X=85
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer9NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 9
+Color=White
+
+[PartyPlayerPlayer10Name]
+Tex=Button
+X=245
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer10NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 10
+Color=White
+
+[PartyPlayerPlayer11Name]
+Tex=Button
+X=405
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer11NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 11
+Color=White
+
+[PartyPlayerPlayer12Name]
+Tex=Button
+X=565
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer12NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 12
+Color=White
+
+
+[SongMenu]
+Texts=0
+Statics=1
+
+[SongMenuButton1]
+X = 510
+Y = 165
+W = 270
+H = 25
+Tex =Rectangle
+Color =ColorLight
+DColor = ColorDark
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton1Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_PLAY
+Align=0
+Z=0.99
+
+[SongMenuButton2]
+X = 510
+Y = 195
+W = 270
+H = 25
+Tex =Rectangle
+Color =ColorLight
+DColor = ColorDark
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton2Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_EDIT
+Align=0
+Z=0.99
+
+[SongMenuButton3]
+X = 510
+Y = 225
+W = 270
+H = 25
+Tex =Rectangle
+Color =ColorLight
+DColor = ColorDark
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton3Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_MODI
+Align=0
+Z=0.99
+
+[SongMenuButton4]
+X = 510
+Y = 255
+W = 270
+H = 25
+Tex = Rectangle
+Color =ColorLight
+DColor = ColorDark
+Type=Font Black
+Texts=1
+Z = 0.98
+
+[SongMenuButton4Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_CANCEL
+Align=0
+Z=0.99
+
+[SongMenuSelectSlide3]
+Tex = Rectangle
+TexSBG = SongMenuSelectBG
+Text =
+X = 510
+Y = 225
+W = 0
+H = 25
+Z = 0.98
+SkipX = 0
+SBGW=270
+
+TextSize=8
+
+Color =ColorLight
+DColor = ColorDark
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorLight
+SBGDColor = ColorDark
+STColor = White
+STDColor = GrayDark
+
+[SongMenuTextMenu]
+X =539
+Y =125
+Color=White
+Font =0
+Size =14
+Text=MENU
+Align=0
+Z=0.99
+
+[SongMenuStatic2]
+X =513
+Y =135
+W =21
+H =21
+Color =White
+Tex =IconSongMenu
+Type=Font Black
+Z=0.98
+
+[SongMenuStatic1]
+Tex =SongMenuBG
+X =498
+Y =120
+W =300
+H =200
+Z =0.94
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[SongJumpto]
+Texts=0
+Statics=1
+
+[SongJumptoStatic1]
+Tex =JumpToBG
+X =221
+Y =175
+W =355
+H =175
+Z =0.98
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[SongJumptoStatic2]
+X =234
+Y =185
+W =21
+H =21
+Color =White
+Tex =MainSearch
+Type=Font Black
+Z=0.99
+
+[SongJumptoText1]
+X =310
+Y =175
+Color=White
+Font =0
+Size =14
+Text=SONG_JUMPTO_TYPE_DESC
+Align=0
+Z=0.99
+
+[SongJumptoSelectSlideType]
+Tex = button
+TexSBG = mainicon
+#Text = SONG_JUMPTO_TYPE_DESC
+Font=1
+X = 242
+Y = 205
+Z = 0.99
+W = 0
+H = 30
+SkipX = 4
+SBGW= 300
+Fields=2
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex = button
+SBGDColor = ColorLightest
+STColor = White
+STDColor = ColorLightest
+
+[SongJumptoButtonSearchText]
+X = 250
+Y = 215
+Z = 0.99
+W = 160
+H = 50
+Size=14
+Font=1
+Align=0
+
+[SongJumptoTextFound]
+X =234
+Y =295
+Color=White
+Font =0
+Size =8
+Text=SONG_JUMPTO_HELP
+Align=0
+Z=0.99
+
+[StatMain]
+Texts=0
+Statics=0
+
+[StatMainBackground]
+Tex=MainBG
+
+[StatMainButtonScores]
+X =589
+Y =100
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonScoresText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SCORES
+Color=White
+
+[StatMainButtonSingers]
+X =589
+Y =160
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSingersText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SINGERS
+Color=White
+
+[StatMainButtonSongs]
+X =589
+Y =220
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSongsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_SONGS
+Color=White
+
+[StatMainButtonBands]
+X =589
+Y =280
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonBandsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_BANDS
+Color=White
+
+[StatMainButtonExit]
+X =589
+Y =340
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatMainTextOverview]
+X =45
+Y =125
+W =510
+Color=White
+Font =0
+Size =9
+Align=0
+Text=
+
+[StatMainStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =StatIcon
+Type=Font Black
+
+[StatMainStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatMainStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatMainStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[StatMainStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[StatMainStatic6]
+X =40
+Y =100
+W =520
+H =20
+Tex=StatMainBG1
+Color =ColorLight
+Type=Font Black
+
+[StatMainStatic7]
+X =40
+Y =120
+W =520
+H =300
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatMainStatic8]
+X =40
+Y =420
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+[StatMainText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=STAT_MAIN
+Align=0
+
+[StatMainText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=STAT_MAIN_WHEREAMI
+
+[StatMainText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=STAT_MAIN_DESC
+
+[StatMainText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatMainText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[StatDetail]
+Texts=0
+Statics=0
+
+[StatDetailBackground]
+Tex=MainBG
+
+[StatDetailButtonNext]
+X =589
+Y =100
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonNextText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_NEXT
+Color=White
+
+[StatDetailButtonPrev]
+X =589
+Y =160
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonPrevText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_PREV
+Color=White
+
+[StatDetailButtonReverse]
+X =589
+Y =220
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonReverseText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_REVERSE
+Color=White
+
+[StatDetailButtonExit]
+X =589
+Y =280
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatDetailTextDescription]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=
+
+[StatDetailTextPage]
+X = 546
+Y = 98
+Color= Black
+Font = 0
+Size = 5
+Align=2
+Text=
+
+[StatDetailTextList1]
+X = 45
+Y = 122
+Color=White
+Font = 0
+Size = 7
+Text=Stat1
+
+[StatDetailTextList2]
+X = 45
+Y = 160
+Color=White
+Font = 0
+Size = 7
+Text=Stat2
+
+[StatDetailTextList3]
+X = 45
+Y = 198
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList4]
+X = 45
+Y = 236
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList5]
+X = 45
+Y = 274
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList6]
+X = 45
+Y = 312
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList7]
+X = 45
+Y = 350
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList8]
+X = 45
+Y = 388
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList9]
+X = 45
+Y = 426
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList10]
+X = 45
+Y = 464
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =StatIcon
+Type=Font Black
+
+[StatDetailStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatDetailStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatDetailStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[StatDetailStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[StatDetailStatic6]
+X =40
+Y =100
+W =520
+H =24
+Tex=StatDetailBG1
+Color =ColorLight
+Type=Font Black
+
+[StatDetailStatic7]
+X =40
+Y =124
+W =520
+H =376
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatDetailStatic8]
+X =40
+Y =500
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+
+[StatDetailText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=STAT_DETAIL
+Align=0
+
+[StatDetailText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=STAT_DETAIL_WHEREAMI
+
+[StatDetailText3]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatDetailText4]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[CheckPopup]
+Texts=1
+Statics=1
+
+[CheckPopupButton1]
+X = 285
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=JA
+Align=1
+Z=1
+
+[CheckPopupButton2]
+X = 415
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton2Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=NEIN
+Align=1
+Z=1
+
+[CheckPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[CheckPopupText1]
+X =282
+Y =147
+Color=White
+Font =0
+Size =10
+Text=MSG_QUESTION_TITLE
+Align=0
+Z=1
+
+[CheckPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =GrayPopup
+Type=Font Black
+
+[CheckPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[CheckPopupStatic3]
+Tex =IconQuestion
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopup]
+Texts=1
+Statics=1
+
+[ErrorPopupButton1]
+X = 350
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[ErrorPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=OK
+Align=1
+Z=1
+
+[ErrorPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[ErrorPopupText1]
+X =282
+Y =148
+Color=White
+Font =0
+Size =10
+Text=MSG_ERROR_TITLE
+Align=0
+Z=1
+
+[ErrorPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =GrayPopup
+Type=Font Black
+
+[ErrorPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopupStatic3]
+Tex =IconError
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+
+###################################################################
+############### CHANGED Things for MOD M2! ########################
+###################################################################
+
+########## MAIN #############
+[Main]
+Texts =2
+Statics=4
+
+[MainBackground]
+Tex=MainBG
+
+[MainStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic3]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[MainText2]
+X =295
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[MainStatic4]
+X =388
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[MainText1]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_MENU
+
+[MainTextDescriptionLong]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=
+
+[MainButtonSolo]
+X =90
+Y =270
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=15
+DeSelectReflectionSpacing=280
+Fade=1
+FadeText=1
+SelectH=150
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[MainButtonSoloText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_SING
+Color=White
+
+#### added M2 Mode Button ####
+[MainButtonCollection1]
+X =245
+Y =270
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=15
+DeSelectReflectionSpacing=280
+Fade=1
+FadeText=0
+SelectH=150
+FadeTex=ButtonFade
+FadeTexPos=0
+FirstChild=2
+
+[MainButtonCollection1Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_PARTY
+Color=White
+
+[MainButtonMulti]
+X =250
+Y =310
+W =140
+H =30
+Tex =Rectangle
+Color =ColorLight
+DColor =ColorDark
+Type=Font Black
+Texts=1
+Reflection=0
+Parent=1
+
+[MainButtonMultiText1]
+X =70
+Y =3
+Font=0
+Size=8
+Align=1
+Text=SING_MULTI
+Color=White
+
+[MainButtonMultiM2]
+X =250
+Y =345
+W =140
+H =30
+Tex =Rectangle
+Color =ColorLight
+DColor =ColorDark
+Type=Font Black
+Texts=1
+Reflection=0
+Parent=1
+
+[MainButtonMultiM2Text1]
+X =70
+Y =3
+Font=0
+Size=8
+Align=1
+Text=SING_MULTI_M2
+Color=White
+
+[MainButtonCollection2]
+X =400
+Y =270
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=15
+DeSelectReflectionSpacing=280
+Fade=1
+FadeText=0
+SelectH=150
+FadeTex=ButtonFade
+FadeTexPos=0
+FirstChild=4
+
+[MainButtonCollection2Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_TOOLS
+Color=White
+
+[MainButtonStats]
+X =405
+Y =310
+W =140
+H =30
+Tex =Rectangle
+Color =ColorLight
+DColor =ColorDark
+Type=Font Black
+Texts=1
+Reflection=0
+Parent=2
+
+[MainButtonStatsText1]
+X =70
+Y =3
+Font=0
+Size=8
+Align=1
+Text=SING_STATS
+Color=White
+
+[MainButtonEditor]
+X =405
+Y =345
+W =140
+H =30
+Tex =Rectangle
+Color =ColorLight
+DColor =ColorDark
+Type=Font Black
+Texts=1
+Reflection=0
+Parent=2
+
+[MainButtonEditorText1]
+X =70
+Y =3
+Font=0
+Size=8
+Align=1
+Text=SING_EDITOR
+Color=White
+
+[MainButtonOptions]
+X =405
+Y =380
+W =140
+H =30
+Tex =Rectangle
+Color =ColorLight
+DColor =ColorDark
+Type=Font Black
+Texts=1
+Reflection=0
+Parent=2
+
+[MainButtonOptionsText1]
+X =70
+Y =3
+Font=0
+Size=8
+Align=1
+Text=SING_OPTIONS
+Color=White
+
+[MainButtonExit]
+X =555
+Y =270
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =ColorLight
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=15
+DeSelectReflectionSpacing=280
+Fade=1
+FadeText=1
+SelectH=150
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[MainButtonExitText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_EXIT
+Color=White
+
+############# PartyOptionsM2 ############
+
+[PartyOptionsM2]
+Texts = 7
+
+[PartyOptionsM2Background]
+Tex = PartyBG
+
+[PartyOptionsM2Static1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsM2Static2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsM2Static3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyOptionsM2Static4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[PartyOptionsM2Static5]
+X =388
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[PartyOptionsM2Text1]
+X = 70
+Y = 6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color = White
+Text = PARTY_MODE_M2
+
+[PartyOptionsM2Text2]
+X = 70
+Y = 53
+Color = White
+Font = 0
+Size = 10
+Align = 0
+Text = PARTY_OPTIONS_M2_DESC
+
+[PartyOptionsM2Text3]
+X = 238
+Y = 552
+Color = Black
+Font = 0
+Size = 7
+Align = 2
+Text = PARTY_OPTIONS_M2_WHEREAMI
+
+[PartyOptionsM2Text4]
+X = 294
+Y = 552
+Color = Black
+Font = 0
+Size = 7
+Align = 0
+Text = SING_LEGEND_NAVIGATE
+
+[PartyOptionsM2Text5]
+X = 418
+Y = 552
+Color = Black
+Font = 0
+Size = 7
+Align = 0
+Text = SING_LEGEND_CONTINUE
+
+[PartyOptionsM2SelectLevel]
+Tex = MainBar
+TexSBG = SelectBG
+Text = PARTY_DIFFICULTY
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields = 3
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsM2SelectPlayList]
+Tex = MainBar
+TexSBG = SelectBG
+Text = PARTY_PLAYLIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields = 1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsM2SelectPlayList2]
+Tex = MainBar
+TexSBG = SelectBG
+Text = PARTY_PLAYLIST
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields = 1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsM2SelectPlayers]
+Tex = MainBar
+TexSBG = SelectBG
+Text = PARTY_TEAMS_PLAYER_M2
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields = 8
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsM2SelectRounds]
+Tex = MainBar
+TexSBG = SelectBG
+Text = PARTY_ROUNDS
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+Fields = 7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsM2SelectOptionPlugin]
+Tex = MainBar
+TexSBG = SelectBG
+Text = PARTY_OPTIONS_M2_SELECT_PLUGIN
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+Fields = 2
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsM2SelectOptionHandicap]
+Tex = MainBar
+TexSBG = SelectBG
+Text = PARTY_OPTIONS_M2_SELECT_HANDICAP
+X = 40
+Y = 415
+W = 230
+H = 70
+SkipX = 50
+Fields = 2
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+############ PartyPlayerM2 ############
+[PartyPlayerM2]
+Texts=6
+
+[PartyPlayerM2Background]
+Tex=PartyBG
+
+[PartyPlayerM2Static1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerM2Static2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerM2Static3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyPlayerM2Static4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[PartyPlayerM2Static5]
+X =388
+Y =553
+W =26
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Plain
+Style=5
+
+[PartyPlayerM2Static6]
+X =556
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[PartyPlayerM2Text1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE_M2
+
+[PartyPlayerM2Text2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_PLAYERM2_DESC
+
+[PartyPlayerM2Text3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_PLAYERM2_WHEREAMI
+
+[PartyPlayerM2Text4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyPlayerM2Text5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_ENTER_NAME
+
+[PartyPlayerM2Text6]
+X =586
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_LEGEND_CONTINUE
+
+[PartyPlayerM2Player1Name]
+Tex=Button
+X=85
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =LightBlue
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerM2Player1NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 1
+Color=White
+
+[PartyPlayerM2Player2Name]
+Tex=Button
+X=245
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =LightBlue
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerM2Player2NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 2
+Color=White
+
+[PartyPlayerM2Player3Name]
+Tex=Button
+X=405
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =LightBlue
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerM2Player3NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 3
+Color=White
+
+[PartyPlayerM2Player4Name]
+Tex=Button
+X=565
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =LightBlue
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerM2Player4NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 4
+Color=White
+
+[PartyPlayerM2Player5Name]
+Tex=Button
+X=85
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =LightBlue
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerM2Player5NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 5
+Color=White
+
+[PartyPlayerM2Player6Name]
+Tex=Button
+X=245
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =LightBlue
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerM2Player6NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 6
+Color=White
+
+[PartyPlayerM2Player7Name]
+Tex=Button
+X=405
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =LightBlue
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerM2Player7NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 7
+Color=White
+
+[PartyPlayerM2Player8Name]
+Tex=Button
+X=565
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =LightBlue
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerM2Player8NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 8
+Color=White
+
+[PartyPlayerM2Player9Name]
+Tex=Button
+X=85
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =LightBlue
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerM2Player9NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 9
+Color=White
+
+#### PartyNewRoundM2 ####
+[PartyNewRoundM2]
+Texts = 14
+
+[PartyNewRoundM2Background]
+Tex = MainBG
+
+[PartyNewRoundM2Static1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundM2Static2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundM2Static3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyNewRoundM2Static4]
+Tex = PartyRoundBG1
+X = 450
+Y = 103
+W = 330
+H = 24
+Color = DarkBlue
+Type = Colorized
+
+[PartyNewRoundM2Static5]
+X =260
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[PartyNewRoundM2Static6]
+Tex = PartyRoundBG4
+X = 50
+Y = 495
+W = 700
+H = 30
+Color = LightBlue
+Type = Colorized
+
+[PartyNewRoundM2Static7]
+Tex = PartyRoundBG1
+X = 20
+Y = 103
+W = 410
+H = 24
+Color = DarkBlue
+Type = Colorized
+
+[PartyNewRoundM2Static8]
+X = 525
+Y = 553
+W = 26
+H = 22
+Tex = ButtonNavi
+Color =White
+Type=Plain
+
+;table
+[PartyNewRoundM2StaticTable1]
+Tex = PartyRoundBG2
+X = 20
+Y = 135
+W = 410
+H = 20
+Color = LightBlue
+Type = Colorized
+
+[PartyNewRoundM2StaticTable2]
+Tex = PartyRoundBG2
+X = 20
+Y = 164
+W = 410
+H = 20
+Color = LightBlue
+Type = Colorized
+
+[PartyNewRoundM2StaticTable3]
+Tex = PartyRoundBG2
+X = 20
+Y = 193
+W = 410
+H = 20
+Color = LightBlue
+Type = Colorized
+
+[PartyNewRoundM2StaticTable4]
+Tex = PartyRoundBG2
+X = 20
+Y = 222
+W = 410
+H = 20
+Color = LightBlue
+Type = Colorized
+
+[PartyNewRoundM2StaticTable5]
+Tex = PartyRoundBG2
+X = 20
+Y = 251
+W = 410
+H = 20
+Color = LightBlue
+Type = Colorized
+
+[PartyNewRoundM2StaticTable6]
+Tex = PartyRoundBG2
+X = 20
+Y = 280
+W = 410
+H = 20
+Color = LightBlue
+Type = Colorized
+
+[PartyNewRoundM2StaticTable7]
+Tex = PartyRoundBG2
+X = 20
+Y = 309
+W = 410
+H = 20
+Color = LightBlue
+Type = Colorized
+
+[PartyNewRoundM2StaticTable8]
+Tex = PartyRoundBG2
+X = 20
+Y = 338
+W = 410
+H = 20
+Color = LightBlue
+Type = Colorized
+
+[PartyNewRoundM2StaticTable9]
+Tex = PartyRoundBG2
+X = 20
+Y = 367
+W = 410
+H = 20
+Color = LightBlue
+Type = Colorized
+
+;results
+[PartyNewRoundM2Text1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text = PARTY_MODE_M2
+
+[PartyNewRoundM2Text2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text = PARTY_ROUNDM2_DESC
+
+[PartyNewRoundM2Text3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text = PARTY_ROUNDM2_WHEREAMI
+
+[PartyNewRoundM2Text4]
+X =290
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text = PARTY_ROUNDM2_LEGEND_CONTINUE
+
+[PartyNewRoundM2Text5]
+X =460
+Y =105
+Color =White
+Font =1
+Size =7
+Text = PARTY_ROUNDM2
+Align = 0
+
+[PartyNewRoundM2Text6]
+X =685
+Y =105
+Color =White
+Font =1
+Size =7
+Text = PARTY_ROUNDM2_RESULT
+Align = 0
+
+[PartyNewRoundM2Text7]
+X =27
+Y =105
+Color =White
+Font =1
+Size =7
+Text = PARTY_ROUNDM2_NUMBER
+Align = 0
+
+[PartyNewRoundM2Text8]
+X = 50
+Y = 105
+Color = White
+Font = 1
+Size = 7
+Text = PARTY_ROUNDM2_NAME
+Align = 0
+
+[PartyNewRoundM2Text9]
+X = 200
+Y = 105
+Color = White
+Font = 1
+Size = 7
+Text = PARTY_ROUNDM2_WINS
+Align = 0
+
+[PartyNewRoundM2Text10]
+X = 235
+Y = 105
+Color = White
+Font = 1
+Size = 7
+Text = PARTY_ROUNDM2_DRAFTS
+Align = 0
+
+[PartyNewRoundM2Text11]
+X = 270
+Y = 105
+Color = White
+Font = 1
+Size = 7
+Text = PARTY_ROUNDM2_DEFEATS
+Align = 0
+
+[PartyNewRoundM2Text12]
+X = 305
+Y = 105
+Color = White
+Font = 1
+Size = 7
+Text = PARTY_ROUNDM2_SCORE_DIFF
+Align = 0
+
+[PartyNewRoundM2Text13]
+X = 400
+Y = 105
+Color = White
+Font = 1
+Size = 7
+Text = PARTY_ROUNDM2_POINTS
+Align = 0
+
+[PartyNewRoundM2Text14]
+X = 560
+Y = 552
+Color = Black
+Font = 0
+Size = 7
+Align = 0
+Text = PARTY_ROUNDM2_LEGEND_SCROLL
+
+[PartyNewRoundM2StaticNextPlayer1]
+Tex = PartyPlayerButton
+X=155
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P1Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundM2StaticNextPlayer2]
+Tex = PartyPlayerButton
+X=325
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P2Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundM2StaticHandicap]
+Tex=PartyPlayerButton
+X=495
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P3Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundM2TextRound1]
+X = 455
+Y = 135
+Color = White
+Font = 1
+Size = 6
+Text = Round 1
+Align = 0
+
+[PartyNewRoundM2TextRound2]
+X = 455
+Y = 164
+Color = White
+Font = 1
+Size = 6
+Text = Round 2
+Align = 0
+
+[PartyNewRoundM2TextRound3]
+X = 455
+Y = 193
+Color = White
+Font = 1
+Size = 6
+Text = Round 3
+Align = 0
+
+[PartyNewRoundM2TextRound4]
+X = 455
+Y = 222
+Color = White
+Font = 1
+Size = 6
+Text = Round 4
+Align = 0
+
+[PartyNewRoundM2TextRound5]
+X = 455
+Y = 251
+Color = White
+Font = 1
+Size = 6
+Text = Round 5
+Align = 0
+
+[PartyNewRoundM2TextRound6]
+X = 455
+Y = 280
+Color = White
+Font = 1
+Size = 6
+Text = Round 6
+Align = 0
+
+[PartyNewRoundM2TextRound7]
+X = 455
+Y = 309
+Color = White
+Font = 1
+Size = 6
+Text = Round 7
+Align = 0
+
+[PartyNewRoundM2TextRound8]
+X = 455
+Y = 338
+Color = White
+Font = 1
+Size = 6
+Text = Round 8
+Align = 0
+
+[PartyNewRoundM2TextRound9]
+X = 455
+Y = 367
+Color = White
+Font = 1
+Size = 6
+Text = Round 9
+Align = 0
+
+[PartyNewRoundM2TextWinner1]
+X = 675
+Y = 136
+Color = White
+Font = 1
+Size = 6
+Text = Winner 1
+Align = 0
+
+[PartyNewRoundM2TextWinner2]
+X = 675
+Y = 165
+Color = White
+Font = 1
+Size = 6
+Text = Winner 2
+Align = 0
+
+[PartyNewRoundM2TextWinner3]
+X = 675
+Y = 194
+Color = White
+Font = 1
+Size = 6
+Text = Winner 3
+Align = 0
+
+[PartyNewRoundM2TextWinner4]
+X = 675
+Y = 223
+Color = White
+Font = 1
+Size = 6
+Text = Winner 4
+Align = 0
+
+[PartyNewRoundM2TextWinner5]
+X = 675
+Y = 252
+Color = White
+Font = 1
+Size = 6
+Text = Winner 5
+Align = 0
+
+[PartyNewRoundM2TextWinner6]
+X = 675
+Y = 281
+Color = White
+Font = 1
+Size = 6
+Text = Winner 6
+Align = 0
+
+[PartyNewRoundM2TextWinner7]
+X = 675
+Y = 310
+Color = White
+Font = 1
+Size = 6
+Text = Winner 7
+Align = 0
+
+[PartyNewRoundM2TextWinner8]
+X = 675
+Y = 339
+Color = White
+Font = 1
+Size = 6
+Text = Winner 8
+Align = 0
+
+[PartyNewRoundM2TextWinner9]
+X = 675
+Y = 368
+Color = White
+Font = 1
+Size = 6
+Text = Winner 9
+Align = 0
+
+[PartyNewRoundM2StaticRound1]
+Tex = PartyRoundBG2
+X = 450
+Y = 135
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundM2StaticRound2]
+Tex = PartyRoundBG2
+X = 450
+Y = 164
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundM2StaticRound3]
+Tex = PartyRoundBG2
+X = 450
+Y = 193
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundM2StaticRound4]
+Tex = PartyRoundBG2
+X = 450
+Y = 222
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundM2StaticRound5]
+Tex = PartyRoundBG2
+X = 450
+Y = 251
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundM2StaticRound6]
+Tex = PartyRoundBG2
+X = 450
+Y = 280
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundM2StaticRound7]
+Tex = PartyRoundBG2
+X = 450
+Y = 309
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundM2StaticRound8]
+Tex = PartyRoundBG2
+X = 450
+Y = 338
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundM2StaticRound9]
+Tex = PartyRoundBG2
+X = 450
+Y = 367
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundM2TextNextRound]
+X = 400
+Y = 495
+Color = White
+Font = 0
+Size = 10
+Text = Next Round
+Align = 1
+
+[PartyNewRoundM2TextNextPlayer1]
+X = 230
+Y = 425
+Color = White
+Font = 0
+Size = 10
+Text = Player 1
+Align = 1
+
+[PartyNewRoundM2TextNextPlayer2]
+X = 400
+Y = 425
+Color = White
+Font = 0
+Size = 10
+Text = Player 2
+Align = 1
+
+[PartyNewRoundM2TextHandicap]
+X = 570
+Y = 425
+Color = White
+Font = 0
+Size = 10
+Text = Player 3
+Align = 1
+
+[PartyNewRoundM2TextTableName11]
+X = 30
+Y = 136
+Color = White
+Font = 1
+Size = 6
+Text =1
+Align = 0
+
+[PartyNewRoundM2TextTableName12]
+X = 50
+Y = 136
+Color = White
+Font = 1
+Size = 6
+Text =Name 1
+Align = 0
+
+[PartyNewRoundM2TextTableName13]
+X = 200
+Y = 136
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName14]
+X = 235
+Y = 136
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName15]
+X = 270
+Y = 136
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName16]
+X = 305
+Y = 136
+Color = White
+Font = 1
+Size = 6
+Text =0:0
+Align = 0
+
+[PartyNewRoundM2TextTableName17]
+X = 400
+Y = 136
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName21]
+X = 30
+Y = 165
+Color = White
+Font = 1
+Size = 6
+Text =1
+Align = 0
+
+[PartyNewRoundM2TextTableName22]
+X = 50
+Y = 165
+Color = White
+Font = 1
+Size = 6
+Text =Name 1
+Align = 0
+
+[PartyNewRoundM2TextTableName23]
+X = 200
+Y = 165
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName24]
+X = 235
+Y = 165
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName25]
+X = 270
+Y = 165
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName26]
+X = 305
+Y = 165
+Color = White
+Font = 1
+Size = 6
+Text =0:0
+Align = 0
+
+[PartyNewRoundM2TextTableName27]
+X = 400
+Y = 165
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName31]
+X = 30
+Y = 194
+Color = White
+Font = 1
+Size = 6
+Text =1
+Align = 0
+
+[PartyNewRoundM2TextTableName32]
+X = 50
+Y = 194
+Color = White
+Font = 1
+Size = 6
+Text =Name 1
+Align = 0
+
+[PartyNewRoundM2TextTableName33]
+X = 200
+Y = 194
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName34]
+X = 235
+Y = 194
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName35]
+X = 270
+Y = 194
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName36]
+X = 305
+Y = 194
+Color = White
+Font = 1
+Size = 6
+Text =0:0
+Align = 0
+
+[PartyNewRoundM2TextTableName37]
+X = 400
+Y = 194
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName41]
+X = 30
+Y = 223
+Color = White
+Font = 1
+Size = 6
+Text =1
+Align = 0
+
+[PartyNewRoundM2TextTableName42]
+X = 50
+Y = 223
+Color = White
+Font = 1
+Size = 6
+Text =Name 1
+Align = 0
+
+[PartyNewRoundM2TextTableName43]
+X = 200
+Y = 223
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName44]
+X = 235
+Y = 223
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName45]
+X = 270
+Y = 223
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName46]
+X = 305
+Y = 223
+Color = White
+Font = 1
+Size = 6
+Text =0:0
+Align = 0
+
+[PartyNewRoundM2TextTableName47]
+X = 400
+Y = 223
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+
+[PartyNewRoundM2TextTableName51]
+X = 30
+Y = 252
+Color = White
+Font = 1
+Size = 6
+Text =1
+Align = 0
+
+[PartyNewRoundM2TextTableName52]
+X = 50
+Y = 252
+Color = White
+Font = 1
+Size = 6
+Text =Name 1
+Align = 0
+
+[PartyNewRoundM2TextTableName53]
+X = 200
+Y = 252
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName54]
+X = 235
+Y = 252
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName55]
+X = 270
+Y = 252
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName56]
+X = 305
+Y = 252
+Color = White
+Font = 1
+Size = 6
+Text =0:0
+Align = 0
+
+[PartyNewRoundM2TextTableName57]
+X = 400
+Y = 252
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName61]
+X = 30
+Y = 281
+Color = White
+Font = 1
+Size = 6
+Text =1
+Align = 0
+
+[PartyNewRoundM2TextTableName62]
+X = 50
+Y = 281
+Color = White
+Font = 1
+Size = 6
+Text =Name 1
+Align = 0
+
+[PartyNewRoundM2TextTableName63]
+X = 200
+Y = 281
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName64]
+X = 235
+Y = 281
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName65]
+X = 270
+Y = 281
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName66]
+X = 305
+Y = 281
+Color = White
+Font = 1
+Size = 6
+Text =0:0
+Align = 0
+
+[PartyNewRoundM2TextTableName67]
+X = 400
+Y = 281
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName71]
+X = 30
+Y = 307
+Color = White
+Font = 1
+Size = 6
+Text =1
+Align = 0
+
+[PartyNewRoundM2TextTableName72]
+X = 50
+Y = 310
+Color = White
+Font = 1
+Size = 6
+Text =Name 1
+Align = 0
+
+[PartyNewRoundM2TextTableName73]
+X = 200
+Y = 310
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName74]
+X = 235
+Y = 310
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName75]
+X = 270
+Y = 310
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName76]
+X = 305
+Y = 310
+Color = White
+Font = 1
+Size = 6
+Text =0:0
+Align = 0
+
+[PartyNewRoundM2TextTableName77]
+X = 400
+Y = 310
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+
+[PartyNewRoundM2TextTableName81]
+X = 30
+Y = 339
+Color = White
+Font = 1
+Size = 6
+Text =1
+Align = 0
+
+[PartyNewRoundM2TextTableName82]
+X = 50
+Y = 339
+Color = White
+Font = 1
+Size = 6
+Text =Name 1
+Align = 0
+
+[PartyNewRoundM2TextTableName83]
+X = 200
+Y = 339
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName84]
+X = 235
+Y = 339
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName85]
+X = 270
+Y = 339
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName86]
+X = 305
+Y = 339
+Color = White
+Font = 1
+Size = 6
+Text =0:0
+Align = 0
+
+[PartyNewRoundM2TextTableName87]
+X = 400
+Y = 339
+Color = White
+Font = 1
+Size = 6
+Text =0
+Align = 0
+
+[PartyNewRoundM2TextTableName91]
+X = 30
+Y = 368
+Color = White
+Font = 1
+Size = 6
+Text =9
+Align = 0
+
+[PartyNewRoundM2TextTableName92]
+X = 50
+Y = 368
+Color = White
+Font = 1
+Size = 6
+Text =Name 9
+Align = 0
+
+[PartyNewRoundM2TextTableName93]
+X = 200
+Y = 368
+Color = White
+Font = 1
+Size = 6
+Text =88
+Align = 0
+
+[PartyNewRoundM2TextTableName94]
+X = 235
+Y = 368
+Color = White
+Font = 1
+Size = 6
+Text =22
+Align = 0
+
+[PartyNewRoundM2TextTableName95]
+X = 270
+Y = 368
+Color = White
+Font = 1
+Size = 6
+Text =55
+Align = 0
+
+[PartyNewRoundM2TextTableName96]
+X = 305
+Y = 368
+Color = White
+Font = 1
+Size = 6
+Text =888888
+Align = 0
+
+[PartyNewRoundM2TextTableName97]
+X = 400
+Y = 368
+Color = White
+Font = 1
+Size = 6
+Text =99
+Align = 0
+
+#### ScreenSong M2 extensions ####
+[SongTextPlugin]
+X =70
+Y =75
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PluginName
+
+[SongTextMedley1]
+X =10
+Y =370
+Color=White
+Font =0
+Size =7
+Align =0
+Text=1) Artist - Title
+
+[SongTextMedley2]
+X =10
+Y =410
+Color=White
+Font =0
+Size =7
+Align =0
+Text=2) Artist - Title
+
+[SongTextMedley3]
+X =10
+Y =450
+Color=White
+Font =0
+Size =7
+Align =0
+Text=3) Artist - Title
+
+[SongTextMedley4]
+X =10
+Y =490
+Color=White
+Font =0
+Size =7
+Align =0
+Text=4) Artist - Title
+
+[SongTextM2P1]
+X = 400
+Y = 60
+Color = White
+Font = 0
+Size = 10
+Align = 1
+Text = P1
+
+[SongTextM2P2]
+X = 400
+Y = 90
+Color = White
+Font = 0
+Size = 10
+Align = 1
+Text = P2
+
+[SongStaticM2Party1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[SongStaticM2Party2]
+X =400
+Y =553
+W =22
+H =22
+Tex=ButtonJ
+Color =White
+Type=Plain
+
+[SongStaticM2Party3]
+X =540
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[SongTextM2Party1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE_M2
+
+[SongTextM2Party2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_SONG_WHEREAMI_M2
+
+[SongTextM2Party3]
+X =426
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SONG_MENU_NAME_PARTY_JOKER
+
+[SongTextM2Party4]
+X =570
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_LEGEND_CONTINUE
+
+[SongMedleyIcon]
+X =334
+Y =487
+W =32
+H =32
+Z=1
+Color=White
+Tex =MedleyIcon
+Type=Font Black
+
+[SongCalculatedMedleyIcon]
+X =334
+Y =487
+W =32
+H =32
+Z=1
+Color=White
+Tex =CalcMedleyIcon
+Type=Font Black
+
+[SongTextPartyTeam1NumJoker]
+X = 600
+Y = 400
+Color = White
+Font = 0
+Size = 13
+Align = 1
+Text = 5
+
+[SongTextPartyTeam2NumJoker]
+X = 600
+Y = 450
+Color = White
+Font = 0
+Size = 13
+Align = 1
+Text = 5
+
+[SongTextPartyTeam3NumJoker]
+X = 600
+Y = 500
+Color = White
+Font = 0
+Size = 13
+Align = 1
+Text = 5
+
+
+####### ScreenTop ########
+[Top]
+Texts=4
+
+[TopBackground]
+Tex=TopBG
+
+[TopText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Align=0
+Text =SING_TOP_CHARTS
+
+[TopText4]
+X =70
+Y =73
+Color=White
+Font =0
+Size =10
+Align=0
+Text =SING_OPTIONS_GAME_DIFFICULTY
+
+[TopTextArtistTitle]
+X =70
+Y =53
+Color =White
+Font =0
+Size =10
+Align =0
+Text =artist - title
+
+[TopTextLevel]
+X =270
+Y =73
+Color =White
+Font =0
+Size =10
+Align =1
+Text =easy
+
+[TopStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[TopStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[TopStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[TopText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_TOP_CHARTS_WHEREAMI
+
+[TopStatic4]
+X =260
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[TopText3]
+X =290
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_TOP_CHARTS_CONTINUE
+
+[TopTextName1]
+X =90
+Y =139
+Color =White
+Font =0
+Size =14
+Align =0
+Text =1. Player1
+
+[TopTextName2]
+X =90
+Y =189
+Color =White
+Font =0
+Size =14
+Align =0
+Text =2. Player2
+
+[TopTextName3]
+X =90
+Y =239
+Color =White
+Font =0
+Size =14
+Align =0
+Text =3. Player3
+
+[TopTextName4]
+X =90
+Y =289
+Color =White
+Font =0
+Size =14
+Align =0
+Text =4. Player4
+
+[TopTextName5]
+X =90
+Y =339
+Color =White
+Font =0
+Size =14
+Align =0
+Text =5. Player5
+
+[TopTextName6]
+X =90
+Y =389
+Color =White
+Font =0
+Size =14
+Align =0
+Text =6. Player6
+
+[TopTextName7]
+X =90
+Y =439
+Color =White
+Font =0
+Size =14
+Align =0
+Text =7. Player7
+
+[TopTextName8]
+X =90
+Y =489
+Color =White
+Font =0
+Size =14
+Align =0
+Text =8. Player8
+
+[TopTextScore1]
+X =530
+Y =139
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[TopTextScore2]
+X =530
+Y =189
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[TopTextScore3]
+X =530
+Y =239
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[TopTextScore4]
+X =530
+Y =289
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[TopTextScore5]
+X =530
+Y =339
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[TopTextScore6]
+X =530
+Y =389
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[TopTextScore7]
+X =530
+Y =439
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[TopTextScore8]
+X =530
+Y =489
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[TopTextDate1]
+X =760
+Y =139
+Color =White
+Font =0
+Size =14
+Align =2
+Text =31.12.2009
+
+[TopTextDate2]
+X =760
+Y =189
+Color =White
+Font =0
+Size =14
+Align =2
+Text =31.12.2009
+
+[TopTextDate3]
+X =760
+Y =239
+Color =White
+Font =0
+Size =14
+Align =2
+Text =31.12.2009
+
+[TopTextDate4]
+X =760
+Y =289
+Color =White
+Font =0
+Size =14
+Align =2
+Text =31.12.2009
+
+[TopTextDate5]
+X =760
+Y =339
+Color =White
+Font =0
+Size =14
+Align =2
+Text =31.12.2009
+
+[TopTextDate6]
+X =760
+Y =389
+Color =White
+Font =0
+Size =14
+Align =2
+Text =31.12.2009
+
+[TopTextDate7]
+X =760
+Y =439
+Color =White
+Font =0
+Size =14
+Align =2
+Text =31.12.2009
+
+[TopTextDate8]
+X =760
+Y =489
+Color =White
+Font =0
+Size =14
+Align =2
+Text =31.12.2009
+
+[TopTextNumber1]
+X =60
+Y =142
+Color =White
+Font =1
+Size =9
+Align =1
+Text =1
+
+[TopTextNumber2]
+X =60
+Y =192
+Color =White
+Font =1
+Size =9
+Align =1
+Text =2
+
+[TopTextNumber3]
+X =60
+Y =242
+Color =White
+Font =1
+Size =9
+Align =1
+Text =3
+
+[TopTextNumber4]
+X =60
+Y =292
+Color =White
+Font =1
+Size =9
+Align =1
+Text =4
+
+[TopTextNumber5]
+X =60
+Y =342
+Color =White
+Font =1
+Size =9
+Align =1
+Text =5
+
+[TopTextNumber6]
+X =60
+Y =392
+Color =White
+Font =1
+Size =9
+Align =1
+Text =6
+
+[TopTextNumber7]
+X =60
+Y =442
+Color =White
+Font =1
+Size =9
+Align =1
+Text =7
+
+[TopTextNumber8]
+X =60
+Y =492
+Color =White
+Font =1
+Size =9
+Align =1
+Text =8
+
+[TopStaticNumber1]
+Tex=PlayerNumberBox
+X=40
+Y=135
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[TopStaticNumber2]
+Tex=PlayerNumberBox
+X=40
+Y=185
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[TopStaticNumber3]
+Tex=PlayerNumberBox
+X=40
+Y=235
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[TopStaticNumber4]
+Tex=PlayerNumberBox
+X=40
+Y=285
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[TopStaticNumber5]
+Tex=PlayerNumberBox
+X=40
+Y=335
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[TopStaticNumber6]
+Tex=PlayerNumberBox
+X=40
+Y=385
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[TopStaticNumber7]
+Tex=PlayerNumberBox
+X=40
+Y=435
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[TopStaticNumber8]
+Tex=PlayerNumberBox
+X=40
+Y=485
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+####### ScreenSing ########
+[VideoAspectText]
+X =400
+Y =40
+Color =Black
+Font =1
+Size =9
+Align =1
+Text =blub
+
+[VideoAspectStatic]
+Tex=LyricBar
+X=320
+Y=35
+W=160
+H=38
+Color =GrayLightest
+Type=Font Black
+
+[SingSongNameStatic]
+X = 5
+Y = 3
+W = 790
+H = 30
+Tex = Leiste2
+Color = White
+Type = Plain
+
+[SingSongNameText]
+Text = should not see me
+X = 400
+Y = 5
+Font = 1
+Size = 8
+Color = Black
+Align = 1
+
+####### ScreenScore ########
+
+[ScoreMedleyNavStatic]
+X = 525
+Y = 553
+W = 26
+H = 22
+Tex = ButtonNavi
+Color =White
+Type=Plain
+
+[ScoreMedleyNavText]
+X = 560
+Y = 552
+Color = Black
+Font = 0
+Size = 7
+Align = 0
+Text = SCORE_LEGEND_SCROLL
+
+####### HelpPopup ########
+
+[HelpPopupButton1]
+X = 350
+Y = 540
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[HelpPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=OK
+Align=1
+Z=1
+
+####### PartyNewRound ########
+[PartyNewRound]
+Texts =7
+
+[PartyNewRoundBackground]
+Tex=MainBG
+
+[PartyNewRoundStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+
+[PartyNewRoundText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyNewRoundText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_ROUND_DESC
+
+[PartyNewRoundText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_ROUND_WHEREAMI
+
+[PartyNewRoundText4]
+X =290
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_ROUND_LEGEND_CONTINUE
+
+[PartyNewRoundText5]
+X =445
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND
+Align=0
+
+[PartyNewRoundText6]
+X =635
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND_WINNER
+Align=0
+
+[PartyNewRoundText7]
+X =448
+Y =350
+Color =White
+Font =0
+Size =18
+Text =PARTY_ROUND
+Align=2
+
+[PartyNewRoundText8]
+X = 560
+Y = 552
+Color = Black
+Font = 0
+Size = 7
+Align = 0
+Text = PARTY_ROUNDM2_LEGEND_SCROLL
+
+[PartyNewRoundTextTeam1Players]
+X =30
+Y =137
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam2Players]
+X =30
+Y =218
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam3Players]
+X =30
+Y =299
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundStatic4]
+Tex =PartyRoundBG1
+X =440
+Y =103
+W = 340
+H = 24
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[PartyNewRoundStatic5]
+X =260
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[PartyNewRoundStatic6]
+Tex =PartyRoundBG3
+X =250
+Y =350
+W = 300
+H = 50
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[PartyNewRoundStatic7]
+Tex =PartyRoundBG4
+X =50
+Y =495
+W = 700
+H = 30
+Int=1
+Color =ColorLight
+Type=Font Black
+
+[PartyNewRoundStatic8]
+X = 525
+Y = 553
+W = 26
+H = 22
+Tex = ButtonNavi
+Color =White
+Type=Plain
+
+[PartyNewRoundStaticTeam1]
+Tex =PartyTeamButton1
+X =20
+Y =110
+W =400
+H =50
+Int=1
+Color =P1Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam2]
+Tex =PartyTeamButton1
+X =20
+Y =191
+W =400
+H =50
+Int=1
+Color =P2Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam3]
+Tex =PartyTeamButton1
+X =20
+Y =272
+W =400
+H =50
+Int=1
+Color =P3Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticNextPlayer1]
+Tex=PartyPlayerButton
+X=155
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P1Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer2]
+Tex=PartyPlayerButton
+X=325
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P2Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer3]
+Tex=PartyPlayerButton
+X=495
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P3Light
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyNewRoundTextRound1]
+X =445
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Round 1
+Align=0
+
+[PartyNewRoundTextRound2]
+X =445
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Round 2
+Align=0
+
+[PartyNewRoundTextRound3]
+X =445
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Round 3
+Align=0
+
+[PartyNewRoundTextRound4]
+X =445
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Round 4
+Align=0
+
+[PartyNewRoundTextRound5]
+X =445
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Round 5
+Align=0
+
+[PartyNewRoundTextRound6]
+X =445
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Round 6
+Align=0
+
+[PartyNewRoundTextRound7]
+X =445
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Round 7
+Align=0
+
+[PartyNewRoundTextWinner1]
+X =635
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Winner 1
+Align=0
+
+[PartyNewRoundTextWinner2]
+X =635
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Winner 2
+Align=0
+
+[PartyNewRoundTextWinner3]
+X =635
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Winner 3
+Align=0
+
+[PartyNewRoundTextWinner4]
+X =635
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Winner 4
+Align=0
+
+[PartyNewRoundTextWinner5]
+X =635
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Winner 5
+Align=0
+
+[PartyNewRoundTextWinner6]
+X =635
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Winner 6
+Align=0
+
+[PartyNewRoundTextWinner7]
+X =635
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Winner 7
+Align=0
+
+[PartyNewRoundStaticRound1]
+Tex =PartyRoundBG2
+X =440
+Y =135
+W = 340
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound2]
+Tex =PartyRoundBG2
+X =440
+Y =164
+W = 340
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound3]
+Tex =PartyRoundBG2
+X =440
+Y =193
+W = 340
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound4]
+Tex =PartyRoundBG2
+X =440
+Y =222
+W = 340
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound5]
+Tex =PartyRoundBG2
+X =440
+Y =251
+W = 340
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound6]
+Tex =PartyRoundBG2
+X =440
+Y =280
+W = 340
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound7]
+Tex =PartyRoundBG2
+X =440
+Y =309
+W = 340
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundTextNextRound]
+X =400
+Y =495
+Color =White
+Font =0
+Size =10
+Text =Next Round
+Align=1
+
+[PartyNewRoundTextNextRoundNo]
+X =457
+Y =350
+Color =White
+Font =0
+Size =18
+Text =99
+Align=0
+
+[PartyNewRoundTextScoreTeam1]
+X =390
+Y =110
+Color =White
+Font =0
+Size =17
+Text =3000
+Align=1
+
+[PartyNewRoundTextScoreTeam2]
+X =390
+Y =191
+Color =White
+Font =0
+Size =17
+Text =2000
+Align=1
+
+[PartyNewRoundTextScoreTeam3]
+X =390
+Y =272
+Color =White
+Font =0
+Size =17
+Text =1000
+Align=1
+
+[PartyNewRoundTextNameTeam1]
+X =30
+Y =108
+Color =White
+Font =0
+Size =12
+Text =Team 1
+Align=0
+
+[PartyNewRoundTextNameTeam2]
+X =30
+Y =189
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyNewRoundTextNameTeam3]
+X =30
+Y =270
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyNewRoundTextNextPlayer1]
+X =230
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 1
+Align=1
+
+[PartyNewRoundTextNextPlayer2]
+X =400
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 2
+Align=1
+
+[PartyNewRoundTextNextPlayer3]
+X =570
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 3
+Align=1
+
+####### Options Graphic ########
+
+[OptionsGraphicsSelectMoviePreview]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_MOVIE_PREVIEW
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black \ No newline at end of file
diff --git a/Game/Output/Themes/TODOs/Blue Sensation.ini b/Game/Output/Themes/TODOs/Blue Sensation.ini
new file mode 100644
index 00000000..7aaea6ed
--- /dev/null
+++ b/Game/Output/Themes/TODOs/Blue Sensation.ini
@@ -0,0 +1,7955 @@
+;1.0.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Theme]
+Name=Blue Sensation
+Creator=Charis
+
+[Colors]
+White = 255 255 255
+LightBlue = 119 187 210
+DarkBlue = 28 126 171
+LightRed = 170 146 146
+DarkRed = 155 113 113
+LightGreen = 136 168 136
+DarkGreen = 106 152 104
+LightPurple = 155 136 168
+DarkPurple = 145 104 152
+LightOrange = 168 155 136
+DarkOrange = 151 131 76
+LightYellow = 168 168 136
+DarkYellow = 150 151 76
+Turkis = 13 186 167
+GrayLightest = 223 223 223
+GrayLight = 191 191 191
+Gray = 127 127 127
+GrayDark = 63 63 63
+Black =0 0 0
+GrayPopup = 51 51 51
+Gold = 255 223 31
+Silver = 223 223 223
+Bronze = 205 127 50
+
+[Loading]
+Texts =2
+Fade = 1
+
+[LoadingBackground]
+Tex=LoadingBG
+
+[LoadingText1]
+X =285
+Y =380
+Color =White
+Font =0
+Align =1
+Size =10
+Text =SING_LOADING
+
+[LoadingText2]
+X =555
+Y =385
+Color=White
+Font =0
+Size =8
+Align=2
+Text=US_VERSION
+
+[Main]
+Texts =2
+Statics=4
+
+[MainBackground]
+Tex=MenuBG
+
+[MainStatic1]
+X =0
+Y =0
+W =0
+H =0
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic2]
+X =252
+Y =0
+W =0
+H =0
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic3]
+X =180
+Y =500
+W =24
+H =0
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[MainText2]
+X =210
+Y =502
+Color=White
+Font =0
+Size =1
+Align=1
+TEXT=.
+
+[MainStatic4]
+X =330
+Y =500
+W =24
+H =0
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[MainText1]
+X =350
+Y =462
+Color=White
+Font =0
+Size =8
+Align=center
+Text=SING_MENU
+
+[MainTextDescriptionLong]
+X =400
+Y =502
+Color=White
+Font =0
+Size =6
+Align=1
+Text=
+
+[MainButtonSolo]
+X =160
+Y =380
+W =30
+H =30
+Tex =Buttonmenu
+Color =White
+DColor =White
+Type=Font Black
+Texts=1
+Reflection=0
+ReflectionSpacing=2
+DeSelectReflectionSpacing=2
+Fade=1
+FadeText=1
+SelectH=35
+FadeTex=ButtonFadeMenu
+FadeTexPos=0
+
+[MainButtonSoloText1]
+X =15
+Y =0
+Font=0
+Size=9
+Align=1
+Text=SING_SING
+Color=White
+
+[MainButtonMulti]
+X =250
+Y =380
+W =30
+H =30
+Tex =Buttonmenu
+Color =White
+DColor =White
+Type=Font Black
+Texts=1
+Reflection=0
+ReflectionSpacing=2
+DeSelectReflectionSpacing=2
+Fade=1
+FadeText=1
+SelectH=35
+FadeTex=ButtonFadeMenu
+FadeTexPos=0
+
+[MainButtonMultiText1]
+X =15
+Y =0
+Font=0
+Size=9
+Align=1
+Text=SING_MULTI
+Color=White
+
+[MainButtonStats]
+X =355
+Y =380
+W =30
+H =30
+Tex =Buttonmenu
+Color =White
+DColor =White
+Type=Font Black
+Texts=1
+Reflection=0
+ReflectionSpacing=2
+DeSelectReflectionSpacing=2
+Fade=1
+FadeText=1
+SelectH=35
+FadeTex=ButtonFadeMenu
+FadeTexPos=0
+
+[MainButtonStatsText1]
+X =15
+Y =0
+Font=0
+Size=9
+Align=1
+Text=SING_STATS
+Color=White
+
+[MainButtonOptions]
+X =465
+Y =380
+W =30
+H =30
+Tex =Buttonmenu
+Color =White
+DColor =White
+Type=Font Black
+Texts=1
+Reflection=0
+ReflectionSpacing=2
+DeSelectReflectionSpacing=2
+Fade=1
+FadeText=1
+SelectH=35
+FadeTex=ButtonFadeMenu
+FadeTexPos=0
+
+[MainButtonOptionsText1]
+X =15
+Y =0
+Font=0
+Size=9
+Align=1
+Text=SING_OPTIONS
+Color=White
+
+[MainButtonExit]
+X =575
+Y =380
+W =30
+H =30
+Tex =Buttonmenu
+Color =White
+DColor =White
+Type=Font Black
+Texts=1
+Reflection=0
+ReflectionSpacing=2
+DeSelectReflectionSpacing=2
+Fade=1
+FadeText=1
+SelectH=35
+FadeTex=ButtonFadeMenu
+FadeTexPos=0
+
+[MainButtonExitText1]
+X =15
+Y =0
+Font=0
+Size=9
+Align=1
+Text=SING_EXIT
+Color=White
+
+[Song]
+Texts =3
+
+[SongBackground]
+Tex=SongBG
+
+[SongCover]
+X=305
+Y=125
+W=320
+H=190
+Z=0.99
+Style=5
+Reflections=1
+
+[SongEqualizer]
+Visible=1
+Direction=1
+Color=White
+Alpha=1
+X=230
+Y=501
+Z=1
+PieceW=4
+PieceH=2
+Space=1
+Bands=20
+Length=6
+
+[SongVideoIcon]
+X =750
+Y =544
+W =27
+H =24
+Color=White
+Tex =VideoIcon
+Type=Font Black
+
+[SongStatic1]
+X =0
+Y =550
+W =180
+H =0
+Tex=Leiste1
+Color =White
+Type=Transparent
+Reflection=0
+ReflectionSpacing=1
+
+[SongStatic2]
+X =150
+Y =540
+W =600
+H =0
+Tex=Leiste2
+Color =White
+Type=Font Black
+Reflection=0
+ReflectionSpacing=1
+
+[SongStatic3]
+X =200
+Y =378
+W =400
+H =140
+Z =0.98
+Color =ColorLight
+Tex =SongSelection1
+Type=Font Black
+
+[SongStatic4]
+X =300
+Y =120
+W =200
+H =200
+Z=0.5
+Color =ColorDark
+Tex =SongSelection2
+Type=Font Black
+
+[SongTextCat]
+X =70
+Y =58
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_SONG_SELECTION_DESC
+
+[SongTextArtist]
+X =398
+Y =400
+W =394
+Color=White
+Font =1
+Size =9
+Align =1
+Text=
+
+[SongTextTitle]
+X =400
+Y =450
+W =390
+Color=White
+Font =0
+Size =9
+Align =1
+Text=
+
+[SongTextNumber]
+X =580
+Y =485
+Color=White
+Font =0
+Size =8
+Align =2
+Text=
+
+#Variable statics and texts for song-screen in sing- and partymode
+# There can be an unlimited Number of Statics and Texts, As long
+# as the numbers are in order.
+# Statics that are shown in PartyMode Only are Named_
+# SongStaticParty[No]
+# Texts that are shown in PartyMode Only are Named_
+# SongTextParty[No]
+# Statics that are shown in Normal Mode Only are Named_
+# SongStaticNonParty[No]
+# Texts that are shown in Normal Mode Only are Named_
+# SongTextNonParty[No]
+#Here are the ones for singmode
+
+[SongStaticNonParty1]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =SongCD
+Type=Font Black
+
+[SongStaticNonParty2]
+X =202
+Y =545
+W =22
+H =22
+Tex=ButtonAlt
+Color =White
+Type=Font Black
+
+[SongStaticNonParty3]
+X =247
+Y =545
+W =22
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Font Black
+
+[SongStaticNonParty4]
+X =370
+Y =545
+W =22
+H =22
+Tex=ButtonM
+Color =White
+Type=Font Black
+
+[SongStaticNonParty5]
+X =475
+Y =545
+W =22
+H =22
+Tex=ButtonJ
+Color =White
+Type=Font Black
+
+[SongStaticNonParty6]
+X =624
+Y =545
+W =22
+H =22
+Tex=ButtonP
+Color =White
+Type=Font Black
+
+#Texts Non Party
+[SongTextNonParty1]
+X =70
+Y =11
+Color=White
+Font =0
+Size =20
+Text=SING_SONG_SELECTION
+Align=0
+
+[SongTextNonParty2]
+X =130
+Y =545
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_SONG_SELECTION_WHEREAMI
+
+[SongTextNonParty3]
+X =232
+Y =548
+Color=White
+Font =1
+Size =5
+Align=0
+Text=+
+
+[SongTextNonParty4]
+X =280
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_GOTO
+
+[SongTextNonParty5]
+X =400
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_MENU
+
+[SongTextNonParty6]
+X =505
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SONG_JUMPTO_DESC
+
+[SongTextNonParty7]
+X =655
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_PLAYLIST
+
+
+#and theese are the ones for partymode
+
+[SongStaticParty1]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[SongStaticParty2]
+X =240
+Y =546
+W =22
+H =22
+Tex=Button13
+Color =White
+Type=Font Black
+
+[SongStaticParty3]
+X =400
+Y =546
+W =22
+H =22
+Tex=ButtonM
+Color =White
+Type=Font Black
+
+[SongStaticParty4]
+X =540
+Y =546
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+#Texts for Party Mode
+
+[SongTextParty1]
+X =70
+Y =11
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[SongTextParty2]
+X =140
+Y =545
+Color=White
+Font =0
+Size =6
+Align=2
+Text=PARTY_SONG_WHEREAMI
+
+[SongTextParty3]
+X =273
+Y =545
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SONG_MENU_NAME_PARTY_JOKER
+
+[SongTextParty4]
+X =426
+Y =545
+Color=White
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_MENU
+
+[SongTextParty5]
+X =570
+Y =545
+Color=White
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_LEGEND_CONTINUE
+
+#variable statics end
+
+
+# Jokers, 5 for each team, only shown in party Mode
+[SongStaticTeam1Joker1]
+Tex =Joker
+X =5
+Y =380
+W =20
+H =20
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker2]
+Tex =Joker
+X =35
+Y =380
+W =20
+H =20
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker3]
+Tex =Joker
+X =65
+Y =380
+W =20
+H =20
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker4]
+Tex =Joker
+X =95
+Y =380
+W =20
+H =20
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker5]
+Tex =Joker
+X =125
+Y =380
+W =20
+H =20
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker1]
+Tex =Joker
+X =5
+Y =430
+W =20
+H =20
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker2]
+Tex =Joker
+X =35
+Y =430
+W =20
+H =20
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker3]
+Tex =Joker
+X =65
+Y =430
+W =20
+H =20
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker4]
+Tex =Joker
+X =95
+Y =430
+W =20
+H =20
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker5]
+Tex =Joker
+X =125
+Y =430
+W =20
+H =20
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker1]
+Tex =Joker
+X =5
+Y =480
+W =20
+H =20
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker2]
+Tex =Joker
+X =35
+Y =480
+W =20
+H =20
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker3]
+Tex =Joker
+X =65
+Y =480
+W =20
+H =20
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker4]
+Tex =Joker
+X =95
+Y =480
+W =20
+H =20
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker5]
+Tex =Joker
+X =125
+Y =480
+W =20
+H =20
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+
+##################### Sing ####################
+
+[SingText1]
+Text =SING_TIME
+X =35
+Y =574
+Font =1
+Size =0
+Color =White
+Align=0
+
+[SingStatic1]
+;TextBG
+Tex =LyricBar
+X =0
+Y =490
+W =800
+H =80
+Color =White
+Type=Font Black
+
+[SingStatic2]
+;TimeBar
+Tex =TimeBar1
+X =0
+Y =570
+W =800
+H =20
+Color=LightBlue
+Type=Font Black
+
+[SingTimeProgress]
+Tex =TimeBar2
+X =52
+Y =578
+W =631
+H =4
+Color=White
+Type=Font Black
+
+[SingStatic3]
+;the thing behind the time progress
+Tex =TimeBar2
+X =50
+Y =576
+W =635
+H =8
+Color=Gray
+Type=Font Black
+
+[SingTimeText]
+Text =SING_TIME
+X =729
+Y =571
+Font =1
+Size =6
+Color =White
+Align=1
+
+
+# O N E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#PlayerOne
+[SingP1Static]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P1Dark
+Type=Font Black
+
+[SingP1Text]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1Static2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P1Dark
+Type=Font Black
+
+[SingP1TextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1SingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T W O P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1TwoPStatic]
+Tex =P
+X =20
+Y =117
+W =33
+H =38
+Color =P1Dark
+Type=Font Black
+
+[SingP1TwoPText]
+Text =P1
+X =26
+Y =122
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1TwoPStatic2]
+Tex =ScoreBG
+X =680
+Y =102
+W =100
+H =34
+Color =P1Dark
+Type=Font Black
+
+[SingP1TwoPTextScore]
+Text =00000
+X =690
+Y =104
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1TwoPSingBar]
+X =680
+Y =136
+W =100
+H =8
+
+#Player Two
+[SingP2RStatic]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P2Dark
+Type=Font Black
+
+[SingP2RText]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP2RStatic2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P2Dark
+Type=Font Black
+
+[SingP2RTextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2RSingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T H R E E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1ThreePStatic]
+Tex =P
+X =25
+Y =59
+W =50
+H =54
+Color =P1Dark
+Type=Font Black
+
+[SingP1ThreePText]
+Text =P1
+X =36
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP1ThreePStatic2]
+Tex =ScoreBG
+X =75
+Y =61
+W =100
+H =34
+Color =P1Dark
+Type=Font Black
+
+[SingP1ThreePTextScore]
+Text =00000
+X =85
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1ThreePSingBar]
+X =75
+Y =95
+W =100
+H =8
+
+#Player Two
+[SingP2MStatic]
+Tex =P
+X =320
+Y =59
+W =50
+H =54
+Color =P2Dark
+Type=Font Black
+
+[SingP2MText]
+Text =P2
+X =330
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP2MStatic2]
+Tex =ScoreBG
+X =370
+Y =61
+W =100
+H =34
+Color =P2Dark
+Type=Font Black
+
+[SingP2MTextScore]
+Text =00000
+X =380
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2MSingBar]
+X =370
+Y =95
+W =100
+H =8
+
+#Player Three
+[SingP3RStatic]
+Tex =P
+X =620
+Y =59
+W =50
+H =54
+Color =P3Dark
+Type=Font Black
+
+[SingP3RText]
+Text =P3
+X =630
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP3RStatic2]
+Tex =ScoreBG
+X =670
+Y =61
+W =100
+H =34
+Color =P3Dark
+Type=Font Black
+
+[SingP3RTextScore]
+Text =00000
+X =680
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP3SingBar]
+X =670
+Y =95
+W =100
+H =8
+
+[Score]
+Texts =1
+
+[ScoreBackground]
+Tex=ScoreScreenBG
+
+[ScoreText1]
+X =70
+Y =11
+Color=White
+Font =0
+Size =20
+Text=SONG_SCORE
+Align=0
+
+[ScoreTextArtistTitle]
+X =70
+Y =60
+Color=White
+Font =0
+Size =8
+Align =0
+Text=ArtistTitle
+
+[ScoreStatic1]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[ScoreStatic2]
+X =0
+Y =549
+W =252
+H =0
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreStatic3]
+X =252
+Y =549
+W =548
+H =0
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreText2]
+X =100
+Y =545
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SONG_SCORE_WHEREAMI
+
+[ScoreStatic4]
+X =260
+Y =546
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[ScoreText3]
+X =290
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+#end of main stuff
+
+# # # # # # # # # # # # # # # # # # One Player Score # # # # # # # # # # # #
+[ScoreTextName1]
+X =175
+Y =260
+Font =0
+Size =14
+Text =P1
+Color =White
+Align=0
+
+[ScoreTextScore1]
+X =175
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes1]
+X =175
+Y =340
+Color=White
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore1]
+X =465
+Y =340
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextLineBonus1]
+X =175
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore1]
+X =465
+Y =370
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextGoldenNotes1]
+X =175
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore1]
+X =465
+Y =400
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextTotal1]
+X =205
+Y =460
+Color=White
+Font =0
+Size =14
+Text=SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore1]
+X =465
+Y =460
+Color=White
+Font =0
+Size =14
+Align =2
+Text =0
+
+#Lines
+[ScorePlayer1Static1]
+Tex =ScoreLine
+X =173
+Y =338
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static2]
+Tex =ScoreLine
+X =173
+Y =368
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static3]
+Tex =ScoreLine
+X =173
+Y =398
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static4]
+Tex =ScoreLine
+X =173
+Y =428
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static5]
+Tex =ScoreLine
+X =173
+Y =458
+W =295
+H =4
+Type =Font Black
+Color =White
+
+[ScoreStaticBoxDark1]
+Tex =PlayerNumberBox
+X =175
+Y =467
+W =25
+H =24
+Type =Font Black
+Color =P1Dark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Text1]
+X =179
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel1]
+Tex =ScoreLevel
+X =475
+Y =160
+W =150
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =130
+W =150
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel1]
+Tex =ScoreLevel
+X =475
+Y =410
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =380
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer1Static6]
+Tex =ScoreEndCap
+X =494
+Y =460
+W =112
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Static7]
+Tex =ScoreLine
+X =493
+Y =460
+W =114
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+
+# # # # # # # # # # # # # # # # # # Two Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName2]
+X =20
+Y =260
+Font =0
+Size =14
+Text =P1
+Color =White
+Align=0
+
+[ScoreTextScore2]
+X =20
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes2]
+X =20
+Y =340
+Color=White
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore2]
+X =300
+Y =340
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextLineBonus2]
+X =20
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore2]
+X =300
+Y =370
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextGoldenNotes2]
+X =20
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore2]
+X =300
+Y =400
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextTotal2]
+X =50
+Y =460
+Color=White
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore2]
+X =300
+Y =460
+Color=White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+# Lines
+[ScorePlayer2Static1]
+Tex =ScoreLine
+X =20
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static2]
+Tex =ScoreLine
+X =20
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static3]
+Tex =ScoreLine
+X =20
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static4]
+Tex =ScoreLine
+X =20
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static5]
+Tex =ScoreLine
+X =20
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =White
+
+[ScoreStaticBoxDark2]
+Tex =PlayerNumberBox
+X =20
+Y =467
+W =25
+H =24
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Text1]
+X =24
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel2]
+Tex =ScoreLevel
+X =293
+Y =160
+W =120
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =130
+W =120
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScoreStaticLevel2]
+Tex =ScoreLevel
+X =293
+Y =410
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =380
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScorePlayer2Static6]
+Tex =ScoreEndCap
+X =308
+Y =460
+W =90
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Static7]
+Tex =ScoreLine
+X =307
+Y =460
+W =92
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# P L A Y E R T W O
+[ScoreTextName3]
+X =780
+Y =260
+Font =0
+Size =14
+Text =P2
+Color =White
+Align=2
+
+[ScoreTextScore3]
+X =780
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=2
+
+[ScoreTextNotes3]
+X =780
+Y =340
+Color=White
+Font =0
+Size =9
+Text =SING_NOTES
+Align=2
+
+[ScoreTextNotesScore3]
+X =500
+Y =340
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextLineBonus3]
+X =780
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=2
+
+[ScoreTextLineBonusScore3]
+X =500
+Y =370
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextGoldenNotes3]
+X =780
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=2
+
+[ScoreTextGoldenNotesScore3]
+X =500
+Y =400
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextTotal3]
+X =750
+Y =460
+Color=White
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=2
+Reflection=1
+ReflectionSpacing=4
+
+[ScoreTextTotalScore3]
+X =500
+Y =460
+Color=White
+Font =0
+Size =14
+Align =0
+Text =00000
+Reflection=1
+ReflectionSpacing=4
+
+#Lines
+[ScorePlayer3Static1]
+Tex =ScoreLine
+X =500
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static2]
+Tex =ScoreLine
+X =500
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static3]
+Tex =ScoreLine
+X =500
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static4]
+Tex =ScoreLine
+X =500
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static5]
+Tex =ScoreLine
+X =500
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =White
+
+[ScoreStaticBoxDark3]
+Tex =PlayerNumberBox
+X =755
+Y =467
+W =25
+H =24
+Type =Font Black
+Color =P2Dark
+Z=0.9
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Text1]
+X =759
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+#ScoreBar
+[ScoreStaticBackLevel3]
+Tex =ScoreLevel
+X =387
+Y =160
+W =120
+H =300
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =130
+W =120
+H =30
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel3]
+Tex =ScoreLevel
+X =387
+Y =410
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =380
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScorePlayer3Static6]
+Tex =ScoreEndCap
+X =402
+Y =460
+W =90
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Static7]
+Tex =ScoreLine
+X =401
+Y =460
+W =92
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# # # # # # # # # # # # # # # # # # Three Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName4]
+X=20
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P1
+Color=P1Dark
+
+[ScoreTextNotes4]
+X=20
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore4]
+X=260
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus4]
+X=20
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore4]
+X=260
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes4]
+X=20
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore4]
+X=260
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore4]
+X=20
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal4]
+X=47
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore4]
+X=260
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark4]
+Tex =PlayerNumberBox
+X =20
+Y =370
+W =25
+H =24
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer4Text1]
+X =24
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#lines
+[ScorePlayer4Static1]
+X=20
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static2]
+X=20
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static3]
+X=20
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static4]
+X=20
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static5]
+X=20
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+# P L A Y E R T W O
+[ScoreTextName5]
+X=280
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P2
+Color=P2Dark
+
+[ScoreTextNotes5]
+X=280
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore5]
+X=520
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus5]
+X=280
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore5]
+X=520
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes5]
+X=280
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore5]
+X=520
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore5]
+X=280
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal5]
+X=307
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore5]
+X=520
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark5]
+Tex =PlayerNumberBox
+X =280
+Y =370
+W =25
+H =24
+Type =Font Black
+Color =P2Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer5Text1]
+X =284
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+[ScorePlayer5Static1]
+X=280
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static2]
+X=280
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static3]
+X=280
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static4]
+X=280
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static5]
+X=280
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+# P L A Y E R T H R E E
+[ScoreTextName6]
+X=540
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P3
+Color=P3Dark
+
+[ScoreTextNotes6]
+X=540
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore6]
+X=780
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus6]
+X=540
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore6]
+X=780
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes6]
+X=540
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore6]
+X=780
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore6]
+X=540
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal6]
+X=567
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore6]
+X=780
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark6]
+Tex =PlayerNumberBox
+X =540
+Y =370
+W =25
+H =24
+Type =Font Black
+Color =P3Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer6Text1]
+X =544
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P3
+
+#lines
+[ScorePlayer6Static1]
+X=540
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static2]
+X=540
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static3]
+X=540
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static4]
+X=540
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static5]
+X=540
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[Options]
+Texts = 6
+Fade = 2
+
+[OptionsBackground]
+Tex=OptionsBG2
+
+[OptionsStatic1]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsStatic2]
+X =0
+Y =549
+W =252
+H =0
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic3]
+X =252
+Y =549
+W =548
+H =0
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic4]
+X =260
+Y =545
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsStatic5]
+X =388
+Y =545
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsStatic6]
+X =512
+Y =545
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsText1]
+X =70
+Y =11
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsText2]
+X =100
+Y =546
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_WHEREAMI
+
+[OptionsText3]
+X =70
+Y =58
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_DESC
+
+[OptionsText4]
+X =290
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsText5]
+X =418
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_SELECT
+
+[OptionsText6]
+X =545
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsButtonGame]
+X =0
+Y =140
+W =300
+H =30
+Tex =ButtonOptions
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=32
+FadeTex=ButtonFadeMenu
+FadeTexPos=0
+
+[OptionsButtonGameText1]
+X =300
+Y =0
+Font=0
+Size=10
+Align=0
+Text=SING_OPTIONS_GAME
+Color=White
+
+[OptionsButtonGraphics]
+X =0
+Y =185
+W =300
+H =30
+Tex =ButtonOptions
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=32
+FadeTex=ButtonFadeMenu
+FadeTexPos=0
+
+[OptionsButtonGraphicsText1]
+X =300
+Y =0
+Font=0
+Size=10
+Align=0
+Text=SING_OPTIONS_GRAPHICS
+Color=White
+
+[OptionsButtonSound]
+X =0
+Y =230
+W =300
+H =30
+Tex =ButtonOptions
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=32
+FadeTex=ButtonFadeMenu
+FadeTexPos=0
+
+[OptionsButtonSoundText1]
+X =300
+Y =0
+Font=0
+Size=10
+Align=0
+Text=SING_OPTIONS_SOUND
+Color=White
+
+[OptionsButtonLyrics]
+X =0
+Y =275
+W =300
+H =30
+Tex =ButtonOptions
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=32
+FadeTex=ButtonFadeMenu
+FadeTexPos=0
+
+[OptionsButtonLyricsText1]
+X =300
+Y =0
+Font=0
+Size=10
+Align=0
+Text=SING_OPTIONS_LYRICS
+Color=White
+
+[OptionsButtonThemes]
+X =0
+Y =320
+W =300
+H =30
+Tex =ButtonOptions
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=32
+FadeTex=ButtonFadeMenu
+FadeTexPos=0
+
+[OptionsButtonThemesText1]
+X =300
+Y =0
+Font=0
+Size=10
+Align=0
+Text=SING_OPTIONS_THEMES
+Color=White
+
+[OptionsButtonRecord]
+X =0
+Y =365
+W =300
+H =30
+Tex =ButtonOptions
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=32
+FadeTex=ButtonFadeMenu
+FadeTexPos=0
+
+[OptionsButtonRecordText1]
+X =300
+Y =0
+Font=0
+Size=10
+Align=0
+Text=SING_OPTIONS_RECORD
+Color=White
+Texts=1
+
+[OptionsButtonAdvanced]
+X =0
+Y =410
+W =300
+H =30
+Tex =ButtonOptions
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=32
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonAdvancedText1]
+X =300
+Y =0
+Font=0
+Size=10
+Align=0
+Text=SING_OPTIONS_ADVANCED
+Color=White
+Texts=1
+
+[OptionsButtonExit]
+X =0
+Y =455
+W =300
+H =30
+Tex =ButtonOptions
+Color =ColorDark
+DColor =ColorLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=32
+FadeTex=ButtonFadeMenu
+FadeTexPos=0
+
+[OptionsButtonExitText1]
+X =300
+Y =0
+Font=0
+Size=10
+Align=0
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[OptionsGame]
+Texts = 5
+
+[OptionsGameBackground]
+Tex=OptionsBG
+
+[OptionsGameStatic1]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGameStatic2]
+X =0
+Y =549
+W =252
+H =0
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[OptionsGameStatic3]
+X =252
+Y =549
+W =548
+H =0
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[OptionsGameStatic4]
+X =260
+Y =545
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsGameStatic5]
+X =388
+Y =545
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsGameText1]
+X =70
+Y =11
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGameText2]
+X =135
+Y =546
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GAME_WHEREAMI
+
+[OptionsGameText3]
+X =70
+Y =58
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GAME_DESC
+
+[OptionsGameText4]
+X =290
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGameText5]
+X =420
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGameSelectPlayers]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_PLAYERS
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDifficulty]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DIFFICULTY
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+
+[OptionsGameSelectSlideLanguage]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_LANGUAGE
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectTabs]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_TABS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectSlideSorting]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_SORTING
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDebug]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DEBUG
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color =ColorDark
+DColor = ColorLight
+Type = Font Black
+
+[OptionsGraphics]
+Texts = 5
+
+[OptionsGraphicsBackground]
+Tex=OptionsBG
+
+[OptionsGraphicsStatic1]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGraphicsStatic2]
+X =0
+Y =549
+W =252
+H =0
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic3]
+X =252
+Y =549
+W =548
+H =0
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic4]
+X =260
+Y =545
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsGraphicsStatic5]
+X =388
+Y =545
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsGraphicsText1]
+X =70
+Y =11
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGraphicsText2]
+X =135
+Y =546
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GRAPHICS_WHEREAMI
+
+[OptionsGraphicsText3]
+X =70
+Y =58
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GRAPHICS_DESC
+
+[OptionsGraphicsText4]
+X =294
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGraphicsText5]
+X =423
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGraphicsSelectSlideResolution]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_GRAPHICS_RESOLUTION
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectFullscreen]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_FULLSCREEN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectDepth]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_DEPTH
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectOscilloscope]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_OSCILLOSCOPE
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectMovieSize]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_MOVIE_SIZE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsButtonExit]
+X = 40
+Y = 360
+W = 230
+H = 70
+Tex =MainBar
+Color =ColorDark
+DColor = ColorLight
+Type = Font Black
+
+[OptionsSound]
+Texts = 5
+
+[OptionsSoundBackground]
+Tex=OptionsBG
+
+[OptionsSoundStatic1]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsSoundStatic2]
+X =0
+Y =549
+W =252
+H =0
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[OptionsSoundStatic3]
+X =252
+Y =549
+W =548
+H =0
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[OptionsSoundStatic4]
+X =260
+Y =545
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsSoundStatic5]
+X =388
+Y =545
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsSoundText1]
+X =70
+Y =11
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsSoundText2]
+X =135
+Y =546
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_SOUND_WHEREAMI
+
+[OptionsSoundText3]
+X =70
+Y =58
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_SOUND_DESC
+
+[OptionsSoundText4]
+X =294
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsSoundText5]
+X =423
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsSoundSelectMicBoost]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_MIC_BOOST
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectClickAssist]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_CLICK_ASSIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectBeatClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_BEAT_CLICK
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectThreshold]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_THRESHOLD
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectTwoPlayerMode]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_TWO_PLAYERS_MODE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewVolume]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWVOLUME
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewFADING]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWFADING
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color =ColorDark
+DColor = ColorLight
+Type = Font Black
+
+[OptionsLyrics]
+Texts = 1
+
+[OptionsLyricsBackground]
+Tex=OptionsBG
+
+[OptionsLyricsStatic1]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsLyricsStatic2]
+X =0
+Y =549
+W =252
+H =0
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[OptionsLyricsStatic3]
+X =252
+Y =549
+W =548
+H =0
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[OptionsLyricsStatic4]
+X =260
+Y =545
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsLyricsStatic5]
+X =388
+Y =545
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsLyricsText1]
+X =70
+Y =11
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsLyricsText2]
+X =135
+Y =546
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_LYRICS_WHEREAMI
+
+[OptionsLyricsText3]
+X =70
+Y =58
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_LYRICS_DESC
+
+[OptionsLyricsText4]
+X =290
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsLyricsText5]
+X =420
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsLyricsSelectLyricsFont]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_FONT
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectLyricsEffect]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_EFFECT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectSolmization]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_SOLMIZATION
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color =ColorDark
+DColor = ColorLight
+Type = Font Black
+
+[OptionsThemes]
+Texts = 5
+
+[OptionsThemesBackground]
+Tex=OptionsBG
+
+[OptionsThemesStatic1]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsThemesStatic2]
+X =0
+Y =549
+W =252
+H =0
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[OptionsThemesStatic3]
+X =252
+Y =549
+W =548
+H =0
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[OptionsThemesStatic4]
+X =260
+Y =545
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsThemesStatic5]
+X =388
+Y =546
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsThemesText1]
+X =70
+Y =11
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsThemesText2]
+X =140
+Y =546
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_THEMES_WHEREAMI
+
+[OptionsThemesText3]
+X =70
+Y =58
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_THEMES_DESC
+
+[OptionsThemesText4]
+X =294
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsThemesText5]
+X =423
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsThemesSelectTheme]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_THEME
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectSkin]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_SKIN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectColor]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_COLOR
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color =ColorDark
+DColor = ColorLight
+Type = Font Black
+
+[OptionsRecord]
+Texts = 5
+
+[OptionsRecordBackground]
+Tex=OptionsBG
+
+[OptionsRecordStatic1]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsRecordStatic2]
+X =0
+Y =549
+W =252
+H =0
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[OptionsRecordStatic3]
+X =252
+Y =549
+W =548
+H =0
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[OptionsRecordStatic4]
+X =260
+Y =545
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsRecordStatic5]
+X =388
+Y =545
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsRecordText1]
+X =70
+Y =11
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsRecordText2]
+X =138
+Y =546
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_RECORD_WHEREAMI
+
+[OptionsRecordText3]
+X =70
+Y =58
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_RECORD_DESC
+
+[OptionsRecordText4]
+X =290
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsRecordText5]
+X =420
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsRecordSelectSlideCard]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CARD
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideInput]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_INPUT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelL]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELL
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelR]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELR
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordButtonExit]
+X = 40
+Y = 305
+W = 230
+H = 70
+Tex = MainBar
+Color =ColorDark
+DColor = ColorLight
+Type = Font Black
+
+[OptionsAdvanced]
+Texts = 5
+
+[OptionsAdvancedBackground]
+Tex=OptionsBG
+
+[OptionsAdvancedStatic1]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsAdvancedStatic2]
+X =0
+Y =549
+W =252
+H =0
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic3]
+X =252
+Y =549
+W =548
+H =0
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic4]
+X =260
+Y =545
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsAdvancedStatic5]
+X =388
+Y =545
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsAdvancedText1]
+X =70
+Y =11
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsAdvancedText2]
+X =135
+Y =549
+Color=White
+Font =0
+Size =5
+Align=2
+Text=SING_OPTIONS_ADVANCED_WHEREAMI
+
+[OptionsAdvancedText3]
+X =70
+Y =58
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_ADVANCED_DESC
+
+[OptionsAdvancedText4]
+X =290
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsAdvancedText5]
+X =420
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+
+#########unused at the moment#########
+#[OptionsAdvancedSelectLoadAnimation]
+#Tex =MainBar
+#TexSBG =SelectBG
+#Text=SING_OPTIONS_ADVANCED_LOADANIMATION
+#X = 40
+#Y = 85
+#W = 230
+#H = 70
+#SkipX = 50
+
+#Color = ColorDark
+#DColor = Gray
+#TColor = White
+#TDColor = White
+#SBGTex =MainBar
+#SBGColor = ColorDark
+#SBGDColor = Gray
+#STColor = White
+#STDColor = GrayDark
+
+[OptionsAdvancedSelectScreenFade]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_SCREENFADE
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectEffectSing]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_EFFECTSING
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectLineBonus]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_LINEBONUS
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectSlideOnSongClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_ADVANCED_ONSONGCLICK
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectAskbeforeDel]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_ASKBEFOREDEL
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectPartyPopup]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_PARTYPOPUP
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color =ColorDark
+DColor = ColorLight
+Type = Font Black
+
+[Top5]
+Texts=1
+
+[Top5Background]
+Tex=Top5BG
+
+[Top5Text1]
+X =70
+Y =11
+Color=White
+Font =0
+Size =20
+Align=0
+Text =SING_TOP_5_CHARTS
+
+[Top5TextArtistTitle]
+X =70
+Y =60
+Color =White
+Font =0
+Size =8
+Align =0
+Text =artist - title
+
+[Top5Text4]
+X =70
+Y =87
+Color=White
+Font =0
+Size =8
+Align=0
+Text =SING_OPTIONS_GAME_DIFFICULTY
+
+[Top5TextLevel]
+X =270
+Y =87
+Color =White
+Font =0
+Size =8
+Align =1
+Text =easy
+
+[Top5Static1]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[Top5Static2]
+X =0
+Y =549
+W =252
+H =0
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[Top5Static3]
+X =252
+Y =549
+W =548
+H =0
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[Top5Text2]
+X =100
+Y =546
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_TOP_5_CHARTS_WHEREAMI
+
+[Top5Static4]
+X =260
+Y =545
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[Top5Text3]
+X =292
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_TOP_5_CHARTS_CONTINUE
+
+[Top5TextName1]
+X =150
+Y =190
+Color =White
+Font =0
+Size =14
+Align =0
+Text =1. Player1
+
+[Top5TextName2]
+X =150
+Y =240
+Color =White
+Font =0
+Size =14
+Align =0
+Text =2. Player2
+
+[Top5TextName3]
+X =150
+Y =290
+Color =White
+Font =0
+Size =14
+Align =0
+Text =3. Player3
+
+[Top5TextName4]
+X =150
+Y =340
+Color =White
+Font =0
+Size =14
+Align =0
+Text =4. Player4
+
+[Top5TextName5]
+X =150
+Y =390
+Color =White
+Font =0
+Size =14
+Align =0
+Text =5. Player5
+
+[Top5TextScore1]
+X =680
+Y =190
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore2]
+X =680
+Y =240
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore3]
+X =680
+Y =290
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore4]
+X =680
+Y =340
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore5]
+X =680
+Y =390
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextNumber1]
+X =120
+Y =193
+Color =White
+Font =1
+Size =9
+Align =1
+Text =1
+
+[Top5TextNumber2]
+X =120
+Y =243
+Color =White
+Font =1
+Size =9
+Align =1
+Text =2
+
+[Top5TextNumber3]
+X =120
+Y =293
+Color =White
+Font =1
+Size =9
+Align =1
+Text =3
+
+[Top5TextNumber4]
+X =120
+Y =343
+Color =White
+Font =1
+Size =9
+Align =1
+Text =4
+
+[Top5TextNumber5]
+X =120
+Y =393
+Color =White
+Font =1
+Size =9
+Align =1
+Text =5
+
+[Top5StaticNumber1]
+Tex=PlayerNumberBox
+X=100
+Y=186
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber2]
+Tex=PlayerNumberBox
+X=100
+Y=236
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber3]
+Tex=PlayerNumberBox
+X=100
+Y=286
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber4]
+Tex=PlayerNumberBox
+X=100
+Y=336
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber5]
+Tex=PlayerNumberBox
+X=100
+Y=386
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Level]
+Texts=5
+
+[LevelBackground]
+Tex=DiffBG
+
+[LevelStatic1]
+X =0
+Y =549
+W =252
+H =0
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[LevelStatic2]
+X =252
+Y =549
+W =548
+H =0
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[LevelStatic3]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =MainIcon
+Type=Font Black
+
+[LevelStatic4]
+X =260
+Y =545
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[LevelStatic5]
+X =388
+Y =545
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[LevelText1]
+X =70
+Y =11
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=SING_MODE
+
+[LevelText2]
+X =70
+Y =58
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_DIFFICULTY_DESC
+
+[LevelText3]
+X =135
+Y =546
+Color=White
+Font =0
+Size =6
+Align=2
+Text=SING_DIFFICULTY_WHEREAMI
+
+[LevelText4]
+X =290
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[LevelText5]
+X =420
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_DIFFICULTY_CONTINUE
+
+[LevelButtonEasy]
+X =180
+Y =325
+W =150
+H =50
+Tex =ButtonFadeMenu
+Color =ColorDark
+DColor =ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=55
+FadeTex=ButtonOptions
+FadeTexPos=0
+
+[LevelButtonMedium]
+X =335
+Y =325
+W =150
+H =50
+Tex =ButtonFadeMenu
+Color =ColorDark
+DColor =ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=55
+FadeTex=ButtonOptions
+FadeTexPos=0
+
+
+[LevelButtonHard]
+X =490
+Y =325
+W =150
+H =50
+Tex =ButtonFadeMenu
+Color =ColorDark
+DColor =ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=55
+FadeTex=ButtonOptions
+FadeTexPos=0
+
+
+[LevelButtonEasyText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=SING_EASY
+
+[LevelButtonMediumText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=SING_MEDIUM
+
+[LevelButtonHardText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=SING_HARD
+
+[Name]
+Texts=2
+
+[NameBackground]
+Tex=NameBG
+
+[NameStatic1]
+X =0
+Y =549
+W =252
+H =0
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[NameStatic2]
+X =252
+Y =549
+W =548
+H =0
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[NameStatic3]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =MainIcon
+Type=Font Black
+
+[NameText1]
+X =70
+Y =11
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=SING_MODE
+
+[NameText2]
+X =70
+Y =58
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_PLAYER_DESC
+
+[NameText3]
+X =135
+Y =546
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_PLAYER_WHEREAMI
+
+[NameStatic4]
+X =260
+Y =545
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[NameText4]
+X =294
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[NameStatic5]
+X =388
+Y =545
+W =22
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Font Black
+Style=5
+
+[NameText5]
+X =420
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_PLAYER_ENTER_NAME
+
+[NameStatic6]
+X =556
+Y =545
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[NameText6]
+X =586
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[NameButtonPlayer1]
+X =180
+Y =270
+W =150
+H =50
+Tex =Button
+Color =P1Dark
+DColor = P1Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer1Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer2]
+X =335
+Y =270
+W =150
+H =50
+Tex =Button
+Color =P2Dark
+DColor = P2Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer2Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer3]
+X =490
+Y =270
+W =150
+H =50
+Tex =Button
+Color =P3Dark
+DColor = P3Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer3Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer4]
+X =180
+Y =400
+W =150
+H =50
+Tex =Button
+Color =P4Dark
+DColor = P4Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer4Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer5]
+X =335
+Y =400
+W =150
+H =50
+Tex =Button
+Color =P5Dark
+DColor = P5Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer5Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer6]
+X =490
+Y =400
+W =150
+H =50
+Tex =Button
+Color =P6Dark
+DColor = P6Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer6Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[PartyNewRound]
+Texts =7
+
+[PartyNewRoundBackground]
+Tex=PartyBGNext
+
+[PartyNewRoundStatic1]
+X =0
+Y =549
+W =252
+H =0
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[PartyNewRoundStatic2]
+X =252
+Y =549
+W =548
+H =0
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[PartyNewRoundStatic3]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyNewRoundText1]
+X =70
+Y =11
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyNewRoundText2]
+X =70
+Y =58
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_ROUND_DESC
+
+[PartyNewRoundText3]
+X =138
+Y =550
+Color=White
+Font =0
+Size =5
+Align=2
+Text=PARTY_ROUND_WHEREAMI
+
+[PartyNewRoundText4]
+X =290
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=PARTY_ROUND_LEGEND_CONTINUE
+
+[PartyNewRoundText5]
+X =460
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND
+Align=0
+
+[PartyNewRoundText6]
+X =600
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND_WINNER
+Align=0
+
+[PartyNewRoundText7]
+X =448
+Y =350
+Color =White
+Font =0
+Size =18
+Text =PARTY_ROUND
+Align=2
+
+[PartyNewRoundTextTeam1Players]
+X =30
+Y =137
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam2Players]
+X =30
+Y =218
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam3Players]
+X =30
+Y =299
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundStatic4]
+Tex =PartyRoundBG1
+X =450
+Y =103
+W = 330
+H = 24
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[PartyNewRoundStatic5]
+X =260
+Y =545
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[PartyNewRoundStatic6]
+Tex =PartyRoundBG3
+X =20
+Y =350
+W =760
+H = 50
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[PartyNewRoundStatic7]
+Tex =PartyRoundBG4
+X =20
+Y =495
+W =760
+H = 30
+Int=1
+Color =ColorLight
+Type=Font Black
+
+[PartyNewRoundStaticTeam1]
+Tex =PartyTeamButton1
+X =20
+Y =110
+W =400
+H =50
+Int=1
+Color =P1Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam2]
+Tex =PartyTeamButton1
+X =20
+Y =191
+W =400
+H =50
+Int=1
+Color =P2Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam3]
+Tex =PartyTeamButton1
+X =20
+Y =272
+W =400
+H =50
+Int=1
+Color =P3Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticNextPlayer1]
+Tex=PartyPlayerButton
+X=155
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P1Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer2]
+Tex=PartyPlayerButton
+X=325
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P2Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer3]
+Tex=PartyPlayerButton
+X=495
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P3Light
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyNewRoundTextRound1]
+X =460
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Round 1
+Align=0
+
+[PartyNewRoundTextRound2]
+X =460
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Round 2
+Align=0
+
+[PartyNewRoundTextRound3]
+X =460
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Round 3
+Align=0
+
+[PartyNewRoundTextRound4]
+X =460
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Round 4
+Align=0
+
+[PartyNewRoundTextRound5]
+X =460
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Round 5
+Align=0
+
+[PartyNewRoundTextRound6]
+X =460
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Round 6
+Align=0
+
+[PartyNewRoundTextRound7]
+X =460
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Round 7
+Align=0
+
+[PartyNewRoundTextWinner1]
+X =600
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Winner 1
+Align=0
+
+[PartyNewRoundTextWinner2]
+X =600
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Winner 2
+Align=0
+
+[PartyNewRoundTextWinner3]
+X =600
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Winner 3
+Align=0
+
+[PartyNewRoundTextWinner4]
+X =600
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Winner 4
+Align=0
+
+[PartyNewRoundTextWinner5]
+X =600
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Winner 5
+Align=0
+
+[PartyNewRoundTextWinner6]
+X =600
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Winner 6
+Align=0
+
+[PartyNewRoundTextWinner7]
+X =600
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Winner 7
+Align=0
+
+[PartyNewRoundStaticRound1]
+Tex =PartyRoundBG2
+X =450
+Y =135
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound2]
+Tex =PartyRoundBG2
+X =450
+Y =164
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound3]
+Tex =PartyRoundBG2
+X =450
+Y =193
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound4]
+Tex =PartyRoundBG2
+X =450
+Y =222
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound5]
+Tex =PartyRoundBG2
+X =450
+Y =251
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound6]
+Tex =PartyRoundBG2
+X =450
+Y =280
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound7]
+Tex =PartyRoundBG2
+X =450
+Y =309
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundTextNextRound]
+X =400
+Y =495
+Color =White
+Font =0
+Size =10
+Text =Next Round
+Align=1
+
+[PartyNewRoundTextNextRoundNo]
+X =457
+Y =350
+Color =White
+Font =0
+Size =18
+Text =99
+Align=0
+
+[PartyNewRoundTextScoreTeam1]
+X =390
+Y =110
+Color =White
+Font =0
+Size =17
+Text =3000
+Align=1
+
+[PartyNewRoundTextScoreTeam2]
+X =390
+Y =191
+Color =White
+Font =0
+Size =17
+Text =2000
+Align=1
+
+[PartyNewRoundTextScoreTeam3]
+X =390
+Y =272
+Color =White
+Font =0
+Size =17
+Text =1000
+Align=1
+
+[PartyNewRoundTextNameTeam1]
+X =30
+Y =108
+Color =White
+Font =0
+Size =12
+Text =Team 1
+Align=0
+
+[PartyNewRoundTextNameTeam2]
+X =30
+Y =189
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyNewRoundTextNameTeam3]
+X =30
+Y =270
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyNewRoundTextNextPlayer1]
+X =230
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 1
+Align=1
+
+[PartyNewRoundTextNextPlayer2]
+X =400
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 2
+Align=1
+
+[PartyNewRoundTextNextPlayer3]
+X =570
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 3
+Align=1
+
+
+[PartyScore]
+Texts=5
+
+[PartyScoreBackground]
+Tex=PartyScoreBG
+
+[PartyScoreDecoTextures]
+ChangeTextures =1
+
+FirstTexture =PartyScoreDeco
+FirstTyp =Font Black
+FirstColor =Gold
+
+SecondTexture =PartyScoreDeco
+SecondTyp =Font Black
+SecondColor =Silver
+
+ThirdTexture =PartyScoreDeco
+ThirdTyp =Font Black
+ThirdColor =Bronze
+
+[PartyScoreStatic1]
+X =0
+Y =549
+W =252
+H =0
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[PartyScoreStatic2]
+X =252
+Y =549
+W =548
+H =0
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[PartyScoreStatic3]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyScoreStatic4]
+X =260
+Y =545
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[PartyScoreText1]
+X =70
+Y =11
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyScoreText2]
+X =70
+Y =58
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_SCORE_DESC
+
+[PartyScoreText3]
+X =135
+Y =546
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_SCORE_WHEREAMI
+
+[PartyScoreText4]
+X =290
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=PARTY_LEGEND_CONTINUE
+
+[PartyScoreStatic5]
+Tex =PartyScoreBG1
+X =50
+Y =110
+W = 700
+H = 80
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[PartyScoreStatic6]
+Tex =PartyScoreBG2
+X =50
+Y =495
+W = 700
+H = 20
+Int=1
+Color =ColorLight
+Type=Font Black
+
+[PartyScoreText5]
+X =400
+Y =136
+Color =White
+Font =0
+Size =15
+Text =PARTY_SCORE_WINS2
+Align=1
+
+[PartyScoreTextWinner]
+X =400
+Y =98
+Color =White
+Font =0
+Size =18
+Text =The Winner is...
+Align=1
+
+[PartyScoreTextScoreTeam1]
+X =568
+Y =208
+Color =White
+Font =0
+Size =12
+Text =3000
+Align=2
+
+[PartyScoreTextScoreTeam2]
+X =568
+Y =308
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyScoreTextScoreTeam3]
+X =568
+Y =398
+Color =White
+Font =0
+Size =12
+Text =1000
+Align=2
+
+[PartyScoreTextNameTeam1]
+X =188
+Y =208
+Font=0
+Size=12
+Align=0
+Text=Team 1
+Color=White
+
+[PartyScoreTextNameTeam2]
+X =188
+Y =308
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyScoreTextNameTeam3]
+X =188
+Y =398
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyScoreStaticTeam1]
+X =188
+Y =240
+W =380
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam1BG]
+Tex=PartyTeamButton2
+X=178
+Y=210
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam1Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 191
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam2]
+X =188
+Y =340
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam2BG]
+Tex=PartyTeamButton2
+X=178
+Y=310
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam2Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam3]
+X =188
+Y =430
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam3BG]
+Tex=PartyTeamButton2
+X=178
+Y=400
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam3Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 391
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyWin]
+Texts=4
+
+[PartyWinBackground]
+Tex=PartyBGWin
+
+[PartyWinStatic1]
+X =0
+Y =549
+W =252
+H =0
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[PartyWinStatic2]
+X =252
+Y =549
+W =548
+H =0
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[PartyWinStatic3]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyWinStatic4]
+X =260
+Y =545
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[PartyWinText1]
+X =70
+Y =11
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyWinText2]
+X =70
+Y =58
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_WIN_DESC
+
+[PartyWinText3]
+X =138
+Y =546
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_WIN_WHEREAMI
+
+[PartyWinText4]
+X =290
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=PARTY_WIN_LEGEND_CONTINUE
+
+#[PartyWinTextWinner]
+#X =150
+#Y =120
+#Color =White
+#Font =1
+#Size =14
+#Text =The Winner is...
+#Align=0
+
+[PartyWinTextScoreTeam1]
+X =599
+Y =183
+Color =White
+Font =0
+Size =19
+Text =3000
+Align=2
+
+[PartyWinTextScoreTeam2]
+X =449
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyWinTextScoreTeam3]
+X =349
+Y =398
+Color =White
+Font =0
+Size =9
+Text =1000
+Align=2
+
+[PartyWinTextNameTeam1]
+X =69
+Y =183
+Font=0
+Size=19
+Align=0
+Text=Team 1
+Color=White
+
+[PartyWinTextNameTeam2]
+X =69
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyWinTextNameTeam3]
+X =69
+Y =398
+Color =White
+Font =0
+Size =9
+Text =Team 3
+Align=0
+
+[PartyWinStaticTeam1]
+X =69
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BG]
+Tex=PartyTeamButton3
+X=59
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank1]
+X =69
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank1]
+Tex=PartyTeamButton3
+X=59
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank2]
+X =69
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank2]
+Tex=PartyTeamButton3
+X=59
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank3]
+X =69
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank3]
+Tex=PartyTeamButton3
+X=59
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyWinStaticTeam1Deco]
+Tex =PartyWinDeco1
+X =16
+Y =150
+W = 79
+H = 79
+Type =Font Black
+Color =Gold
+Reflection=0
+ReflectionSpacing=3
+
+[PartyWinStaticTeam2]
+X =69
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BG]
+Tex=PartyTeamButton4
+X=59
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank1]
+X =69
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamButton3
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank1]
+Tex=PartyTeamButton4
+X=59
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank2]
+X =69
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank2]
+Tex=PartyTeamButton4
+X=59
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank3]
+X =69
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank3]
+Tex=PartyTeamButton4
+X=59
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Deco]
+Tex =PartyWinDeco2
+X =16
+Y =265
+W = 64
+H = 64
+Type =Font Black
+Color =Silver
+Reflection=0
+ReflectionSpacing=3
+
+[PartyWinStaticTeam3]
+X =69
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BG]
+Tex=PartyTeamButton5
+X=59
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank1]
+X =69
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank1]
+Tex=PartyTeamButton3
+X=59
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank2]
+X =69
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank2]
+Tex=PartyTeamButton5
+X=59
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank3]
+X =69
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank3]
+Tex=PartyTeamButton5
+X=59
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Deco]
+Tex =PartyWinDeco3
+X =16
+Y =365
+W = 54
+H = 54
+Type =Font Black
+Color =Bronze
+Reflection=0
+ReflectionSpacing=3
+
+[PartyOptions]
+Texts = 5
+
+[PartyOptionsBackground]
+Tex=MainBG
+
+[PartyOptionsStatic1]
+X =0
+Y =549
+W =252
+H =0
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[PartyOptionsStatic2]
+X =252
+Y =549
+W =548
+H =0
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[PartyOptionsStatic3]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyOptionsStatic4]
+X =260
+Y =545
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[PartyOptionsStatic5]
+X =388
+Y =545
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[PartyOptionsText1]
+X =70
+Y =11
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyOptionsText2]
+X =70
+Y =58
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_OPTIONS_DESC
+
+[PartyOptionsText3]
+X =135
+Y =546
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_OPTIONS_WHEREAMI
+
+[PartyOptionsText4]
+X =290
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyOptionsText5]
+X =418
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[PartyOptionsSelectLevel]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_DIFFICULTY
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectRounds]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_ROUNDS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectTeams]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers1]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER1
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER2
+X = 40
+Y = 415
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers3]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER3
+X = 40
+Y = 470
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color =ColorDark
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = ColorLight
+STColor = White
+STDColor = GrayDark
+
+[PartyPlayer]
+Texts=6
+
+[PartyPlayerBackground]
+Tex=PartyBG
+
+[PartyPlayerStatic1]
+X =0
+Y =549
+W =252
+H =0
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[PartyPlayerStatic2]
+X =252
+Y =549
+W =548
+H =0
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[PartyPlayerStatic3]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyPlayerStatic4]
+X =240
+Y =545
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerStatic5]
+X =368
+Y =545
+W =22
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerStatic6]
+X =556
+Y =545
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerText1]
+X =70
+Y =11
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyPlayerText2]
+X =70
+Y =58
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_PLAYER_DESC
+
+[PartyPlayerText3]
+X =135
+Y =549
+Color=White
+Font =0
+Size =5
+Align=2
+Text=PARTY_PLAYER_WHEREAMI
+
+[PartyPlayerText4]
+X =270
+Y =545
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyPlayerText5]
+X =400
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_ENTER_NAME
+
+[PartyPlayerText6]
+X =586
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_LEGEND_CONTINUE
+
+[PartyPlayerTeam1Name]
+Tex=PartyTeamButton2
+X=85
+Y=120
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Dark
+
+[PartyPlayerTeam1NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 1
+Color=White
+
+[PartyPlayerPlayer1Name]
+Tex=Button
+X=85
+Y=180
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer1NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 1
+Color=White
+
+[PartyPlayerPlayer2Name]
+Tex=Button
+X=245
+Y=180
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer2NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 2
+Color=White
+
+[PartyPlayerPlayer3Name]
+Tex=Button
+X=405
+Y=180
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer3NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 3
+Color=White
+
+[PartyPlayerPlayer4Name]
+Tex=Button
+X=565
+Y=180
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer4NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 4
+Color=White
+
+[PartyPlayerTeam2Name]
+Tex=PartyTeamButton2
+X=85
+Y=260
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Dark
+
+[PartyPlayerTeam2NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 2
+Color=White
+
+[PartyPlayerPlayer5Name]
+Tex=Button
+X=85
+Y=320
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer5NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 5
+Color=White
+
+[PartyPlayerPlayer6Name]
+Tex=Button
+X=245
+Y=320
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer6NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 6
+Color=White
+
+[PartyPlayerPlayer7Name]
+Tex=Button
+X=405
+Y=320
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer7NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 7
+Color=White
+
+[PartyPlayerPlayer8Name]
+Tex=Button
+X=565
+Y=320
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer8NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 8
+Color=White
+
+[PartyPlayerTeam3Name]
+Tex=Button
+Tex=PartyTeamButton2
+X=85
+Y=400
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Dark
+
+[PartyPlayerTeam3NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 3
+Color=White
+
+[PartyPlayerPlayer9Name]
+Tex=Button
+X=85
+Y=460
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer9NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 9
+Color=White
+
+[PartyPlayerPlayer10Name]
+Tex=Button
+X=245
+Y=460
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer10NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 10
+Color=White
+
+[PartyPlayerPlayer11Name]
+Tex=Button
+X=405
+Y=460
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer11NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 11
+Color=White
+
+[PartyPlayerPlayer12Name]
+Tex=Button
+X=565
+Y=460
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer12NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 12
+Color=White
+
+
+[SongMenu]
+Texts=0
+Statics=1
+
+[SongMenuButton1]
+X =520
+Y =190
+W =265
+H = 25
+Tex =Rectangle
+Color =ColorLight
+DColor = ColorDark
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton1Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_PLAY
+Align=0
+Z=0.99
+
+[SongMenuButton2]
+X =520
+Y =220
+W =265
+H = 25
+Tex =Rectangle
+Color =ColorLight
+DColor = ColorDark
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton2Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_EDIT
+Align=0
+Z=0.99
+
+[SongMenuButton3]
+X =520
+Y =250
+W =265
+H = 25
+Tex =Rectangle
+Color =ColorLight
+DColor = ColorDark
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton3Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_MODI
+Align=0
+Z=0.99
+
+[SongMenuButton4]
+X =520
+Y =280
+W =265
+H = 25
+Tex = Rectangle
+Color =ColorLight
+DColor = ColorDark
+Type=Font Black
+Texts=1
+Z = 0.98
+
+[SongMenuButton4Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_CANCEL
+Align=0
+Z=0.99
+
+[SongMenuSelectSlide3]
+Tex = Rectangle
+TexSBG = SongMenuSelectBG
+Text =
+X =520
+Y =190
+W = 0
+H = 25
+Z = 0.98
+SkipX = 0
+SBGW=270
+
+TextSize=8
+
+Color =ColorLight
+DColor = ColorDark
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorLight
+SBGDColor = ColorDark
+STColor = White
+STDColor = GrayDark
+
+[SongMenuTextMenu]
+X =549
+Y =152
+Color=White
+Font =0
+Size =14
+Text=MENU
+Align=0
+Z=0.99
+
+[SongMenuStatic2]
+X =515
+Y =160
+W =21
+H =21
+Color =White
+Tex =IconSongMenu
+Type=Font Black
+Z=0.98
+
+[SongMenuStatic1]
+Tex =SongMenuBG
+X =510
+Y =155
+W =280
+H =170
+Z =0.95
+Int=1
+Color =ColorLight
+Type=Font Black
+
+[SongJumpto]
+Texts=0
+Statics=1
+
+[SongJumptoStatic1]
+Tex =JumpToBG
+X =220
+Y =155
+W =355
+H =175
+Z =0.98
+Int=1
+Color =ColorLight
+Type=Font Black
+
+[SongJumptoStatic2]
+X =234
+Y =165
+W =21
+H =21
+Color =White
+Tex =MainSearch
+Type=Font Black
+Z=0.99
+
+[SongJumptoText1]
+X =310
+Y =155
+Color=White
+Font =0
+Size =14
+Text=SONG_JUMPTO_TYPE_DESC
+Align=0
+Z=0.99
+
+[SongJumptoSelectSlideType]
+Tex = button
+TexSBG = mainicon
+#Text = SONG_JUMPTO_TYPE_DESC
+Font=1
+X = 242
+Y =185
+Z = 0.99
+W = 0
+H = 30
+SkipX = 4
+SBGW= 300
+Fields=2
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex = button
+SBGDColor = ColorLightest
+STColor = White
+STDColor = ColorLightest
+
+[SongJumptoButtonSearchText]
+X = 250
+Y =195
+Z = 0.99
+W = 160
+H = 50
+Size=14
+Font=1
+Align=0
+
+[SongJumptoTextFound]
+X =234
+Y =275
+Color=White
+Font =0
+Size =8
+Text=SONG_JUMPTO_HELP
+Align=0
+Z=0.99
+
+[StatMain]
+Texts=0
+Statics=0
+
+[StatMainBackground]
+Tex=StatisticsBG
+
+[StatMainButtonScores]
+X =589
+Y =180
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonScoresText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SCORES
+Color=White
+
+[StatMainButtonSingers]
+X =589
+Y =240
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSingersText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SINGERS
+Color=White
+
+[StatMainButtonSongs]
+X =589
+Y =300
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSongsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_SONGS
+Color=White
+
+[StatMainButtonBands]
+X =589
+Y =360
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonBandsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_BANDS
+Color=White
+
+[StatMainButtonExit]
+X =589
+Y =420
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatMainTextOverview]
+X =45
+Y =175
+W =510
+Color=White
+Font =0
+Size =9
+Align=0
+Text=
+
+[StatMainStatic1]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =StatIcon
+Type=Font Black
+
+[StatMainStatic2]
+X =0
+Y =549
+W =252
+H =0
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[StatMainStatic3]
+X =252
+Y =549
+W =548
+H =0
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[StatMainStatic4]
+X =260
+Y =545
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[StatMainStatic5]
+X =388
+Y =545
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[StatMainStatic6]
+X =40
+Y =150
+W =520
+H =20
+Tex=StatMainBG1
+Color =ColorLight
+Type=Font Black
+
+[StatMainStatic7]
+X =40
+Y =170
+W =520
+H =300
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatMainStatic8]
+X =40
+Y =470
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+[StatMainText1]
+X =70
+Y =11
+Color=White
+Font =0
+Size =20
+Text=STAT_MAIN
+Align=0
+
+[StatMainText2]
+X =115
+Y =546
+Color=White
+Font =0
+Size =7
+Align=2
+Text=STAT_MAIN_WHEREAMI
+
+[StatMainText3]
+X =70
+Y =58
+Color=White
+Font =0
+Size =10
+Align =0
+Text=STAT_MAIN_DESC
+
+[StatMainText4]
+X =294
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatMainText5]
+X =423
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[StatDetail]
+Texts=0
+Statics=0
+
+[StatDetailBackground]
+Tex=StatisticsBG
+
+[StatDetailButtonNext]
+X =589
+Y =200
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonNextText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_NEXT
+Color=White
+
+[StatDetailButtonPrev]
+X =589
+Y =260
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonPrevText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_PREV
+Color=White
+
+[StatDetailButtonReverse]
+X =589
+Y =320
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonReverseText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_REVERSE
+Color=White
+
+[StatDetailButtonExit]
+X =589
+Y =380
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatDetailTextDescription]
+X =70
+Y =58
+Color=White
+Font =0
+Size =10
+Align =0
+Text=
+
+[StatDetailTextPage]
+X = 546
+Y = 98
+Color= Black
+Font = 0
+Size = 5
+Align=2
+Text=
+
+[StatDetailTextList1]
+X = 45
+Y = 122
+Color=White
+Font = 0
+Size = 7
+Text=Stat1
+
+[StatDetailTextList2]
+X = 45
+Y = 160
+Color=White
+Font = 0
+Size = 7
+Text=Stat2
+
+[StatDetailTextList3]
+X = 45
+Y = 198
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList4]
+X = 45
+Y = 236
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList5]
+X = 45
+Y = 274
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList6]
+X = 45
+Y = 312
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList7]
+X = 45
+Y = 350
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList8]
+X = 45
+Y = 388
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList9]
+X = 45
+Y = 426
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList10]
+X = 45
+Y = 464
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailStatic1]
+X =16
+Y =24
+W =35
+H =35
+Color =White
+Tex =StatIcon
+Type=Font Black
+
+[StatDetailStatic2]
+X =0
+Y =549
+W =252
+H =0
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[StatDetailStatic3]
+X =252
+Y =549
+W =548
+H =0
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=0
+ReflectionSpacing=1
+
+[StatDetailStatic4]
+X =260
+Y =545
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[StatDetailStatic5]
+X =388
+Y =545
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[StatDetailStatic6]
+X =40
+Y =100
+W =520
+H =24
+Tex=StatDetailBG1
+Color =ColorLight
+Type=Font Black
+
+[StatDetailStatic7]
+X =40
+Y =124
+W =520
+H =376
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatDetailStatic8]
+X =40
+Y =500
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+
+[StatDetailText1]
+X =70
+Y =11
+Color=White
+Font =0
+Size =20
+Text=STAT_DETAIL
+Align=0
+
+[StatDetailText2]
+X =135
+Y =550
+Color=White
+Font =0
+Size =5
+Align=2
+Text=STAT_DETAIL_WHEREAMI
+
+[StatDetailText3]
+X =290
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatDetailText4]
+X =423
+Y =546
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[CheckPopup]
+Texts=1
+Statics=1
+
+[CheckPopupButton1]
+X = 285
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=JA
+Align=1
+Z=1
+
+[CheckPopupButton2]
+X = 415
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton2Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=NEIN
+Align=1
+Z=1
+
+[CheckPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[CheckPopupText1]
+X =282
+Y =147
+Color=White
+Font =0
+Size =10
+Text=MSG_QUESTION_TITLE
+Align=0
+Z=1
+
+[CheckPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =GrayPopup
+Type=Font Black
+
+[CheckPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[CheckPopupStatic3]
+Tex =IconQuestion
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopup]
+Texts=1
+Statics=1
+
+[ErrorPopupButton1]
+X = 350
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[ErrorPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=OK
+Align=1
+Z=1
+
+[ErrorPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[ErrorPopupText1]
+X =282
+Y =148
+Color=White
+Font =0
+Size =10
+Text=MSG_ERROR_TITLE
+Align=0
+Z=1
+
+[ErrorPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =GrayPopup
+Type=Font Black
+
+[ErrorPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopupStatic3]
+Tex =IconError
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
diff --git a/Game/Output/Themes/TODOs/Classic.ini b/Game/Output/Themes/TODOs/Classic.ini
new file mode 100644
index 00000000..a56b6f71
--- /dev/null
+++ b/Game/Output/Themes/TODOs/Classic.ini
@@ -0,0 +1,7424 @@
+;0.5.1 Mod
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Theme]
+Name=Classic
+Creator=Ultrastar Deluxe Team
+US_Version=USD 100
+
+[Colors]
+White = 255 255 255
+GrayLightest = 223 223 223
+GrayLight = 191 191 191
+Gray = 127 127 127
+GrayDark = 63 63 63
+Black = 0 0 0
+Gold = 255 223 31
+Silver = 223 223 223
+Bronze = 205 127 50
+
+[Loading]
+Texts =2
+Fade = 1
+
+[LoadingBackground]
+Tex=LoadingBG
+
+[LoadingText1]
+X =400
+Y =290
+Color =GrayDark
+Font =1
+Align =1
+Size =14
+Text =SING_LOADING
+
+[LoadingText2]
+X =790
+Y =583
+Color=Grey
+Font =0
+Size =6
+Align=2
+Text=US_VERSION
+
+[Main]
+Texts =3
+Statics=2
+
+[MainBackground]
+Tex=MainBG
+
+[MainText1]
+X =30
+Y =170
+Color=GrayLight
+Font =1
+Size =22
+Text=SING_CHOOSE_MODE
+Align=0
+
+[MainText2]
+X =226
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_NAVIGATE
+Align=0
+
+[MainText3]
+X =380
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_SELECT
+Align=0
+
+[MainText4]
+X =540
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_EDITOR
+Align=0
+
+[MainTextDescription]
+X =63
+Y =233
+Color=GrayDark
+Font =1
+Size =10
+Align=0
+Text=
+
+[MainTextDescriptionLong]
+X =63
+Y =265
+Color=Black
+Font =0
+Size =10
+Align=0
+Text=
+
+[MainStatic1]
+Tex =Logo
+X =30
+Y =270
+W =740
+H =283
+Color =ColorDark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[MainStatic2]
+Tex =MainIcon
+X =30
+Y =235
+W =32
+H =32
+Color =ColorDark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[MainStatic3]
+Tex =ButtonNavi
+X =196
+Y =553
+W =22
+H =22
+Color =Black
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[MainStatic4]
+Tex =ButtonEnter
+X =350
+Y =553
+W =22
+H =22
+Color =Black
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[MainStatic5]
+Tex =ButtonE
+X =510
+Y =553
+W =22
+H =22
+Color =Black
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[MainButtonSolo]
+X =472
+Y =220
+W =58
+H =56
+Tex =ButtonSolo
+Color =ColorDark
+Int = 1
+DColor = GrayLightest
+DInt = 0.5
+Type=Font Black
+Texts=0
+
+[MainButtonMulti]
+X =532
+Y =220
+W =58
+H =56
+Tex =ButtonMulti
+Color =ColorDark
+Int = 1
+DColor = GrayLightest
+DInt = 0.5
+Type=Font Black
+Texts=0
+
+[MainButtonStats]
+X =592
+Y =220
+W =58
+H =56
+Tex =ButtonStats
+Color =ColorDark
+Int = 1
+DColor = GrayLightest
+DInt = 0.5
+Type=Font Black
+Texts=0
+
+[MainButtonEditor]
+X =592
+Y =220
+W =58
+H =56
+Tex =ButtonEditor
+Color =ColorDark
+Int = 1
+DColor = GrayLightest
+DInt = 0.5
+Type=Font Black
+Texts=0
+Visible=0
+
+[MainButtonOptions]
+X =652
+Y =220
+W =58
+H =56
+Tex =ButtonOptions
+Color =ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type=Font Black
+Texts=0
+
+[MainButtonExit]
+X =712
+Y =220
+W =58
+H =56
+Tex =ButtonExit
+Color =ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type=Font Black
+Texts=0
+
+[Song]
+Texts =3
+
+[SongBackground]
+Tex=SongBG
+
+[SongCover]
+X=300
+Y=140
+W=300
+H=200
+Style=4
+Reflections=0
+
+[SongEqualizer]
+Visible=1
+Direction=1
+Color =Black
+Alpha=1
+X=378
+Y=488
+Z=1
+PieceW=8
+PieceH=3
+Space=1
+Bands=5
+Length=7
+
+[SongVideoIcon]
+X =384
+Y =104
+W =32
+H =32
+Z=1
+Color=White
+Tex =VideoIcon
+Type=Font Black
+
+[SongStatic1]
+X =0
+Y =100
+W =800
+H =350
+Color=Black
+Tex =SongFade
+Type=Font Black
+TexX1=0.1
+TexY1=0.1
+TexX2=0.9
+TexY2=0.9
+
+[SongStatic2]
+X =20
+Y =500
+W =32
+H =32
+Color =ColorDark
+Tex =MainIcon
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStatic3]
+X =270
+Y =120
+W =260
+H =240
+Z =0.45
+Color =Gray
+Tex =SongSelection
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStatic4]
+X =378
+Y =463
+Z = 0.8
+W =44
+H =28
+Color =Black
+Tex =SongEqualizerBG
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongTextArtist]
+X =400
+Y =360
+Color=Black
+Font =0
+Size =9
+Align =1
+Text=
+
+[SongTextTitle]
+X =400
+Y =390
+Color=GrayDark
+Font =0
+Size =9
+Align =1
+Text=
+
+[SongTextNumber]
+X =400
+Y =425
+Color=Gray
+Font =1
+Size =7
+Align =1
+Text=
+
+[SongTextCat]
+X =67
+Y =524
+Color=Gray
+Font =1
+Size =7
+Align =0
+Text=
+
+#[SongStaticCat]
+#Tex =
+#X =12
+#Y =7
+#W =85
+#H =85
+#Color=White
+#Type=Plain
+#TexX1=0
+#TexY1=0
+#TexX2=1
+#TexY2=1
+
+#Variable statics and texts for song-screen in sing- and partymode
+# There can be an unlimited Number of Statics and Texts, As long
+# as the numbers are in order.
+# Statics that are shown in PartyMode Only are Named_
+# SongStaticParty[No]
+# Texts that are shown in PartyMode Only are Named_
+# SongTextParty[No]
+# Statics that are shown in Normal Mode Only are Named_
+# SongStaticNonParty[No]
+# Texts that are shown in Normal Mode Only are Named_
+# SongTextNonParty[No]
+#Here are the ones for singmode
+
+[SongStaticNonParty1]
+X =120
+Y =553
+W =22
+H =22
+Tex=ButtonAlt
+Color =White
+Type=Plain
+
+[SongStaticNonParty2]
+X =156
+Y =553
+W =22
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Plain
+
+[SongStaticNonParty3]
+X =298
+Y =553
+W =22
+H =22
+Tex=ButtonM
+Color =White
+Type=Plain
+
+[SongStaticNonParty4]
+X =414
+Y =553
+W =22
+H =22
+Tex=ButtonJ
+Color =White
+Type=Plain
+
+[SongStaticNonParty5]
+X =585
+Y =553
+W =22
+H =22
+Tex=ButtonP
+Color =White
+Type=Plain
+
+#Texts Non Party
+[SongTextNonParty1]
+X =30
+Y =455
+Color=GrayLight
+Font =1
+Size =15
+Text=SING_SONG_SELECTION
+Align=0
+
+[SongTextNonParty2]
+X =50
+Y =500
+Color=GrayDark
+Font =1
+Size =8
+Text=SING_SONG_SELECTION_DESC
+Align=0
+
+[SongTextNonParty3]
+X =144
+Y =556
+Color=Black
+Font =1
+Size =5
+Text=+
+
+[SongTextNonParty4]
+X =186
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_GOTO
+
+[SongTextNonParty5]
+X =328
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_MENU
+
+[SongTextNonParty6]
+X =444
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SONG_JUMPTO_DESC
+
+[SongTextNonParty7]
+X =615
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_PLAYLIST
+
+
+#and theese are the ones for partymode
+
+
+[SongStaticParty1]
+X =187
+Y =553
+W =22
+H =22
+Tex=Button13
+Color =White
+Type=Plain
+
+[SongStaticParty2]
+X =363
+Y =553
+W =22
+H =22
+Tex=ButtonM
+Color =White
+Type=Plain
+
+[SongStaticParty3]
+X =525
+Y =553
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+#Texts for Party Mode
+
+[SongTextParty1]
+X =30
+Y =455
+Color=GrayLight
+Font =1
+Size =15
+Align=0
+Text=PARTY_MODE
+
+[SongTextParty2]
+X =50
+Y =500
+Color=GrayDark
+Font =1
+Size =8
+Align=0
+Text=PARTY_SONG_WHEREAMI
+
+[SongTextParty3]
+X =217
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SONG_MENU_NAME_PARTY_JOKER
+
+[SongTextParty4]
+X =393
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=PARTY_SONG_MENU
+
+[SongTextParty5]
+X =555
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=PARTY_SONG_LEGEND_CONTINUE
+
+#variable statics end
+
+# Jokers, 5 for each team, only shown in party Mode
+[SongStaticTeam1Joker1]
+Tex =Joker
+X =20
+Y =30
+W =50
+H =50
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker2]
+Tex =Joker
+X =70
+Y =30
+W =50
+H =50
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker3]
+Tex =Joker
+X =120
+Y =30
+W =50
+H =50
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker4]
+Tex =Joker
+X =170
+Y =30
+W =50
+H =50
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker5]
+Tex =Joker
+X =220
+Y =30
+W =50
+H =50
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker1]
+Tex =Joker
+X =280
+Y =30
+W =50
+H =50
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker2]
+Tex =Joker
+X =330
+Y =30
+W =50
+H =50
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker3]
+Tex =Joker
+X =380
+Y =30
+W =50
+H =50
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker4]
+Tex =Joker
+X =430
+Y =30
+W =50
+H =50
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker5]
+Tex =Joker
+X =480
+Y =30
+W =50
+H =50
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker1]
+Tex =Joker
+X =540
+Y =30
+W =50
+H =50
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker2]
+Tex =Joker
+X =590
+Y =30
+W =50
+H =50
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker3]
+Tex =Joker
+X =640
+Y =30
+W =50
+H =50
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker4]
+Tex =Joker
+X =690
+Y =30
+W =50
+H =50
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker5]
+Tex =Joker
+X =740
+Y =30
+W =50
+H =50
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+
+[Sing]
+Texts =1
+
+[SingText1]
+Text =SING_TIME
+X =43
+Y =17
+Font =1
+Size =6
+Color =Black
+Align=1
+
+[SingStatic1]
+;TextBG
+Tex =LyricBar
+X =10
+Y =490
+W =780
+H =105
+Color =GrayLightest
+Type=Font Black
+
+[SingStatic2]
+;Time BG
+Tex =LyricBar
+X =12
+Y =5
+W =328
+H =42
+Color =GrayLightest
+Type=Font Black
+
+[SingStatic3]
+Tex =Rectangle
+X =140
+Y =21
+W =190
+H =10
+Color=Gray
+
+[SingTimeProgress]
+X =140
+Y =21
+W =190
+H =10
+Color=GrayDark
+
+[SingTimeText]
+Text =SING_TIME
+X =100
+Y =14
+Font =1
+Size =8
+Color =White
+Align=1
+
+[SingStatic4]
+Tex =Bar
+X =20
+Y =10
+W =46
+H =30
+Color =Black
+Type=Font Black
+
+[SingP1Static]
+Tex =P
+X =16
+Y =55
+W =45
+H =50
+Color =P1Dark
+Type=Font Black
+
+[SingP1Static2]
+Tex =ScoreBG
+X =75
+Y =55
+W =100
+H =40
+Color =P1Dark
+Type=Transparent
+TexX1=0.02
+TexY1=0.05
+TexX2=0.98
+TexY2=0.98
+
+[SingP1Text]
+Text =P1
+X =27
+Y =65
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP1TextScore]
+Text =00000
+X =90
+Y =60
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1SingBar]
+X =75
+Y =95
+W =100
+H =8
+
+[SingP1TwoPSingBar]
+X =75
+Y =95
+W =100
+H =8
+
+[SingP1ThreePSingBar]
+X =75
+Y =95
+W =100
+H =8
+
+[SingP2RStatic]
+Tex =P
+X =739
+Y =55
+W =45
+H =50
+Color =P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SingP2RStatic2]
+Tex =ScoreBG
+X =620
+Y =55
+W =100
+H =40
+Color =P2Dark
+Type=Transparent
+TexX1=0.02
+TexY1=0.05
+TexX2=0.98
+TexY2=0.98
+
+[SingP2RText]
+Text =P2
+X =750
+Y =65
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP2RTextScore]
+Text =00000
+X =635
+Y =60
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2RSingBar]
+X =620
+Y =95
+W =100
+H =8
+
+[SingP2MStatic]
+Tex =P
+X =311
+Y =55
+W =45
+H =50
+Color =P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SingP2MStatic2]
+Tex =ScoreBG
+X =370
+Y =55
+W =100
+H =40
+Color =P2Dark
+Type=Transparent
+TexX1=0.02
+TexY1=0.05
+TexX2=0.98
+TexY2=0.98
+
+[SingP2MText]
+Text =P2
+X =321
+Y =65
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP2MTextScore]
+Text =00000
+X =385
+Y =60
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2MSingBar]
+X =370
+Y =95
+W =100
+H =8
+
+[SingP3RStatic]
+Tex =P
+X =611
+Y =55
+W =45
+H =50
+Color =P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SingP3RStatic2]
+Tex =ScoreBG
+X =670
+Y =55
+W =100
+H =40
+Color =P3Dark
+Type=Transparent
+TexX1=0.02
+TexY1=0.05
+TexX2=0.98
+TexY2=0.98
+
+[SingP3RText]
+Text =P3
+X =621
+Y =65
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP3RTextScore]
+Text =00000
+X =685
+Y =60
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP3SingBar]
+X =670
+Y =95
+W =100
+H =8
+
+[Score]
+Texts =1
+
+[ScoreBackground]
+Tex=ScoresBG
+
+[ScoreText1]
+X =90
+Y =500
+Color =GrayDark
+Font =1
+Size =17
+Text =SONG_SCORE_WHEREAMI
+Align=0
+
+[ScoreStatic1]
+Tex =ButtonEnter
+X =350
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreText2]
+X =380
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_CONTINUE
+Align=0
+
+[ScoreTextArtist]
+X =450
+Y =500
+Color=GrayDark
+Font =0
+Size =9
+Text =Artist
+Align=0
+
+[ScoreTextTitle]
+X =450
+Y =525
+Font =0
+Size =9
+Text =Title
+Align=0
+Color=Gray
+
+[ScoreTextName1]
+X =200
+Y =160
+Font =1
+Size =12
+Text =P1
+Color =P1Dark
+Align=0
+
+[ScoreTextName2]
+X =50
+Y =160
+Font =1
+Size =12
+Text =P1
+Color =P1Dark
+Align=0
+
+[ScoreTextName3]
+X =510
+Y =160
+Font =1
+Size =12
+Text =P2
+Color =P2Dark
+Align=0
+
+[ScoreTextScore1]
+X =250
+Y =110
+Color=GrayDark
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextScore2]
+X =100
+Y =110
+Color=GrayDark
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextScore3]
+X =560
+Y =110
+Color=GrayDark
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes1]
+X =235
+Y =220
+Color=GrayDark
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotes2]
+X =85
+Y =220
+Color=GrayDark
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotes3]
+X =545
+Y =220
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_NOTES
+Align=0
+
+[ScoreTextNotesScore1]
+X =440
+Y =220
+Color=GrayDark
+Font =1
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextNotesScore2]
+X =290
+Y =220
+Color=GrayDark
+Font =1
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextNotesScore3]
+X =750
+Y =220
+Color=GrayDark
+Font =1
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextLineBonus1]
+X =235
+Y =260
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonus2]
+X =85
+Y =260
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonus3]
+X =545
+Y =260
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore1]
+X =440
+Y =260
+Color=GrayDark
+Font =1
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextLineBonusScore2]
+X =290
+Y =260
+Color=GrayDark
+Font =1
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextLineBonusScore3]
+X =750
+Y =260
+Color=GrayDark
+Font =1
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextGoldenNotes1]
+X =235
+Y =300
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotes2]
+X =85
+Y =300
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotes3]
+X =545
+Y =300
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore1]
+X =440
+Y =300
+Color=GrayDark
+Font =1
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextGoldenNotesScore2]
+X =290
+Y =300
+Color=GrayDark
+Font =1
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextGoldenNotesScore3]
+X =750
+Y =300
+Color=GrayDark
+Font =1
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextTotal1]
+X =200
+Y =370
+Color=GrayDark
+Font =0
+Size =9
+Text=SING_TOTAL
+Align=0
+
+[ScoreTextTotal2]
+X =50
+Y =370
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_TOTAL
+Align=0
+
+[ScoreTextTotal3]
+X =510
+Y =370
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore1]
+X =440
+Y =360
+Color=GrayDark
+Font =1
+Size =15
+Align =2
+Text =00000
+
+[ScoreTextTotalSCore2]
+X =290
+Y =360
+Color=GrayDark
+Font =1
+Size =15
+Align =2
+Text =00000
+
+[ScoreTextTotalScore3]
+X =750
+Y =360
+Color=GrayDark
+Font =1
+Size =15
+Align =2
+Text =00000
+
+[ScorePlayer1Static1]
+Tex =ScoreLine
+X =200
+Y =205
+W =240
+H =6
+Color =GrayDark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer1Static2]
+Tex =ScoreLine
+X =200
+Y =345
+W =240
+H =6
+Type =Font Black
+Color =GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer1Static3]
+Tex =ScoreLine
+X =200
+Y =410
+W =240
+H =6
+Type =Font Black
+Color =GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLightest1]
+Tex =ScoreBox
+X =200
+Y =220
+W =30
+H =30
+Color =P1Lightest
+Type=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLight1]
+Tex =ScoreBox
+X =200
+Y =260
+W =30
+H =30
+Color =P1Light
+Type=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxDark1]
+Tex =ScoreBox
+X =200
+Y =300
+W =30
+H =30
+Color =P1Dark
+Type=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer2Static1]
+Tex =ScoreLine
+X =50
+Y =205
+W =240
+H =6
+Type =Font Black
+Color =GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer2Static2]
+Tex =ScoreLine
+X =50
+Y =345
+W =240
+H =6
+Type =Font Black
+Color =GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer2Static3]
+Tex =ScoreLine
+X =50
+Y =410
+W =240
+H =6
+Type =Font Black
+Color =GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLightest2]
+Tex =ScoreBox
+X =50
+Y =220
+W =30
+H =30
+Color =P1Lightest
+Type=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLight2]
+Tex =ScoreBox
+X =50
+Y =260
+W =30
+H =30
+Color =P1Light
+Type=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxDark2]
+Tex =ScoreBox
+X =50
+Y =300
+W =30
+H =30
+Color =P1Dark
+Type=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer3Static1]
+Tex =ScoreLine
+X =510
+Y =205
+W =240
+H =6
+Type =Font Black
+Color =GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer3Static2]
+Tex =ScoreLine
+X =510
+Y =345
+W =240
+H =6
+Type =Font Black
+Color =GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer3Static3]
+Tex =ScoreLine
+X =510
+Y =410
+W =240
+H =6
+Type =Font Black
+Color =GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLightest3]
+Tex =ScoreBox
+X =510
+Y =220
+W =30
+H =30
+Color =P2Lightest
+Type=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLight3]
+Tex =ScoreBox
+X =510
+Y =260
+W =30
+H =30
+Color =P2Light
+Type=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxDark3]
+Tex =ScoreBox
+X =510
+Y =300
+W =30
+H =30
+Color =P2Dark
+Type=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevel1]
+Tex =ScoreLevel
+X =460
+Y =140
+W =120
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound1]
+Tex =ScoreLevelRound
+X =460
+Y =110
+W =120
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel1]
+Tex =ScoreLevel
+X =460
+Y =410
+W =120
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound1]
+Tex =ScoreLevelRound
+X =460
+Y =380
+W =120
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticBackLevel2]
+Tex =ScoreLevel
+X =290
+Y =140
+W =120
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound2]
+Tex =ScoreLevelRound
+X =290
+Y =110
+W =120
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel2]
+Tex =ScoreLevel
+X =290
+Y =410
+W =120
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound2]
+Tex =ScoreLevelRound
+X =290
+Y =380
+W =120
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticBackLevel3]
+Tex =ScoreLevel
+X =390
+Y =140
+W =120
+H =300
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound3]
+Tex =ScoreLevelRound
+X =390
+Y =110
+W =120
+H =30
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel3]
+Tex =ScoreLevel
+X =390
+Y =410
+W =120
+H =30
+Color =P2Light
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound3]
+Tex =ScoreLevelRound
+X =390
+Y =380
+W =120
+H =30
+Color =P2Light
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScorePlayer4Static1]
+X=20
+Y=205
+W=240
+H=6
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+[ScorePlayer4Static2]
+X=20
+Y=345
+W=240
+H=6
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+[ScorePlayer4Static3]
+X=20
+Y=410
+W=240
+H=6
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLightest4]
+X=20
+Y=220
+W=30
+H=30
+Tex=ScoreBox
+Type=
+Color=P1Lightest
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLight4]
+X=20
+Y=260
+W=30
+H=30
+Tex=ScoreBox
+Type=
+Color=P1Light
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxDark4]
+X=20
+Y=300
+W=30
+H=30
+Tex=ScoreBox
+Type=
+Color=P1Dark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreTextName4]
+X=20
+Y=160
+Font=1
+Size=12
+Align=0
+Text=P1
+Color=P1Dark
+
+[ScoreTextScore4]
+X=70
+Y=110
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=GrayDark
+
+[ScoreTextNotes4]
+X=55
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=GrayDark
+
+[ScoreTextNotesScore4]
+X=260
+Y=220
+Font=1
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextLineBonus4]
+X=55
+Y=260
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=GrayDark
+
+[ScoreTextLineBonusScore4]
+X=260
+Y=260
+Font=1
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextGoldenNotes4]
+X=55
+Y=300
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=GrayDark
+
+[ScoreTextGoldenNotesScore4]
+X=260
+Y=300
+Font=1
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextTotal4]
+X=20
+Y=370
+Font=0
+Size=9
+Align=0
+Text=SING_TOTAL
+Color=GrayDark
+
+[ScoreTextTotalScore4]
+X=260
+Y=360
+Font=1
+Size=15
+Align=2
+Text=00000
+Color=GrayDark
+
+[ScoreStaticBackLevel4]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevelRound4]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevel4]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevelRound4]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreTextName5]
+X=280
+Y=160
+Font=1
+Size=12
+Align=0
+Text=P2
+Color=P2Dark
+
+[ScoreTextScore5]
+X=330
+Y=110
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=GrayDark
+
+[ScoreTextNotes5]
+X=315
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=GrayDark
+
+[ScoreTextNotesScore5]
+X=520
+Y=220
+Font=1
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextLineBonus5]
+X=315
+Y=260
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=GrayDark
+
+[ScoreTextLineBonusScore5]
+X=520
+Y=260
+Font=1
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextGoldenNotes5]
+X=315
+Y=300
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=GrayDark
+
+[ScoreTextGoldenNotesScore5]
+X=520
+Y=300
+Font=1
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextTotal5]
+X=280
+Y=370
+Font=0
+Size=9
+Align=0
+Text=SING_TOTAL
+Color=GrayDark
+
+[ScoreTextTotalScore5]
+X=520
+Y=360
+Font=1
+Size=15
+Align=2
+Text=00000
+Color=GrayDark
+
+[ScoreStaticBackLevel5]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevelRound5]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevel5]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevelRound5]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreTextName6]
+X=540
+Y=160
+Font=1
+Size=12
+Align=0
+Text=P2
+Color=P3Dark
+
+[ScoreTextScore6]
+X=590
+Y=110
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=GrayDark
+
+[ScoreTextNotes6]
+X=575
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=GrayDark
+
+[ScoreTextNotesScore6]
+X=780
+Y=220
+Font=1
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextLineBonus6]
+X=575
+Y=260
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=GrayDark
+
+[ScoreTextLineBonusScore6]
+X=780
+Y=260
+Font=1
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextGoldenNotes6]
+X=575
+Y=300
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=GrayDark
+
+[ScoreTextGoldenNotesScore6]
+X=780
+Y=300
+Font=1
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextTotal6]
+X=540
+Y=370
+Font=0
+Size=9
+Align=0
+Text=SING_TOTAL
+Color=GrayDark
+
+[ScoreTextTotalScore6]
+X=780
+Y=360
+Font=1
+Size=15
+Align=2
+Text=00000
+Color=GrayDark
+
+[ScoreStaticBackLevel6]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevelRound6]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevel6]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevelRound6]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer5Static1]
+X=280
+Y=205
+W=240
+H=6
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer5Static2]
+X=280
+Y=345
+W=240
+H=6
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer5Static3]
+X=280
+Y=410
+W=240
+H=6
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLightest5]
+X=280
+Y=220
+W=30
+H=30
+Tex=ScoreBox
+Type=
+Color=P2Lightest
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLight5]
+X=280
+Y=260
+W=30
+H=30
+Tex=ScoreBox
+Type=
+Color=P2Light
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxDark5]
+X=280
+Y=300
+W=30
+H=30
+Tex=ScoreBox
+Type=
+Color=P2Dark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer6Static1]
+X=540
+Y=205
+W=240
+H=6
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer6Static2]
+X=540
+Y=345
+W=240
+H=6
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer6Static3]
+X=540
+Y=410
+W=240
+H=6
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLightest6]
+X=540
+Y=220
+W=30
+H=30
+Tex=ScoreBox
+Type=
+Color=P3Lightest
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLight6]
+X=540
+Y=260
+W=30
+H=30
+Tex=ScoreBox
+Type=
+Color=P3Light
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxDark6]
+X=540
+Y=300
+W=30
+H=30
+Tex=ScoreBox
+Type=
+Color=P3Dark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[Options]
+Texts = 3
+
+[OptionsBackground]
+Tex=OptionsBG
+
+
+[OptionsText1]
+X = 50
+Y = 170
+Color=GrayLight
+Font = 1
+Size = 25
+Text = SING_OPTIONS
+
+[OptionsStatic1]
+Tex=MainIcon
+X=40
+Y=250
+W=32
+H=32
+Color=ColorDark
+Type=Font Black
+
+[OptionsStatic2]
+Tex =ButtonNavi
+X =196
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[OptionsStatic3]
+Tex =ButtonEnter
+X =350
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[OptionsStatic4]
+Tex =ButtonEsc
+X =510
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[OptionsText2]
+X =226
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_NAVIGATE
+Align=0
+
+[OptionsText3]
+X =380
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_SELECT
+Align=0
+
+[OptionsText4]
+X =540
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_ESC
+Align=0
+
+[OptionsTextDescription]
+X = 70
+Y = 248
+Color=GrayDark
+Font = 1
+Size = 10
+
+[OptionsButtonGame]
+X = 40
+Y = 310
+W = 180
+H = 70
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[OptionsButtonGameText1]
+X =16
+Y =15
+Font=0
+Size=13
+Align=0
+Text=SING_OPTIONS_GAME
+Color=White
+
+[OptionsButtonGraphics]
+X = 220
+Y = 310
+W = 180
+H = 70
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[OptionsButtonGraphicsText1]
+X =16
+Y =15
+Font=0
+Size=13
+Align=0
+Text=SING_OPTIONS_GRAPHICS
+Color=White
+
+[OptionsButtonSound]
+X = 400
+Y = 310
+W = 180
+H = 70
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[OptionsButtonSoundText1]
+X =16
+Y =15
+Font=0
+Size=13
+Align=0
+Text=SING_OPTIONS_SOUND
+Color=White
+
+[OptionsButtonLyrics]
+X = 580
+Y = 310
+W = 180
+H = 70
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[OptionsButtonLyricsText1]
+X =16
+Y =15
+Font=0
+Size=13
+Align=0
+Text=SING_OPTIONS_LYRICS
+Color=White
+
+[OptionsButtonThemes]
+X = 40
+Y = 380
+W = 180
+H = 70
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[OptionsButtonThemesText1]
+X =16
+Y =15
+Font=0
+Size=13
+Align=0
+Text=SING_OPTIONS_THEMES
+Color=White
+
+[OptionsButtonRecord]
+X = 220
+Y = 380
+W = 180
+H = 70
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[OptionsButtonRecordText1]
+X =16
+Y =15
+Font=0
+Size=13
+Align=0
+Text=SING_OPTIONS_RECORD
+Color=White
+Texts=1
+
+[OptionsButtonAdvanced]
+X = 400
+Y = 380
+W = 180
+H = 70
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[OptionsButtonAdvancedText1]
+X =16
+Y =15
+Font=0
+Size=13
+Align=0
+Text=SING_OPTIONS_ADVANCED
+Color=White
+Texts=1
+
+[OptionsButtonExit]
+X = 580
+Y = 380
+W = 180
+H = 70
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[OptionsButtonExitText1]
+X =16
+Y =15
+Font=0
+Size=13
+Align=0
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[OptionsGame]
+Texts = 3
+
+[OptionsGameBackground]
+Tex=OptionsBG
+
+[OptionsGameStatic1]
+X =275
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsGameStatic2]
+X =435
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsGameText2]
+X =305
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGameText3]
+X =465
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGameText1]
+X = 50
+Y = 10
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 25
+Text=SING_OPTIONS_GAME_WHEREAMI
+
+[OptionsGameSelectPlayers]
+Tex = MainBar
+TexSBG = MainBar
+Text =SING_OPTIONS_GAME_PLAYERS
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDifficulty]
+Tex = MainBar
+TexSBG = MainBar
+Text =SING_OPTIONS_GAME_DIFFICULTY
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+
+[OptionsGameSelectSlideLanguage]
+Tex = MainBar
+TexSBG = MainBar
+Text =SING_OPTIONS_GAME_LANGUAGE
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectTabs]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_GAME_TABS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectSlideSorting]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_GAME_SORTING
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDebug]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_GAME_DEBUG
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+
+[OptionsGraphics]
+Texts = 3
+
+[OptionsGraphicsBackground]
+Tex=OptionsBG
+
+[OptionsGraphicsStatic1]
+X =275
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsGraphicsStatic2]
+X =435
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsGraphicsText2]
+X =305
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGraphicsText3]
+X =465
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGraphicsText1]
+X = 50
+Y = 10
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 25
+Text=SING_OPTIONS_GRAPHICS_WHEREAMI
+
+[OptionsGraphicsSelectSlideResolution]
+Tex =MainBar
+TexSBG =MainBar
+Text=SING_OPTIONS_GRAPHICS_RESOLUTION
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectFullscreen]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_GRAPHICS_FULLSCREEN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectDepth]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_GRAPHICS_DEPTH
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectOscilloscope]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_GRAPHICS_OSCILLOSCOPE
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectMovieSize]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_GRAPHICS_MOVIE_SIZE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsButtonExit]
+X = 40
+Y = 360
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+
+[OptionsSound]
+Texts = 3
+
+[OptionsSoundBackground]
+Tex=OptionsBG
+
+[OptionsSoundStatic1]
+X =275
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsSoundStatic2]
+X =435
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsSoundText2]
+X =305
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsSoundText3]
+X =465
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsSoundText1]
+X = 50
+Y = 10
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 25
+Text =SING_OPTIONS_SOUND_WHEREAMI
+
+[OptionsSoundSelectMicBoost]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_SOUND_MIC_BOOST
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectClickAssist]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_SOUND_CLICK_ASSIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectBeatClick]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_SOUND_BEAT_CLICK
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectThreshold]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_SOUND_THRESHOLD
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectTwoPlayerMode]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_SOUND_TWO_PLAYERS_MODE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewVolume]
+Tex =MainBar
+TexSBG =MainBar
+Text=SING_OPTIONS_SOUND_PREVIEWVOLUME
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewFading]
+Tex =MainBar
+TexSBG =MainBar
+Text=SING_OPTIONS_SOUND_PREVIEWFADING
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+
+[OptionsLyrics]
+Texts = 3
+
+[OptionsLyricsBackground]
+Tex=OptionsBG
+
+[OptionsLyricsStatic1]
+X =275
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsLyricsStatic2]
+X =435
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsLyricsText2]
+X =305
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsLyricsText3]
+X =465
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsLyricsText1]
+X = 50
+Y = 10
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 25
+Text =SING_OPTIONS_LYRICS_WHEREAMI
+
+[OptionsLyricsSelectLyricsFont]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_LYRICS_FONT
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectLyricsEffect]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_LYRICS_EFFECT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectSolmization]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_LYRICS_SOLMIZATION
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+
+[OptionsThemes]
+Texts = 5
+
+[OptionsThemesBackground]
+Tex=OptionsBG
+
+[OptionsThemesStatic1]
+X =275
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsThemesStatic2]
+X =435
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsThemesText2]
+X =305
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsThemesText3]
+X =465
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsThemesText1]
+X = 50
+Y = 10
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 25
+Text =SING_OPTIONS_THEMES_WHEREAMI
+
+[OptionsThemesSelectTheme]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_THEMES_THEME
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectSkin]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_THEMES_SKIN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectColor]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_THEMES_COLOR
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+
+[OptionsRecord]
+Texts = 3
+
+[OptionsRecordBackground]
+Tex=OptionsBG
+
+[OptionsRecordStatic1]
+X =275
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsRecordStatic2]
+X =435
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsRecordText2]
+X =305
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsRecordText3]
+X =465
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsRecordText1]
+X = 50
+Y = 10
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 25
+Text=SING_OPTIONS_RECORD_WHEREAMI
+
+[OptionsRecordSelectSlideCard]
+Tex = MainBar
+TexSBG = MainBar
+Text =SING_OPTIONS_RECORD_CARD
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideInput]
+Tex = MainBar
+TexSBG = MainBar
+Text =SING_OPTIONS_RECORD_INPUT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelL]
+Tex = MainBar
+TexSBG = MainBar
+Text =SING_OPTIONS_RECORD_CHANNELL
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelR]
+Tex = MainBar
+TexSBG = MainBar
+Text =SING_OPTIONS_RECORD_CHANNELR
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordButtonExit]
+X = 40
+Y = 305
+W = 230
+H = 70
+Tex = MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+
+[OptionsAdvanced]
+Texts = 3
+
+[OptionsAdvancedBackground]
+Tex=OptionsBG
+
+[OptionsAdvancedStatic1]
+X =275
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsAdvancedStatic2]
+X =435
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsAdvancedText2]
+X =305
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsAdvancedText3]
+X =465
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsAdvancedText1]
+X = 50
+Y = 10
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 25
+Text=SING_OPTIONS_ADVANCED_WHEREAMI
+
+[OptionsAdvancedSelectLoadAnimation]
+Tex =MainBar
+TexSBG =MainBar
+Text=SING_OPTIONS_ADVANCED_LOADANIMATION
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectScreenFade]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_ADVANCED_SCREENFADE
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectEffectSing]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_ADVANCED_EFFECTSING
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectLineBonus]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_GRAPHICS_LINEBONUS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectSlideOnSongClick]
+Tex =MainBar
+TexSBG =MainBar
+Text=SING_OPTIONS_ADVANCED_ONSONGCLICK
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectAskbeforeDel]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_ADVANCED_ASKBEFOREDEL
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectPartyPopup]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_ADVANCED_PARTYPOPUP
+X = 40
+Y = 415
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedButtonExit]
+X = 40
+Y = 470
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[Top5]
+Texts=1
+
+[Top5Background]
+Tex=Top5BG
+
+[Top5Static2]
+Tex =ButtonEnter
+X =350
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[Top5Text2]
+X =380
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_CONTINUE
+Align=0
+
+[Top5Text1]
+X =100
+Y =50
+Color =Gray
+Font =1
+Size =20
+Align =0
+Text =SING_TOP_5_CHARTS
+
+[Top5Static1]
+Tex=Bar
+X=560
+Y=55
+W=140
+H=50
+Color=ColorLight
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[Top5TextLevel]
+X =630
+Y =65
+Color =White
+Font =1
+Size =10
+Align =1
+Text =easy
+
+
+[Top5TextArtistTitle]
+X =100
+Y =120
+Color =Black
+Font =0
+Size =10
+Align =0
+Text =artist - title
+
+[Top5TextName1]
+X =170
+Y =200
+Color =GrayDark
+Font =1
+Size =14
+Align =0
+Text =1. Player1
+
+[Top5TextName2]
+X =150
+Y =290
+Color =GrayDark
+Font =0
+Size =11
+Align =0
+Text =2. Player2
+
+[Top5TextName3]
+X =150
+Y =340
+Color =GrayDark
+Font =0
+Size =11
+Align =0
+Text =3. Player3
+
+[Top5TextName4]
+X =150
+Y =390
+Color =GrayDark
+Font =0
+Size =11
+Align =0
+Text =4. Player4
+
+[Top5TextName5]
+X =150
+Y =440
+Color =GrayDark
+Font =0
+Size =11
+Align =0
+Text =5. Player5
+
+
+[Top5TextScore1]
+X =680
+Y =195
+Color =GrayDark
+Font =1
+Size =17
+Align =2
+Text =00000
+
+[Top5TextScore2]
+X =680
+Y =290
+Color =GrayDark
+Font =1
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore3]
+X =680
+Y =340
+Color =GrayDark
+Font =1
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore4]
+X =680
+Y =390
+Color =GrayDark
+Font =1
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore5]
+X =680
+Y =440
+Color =GrayDark
+Font =1
+Size =14
+Align =2
+Text =00000
+
+[Top5TextNumber1]
+X =130
+Y =202
+Color =White
+Font =1
+Size =11
+Align =1
+Text =1
+
+[Top5TextNumber2]
+X =120
+Y =293
+Color =White
+Font =1
+Size =9
+Align =1
+Text =2
+
+[Top5TextNumber3]
+X =120
+Y =343
+Color =White
+Font =1
+Size =9
+Align =1
+Text =3
+
+[Top5TextNumber4]
+X =120
+Y =393
+Color =White
+Font =1
+Size =9
+Align =1
+Text =4
+
+[Top5TextNumber5]
+X =120
+Y =443
+Color =White
+Font =1
+Size =9
+Align =1
+Text =5
+
+[Top5StaticNumber1]
+Tex=Bar
+X=100
+Y=190
+W=60
+H=60
+Color=ColorLight
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[Top5StaticNumber2]
+Tex=Bar
+X=100
+Y=286
+W=40
+H=40
+Color=ColorLight
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[Top5StaticNumber3]
+Tex=Bar
+X=100
+Y=336
+W=40
+H=40
+Color=ColorLight
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[Top5StaticNumber4]
+Tex=Bar
+X=100
+Y=386
+W=40
+H=40
+Color=ColorLight
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[Top5StaticNumber5]
+Tex=Bar
+X=100
+Y=436
+W=40
+H=40
+Color=ColorLight
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[Level]
+Texts=2
+
+[LevelBackground]
+Tex=MainBG
+
+[LevelStatic2]
+Tex =ButtonNavi
+X =196
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[LevelStatic3]
+Tex =ButtonEnter
+X =350
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[LevelStatic4]
+Tex =ButtonEsc
+X =510
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[LevelText3]
+X =226
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_NAVIGATE
+Align=0
+
+[LevelText4]
+X =380
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_SELECT
+Align=0
+
+[LevelText5]
+X =540
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_ESC
+Align=0
+
+[LevelStatic1]
+X=20
+Y=250
+W=32
+H=32
+Tex=MainIcon
+Type=Font Black
+Color=ColorDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[LevelButtonEasy]
+Tex=Button
+X=25
+Y=310
+W=250
+H=70
+Type=Font Black
+Texts=1
+Color=ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+
+[LevelButtonMedium]
+Tex=Button
+X=275
+Y=310
+W=250
+H=70
+Type=Font Black
+Texts=1
+Color=ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+
+[LevelButtonHard]
+Tex=Button
+X=525
+Y=310
+W=250
+H=70
+Type=Font Black
+Texts=1
+Color=ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+
+[LevelText1]
+X=30
+Y=180
+Font=1
+Size=22
+Align=0
+Text=SING_DIFFICULTY_WHEREAMI
+Color=GrayLight
+
+[LevelText2]
+X=50
+Y=248
+Font=1
+Size=10
+Align=0
+Text=SING_DIFFICULTY_DESC
+Color=GrayDark
+
+[LevelButtonEasyText1]
+X=115
+Y=20
+Font=1
+Size=9
+Align=1
+Text=SING_EASY
+Color=White
+
+[LevelButtonMediumText1]
+X=115
+Y=20
+Font=1
+Size=9
+Align=1
+Text=SING_MEDIUM
+Color=White
+
+[LevelButtonHardText1]
+X=115
+Y=20
+Font=1
+Size=9
+Align=1
+Text=SING_HARD
+Color=White
+
+
+[Name]
+Texts=2
+
+[NameBackground]
+Tex=MainBG
+
+[NameStatic2]
+Tex =ButtonNavi
+X =176
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[NameStatic3]
+Tex =ButtonAZ
+X =330
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[NameStatic4]
+Tex =ButtonEnter
+X =532
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[NameText3]
+X =206
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_NAVIGATE
+Align=0
+
+[NameText4]
+X =360
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_PLAYER_ENTER_NAME
+Align=0
+
+[NameText5]
+X =562
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_CONTINUE
+Align=0
+
+[NameStatic1]
+X=20
+Y=250
+W=32
+H=32
+Tex=MainIcon
+Type=Font Black
+Color=ColorDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[NameText1]
+X=30
+Y=180
+Font=1
+Size=22
+Align=0
+Text=SING_PLAYER_WHEREAMI
+Color=GrayLight
+
+[NameText2]
+X=50
+Y=248
+Font=1
+Size=10
+Align=0
+Text=SING_PLAYER_DESC
+Color=GrayDark
+
+[NameButtonPlayer1]
+Tex=Button
+X=25
+Y=310
+W=250
+H=70
+Type=Font Black
+Texts=1
+Color=P1Dark
+DColor=P1Lightest
+DInt=0.5
+
+[NameButtonPlayer1Text1]
+X=115
+Y=20
+Font=1
+Size=9
+Align=1
+Text=
+Color=White
+
+[NameButtonPlayer2]
+Tex=Button
+X=25
+Y=380
+W=250
+H=70
+Type=Font Black
+Texts=1
+Color=P2Dark
+DColor=P2Lightest
+DInt=0.5
+
+[NameButtonPlayer2Text1]
+X=115
+Y=20
+Font=1
+Size=9
+Align=1
+Text=
+Color=White
+
+[NameButtonPlayer3]
+Tex=Button
+X=25
+Y=450
+W=250
+H=70
+Type=Font Black
+Texts=1
+Color=P3Dark
+DColor=P3Lightest
+DInt=0.5
+
+[NameButtonPlayer3Text1]
+X=115
+Y=20
+Font=1
+Size=9
+Align=1
+Text=
+Color=White
+
+[NameButtonPlayer4]
+Tex=Button
+X=425
+Y=310
+W=250
+H=70
+Type=Font Black
+Texts=1
+Color=P4Dark
+DColor=P4Lightest
+DInt=0.5
+
+[NameButtonPlayer4Text1]
+X=115
+Y=20
+Font=1
+Size=9
+Align=1
+Text=
+Color=White
+
+[NameButtonPlayer5]
+Tex=Button
+X=425
+Y=380
+W=250
+H=70
+Type=Font Black
+Texts=1
+Color=P5Dark
+DColor=P5Lightest
+DInt=0.5
+
+[NameButtonPlayer5Text1]
+X=115
+Y=20
+Font=1
+Size=9
+Align=1
+Text=
+Color=White
+
+[NameButtonPlayer6]
+Tex=Button
+X=425
+Y=450
+W=250
+H=70
+Type=Font Black
+Texts=1
+Color=P6Dark
+DColor=P6Lightest
+DInt=0.5
+
+[NameButtonPlayer6Text1]
+X=115
+Y=20
+Font=1
+Size=9
+Align=1
+Text=
+Color=White
+
+[PartyNewRound]
+Texts =7
+
+[PartyNewRoundStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =Gray
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =Gray
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic3]
+X =37
+Y =72
+W =27
+H =27
+Color =ColorDark
+Tex =MainIcon
+Type=Font Black
+
+[PartyNewRoundText1]
+X =40
+Y =4
+Font = 1
+Size = 22
+Color =GrayLight
+Text=PARTY_MODE
+
+[PartyNewRoundText2]
+X =62
+Y =67
+Color=Black
+Font =1
+Size =9
+Align =0
+Text=PARTY_ROUND_DESC
+
+[PartyNewRoundText3]
+X =398
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=2
+Text=PARTY_ROUND_WHEREAMI
+
+[PartyNewRoundText4]
+X =450
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=PARTY_ROUND_LEGEND_CONTINUE
+
+[PartyNewRoundText5]
+X =460
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND
+Align=0
+
+[PartyNewRoundText6]
+X =600
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND_WINNER
+Align=0
+
+[PartyNewRoundText7]
+X =448
+Y =350
+Color =White
+Font =0
+Size =18
+Text =PARTY_ROUND
+Align=2
+
+[PartyNewRoundTextTeam1Players]
+X =30
+Y =137
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam2Players]
+X =30
+Y =218
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam3Players]
+X =30
+Y =299
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundStatic4]
+Tex =PartyRoundBG1
+X =450
+Y =103
+W = 330
+H = 24
+Int=1
+Color =Gray
+Type=Font Black
+
+[PartyNewRoundStatic5]
+X =420
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[PartyNewRoundStatic6]
+Tex =PartyRoundBG3
+X =250
+Y =350
+W = 300
+H = 50
+Int=1
+Color =Gray
+Type=Font Black
+
+[PartyNewRoundStatic7]
+Tex =PartyRoundBG4
+X =50
+Y =495
+W = 700
+H = 30
+Int=1
+Color =GrayLight
+Type=Font Black
+
+[PartyNewRoundStaticTeam1]
+Tex =PartyTeamButton1
+X =20
+Y =110
+W =400
+H =50
+Int=1
+Color =P1Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam2]
+Tex =PartyTeamButton1
+X =20
+Y =191
+W =400
+H =50
+Int=1
+Color =P2Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam3]
+Tex =PartyTeamButton1
+X =20
+Y =272
+W =400
+H =50
+Int=1
+Color =P3Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticNextPlayer1]
+Tex=PartyPlayerButton
+X=155
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P1Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer2]
+Tex=PartyPlayerButton
+X=325
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P2Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer3]
+Tex=PartyPlayerButton
+X=495
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P3Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundTextRound1]
+X =460
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Round 1
+Align=0
+
+[PartyNewRoundTextRound2]
+X =460
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Round 2
+Align=0
+
+[PartyNewRoundTextRound3]
+X =460
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Round 3
+Align=0
+
+[PartyNewRoundTextRound4]
+X =460
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Round 4
+Align=0
+
+[PartyNewRoundTextRound5]
+X =460
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Round 5
+Align=0
+
+[PartyNewRoundTextRound6]
+X =460
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Round 6
+Align=0
+
+[PartyNewRoundTextRound7]
+X =460
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Round 7
+Align=0
+
+[PartyNewRoundTextWinner1]
+X =600
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Winner 1
+Align=0
+
+[PartyNewRoundTextWinner2]
+X =600
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Winner 2
+Align=0
+
+[PartyNewRoundTextWinner3]
+X =600
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Winner 3
+Align=0
+
+[PartyNewRoundTextWinner4]
+X =600
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Winner 4
+Align=0
+
+[PartyNewRoundTextWinner5]
+X =600
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Winner 5
+Align=0
+
+[PartyNewRoundTextWinner6]
+X =600
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Winner 6
+Align=0
+
+[PartyNewRoundTextWinner7]
+X =600
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Winner 7
+Align=0
+
+[PartyNewRoundStaticRound1]
+Tex =PartyRoundBG2
+X =450
+Y =135
+W = 330
+H = 20
+Color =GrayLight
+Type =Font Black
+
+[PartyNewRoundStaticRound2]
+Tex =PartyRoundBG2
+X =450
+Y =164
+W = 330
+H = 20
+Color =GrayLight
+Type =Font Black
+
+[PartyNewRoundStaticRound3]
+Tex =PartyRoundBG2
+X =450
+Y =193
+W = 330
+H = 20
+Color =GrayLight
+Type =Font Black
+
+[PartyNewRoundStaticRound4]
+Tex =PartyRoundBG2
+X =450
+Y =222
+W = 330
+H = 20
+Color =GrayLight
+Type =Font Black
+
+[PartyNewRoundStaticRound5]
+Tex =PartyRoundBG2
+X =450
+Y =251
+W = 330
+H = 20
+Color =GrayLight
+Type =Font Black
+
+[PartyNewRoundStaticRound6]
+Tex =PartyRoundBG2
+X =450
+Y =280
+W = 330
+H = 20
+Color =GrayLight
+Type =Font Black
+
+[PartyNewRoundStaticRound7]
+Tex =PartyRoundBG2
+X =450
+Y =309
+W = 330
+H = 20
+Color =GrayLight
+Type =Font Black
+
+[PartyNewRoundTextNextRound]
+X =400
+Y =495
+Color =White
+Font =0
+Size =10
+Text =Next Round
+Align=1
+
+[PartyNewRoundTextNextRoundNo]
+X =457
+Y =350
+Color =White
+Font =0
+Size =18
+Text =99
+Align=0
+
+[PartyNewRoundTextScoreTeam1]
+X =390
+Y =110
+Color =White
+Font =0
+Size =17
+Text =3000
+Align=1
+
+[PartyNewRoundTextScoreTeam2]
+X =390
+Y =191
+Color =White
+Font =0
+Size =17
+Text =2000
+Align=1
+
+[PartyNewRoundTextScoreTeam3]
+X =390
+Y =272
+Color =White
+Font =0
+Size =17
+Text =1000
+Align=1
+
+[PartyNewRoundTextNameTeam1]
+X =30
+Y =108
+Color =White
+Font =0
+Size =12
+Text =Team 1
+Align=0
+
+[PartyNewRoundTextNameTeam2]
+X =30
+Y =189
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyNewRoundTextNameTeam3]
+X =30
+Y =270
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyNewRoundTextNextPlayer1]
+X =230
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 1
+Align=1
+
+[PartyNewRoundTextNextPlayer2]
+X =400
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 2
+Align=1
+
+[PartyNewRoundTextNextPlayer3]
+X =570
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 3
+Align=1
+
+[PartyScore]
+Texts=5
+
+[PartyScoreBackground]
+Tex=PartyBG
+
+[PartyScoreDecoTextures]
+ChangeTextures =1
+
+FirstTexture =PartyScoreDeco
+FirstTyp =Font Black
+FirstColor =Gold
+
+SecondTexture =PartyScoreDeco
+SecondTyp =Font Black
+SecondColor =Silver
+
+ThirdTexture =PartyScoreDeco
+ThirdTyp =Font Black
+ThirdColor =Bronze
+
+[PartyScoreStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic3]
+X =37
+Y =72
+W =27
+H =27
+Color =ColorDark
+Tex =MainIcon
+Type=Font Black
+
+[PartyScoreStatic4]
+X =410
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[PartyScoreText1]
+X =40
+Y =4
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 22
+Color =GrayLight
+Text=PARTY_MODE
+
+[PartyScoreText2]
+X =62
+Y =67
+Color=Black
+Font =1
+Size =9
+Align =0
+Text=PARTY_SCORE_DESC
+
+[PartyScoreText3]
+X =388
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=2
+Text=PARTY_SCORE_WHEREAMI
+
+[PartyScoreText4]
+X =440
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=PARTY_LEGEND_CONTINUE
+
+[PartyScoreStatic5]
+Tex =PartyScoreBG1
+X =50
+Y =100
+W = 700
+H = 80
+Int=1
+Color =Gray
+Type=Font Black
+
+[PartyScoreStatic6]
+Tex =PartyScoreBG2
+X =50
+Y =495
+W = 700
+H = 20
+Int=1
+Color =GrayLight
+Type=Font Black
+
+[PartyScoreText5]
+X =400
+Y =136
+Color =White
+Font =0
+Size =18
+Text =PARTY_SCORE_WINS2
+Align=1
+
+[PartyScoreTextWinner]
+X =400
+Y =98
+Color =White
+Font =0
+Size =18
+Text =The Winner is...
+Align=1
+
+[PartyScoreTextScoreTeam1]
+X =568
+Y =198
+Color =White
+Font =0
+Size =12
+Text =3000
+Align=2
+
+[PartyScoreTextScoreTeam2]
+X =568
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyScoreTextScoreTeam3]
+X =568
+Y =398
+Color =White
+Font =0
+Size =12
+Text =1000
+Align=2
+
+[PartyScoreTextNameTeam1]
+X =188
+Y =198
+Font=0
+Size=12
+Align=0
+Text=Team 1
+Color=White
+
+[PartyScoreTextNameTeam2]
+X =188
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyScoreTextNameTeam3]
+X =188
+Y =398
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyScoreStaticTeam1]
+X =188
+Y =230
+W =380
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam1BG]
+Tex=PartyTeamButton2
+X=178
+Y=200
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam1Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 191
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam2]
+X =188
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam2BG]
+Tex=PartyTeamButton2
+X=178
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam2Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam3]
+X =188
+Y =430
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam3BG]
+Tex=PartyTeamButton2
+X=178
+Y=400
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam3Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 391
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyWin]
+Texts=4
+
+[PartyWinBackground]
+Tex=PartyBG
+
+[PartyWinStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic3]
+X =37
+Y =72
+W =27
+H =27
+Color =ColorDark
+Tex =MainIcon
+Type=Font Black
+
+[PartyWinStatic4]
+X =380
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[PartyWinText1]
+X =40
+Y =4
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 22
+Color =GrayLight
+Text=PARTY_MODE
+
+[PartyWinText2]
+X =62
+Y =67
+Color=Black
+Font =1
+Size =9
+Align =0
+Text=PARTY_WIN_DESC
+
+[PartyWinText3]
+X =358
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=2
+Text=PARTY_WIN_WHEREAMI
+
+[PartyWinText4]
+X =410
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=PARTY_WIN_LEGEND_CONTINUE
+
+#[PartyWinTextWinner]
+#X =150
+#Y =120
+#Color =White
+#Font =1
+#Size =14
+#Text =The Winner is...
+#Align=0
+
+[PartyWinTextScoreTeam1]
+X =699
+Y =183
+Color =White
+Font =0
+Size =19
+Text =3000
+Align=2
+
+[PartyWinTextScoreTeam2]
+X =669
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyWinTextScoreTeam3]
+X =649
+Y =398
+Color =White
+Font =0
+Size =9
+Text =1000
+Align=2
+
+[PartyWinTextNameTeam1]
+X =169
+Y =183
+Font=0
+Size=19
+Align=0
+Text=Team 1
+Color=White
+
+[PartyWinTextNameTeam2]
+X =289
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyWinTextNameTeam3]
+X =369
+Y =398
+Color =White
+Font =0
+Size =9
+Text =Team 3
+Align=0
+
+[PartyWinStaticTeam1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BG]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank2]
+Tex=PartyTeamButton3
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank3]
+Tex=PartyTeamButton3
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyWinStaticTeam1Deco]
+Tex =PartyWinDeco1
+X = 91
+Y = 176
+W = 79
+H = 79
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BG]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamButton3
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank1]
+Tex=PartyTeamButton4
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank2]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank3]
+Tex=PartyTeamButton4
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Deco]
+Tex =PartyWinDeco2
+X = 226
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Silver
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BG]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank2]
+Tex=PartyTeamButton5
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank3]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Deco]
+Tex =PartyWinDeco3
+X = 316
+Y = 391
+W = 54
+H = 54
+Type =Font Black
+Color =Bronze
+Reflection=1
+ReflectionSpacing=3
+
+[PartyOptions]
+Texts = 3
+
+[PartyOptionsBackground]
+Tex=PartyBG
+
+[PartyOptionsStatic1]
+Tex =ButtonNavi
+X =196
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[PartyOptionsStatic2]
+Tex =ButtonEnter
+X =350
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[PartyOptionsStatic3]
+Tex =ButtonEsc
+X =510
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[PartyOptionsText2]
+X =226
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_NAVIGATE
+Align=0
+
+[PartyOptionsText3]
+X =380
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_CONTINUE
+Align=0
+
+[PartyOptionsText4]
+X =540
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_ESC
+Align=0
+
+[PartyOptionsText1]
+X = 50
+Y = 10
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 25
+Text=PARTY_OPTIONS_WHEREAMI
+
+[PartyOptionsSelectLevel]
+Tex = MainBar
+TexSBG = MainBar
+Text =PARTY_DIFFICULTY
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList]
+Tex = MainBar
+TexSBG = MainBar
+Text =PARTY_PLAYLIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList2]
+Tex = MainBar
+TexSBG = MainBar
+Text =PARTY_PLAYLIST
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectRounds]
+Tex = MainBar
+TexSBG = MainBar
+Text =PARTY_ROUNDS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectTeams]
+Tex = MainBar
+TexSBG = MainBar
+Text =PARTY_TEAMS
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers1]
+Tex = MainBar
+TexSBG = MainBar
+Text =PARTY_TEAMS_PLAYER1
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers2]
+Tex = MainBar
+TexSBG = MainBar
+Text =PARTY_TEAMS_PLAYER2
+X = 40
+Y = 415
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers3]
+Tex = MainBar
+TexSBG = MainBar
+Text =PARTY_TEAMS_PLAYER3
+X = 40
+Y = 470
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+
+[PartyPlayer]
+Texts=6
+
+[PartyPlayerBackground]
+Tex=PartyBG
+
+[PartyPlayerStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyPlayerText1]
+X = 50
+Y = 10
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 25
+Text=PARTY_PLAYER_WHEREAMI
+
+[PartyPlayerStatic2]
+Tex =ButtonNavi
+X =176
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[PartyPlayerStatic3]
+Tex =ButtonAZ
+X =330
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[PartyPlayerStatic4]
+Tex =ButtonEnter
+X =532
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[PartyPlayerText2]
+X =206
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_NAVIGATE
+Align=0
+
+[PartyPlayerText3]
+X =360
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_PLAYER_ENTER_NAME
+Align=0
+
+[PartyPlayerText4]
+X =562
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_CONTINUE
+Align=0
+
+[PartyPlayerTeam1Name]
+Tex=PartyTeamButton2
+X=85
+Y=100
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Dark
+
+[PartyPlayerTeam1NameText1]
+X =155
+Y =8
+Font=1
+Size=11
+Align=1
+Text=Team 1
+Color=White
+
+[PartyPlayerPlayer1Name]
+Tex=Button
+X=81
+Y=160
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+
+[PartyPlayerPlayer1NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 1
+Color=White
+
+[PartyPlayerPlayer2Name]
+Tex=Button
+X=241
+Y=160
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+
+[PartyPlayerPlayer2NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 2
+Color=White
+
+[PartyPlayerPlayer3Name]
+Tex=Button
+X=401
+Y=160
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+
+[PartyPlayerPlayer3NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 3
+Color=White
+
+[PartyPlayerPlayer4Name]
+Tex=Button
+X=561
+Y=160
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+
+[PartyPlayerPlayer4NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 4
+Color=White
+
+[PartyPlayerTeam2Name]
+Tex=PartyTeamButton2
+X=85
+Y=240
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Dark
+
+[PartyPlayerTeam2NameText1]
+X =155
+Y =8
+Font=1
+Size=11
+Align=1
+Text=Team 2
+Color=White
+
+[PartyPlayerPlayer5Name]
+Tex=Button
+X=81
+Y=300
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+
+[PartyPlayerPlayer5NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 5
+Color=White
+
+[PartyPlayerPlayer6Name]
+Tex=Button
+X=241
+Y=300
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+
+[PartyPlayerPlayer6NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 6
+Color=White
+
+[PartyPlayerPlayer7Name]
+Tex=Button
+X=401
+Y=300
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+
+[PartyPlayerPlayer7NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 7
+Color=White
+
+[PartyPlayerPlayer8Name]
+Tex=Button
+X=561
+Y=300
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+
+[PartyPlayerPlayer8NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 8
+Color=White
+
+[PartyPlayerTeam3Name]
+Tex=Button
+Tex=PartyTeamButton2
+X=85
+Y=380
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Dark
+
+[PartyPlayerTeam3NameText1]
+X =155
+Y =8
+Font=1
+Size=11
+Align=1
+Text=Team 3
+Color=White
+
+[PartyPlayerPlayer9Name]
+Tex=Button
+X=81
+Y=440
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+
+[PartyPlayerPlayer9NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 9
+Color=White
+
+[PartyPlayerPlayer10Name]
+Tex=Button
+X=241
+Y=440
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+
+[PartyPlayerPlayer10NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 10
+Color=White
+
+[PartyPlayerPlayer11Name]
+Tex=Button
+X=401
+Y=440
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+
+[PartyPlayerPlayer11NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 11
+Color=White
+
+[PartyPlayerPlayer12Name]
+Tex=Button
+X=561
+Y=440
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+
+[PartyPlayerPlayer12NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 12
+Color=White
+
+# # # # Song Extensions # # # #
+[SongMenu]
+Texts=0
+Statics=1
+
+[SongMenuButton1]
+X = 505
+Y = 195
+W = 220
+H = 25
+Tex = SongMenuButton
+Color =ColorDark
+DColor = Gray
+Type=Font Black
+Texts=1
+Z = 0.988
+
+[SongMenuButton1Text1]
+X =110
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=SONG_MENU_PLAY
+Align=1
+Z=0.99
+
+[SongMenuButton2]
+X = 505
+Y = 225
+W = 220
+H = 25
+Tex = SongMenuButton
+Color =ColorDark
+DColor = Gray
+Type=Font Black
+Texts=1
+Z = 0.988
+
+[SongMenuButton2Text1]
+X =110
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=SONG_MENU_EDIT
+Align=1
+Z=0.99
+
+[SongMenuButton3]
+X = 505
+Y = 255
+W = 220
+H = 25
+Tex = SongMenuButton
+Color =ColorDark
+DColor = Gray
+Type=Font Black
+Texts=1
+Z = 0.988
+
+[SongMenuButton3Text1]
+X =110
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=SONG_MENU_MODI
+Align=1
+Z=0.99
+
+[SongMenuButton4]
+X = 505
+Y = 285
+W = 220
+H = 25
+Tex = SongMenuButton
+Color =ColorDark
+DColor = Gray
+Type=Font Black
+Texts=1
+Z = 0.988
+
+[SongMenuButton4Text1]
+X =110
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=SONG_MENU_CANCEL
+Align=1
+Z=0.99
+
+[SongMenuSelectSlide3]
+Tex = Rectangle
+TexSBG = SongMenuSelectBG
+Text =
+X = 505
+Y = 255
+W = 0
+H = 25
+Z = 0.988
+SkipX = 0
+SBGW=220
+
+TextSize=8
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = Black
+STDColor = Black
+
+[SongMenuTextMenu]
+X =615
+Y =140
+Color=Black
+Font =0
+Size =13
+Text=MENU
+Align=1
+Z=0.99
+
+[SongMenuStatic1]
+X =400
+Y =100
+W =200
+H =262
+Z =0.45
+Color=White
+Tex =Rectangle
+Type=Font Black
+TexX1=0.1
+TexY1=0.1
+TexX2=0.9
+TexY2=0.9
+
+[SongMenuStatic2]
+X =400
+Y =100
+W =200
+H =262
+Z =0.45
+Color=Black
+Tex =SongFade
+Type=Font Black
+TexX1=0.5
+TexY1=0.1
+TexX2=0.7
+TexY2=0.7
+
+[SongMenuStatic3]
+Tex =SongMenuBG
+X =500
+Y =140
+W =230
+H =200
+Z =0.985
+Int=1
+Color =White
+Type=Font Black
+
+[SongMenuStatic4]
+X =705
+Y =120
+W =42
+H =240
+Z=0.985
+Color =Gray
+Tex =SongMenuBorder
+Type=Font Black
+Z=0.98
+
+# # # # Song Jump to Menu # # # #
+[SongJumpto]
+Texts=0
+Statics=1
+
+[SongJumptoText1]
+X =30
+Y =7
+Color=Black
+Font =1
+Size =10
+Text=SONG_JUMPTO_TYPE_DESC
+Align=0
+Z=0.99
+
+[SongJumptoSelectSlideType]
+Tex = button
+TexSBG = mainicon
+#Text = SONG_JUMPTO_TYPE_DESC
+Font=1
+X = 160
+Y = 10
+Z = 0.99
+W = 0
+H = 30
+SkipX = 0
+SBGW= 120
+Fields=2
+DColor = White
+TColor = Gray
+TDColor = Gray
+SBGTex = button
+SBGDColor = White
+STColor = Gray
+STDColor = White
+
+[SongJumptoButtonSearchText]
+X = 30
+Y = 40
+Z = 0.99
+W = 208
+H = 25
+Tex=JumpToBG
+Type=Font Black
+Color=Black
+Texts=1
+
+[SongJumptoButtonSearchTextText1]
+X = 2
+Y = -1
+Size=9
+Font=0
+Color=Black
+Align=0
+
+[SongJumptoTextFound]
+X =30
+Y =70
+Color=Black
+Font =0
+Size =8
+Text=SONG_JUMPTO_HELP
+Align=0
+Z=0.99
+
+
+# # # # Statistic Screens # # # #
+[StatMain]
+Texts=4
+Statics=6
+
+[StatMainBackground]
+Tex=MainBG
+
+[StatMainStatic5]
+Tex =ButtonNavi
+X =196
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[StatMainStatic6]
+Tex =ButtonEnter
+X =350
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[StatMainStatic7]
+Tex =ButtonEsc
+X =510
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[StatMainText3]
+X =226
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_NAVIGATE
+Align=0
+
+[StatMainText4]
+X =380
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_SELECT
+Align=0
+
+[StatMainText5]
+X =540
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_ESC
+Align=0
+
+[StatMainButtonScores]
+X =589
+Y =120
+W =190
+H =50
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[StatMainButtonScoresText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SCORES
+Color=White
+
+[StatMainButtonSingers]
+X =589
+Y =180
+W =190
+H =50
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[StatMainButtonSingersText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SINGERS
+Color=White
+
+[StatMainButtonSongs]
+X =589
+Y =240
+W =190
+H =50
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[StatMainButtonSongsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_SONGS
+Color=White
+
+[StatMainButtonBands]
+X =589
+Y =300
+W =190
+H =50
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[StatMainButtonBandsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_BANDS
+Color=White
+
+[StatMainButtonExit]
+X =589
+Y =360
+W =190
+H =50
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[StatMainButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatMainTextOverview]
+X =45
+Y =145
+W =510
+Color=Black
+Font =0
+Size =9
+Align=0
+Text=
+
+[StatMainStatic1]
+X =40
+Y =71
+W =32
+H =32
+Color =ColorDark
+Tex =MainIcon
+Type=Font Black
+
+
+[StatMainStatic2]
+X =40
+Y =120
+W =520
+H =20
+Tex=StatMainBG1
+Color =ColorLight
+Type=Font Black
+
+[StatMainStatic3]
+X =40
+Y =140
+W =520
+H =300
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatMainStatic4]
+X =40
+Y =440
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+[StatMainText1]
+X =40
+Y =6
+Color=GrayLight
+Font =1
+Size =22
+Text=STAT_MAIN
+Align=0
+
+[StatMainText2]
+X =73
+Y =69
+Color=GrayDark
+Font =1
+Size =10
+Align =0
+Text=STAT_MAIN_DESC
+
+
+[StatDetail]
+Texts=0
+Statics=0
+
+[StatDetailBackground]
+Tex=MainBG
+
+[StatDetailStatic5]
+Tex =ButtonNavi
+X =196
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[StatDetailStatic6]
+Tex =ButtonEnter
+X =350
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[StatDetailStatic7]
+Tex =ButtonEsc
+X =510
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[StatDetailText2]
+X =226
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_NAVIGATE
+Align=0
+
+[StatDetailText3]
+X =380
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_SELECT
+Align=0
+
+[StatDetailText4]
+X =540
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_ESC
+Align=0
+
+[StatDetailButtonNext]
+X =589
+Y =120
+W =190
+H =50
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[StatDetailButtonNextText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_NEXT
+Color=White
+
+[StatDetailButtonPrev]
+X =589
+Y =180
+W =190
+H =50
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[StatDetailButtonPrevText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_PREV
+Color=White
+
+[StatDetailButtonReverse]
+X =589
+Y =240
+W =190
+H =50
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[StatDetailButtonReverseText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_REVERSE
+Color=White
+
+[StatDetailButtonExit]
+X =589
+Y =300
+W =190
+H =50
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[StatDetailButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatDetailTextDescription]
+X =73
+Y =69
+Color=GrayDark
+Font =1
+Size =10
+Align =0
+Text=
+
+[StatDetailTextPage]
+X = 546
+Y = 118
+Color= Black
+Font = 0
+Size = 5
+Align=2
+Text=
+
+[StatDetailTextList1]
+X = 45
+Y = 142
+Color=Black
+Font = 0
+Size = 8
+Text=Stat1
+
+[StatDetailTextList2]
+X = 45
+Y = 180
+Color=Black
+Font = 0
+Size = 8
+Text=Stat2
+
+[StatDetailTextList3]
+X = 45
+Y = 218
+Color=Black
+Font = 0
+Size = 8
+Text=
+
+[StatDetailTextList4]
+X = 45
+Y = 256
+Color=Black
+Font = 0
+Size = 8
+Text=
+
+[StatDetailTextList5]
+X = 45
+Y = 294
+Color=Black
+Font = 0
+Size = 8
+Text=
+
+[StatDetailTextList6]
+X = 45
+Y = 332
+Color=Black
+Font = 0
+Size = 8
+Text=
+
+[StatDetailTextList7]
+X = 45
+Y = 370
+Color=Black
+Font = 0
+Size = 8
+Text=
+
+[StatDetailTextList8]
+X = 45
+Y = 408
+Color=Black
+Font = 0
+Size = 8
+Text=
+
+[StatDetailTextList9]
+X = 45
+Y = 446
+Color=Black
+Font = 0
+Size = 8
+Text=
+
+[StatDetailTextList10]
+X = 45
+Y = 484
+Color=Black
+Font = 0
+Size = 8
+Text=
+
+[StatDetailStatic1]
+X =40
+Y =71
+W =32
+H =32
+Color =ColorDark
+Tex =MainIcon
+Type=Font Black
+
+[StatDetailStatic2]
+X =40
+Y =120
+W =520
+H =24
+Tex=StatDetailBG1
+Color =ColorLight
+Type=Font Black
+
+[StatDetailStatic3]
+X =40
+Y =144
+W =520
+H =379
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatDetailStatic4]
+X =40
+Y =523
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+
+[StatDetailText1]
+X =40
+Y =6
+Color=GrayLight
+Font =1
+Size =22
+Text=STAT_DETAIL
+Align=0
+
+
+# # # # OnScreen PopUp Error / Question Messages # # # #
+[CheckPopup]
+Texts=0
+Statics=3
+
+[CheckPopupButton1]
+X = 192
+Y = 327
+W = 128
+H = 50
+Tex =MainBar
+Color = ColorDark
+DColor = White
+Int=1
+DInt=0.5
+Type=Font Black
+Texts=1
+Z = 1
+
+[CheckPopupButton1Text1]
+X =64
+Y =13
+Color=White
+Font =0
+Size =8
+Text=Yes
+Align=1
+Z=1
+
+[CheckPopupButton2]
+X = 480
+Y = 327
+W = 128
+H = 50
+Tex =MainBar
+Color = ColorDark
+DColor = White
+Int=1
+DInt=0.5
+Type=Font Black
+Texts=1
+Z = 1
+
+[CheckPopupButton2Text1]
+X =64
+Y =13
+Color=White
+Font =0
+Size =8
+Text=No
+Align=1
+Z=1
+
+[CheckPopupText]
+X =400
+Y =226
+W =500
+Color=Black
+Font =0
+Size =14
+Text=
+Align=1
+Z=1
+
+[CheckPopupStatic1]
+Tex =PopUpBG
+X =99
+Y =224
+W =602
+H =152
+Z =1
+Int=1
+Color =White
+Type=Font Black
+
+[CheckPopupStatic2]
+Tex =PopUpFG
+X =99
+Y =224
+W =602
+H =152
+Z =1
+Int=1
+Color =Black
+Type=Font Black
+
+[CheckPopupStatic3]
+Tex =IconQuestion
+X =124
+Y =235
+W =44
+H =44
+Z =1
+Int=1
+Color =Black
+Type=Font Black
+
+[ErrorPopup]
+Texts=1
+Statics=1
+
+[ErrorPopupButton1]
+X = 366
+Y = 342
+W =22
+H =22
+Tex =ButtonEnter
+Color = White
+DColor = White
+Type=Plain
+Texts=1
+Z = 1
+
+[ErrorPopupButton1Text1]
+X =32
+Y =0
+Color=Black
+Font =0
+Size =10
+Text=OK
+Align=0
+Z=0
+
+[ErrorPopupText]
+X =400
+Y =226
+W =500
+Color=Black
+Font =0
+Size =14
+Text=
+Align=1
+Z=1
+
+[ErrorPopupStatic1]
+Tex =PopUpBG
+X =99
+Y =224
+W =602
+H =152
+Z =1
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopupStatic2]
+Tex =PopUpFG
+X =99
+Y =224
+W =602
+H =152
+Z =1
+Int=1
+Color =Black
+Type=Font Black
+
+[ErrorPopupStatic3]
+Tex =IconError
+X =124
+Y =235
+W =44
+H =44
+Z =1
+Int=1
+Color =Black
+Type=Font Black \ No newline at end of file
diff --git a/Game/Output/Themes/TODOs/Orange.ini b/Game/Output/Themes/TODOs/Orange.ini
new file mode 100644
index 00000000..838b3cbc
--- /dev/null
+++ b/Game/Output/Themes/TODOs/Orange.ini
@@ -0,0 +1,8088 @@
+;0.5.1 Mod
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Theme]
+Name=Orange
+Creator=!Skar!™
+
+[Colors]
+White = 255 255 255
+LightBlue = 119 187 210
+DarkBlue = 28 126 171
+LightRed = 170 146 146
+DarkRed = 155 113 113
+LightGreen = 136 168 136
+DarkGreen = 106 152 104
+LightPurple = 155 136 168
+DarkPurple = 145 104 152
+LightOrange = 168 155 136
+DarkOrange = 151 131 76
+LightYellow = 168 168 136
+DarkYellow = 150 151 76
+Turkis = 13 186 167
+GrayLightest = 223 223 223
+GrayLight = 191 191 191
+Gray = 127 127 127
+GrayDark = 63 63 63
+Black = 0 0 0
+GrayPopup = 51 51 51
+Gold = 255 223 31
+Silver = 223 223 223
+Bronze = 205 127 50
+LightOrange = 254 181 69
+DarkOrange = 254 154 69
+
+[Loading]
+Fade = 1
+
+[LoadingBackground]
+Tex=LoadingBG
+
+[Main]
+Texts =2
+Statics=4
+
+[MainBackground]
+Tex=MainBG
+
+[MainStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic2]
+X =254
+Y =0
+W =546
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic3]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[MainText1]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_MENU
+
+[MainText2]
+X =295
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[MainStatic4]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+Style=5
+
+[MainTextDescriptionLong]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=
+
+[MainButtonSolo]
+X =0
+Y =80
+W = -150
+H = 30
+Tex = Button-m-1
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[MainButtonSoloText1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_SING
+Color=Black
+
+[MainButtonMulti]
+X = 0
+Y = 110
+W = -150
+H = 30
+Tex = Button-m-2
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[MainButtonMultiText1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_MULTI
+Color=Black
+
+[MainButtonCollection1]
+X = 0
+Y = 140
+W = -150
+H = 30
+Tex = Button-m-3
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+FirstChild=3
+
+[MainButtonCollection1Text1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_TOOLS
+Color=Black
+
+[MainButtonStats]
+X =150
+Y =140
+W =120
+H =22
+Tex =ButtonCollection
+Color = LightOrange
+DColor = DarkOrange
+Type=Font Black
+Texts=1
+Reflection=0
+Parent=1
+
+[MainButtonStatsText1]
+X =60
+Y =-1
+Font=0
+Size=8
+Align=1
+Text=SING_STATS
+Color=GrayDark
+
+[MainButtonEditor]
+X =150
+Y =162
+W =120
+H =22
+Tex =ButtonCollection
+Color = LightOrange
+DColor = DarkOrange
+Type=Font Black
+Texts=1
+Reflection=0
+Parent=1
+
+[MainButtonEditorText1]
+X =60
+Y =-1
+Font=0
+Size=8
+Align=1
+Text=SING_EDITOR
+Color=GrayDark
+
+[MainButtonOptions]
+X =150
+Y =184
+W =120
+H =22
+Tex =ButtonCollection
+Color = LightOrange
+DColor = DarkOrange
+Type=Font Black
+Texts=1
+Reflection=0
+Parent=1
+
+[MainButtonOptionsText1]
+X =60
+Y =-1
+Font=0
+Size=8
+Align=1
+Text=SING_OPTIONS
+Color=GrayDark
+
+[MainButtonExit]
+X =0
+Y =170
+W = -150
+H = 30
+Tex = Button-m-4
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[MainButtonExitText1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_EXIT
+Color=Black
+
+
+##############Songscreen##################
+
+
+[Song]
+Texts =4
+
+[SongBackground]
+Tex=SongBG
+
+[SongCover]
+X=303
+Y=125
+W=320
+H=190
+Style=5
+Reflections=1
+
+[SongEqualizer]
+Visible=1
+Direction=1
+Color=DarkOrange
+Alpha=1
+X=2
+Y=584
+Z=0
+PieceW=14
+PieceH=14
+Space=2
+Bands=50
+Length=12
+
+[SongVideoIcon]
+X =299
+Y =487
+W =32
+H =32
+Z=1
+Color=DarkOrange
+Tex =VideoIcon
+Type=Font Black
+
+[SongStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[SongStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[SongStatic3]
+X =250
+Y =120
+W =300
+H =200
+Z =0.5
+Color =LightOrange
+Tex =SongSelection1
+Type=Font Black
+
+[SongStatic4]
+X =298
+Y =320
+W =200
+H =200
+Z=0.98
+Color =LightOrange
+Tex =SongSelection2
+Type=Font Black
+
+[SongTextCat]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_SONG_SELECTION_DESC
+
+[SongTextArtist]
+X =400
+Y =320
+W = 190
+Color=White
+Font =1
+Size =9
+Align =1
+Text=
+
+[SongTextTitle]
+X =400
+Y =380
+W = 190
+Color=White
+Font =0
+Size =9
+Align =1
+Text=
+
+[SongTextNumber]
+X =490
+Y =495
+Color=Black
+Font =0
+Size =8
+Align =2
+Text=
+
+#Variable statics and texts for song-screen in sing- and partymode
+# There can be an unlimited Number of Statics and Texts, As long
+# as the numbers are in order.
+# Statics that are shown in PartyMode Only are Named_
+# SongStaticParty[No]
+# Texts that are shown in PartyMode Only are Named_
+# SongTextParty[No]
+# Statics that are shown in Normal Mode Only are Named_
+# SongStaticNonParty[No]
+# Texts that are shown in Normal Mode Only are Named_
+# SongTextNonParty[No]
+#Here are the ones for singmode
+
+[SongStaticNonParty1]
+X =47
+Y =466
+W =27
+H =27
+Color =GrayLight
+Tex =SongCD
+Type=Font Black
+
+[SongStaticNonParty2]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonAlt
+Color =Gray
+Type=Font Black
+
+[SongStaticNonParty3]
+X =300
+Y =5
+W =26
+H =22
+Tex=ButtonAZ
+Color =Gray
+Type=Font Black
+
+[SongStaticNonParty4]
+X =425
+Y =5
+W =22
+H =22
+Tex=ButtonM
+Color =Gray
+Type=Font Black
+
+[SongStaticNonParty5]
+X =515
+Y =5
+W =22
+H =22
+Tex=ButtonJ
+Color =Gray
+Type=Font Black
+
+[SongStaticNonParty6]
+X =679
+Y =5
+W =22
+H =22
+Tex=ButtonP
+Color =Gray
+Type=Font Black
+
+#Texts Non Party
+[SongTextNonParty1]
+X =83
+Y =450
+Color=GrayLight
+Font =0
+Size =20
+Text=song
+Align=0
+
+[SongTextNonParty2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_SONG_SELECTION_WHEREAMI
+
+[SongTextNonParty3]
+X =288
+Y =8
+Color=Black
+Font =1
+Size =5
+Align=0
+Text=+
+
+[SongTextNonParty4]
+X =330
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_GOTO
+
+[SongTextNonParty5]
+X =450
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_MENU
+
+[SongTextNonParty6]
+X =540
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SONG_JUMPTO_DESC
+
+[SongTextNonParty7]
+X =705
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_PLAYLIST
+
+[SongTextNonParty8]
+X =83
+Y =478
+Color=GrayLight
+Font =0
+Size =20
+Text=selection
+Align=0
+
+
+#and theese are the ones for partymode
+
+[SongStaticParty1]
+X =47
+Y =466
+W =27
+H =27
+Color =GrayLight
+Tex =PartyIcon
+Type=Font Black
+
+[SongStaticParty2]
+X =260
+Y =5
+W =26
+H =22
+Tex=Button13
+Color =Gray
+Type=Font Black
+
+[SongStaticParty3]
+X =400
+Y =5
+W =22
+H =22
+Tex=ButtonM
+Color =Gray
+Type=Font Black
+
+[SongStaticParty4]
+X =540
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+
+#Texts for Party Mode
+
+[SongTextParty1]
+X =83
+Y =446
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =GrayLight
+Text=party
+
+[SongTextParty2]
+X =83
+Y =478
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =GrayLight
+Text=mode
+
+[SongTextParty3]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_SONG_WHEREAMI
+
+[SongTextParty4]
+X =288
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SONG_MENU_NAME_PARTY_JOKER
+
+[SongTextParty5]
+X =426
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_MENU
+
+[SongTextParty6]
+X =570
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_LEGEND_CONTINUE
+
+
+
+#variable statics end
+
+
+# Jokers, 5 for each team, only shown in party Mode
+[SongStaticTeam1Joker1]
+Tex =Joker
+X =530
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker2]
+Tex =Joker
+X =580
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker3]
+Tex =Joker
+X =630
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker4]
+Tex =Joker
+X =680
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker5]
+Tex =Joker
+X =730
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker1]
+Tex =Joker
+X =530
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker2]
+Tex =Joker
+X =580
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker3]
+Tex =Joker
+X =630
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker4]
+Tex =Joker
+X =680
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker5]
+Tex =Joker
+X =730
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker1]
+Tex =Joker
+X =530
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker2]
+Tex =Joker
+X =580
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker3]
+Tex =Joker
+X =630
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker4]
+Tex =Joker
+X =680
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker5]
+Tex =Joker
+X =730
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+
+##################### Sing Screen ###################
+
+
+[Sing]
+Texts =1
+
+
+[SingText1]
+Text =SING_TIME
+X =21
+Y =574
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingStatic1]
+;TextBG
+Tex =LyricBar
+X =10
+Y =490
+W =780
+H =85
+Color =White
+Type=Font Black
+
+[SingStatic2]
+;TimeBar
+Tex =TimeBar1
+X =10
+Y =575
+W =780
+H =16
+Color =Black
+Type=Font Black
+
+[SingTimeProgress]
+X =70
+Y =580
+W =652
+H =7
+Color=White
+
+[SingStatic3]
+;the thing behind the time progress
+Tex =TimeBar2
+X =70
+Y =580
+W =652
+H =7
+Color=GrayDark
+Type=Font Black
+
+[SingTimeText]
+Text =SING_TIME
+X =754
+Y =574
+Font =1
+Size =6
+Color =White
+Align=1
+
+# O N E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#PlayerOne
+[SingP1Static]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1Text]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1Static2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1SingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T W O P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1TwoPStatic]
+Tex =P
+X =20
+Y =117
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPText]
+Text =P1
+X =26
+Y =122
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1TwoPStatic2]
+Tex =ScoreBG
+X =680
+Y =102
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPTextScore]
+Text =00000
+X =690
+Y =104
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1TwoPSingBar]
+X =680
+Y =136
+W =100
+H =8
+
+#Player Two
+[SingP2RStatic]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P2Dark
+Type=Transparent
+
+[SingP2RText]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP2RStatic2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2RTextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2RSingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T H R E E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1ThreePStatic]
+Tex =P
+X =16
+Y =59
+W =50
+H =54
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePText]
+Text =P1
+X =27
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP1ThreePStatic2]
+Tex =ScoreBG
+X =75
+Y =61
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePTextScore]
+Text =00000
+X =85
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1ThreePSingBar]
+X =75
+Y =95
+W =100
+H =8
+
+#Player Two
+[SingP2MStatic]
+Tex =P
+X =311
+Y =59
+W =50
+H =54
+Color =P2Dark
+Type=Transparent
+
+[SingP2MText]
+Text =P2
+X =321
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP2MStatic2]
+Tex =ScoreBG
+X =370
+Y =61
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2MTextScore]
+Text =00000
+X =380
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2MSingBar]
+X =370
+Y =95
+W =100
+H =8
+
+#Player Three
+[SingP3RStatic]
+Tex =P
+X =611
+Y =59
+W =50
+H =54
+Color =P3Dark
+Type=Transparent
+
+[SingP3RText]
+Text =P3
+X =621
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP3RStatic2]
+Tex =ScoreBG
+X =670
+Y =61
+W =100
+H =34
+Color =P3Dark
+Type=Transparent
+
+[SingP3RTextScore]
+Text =00000
+X =680
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP3SingBar]
+X =670
+Y =95
+W =100
+H =8
+
+
+
+############### Score #####################
+
+
+
+[Score]
+Texts =1
+
+[ScoreBackground]
+Tex=ScoreScreenBG
+
+[ScoreText1]
+X =68
+Y =30
+Color=GrayLight
+Font =0
+Size =20
+Text=SONG_SCORE
+Align=0
+
+[ScoreTextArtistTitle]
+X =70
+Y =77
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=ArtistTitle
+
+[ScoreStatic1]
+X =32
+Y =46
+W =27
+H =27
+Color =GrayLight
+Tex =ScoreIcon
+Type=Font Black
+
+[ScoreStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreText2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SONG_SCORE_WHEREAMI
+
+[ScoreStatic4]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+
+[ScoreText3]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+#end of main stuff
+
+# # # # # # # # # # # # # # # # # # One Player Score # # # # # # # # # # # #
+[ScoreTextName1]
+X =175
+Y =260
+Font =0
+Size =14
+Text =P1
+Color =Black
+Align=0
+
+[ScoreTextScore1]
+X =175
+Y =430
+Color =Black
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes1]
+X =175
+Y =340
+Color =Black
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore1]
+X =465
+Y =340
+Color =Black
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextLineBonus1]
+X =175
+Y =370
+Color =Black
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore1]
+X =465
+Y =370
+Color =Black
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextGoldenNotes1]
+X =175
+Y =400
+Color =Black
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore1]
+X =465
+Y =400
+Color =Black
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextTotal1]
+X =205
+Y =460
+Color =Black
+Font =0
+Size =14
+Text=SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore1]
+X =465
+Y =460
+Color =Black
+Font =0
+Size =14
+Align =2
+Text =0
+
+#Lines
+[ScorePlayer1Static1]
+Tex =ScoreLine
+X =173
+Y =338
+W =295
+H =2
+Color =GrayLight
+Type =Font Black
+
+[ScorePlayer1Static2]
+Tex =ScoreLine
+X =173
+Y =368
+W =295
+H =2
+Color =GrayLight
+Type =Font Black
+
+[ScorePlayer1Static3]
+Tex =ScoreLine
+X =173
+Y =398
+W =295
+H =2
+Color =GrayLight
+Type =Font Black
+
+[ScorePlayer1Static4]
+Tex =ScoreLine
+X =173
+Y =428
+W =295
+H =2
+Color =GrayLight
+Type =Font Black
+
+[ScorePlayer1Static5]
+Tex =ScoreLine
+X =173
+Y =458
+W =295
+H =4
+Type =Font Black
+Color =GrayLight
+
+[ScoreStaticBoxDark1]
+Tex =PlayerNumberBox
+X =175
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Text1]
+X =179
+Y =472
+W =30
+H =30
+Z=1
+Color=Black
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel1]
+Tex =ScoreLevel
+X =475
+Y =160
+W =150
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =130
+W =150
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel1]
+Tex =ScoreLevel
+X =475
+Y =410
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =380
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer1Static6]
+Tex =ScoreEndCap
+X =494
+Y =460
+W =112
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Static7]
+Tex =ScoreLine
+X =493
+Y =460
+W =114
+H =2
+Color =GrayLight
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+
+# # # # # # # # # # # # # # # # # # Two Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName2]
+X =20
+Y =260
+Font =0
+Size =14
+Text =P1
+Color =Black
+Align=0
+
+[ScoreTextScore2]
+X =20
+Y =430
+Color =Black
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes2]
+X =20
+Y =340
+Color =Black
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore2]
+X =300
+Y =340
+Color =Black
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextLineBonus2]
+X =20
+Y =370
+Color =Black
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore2]
+X =300
+Y =370
+Color =Black
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextGoldenNotes2]
+X =20
+Y =400
+Color =Black
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore2]
+X =300
+Y =400
+Color =Black
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextTotal2]
+X =50
+Y =460
+Color =Black
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore2]
+X =300
+Y =460
+Color =Black
+Font =0
+Size =14
+Align =2
+Text =00000
+
+# Lines
+[ScorePlayer2Static1]
+Tex =ScoreLine
+X =20
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer2Static2]
+Tex =ScoreLine
+X =20
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer2Static3]
+Tex =ScoreLine
+X =20
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer2Static4]
+Tex =ScoreLine
+X =20
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer2Static5]
+Tex =ScoreLine
+X =20
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =GrayLight
+
+[ScoreStaticBoxDark2]
+Tex =PlayerNumberBox
+X =20
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Text1]
+X =24
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel2]
+Tex =ScoreLevel
+X =293
+Y =160
+W =120
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =130
+W =120
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScoreStaticLevel2]
+Tex =ScoreLevel
+X =293
+Y =410
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =380
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScorePlayer2Static6]
+Tex =ScoreEndCap
+X =308
+Y =460
+W =90
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Static7]
+Tex =ScoreLine
+X =307
+Y =460
+W =92
+H =2
+Color =GrayLight
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# P L A Y E R T W O
+[ScoreTextName3]
+X =780
+Y =260
+Font =0
+Size =14
+Text =P2
+Color =Black
+Align=2
+
+[ScoreTextScore3]
+X =780
+Y =430
+Color =Black
+Font =1
+Size =9
+Text =Tone Deaf
+Align=2
+
+[ScoreTextNotes3]
+X =780
+Y =340
+Color =Black
+Font =0
+Size =9
+Text =SING_NOTES
+Align=2
+
+[ScoreTextNotesScore3]
+X =500
+Y =340
+Color =Black
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextLineBonus3]
+X =780
+Y =370
+Color =Black
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=2
+
+[ScoreTextLineBonusScore3]
+X =500
+Y =370
+Color =Black
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextGoldenNotes3]
+X =780
+Y =400
+Color =Black
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=2
+
+[ScoreTextGoldenNotesScore3]
+X =500
+Y =400
+Color =Black
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextTotal3]
+X =750
+Y =460
+Color =Black
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=2
+Reflection=1
+ReflectionSpacing=4
+
+[ScoreTextTotalScore3]
+X =500
+Y =460
+Color =Black
+Font =0
+Size =14
+Align =0
+Text =00000
+Reflection=1
+ReflectionSpacing=4
+
+#Lines
+[ScorePlayer3Static1]
+Tex =ScoreLine
+X =500
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer3Static2]
+Tex =ScoreLine
+X =500
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer3Static3]
+Tex =ScoreLine
+X =500
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer3Static4]
+Tex =ScoreLine
+X =500
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer3Static5]
+Tex =ScoreLine
+X =500
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =GrayLight
+
+[ScoreStaticBoxDark3]
+Tex =PlayerNumberBox
+X =755
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Text1]
+X =759
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+#ScoreBar
+[ScoreStaticBackLevel3]
+Tex =ScoreLevel
+X =387
+Y =160
+W =120
+H =300
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =130
+W =120
+H =30
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel3]
+Tex =ScoreLevel
+X =387
+Y =410
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =380
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScorePlayer3Static6]
+Tex =ScoreEndCap
+X =402
+Y =460
+W =90
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Static7]
+Tex =ScoreLine
+X =401
+Y =460
+W =92
+H =2
+Color =GrayLight
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# # # # # # # # # # # # # # # # # # Three Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName4]
+X=20
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P1
+Color=P1Dark
+
+[ScoreTextNotes4]
+X=20
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=Black
+
+[ScoreTextNotesScore4]
+X=260
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Black
+
+[ScoreTextLineBonus4]
+X=20
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=Black
+
+[ScoreTextLineBonusScore4]
+X=260
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Black
+
+[ScoreTextGoldenNotes4]
+X=20
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=Black
+
+[ScoreTextGoldenNotesScore4]
+X=260
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Black
+
+[ScoreTextScore4]
+X=20
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=Black
+
+[ScoreTextTotal4]
+X=47
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=Black
+
+[ScoreTextTotalScore4]
+X=260
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=Black
+
+[ScoreStaticBoxDark4]
+Tex =PlayerNumberBox
+X =20
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer4Text1]
+X =24
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#lines
+[ScorePlayer4Static1]
+X=20
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer4Static2]
+X=20
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer4Static3]
+X=20
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer4Static4]
+X=20
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer4Static5]
+X=20
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+# P L A Y E R T W O
+[ScoreTextName5]
+X=280
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P2
+Color=P2Dark
+
+[ScoreTextNotes5]
+X=280
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=Black
+
+[ScoreTextNotesScore5]
+X=520
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Black
+
+[ScoreTextLineBonus5]
+X=280
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=Black
+
+[ScoreTextLineBonusScore5]
+X=520
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Black
+
+[ScoreTextGoldenNotes5]
+X=280
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=Black
+
+[ScoreTextGoldenNotesScore5]
+X=520
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Black
+
+[ScoreTextScore5]
+X=280
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=Black
+
+[ScoreTextTotal5]
+X=307
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=Black
+
+[ScoreTextTotalScore5]
+X=520
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=Black
+
+[ScoreStaticBoxDark5]
+Tex =PlayerNumberBox
+X =280
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer5Text1]
+X =284
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+[ScorePlayer5Static1]
+X=280
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer5Static2]
+X=280
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer5Static3]
+X=280
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer5Static4]
+X=280
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer5Static5]
+X=280
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+# P L A Y E R T H R E E
+[ScoreTextName6]
+X=540
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P3
+Color=P3Dark
+
+[ScoreTextNotes6]
+X=540
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=Black
+
+[ScoreTextNotesScore6]
+X=780
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Black
+
+[ScoreTextLineBonus6]
+X=540
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=Black
+
+[ScoreTextLineBonusScore6]
+X=780
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Black
+
+[ScoreTextGoldenNotes6]
+X=540
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=Black
+
+[ScoreTextGoldenNotesScore6]
+X=780
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Black
+
+[ScoreTextScore6]
+X=540
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=Black
+
+[ScoreTextTotal6]
+X=567
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=Black
+
+[ScoreTextTotalScore6]
+X=780
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=Black
+
+[ScoreStaticBoxDark6]
+Tex =PlayerNumberBox
+X =540
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P3Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer6Text1]
+X =544
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P3
+
+#lines
+[ScorePlayer6Static1]
+X=540
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer6Static2]
+X=540
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer6Static3]
+X=540
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer6Static4]
+X=540
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer6Static5]
+X=540
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+
+
+############### Options #######################
+
+
+[Options]
+Texts = 6
+Fade = 2
+
+[OptionsBackground]
+Tex=OptionsBG
+
+[OptionsStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =GrayLight
+Tex =IconOption
+Type=Font Black
+
+[OptionsStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[OptionsStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+Style=5
+
+[OptionsStatic6]
+X =512
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =Gray
+Type=Font Black
+
+[OptionsText1]
+X =70
+Y =30
+Color=GrayLight
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsText2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_WHEREAMI
+
+[OptionsText3]
+X =72
+Y =72
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_DESC
+
+[OptionsText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_SELECT
+
+[OptionsText6]
+X =538
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsButtonGame]
+X =100
+Y =215
+W =150
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonGameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_GAME
+Color=White
+
+[OptionsButtonGraphics]
+X =255
+Y =215
+W =150
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonGraphicsText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_GRAPHICS
+Color=White
+
+[OptionsButtonSound]
+X =410
+Y =215
+W =150
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonSoundText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_SOUND
+Color=White
+
+[OptionsButtonLyrics]
+X =565
+Y =215
+W =150
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonLyricsText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_LYRICS
+Color=White
+
+[OptionsButtonThemes]
+X =100
+Y =335
+W =150
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonThemesText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_THEMES
+Color=White
+
+[OptionsButtonRecord]
+X =255
+Y =335
+W =150
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonRecordText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_RECORD
+Color=White
+Texts=1
+
+[OptionsButtonAdvanced]
+X =410
+Y =335
+W =150
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonAdvancedText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_ADVANCED
+Color=White
+Texts=1
+
+[OptionsButtonExit]
+X =565
+Y =335
+W =150
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonExitText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[OptionsGame]
+Texts = 5
+
+[OptionsGameBackground]
+Tex=OptionsBG
+
+[OptionsGameStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGameStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGameStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGameStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[OptionsGameStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =Gray
+Type=Font Black
+
+[OptionsGameText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGameText2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GAME_WHEREAMI
+
+[OptionsGameText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GAME_DESC
+
+[OptionsGameText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGameText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGameSelectPlayers]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_PLAYERS
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDifficulty]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DIFFICULTY
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+
+[OptionsGameSelectSlideLanguage]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_LANGUAGE
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectTabs]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_TABS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectSlideSorting]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_SORTING
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDebug]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DEBUG
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsGraphics]
+Texts = 5
+
+[OptionsGraphicsBackground]
+Tex=OptionsBG
+
+[OptionsGraphicsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGraphicsStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=FontBlack
+Style=5
+
+[OptionsGraphicsStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =Gray
+Type=FontBlack
+
+[OptionsGraphicsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGraphicsText2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GRAPHICS_WHEREAMI
+
+[OptionsGraphicsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GRAPHICS_DESC
+
+[OptionsGraphicsText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGraphicsText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGraphicsSelectSlideResolution]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_GRAPHICS_RESOLUTION
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectFullscreen]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_FULLSCREEN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectDepth]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_DEPTH
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectOscilloscope]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_OSCILLOSCOPE
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectMovieSize]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_MOVIE_SIZE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsButtonExit]
+X = 40
+Y = 360
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsSound]
+Texts = 5
+
+[OptionsSoundBackground]
+Tex=OptionsBG
+
+[OptionsSoundStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsSoundStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=FontBlack
+Style=5
+
+[OptionsSoundStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =Gray
+Type=Font Black
+
+[OptionsSoundText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsSoundText2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_SOUND_WHEREAMI
+
+[OptionsSoundText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_SOUND_DESC
+
+[OptionsSoundText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsSoundText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsSoundSelectMicBoost]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_MIC_BOOST
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectClickAssist]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_CLICK_ASSIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectBeatClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_BEAT_CLICK
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectThreshold]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_THRESHOLD
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectTwoPlayerMode]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_TWO_PLAYERS_MODE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewVolume]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWVOLUME
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewFADING]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWFADING
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsLyrics]
+Texts = 1
+
+[OptionsLyricsBackground]
+Tex=OptionsBG
+
+[OptionsLyricsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsLyricsStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[OptionsLyricsStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =Gray
+Type=Font Black
+
+[OptionsLyricsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsLyricsText2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_LYRICS_WHEREAMI
+
+[OptionsLyricsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_LYRICS_DESC
+
+[OptionsLyricsText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsLyricsText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsLyricsSelectLyricsFont]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_FONT
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectLyricsEffect]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_EFFECT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectSolmization]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_SOLMIZATION
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsThemes]
+Texts = 5
+
+[OptionsThemesBackground]
+Tex=OptionsBG
+
+[OptionsThemesStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsThemesStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[OptionsThemesStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =Gray
+Type=Font Black
+
+[OptionsThemesText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsThemesText2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_THEMES_WHEREAMI
+
+[OptionsThemesText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_THEMES_DESC
+
+[OptionsThemesText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsThemesText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsThemesSelectTheme]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_THEME
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectSkin]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_SKIN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectColor]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_COLOR
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsRecord]
+Texts = 5
+
+[OptionsRecordBackground]
+Tex=OptionsBG
+
+[OptionsRecordStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsRecordStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[OptionsRecordStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =Gray
+Type=Font Black
+
+[OptionsRecordText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsRecordText2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_RECORD_WHEREAMI
+
+[OptionsRecordText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_RECORD_DESC
+
+[OptionsRecordText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsRecordText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsRecordSelectSlideCard]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CARD
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideInput]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_INPUT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelL]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELL
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelR]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELR
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordButtonExit]
+X = 40
+Y = 305
+W = 230
+H = 70
+Tex = MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsAdvanced]
+Texts = 5
+
+[OptionsAdvancedBackground]
+Tex=OptionsBG
+
+[OptionsAdvancedStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsAdvancedStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[OptionsAdvancedStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =Gray
+Type=Font Black
+
+[OptionsAdvancedText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsAdvancedText2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_ADVANCED_WHEREAMI
+
+[OptionsAdvancedText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_ADVANCED_DESC
+
+[OptionsAdvancedText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsAdvancedText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+
+#########unused at the moment#########
+#[OptionsAdvancedSelectLoadAnimation]
+#Tex =MainBar
+#TexSBG =SelectBG
+#Text=SING_OPTIONS_ADVANCED_LOADANIMATION
+#X = 40
+#Y = 85
+#W = 230
+#H = 70
+#SkipX = 50
+
+#Color = ColorDark
+#DColor = Gray
+#TColor = White
+#TDColor = White
+#SBGTex =MainBar
+#SBGColor = ColorDark
+#SBGDColor = Gray
+#STColor = White
+#STDColor = GrayDark
+
+[OptionsAdvancedSelectScreenFade]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_SCREENFADE
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectEffectSing]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_EFFECTSING
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectLineBonus]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_LINEBONUS
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectSlideOnSongClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_ADVANCED_ONSONGCLICK
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectAskbeforeDel]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_ASKBEFOREDEL
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectPartyPopup]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_PARTYPOPUP
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+
+##################### Top 5 ########################
+
+
+
+[Top5]
+Texts=1
+
+[Top5Background]
+Tex=Top5BG
+
+[Top5Text1]
+X =85
+Y =452
+Color=GrayLight
+Font =0
+Size =20
+Align=0
+Text =SING_TOP_5_CHARTS
+
+[Top5TextArtistTitle]
+X =87
+Y =499
+Color =Gray
+Font =0
+Size =10
+Align =0
+Text =artist - title
+
+[Top5Text4]
+X =87
+Y =520
+Color=GrayDark
+Font =0
+Size =10
+Align=0
+Text =SING_OPTIONS_GAME_DIFFICULTY
+
+[Top5TextLevel]
+X =1200
+Y =520
+Color =GrayDark
+Font =0
+Size =10
+Align =0
+Text =easy
+
+[Top5Static1]
+X =49
+Y =468
+W =27
+H =27
+Color =GrayLight
+Tex =ScoreIcon
+Type=Font Black
+
+[Top5Static2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[Top5Static3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[Top5Text2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_TOP_5_CHARTS_WHEREAMI
+
+[Top5Static4]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+
+[Top5Text3]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_TOP_5_CHARTS_CONTINUE
+
+[Top5TextName1]
+X =150
+Y =190
+Color =GrayDark
+Font =0
+Size =14
+Align =0
+Text =1. Player1
+
+[Top5TextName2]
+X =150
+Y =240
+Color =GrayDark
+Font =0
+Size =14
+Align =0
+Text =2. Player2
+
+[Top5TextName3]
+X =150
+Y =290
+Color =GrayDark
+Font =0
+Size =14
+Align =0
+Text =3. Player3
+
+[Top5TextName4]
+X =150
+Y =340
+Color =GrayDark
+Font =0
+Size =14
+Align =0
+Text =4. Player4
+
+[Top5TextName5]
+X =150
+Y =390
+Color =GrayDark
+Font =0
+Size =14
+Align =0
+Text =5. Player5
+
+[Top5TextScore1]
+X =680
+Y =190
+Color =GrayDark
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore2]
+X =680
+Y =240
+Color =GrayDark
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore3]
+X =680
+Y =290
+Color =GrayDark
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore4]
+X =680
+Y =340
+Color =GrayDark
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore5]
+X =680
+Y =390
+Color =GrayDark
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextNumber1]
+X =120
+Y =193
+Color =GrayDark
+Font =1
+Size =9
+Align =1
+Text =1
+
+[Top5TextNumber2]
+X =120
+Y =243
+Color =GrayDark
+Font =1
+Size =9
+Align =1
+Text =2
+
+[Top5TextNumber3]
+X =120
+Y =293
+Color =GrayDark
+Font =1
+Size =9
+Align =1
+Text =3
+
+[Top5TextNumber4]
+X =120
+Y =343
+Color =GrayDark
+Font =1
+Size =9
+Align =1
+Text =4
+
+[Top5TextNumber5]
+X =120
+Y =393
+Color =GrayDark
+Font =1
+Size =9
+Align =1
+Text =5
+
+[Top5StaticNumber1]
+Tex=PlayerNumberBox
+X=100
+Y=186
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber2]
+Tex=PlayerNumberBox
+X=100
+Y=236
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber3]
+Tex=PlayerNumberBox
+X=100
+Y=286
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber4]
+Tex=PlayerNumberBox
+X=100
+Y=336
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber5]
+Tex=PlayerNumberBox
+X=100
+Y=386
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+
+###################### Schwierigkeitsgrad ####################
+
+
+[Level]
+Texts=5
+
+[LevelBackground]
+Tex=MainBG
+
+[LevelStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[LevelStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[LevelStatic3]
+X =47
+Y =466
+W =27
+H =27
+Color =GrayLight
+Tex =MainIcon
+Type=Font Black
+
+[LevelStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[LevelStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+Style=5
+
+[LevelText1]
+X =83
+Y =450
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =GrayLight
+Text=SING_MODE
+
+[LevelText2]
+X =85
+Y =497
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=SING_DIFFICULTY_DESC
+
+[LevelText3]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_DIFFICULTY_WHEREAMI
+
+[LevelText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[LevelText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_DIFFICULTY_CONTINUE
+
+[LevelButtonEasy]
+X =0
+Y =80
+W = -150
+H = 30
+Tex = ButtonMirror
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[LevelButtonMedium]
+X =0
+Y =110
+W = -150
+H = 30
+Tex = ButtonMirror
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[LevelButtonHard]
+X =0
+Y =140
+W = -150
+H = 30
+Tex = ButtonMirror
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[LevelButtonEasyText1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_EASY
+Color=Black
+
+[LevelButtonMediumText1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_MEDIUM
+Color=Black
+
+[LevelButtonHardText1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Color=Black
+Text=SING_HARD
+
+
+########################## Name Screen ###############
+
+
+
+
+[Name]
+Texts=2
+
+[NameBackground]
+Tex=MainBG
+
+[NameStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[NameStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[NameStatic3]
+X =47
+Y =466
+W =27
+H =27
+Color =GrayLight
+Tex =MainIcon
+Type=Font Black
+
+[NameText1]
+X =83
+Y =450
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =GrayLight
+Text=SING_MODE
+
+[NameText2]
+X =85
+Y =497
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=SING_PLAYER_DESC
+
+[NameText3]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_PLAYER_WHEREAMI
+
+[NameStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[NameText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[NameStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonAZ
+Color =Gray
+Type=Font Black
+Style=5
+
+[NameText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_PLAYER_ENTER_NAME
+
+[NameStatic6]
+X =556
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+Style=5
+
+[NameText6]
+X =586
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[NameButtonPlayer1]
+X =0
+Y =80
+W = -150
+H = 30
+Tex = ButtonMirror
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[NameButtonPlayer1Text1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Color=Black
+Text=
+
+[NameButtonPlayer2]
+X =0
+Y =110
+W = -150
+H = 30
+Tex = ButtonMirror
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[NameButtonPlayer2Text1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Color=Black
+Text=
+
+[NameButtonPlayer3]
+X =0
+Y =140
+W = -150
+H = 30
+Tex = ButtonMirror
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[NameButtonPlayer3Text1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Color=Black
+Text=
+
+[NameButtonPlayer4]
+X =0
+Y =170
+W = -150
+H = 30
+Tex = ButtonMirror
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[NameButtonPlayer4Text1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Color=Black
+Text=
+
+[NameButtonPlayer5]
+X =0
+Y =200
+W = -150
+H = 30
+Tex = ButtonMirror
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[NameButtonPlayer5Text1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Color=Black
+Text=
+
+[NameButtonPlayer6]
+X =0
+Y =230
+W = -150
+H = 30
+Tex = ButtonMirror
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[NameButtonPlayer6Text1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Color=Black
+Text=
+
+
+
+###################### Party Modus ####################
+
+
+
+
+[PartyNewRound]
+Texts =7
+
+[PartyNewRoundBackground]
+Tex=SongBG
+
+[PartyNewRoundStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =GrayLight
+Tex =PartyIcon
+Type=Font Black
+
+[PartyNewRoundText1]
+X =70
+Y =27
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =GrayLight
+Text=PARTY_MODE
+
+[PartyNewRoundText2]
+X =70
+Y =72
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=PARTY_ROUND_DESC
+
+[PartyNewRoundText3]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_ROUND_WHEREAMI
+
+[PartyNewRoundText4]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_ROUND_LEGEND_CONTINUE
+
+[PartyNewRoundText5]
+X =460
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND
+Align=0
+
+[PartyNewRoundText6]
+X =600
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND_WINNER
+Align=0
+
+[PartyNewRoundText7]
+X =448
+Y =350
+Color =White
+Font =0
+Size =18
+Text =PARTY_ROUND
+Align=2
+
+[PartyNewRoundTextTeam1Players]
+X =30
+Y =137
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam2Players]
+X =30
+Y =218
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam3Players]
+X =30
+Y =299
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundStatic4]
+Tex =PartyRoundBG1
+X =450
+Y =103
+W = 330
+H = 24
+Int=1
+Color =DarkOrange
+Type=Font Black
+
+[PartyNewRoundStatic5]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+
+[PartyNewRoundStatic6]
+Tex =PartyRoundBG3
+X =250
+Y =350
+W = 300
+H = 50
+Int=1
+Color =DarkOrange
+Type=Font Black
+
+[PartyNewRoundStatic7]
+Tex =PartyRoundBG4
+X =50
+Y =495
+W = 700
+H = 30
+Int=1
+Color =LightOrange
+Type=Font Black
+
+[PartyNewRoundStaticTeam1]
+Tex =PartyTeamButton1
+X =20
+Y =110
+W =400
+H =50
+Int=1
+Color =P1Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam2]
+Tex =PartyTeamButton1
+X =20
+Y =191
+W =400
+H =50
+Int=1
+Color =P2Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam3]
+Tex =PartyTeamButton1
+X =20
+Y =272
+W =400
+H =50
+Int=1
+Color =P3Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticNextPlayer1]
+Tex=PartyPlayerButton
+X=155
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P1Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer2]
+Tex=PartyPlayerButton
+X=325
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P2Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer3]
+Tex=PartyPlayerButton
+X=495
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P3Light
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyNewRoundTextRound1]
+X =460
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Round 1
+Align=0
+
+[PartyNewRoundTextRound2]
+X =460
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Round 2
+Align=0
+
+[PartyNewRoundTextRound3]
+X =460
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Round 3
+Align=0
+
+[PartyNewRoundTextRound4]
+X =460
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Round 4
+Align=0
+
+[PartyNewRoundTextRound5]
+X =460
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Round 5
+Align=0
+
+[PartyNewRoundTextRound6]
+X =460
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Round 6
+Align=0
+
+[PartyNewRoundTextRound7]
+X =460
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Round 7
+Align=0
+
+[PartyNewRoundTextWinner1]
+X =600
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Winner 1
+Align=0
+
+[PartyNewRoundTextWinner2]
+X =600
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Winner 2
+Align=0
+
+[PartyNewRoundTextWinner3]
+X =600
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Winner 3
+Align=0
+
+[PartyNewRoundTextWinner4]
+X =600
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Winner 4
+Align=0
+
+[PartyNewRoundTextWinner5]
+X =600
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Winner 5
+Align=0
+
+[PartyNewRoundTextWinner6]
+X =600
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Winner 6
+Align=0
+
+[PartyNewRoundTextWinner7]
+X =600
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Winner 7
+Align=0
+
+[PartyNewRoundStaticRound1]
+Tex =PartyRoundBG2
+X =450
+Y =135
+W = 330
+H = 20
+Color =LightOrange
+Type =Font Black
+
+[PartyNewRoundStaticRound2]
+Tex =PartyRoundBG2
+X =450
+Y =164
+W = 330
+H = 20
+Color =LightOrange
+Type =Font Black
+
+[PartyNewRoundStaticRound3]
+Tex =PartyRoundBG2
+X =450
+Y =193
+W = 330
+H = 20
+Color =LightOrange
+Type =Font Black
+
+[PartyNewRoundStaticRound4]
+Tex =PartyRoundBG2
+X =450
+Y =222
+W = 330
+H = 20
+Color =LightOrange
+Type =Font Black
+
+[PartyNewRoundStaticRound5]
+Tex =PartyRoundBG2
+X =450
+Y =251
+W = 330
+H = 20
+Color =LightOrange
+Type =Font Black
+
+[PartyNewRoundStaticRound6]
+Tex =PartyRoundBG2
+X =450
+Y =280
+W = 330
+H = 20
+Color =LightOrange
+Type =Font Black
+
+[PartyNewRoundStaticRound7]
+Tex =PartyRoundBG2
+X =450
+Y =309
+W = 330
+H = 20
+Color =LightOrange
+Type =Font Black
+
+[PartyNewRoundTextNextRound]
+X =400
+Y =495
+Color =White
+Font =0
+Size =10
+Text =Next Round
+Align=1
+
+[PartyNewRoundTextNextRoundNo]
+X =457
+Y =350
+Color =White
+Font =0
+Size =18
+Text =99
+Align=0
+
+[PartyNewRoundTextScoreTeam1]
+X =390
+Y =110
+Color =White
+Font =0
+Size =17
+Text =3000
+Align=1
+
+[PartyNewRoundTextScoreTeam2]
+X =390
+Y =191
+Color =White
+Font =0
+Size =17
+Text =2000
+Align=1
+
+[PartyNewRoundTextScoreTeam3]
+X =390
+Y =272
+Color =White
+Font =0
+Size =17
+Text =1000
+Align=1
+
+[PartyNewRoundTextNameTeam1]
+X =30
+Y =108
+Color =White
+Font =0
+Size =12
+Text =Team 1
+Align=0
+
+[PartyNewRoundTextNameTeam2]
+X =30
+Y =189
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyNewRoundTextNameTeam3]
+X =30
+Y =270
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyNewRoundTextNextPlayer1]
+X =230
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 1
+Align=1
+
+[PartyNewRoundTextNextPlayer2]
+X =400
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 2
+Align=1
+
+[PartyNewRoundTextNextPlayer3]
+X =570
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 3
+Align=1
+
+
+[PartyScore]
+Texts=5
+
+[PartyScoreBackground]
+Tex=PartyBG
+
+[PartyScoreDecoTextures]
+ChangeTextures =1
+
+FirstTexture =PartyScoreDeco
+FirstTyp =Font Black
+FirstColor =Gold
+
+SecondTexture =PartyScoreDeco
+SecondTyp =Font Black
+SecondColor =Silver
+
+ThirdTexture =PartyScoreDeco
+ThirdTyp =Font Black
+ThirdColor =Bronze
+
+[PartyScoreStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =GrayLight
+Tex =PartyIcon
+Type=Font Black
+
+[PartyScoreStatic4]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+
+[PartyScoreText1]
+X =70
+Y =27
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =GrayLight
+Text=PARTY_MODE
+
+[PartyScoreText2]
+X =72
+Y =72
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=PARTY_SCORE_DESC
+
+[PartyScoreText3]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_SCORE_WHEREAMI
+
+[PartyScoreText4]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_LEGEND_CONTINUE
+
+[PartyScoreStatic5]
+Tex =PartyScoreBG1
+X =50
+Y =100
+W = 700
+H = 80
+Int=1
+Color =DarkOrange
+Type=Font Black
+
+[PartyScoreStatic6]
+Tex =PartyScoreBG2
+X =50
+Y =495
+W = 700
+H = 20
+Int=1
+Color =LightOrange
+Type=Font Black
+
+[PartyScoreText5]
+X =400
+Y =136
+Color =White
+Font =0
+Size =15
+Text =PARTY_SCORE_WINS2
+Align=1
+
+[PartyScoreTextWinner]
+X =400
+Y =98
+Color =White
+Font =0
+Size =18
+Text =The Winner is...
+Align=1
+
+[PartyScoreTextScoreTeam1]
+X =568
+Y =198
+Color =White
+Font =0
+Size =12
+Text =3000
+Align=2
+
+[PartyScoreTextScoreTeam2]
+X =568
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyScoreTextScoreTeam3]
+X =568
+Y =398
+Color =White
+Font =0
+Size =12
+Text =1000
+Align=2
+
+[PartyScoreTextNameTeam1]
+X =188
+Y =198
+Font=0
+Size=12
+Align=0
+Text=Team 1
+Color=White
+
+[PartyScoreTextNameTeam2]
+X =188
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyScoreTextNameTeam3]
+X =188
+Y =398
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyScoreStaticTeam1]
+X =188
+Y =230
+W =380
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam1BG]
+Tex=PartyTeamButton2
+X=178
+Y=200
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam1Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 191
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam2]
+X =188
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam2BG]
+Tex=PartyTeamButton2
+X=178
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam2Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam3]
+X =188
+Y =430
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam3BG]
+Tex=PartyTeamButton2
+X=178
+Y=400
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam3Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 391
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyWin]
+Texts=4
+
+[PartyWinBackground]
+Tex=PartyBG
+
+[PartyWinStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =GrayLight
+Tex =PartyIcon
+Type=Font Black
+
+[PartyWinStatic4]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+
+[PartyWinText1]
+X =70
+Y =27
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =GrayLight
+Text=PARTY_MODE
+
+[PartyWinText2]
+X =72
+Y =72
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=PARTY_WIN_DESC
+
+[PartyWinText3]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_WIN_WHEREAMI
+
+[PartyWinText4]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_WIN_LEGEND_CONTINUE
+
+#[PartyWinTextWinner]
+#X =150
+#Y =120
+#Color =White
+#Font =1
+#Size =14
+#Text =The Winner is...
+#Align=0
+
+[PartyWinTextScoreTeam1]
+X =699
+Y =183
+Color =White
+Font =0
+Size =19
+Text =3000
+Align=2
+
+[PartyWinTextScoreTeam2]
+X =669
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyWinTextScoreTeam3]
+X =649
+Y =398
+Color =White
+Font =0
+Size =9
+Text =1000
+Align=2
+
+[PartyWinTextNameTeam1]
+X =169
+Y =183
+Font=0
+Size=19
+Align=0
+Text=Team 1
+Color=White
+
+[PartyWinTextNameTeam2]
+X =289
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyWinTextNameTeam3]
+X =369
+Y =398
+Color =White
+Font =0
+Size =9
+Text =Team 3
+Align=0
+
+[PartyWinStaticTeam1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BG]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank2]
+Tex=PartyTeamButton3
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank3]
+Tex=PartyTeamButton3
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyWinStaticTeam1Deco]
+Tex =PartyWinDeco1
+X = 91
+Y = 176
+W = 79
+H = 79
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BG]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamButton3
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank1]
+Tex=PartyTeamButton4
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank2]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank3]
+Tex=PartyTeamButton4
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Deco]
+Tex =PartyWinDeco2
+X = 226
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Silver
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BG]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank2]
+Tex=PartyTeamButton5
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank3]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Deco]
+Tex =PartyWinDeco3
+X = 316
+Y = 391
+W = 54
+H = 54
+Type =Font Black
+Color =Bronze
+Reflection=1
+ReflectionSpacing=3
+
+[PartyOptions]
+Texts = 5
+
+[PartyOptionsBackground]
+Tex=PartyBG
+
+[PartyOptionsStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =GrayLight
+Tex =PartyIcon
+Type=Font Black
+
+[PartyOptionsStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[PartyOptionsStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+Style=5
+
+[PartyOptionsText1]
+X =70
+Y =27
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =GrayLight
+Text=PARTY_MODE
+
+[PartyOptionsText2]
+X =72
+Y =72
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=PARTY_OPTIONS_DESC
+
+[PartyOptionsText3]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_OPTIONS_WHEREAMI
+
+[PartyOptionsText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyOptionsText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[PartyOptionsSelectLevel]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_DIFFICULTY
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectRounds]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_ROUNDS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectTeams]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers1]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER1
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER2
+X = 40
+Y = 415
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers3]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER3
+X = 40
+Y = 470
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+
+
+[PartyPlayer]
+Texts=6
+
+[PartyPlayerBackground]
+Tex=PartyBG
+
+[PartyPlayerStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =GrayLight
+Tex =PartyIcon
+Type=Font Black
+
+[PartyPlayerStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[PartyPlayerStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonAZ
+Color =Gray
+Type=Font Black
+Style=5
+
+[PartyPlayerStatic6]
+X =556
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+Style=5
+
+[PartyPlayerText1]
+X =70
+Y =27
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =GrayLight
+Text=PARTY_MODE
+
+[PartyPlayerText2]
+X =72
+Y =72
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=PARTY_PLAYER_DESC
+
+[PartyPlayerText3]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_PLAYER_WHEREAMI
+
+[PartyPlayerText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyPlayerText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_ENTER_NAME
+
+[PartyPlayerText6]
+X =586
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_LEGEND_CONTINUE
+
+[PartyPlayerTeam1Name]
+Tex=PartyTeamButton2
+X=85
+Y=100
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Dark
+
+[PartyPlayerTeam1NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 1
+Color=White
+
+[PartyPlayerPlayer1Name]
+Tex=Button
+X=85
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer1NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 1
+Color=White
+
+[PartyPlayerPlayer2Name]
+Tex=Button
+X=245
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer2NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 2
+Color=White
+
+[PartyPlayerPlayer3Name]
+Tex=Button
+X=405
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer3NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 3
+Color=White
+
+[PartyPlayerPlayer4Name]
+Tex=Button
+X=565
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer4NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 4
+Color=White
+
+[PartyPlayerTeam2Name]
+Tex=PartyTeamButton2
+X=85
+Y=240
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Dark
+
+[PartyPlayerTeam2NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 2
+Color=White
+
+[PartyPlayerPlayer5Name]
+Tex=Button
+X=85
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer5NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 5
+Color=White
+
+[PartyPlayerPlayer6Name]
+Tex=Button
+X=245
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer6NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 6
+Color=White
+
+[PartyPlayerPlayer7Name]
+Tex=Button
+X=405
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer7NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 7
+Color=White
+
+[PartyPlayerPlayer8Name]
+Tex=Button
+X=565
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer8NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 8
+Color=White
+
+[PartyPlayerTeam3Name]
+Tex=Button
+Tex=PartyTeamButton2
+X=85
+Y=380
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Dark
+
+[PartyPlayerTeam3NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 3
+Color=White
+
+[PartyPlayerPlayer9Name]
+Tex=Button
+X=85
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer9NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 9
+Color=White
+
+[PartyPlayerPlayer10Name]
+Tex=Button
+X=245
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer10NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 10
+Color=White
+
+[PartyPlayerPlayer11Name]
+Tex=Button
+X=405
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer11NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 11
+Color=White
+
+[PartyPlayerPlayer12Name]
+Tex=Button
+X=565
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer12NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 12
+Color=White
+
+
+#################### Song Menu ######################
+
+
+
+[SongMenu]
+Texts=0
+Statics=1
+
+[SongMenuButton1]
+X = 510
+Y = 165
+W = 270
+H = 25
+Tex =Rectangle
+Color =LightOrange
+DColor = DarkOrange
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton1Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_PLAY
+Align=0
+Z=0.99
+
+[SongMenuButton2]
+X = 510
+Y = 195
+W = 270
+H = 25
+Tex =Rectangle
+Color =LightOrange
+DColor = DarkOrange
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton2Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_EDIT
+Align=0
+Z=0.99
+
+[SongMenuButton3]
+X = 510
+Y = 225
+W = 270
+H = 25
+Tex =Rectangle
+Color =LightOrange
+DColor = DarkOrange
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton3Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_MODI
+Align=0
+Z=0.99
+
+[SongMenuButton4]
+X = 510
+Y = 255
+W = 270
+H = 25
+Tex = Rectangle
+Color =LightOrange
+DColor = DarkOrange
+Type=Font Black
+Texts=1
+Z = 0.98
+
+[SongMenuButton4Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_CANCEL
+Align=0
+Z=0.99
+
+[SongMenuSelectSlide3]
+Tex = Rectangle
+TexSBG = SongMenuSelectBG
+Text =
+X = 510
+Y = 225
+W = 0
+H = 25
+Z = 0.98
+SkipX = 0
+SBGW=270
+
+TextSize=8
+
+Color = LightOrange
+DColor = DarkOrange
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = LightOrange
+SBGDColor = DarkOrange
+STColor = White
+STDColor = GrayDark
+
+[SongMenuTextMenu]
+X =539
+Y =125
+Color=White
+Font =0
+Size =14
+Text=MENU
+Align=0
+Z=0.99
+
+[SongMenuStatic2]
+X =513
+Y =135
+W =21
+H =21
+Color =White
+Tex =IconSongMenu
+Type=Font Black
+Z=0.98
+
+[SongMenuStatic1]
+Tex =SongMenuBG
+X =498
+Y =120
+W =300
+H =200
+Z =0.94
+Int=1
+Color =DarkOrange
+Type=Font Black
+
+[SongJumpto]
+Texts=0
+Statics=1
+
+[SongJumptoStatic1]
+Tex =JumpToBG
+X =221
+Y =175
+W =355
+H =175
+Z =0.98
+Int=1
+Color =DarkOrange
+Type=Font Black
+
+[SongJumptoStatic2]
+X =234
+Y =185
+W =21
+H =21
+Color =White
+Tex =MainSearch
+Type=Font Black
+Z=0.99
+
+[SongJumptoText1]
+X =310
+Y =175
+Color=White
+Font =0
+Size =14
+Text=SONG_JUMPTO_TYPE_DESC
+Align=0
+Z=0.99
+
+[SongJumptoSelectSlideType]
+Tex = button
+TexSBG = mainicon
+#Text = SONG_JUMPTO_TYPE_DESC
+Font=1
+X = 242
+Y = 205
+Z = 0.99
+W = 0
+H = 30
+SkipX = 4
+SBGW= 300
+Fields=2
+DColor = LightOrange
+TColor = White
+TDColor = White
+SBGTex = button
+SBGDColor = LightOrange
+STColor = White
+STDColor = LightOrange
+
+[SongJumptoButtonSearchText]
+X = 250
+Y = 215
+Z = 0.99
+W = 160
+H = 50
+Size=14
+Font=1
+Align=0
+
+[SongJumptoTextFound]
+X =234
+Y =295
+Color=White
+Font =0
+Size =8
+Text=SONG_JUMPTO_HELP
+Align=0
+Z=0.99
+
+
+######################## Main Statistik ##############
+
+
+
+[StatMain]
+Texts=0
+Statics=0
+
+[StatMainBackground]
+Tex=OptionsBG
+
+[StatMainButtonScores]
+X =589
+Y =100
+W =190
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonScoresText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SCORES
+Color=Black
+
+[StatMainButtonSingers]
+X =589
+Y =160
+W =190
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSingersText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SINGERS
+Color=Black
+
+[StatMainButtonSongs]
+X =589
+Y =220
+W =190
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSongsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_SONGS
+Color=Black
+
+[StatMainButtonBands]
+X =589
+Y =280
+W =190
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonBandsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_BANDS
+Color=Black
+
+[StatMainButtonExit]
+X =589
+Y =340
+W =190
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=Black
+
+[StatMainTextOverview]
+X =45
+Y =125
+W =510
+Color=Black
+Font =0
+Size =9
+Align=0
+Text=
+
+[StatMainStatic1]
+X =47
+Y =466
+W =27
+H =27
+Color=GrayLight
+Tex =StatIcon
+Type=Font Black
+
+[StatMainStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color=White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatMainStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color=White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatMainStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[StatMainStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =Gray
+Type=Font Black
+
+[StatMainStatic6]
+X =40
+Y =100
+W =520
+H =20
+Tex=StatMainBG1
+Color =ColorLight
+Type=Font Black
+
+[StatMainStatic7]
+X =40
+Y =120
+W =520
+H =300
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatMainStatic8]
+X =40
+Y =420
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+[StatMainText1]
+X =83
+Y =450
+Color=Black
+Font =0
+Size =20
+Text=STAT_MAIN
+Align=0
+
+[StatMainText2]
+X =85
+Y =497
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=STAT_MAIN_WHEREAMI
+
+[StatMainText3]
+X =170
+Y =502
+Color=Black
+Font =0
+Size =10
+Align =0
+Text=STAT_MAIN_DESC
+
+[StatMainText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatMainText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+
+#######################Detail Statistiken##############
+
+
+
+[StatDetail]
+Texts=0
+Statics=0
+
+[StatDetailBackground]
+Tex=OptionsBG
+
+[StatDetailButtonNext]
+X =589
+Y =100
+W =190
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonNextText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_NEXT
+Color=White
+
+[StatDetailButtonPrev]
+X =589
+Y =160
+W =190
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonPrevText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_PREV
+Color=White
+
+[StatDetailButtonReverse]
+X =589
+Y =220
+W =190
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonReverseText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_REVERSE
+Color=White
+
+[StatDetailButtonExit]
+X =589
+Y =280
+W =190
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatDetailTextDescription]
+X =70
+Y =70
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=
+
+[StatDetailTextPage]
+X = 546
+Y = 98
+Color= Black
+Font = 0
+Size = 5
+Align=2
+Text=
+
+[StatDetailTextList1]
+X = 45
+Y = 122
+Color=Black
+Font = 0
+Size = 7
+Text=Stat1
+
+[StatDetailTextList2]
+X = 45
+Y = 160
+Color=Black
+Font = 0
+Size = 7
+Text=Stat2
+
+[StatDetailTextList3]
+X = 45
+Y = 198
+Color=Black
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList4]
+X = 45
+Y = 236
+Color=Black
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList5]
+X = 45
+Y = 274
+Color=Black
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList6]
+X = 45
+Y = 312
+Color=Black
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList7]
+X = 45
+Y = 350
+Color=Black
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList8]
+X = 45
+Y = 388
+Color=Black
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList9]
+X = 45
+Y = 426
+Color=Black
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList10]
+X = 45
+Y = 464
+Color=Black
+Font = 0
+Size = 7
+Text=
+
+[StatDetailStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color=GrayLight
+Tex =StatIcon
+Type=Font Black
+
+[StatDetailStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatDetailStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatDetailStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[StatDetailStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =Gray
+Type=Font Black
+
+[StatDetailStatic6]
+X =40
+Y =100
+W =520
+H =24
+Tex=StatDetailBG1
+Color =ColorLight
+Type=Font Black
+
+[StatDetailStatic7]
+X =40
+Y =124
+W =520
+H =376
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatDetailStatic8]
+X =40
+Y =500
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+
+[StatDetailText1]
+X =70
+Y =30
+Color=GrayLight
+Font =0
+Size =20
+Text=STAT_DETAIL
+Align=0
+
+[StatDetailText2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=STAT_DETAIL_WHEREAMI
+
+[StatDetailText3]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatDetailText4]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+
+#######################################################
+
+
+[CheckPopup]
+Texts=1
+Statics=1
+
+[CheckPopupButton1]
+X = 285
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=JA
+Align=1
+Z=1
+
+[CheckPopupButton2]
+X = 415
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton2Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=NEIN
+Align=1
+Z=1
+
+[CheckPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[CheckPopupText1]
+X =282
+Y =147
+Color=White
+Font =0
+Size =10
+Text=MSG_QUESTION_TITLE
+Align=0
+Z=1
+
+[CheckPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =GrayPopup
+Type=Font Black
+
+[CheckPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[CheckPopupStatic3]
+Tex =IconQuestion
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopup]
+Texts=1
+Statics=1
+
+[ErrorPopupButton1]
+X = 350
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[ErrorPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=OK
+Align=1
+Z=1
+
+[ErrorPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[ErrorPopupText1]
+X =282
+Y =148
+Color=White
+Font =0
+Size =10
+Text=MSG_ERROR_TITLE
+Align=0
+Z=1
+
+[ErrorPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =GrayPopup
+Type=Font Black
+
+[ErrorPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopupStatic3]
+Tex =IconError
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black \ No newline at end of file
diff --git a/Game/Output/Themes/TODOs/Streetlight.ini b/Game/Output/Themes/TODOs/Streetlight.ini
new file mode 100644
index 00000000..1172623b
--- /dev/null
+++ b/Game/Output/Themes/TODOs/Streetlight.ini
@@ -0,0 +1,8009 @@
+;0.5.1 Mod
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Theme]
+Name=Streetlight
+Creator=!Skar!™
+
+[Colors]
+White = 255 255 255
+LightBlue = 119 187 210
+DarkBlue = 28 126 171
+LightRed = 170 146 146
+DarkRed = 155 113 113
+LightGreen = 136 168 136
+DarkGreen = 106 152 104
+LightPurple = 155 136 168
+DarkPurple = 145 104 152
+LightOrange = 168 155 136
+DarkOrange = 151 131 76
+LightYellow = 168 168 136
+DarkYellow = 150 151 76
+Turkis = 13 186 167
+GrayLightest = 235 235 235
+GrayLight = 191 191 191
+Gray = 127 127 127
+GrayDark = 63 63 63
+Black = 0 0 0
+GrayPopup = 51 51 51
+Gold = 255 223 31
+Silver = 223 223 223
+Bronze = 205 127 50
+
+[Loading]
+Fade = 1
+
+[LoadingBackground]
+Tex=LoadingBG
+
+[Main]
+Texts =8
+Statics=4
+
+[MainBackground]
+Tex=MainBG
+
+[MainStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic2]
+X =254
+Y =0
+W =546
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic3]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[MainText1]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_MENU
+
+[MainText2]
+X =295
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[MainStatic4]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[MainTextDescriptionLong]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=
+
+[MainButtonSolo]
+X =54
+Y =28
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[MainButtonSoloText1]
+X =100
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_SING
+Color=White
+
+[MainButtonMulti]
+X =54
+Y =58
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[MainButtonMultiText1]
+X =100
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_MULTI
+Color=White
+
+[MainButtonCollection1]
+X =54
+Y =88
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 3
+FirstChild=3
+
+
+[MainButtonCollection1Text1]
+X =100
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_TOOLS
+Color=White
+
+[MainButtonStats]
+X = 254
+Y = 88
+W = 125
+H = 20
+Tex = Button2
+Color = GrayDark
+DColor = Black
+Type = Font Black
+Texts = 1
+Parent = 1
+
+[MainButtonStatsText1]
+X = 10
+Y = -3
+Font = 0
+Size = 8
+Align = 0
+Text = SING_STATS
+Color = White
+
+[MainButtonEditor]
+X =254
+Y =108
+W =125
+H =20
+Tex =Button2
+Color = GrayDark
+DColor = Black
+Type=Font Black
+Texts=1
+Parent=1
+
+[MainButtonEditorText1]
+X =10
+Y =-3
+Font=0
+Size=8
+Align=0
+Text=SING_EDITOR
+Color=White
+
+[MainButtonOptions]
+X =254
+Y =128
+W =125
+H =20
+Tex =Button2
+Color = GrayDark
+DColor = Black
+Type=Font Black
+Texts=1
+Parent=1
+
+[MainButtonOptionsText1]
+X =10
+Y =-3
+Font=0
+Size=8
+Align=0
+Text=SING_OPTIONS
+Color=White
+
+[MainButtonExit]
+X =54
+Y =118
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[MainButtonExitText1]
+X =100
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_EXIT
+Color=White
+
+
+
+
+########################## Name Screen ###############
+
+
+
+
+[Name]
+Texts=2
+
+[NameBackground]
+Tex=MainBG
+
+[NameStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[NameStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[NameStatic3]
+X =47
+Y =466
+W =27
+H =27
+Color =White
+Tex =MainIcon
+Type=Font Black
+
+[NameText1]
+X =83
+Y =450
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=SING_MODE
+
+[NameText2]
+X =85
+Y =497
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_PLAYER_DESC
+
+[NameText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_PLAYER_WHEREAMI
+
+[NameStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[NameText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[NameStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonAZ
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[NameText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_PLAYER_ENTER_NAME
+
+[NameStatic6]
+X =556
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[NameText6]
+X =586
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[NameButtonPlayer1]
+X =54
+Y =28
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[NameButtonPlayer1Text1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=
+
+[NameButtonPlayer2]
+X =54
+Y =58
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[NameButtonPlayer2Text1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=
+
+[NameButtonPlayer3]
+X =54
+Y =88
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[NameButtonPlayer3Text1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=
+
+[NameButtonPlayer4]
+X =54
+Y =118
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[NameButtonPlayer4Text1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=
+
+[NameButtonPlayer5]
+X =54
+Y =148
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[NameButtonPlayer5Text1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=
+
+[NameButtonPlayer6]
+X =54
+Y =178
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[NameButtonPlayer6Text1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=
+
+
+
+###################### Schwierigkeitsgrad ####################
+
+
+[Level]
+Texts=5
+
+[LevelBackground]
+Tex=MainBG
+
+[LevelStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[LevelStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[LevelStatic3]
+X =47
+Y =466
+W =27
+H =27
+Color =White
+Tex =MainIcon
+Type=Font Black
+
+[LevelStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[LevelStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[LevelText1]
+X =83
+Y =450
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=SING_MODE
+
+[LevelText2]
+X =85
+Y =497
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_DIFFICULTY_DESC
+
+[LevelText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_DIFFICULTY_WHEREAMI
+
+[LevelText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[LevelText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_DIFFICULTY_CONTINUE
+
+[LevelButtonEasy]
+X =54
+Y =28
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[LevelButtonMedium]
+X =54
+Y =58
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[LevelButtonHard]
+X =54
+Y =88
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[LevelButtonEasyText1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=SING_EASY
+
+[LevelButtonMediumText1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=SING_MEDIUM
+
+[LevelButtonHardText1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=SING_HARD
+
+
+##############Songscreen##################
+
+
+[Song]
+Texts =4
+
+[SongBackground]
+Tex=SongBG
+
+[SongCover]
+X=303
+Y=125
+W=320
+H=190
+Style=5
+Reflections=1
+
+[SongEqualizer]
+Visible=1
+Direction=1
+Color=GrayLightest
+Alpha=1
+X=2
+Y=584
+Z=0
+PieceW=8
+PieceH=8
+Space=6
+Bands=57
+Length=15
+
+[SongVideoIcon]
+X =299
+Y =487
+W =32
+H =32
+Z=1
+Color=GrayDark
+Tex =VideoIcon
+Type=Font Black
+
+[SongStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[SongStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[SongStatic3]
+X =250
+Y =120
+W =300
+H =200
+Z =0.5
+Color =GrayDark
+Tex =SongSelection1
+Type=Font Black
+
+[SongStatic4]
+X =298
+Y =320
+W =200
+H =200
+Z=0.98
+Color =Black
+Tex =SongSelection2
+Type=Font Black
+
+[SongTextCat]
+X =85
+Y =520
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_SONG_SELECTION_DESC
+
+[SongTextArtist]
+X =400
+Y =330
+W = 190
+Color=White
+Font =1
+Size =9
+Align =1
+Text=
+
+[SongTextTitle]
+X =400
+Y =390
+W = 190
+Color=White
+Font =0
+Size =9
+Align =1
+Text=
+
+[SongTextNumber]
+X =490
+Y =495
+Color=GrayDark
+Font =0
+Size =8
+Align =2
+Text=
+
+#Variable statics and texts for song-screen in sing- and partymode
+# There can be an unlimited Number of Statics and Texts, As long
+# as the numbers are in order.
+# Statics that are shown in PartyMode Only are Named_
+# SongStaticParty[No]
+# Texts that are shown in PartyMode Only are Named_
+# SongTextParty[No]
+# Statics that are shown in Normal Mode Only are Named_
+# SongStaticNonParty[No]
+# Texts that are shown in Normal Mode Only are Named_
+# SongTextNonParty[No]
+#Here are the ones for singmode
+
+[SongStaticNonParty1]
+X =47
+Y =466
+W =27
+H =27
+Color =White
+Tex =SongCD
+Type=Font Black
+
+[SongStaticNonParty2]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonAlt
+Color =GrayLight
+Type=Font Black
+
+[SongStaticNonParty3]
+X =300
+Y =5
+W =26
+H =22
+Tex=ButtonAZ
+Color =GrayLight
+Type=Font Black
+
+[SongStaticNonParty4]
+X =425
+Y =5
+W =22
+H =22
+Tex=ButtonM
+Color =GrayLight
+Type=Font Black
+
+[SongStaticNonParty5]
+X =515
+Y =5
+W =22
+H =22
+Tex=ButtonJ
+Color =GrayLight
+Type=Font Black
+
+[SongStaticNonParty6]
+X =679
+Y =5
+W =22
+H =22
+Tex=ButtonP
+Color =GrayLight
+Type=Font Black
+
+#Texts Non Party
+[SongTextNonParty1]
+X =83
+Y =450
+Color=White
+Font =0
+Size =20
+Text=song
+Align=0
+
+[SongTextNonParty2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_SONG_SELECTION_WHEREAMI
+
+[SongTextNonParty3]
+X =288
+Y =8
+Color=Black
+Font =1
+Size =5
+Align=0
+Text=+
+
+[SongTextNonParty4]
+X =330
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_GOTO
+
+[SongTextNonParty5]
+X =450
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_MENU
+
+[SongTextNonParty6]
+X =540
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SONG_JUMPTO_DESC
+
+[SongTextNonParty7]
+X =705
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_PLAYLIST
+
+[SongTextNonParty8]
+X =83
+Y =478
+Color=White
+Font =0
+Size =20
+Text=selection
+Align=0
+
+
+#and theese are the ones for partymode
+
+[SongStaticParty1]
+X =47
+Y =466
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[SongStaticParty2]
+X =260
+Y =5
+W =26
+H =22
+Tex=Button13
+Color =GrayLight
+Type=Font Black
+
+[SongStaticParty3]
+X =400
+Y =5
+W =22
+H =22
+Tex=ButtonM
+Color =GrayLight
+Type=Font Black
+
+[SongStaticParty4]
+X =540
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+
+#Texts for Party Mode
+
+[SongTextParty1]
+X =83
+Y =446
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=party
+
+[SongTextParty2]
+X =83
+Y =478
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=mode
+
+[SongTextParty3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_SONG_WHEREAMI
+
+[SongTextParty4]
+X =288
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SONG_MENU_NAME_PARTY_JOKER
+
+[SongTextParty5]
+X =426
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_MENU
+
+[SongTextParty6]
+X =570
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_LEGEND_CONTINUE
+
+
+
+#variable statics end
+
+
+# Jokers, 5 for each team, only shown in party Mode
+[SongStaticTeam1Joker1]
+Tex =Joker
+X =530
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker2]
+Tex =Joker
+X =580
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker3]
+Tex =Joker
+X =630
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker4]
+Tex =Joker
+X =680
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker5]
+Tex =Joker
+X =730
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker1]
+Tex =Joker
+X =530
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker2]
+Tex =Joker
+X =580
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker3]
+Tex =Joker
+X =630
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker4]
+Tex =Joker
+X =680
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker5]
+Tex =Joker
+X =730
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker1]
+Tex =Joker
+X =530
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker2]
+Tex =Joker
+X =580
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker3]
+Tex =Joker
+X =630
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker4]
+Tex =Joker
+X =680
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker5]
+Tex =Joker
+X =730
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+
+##################### Sing Screen ###################
+
+
+[Sing]
+Texts =1
+
+
+[SingText1]
+Text =SING_TIME
+X =21
+Y =574
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingStatic1]
+;TextBG
+Tex =LyricBar
+X =10
+Y =490
+W =780
+H =85
+Color =White
+Type=Font Black
+
+[SingStatic2]
+;TimeBar
+Tex =TimeBar1
+X =10
+Y =575
+W =780
+H =16
+Color=Black
+Type=Font Black
+
+[SingTimeProgress]
+X =70
+Y =580
+W =652
+H =7
+Color=White
+
+[SingStatic3]
+;the thing behind the time progress
+Tex =TimeBar2
+X =70
+Y =580
+W =652
+H =7
+Color=GrayDark
+Type=Font Black
+
+[SingTimeText]
+Text =SING_TIME
+X =754
+Y =574
+Font =1
+Size =6
+Color =White
+Align=1
+
+# O N E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#PlayerOne
+[SingP1Static]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1Text]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1Static2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1SingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T W O P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1TwoPStatic]
+Tex =P
+X =20
+Y =117
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPText]
+Text =P1
+X =26
+Y =122
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1TwoPStatic2]
+Tex =ScoreBG
+X =680
+Y =102
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPTextScore]
+Text =00000
+X =690
+Y =104
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1TwoPSingBar]
+X =680
+Y =136
+W =100
+H =8
+
+#Player Two
+[SingP2RStatic]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P2Dark
+Type=Transparent
+
+[SingP2RText]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP2RStatic2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2RTextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2RSingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T H R E E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1ThreePStatic]
+Tex =P
+X =16
+Y =59
+W =50
+H =54
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePText]
+Text =P1
+X =27
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP1ThreePStatic2]
+Tex =ScoreBG
+X =75
+Y =61
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePTextScore]
+Text =00000
+X =85
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1ThreePSingBar]
+X =75
+Y =95
+W =100
+H =8
+
+#Player Two
+[SingP2MStatic]
+Tex =P
+X =311
+Y =59
+W =50
+H =54
+Color =P2Dark
+Type=Transparent
+
+[SingP2MText]
+Text =P2
+X =321
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP2MStatic2]
+Tex =ScoreBG
+X =370
+Y =61
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2MTextScore]
+Text =00000
+X =380
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2MSingBar]
+X =370
+Y =95
+W =100
+H =8
+
+#Player Three
+[SingP3RStatic]
+Tex =P
+X =611
+Y =59
+W =50
+H =54
+Color =P3Dark
+Type=Transparent
+
+[SingP3RText]
+Text =P3
+X =621
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP3RStatic2]
+Tex =ScoreBG
+X =670
+Y =61
+W =100
+H =34
+Color =P3Dark
+Type=Transparent
+
+[SingP3RTextScore]
+Text =00000
+X =680
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP3SingBar]
+X =670
+Y =95
+W =100
+H =8
+
+
+
+############### Score #####################
+
+
+
+[Score]
+Texts =1
+
+[ScoreBackground]
+Tex=ScoreScreenBG
+
+[ScoreText1]
+X =68
+Y =30
+Color=White
+Font =0
+Size =20
+Text=SONG_SCORE
+Align=0
+
+[ScoreTextArtistTitle]
+X =70
+Y =77
+Color=White
+Font =0
+Size =10
+Align =0
+Text=ArtistTitle
+
+[ScoreStatic1]
+X =32
+Y =46
+W =27
+H =27
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[ScoreStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SONG_SCORE_WHEREAMI
+
+[ScoreStatic4]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+
+[ScoreText3]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+#end of main stuff
+
+# # # # # # # # # # # # # # # # # # One Player Score # # # # # # # # # # # #
+[ScoreTextName1]
+X =175
+Y =260
+Font =0
+Size =14
+Text =P1
+Color=White
+Align=0
+
+[ScoreTextScore1]
+X =175
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes1]
+X =175
+Y =340
+Color=White
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore1]
+X =465
+Y =340
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextLineBonus1]
+X =175
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore1]
+X =465
+Y =370
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextGoldenNotes1]
+X =175
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore1]
+X =465
+Y =400
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextTotal1]
+X =205
+Y =460
+Color=White
+Font =0
+Size =14
+Text=SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore1]
+X =465
+Y =460
+Color=White
+Font =0
+Size =14
+Align =2
+Text =0
+
+#Lines
+[ScorePlayer1Static1]
+Tex =ScoreLine
+X =173
+Y =338
+W =295
+H =2
+Color =GrayLight
+Type =Font Black
+
+[ScorePlayer1Static2]
+Tex =ScoreLine
+X =173
+Y =368
+W =295
+H =2
+Color =GrayLight
+Type =Font Black
+
+[ScorePlayer1Static3]
+Tex =ScoreLine
+X =173
+Y =398
+W =295
+H =2
+Color =GrayLight
+Type =Font Black
+
+[ScorePlayer1Static4]
+Tex =ScoreLine
+X =173
+Y =428
+W =295
+H =2
+Color =GrayLight
+Type =Font Black
+
+[ScorePlayer1Static5]
+Tex =ScoreLine
+X =173
+Y =458
+W =295
+H =4
+Type =Font Black
+Color =GrayLight
+
+[ScoreStaticBoxDark1]
+Tex =PlayerNumberBox
+X =175
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Text1]
+X =179
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel1]
+Tex =ScoreLevel
+X =475
+Y =160
+W =150
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =130
+W =150
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel1]
+Tex =ScoreLevel
+X =475
+Y =410
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =380
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer1Static6]
+Tex =ScoreEndCap
+X =494
+Y =460
+W =112
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Static7]
+Tex =ScoreLine
+X =493
+Y =460
+W =114
+H =2
+Color =GrayLight
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+
+# # # # # # # # # # # # # # # # # # Two Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName2]
+X =20
+Y =260
+Font =0
+Size =14
+Text =P1
+Color=White
+Align=0
+
+[ScoreTextScore2]
+X =20
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes2]
+X =20
+Y =340
+Color=White
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore2]
+X =300
+Y =340
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextLineBonus2]
+X =20
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore2]
+X =300
+Y =370
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextGoldenNotes2]
+X =20
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore2]
+X =300
+Y =400
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextTotal2]
+X =50
+Y =460
+Color=White
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore2]
+X =300
+Y =460
+Color=White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+# Lines
+[ScorePlayer2Static1]
+Tex =ScoreLine
+X =20
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer2Static2]
+Tex =ScoreLine
+X =20
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer2Static3]
+Tex =ScoreLine
+X =20
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer2Static4]
+Tex =ScoreLine
+X =20
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer2Static5]
+Tex =ScoreLine
+X =20
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =GrayLight
+
+[ScoreStaticBoxDark2]
+Tex =PlayerNumberBox
+X =20
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Text1]
+X =24
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel2]
+Tex =ScoreLevel
+X =293
+Y =160
+W =120
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =130
+W =120
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScoreStaticLevel2]
+Tex =ScoreLevel
+X =293
+Y =410
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =380
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScorePlayer2Static6]
+Tex =ScoreEndCap
+X =308
+Y =460
+W =90
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Static7]
+Tex =ScoreLine
+X =307
+Y =460
+W =92
+H =2
+Color =WhiteLight
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# P L A Y E R T W O
+[ScoreTextName3]
+X =780
+Y =260
+Font =0
+Size =14
+Text =P2
+Color=White
+Align=2
+
+[ScoreTextScore3]
+X =780
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=2
+
+[ScoreTextNotes3]
+X =780
+Y =340
+Color=White
+Font =0
+Size =9
+Text =SING_NOTES
+Align=2
+
+[ScoreTextNotesScore3]
+X =500
+Y =340
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextLineBonus3]
+X =780
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=2
+
+[ScoreTextLineBonusScore3]
+X =500
+Y =370
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextGoldenNotes3]
+X =780
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=2
+
+[ScoreTextGoldenNotesScore3]
+X =500
+Y =400
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextTotal3]
+X =750
+Y =460
+Color=White
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=2
+Reflection=1
+ReflectionSpacing=4
+
+[ScoreTextTotalScore3]
+X =500
+Y =460
+Color=White
+Font =0
+Size =14
+Align =0
+Text =00000
+Reflection=1
+ReflectionSpacing=4
+
+#Lines
+[ScorePlayer3Static1]
+Tex =ScoreLine
+X =500
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer3Static2]
+Tex =ScoreLine
+X =500
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer3Static3]
+Tex =ScoreLine
+X =500
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer3Static4]
+Tex =ScoreLine
+X =500
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer3Static5]
+Tex =ScoreLine
+X =500
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =GrayLight
+
+[ScoreStaticBoxDark3]
+Tex =PlayerNumberBox
+X =755
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Text1]
+X =759
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+#ScoreBar
+[ScoreStaticBackLevel3]
+Tex =ScoreLevel
+X =387
+Y =160
+W =120
+H =300
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =130
+W =120
+H =30
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel3]
+Tex =ScoreLevel
+X =387
+Y =410
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =380
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScorePlayer3Static6]
+Tex =ScoreEndCap
+X =402
+Y =460
+W =90
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Static7]
+Tex =ScoreLine
+X =401
+Y =460
+W =92
+H =2
+Color =WhiteLight
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# # # # # # # # # # # # # # # # # # Three Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName4]
+X=20
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P1
+Color=P1Dark
+
+[ScoreTextNotes4]
+X=20
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore4]
+X=260
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus4]
+X=20
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore4]
+X=260
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes4]
+X=20
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore4]
+X=260
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore4]
+X=20
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal4]
+X=47
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore4]
+X=260
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark4]
+Tex =PlayerNumberBox
+X =20
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer4Text1]
+X =24
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#lines
+[ScorePlayer4Static1]
+X=20
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer4Static2]
+X=20
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer4Static3]
+X=20
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer4Static4]
+X=20
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer4Static5]
+X=20
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+# P L A Y E R T W O
+[ScoreTextName5]
+X=280
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P2
+Color=P2Dark
+
+[ScoreTextNotes5]
+X=280
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore5]
+X=520
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus5]
+X=280
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore5]
+X=520
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes5]
+X=280
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore5]
+X=520
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore5]
+X=280
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal5]
+X=307
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore5]
+X=520
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark5]
+Tex =PlayerNumberBox
+X =280
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer5Text1]
+X =284
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+[ScorePlayer5Static1]
+X=280
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer5Static2]
+X=280
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer5Static3]
+X=280
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer5Static4]
+X=280
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer5Static5]
+X=280
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+# P L A Y E R T H R E E
+[ScoreTextName6]
+X=540
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P3
+Color=P3Dark
+
+[ScoreTextNotes6]
+X=540
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore6]
+X=780
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus6]
+X=540
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore6]
+X=780
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes6]
+X=540
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore6]
+X=780
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore6]
+X=540
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal6]
+X=567
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore6]
+X=780
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark6]
+Tex =PlayerNumberBox
+X =540
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P3Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer6Text1]
+X =544
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P3
+
+#lines
+[ScorePlayer6Static1]
+X=540
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer6Static2]
+X=540
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer6Static3]
+X=540
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer6Static4]
+X=540
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer6Static5]
+X=540
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+
+
+############### Options #######################
+
+
+[Options]
+Texts = 6
+Fade = 2
+
+[OptionsBackground]
+Tex=OptionsBG
+
+[OptionsStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color=White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color=White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsStatic6]
+X =512
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsText1]
+X =70
+Y =30
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_WHEREAMI
+
+
+[OptionsText3]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsText4]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_SELECT
+
+[OptionsText5]
+X =538
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsButtonGame]
+X =100
+Y =215
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonGameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_GAME
+Color=Black
+
+[OptionsButtonGraphics]
+X =255
+Y =215
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonGraphicsText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_GRAPHICS
+Color=Black
+
+[OptionsButtonSound]
+X =410
+Y =215
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonSoundText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_SOUND
+Color=Black
+
+[OptionsButtonLyrics]
+X =565
+Y =215
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonLyricsText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_LYRICS
+Color=Black
+
+[OptionsButtonThemes]
+X =100
+Y =335
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonThemesText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_THEMES
+Color=Black
+
+[OptionsButtonRecord]
+X =255
+Y =335
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonRecordText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_RECORD
+Color=Black
+Texts=1
+
+[OptionsButtonAdvanced]
+X =410
+Y =335
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonAdvancedText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_ADVANCED
+Color=Black
+Texts=1
+
+[OptionsButtonExit]
+X =565
+Y =335
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonExitText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=Black
+
+[OptionsGame]
+Texts = 5
+
+[OptionsGameBackground]
+Tex=OptionsBG
+
+[OptionsGameStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGameStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGameStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGameStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsGameStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsGameText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGameText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GAME_WHEREAMI
+
+[OptionsGameText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GAME_DESC
+
+[OptionsGameText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGameText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGameSelectPlayers]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_PLAYERS
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGameSelectDifficulty]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DIFFICULTY
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+
+[OptionsGameSelectSlideLanguage]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_LANGUAGE
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGameSelectTabs]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_TABS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGameSelectSlideSorting]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_SORTING
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGameSelectDebug]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DEBUG
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGameButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color =GrayLightest
+DColor = GrayLight
+Type = Font Black
+TColor = Black
+
+[OptionsGraphics]
+Texts = 5
+
+[OptionsGraphicsBackground]
+Tex=OptionsBG
+
+[OptionsGraphicsStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGraphicsStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsGraphicsStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsGraphicsText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGraphicsText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GRAPHICS_WHEREAMI
+
+[OptionsGraphicsText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GRAPHICS_DESC
+
+[OptionsGraphicsText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGraphicsText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGraphicsSelectSlideResolution]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_GRAPHICS_RESOLUTION
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGraphicsSelectFullscreen]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_FULLSCREEN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGraphicsSelectDepth]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_DEPTH
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGraphicsSelectOscilloscope]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_OSCILLOSCOPE
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGraphicsSelectMovieSize]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_MOVIE_SIZE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGraphicsButtonExit]
+X = 40
+Y = 360
+W = 230
+H = 70
+Tex =MainBar
+Color = GrayLightest
+DColor = GrayLight
+Type = Font Black
+
+[OptionsSound]
+Texts = 5
+
+[OptionsSoundBackground]
+Tex=OptionsBG
+
+[OptionsSoundStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsSoundStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex = ButtonNavi
+Color = GrayLight
+Type = Font Black
+
+[OptionsSoundStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsSoundText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsSoundText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_SOUND_WHEREAMI
+
+[OptionsSoundText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_SOUND_DESC
+
+[OptionsSoundText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsSoundText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsSoundSelectMicBoost]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_MIC_BOOST
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundSelectClickAssist]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_CLICK_ASSIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundSelectBeatClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_BEAT_CLICK
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundSelectThreshold]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_THRESHOLD
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundSelectTwoPlayerMode]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_TWO_PLAYERS_MODE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundSelectSlidePreviewVolume]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWVOLUME
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundSelectSlidePreviewFADING]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWFADING
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = GrayLightest
+DColor = GrayLight
+Type = Font Black
+
+[OptionsLyrics]
+Texts = 1
+
+[OptionsLyricsBackground]
+Tex=OptionsBG
+
+[OptionsLyricsStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsLyricsStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsLyricsStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsLyricsText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsLyricsText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_LYRICS_WHEREAMI
+
+[OptionsLyricsText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_LYRICS_DESC
+
+[OptionsLyricsText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsLyricsText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsLyricsSelectLyricsFont]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_FONT
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsLyricsSelectLyricsEffect]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_EFFECT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsLyricsSelectSolmization]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_SOLMIZATION
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsLyricsButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color =GrayLightest
+DColor = GrayLight
+Type = Font Black
+
+[OptionsThemes]
+Texts = 5
+
+[OptionsThemesBackground]
+Tex=OptionsBG
+
+[OptionsThemesStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsThemesStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsThemesStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsThemesText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsThemesText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_THEMES_WHEREAMI
+
+[OptionsThemesText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_THEMES_DESC
+
+[OptionsThemesText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsThemesText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsThemesSelectTheme]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_THEME
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsThemesSelectSkin]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_SKIN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsThemesSelectColor]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_COLOR
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsThemesButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = GrayLightest
+DColor = Light
+Type = Font Black
+
+
+
+[OptionsRecord]
+Texts = 5
+
+[OptionsRecordBackground]
+Tex=OptionsBG
+
+[OptionsRecordStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsRecordStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsRecordStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsRecordText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsRecordText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_RECORD_WHEREAMI
+
+[OptionsRecordText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_RECORD_DESC
+
+[OptionsRecordText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsRecordText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsRecordSelectSlideCard]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CARD
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsRecordSelectSlideInput]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_INPUT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsRecordSelectSlideChannelL]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELL
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsRecordSelectSlideChannelR]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELR
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsRecordButtonExit]
+X = 40
+Y = 305
+W = 230
+H = 70
+Tex = MainBar
+Color =GrayLightest
+DColor = GrayLight
+Type = Font Black
+
+[OptionsAdvanced]
+Texts = 5
+
+[OptionsAdvancedBackground]
+Tex=OptionsBG
+
+[OptionsAdvancedStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsAdvancedStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color=White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsAdvancedStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsAdvancedText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsAdvancedText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_ADVANCED_WHEREAMI
+
+[OptionsAdvancedText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_ADVANCED_DESC
+
+[OptionsAdvancedText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsAdvancedText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsAdvancedSelectScreenFade]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_SCREENFADE
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsAdvancedSelectEffectSing]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_EFFECTSING
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsAdvancedSelectLineBonus]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_LINEBONUS
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsAdvancedSelectSlideOnSongClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_ADVANCED_ONSONGCLICK
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsAdvancedSelectAskbeforeDel]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_ASKBEFOREDEL
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsAdvancedSelectPartyPopup]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_PARTYPOPUP
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsAdvancedButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color =GrayLightest
+DColor = GrayLight
+Type = Font Black
+
+
+
+##################### Top 5 ########################
+
+
+
+[Top5]
+Texts=1
+
+[Top5Background]
+Tex=Top5BG
+
+[Top5Text1]
+X =85
+Y =452
+Color=White
+Font =0
+Size =20
+Align=0
+Text =SING_TOP_5_CHARTS
+
+[Top5TextArtistTitle]
+X =87
+Y =499
+Color =White
+Font =0
+Size =10
+Align =0
+Text =artist - title
+
+[Top5Text4]
+X =87
+Y =520
+Color=White
+Font =0
+Size =10
+Align=0
+Text =SING_OPTIONS_GAME_DIFFICULTY
+
+[Top5TextLevel]
+X =1200
+Y =520
+Color =White
+Font =0
+Size =10
+Align =0
+Text =easy
+
+[Top5Static1]
+X =49
+Y =468
+W =27
+H =27
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[Top5Static2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[Top5Static3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[Top5Text2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_TOP_5_CHARTS_WHEREAMI
+
+[Top5Static4]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+
+[Top5Text3]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_TOP_5_CHARTS_CONTINUE
+
+[Top5TextName1]
+X =150
+Y =190
+Color =White
+Font =0
+Size =14
+Align =0
+Text =1. Player1
+
+[Top5TextName2]
+X =150
+Y =240
+Color =White
+Font =0
+Size =14
+Align =0
+Text =2. Player2
+
+[Top5TextName3]
+X =150
+Y =290
+Color =White
+Font =0
+Size =14
+Align =0
+Text =3. Player3
+
+[Top5TextName4]
+X =150
+Y =340
+Color =White
+Font =0
+Size =14
+Align =0
+Text =4. Player4
+
+[Top5TextName5]
+X =150
+Y =390
+Color =White
+Font =0
+Size =14
+Align =0
+Text =5. Player5
+
+[Top5TextScore1]
+X =680
+Y =190
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore2]
+X =680
+Y =240
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore3]
+X =680
+Y =290
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore4]
+X =680
+Y =340
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore5]
+X =680
+Y =390
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextNumber1]
+X =120
+Y =193
+Color =White
+Font =1
+Size =9
+Align =1
+Text =1
+
+[Top5TextNumber2]
+X =120
+Y =243
+Color =White
+Font =1
+Size =9
+Align =1
+Text =2
+
+[Top5TextNumber3]
+X =120
+Y =293
+Color =White
+Font =1
+Size =9
+Align =1
+Text =3
+
+[Top5TextNumber4]
+X =120
+Y =343
+Color =White
+Font =1
+Size =9
+Align =1
+Text =4
+
+[Top5TextNumber5]
+X =120
+Y =393
+Color =White
+Font =1
+Size =9
+Align =1
+Text =5
+
+[Top5StaticNumber1]
+Tex=PlayerNumberBox
+X=100
+Y=186
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber2]
+Tex=PlayerNumberBox
+X=100
+Y=236
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber3]
+Tex=PlayerNumberBox
+X=100
+Y=286
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber4]
+Tex=PlayerNumberBox
+X=100
+Y=336
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber5]
+Tex=PlayerNumberBox
+X=100
+Y=386
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+
+
+
+
+###################### Party Modus ####################
+
+
+
+
+[PartyNewRound]
+Texts =7
+
+[PartyNewRoundBackground]
+Tex=SongBG
+
+[PartyNewRoundStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyNewRoundText1]
+X =70
+Y =27
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyNewRoundText2]
+X =70
+Y =72
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_ROUND_DESC
+
+[PartyNewRoundText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_ROUND_WHEREAMI
+
+[PartyNewRoundText4]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_ROUND_LEGEND_CONTINUE
+
+[PartyNewRoundText5]
+X =460
+Y =100
+Color =Black
+Font =0
+Size =10
+Text =PARTY_ROUND
+Align=0
+
+[PartyNewRoundText6]
+X =600
+Y =100
+Color =Black
+Font =0
+Size =10
+Text =PARTY_ROUND_WINNER
+Align=0
+
+[PartyNewRoundText7]
+X =448
+Y =350
+Color =Black
+Font =0
+Size =18
+Text =PARTY_ROUND
+Align=2
+
+[PartyNewRoundTextTeam1Players]
+X =30
+Y =137
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam2Players]
+X =30
+Y =218
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam3Players]
+X =30
+Y =299
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundStatic4]
+Tex =PartyRoundBG1
+X =450
+Y =103
+W = 330
+H = 24
+Int=1
+Color =GrayLight
+Type=Font Black
+
+[PartyNewRoundStatic5]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[PartyNewRoundStatic6]
+Tex =PartyRoundBG3
+X =250
+Y =350
+W = 300
+H = 50
+Int=1
+Color =GrayLight
+Type=Font Black
+
+[PartyNewRoundStatic7]
+Tex =PartyRoundBG4
+X =50
+Y =495
+W = 700
+H = 30
+Int=1
+Color = GrayLight
+Type=Font Black
+
+[PartyNewRoundStaticTeam1]
+Tex =PartyTeamButton1
+X =20
+Y =110
+W =400
+H =50
+Int=1
+Color =P1Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam2]
+Tex =PartyTeamButton1
+X =20
+Y =191
+W =400
+H =50
+Int=1
+Color =P2Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam3]
+Tex =PartyTeamButton1
+X =20
+Y =272
+W =400
+H =50
+Int=1
+Color =P3Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticNextPlayer1]
+Tex=PartyPlayerButton
+X=155
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P1Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer2]
+Tex=PartyPlayerButton
+X=325
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P2Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer3]
+Tex=PartyPlayerButton
+X=495
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P3Light
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyNewRoundTextRound1]
+X =460
+Y =133
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 1
+Align=0
+
+[PartyNewRoundTextRound2]
+X =460
+Y =162
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 2
+Align=0
+
+[PartyNewRoundTextRound3]
+X =460
+Y =191
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 3
+Align=0
+
+[PartyNewRoundTextRound4]
+X =460
+Y =220
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 4
+Align=0
+
+[PartyNewRoundTextRound5]
+X =460
+Y =249
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 5
+Align=0
+
+[PartyNewRoundTextRound6]
+X =460
+Y =278
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 6
+Align=0
+
+[PartyNewRoundTextRound7]
+X =460
+Y =307
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 7
+Align=0
+
+[PartyNewRoundTextWinner1]
+X =600
+Y =133
+Color =Black
+Font =0
+Size =8
+Text =Winner 1
+Align=0
+
+[PartyNewRoundTextWinner2]
+X =600
+Y =162
+Color =Black
+Font =0
+Size =8
+Text =Winner 2
+Align=0
+
+[PartyNewRoundTextWinner3]
+X =600
+Y =191
+Color =Black
+Font =0
+Size =8
+Text =Winner 3
+Align=0
+
+[PartyNewRoundTextWinner4]
+X =600
+Y =220
+Color =Black
+Font =0
+Size =8
+Text =Winner 4
+Align=0
+
+[PartyNewRoundTextWinner5]
+X =600
+Y =249
+Color =Black
+Font =0
+Size =8
+Text =Winner 5
+Align=0
+
+[PartyNewRoundTextWinner6]
+X =600
+Y =278
+Color =Black
+Font =0
+Size =8
+Text =Winner 6
+Align=0
+
+[PartyNewRoundTextWinner7]
+X =600
+Y =307
+Color =Black
+Font =0
+Size =8
+Text =Winner 7
+Align=0
+
+[PartyNewRoundStaticRound1]
+Tex =PartyRoundBG2
+X =450
+Y =135
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundStaticRound2]
+Tex =PartyRoundBG2
+X =450
+Y =164
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundStaticRound3]
+Tex =PartyRoundBG2
+X =450
+Y =193
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundStaticRound4]
+Tex =PartyRoundBG2
+X =450
+Y =222
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundStaticRound5]
+Tex =PartyRoundBG2
+X =450
+Y =251
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundStaticRound6]
+Tex =PartyRoundBG2
+X =450
+Y =280
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundStaticRound7]
+Tex =PartyRoundBG2
+X =450
+Y =309
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundTextNextRound]
+X =400
+Y =495
+Color =Black
+Font =0
+Size =10
+Text =Next Round
+Align=1
+
+[PartyNewRoundTextNextRoundNo]
+X =457
+Y =350
+Color =Black
+Font =0
+Size =18
+Text =99
+Align=0
+
+[PartyNewRoundTextScoreTeam1]
+X =390
+Y =110
+Color =White
+Font =0
+Size =17
+Text =3000
+Align=1
+
+[PartyNewRoundTextScoreTeam2]
+X =390
+Y =191
+Color =White
+Font =0
+Size =17
+Text =2000
+Align=1
+
+[PartyNewRoundTextScoreTeam3]
+X =390
+Y =272
+Color =White
+Font =0
+Size =17
+Text =1000
+Align=1
+
+[PartyNewRoundTextNameTeam1]
+X =30
+Y =108
+Color =White
+Font =0
+Size =12
+Text =Team 1
+Align=0
+
+[PartyNewRoundTextNameTeam2]
+X =30
+Y =189
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyNewRoundTextNameTeam3]
+X =30
+Y =270
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyNewRoundTextNextPlayer1]
+X =230
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 1
+Align=1
+
+[PartyNewRoundTextNextPlayer2]
+X =400
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 2
+Align=1
+
+[PartyNewRoundTextNextPlayer3]
+X =570
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 3
+Align=1
+
+
+[PartyScore]
+Texts=5
+
+[PartyScoreBackground]
+Tex=PartyBG
+
+[PartyScoreDecoTextures]
+ChangeTextures =1
+
+FirstTexture =PartyScoreDeco
+FirstTyp =Font Black
+FirstColor =Gold
+
+SecondTexture =PartyScoreDeco
+SecondTyp =Font Black
+SecondColor =Silver
+
+ThirdTexture =PartyScoreDeco
+ThirdTyp =Font Black
+ThirdColor =Bronze
+
+[PartyScoreStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyScoreStatic4]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+
+[PartyScoreText1]
+X =70
+Y =29
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyScoreText2]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_SCORE_DESC
+
+[PartyScoreText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_SCORE_WHEREAMI
+
+[PartyScoreText4]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_LEGEND_CONTINUE
+
+[PartyScoreStatic5]
+Tex =PartyScoreBG1
+X =50
+Y =100
+W = 700
+H = 80
+Int=1
+Color =GrayLight
+Type=Font Black
+
+[PartyScoreStatic6]
+Tex =PartyScoreBG2
+X =50
+Y =495
+W = 700
+H = 20
+Int=1
+Color =GrayLightest
+Type=Font Black
+
+[PartyScoreText5]
+X =400
+Y =136
+Color =Black
+Font =0
+Size =15
+Text =PARTY_SCORE_WINS2
+Align=1
+
+[PartyScoreTextWinner]
+X =400
+Y =98
+Color =Black
+Font =0
+Size =18
+Text =The Winner is...
+Align=1
+
+[PartyScoreTextScoreTeam1]
+X =568
+Y =198
+Color =White
+Font =0
+Size =12
+Text =3000
+Align=2
+
+[PartyScoreTextScoreTeam2]
+X =568
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyScoreTextScoreTeam3]
+X =568
+Y =398
+Color =White
+Font =0
+Size =12
+Text =1000
+Align=2
+
+[PartyScoreTextNameTeam1]
+X =188
+Y =198
+Font=0
+Size=12
+Align=0
+Text=Team 1
+Color=White
+
+[PartyScoreTextNameTeam2]
+X =188
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyScoreTextNameTeam3]
+X =188
+Y =398
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyScoreStaticTeam1]
+X =188
+Y =230
+W =380
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam1BG]
+Tex=PartyTeamButton2
+X=178
+Y=200
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam1Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 191
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam2]
+X =188
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam2BG]
+Tex=PartyTeamButton2
+X=178
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam2Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam3]
+X =188
+Y =430
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam3BG]
+Tex=PartyTeamButton2
+X=178
+Y=400
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam3Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 391
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyWin]
+Texts=4
+
+[PartyWinBackground]
+Tex=PartyBG
+
+[PartyWinStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyWinStatic4]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+
+[PartyWinText1]
+X =70
+Y =29
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyWinText2]
+X =72
+Y =72
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_WIN_DESC
+
+[PartyWinText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_WIN_WHEREAMI
+
+[PartyWinText4]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_WIN_LEGEND_CONTINUE
+
+[PartyWinTextScoreTeam1]
+X =699
+Y =183
+Color =White
+Font =0
+Size =19
+Text =3000
+Align=2
+
+[PartyWinTextScoreTeam2]
+X =669
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyWinTextScoreTeam3]
+X =649
+Y =398
+Color =White
+Font =0
+Size =9
+Text =1000
+Align=2
+
+[PartyWinTextNameTeam1]
+X =169
+Y =183
+Font=0
+Size=19
+Align=0
+Text=Team 1
+Color=White
+
+[PartyWinTextNameTeam2]
+X =289
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyWinTextNameTeam3]
+X =369
+Y =398
+Color =White
+Font =0
+Size =9
+Text =Team 3
+Align=0
+
+[PartyWinStaticTeam1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BG]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank2]
+Tex=PartyTeamButton3
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank3]
+Tex=PartyTeamButton3
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyWinStaticTeam1Deco]
+Tex =PartyWinDeco1
+X = 91
+Y = 176
+W = 79
+H = 79
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BG]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamButton3
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank1]
+Tex=PartyTeamButton4
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank2]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank3]
+Tex=PartyTeamButton4
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Deco]
+Tex =PartyWinDeco2
+X = 226
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Silver
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BG]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank2]
+Tex=PartyTeamButton5
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank3]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Deco]
+Tex =PartyWinDeco3
+X = 316
+Y = 391
+W = 54
+H = 54
+Type =Font Black
+Color =Bronze
+Reflection=1
+ReflectionSpacing=3
+
+
+
+
+[PartyOptions]
+Texts = 5
+
+[PartyOptionsBackground]
+Tex=PartyBG
+
+[PartyOptionsStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyOptionsStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[PartyOptionsStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[PartyOptionsText1]
+X =70
+Y =29
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyOptionsText2]
+X =72
+Y =72
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_OPTIONS_DESC
+
+[PartyOptionsText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_OPTIONS_WHEREAMI
+
+[PartyOptionsText4]
+X =294
+Y =3
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyOptionsText5]
+X =418
+Y =3
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[PartyOptionsSelectLevel]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_DIFFICULTY
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectPlayList]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectPlayList2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectRounds]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_ROUNDS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectTeams]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectPlayers1]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER1
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectPlayers2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER2
+X = 40
+Y = 415
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectPlayers3]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER3
+X = 40
+Y = 470
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+
+
+[PartyPlayer]
+Texts=6
+
+[PartyPlayerBackground]
+Tex=PartyBG
+
+[PartyPlayerStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =WhiteLight
+Tex =PartyIcon
+Type=Font Black
+
+[PartyPlayerStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerStatic6]
+X =556
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerText1]
+X =70
+Y =27
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyPlayerText2]
+X =72
+Y =72
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_PLAYER_DESC
+
+[PartyPlayerText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_PLAYER_WHEREAMI
+
+[PartyPlayerText4]
+X =294
+Y =3
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyPlayerText5]
+X =418
+Y =3
+Color=White
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_ENTER_NAME
+
+[PartyPlayerText6]
+X =586
+Y =3
+Color=White
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_LEGEND_CONTINUE
+
+[PartyPlayerTeam1Name]
+Tex=PartyTeamButton2
+X=85
+Y=100
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Dark
+
+[PartyPlayerTeam1NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 1
+Color=White
+
+[PartyPlayerPlayer1Name]
+Tex=Button
+X=85
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer1NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 1
+Color=White
+
+[PartyPlayerPlayer2Name]
+Tex=Button
+X=245
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer2NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 2
+Color=White
+
+[PartyPlayerPlayer3Name]
+Tex=Button
+X=405
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer3NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 3
+Color=White
+
+[PartyPlayerPlayer4Name]
+Tex=Button
+X=565
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer4NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 4
+Color=White
+
+[PartyPlayerTeam2Name]
+Tex=PartyTeamButton2
+X=85
+Y=240
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Dark
+
+[PartyPlayerTeam2NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 2
+Color=White
+
+[PartyPlayerPlayer5Name]
+Tex=Button
+X=85
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer5NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 5
+Color=White
+
+[PartyPlayerPlayer6Name]
+Tex=Button
+X=245
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer6NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 6
+Color=White
+
+[PartyPlayerPlayer7Name]
+Tex=Button
+X=405
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer7NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 7
+Color=White
+
+[PartyPlayerPlayer8Name]
+Tex=Button
+X=565
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer8NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 8
+Color=White
+
+[PartyPlayerTeam3Name]
+Tex=Button
+Tex=PartyTeamButton2
+X=85
+Y=380
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Dark
+
+[PartyPlayerTeam3NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 3
+Color=White
+
+[PartyPlayerPlayer9Name]
+Tex=Button
+X=85
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer9NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 9
+Color=White
+
+[PartyPlayerPlayer10Name]
+Tex=Button
+X=245
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer10NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 10
+Color=White
+
+[PartyPlayerPlayer11Name]
+Tex=Button
+X=405
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer11NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 11
+Color=White
+
+[PartyPlayerPlayer12Name]
+Tex=Button
+X=565
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer12NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 12
+Color=White
+
+
+#################### Song Menu ######################
+
+
+
+[SongMenu]
+Texts=0
+Statics=1
+
+[SongMenuButton1]
+X = 510
+Y = 165
+W = 270
+H = 25
+Tex =Rectangle
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton1Text1]
+X =30
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=SONG_MENU_PLAY
+Align=0
+Z=0.99
+
+[SongMenuButton2]
+X = 510
+Y = 195
+W = 270
+H = 25
+Tex =Rectangle
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton2Text1]
+X =30
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=SONG_MENU_EDIT
+Align=0
+Z=0.99
+
+[SongMenuButton3]
+X = 510
+Y = 225
+W = 270
+H = 25
+Tex =Rectangle
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton3Text1]
+X =30
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=SONG_MENU_MODI
+Align=0
+Z=0.99
+
+[SongMenuButton4]
+X = 510
+Y = 255
+W = 270
+H = 25
+Tex = Rectangle
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Z = 0.98
+
+[SongMenuButton4Text1]
+X =30
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=SONG_MENU_CANCEL
+Align=0
+Z=0.99
+
+[SongMenuSelectSlide3]
+Tex = Rectangle
+TexSBG = SongMenuSelectBG
+Text =
+X = 510
+Y = 225
+W = 0
+H = 25
+Z = 0.98
+SkipX = 0
+SBGW=270
+
+TextSize=8
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = Black
+STDColor = White
+
+[SongMenuTextMenu]
+X =539
+Y =125
+Color=White
+Font =0
+Size =14
+Text=MENU
+Align=0
+Z=0.99
+
+[SongMenuStatic2]
+X =513
+Y =135
+W =21
+H =21
+Color =White
+Tex =IconSongMenu
+Type=Font Black
+Z=0.98
+
+[SongMenuStatic1]
+Tex =SongMenuBG
+X =498
+Y =120
+W =300
+H =200
+Z =0.94
+Int=1
+Color =GrayLight
+Type=Font Black
+
+[SongJumpto]
+Texts=0
+Statics=1
+
+[SongJumptoStatic1]
+Tex =JumpToBG
+X =221
+Y =175
+W =355
+H =175
+Z =0.98
+Int=1
+Color =DarkOrange
+Type=Font Black
+
+[SongJumptoStatic2]
+X =234
+Y =185
+W =21
+H =21
+Color =White
+Tex =MainSearch
+Type=Font Black
+Z=0.99
+
+[SongJumptoText1]
+X =310
+Y =175
+Color=White
+Font =0
+Size =14
+Text=SONG_JUMPTO_TYPE_DESC
+Align=0
+Z=0.99
+
+[SongJumptoSelectSlideType]
+Tex = button
+TexSBG = mainicon
+#Text = SONG_JUMPTO_TYPE_DESC
+Font=1
+X = 242
+Y = 205
+Z = 0.99
+W = 0
+H = 30
+SkipX = 4
+SBGW= 300
+Fields=2
+DColor = LightOrange
+TColor = White
+TDColor = White
+SBGTex = button
+SBGDColor = LightOrange
+STColor = White
+STDColor = LightOrange
+
+[SongJumptoButtonSearchText]
+X = 250
+Y = 215
+Z = 0.99
+W = 160
+H = 50
+Size=14
+Font=1
+Align=0
+
+[SongJumptoTextFound]
+X =234
+Y =295
+Color=White
+Font =0
+Size =8
+Text=SONG_JUMPTO_HELP
+Align=0
+Z=0.99
+
+
+######################## Main Statistik ##############
+
+
+
+[StatMain]
+Texts=0
+Statics=0
+
+[StatMainBackground]
+Tex=OptionsBG
+
+[StatMainButtonScores]
+X =589
+Y =100
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonScoresText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SCORES
+Color=Black
+
+[StatMainButtonSingers]
+X =589
+Y =160
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSingersText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SINGERS
+Color=Black
+
+[StatMainButtonSongs]
+X =589
+Y =220
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSongsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_SONGS
+Color=Black
+
+[StatMainButtonBands]
+X =589
+Y =280
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonBandsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_BANDS
+Color=Black
+
+[StatMainButtonExit]
+X =589
+Y =340
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=Black
+
+[StatMainTextOverview]
+X =45
+Y =125
+W =510
+Color=White
+Font =0
+Size =9
+Align=0
+Text=
+
+[StatMainStatic1]
+X =47
+Y =466
+W =27
+H =27
+Color=White
+Tex =StatIcon
+Type=Font Black
+
+[StatMainStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color=White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatMainStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color=White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatMainStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[StatMainStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[StatMainStatic6]
+X =40
+Y =100
+W =520
+H =20
+Tex=StatMainBG1
+Color =Gray
+Type=Font Black
+
+[StatMainStatic7]
+X =40
+Y =120
+W =520
+H =300
+Tex=StatMainBG2
+Color =GrayLight
+Type=Font Black
+
+[StatMainStatic8]
+X =40
+Y =420
+W =520
+H =20
+Tex=StatMainBG3
+Color =Gray
+Type=Font Black
+
+[StatMainText1]
+X =83
+Y =452
+Color=White
+Font =0
+Size =20
+Text=STAT_MAIN
+Align=0
+
+[StatMainText2]
+X =238
+Y =5
+Color=White
+Font =0
+Size =7
+Align=2
+Text=STAT_MAIN_WHEREAMI
+
+[StatMainText3]
+X =180
+Y =490
+Color=White
+Font =0
+Size =10
+Align =0
+Text=STAT_MAIN_DESC
+
+[StatMainText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatMainText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+
+#######################Detail Statistiken##############
+
+
+
+[StatDetail]
+Texts=0
+Statics=0
+
+[StatDetailBackground]
+Tex=OptionsBG
+
+[StatDetailButtonNext]
+X =589
+Y =100
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonNextText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_NEXT
+Color=Black
+
+[StatDetailButtonPrev]
+X =589
+Y =160
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonPrevText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_PREV
+Color=Black
+
+[StatDetailButtonReverse]
+X =589
+Y =220
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonReverseText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_REVERSE
+Color=Black
+
+[StatDetailButtonExit]
+X =589
+Y =280
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=Black
+
+[StatDetailTextDescription]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=
+
+[StatDetailTextPage]
+X = 546
+Y = 98
+Color= White
+Font = 0
+Size = 5
+Align=2
+Text=
+
+[StatDetailTextList1]
+X = 45
+Y = 122
+Color=White
+Font = 0
+Size = 7
+Text=Stat1
+
+[StatDetailTextList2]
+X = 45
+Y = 160
+Color=White
+Font = 0
+Size = 7
+Text=Stat2
+
+[StatDetailTextList3]
+X = 45
+Y = 198
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList4]
+X = 45
+Y = 236
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList5]
+X = 45
+Y = 274
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList6]
+X = 45
+Y = 312
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList7]
+X = 45
+Y = 350
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList8]
+X = 45
+Y = 388
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList9]
+X = 45
+Y = 426
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList10]
+X = 45
+Y = 464
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color=White
+Tex =StatIcon
+Type=Font Black
+
+[StatDetailStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatDetailStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatDetailStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[StatDetailStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[StatDetailStatic6]
+X =40
+Y =100
+W =520
+H =24
+Tex=StatDetailBG1
+Color =Gray
+Type=Font Black
+
+[StatDetailStatic7]
+X =40
+Y =124
+W =520
+H =376
+Tex=StatMainBG2
+Color =GrayLight
+Type=Font Black
+
+[StatDetailStatic8]
+X =40
+Y =500
+W =520
+H =20
+Tex=StatMainBG3
+Color =Gray
+Type=Font Black
+
+
+[StatDetailText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=STAT_DETAIL
+Align=0
+
+[StatDetailText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=STAT_DETAIL_WHEREAMI
+
+[StatDetailText3]
+X =294
+Y =3
+ColorBlack
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatDetailText4]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+
+#######################################################
+
+
+[CheckPopup]
+Texts=1
+Statics=1
+
+[CheckPopupButton1]
+X = 285
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = White
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton1Text1]
+X =50
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=JA
+Align=1
+Z=1
+
+[CheckPopupButton2]
+X = 415
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = White
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton2Text1]
+X =50
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=NEIN
+Align=1
+Z=1
+
+[CheckPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[CheckPopupText1]
+X =282
+Y =147
+Color=White
+Font =0
+Size =10
+Text=MSG_QUESTION_TITLE
+Align=0
+Z=1
+
+[CheckPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =WhitePopup
+Type=Font Black
+
+[CheckPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[CheckPopupStatic3]
+Tex =IconQuestion
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopup]
+Texts=1
+Statics=1
+
+[ErrorPopupButton1]
+X = 350
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = White
+DColor = WhitePopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[ErrorPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=OK
+Align=1
+Z=1
+
+[ErrorPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[ErrorPopupText1]
+X =282
+Y =148
+Color=White
+Font =0
+Size =10
+Text=MSG_ERROR_TITLE
+Align=0
+Z=1
+
+[ErrorPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =WhitePopup
+Type=Font Black
+
+[ErrorPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopupStatic3]
+Tex =IconError
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black \ No newline at end of file
diff --git a/Game/Output/Themes/TODOs/Vistar.ini b/Game/Output/Themes/TODOs/Vistar.ini
new file mode 100644
index 00000000..202c89d8
--- /dev/null
+++ b/Game/Output/Themes/TODOs/Vistar.ini
@@ -0,0 +1,7634 @@
+;0.5.1 Mod
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Theme]
+Name=Vistar
+Creator=!Skar!™
+
+[Colors]
+White = 255 255 255
+LightBlue = 130 200 250
+DarkBlue = 20 130 230
+LightRed = 170 146 146
+DarkRed = 155 113 113
+LightGreen = 136 168 136
+DarkGreen = 106 152 104
+LightPurple = 155 136 168
+DarkPurple = 145 104 152
+LightOrange = 168 155 136
+DarkOrange = 151 131 76
+LightYellow = 168 168 136
+DarkYellow = 150 151 76
+Turkis = 13 186 167
+GrayLightest = 223 223 223
+GrayLight = 191 191 191
+Gray = 127 127 127
+GrayDark = 63 63 63
+Black = 0 0 0
+GrayPopup = 51 51 51
+Gold = 255 223 31
+Silver = 223 223 223
+Bronze = 205 127 50
+Blue = 0 174 255
+
+[Loading]
+Texts =2
+Fade = 1
+
+[LoadingBackground]
+Tex=LoadingBG
+
+[LoadingText1]
+X =30
+Y =550
+Color =White
+Font =0
+Align =0
+Size =10
+Text =SING_LOADING
+
+[LoadingText2]
+X =790
+Y =556
+Color=White
+Font =0
+Size =6
+Align=2
+Text=US_VERSION
+
+
+
+
+
+[MainBackground]
+Tex=MainBG
+
+[MainStatic1]
+X =12
+Y =282
+W =27
+H =27
+Color =GrayLight
+Tex =MainIcon
+Type=Font Black
+
+[MainText1]
+X =45
+Y =287
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_MENU
+
+[MainText2]
+X = 214
+Y = 302
+W = 100
+Color=White
+Font =0
+Size =6
+Align=0
+Text=US_VERSION
+
+[MainTextDescriptionLong]
+X =10
+Y =552
+Color=Gray
+Font =0
+Size =6
+Align=0
+Text=
+
+[MainButtonSolo]
+X =7
+Y =320
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[MainButtonSoloText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_SING
+Color=Black
+
+[MainButtonMulti]
+X =7
+Y =350
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[MainButtonMultiText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_MULTI
+Color=Black
+
+[MainButtonStats]
+X =7
+Y =380
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[MainButtonStatsText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_STATS
+Color=Black
+
+[MainButtonOptions]
+X =7
+Y =410
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[MainButtonOptionsText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_OPTIONS
+Color=Black
+
+[MainButtonExit]
+X =7
+Y =440
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[MainButtonExitText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_EXIT
+Color=Black
+
+[MainStatic2]
+X =12
+Y =324
+W =22
+H =150
+Color =GrayLight
+Tex =MainButtons
+Type=Font Black
+
+
+
+
+
+
+
+################### Name Screen ##############
+
+
+
+[Name]
+Texts=2
+
+[NameBackground]
+Tex=MainBG
+
+[NameStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =MainIcon
+Type=Font Black
+
+[NameStatic2]
+X =12
+Y =282
+W =27
+H =27
+Color =GrayLight
+Tex =MainIcon
+Type=Font Black
+
+[NameText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=SING_MODE
+
+[NameText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_PLAYER_DESC
+
+[NameText3]
+X =45
+Y =287
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_PLAYER_WHEREAMI
+
+[NameButtonPlayer1]
+X =7
+Y =320
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[NameButtonPlayer1Text1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Color=Black
+Text=
+
+[NameButtonPlayer2]
+X =7
+Y =350
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[NameButtonPlayer2Text1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Color=Black
+Text=
+
+[NameButtonPlayer3]
+X =7
+Y =380
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[NameButtonPlayer3Text1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Color=Black
+Text=
+
+[NameButtonPlayer4]
+X =7
+Y =410
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[NameButtonPlayer4Text1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Color=Black
+Text=
+
+[NameButtonPlayer5]
+X =7
+Y =440
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[NameButtonPlayer5Text1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Color=Black
+Text=
+
+[NameButtonPlayer6]
+X =7
+Y =470
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[NameButtonPlayer6Text1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Color=Black
+Text=
+
+[NameStatic3]
+X =12
+Y =324
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonMulti
+Type=Font Black
+
+[NameStatic4]
+X =12
+Y =354
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonMulti
+Type=Font Black
+
+[NameStatic5]
+X =12
+Y =384
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonMulti
+Type=Font Black
+
+[NameStatic6]
+X =12
+Y =414
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonMulti
+Type=Font Black
+
+[NameStatic7]
+X =12
+Y =444
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonMulti
+Type=Font Black
+
+[NameStatic8]
+X =12
+Y =474
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonMulti
+Type=Font Black
+
+
+
+
+
+##################### Level #######################
+
+
+
+
+[Level]
+Texts=5
+
+[LevelBackground]
+Tex=MainBG
+
+[LevelStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =MainIcon
+Type=Font Black
+
+[LevelStatic2]
+X =12
+Y =282
+W =27
+H =27
+Color =GrayLight
+Tex =MainIcon
+Type=Font Black
+
+[LevelText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=SING_MODE
+
+[LevelText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_DIFFICULTY_DESC
+
+[LevelText3]
+X =45
+Y =287
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_DIFFICULTY_WHEREAMI
+
+[LevelButtonEasy]
+X =7
+Y =320
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[LevelButtonMedium]
+X =7
+Y =350
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[LevelButtonHard]
+X =7
+Y =380
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[LevelButtonEasyText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Color=Black
+Text=SING_EASY
+
+[LevelButtonMediumText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Color=Black
+Text=SING_MEDIUM
+
+[LevelButtonHardText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Color=Black
+Text=SING_HARD
+
+[LevelStatic3]
+X =12
+Y =324
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonMulti
+Type=Font Black
+
+[LevelStatic4]
+X =12
+Y =354
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonMulti
+Type=Font Black
+
+[LevelStatic5]
+X =12
+Y =384
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonMulti
+Type=Font Black
+
+
+
+
+################### Song Selection ##############
+
+
+
+[Song]
+Texts =3
+
+[SongBackground]
+Tex=SongBG
+
+[SongCover]
+X=303
+Y=125
+W=320
+H=190
+Style=5
+Reflections=1
+
+[SongEqualizer]
+Visible=1
+Direction=1
+Color=Blue
+Alpha=1
+X=255
+Y=513
+Z=1
+PieceW=6
+PieceH=6
+Space=1
+Bands=4
+Length=18
+
+[SongVideoIcon]
+X =299
+Y =487
+W =32
+H =32
+Z=1
+Color=White
+Tex =VideoIcon
+Type=Font Black
+
+[SongTextCat]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_SONG_SELECTION_DESC
+
+[SongTextArtist]
+X =400
+Y =330
+W = 190
+Color=White
+Font =1
+Size =9
+Align =1
+Text=
+
+[SongTextTitle]
+X =400
+Y =400
+W = 190
+Color=White
+Font =0
+Size =9
+Align =1
+Text=
+
+[SongTextNumber]
+X =490
+Y =495
+Color=White
+Font =0
+Size =8
+Align =2
+Text=
+
+#Variable statics and texts for song-screen in sing- and partymode
+# There can be an unlimited Number of Statics and Texts, As long
+# as the numbers are in order.
+# Statics that are shown in PartyMode Only are Named_
+# SongStaticParty[No]
+# Texts that are shown in PartyMode Only are Named_
+# SongTextParty[No]
+# Statics that are shown in Normal Mode Only are Named_
+# SongStaticNonParty[No]
+# Texts that are shown in Normal Mode Only are Named_
+# SongTextNonParty[No]
+#Here are the ones for singmode
+
+[SongStaticNonParty1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =SongCD
+Type=Font Black
+
+[SongStaticNonParty2]
+X =160
+Y =580
+W =26
+H =22
+Tex=ButtonAlt
+Color =White
+Type=Font Black
+
+[SongStaticNonParty3]
+X =200
+Y =580
+W =26
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Font Black
+
+[SongStaticNonParty4]
+X =325
+Y =580
+W =22
+H =22
+Tex=ButtonM
+Color =White
+Type=Font Black
+
+[SongStaticNonParty5]
+X =415
+Y =580
+W =22
+H =22
+Tex=ButtonJ
+Color =White
+Type=Font Black
+
+[SongStaticNonParty6]
+X =579
+Y =580
+W =22
+H =22
+Tex=ButtonP
+Color =White
+Type=Font Black
+
+#Texts Non Party
+[SongTextNonParty1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_SONG_SELECTION
+Align=0
+
+[SongTextNonParty2]
+X =298
+Y =102
+Color=Black
+Font =0
+Size =6
+Align=0
+Text=SING_SONG_SELECTION_WHEREAMI
+
+[SongTextNonParty3]
+X =188
+Y =583
+Color=GrayLight
+Font =1
+Size =5
+Align=0
+Text=+
+
+[SongTextNonParty4]
+X =230
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_GOTO
+
+[SongTextNonParty5]
+X =350
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_MENU
+
+[SongTextNonParty6]
+X =440
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SONG_JUMPTO_DESC
+
+[SongTextNonParty7]
+X =605
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_PLAYLIST
+
+
+#and theese are the ones for partymode
+
+[SongStaticParty1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[SongStaticParty2]
+X =160
+Y =580
+W =26
+H =22
+Tex=Button13
+Color =White
+Type=Font Black
+
+[SongStaticParty3]
+X =300
+Y =580
+W =22
+H =22
+Tex=ButtonM
+Color =White
+Type=Font Black
+
+[SongStaticParty4]
+X =440
+Y =580
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+#Texts for Party Mode
+
+[SongTextParty1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[SongTextParty2]
+X =188
+Y =580
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SONG_MENU_NAME_PARTY_JOKER
+
+[SongTextParty3]
+X =326
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_MENU
+
+[SongTextParty4]
+X =470
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_LEGEND_CONTINUE
+
+#variable statics end
+
+
+# Jokers, 5 for each team, only shown in party Mode
+[SongStaticTeam1Joker1]
+Tex =Joker
+X =530
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker2]
+Tex =Joker
+X =580
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker3]
+Tex =Joker
+X =630
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker4]
+Tex =Joker
+X =680
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker5]
+Tex =Joker
+X =730
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker1]
+Tex =Joker
+X =530
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker2]
+Tex =Joker
+X =580
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker3]
+Tex =Joker
+X =630
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker4]
+Tex =Joker
+X =680
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker5]
+Tex =Joker
+X =730
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker1]
+Tex =Joker
+X =530
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker2]
+Tex =Joker
+X =580
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker3]
+Tex =Joker
+X =630
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker4]
+Tex =Joker
+X =680
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker5]
+Tex =Joker
+X =730
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+
+
+##################### Sing ####################
+
+
+
+[SingText1]
+Text =SING_TIME
+X =21
+Y =574
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingStatic1]
+;TextBG
+Tex =LyricBar
+X =10
+Y =490
+W =780
+H =85
+Color =White
+Type=Font Black
+
+[SingStatic2]
+;TimeBar
+Tex =TimeBar1
+X =10
+Y =575
+W =780
+H =16
+Color=Black
+Type=Font Black
+
+[SingTimeProgress]
+X =70
+Y =580
+W =652
+H =7
+Color=White
+
+[SingStatic3]
+;the thing behind the time progress
+Tex =TimeBar2
+X =70
+Y =580
+W =652
+H =7
+Color=GrayDark
+Type=Font Black
+
+[SingTimeText]
+Text =SING_TIME
+X =754
+Y =574
+Font =1
+Size =6
+Color =White
+Align=1
+
+# O N E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#PlayerOne
+[SingP1Static]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1Text]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1Static2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1SingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T W O P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1TwoPStatic]
+Tex =P
+X =20
+Y =117
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPText]
+Text =P1
+X =26
+Y =122
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1TwoPStatic2]
+Tex =ScoreBG
+X =680
+Y =102
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPTextScore]
+Text =00000
+X =690
+Y =104
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1TwoPSingBar]
+X =680
+Y =136
+W =100
+H =8
+
+#Player Two
+[SingP2RStatic]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P2Dark
+Type=Transparent
+
+[SingP2RText]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP2RStatic2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2RTextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2RSingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T H R E E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1ThreePStatic]
+Tex =P
+X =16
+Y =59
+W =50
+H =54
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePText]
+Text =P1
+X =27
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP1ThreePStatic2]
+Tex =ScoreBG
+X =75
+Y =61
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePTextScore]
+Text =00000
+X =85
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1ThreePSingBar]
+X =75
+Y =95
+W =100
+H =8
+
+#Player Two
+[SingP2MStatic]
+Tex =P
+X =311
+Y =59
+W =50
+H =54
+Color =P2Dark
+Type=Transparent
+
+[SingP2MText]
+Text =P2
+X =321
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP2MStatic2]
+Tex =ScoreBG
+X =370
+Y =61
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2MTextScore]
+Text =00000
+X =380
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2MSingBar]
+X =370
+Y =95
+W =100
+H =8
+
+#Player Three
+[SingP3RStatic]
+Tex =P
+X =611
+Y =59
+W =50
+H =54
+Color =P3Dark
+Type=Transparent
+
+[SingP3RText]
+Text =P3
+X =621
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP3RStatic2]
+Tex =ScoreBG
+X =670
+Y =61
+W =100
+H =34
+Color =P3Dark
+Type=Transparent
+
+[SingP3RTextScore]
+Text =00000
+X =680
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP3SingBar]
+X =670
+Y =95
+W =100
+H =8
+
+
+
+################## Score ####################
+
+
+
+
+[Score]
+Texts =1
+
+[ScoreBackground]
+Tex=ScoreScreenBG
+
+[ScoreText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SONG_SCORE
+Align=0
+
+[ScoreTextArtistTitle]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=ArtistTitle
+
+[ScoreStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[ScoreText2]
+X =238
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=2
+Text=SONG_SCORE_WHEREAMI
+
+[ScoreStatic2]
+X =260
+Y =580
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[ScoreText3]
+X =290
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+#end of main stuff
+
+# # # # # # # # # # # # # # # # # # One Player Score # # # # # # # # # # # #
+[ScoreTextName1]
+X =175
+Y =260
+Font =0
+Size =14
+Text =P1
+Color =White
+Align=0
+
+[ScoreTextScore1]
+X =175
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes1]
+X =175
+Y =340
+Color=White
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore1]
+X =465
+Y =340
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextLineBonus1]
+X =175
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore1]
+X =465
+Y =370
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextGoldenNotes1]
+X =175
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore1]
+X =465
+Y =400
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextTotal1]
+X =205
+Y =460
+Color=White
+Font =0
+Size =14
+Text=SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore1]
+X =465
+Y =460
+Color=P1Dark
+Font =0
+Size =14
+Align =2
+Text =0
+
+#Lines
+[ScorePlayer1Static1]
+Tex =ScoreLine
+X =173
+Y =338
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static2]
+Tex =ScoreLine
+X =173
+Y =368
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static3]
+Tex =ScoreLine
+X =173
+Y =398
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static4]
+Tex =ScoreLine
+X =173
+Y =428
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static5]
+Tex =ScoreLine
+X =173
+Y =458
+W =295
+H =4
+Type =Font Black
+Color =White
+
+[ScoreStaticBoxDark1]
+Tex =PlayerNumberBox
+X =175
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Text1]
+X =179
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel1]
+Tex =ScoreLevel
+X =475
+Y =160
+W =150
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =130
+W =150
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel1]
+Tex =ScoreLevel
+X =475
+Y =410
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =380
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer1Static6]
+Tex =ScoreEndCap
+X =494
+Y =460
+W =112
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Static7]
+Tex =ScoreLine
+X =493
+Y =460
+W =114
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+
+# # # # # # # # # # # # # # # # # # Two Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName2]
+X =20
+Y =260
+Font =0
+Size =14
+Text =P1
+Color =White
+Align=0
+
+[ScoreTextScore2]
+X =20
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes2]
+X =20
+Y =340
+Color=White
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore2]
+X =300
+Y =340
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextLineBonus2]
+X =20
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore2]
+X =300
+Y =370
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextGoldenNotes2]
+X =20
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore2]
+X =300
+Y =400
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextTotal2]
+X =50
+Y =460
+Color=White
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore2]
+X =300
+Y =460
+Color=P1Dark
+Font =0
+Size =14
+Align =2
+Text =00000
+
+# Lines
+[ScorePlayer2Static1]
+Tex =ScoreLine
+X =20
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static2]
+Tex =ScoreLine
+X =20
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static3]
+Tex =ScoreLine
+X =20
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static4]
+Tex =ScoreLine
+X =20
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static5]
+Tex =ScoreLine
+X =20
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =White
+
+[ScoreStaticBoxDark2]
+Tex =PlayerNumberBox
+X =20
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Text1]
+X =24
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel2]
+Tex =ScoreLevel
+X =293
+Y =160
+W =120
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =130
+W =120
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScoreStaticLevel2]
+Tex =ScoreLevel
+X =293
+Y =410
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =380
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScorePlayer2Static6]
+Tex =ScoreEndCap
+X =308
+Y =460
+W =90
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Static7]
+Tex =ScoreLine
+X =307
+Y =460
+W =92
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# P L A Y E R T W O
+[ScoreTextName3]
+X =780
+Y =260
+Font =0
+Size =14
+Text =P2
+Color =White
+Align=2
+
+[ScoreTextScore3]
+X =780
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=2
+
+[ScoreTextNotes3]
+X =780
+Y =340
+Color=White
+Font =0
+Size =9
+Text =SING_NOTES
+Align=2
+
+[ScoreTextNotesScore3]
+X =500
+Y =340
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextLineBonus3]
+X =780
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=2
+
+[ScoreTextLineBonusScore3]
+X =500
+Y =370
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextGoldenNotes3]
+X =780
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=2
+
+[ScoreTextGoldenNotesScore3]
+X =500
+Y =400
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextTotal3]
+X =750
+Y =460
+Color=White
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=2
+Reflection=1
+ReflectionSpacing=4
+
+[ScoreTextTotalScore3]
+X =500
+Y =460
+Color=P2Dark
+Font =0
+Size =14
+Align =0
+Text =00000
+Reflection=1
+ReflectionSpacing=4
+
+#Lines
+[ScorePlayer3Static1]
+Tex =ScoreLine
+X =500
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static2]
+Tex =ScoreLine
+X =500
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static3]
+Tex =ScoreLine
+X =500
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static4]
+Tex =ScoreLine
+X =500
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static5]
+Tex =ScoreLine
+X =500
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =White
+
+[ScoreStaticBoxDark3]
+Tex =PlayerNumberBox
+X =755
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Text1]
+X =759
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+#ScoreBar
+[ScoreStaticBackLevel3]
+Tex =ScoreLevel
+X =387
+Y =160
+W =120
+H =300
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =130
+W =120
+H =30
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel3]
+Tex =ScoreLevel
+X =387
+Y =410
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =380
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScorePlayer3Static6]
+Tex =ScoreEndCap
+X =402
+Y =460
+W =90
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Static7]
+Tex =ScoreLine
+X =401
+Y =460
+W =92
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# # # # # # # # # # # # # # # # # # Three Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName4]
+X=20
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P1
+Color=P1Dark
+
+[ScoreTextNotes4]
+X=20
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore4]
+X=260
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus4]
+X=20
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore4]
+X=260
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes4]
+X=20
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore4]
+X=260
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore4]
+X=20
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal4]
+X=47
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore4]
+X=260
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark4]
+Tex =PlayerNumberBox
+X =20
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer4Text1]
+X =24
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#lines
+[ScorePlayer4Static1]
+X=20
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static2]
+X=20
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static3]
+X=20
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static4]
+X=20
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static5]
+X=20
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+# P L A Y E R T W O
+[ScoreTextName5]
+X=280
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P2
+Color=P2Dark
+
+[ScoreTextNotes5]
+X=280
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore5]
+X=520
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus5]
+X=280
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore5]
+X=520
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes5]
+X=280
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore5]
+X=520
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore5]
+X=280
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal5]
+X=307
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore5]
+X=520
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark5]
+Tex =PlayerNumberBox
+X =280
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer5Text1]
+X =284
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+[ScorePlayer5Static1]
+X=280
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static2]
+X=280
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static3]
+X=280
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static4]
+X=280
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static5]
+X=280
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+# P L A Y E R T H R E E
+[ScoreTextName6]
+X=540
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P3
+Color=P3Dark
+
+[ScoreTextNotes6]
+X=540
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore6]
+X=780
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus6]
+X=540
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore6]
+X=780
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes6]
+X=540
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore6]
+X=780
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore6]
+X=540
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal6]
+X=567
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore6]
+X=780
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark6]
+Tex =PlayerNumberBox
+X =540
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P3Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer6Text1]
+X =544
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P3
+
+#lines
+[ScorePlayer6Static1]
+X=540
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static2]
+X=540
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static3]
+X=540
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static4]
+X=540
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static5]
+X=540
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+
+
+############## Options ##############
+
+
+
+
+[Options]
+Texts = 6
+Fade = 2
+
+[OptionsBackground]
+Tex=OptionsBG
+
+[OptionsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsStatic2]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsStatic3]
+X =388
+Y =580
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsStatic4]
+X =512
+Y =580
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsText2]
+X =45
+Y =287
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_OPTIONS_WHEREAMI
+
+[OptionsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_DESC
+
+[OptionsText4]
+X =294
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsText5]
+X =418
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_SELECT
+
+[OptionsText6]
+X =538
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsButtonGame]
+X =7
+Y =320
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[OptionsButtonGameText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_OPTIONS_GAME
+Color=Black
+
+[OptionsButtonGraphics]
+X =7
+Y =350
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[OptionsButtonGraphicsText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_OPTIONS_GRAPHICS
+Color=Black
+
+[OptionsButtonSound]
+X =7
+Y =380
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[OptionsButtonSoundText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_OPTIONS_SOUND
+Color=Black
+
+[OptionsButtonLyrics]
+X =7
+Y =410
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[OptionsButtonLyricsText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_OPTIONS_LYRICS
+Color=Black
+
+[OptionsButtonThemes]
+X =7
+Y =440
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[OptionsButtonThemesText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_OPTIONS_THEMES
+Color=Black
+
+[OptionsButtonRecord]
+X =7
+Y =470
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[OptionsButtonRecordText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_OPTIONS_RECORD
+Color=Black
+
+[OptionsButtonAdvanced]
+X =7
+Y =500
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[OptionsButtonAdvancedText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_OPTIONS_ADVANCED
+Color=Black
+
+[OptionsButtonExit]
+X =7
+Y =530
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[OptionsButtonExitText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_OPTIONS_EXIT
+Color=Black
+
+[OptionsStatic5]
+X =12
+Y =324
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonOptions
+Type=Font Black
+
+[OptionsStatic6]
+X =12
+Y =354
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonOptions
+Type=Font Black
+
+[OptionsStatic7]
+X =12
+Y =384
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonOptions
+Type=Font Black
+
+[OptionsStatic8]
+X =12
+Y =414
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonOptions
+Type=Font Black
+
+[OptionsStatic9]
+X =12
+Y =444
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonOptions
+Type=Font Black
+
+[OptionsStatic10]
+X =12
+Y =474
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonOptions
+Type=Font Black
+
+[OptionsStatic11]
+X =12
+Y =504
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonOptions
+Type=Font Black
+
+[OptionsStatic12]
+X =12
+Y =534
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonExit
+Type=Font Black
+
+[OptionsStatic13]
+X =12
+Y =282
+W =27
+H =27
+Color =GrayLight
+Tex =ButtonOptions
+Type=Font Black
+
+
+
+
+
+[OptionsGame]
+Texts = 5
+
+[OptionsGameBackground]
+Tex=Options2BG
+
+[OptionsGameStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGameStatic2]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsGameStatic3]
+X =388
+Y =580
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsGameText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGameText2]
+X =238
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GAME_WHEREAMI
+
+[OptionsGameText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GAME_DESC
+
+[OptionsGameText4]
+X =294
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGameText5]
+X =418
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGameSelectPlayers]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_PLAYERS
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDifficulty]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DIFFICULTY
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+
+[OptionsGameSelectSlideLanguage]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_LANGUAGE
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectTabs]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_TABS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectSlideSorting]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_SORTING
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDebug]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DEBUG
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = DarkBlue
+DColor = LightBlue
+Type = Font Black
+
+[OptionsGraphics]
+Texts = 5
+
+[OptionsGraphicsBackground]
+Tex=Options2BG
+
+[OptionsGraphicsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGraphicsStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic4]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsGraphicsStatic5]
+X =388
+Y =580
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsGraphicsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGraphicsText2]
+X =238
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GRAPHICS_WHEREAMI
+
+[OptionsGraphicsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GRAPHICS_DESC
+
+[OptionsGraphicsText4]
+X =294
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGraphicsText5]
+X =418
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGraphicsSelectSlideResolution]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_GRAPHICS_RESOLUTION
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectFullscreen]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_FULLSCREEN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectDepth]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_DEPTH
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectOscilloscope]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_OSCILLOSCOPE
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectMovieSize]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_MOVIE_SIZE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsButtonExit]
+X = 40
+Y = 360
+W = 230
+H = 70
+Tex =MainBar
+Color = DarkBlue
+DColor = LightBlue
+Type = Font Black
+
+[OptionsSound]
+Texts = 5
+
+[OptionsSoundBackground]
+Tex=Options2BG
+
+[OptionsSoundStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsSoundStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic4]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsSoundStatic5]
+X =388
+Y =580
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsSoundText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsSoundText2]
+X =238
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_SOUND_WHEREAMI
+
+[OptionsSoundText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_SOUND_DESC
+
+[OptionsSoundText4]
+X =294
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsSoundText5]
+X =418
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsSoundSelectMicBoost]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_MIC_BOOST
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectClickAssist]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_CLICK_ASSIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectBeatClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_BEAT_CLICK
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectThreshold]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_THRESHOLD
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectTwoPlayerMode]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_TWO_PLAYERS_MODE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewVolume]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWVOLUME
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewFADING]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWFADING
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = DarkBlue
+DColor = LightBlue
+Type = Font Black
+
+[OptionsLyrics]
+Texts = 1
+
+[OptionsLyricsBackground]
+Tex=Options2BG
+
+[OptionsLyricsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsLyricsStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic4]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsLyricsStatic5]
+X =388
+Y =580
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsLyricsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsLyricsText2]
+X =238
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_LYRICS_WHEREAMI
+
+[OptionsLyricsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_LYRICS_DESC
+
+[OptionsLyricsText4]
+X =294
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsLyricsText5]
+X =418
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsLyricsSelectLyricsFont]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_FONT
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectLyricsEffect]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_EFFECT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectSolmization]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_SOLMIZATION
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = DarkBlue
+DColor = LightBlue
+Type = Font Black
+
+[OptionsThemes]
+Texts = 5
+
+[OptionsThemesBackground]
+Tex=Options2BG
+
+[OptionsThemesStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsThemesStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic4]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsThemesStatic5]
+X =388
+Y =580
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsThemesText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsThemesText2]
+X =238
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_THEMES_WHEREAMI
+
+[OptionsThemesText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_THEMES_DESC
+
+[OptionsThemesText4]
+X =294
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsThemesText5]
+X =418
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsThemesSelectTheme]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_THEME
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectSkin]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_SKIN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectColor]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_COLOR
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = DarkBlue
+DColor = LightBlue
+Type = Font Black
+
+[OptionsRecord]
+Texts = 5
+
+[OptionsRecordBackground]
+Tex=Options2BG
+
+[OptionsRecordStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsRecordStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic4]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsRecordStatic5]
+X =388
+Y =580
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsRecordText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsRecordText2]
+X =238
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_RECORD_WHEREAMI
+
+[OptionsRecordText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_RECORD_DESC
+
+[OptionsRecordText4]
+X =294
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsRecordText5]
+X =418
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsRecordSelectSlideCard]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CARD
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideInput]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_INPUT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelL]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELL
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelR]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELR
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordButtonExit]
+X = 40
+Y = 305
+W = 230
+H = 70
+Tex = MainBar
+Color = DarkBlue
+DColor = LightBlue
+Type = Font Black
+
+[OptionsAdvanced]
+Texts = 5
+
+[OptionsAdvancedBackground]
+Tex=Options2BG
+
+[OptionsAdvancedStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsAdvancedStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic4]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsAdvancedStatic5]
+X =388
+Y =580
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsAdvancedText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsAdvancedText2]
+X =238
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_ADVANCED_WHEREAMI
+
+[OptionsAdvancedText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_ADVANCED_DESC
+
+[OptionsAdvancedText4]
+X =294
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsAdvancedText5]
+X =418
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+
+#########unused at the moment#########
+#[OptionsAdvancedSelectLoadAnimation]
+#Tex =MainBar
+#TexSBG =SelectBG
+#Text=SING_OPTIONS_ADVANCED_LOADANIMATION
+#X = 40
+#Y = 85
+#W = 230
+#H = 70
+#SkipX = 50
+
+#Color = ColorDark
+#DColor = Gray
+#TColor = White
+#TDColor = White
+#SBGTex =MainBar
+#SBGColor = ColorDark
+#SBGDColor = Gray
+#STColor = White
+#STDColor = GrayDark
+
+[OptionsAdvancedSelectScreenFade]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_SCREENFADE
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectEffectSing]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_EFFECTSING
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectLineBonus]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_LINEBONUS
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectSlideOnSongClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_ADVANCED_ONSONGCLICK
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectAskbeforeDel]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_ASKBEFOREDEL
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectPartyPopup]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_PARTYPOPUP
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = DarkBlue
+DColor = LightBlue
+Type = Font Black
+
+
+
+
+
+
+############## Top 5 ####################
+
+
+
+
+
+
+
+[Top5]
+Texts=1
+
+[Top5Background]
+Tex=Top5BG
+
+[Top5Text1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Align=0
+Text =SING_TOP_5_CHARTS
+
+[Top5TextArtistTitle]
+X =70
+Y =53
+Color =White
+Font =0
+Size =10
+Align =0
+Text =artist - title
+
+[Top5Text4]
+X =70
+Y =73
+Color=White
+Font =0
+Size =10
+Align=0
+Text =SING_OPTIONS_GAME_DIFFICULTY
+
+[Top5TextLevel]
+X =270
+Y =73
+Color =White
+Font =0
+Size =10
+Align =1
+Text =easy
+
+[Top5Static1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[Top5Text2]
+X =238
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=2
+Text=SING_TOP_5_CHARTS_WHEREAMI
+
+[Top5Static2]
+X =260
+Y =580
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[Top5Text3]
+X =290
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_TOP_5_CHARTS_CONTINUE
+
+[Top5TextName1]
+X =150
+Y =190
+Color =White
+Font =0
+Size =14
+Align =0
+Text =1. Player1
+
+[Top5TextName2]
+X =150
+Y =240
+Color =White
+Font =0
+Size =14
+Align =0
+Text =2. Player2
+
+[Top5TextName3]
+X =150
+Y =290
+Color =White
+Font =0
+Size =14
+Align =0
+Text =3. Player3
+
+[Top5TextName4]
+X =150
+Y =340
+Color =White
+Font =0
+Size =14
+Align =0
+Text =4. Player4
+
+[Top5TextName5]
+X =150
+Y =390
+Color =White
+Font =0
+Size =14
+Align =0
+Text =5. Player5
+
+[Top5TextScore1]
+X =680
+Y =190
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore2]
+X =680
+Y =240
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore3]
+X =680
+Y =290
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore4]
+X =680
+Y =340
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore5]
+X =680
+Y =390
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextNumber1]
+X =120
+Y =193
+Color =White
+Font =1
+Size =9
+Align =1
+Text =1
+
+[Top5TextNumber2]
+X =120
+Y =243
+Color =White
+Font =1
+Size =9
+Align =1
+Text =2
+
+[Top5TextNumber3]
+X =120
+Y =293
+Color =White
+Font =1
+Size =9
+Align =1
+Text =3
+
+[Top5TextNumber4]
+X =120
+Y =343
+Color =White
+Font =1
+Size =9
+Align =1
+Text =4
+
+[Top5TextNumber5]
+X =120
+Y =393
+Color =White
+Font =1
+Size =9
+Align =1
+Text =5
+
+[Top5StaticNumber1]
+Tex=PlayerNumberBox
+X=100
+Y=186
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber2]
+Tex=PlayerNumberBox
+X=100
+Y=236
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber3]
+Tex=PlayerNumberBox
+X=100
+Y=286
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber4]
+Tex=PlayerNumberBox
+X=100
+Y=336
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber5]
+Tex=PlayerNumberBox
+X=100
+Y=386
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+
+################## Party ################
+
+
+
+[PartyNewRound]
+Texts =7
+
+[PartyNewRoundBackground]
+Tex=PartyBG
+
+[PartyNewRoundStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyNewRoundText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyNewRoundText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_ROUND_DESC
+
+[PartyNewRoundText3]
+X =238
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=2
+Text=PARTY_ROUND_WHEREAMI
+
+[PartyNewRoundText4]
+X =290
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=PARTY_ROUND_LEGEND_CONTINUE
+
+[PartyNewRoundText5]
+X =460
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND
+Align=0
+
+[PartyNewRoundText6]
+X =600
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND_WINNER
+Align=0
+
+[PartyNewRoundText7]
+X =448
+Y =350
+Color =White
+Font =0
+Size =18
+Text =PARTY_ROUND
+Align=2
+
+[PartyNewRoundTextTeam1Players]
+X =30
+Y =137
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam2Players]
+X =30
+Y =218
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam3Players]
+X =30
+Y =299
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundStatic2]
+Tex =PartyRoundBG1
+X =450
+Y =103
+W = 330
+H = 24
+Int=1
+Color =DarkBlue
+Type=Font Black
+
+[PartyNewRoundStatic3]
+X =260
+Y =580
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[PartyNewRoundStatic4]
+Tex =PartyRoundBG3
+X =250
+Y =350
+W = 300
+H = 50
+Int=1
+Color =DarkBlue
+Type=Font Black
+
+[PartyNewRoundStatic5]
+Tex =PartyRoundBG4
+X =50
+Y =495
+W = 700
+H = 30
+Int=1
+Color =LightBlue
+Type=Font Black
+
+[PartyNewRoundStaticTeam1]
+Tex =PartyTeamButton1
+X =20
+Y =110
+W =400
+H =50
+Int=1
+Color =P1Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam2]
+Tex =PartyTeamButton1
+X =20
+Y =191
+W =400
+H =50
+Int=1
+Color =P2Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam3]
+Tex =PartyTeamButton1
+X =20
+Y =272
+W =400
+H =50
+Int=1
+Color =P3Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticNextPlayer1]
+Tex=PartyPlayerButton
+X=155
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P1Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer2]
+Tex=PartyPlayerButton
+X=325
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P2Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer3]
+Tex=PartyPlayerButton
+X=495
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P3Light
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyNewRoundTextRound1]
+X =460
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Round 1
+Align=0
+
+[PartyNewRoundTextRound2]
+X =460
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Round 2
+Align=0
+
+[PartyNewRoundTextRound3]
+X =460
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Round 3
+Align=0
+
+[PartyNewRoundTextRound4]
+X =460
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Round 4
+Align=0
+
+[PartyNewRoundTextRound5]
+X =460
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Round 5
+Align=0
+
+[PartyNewRoundTextRound6]
+X =460
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Round 6
+Align=0
+
+[PartyNewRoundTextRound7]
+X =460
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Round 7
+Align=0
+
+[PartyNewRoundTextWinner1]
+X =600
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Winner 1
+Align=0
+
+[PartyNewRoundTextWinner2]
+X =600
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Winner 2
+Align=0
+
+[PartyNewRoundTextWinner3]
+X =600
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Winner 3
+Align=0
+
+[PartyNewRoundTextWinner4]
+X =600
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Winner 4
+Align=0
+
+[PartyNewRoundTextWinner5]
+X =600
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Winner 5
+Align=0
+
+[PartyNewRoundTextWinner6]
+X =600
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Winner 6
+Align=0
+
+[PartyNewRoundTextWinner7]
+X =600
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Winner 7
+Align=0
+
+[PartyNewRoundStaticRound1]
+Tex =PartyRoundBG2
+X =450
+Y =135
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundStaticRound2]
+Tex =PartyRoundBG2
+X =450
+Y =164
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundStaticRound3]
+Tex =PartyRoundBG2
+X =450
+Y =193
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundStaticRound4]
+Tex =PartyRoundBG2
+X =450
+Y =222
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundStaticRound5]
+Tex =PartyRoundBG2
+X =450
+Y =251
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundStaticRound6]
+Tex =PartyRoundBG2
+X =450
+Y =280
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundStaticRound7]
+Tex =PartyRoundBG2
+X =450
+Y =309
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundTextNextRound]
+X =400
+Y =495
+Color =White
+Font =0
+Size =10
+Text =Next Round
+Align=1
+
+[PartyNewRoundTextNextRoundNo]
+X =457
+Y =350
+Color =White
+Font =0
+Size =18
+Text =99
+Align=0
+
+[PartyNewRoundTextScoreTeam1]
+X =390
+Y =110
+Color =White
+Font =0
+Size =17
+Text =3000
+Align=1
+
+[PartyNewRoundTextScoreTeam2]
+X =390
+Y =191
+Color =White
+Font =0
+Size =17
+Text =2000
+Align=1
+
+[PartyNewRoundTextScoreTeam3]
+X =390
+Y =272
+Color =White
+Font =0
+Size =17
+Text =1000
+Align=1
+
+[PartyNewRoundTextNameTeam1]
+X =30
+Y =108
+Color =White
+Font =0
+Size =12
+Text =Team 1
+Align=0
+
+[PartyNewRoundTextNameTeam2]
+X =30
+Y =189
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyNewRoundTextNameTeam3]
+X =30
+Y =270
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyNewRoundTextNextPlayer1]
+X =230
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 1
+Align=1
+
+[PartyNewRoundTextNextPlayer2]
+X =400
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 2
+Align=1
+
+[PartyNewRoundTextNextPlayer3]
+X =570
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 3
+Align=1
+
+
+[PartyScore]
+Texts=5
+
+[PartyScoreBackground]
+Tex=PartyBG
+
+[PartyScoreDecoTextures]
+ChangeTextures =1
+
+FirstTexture =PartyScoreDeco
+FirstTyp =Font Black
+FirstColor =Gold
+
+SecondTexture =PartyScoreDeco
+SecondTyp =Font Black
+SecondColor =Silver
+
+ThirdTexture =PartyScoreDeco
+ThirdTyp =Font Black
+ThirdColor =Bronze
+
+[PartyScoreStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyScoreStatic2]
+X =260
+Y =580
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[PartyScoreText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyScoreText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_SCORE_DESC
+
+[PartyScoreText3]
+X =238
+Y =579
+Color=Gray Light
+Font =0
+Size =7
+Align=2
+Text=PARTY_SCORE_WHEREAMI
+
+[PartyScoreText4]
+X =290
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=PARTY_LEGEND_CONTINUE
+
+[PartyScoreStatic3]
+Tex =PartyScoreBG1
+X =50
+Y =100
+W = 700
+H = 80
+Int=1
+Color =DarkBlue
+Type=Font Black
+
+[PartyScoreStatic4]
+Tex =PartyScoreBG2
+X =50
+Y =495
+W = 700
+H = 20
+Int=1
+Color =LightBlue
+Type=Font Black
+
+[PartyScoreText5]
+X =400
+Y =136
+Color =White
+Font =0
+Size =15
+Text =PARTY_SCORE_WINS2
+Align=1
+
+[PartyScoreTextWinner]
+X =400
+Y =98
+Color =White
+Font =0
+Size =18
+Text =The Winner is...
+Align=1
+
+[PartyScoreTextScoreTeam1]
+X =568
+Y =198
+Color =White
+Font =0
+Size =12
+Text =3000
+Align=2
+
+[PartyScoreTextScoreTeam2]
+X =568
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyScoreTextScoreTeam3]
+X =568
+Y =398
+Color =White
+Font =0
+Size =12
+Text =1000
+Align=2
+
+[PartyScoreTextNameTeam1]
+X =188
+Y =198
+Font=0
+Size=12
+Align=0
+Text=Team 1
+Color=White
+
+[PartyScoreTextNameTeam2]
+X =188
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyScoreTextNameTeam3]
+X =188
+Y =398
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyScoreStaticTeam1]
+X =188
+Y =230
+W =380
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam1BG]
+Tex=PartyTeamButton2
+X=178
+Y=200
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam1Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 191
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam2]
+X =188
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam2BG]
+Tex=PartyTeamButton2
+X=178
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam2Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam3]
+X =188
+Y =430
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam3BG]
+Tex=PartyTeamButton2
+X=178
+Y=400
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam3Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 391
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyWin]
+Texts=4
+
+[PartyWinBackground]
+Tex=PartyBG
+
+[PartyWinStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyWinStatic2]
+X =260
+Y =580
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[PartyWinText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyWinText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_WIN_DESC
+
+[PartyWinText3]
+X =238
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=2
+Text=PARTY_WIN_WHEREAMI
+
+[PartyWinText4]
+X =290
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=PARTY_WIN_LEGEND_CONTINUE
+
+#[PartyWinTextWinner]
+#X =150
+#Y =120
+#Color =White
+#Font =1
+#Size =14
+#Text =The Winner is...
+#Align=0
+
+[PartyWinTextScoreTeam1]
+X =699
+Y =183
+Color =White
+Font =0
+Size =19
+Text =3000
+Align=2
+
+[PartyWinTextScoreTeam2]
+X =669
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyWinTextScoreTeam3]
+X =649
+Y =398
+Color =White
+Font =0
+Size =9
+Text =1000
+Align=2
+
+[PartyWinTextNameTeam1]
+X =169
+Y =183
+Font=0
+Size=19
+Align=0
+Text=Team 1
+Color=White
+
+[PartyWinTextNameTeam2]
+X =289
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyWinTextNameTeam3]
+X =369
+Y =398
+Color =White
+Font =0
+Size =9
+Text =Team 3
+Align=0
+
+[PartyWinStaticTeam1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BG]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank2]
+Tex=PartyTeamButton3
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank3]
+Tex=PartyTeamButton3
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyWinStaticTeam1Deco]
+Tex =PartyWinDeco1
+X = 91
+Y = 176
+W = 79
+H = 79
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BG]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamButton3
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank1]
+Tex=PartyTeamButton4
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank2]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank3]
+Tex=PartyTeamButton4
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Deco]
+Tex =PartyWinDeco2
+X = 226
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Silver
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BG]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank2]
+Tex=PartyTeamButton5
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank3]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Deco]
+Tex =PartyWinDeco3
+X = 316
+Y = 391
+W = 54
+H = 54
+Type =Font Black
+Color =Bronze
+Reflection=1
+ReflectionSpacing=3
+
+[PartyOptions]
+Texts = 5
+
+[PartyOptionsBackground]
+Tex=PartyBG
+
+[PartyOptionsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyOptionsStatic2]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[PartyOptionsStatic3]
+X =388
+Y =580
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[PartyOptionsText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyOptionsText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_OPTIONS_DESC
+
+[PartyOptionsText3]
+X =238
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=2
+Text=PARTY_OPTIONS_WHEREAMI
+
+[PartyOptionsText4]
+X =294
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyOptionsText5]
+X =418
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[PartyOptionsSelectLevel]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_DIFFICULTY
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectRounds]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_ROUNDS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectTeams]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers1]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER1
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER2
+X = 40
+Y = 415
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers3]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER3
+X = 40
+Y = 470
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+
+
+[PartyPlayer]
+Texts=6
+
+[PartyPlayerBackground]
+Tex=PartyBG
+
+[PartyPlayerStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyPlayerStatic2]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerStatic3]
+X =388
+Y =580
+W =26
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerStatic4]
+X =556
+Y =580
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyPlayerText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_PLAYER_DESC
+
+[PartyPlayerText3]
+X =238
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=2
+Text=PARTY_PLAYER_WHEREAMI
+
+[PartyPlayerText4]
+X =294
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyPlayerText5]
+X =418
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_ENTER_NAME
+
+[PartyPlayerText6]
+X =586
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_LEGEND_CONTINUE
+
+[PartyPlayerTeam1Name]
+Tex=PartyTeamButton2
+X=85
+Y=100
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Dark
+
+[PartyPlayerTeam1NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 1
+Color=White
+
+[PartyPlayerPlayer1Name]
+Tex=MainBar
+X=85
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer1NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 1
+Color=White
+
+[PartyPlayerPlayer2Name]
+Tex=MainBar
+X=245
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer2NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 2
+Color=White
+
+[PartyPlayerPlayer3Name]
+Tex=MainBar
+X=405
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer3NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 3
+Color=White
+
+[PartyPlayerPlayer4Name]
+Tex=MainBar
+X=565
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer4NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 4
+Color=White
+
+[PartyPlayerTeam2Name]
+Tex=PartyTeamButton2
+X=85
+Y=240
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Dark
+
+[PartyPlayerTeam2NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 2
+Color=White
+
+[PartyPlayerPlayer5Name]
+Tex=MainBar
+X=85
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer5NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 5
+Color=White
+
+[PartyPlayerPlayer6Name]
+Tex=MainBar
+X=245
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer6NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 6
+Color=White
+
+[PartyPlayerPlayer7Name]
+Tex=MainBar
+X=405
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer7NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 7
+Color=White
+
+[PartyPlayerPlayer8Name]
+Tex=MainBar
+X=565
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer8NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 8
+Color=White
+
+[PartyPlayerTeam3Name]
+Tex=MainBar
+Tex=PartyTeamButton2
+X=85
+Y=380
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Dark
+
+[PartyPlayerTeam3NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 3
+Color=White
+
+[PartyPlayerPlayer9Name]
+Tex=MainBar
+X=85
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer9NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 9
+Color=White
+
+[PartyPlayerPlayer10Name]
+Tex=MainBar
+X=245
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer10NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 10
+Color=White
+
+[PartyPlayerPlayer11Name]
+Tex=MainBar
+X=405
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer11NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 11
+Color=White
+
+[PartyPlayerPlayer12Name]
+Tex=MainBar
+X=565
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer12NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 12
+Color=White
+
+
+[SongMenu]
+Texts=0
+Statics=1
+
+[SongMenuButton1]
+X = 510
+Y = 165
+W = 270
+H = 25
+Tex =Rectangle
+Color =LightBlue
+DColor = DarkBlue
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton1Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_PLAY
+Align=0
+Z=0.99
+
+[SongMenuButton2]
+X = 510
+Y = 195
+W = 270
+H = 25
+Tex =Rectangle
+Color =LightBlue
+DColor = DarkBlue
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton2Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_EDIT
+Align=0
+Z=0.99
+
+[SongMenuButton3]
+X = 510
+Y = 225
+W = 270
+H = 25
+Tex =Rectangle
+Color =LightBlue
+DColor = DarkBlue
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton3Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_MODI
+Align=0
+Z=0.99
+
+[SongMenuButton4]
+X = 510
+Y = 255
+W = 270
+H = 25
+Tex = Rectangle
+Color =LightBlue
+DColor = DarkBlue
+Type=Font Black
+Texts=1
+Z = 0.98
+
+[SongMenuButton4Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_CANCEL
+Align=0
+Z=0.99
+
+[SongMenuSelectSlide3]
+Tex = Rectangle
+TexSBG = SongMenuSelectBG
+Text =
+X = 510
+Y = 225
+W = 0
+H = 25
+Z = 0.98
+SkipX = 0
+SBGW=270
+
+TextSize=8
+
+Color = LightBlue
+DColor = DarkBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = LightBlue
+SBGDColor = DarkBlue
+STColor = White
+STDColor = GrayDark
+
+[SongMenuTextMenu]
+X =539
+Y =125
+Color=White
+Font =0
+Size =14
+Text=MENU
+Align=0
+Z=0.99
+
+[SongMenuStatic2]
+X =513
+Y =135
+W =21
+H =21
+Color =White
+Tex =IconSongMenu
+Type=Font Black
+Z=0.98
+
+[SongMenuStatic1]
+Tex =SongMenuBG
+X =498
+Y =120
+W =300
+H =200
+Z =0.94
+Int=1
+Color =DarkBlue
+Type=Font Black
+
+[SongJumpto]
+Texts=0
+Statics=1
+
+[SongJumptoStatic1]
+Tex =JumpToBG
+X =221
+Y =175
+W =355
+H =175
+Z =0.98
+Int=1
+Color =DarkBlue
+Type=Font Black
+
+[SongJumptoStatic2]
+X =234
+Y =185
+W =21
+H =21
+Color =White
+Tex =MainSearch
+Type=Font Black
+Z=0.99
+
+[SongJumptoText1]
+X =310
+Y =175
+Color=White
+Font =0
+Size =14
+Text=SONG_JUMPTO_TYPE_DESC
+Align=0
+Z=0.99
+
+[SongJumptoSelectSlideType]
+Tex = button
+TexSBG = mainicon
+#Text = SONG_JUMPTO_TYPE_DESC
+Font=1
+X = 242
+Y = 205
+Z = 0.99
+W = 0
+H = 30
+SkipX = 4
+SBGW= 300
+Fields=2
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = button
+SBGDColor = LightBlue
+STColor = White
+STDColor = LightBlue
+
+[SongJumptoButtonSearchText]
+X = 250
+Y = 215
+Z = 0.99
+W = 160
+H = 50
+Size=14
+Font=1
+Align=0
+
+[SongJumptoTextFound]
+X =234
+Y =295
+Color=White
+Font =0
+Size =8
+Text=SONG_JUMPTO_HELP
+Align=0
+Z=0.99
+
+
+
+################ Statistiken ######################
+
+
+[StatMain]
+Texts=0
+Statics=0
+
+[StatMainBackground]
+Tex=ScoreScreenBG
+
+[StatMainButtonScores]
+X =589
+Y =100
+W =190
+H =50
+Tex =MainBar
+Color =DarkBlue
+DColor = LightBlue
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonScoresText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SCORES
+Color=White
+
+[StatMainButtonSingers]
+X =589
+Y =160
+W =190
+H =50
+Tex =MainBar
+Color =DarkBlue
+DColor = LightBlue
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSingersText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SINGERS
+Color=White
+
+[StatMainButtonSongs]
+X =589
+Y =220
+W =190
+H =50
+Tex =MainBar
+Color =DarkBlue
+DColor = LightBlue
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSongsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_SONGS
+Color=White
+
+[StatMainButtonBands]
+X =589
+Y =280
+W =190
+H =50
+Tex =MainBar
+Color =DarkBlue
+DColor = LightBlue
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonBandsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_BANDS
+Color=White
+
+[StatMainButtonExit]
+X =589
+Y =340
+W =190
+H =50
+Tex =MainBar
+Color =DarkBlue
+DColor = LightBlue
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatMainTextOverview]
+X =45
+Y =125
+W =510
+Color=White
+Font =0
+Size =9
+Align=0
+Text=
+
+[StatMainStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =StatIcon
+Type=Font Black
+
+[StatMainStatic2]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[StatMainStatic3]
+X =388
+Y =580
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[StatMainStatic4]
+X =40
+Y =100
+W =520
+H =20
+Tex=StatMainBG1
+Color =ColorLight
+Type=Font Black
+
+[StatMainStatic5]
+X =40
+Y =120
+W =520
+H =300
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatMainStatic6]
+X =40
+Y =420
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+[StatMainText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=STAT_MAIN
+Align=0
+
+[StatMainText2]
+X =238
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=2
+Text=STAT_MAIN_WHEREAMI
+
+[StatMainText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=STAT_MAIN_DESC
+
+[StatMainText4]
+X =294
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatMainText5]
+X =418
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[StatDetail]
+Texts=0
+Statics=0
+
+[StatDetailBackground]
+Tex=ScoreScreenBG
+
+[StatDetailButtonNext]
+X =589
+Y =100
+W =190
+H =50
+Tex =MainBar
+Color =DarkBlue
+DColor = LightBlue
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonNextText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_NEXT
+Color=White
+
+[StatDetailButtonPrev]
+X =589
+Y =160
+W =190
+H =50
+Tex =MainBar
+Color =DarkBlue
+DColor = LightBlue
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonPrevText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_PREV
+Color=White
+
+[StatDetailButtonReverse]
+X =589
+Y =220
+W =190
+H =50
+Tex =MainBar
+Color =DarkBlue
+DColor = LightBlue
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonReverseText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_REVERSE
+Color=White
+
+[StatDetailButtonExit]
+X =589
+Y =280
+W =190
+H =50
+Tex =MainBar
+Color =DarkBlue
+DColor = LightBlue
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatDetailTextDescription]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=
+
+[StatDetailTextPage]
+X = 546
+Y = 98
+Color= Black
+Font = 0
+Size = 5
+Align=2
+Text=
+
+[StatDetailTextList1]
+X = 45
+Y = 122
+Color=White
+Font = 0
+Size = 7
+Text=Stat1
+
+[StatDetailTextList2]
+X = 45
+Y = 160
+Color=White
+Font = 0
+Size = 7
+Text=Stat2
+
+[StatDetailTextList3]
+X = 45
+Y = 198
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList4]
+X = 45
+Y = 236
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList5]
+X = 45
+Y = 274
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList6]
+X = 45
+Y = 312
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList7]
+X = 45
+Y = 350
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList8]
+X = 45
+Y = 388
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList9]
+X = 45
+Y = 426
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList10]
+X = 45
+Y = 464
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =StatIcon
+Type=Font Black
+
+[StatDetailStatic2]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[StatDetailStatic3]
+X =388
+Y =580
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[StatDetailStatic4]
+X =40
+Y =100
+W =520
+H =24
+Tex=StatDetailBG1
+Color =ColorLight
+Type=Font Black
+
+[StatDetailStatic5]
+X =40
+Y =124
+W =520
+H =376
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatDetailStatic6]
+X =40
+Y =500
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+
+[StatDetailText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=STAT_DETAIL
+Align=0
+
+[StatDetailText2]
+X =238
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=2
+Text=STAT_DETAIL_WHEREAMI
+
+[StatDetailText3]
+X =294
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatDetailText4]
+X =418
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[CheckPopup]
+Texts=1
+Statics=1
+
+[CheckPopupButton1]
+X = 285
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=JA
+Align=1
+Z=1
+
+[CheckPopupButton2]
+X = 415
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton2Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=NEIN
+Align=1
+Z=1
+
+[CheckPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[CheckPopupText1]
+X =282
+Y =147
+Color=White
+Font =0
+Size =10
+Text=MSG_QUESTION_TITLE
+Align=0
+Z=1
+
+[CheckPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =GrayPopup
+Type=Font Black
+
+[CheckPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[CheckPopupStatic3]
+Tex =IconQuestion
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopup]
+Texts=1
+Statics=1
+
+[ErrorPopupButton1]
+X = 350
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[ErrorPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=OK
+Align=1
+Z=1
+
+[ErrorPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[ErrorPopupText1]
+X =282
+Y =148
+Color=White
+Font =0
+Size =10
+Text=MSG_ERROR_TITLE
+Align=0
+Z=1
+
+[ErrorPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =GrayPopup
+Type=Font Black
+
+[ErrorPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopupStatic3]
+Tex =IconError
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black \ No newline at end of file
diff --git a/Game/Output/Themes/TODOs/White Sensation.ini b/Game/Output/Themes/TODOs/White Sensation.ini
new file mode 100644
index 00000000..c6f31419
--- /dev/null
+++ b/Game/Output/Themes/TODOs/White Sensation.ini
@@ -0,0 +1,7993 @@
+;1.0.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Theme]
+Name=White Sensation
+Creator=Charis
+
+[Colors]
+White = 255 255 255
+LightBlue = 119 187 210
+DarkBlue = 28 126 171
+LightRed = 170 146 146
+DarkRed = 155 113 113
+LightGreen = 136 168 136
+DarkGreen = 106 152 104
+LightPurple = 155 136 168
+DarkPurple = 145 104 152
+LightOrange = 168 155 136
+DarkOrange = 151 131 76
+LightYellow = 168 168 136
+DarkYellow = 150 151 76
+Turkis = 13 186 167
+GrayLightest = 223 223 223
+GrayLight = 191 191 191
+Gray = 127 127 127
+GrayDark = 63 63 63
+Black = 0 0 0
+GrayPopup = 51 51 51
+Gold = 255 223 31
+Silver = 223 223 223
+Bronze = 205 127 50
+
+[Loading]
+Texts =2
+Fade = 1
+
+[LoadingBackground]
+Tex=LoadingBG
+
+[LoadingText1]
+X =30
+Y =552
+Color =Black
+Font =0
+Align =0
+Size =7
+Text =SING_LOADING
+
+[LoadingText2]
+X =790
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=US_VERSION
+
+[Main]
+Texts =2
+Statics=4
+
+[MainBackground]
+Tex=MainMenuBG
+
+[MainStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic3]
+X =260
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[MainText2]
+X =295
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[MainStatic4]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[MainText1]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_MENU
+
+[MainTextDescriptionLong]
+X =418
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=
+
+[MainButtonSolo]
+X =100
+Y =320
+W =150
+H =50
+Tex =Button
+Color =GrayDark
+DColor =Gray
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=15
+DeSelectReflectionSpacing=280
+Fade=1
+FadeText=1
+SelectH=150
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[MainButtonSoloText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_SING
+Color=White
+
+[MainButtonMulti]
+X =255
+Y =320
+W =150
+H =50
+Tex =Button
+Color =GrayDark
+DColor =Gray
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=15
+DeSelectReflectionSpacing=280
+Fade=1
+FadeText=1
+SelectH=150
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[MainButtonMultiText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_MULTI
+Color=White
+
+[MainButtonCollection1]
+X =410
+Y =320
+W =150
+H =50
+Tex =Button
+Color =GrayDark
+DColor =Gray
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=15
+DeSelectReflectionSpacing=280
+Fade=1
+FadeText=0
+SelectH=150
+FadeTex=ButtonFade
+FadeTexPos=0
+FirstChild=3
+
+[MainButtonCollection1Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_TOOLS
+Color=White
+
+[MainButtonStats]
+X =415
+Y =360
+W =140
+H =30
+Tex =Rectangle
+Color =Gray
+DColor =GrayDark
+Type=Font Black
+Texts=1
+Reflection=0
+Parent=1
+
+[MainButtonStatsText1]
+X =70
+Y =3
+Font=0
+Size=8
+Align=1
+Text=SING_STATS
+Color=White
+
+[MainButtonEditor]
+X =415
+Y =395
+W =140
+H =30
+Tex =Rectangle
+Color =Gray
+DColor =GrayDark
+Type=Font Black
+Texts=1
+Reflection=0
+Parent=1
+
+[MainButtonEditorText1]
+X =70
+Y =3
+Font=0
+Size=8
+Align=1
+Text=SING_EDITOR
+Color=White
+
+[MainButtonOptions]
+X =415
+Y =430
+W =140
+H =30
+Tex =Rectangle
+Color =Gray
+DColor =GrayDark
+Type=Font Black
+Texts=1
+Reflection=0
+Parent=1
+
+[MainButtonOptionsText1]
+X =70
+Y =3
+Font=0
+Size=8
+Align=1
+Text=SING_OPTIONS
+Color=White
+
+[MainButtonExit]
+X =565
+Y =320
+W =150
+H =50
+Tex =Button
+Color =GrayDark
+DColor =Gray
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=15
+DeSelectReflectionSpacing=280
+Fade=1
+FadeText=1
+SelectH=150
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[MainButtonExitText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_EXIT
+Color=White
+
+[Song]
+Texts =3
+
+[SongBackground]
+Tex=SongBG
+
+[SongCover]
+X=303
+Y=155
+W=320
+H=190
+Style=5
+Reflections=1
+
+[SongEqualizer]
+Visible=1
+Direction=1
+Color=GrayDark
+Alpha=1
+X=255
+Y=514
+Z=1
+PieceW=6
+PieceH=6
+Space=1
+Bands=6
+Length=18
+
+[SongVideoIcon]
+X =299
+Y =487
+W =32
+H =32
+Z=1
+Color=White
+Tex =VideoIcon
+Type=Font Black
+
+[SongStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[SongStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[SongStatic3]
+X =250
+Y =150
+W =300
+H =200
+Z =0.5
+Color =GrayDark
+Tex =SongSelection1
+Type=Font Black
+
+[SongStatic4]
+X =298
+Y =350
+W =200
+H =170
+Z=0.98
+Color =GrayDark
+Tex =SongSelection2
+Type=Font Black
+
+[SongTextCat]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_SONG_SELECTION_DESC
+
+[SongTextArtist]
+X =400
+Y =350
+W = 190
+Color=White
+Font =1
+Size =9
+Align =1
+Text=
+
+[SongTextTitle]
+X =400
+Y =425
+W = 190
+Color=White
+Font =0
+Size =9
+Align =1
+Text=
+
+[SongTextNumber]
+X =490
+Y =495
+Color=White
+Font =0
+Size =8
+Align =2
+Text=
+
+#Variable statics and texts for song-screen in sing- and partymode
+# There can be an unlimited Number of Statics and Texts, As long
+# as the numbers are in order.
+# Statics that are shown in PartyMode Only are Named_
+# SongStaticParty[No]
+# Texts that are shown in PartyMode Only are Named_
+# SongTextParty[No]
+# Statics that are shown in Normal Mode Only are Named_
+# SongStaticNonParty[No]
+# Texts that are shown in Normal Mode Only are Named_
+# SongTextNonParty[No]
+#Here are the ones for singmode
+
+[SongStaticNonParty1]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =SongCD
+Type=Font Black
+
+[SongStaticNonParty2]
+X =260
+Y =553
+W =26
+H =22
+Tex=ButtonAlt
+Color =White
+Type=Font Black
+
+[SongStaticNonParty3]
+X =300
+Y =553
+W =26
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Font Black
+
+[SongStaticNonParty4]
+X =425
+Y =553
+W =22
+H =22
+Tex=ButtonM
+Color =White
+Type=Font Black
+
+[SongStaticNonParty5]
+X =515
+Y =553
+W =22
+H =22
+Tex=ButtonJ
+Color =White
+Type=Font Black
+
+[SongStaticNonParty6]
+X =679
+Y =553
+W =22
+H =22
+Tex=ButtonP
+Color =White
+Type=Font Black
+
+#Texts Non Party
+[SongTextNonParty1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_SONG_SELECTION
+Align=0
+
+[SongTextNonParty2]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_SONG_SELECTION_WHEREAMI
+
+[SongTextNonParty3]
+X =288
+Y =556
+Color=White
+Font =1
+Size =5
+Align=0
+Text=+
+
+[SongTextNonParty4]
+X =330
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_GOTO
+
+[SongTextNonParty5]
+X =450
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_MENU
+
+[SongTextNonParty6]
+X =540
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SONG_JUMPTO_DESC
+
+[SongTextNonParty7]
+X =705
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_PLAYLIST
+
+
+#and theese are the ones for partymode
+
+[SongStaticParty1]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[SongStaticParty2]
+X =260
+Y =553
+W =22
+H =22
+Tex=Button13
+Color =White
+Type=Font Black
+
+[SongStaticParty3]
+X =400
+Y =553
+W =22
+H =22
+Tex=ButtonM
+Color =White
+Type=Font Black
+
+[SongStaticParty4]
+X =540
+Y =553
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+#Texts for Party Mode
+
+[SongTextParty1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[SongTextParty2]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_SONG_WHEREAMI
+
+[SongTextParty3]
+X =288
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SONG_MENU_NAME_PARTY_JOKER
+
+[SongTextParty4]
+X =426
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_MENU
+
+[SongTextParty5]
+X =570
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_LEGEND_CONTINUE
+
+#variable statics end
+
+
+# Jokers, 5 for each team, only shown in party Mode
+[SongStaticTeam1Joker1]
+Tex =Joker
+X =530
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker2]
+Tex =Joker
+X =580
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker3]
+Tex =Joker
+X =630
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker4]
+Tex =Joker
+X =680
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker5]
+Tex =Joker
+X =730
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker1]
+Tex =Joker
+X =530
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker2]
+Tex =Joker
+X =580
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker3]
+Tex =Joker
+X =630
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker4]
+Tex =Joker
+X =680
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker5]
+Tex =Joker
+X =730
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker1]
+Tex =Joker
+X =530
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker2]
+Tex =Joker
+X =580
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker3]
+Tex =Joker
+X =630
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker4]
+Tex =Joker
+X =680
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker5]
+Tex =Joker
+X =730
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+
+[Sing]
+Texts =1
+
+;not used for this skin
+;[SingText1]
+;Text =SING_TIME
+;X =90
+;Y =200
+;Font =1
+;Size =6
+;Color =White
+;Align=1
+
+[SingStatic1]
+;TextBG
+Tex =LyricBar
+X =10
+Y =492
+W =780
+H =85
+Color =GrayLightest
+Type=Font Black
+
+[SingStatic2]
+;TimeBar
+Tex =TimeBar1
+X =9
+Y =577
+W =780
+H =16
+Color =GrayLightest
+Type=Font Black
+
+[SingTimeProgress]
+X =40
+Y =581
+W =680
+H =7
+Color=Gray
+
+[SingStatic3]
+;the thing behind the time progress
+Tex =TimeBar2
+X =40
+Y =581
+W =680
+H =7
+Color=Black
+Type=Font Black
+
+[SingTimeText]
+Text =SING_TIME
+X =750
+Y =576
+Font =1
+Size =6
+Color =GrayDark
+Align=1
+
+# O N E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#PlayerOne
+[SingP1Static]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P1Dark
+Type=Font Black
+
+[SingP1Text]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1Static2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P1Dark
+Type=Font Black
+
+[SingP1TextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1SingBar]
+X =680
+Y =316
+W =100
+H =6
+
+# T W O P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1TwoPStatic]
+Tex =P
+X =20
+Y =117
+W =33
+H =38
+Color =P1Dark
+Type=Font Black
+
+[SingP1TwoPText]
+Text =P1
+X =26
+Y =122
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1TwoPStatic2]
+Tex =ScoreBG
+X =680
+Y =102
+W =100
+H =34
+Color =P1Dark
+Type=Font Black
+
+[SingP1TwoPTextScore]
+Text =00000
+X =690
+Y =104
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1TwoPSingBar]
+X =680
+Y =136
+W =100
+H =8
+
+#Player Two
+[SingP2RStatic]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P2Dark
+Type=Font Black
+
+[SingP2RText]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP2RStatic2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P2Dark
+Type=Font Black
+
+[SingP2RTextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2RSingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T H R E E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1ThreePStatic]
+Tex =P
+X =16
+Y =59
+W =50
+H =54
+Color =P1Dark
+Type=Font Black
+
+[SingP1ThreePText]
+Text =P1
+X =27
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP1ThreePStatic2]
+Tex =ScoreBG
+X =75
+Y =61
+W =100
+H =34
+Color =P1Dark
+Type=Font Black
+
+[SingP1ThreePTextScore]
+Text =00000
+X =85
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1ThreePSingBar]
+X =75
+Y =95
+W =100
+H =8
+
+#Player Two
+[SingP2MStatic]
+Tex =P
+X =311
+Y =59
+W =50
+H =54
+Color =P2Dark
+Type=Font Black
+
+[SingP2MText]
+Text =P2
+X =321
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP2MStatic2]
+Tex =ScoreBG
+X =370
+Y =61
+W =100
+H =34
+Color =P2Dark
+Type=Font Black
+
+[SingP2MTextScore]
+Text =00000
+X =380
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2MSingBar]
+X =370
+Y =95
+W =100
+H =8
+
+#Player Three
+[SingP3RStatic]
+Tex =P
+X =611
+Y =59
+W =50
+H =54
+Color =P3Dark
+Type=Font Black
+
+[SingP3RText]
+Text =P3
+X =621
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP3RStatic2]
+Tex =ScoreBG
+X =670
+Y =61
+W =100
+H =34
+Color =P3Dark
+Type=Font Black
+
+[SingP3RTextScore]
+Text =00000
+X =680
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP3SingBar]
+X =670
+Y =95
+W =100
+H =8
+
+[Score]
+Texts =1
+
+[ScoreBackground]
+Tex=ScoreScreenBG
+
+[ScoreText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SONG_SCORE
+Align=0
+
+[ScoreTextArtistTitle]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=ArtistTitle
+
+[ScoreStatic1]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[ScoreStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreText2]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SONG_SCORE_WHEREAMI
+
+[ScoreStatic4]
+X =260
+Y =553
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[ScoreText3]
+X =290
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+#end of main stuff
+
+# # # # # # # # # # # # # # # # # # One Player Score # # # # # # # # # # # #
+[ScoreTextName1]
+X =175
+Y =260
+Font =0
+Size =14
+Text =P1
+Color =GrayDark
+Align=0
+
+[ScoreTextScore1]
+X =175
+Y =430
+Color=GrayDark
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes1]
+X =175
+Y =340
+Color=GrayDark
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore1]
+X =465
+Y =340
+Color=GrayDark
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextLineBonus1]
+X =175
+Y =370
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore1]
+X =465
+Y =370
+Color=GrayDark
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextGoldenNotes1]
+X =175
+Y =400
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore1]
+X =465
+Y =400
+Color=GrayDark
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextTotal1]
+X =205
+Y =460
+Color=GrayDark
+Font =0
+Size =14
+Text=SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore1]
+X =465
+Y =460
+Color=GrayDark
+Font =0
+Size =14
+Align =2
+Text =0
+
+#Lines
+[ScorePlayer1Static1]
+Tex =ScoreLine
+X =173
+Y =338
+W =295
+H =2
+Color =GrayDark
+Type =Font Black
+
+[ScorePlayer1Static2]
+Tex =ScoreLine
+X =173
+Y =368
+W =295
+H =2
+Color =GrayDark
+Type =Font Black
+
+[ScorePlayer1Static3]
+Tex =ScoreLine
+X =173
+Y =398
+W =295
+H =2
+Color =GrayDark
+Type =Font Black
+
+[ScorePlayer1Static4]
+Tex =ScoreLine
+X =173
+Y =428
+W =295
+H =2
+Color =GrayDark
+Type =Font Black
+
+[ScorePlayer1Static5]
+Tex =ScoreLine
+X =173
+Y =458
+W =295
+H =4
+Type =Font Black
+Color =GrayDark
+
+[ScoreStaticBoxDark1]
+Tex =PlayerNumberBox
+X =175
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Text1]
+X =179
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel1]
+Tex =ScoreLevel
+X =475
+Y =160
+W =150
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =130
+W =150
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel1]
+Tex =ScoreLevel
+X =475
+Y =410
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =380
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer1Static6]
+Tex =ScoreEndCap
+X =494
+Y =460
+W =112
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Static7]
+Tex =ScoreLine
+X =493
+Y =460
+W =114
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+
+# # # # # # # # # # # # # # # # # # Two Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName2]
+X =20
+Y =260
+Font =0
+Size =14
+Text =P1
+Color =GrayDark
+Align=0
+
+[ScoreTextScore2]
+X =20
+Y =430
+Color=GrayDark
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes2]
+X =20
+Y =340
+Color=GrayDark
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore2]
+X =300
+Y =340
+Color=GrayDark
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextLineBonus2]
+X =20
+Y =370
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore2]
+X =300
+Y =370
+Color=GrayDark
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextGoldenNotes2]
+X =20
+Y =400
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore2]
+X =300
+Y =400
+Color=GrayDark
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextTotal2]
+X =50
+Y =460
+Color=GrayDark
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore2]
+X =300
+Y =460
+Color=GrayDark
+Font =0
+Size =14
+Align =2
+Text =00000
+
+# Lines
+[ScorePlayer2Static1]
+Tex =ScoreLine
+X =20
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =GrayDark
+
+[ScorePlayer2Static2]
+Tex =ScoreLine
+X =20
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =GrayDark
+
+[ScorePlayer2Static3]
+Tex =ScoreLine
+X =20
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =GrayDark
+
+[ScorePlayer2Static4]
+Tex =ScoreLine
+X =20
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =GrayDark
+
+[ScorePlayer2Static5]
+Tex =ScoreLine
+X =20
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =GrayDark
+
+[ScoreStaticBoxDark2]
+Tex =PlayerNumberBox
+X =20
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Text1]
+X =24
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel2]
+Tex =ScoreLevel
+X =293
+Y =160
+W =120
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =130
+W =120
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScoreStaticLevel2]
+Tex =ScoreLevel
+X =293
+Y =410
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =380
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScorePlayer2Static6]
+Tex =ScoreEndCap
+X =308
+Y =460
+W =90
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Static7]
+Tex =ScoreLine
+X =307
+Y =460
+W =92
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# P L A Y E R T W O
+[ScoreTextName3]
+X =780
+Y =260
+Font =0
+Size =14
+Text =P2
+Color =GrayDark
+Align=2
+
+[ScoreTextScore3]
+X =780
+Y =430
+Color=GrayDark
+Font =1
+Size =9
+Text =Tone Deaf
+Align=2
+
+[ScoreTextNotes3]
+X =780
+Y =340
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_NOTES
+Align=2
+
+[ScoreTextNotesScore3]
+X =500
+Y =340
+Color=GrayDark
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextLineBonus3]
+X =780
+Y =370
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=2
+
+[ScoreTextLineBonusScore3]
+X =500
+Y =370
+Color=GrayDark
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextGoldenNotes3]
+X =780
+Y =400
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=2
+
+[ScoreTextGoldenNotesScore3]
+X =500
+Y =400
+Color=GrayDark
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextTotal3]
+X =750
+Y =460
+Color=GrayDark
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=2
+Reflection=1
+ReflectionSpacing=4
+
+[ScoreTextTotalScore3]
+X =500
+Y =460
+Color=GrayDark
+Font =0
+Size =14
+Align =0
+Text =00000
+Reflection=1
+ReflectionSpacing=4
+
+#Lines
+[ScorePlayer3Static1]
+Tex =ScoreLine
+X =500
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =GrayDark
+
+[ScorePlayer3Static2]
+Tex =ScoreLine
+X =500
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =GrayDark
+
+[ScorePlayer3Static3]
+Tex =ScoreLine
+X =500
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =GrayDark
+
+[ScorePlayer3Static4]
+Tex =ScoreLine
+X =500
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =GrayDark
+
+[ScorePlayer3Static5]
+Tex =ScoreLine
+X =500
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =GrayDark
+
+[ScoreStaticBoxDark3]
+Tex =PlayerNumberBox
+X =755
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Text1]
+X =759
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+#ScoreBar
+[ScoreStaticBackLevel3]
+Tex =ScoreLevel
+X =387
+Y =160
+W =120
+H =300
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =130
+W =120
+H =30
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel3]
+Tex =ScoreLevel
+X =387
+Y =410
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =380
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScorePlayer3Static6]
+Tex =ScoreEndCap
+X =402
+Y =460
+W =90
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Static7]
+Tex =ScoreLine
+X =401
+Y =460
+W =92
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# # # # # # # # # # # # # # # # # # Three Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName4]
+X=20
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P1
+Color=P1Dark
+
+[ScoreTextNotes4]
+X=20
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=GrayDark
+
+[ScoreTextNotesScore4]
+X=260
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextLineBonus4]
+X=20
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=GrayDark
+
+[ScoreTextLineBonusScore4]
+X=260
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextGoldenNotes4]
+X=20
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=GrayDark
+
+[ScoreTextGoldenNotesScore4]
+X=260
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextScore4]
+X=20
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=GrayDark
+
+[ScoreTextTotal4]
+X=47
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=GrayDark
+
+[ScoreTextTotalScore4]
+X=260
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=GrayDark
+
+[ScoreStaticBoxDark4]
+Tex =PlayerNumberBox
+X =20
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer4Text1]
+X =24
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#lines
+[ScorePlayer4Static1]
+X=20
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+
+[ScorePlayer4Static2]
+X=20
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+
+[ScorePlayer4Static3]
+X=20
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+
+[ScorePlayer4Static4]
+X=20
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+
+[ScorePlayer4Static5]
+X=20
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+
+# P L A Y E R T W O
+[ScoreTextName5]
+X=280
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P2
+Color=P2Dark
+
+[ScoreTextNotes5]
+X=280
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=GrayDark
+
+[ScoreTextNotesScore5]
+X=520
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextLineBonus5]
+X=280
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=GrayDark
+
+[ScoreTextLineBonusScore5]
+X=520
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextGoldenNotes5]
+X=280
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=GrayDark
+
+[ScoreTextGoldenNotesScore5]
+X=520
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextScore5]
+X=280
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=GrayDark
+
+[ScoreTextTotal5]
+X=307
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=GrayDark
+
+[ScoreTextTotalScore5]
+X=520
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=GrayDark
+
+[ScoreStaticBoxDark5]
+Tex =PlayerNumberBox
+X =280
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer5Text1]
+X =284
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+[ScorePlayer5Static1]
+X=280
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+
+[ScorePlayer5Static2]
+X=280
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+
+[ScorePlayer5Static3]
+X=280
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+
+[ScorePlayer5Static4]
+X=280
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static5]
+X=280
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+
+# P L A Y E R T H R E E
+[ScoreTextName6]
+X=540
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P3
+Color=P3Dark
+
+[ScoreTextNotes6]
+X=540
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=GrayDark
+
+[ScoreTextNotesScore6]
+X=780
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextLineBonus6]
+X=540
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=GrayDark
+
+[ScoreTextLineBonusScore6]
+X=780
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextGoldenNotes6]
+X=540
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=GrayDark
+
+[ScoreTextGoldenNotesScore6]
+X=780
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextScore6]
+X=540
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=GrayDark
+
+[ScoreTextTotal6]
+X=567
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=GrayDark
+
+[ScoreTextTotalScore6]
+X=780
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=GrayDark
+
+[ScoreStaticBoxDark6]
+Tex =PlayerNumberBox
+X =540
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P3Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer6Text1]
+X =544
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P3
+
+#lines
+[ScorePlayer6Static1]
+X=540
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+
+[ScorePlayer6Static2]
+X=540
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+
+[ScorePlayer6Static3]
+X=540
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+
+[ScorePlayer6Static4]
+X=540
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+
+[ScorePlayer6Static5]
+X=540
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+
+[Options]
+Texts = 6
+Fade = 2
+
+[OptionsBackground]
+Tex=OptionsBG
+
+[OptionsStatic1]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic4]
+X =260
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsStatic6]
+X =512
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsText2]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_WHEREAMI
+
+[OptionsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_DESC
+
+[OptionsText4]
+X =294
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsText5]
+X =418
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_SELECT
+
+[OptionsText6]
+X =538
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsButtonGame]
+X =100
+Y =215
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =Gray
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonGameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_GAME
+Color=White
+
+[OptionsButtonGraphics]
+X =255
+Y =215
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =Gray
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonGraphicsText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_GRAPHICS
+Color=White
+
+[OptionsButtonSound]
+X =410
+Y =215
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =Gray
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonSoundText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_SOUND
+Color=White
+
+[OptionsButtonLyrics]
+X =565
+Y =215
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =Gray
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonLyricsText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_LYRICS
+Color=White
+
+[OptionsButtonThemes]
+X =100
+Y =335
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =Gray
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonThemesText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_THEMES
+Color=White
+
+[OptionsButtonRecord]
+X =255
+Y =335
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =Gray
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonRecordText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_RECORD
+Color=White
+Texts=1
+
+[OptionsButtonAdvanced]
+X =410
+Y =335
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =Gray
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonAdvancedText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_ADVANCED
+Color=White
+Texts=1
+
+[OptionsButtonExit]
+X =565
+Y =335
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =Gray
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonExitText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[OptionsGame]
+Texts = 5
+
+[OptionsGameBackground]
+Tex=OptionsBG
+
+[OptionsGameStatic1]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGameStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGameStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGameStatic4]
+X =260
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsGameStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsGameText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGameText2]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GAME_WHEREAMI
+
+[OptionsGameText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GAME_DESC
+
+[OptionsGameText4]
+X =294
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGameText5]
+X =418
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGameSelectPlayers]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_PLAYERS
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor =Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDifficulty]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DIFFICULTY
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor =Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+
+[OptionsGameSelectSlideLanguage]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_LANGUAGE
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor =Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectTabs]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_TABS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor =Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectSlideSorting]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_SORTING
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor =Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDebug]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DEBUG
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor =Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor =Gray
+Type = Font Black
+
+[OptionsGraphics]
+Texts = 5
+
+[OptionsGraphicsBackground]
+Tex=OptionsBG
+
+[OptionsGraphicsStatic1]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGraphicsStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic4]
+X =260
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsGraphicsStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsGraphicsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGraphicsText2]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GRAPHICS_WHEREAMI
+
+[OptionsGraphicsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GRAPHICS_DESC
+
+[OptionsGraphicsText4]
+X =294
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGraphicsText5]
+X =418
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGraphicsSelectSlideResolution]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_GRAPHICS_RESOLUTION
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectFullscreen]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_FULLSCREEN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectDepth]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_DEPTH
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectOscilloscope]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_OSCILLOSCOPE
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectMovieSize]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_MOVIE_SIZE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsButtonExit]
+X = 40
+Y = 360
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsSound]
+Texts = 5
+
+[OptionsSoundBackground]
+Tex=OptionsBG
+
+[OptionsSoundStatic1]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsSoundStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic4]
+X =260
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsSoundStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsSoundText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsSoundText2]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_SOUND_WHEREAMI
+
+[OptionsSoundText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_SOUND_DESC
+
+[OptionsSoundText4]
+X =294
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsSoundText5]
+X =418
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsSoundSelectMicBoost]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_MIC_BOOST
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectClickAssist]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_CLICK_ASSIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectBeatClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_BEAT_CLICK
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectThreshold]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_THRESHOLD
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectTwoPlayerMode]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_TWO_PLAYERS_MODE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewVolume]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWVOLUME
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewFADING]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWFADING
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsLyrics]
+Texts = 1
+
+[OptionsLyricsBackground]
+Tex=OptionsBG
+
+[OptionsLyricsStatic1]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsLyricsStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic4]
+X =260
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsLyricsStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsLyricsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsLyricsText2]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_LYRICS_WHEREAMI
+
+[OptionsLyricsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_LYRICS_DESC
+
+[OptionsLyricsText4]
+X =294
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsLyricsText5]
+X =418
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsLyricsSelectLyricsFont]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_FONT
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectLyricsEffect]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_EFFECT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectSolmization]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_SOLMIZATION
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsThemes]
+Texts = 5
+
+[OptionsThemesBackground]
+Tex=OptionsBG
+
+[OptionsThemesStatic1]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsThemesStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic4]
+X =260
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsThemesStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsThemesText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsThemesText2]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_THEMES_WHEREAMI
+
+[OptionsThemesText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_THEMES_DESC
+
+[OptionsThemesText4]
+X =294
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsThemesText5]
+X =418
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsThemesSelectTheme]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_THEME
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectSkin]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_SKIN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectColor]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_COLOR
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsRecord]
+Texts = 5
+
+[OptionsRecordBackground]
+Tex=OptionsBG
+
+[OptionsRecordStatic1]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsRecordStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic4]
+X =260
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsRecordStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsRecordText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsRecordText2]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_RECORD_WHEREAMI
+
+[OptionsRecordText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_RECORD_DESC
+
+[OptionsRecordText4]
+X =294
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsRecordText5]
+X =418
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsRecordSelectSlideCard]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CARD
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideInput]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_INPUT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelL]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELL
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelR]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELR
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordButtonExit]
+X = 40
+Y = 305
+W = 230
+H = 70
+Tex = MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsAdvanced]
+Texts = 5
+
+[OptionsAdvancedBackground]
+Tex=OptionsBG
+
+[OptionsAdvancedStatic1]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsAdvancedStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic4]
+X =260
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsAdvancedStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsAdvancedText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsAdvancedText2]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_ADVANCED_WHEREAMI
+
+[OptionsAdvancedText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_ADVANCED_DESC
+
+[OptionsAdvancedText4]
+X =294
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsAdvancedText5]
+X =418
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+
+#########unused at the moment#########
+#[OptionsAdvancedSelectLoadAnimation]
+#Tex =MainBar
+#TexSBG =SelectBG
+#Text=SING_OPTIONS_ADVANCED_LOADANIMATION
+#X = 40
+#Y = 85
+#W = 230
+#H = 70
+#SkipX = 50
+
+#Color = ColorDark
+#DColor = Gray
+#TColor = White
+#TDColor = White
+#SBGTex =MainBar
+#SBGColor = ColorDark
+#SBGDColor = Gray
+#STColor = White
+#STDColor = GrayDark
+
+[OptionsAdvancedSelectScreenFade]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_SCREENFADE
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectEffectSing]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_EFFECTSING
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectLineBonus]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_LINEBONUS
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectSlideOnSongClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_ADVANCED_ONSONGCLICK
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectAskbeforeDel]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_ASKBEFOREDEL
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectPartyPopup]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_PARTYPOPUP
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[Top5]
+Texts=1
+
+[Top5Background]
+Tex=Top5BG
+
+[Top5Text1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Align=0
+Text =SING_TOP_5_CHARTS
+
+[Top5TextArtistTitle]
+X =70
+Y =53
+Color =White
+Font =0
+Size =10
+Align =0
+Text =artist - title
+
+[Top5Text4]
+X =70
+Y =73
+Color=GrayDark
+Font =0
+Size =10
+Align=0
+Text =SING_OPTIONS_GAME_DIFFICULTY
+
+[Top5TextLevel]
+X =270
+Y =73
+Color =GrayDark
+Font =0
+Size =10
+Align =1
+Text =easy
+
+[Top5Static1]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[Top5Static2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[Top5Static3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[Top5Text2]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_TOP_5_CHARTS_WHEREAMI
+
+[Top5Static4]
+X =260
+Y =553
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[Top5Text3]
+X =290
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_TOP_5_CHARTS_CONTINUE
+
+[Top5TextName1]
+X =150
+Y =190
+Color =Gray
+Font =0
+Size =14
+Align =0
+Text =1. Player1
+
+[Top5TextName2]
+X =150
+Y =240
+Color =Gray
+Font =0
+Size =14
+Align =0
+Text =2. Player2
+
+[Top5TextName3]
+X =150
+Y =290
+Color =Gray
+Font =0
+Size =14
+Align =0
+Text =3. Player3
+
+[Top5TextName4]
+X =150
+Y =340
+Color =Gray
+Font =0
+Size =14
+Align =0
+Text =4. Player4
+
+[Top5TextName5]
+X =150
+Y =390
+Color =Gray
+Font =0
+Size =14
+Align =0
+Text =5. Player5
+
+[Top5TextScore1]
+X =680
+Y =190
+Color =GrayDark
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore2]
+X =680
+Y =240
+Color =GrayDark
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore3]
+X =680
+Y =290
+Color =GrayDark
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore4]
+X =680
+Y =340
+Color =GrayDark
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore5]
+X =680
+Y =390
+Color =GrayDark
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextNumber1]
+X =120
+Y =193
+Color =White
+Font =1
+Size =9
+Align =1
+Text =1
+
+[Top5TextNumber2]
+X =120
+Y =243
+Color =White
+Font =1
+Size =9
+Align =1
+Text =2
+
+[Top5TextNumber3]
+X =120
+Y =293
+Color =White
+Font =1
+Size =9
+Align =1
+Text =3
+
+[Top5TextNumber4]
+X =120
+Y =343
+Color =White
+Font =1
+Size =9
+Align =1
+Text =4
+
+[Top5TextNumber5]
+X =120
+Y =393
+Color =White
+Font =1
+Size =9
+Align =1
+Text =5
+
+[Top5StaticNumber1]
+Tex=PlayerNumberBox
+X=100
+Y=186
+W=40
+H=40
+Color=GrayDark
+Type=Font Black
+
+[Top5StaticNumber2]
+Tex=PlayerNumberBox
+X=100
+Y=236
+W=40
+H=40
+Color=GrayDark
+Type=Font Black
+
+[Top5StaticNumber3]
+Tex=PlayerNumberBox
+X=100
+Y=286
+W=40
+H=40
+Color=GrayDark
+Type=Font Black
+
+[Top5StaticNumber4]
+Tex=PlayerNumberBox
+X=100
+Y=336
+W=40
+H=40
+Color=GrayDark
+Type=Font Black
+
+[Top5StaticNumber5]
+Tex=PlayerNumberBox
+X=100
+Y=386
+W=40
+H=40
+Color=GrayDark
+Type=Font Black
+
+[Level]
+Texts=5
+
+[LevelBackground]
+Tex=MainBG
+
+[LevelStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[LevelStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[LevelStatic3]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =MainIcon
+Type=Font Black
+
+[LevelStatic4]
+X =260
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[LevelStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[LevelText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=SING_MODE
+
+[LevelText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_DIFFICULTY_DESC
+
+[LevelText3]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_DIFFICULTY_WHEREAMI
+
+[LevelText4]
+X =294
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[LevelText5]
+X =418
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_DIFFICULTY_CONTINUE
+
+[LevelButtonEasy]
+X =180
+Y =270
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =Gray
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[LevelButtonMedium]
+X =335
+Y =270
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =Gray
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[LevelButtonHard]
+X =490
+Y =270
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =Gray
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[LevelButtonEasyText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=SING_EASY
+
+[LevelButtonMediumText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=SING_MEDIUM
+
+[LevelButtonHardText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=SING_HARD
+
+[Name]
+Texts=2
+
+[NameBackground]
+Tex=MainBG
+
+[NameStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[NameStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[NameStatic3]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =MainIcon
+Type=Font Black
+
+[NameText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=SING_MODE
+
+[NameText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_PLAYER_DESC
+
+[NameText3]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_PLAYER_WHEREAMI
+
+[NameStatic4]
+X =260
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[NameText4]
+X =294
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[NameStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Font Black
+Style=5
+
+[NameText5]
+X =418
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_PLAYER_ENTER_NAME
+
+[NameStatic6]
+X =556
+Y =553
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[NameText6]
+X =586
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[NameButtonPlayer1]
+X =180
+Y =270
+W =150
+H =50
+Tex =Button
+Color =P1Dark
+DColor =DarkBlue
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer1Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer2]
+X =335
+Y =270
+W =150
+H =50
+Tex =Button
+Color =P2Dark
+DColor =DarkRed
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer2Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer3]
+X =490
+Y =270
+W =150
+H =50
+Tex =Button
+Color =P3Dark
+DColor =DarkGreen
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer3Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer4]
+X =180
+Y =400
+W =150
+H =50
+Tex =Button
+Color =P4Dark
+DColor =DarkPurple
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer4Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer5]
+X =335
+Y =400
+W =150
+H =50
+Tex =Button
+Color =P5Dark
+DColor =Bronze
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer5Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer6]
+X =490
+Y =400
+W =150
+H =50
+Tex =Button
+Color =P6Dark
+DColor =DarkYellow
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer6Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[PartyNewRound]
+Texts =7
+
+[PartyNewRoundBackground]
+Tex=MainBG
+
+[PartyNewRoundStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic3]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyNewRoundText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyNewRoundText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_ROUND_DESC
+
+[PartyNewRoundText3]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_ROUND_WHEREAMI
+
+[PartyNewRoundText4]
+X =290
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=PARTY_ROUND_LEGEND_CONTINUE
+
+[PartyNewRoundText5]
+X =460
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND
+Align=0
+
+[PartyNewRoundText6]
+X =600
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND_WINNER
+Align=0
+
+[PartyNewRoundText7]
+X =448
+Y =350
+Color =White
+Font =0
+Size =18
+Text =PARTY_ROUND
+Align=2
+
+[PartyNewRoundTextTeam1Players]
+X =30
+Y =137
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam2Players]
+X =30
+Y =218
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam3Players]
+X =30
+Y =299
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundStatic4]
+Tex =PartyRoundBG1
+X =450
+Y =103
+W = 330
+H = 24
+Int=1
+Color =GrayDark
+Type=Font Black
+
+[PartyNewRoundStatic5]
+X =260
+Y =553
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[PartyNewRoundStatic6]
+Tex =PartyRoundBG3
+X =25
+Y =350
+W =750
+H = 50
+Int=1
+Color =GrayDark
+Type=Font Black
+
+[PartyNewRoundStatic7]
+Tex =PartyRoundBG4
+X =25
+Y =495
+W =750
+H = 30
+Int=1
+Color =Gray
+Type=Font Black
+
+[PartyNewRoundStaticTeam1]
+Tex =PartyTeamButton1
+X =20
+Y =110
+W =400
+H =50
+Int=1
+Color =P1Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam2]
+Tex =PartyTeamButton1
+X =20
+Y =191
+W =400
+H =50
+Int=1
+Color =P2Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam3]
+Tex =PartyTeamButton1
+X =20
+Y =272
+W =400
+H =50
+Int=1
+Color =P3Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticNextPlayer1]
+Tex=PartyPlayerButton
+X=155
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer2]
+Tex=PartyPlayerButton
+X=325
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer3]
+Tex=PartyPlayerButton
+X=495
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyNewRoundTextRound1]
+X =460
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Round 1
+Align=0
+
+[PartyNewRoundTextRound2]
+X =460
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Round 2
+Align=0
+
+[PartyNewRoundTextRound3]
+X =460
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Round 3
+Align=0
+
+[PartyNewRoundTextRound4]
+X =460
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Round 4
+Align=0
+
+[PartyNewRoundTextRound5]
+X =460
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Round 5
+Align=0
+
+[PartyNewRoundTextRound6]
+X =460
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Round 6
+Align=0
+
+[PartyNewRoundTextRound7]
+X =460
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Round 7
+Align=0
+
+[PartyNewRoundTextWinner1]
+X =600
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Winner 1
+Align=0
+
+[PartyNewRoundTextWinner2]
+X =600
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Winner 2
+Align=0
+
+[PartyNewRoundTextWinner3]
+X =600
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Winner 3
+Align=0
+
+[PartyNewRoundTextWinner4]
+X =600
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Winner 4
+Align=0
+
+[PartyNewRoundTextWinner5]
+X =600
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Winner 5
+Align=0
+
+[PartyNewRoundTextWinner6]
+X =600
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Winner 6
+Align=0
+
+[PartyNewRoundTextWinner7]
+X =600
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Winner 7
+Align=0
+
+[PartyNewRoundStaticRound1]
+Tex =PartyRoundBG2
+X =450
+Y =135
+W = 330
+H = 20
+Color =Gray
+Type =Font Black
+
+[PartyNewRoundStaticRound2]
+Tex =PartyRoundBG2
+X =450
+Y =164
+W = 330
+H = 20
+Color =Gray
+Type =Font Black
+
+[PartyNewRoundStaticRound3]
+Tex =PartyRoundBG2
+X =450
+Y =193
+W = 330
+H = 20
+Color =Gray
+Type =Font Black
+
+[PartyNewRoundStaticRound4]
+Tex =PartyRoundBG2
+X =450
+Y =222
+W = 330
+H = 20
+Color =Gray
+Type =Font Black
+
+[PartyNewRoundStaticRound5]
+Tex =PartyRoundBG2
+X =450
+Y =251
+W = 330
+H = 20
+Color =Gray
+Type =Font Black
+
+[PartyNewRoundStaticRound6]
+Tex =PartyRoundBG2
+X =450
+Y =280
+W = 330
+H = 20
+Color =Gray
+Type =Font Black
+
+[PartyNewRoundStaticRound7]
+Tex =PartyRoundBG2
+X =450
+Y =309
+W = 330
+H = 20
+Color =Gray
+Type =Font Black
+
+[PartyNewRoundTextNextRound]
+X =400
+Y =495
+Color =White
+Font =0
+Size =10
+Text =Next Round
+Align=1
+
+[PartyNewRoundTextNextRoundNo]
+X =457
+Y =350
+Color =White
+Font =0
+Size =18
+Text =99
+Align=0
+
+[PartyNewRoundTextScoreTeam1]
+X =390
+Y =110
+Color =White
+Font =0
+Size =17
+Text =3000
+Align=1
+
+[PartyNewRoundTextScoreTeam2]
+X =390
+Y =191
+Color =White
+Font =0
+Size =17
+Text =2000
+Align=1
+
+[PartyNewRoundTextScoreTeam3]
+X =390
+Y =272
+Color =White
+Font =0
+Size =17
+Text =1000
+Align=1
+
+[PartyNewRoundTextNameTeam1]
+X =30
+Y =108
+Color =White
+Font =0
+Size =12
+Text =Team 1
+Align=0
+
+[PartyNewRoundTextNameTeam2]
+X =30
+Y =189
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyNewRoundTextNameTeam3]
+X =30
+Y =270
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyNewRoundTextNextPlayer1]
+X =230
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 1
+Align=1
+
+[PartyNewRoundTextNextPlayer2]
+X =400
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 2
+Align=1
+
+[PartyNewRoundTextNextPlayer3]
+X =570
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 3
+Align=1
+
+
+[PartyScore]
+Texts=5
+
+[PartyScoreBackground]
+Tex=PartyBG
+
+[PartyScoreDecoTextures]
+ChangeTextures =1
+
+FirstTexture =PartyScoreDeco
+FirstTyp =Font Black
+FirstColor =Gold
+
+SecondTexture =PartyScoreDeco
+SecondTyp =Font Black
+SecondColor =Silver
+
+ThirdTexture =PartyScoreDeco
+ThirdTyp =Font Black
+ThirdColor =Bronze
+
+[PartyScoreStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic3]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyScoreStatic4]
+X =260
+Y =553
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[PartyScoreText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyScoreText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_SCORE_DESC
+
+[PartyScoreText3]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_SCORE_WHEREAMI
+
+[PartyScoreText4]
+X =290
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=PARTY_LEGEND_CONTINUE
+
+[PartyScoreStatic5]
+Tex =PartyScoreBG1
+X =50
+Y =100
+W = 700
+H = 80
+Int=1
+Color =GrayDark
+Type=Font Black
+
+[PartyScoreStatic6]
+Tex =PartyScoreBG2
+X =50
+Y =495
+W = 700
+H = 20
+Int=1
+Color =Gray
+Type=Font Black
+
+[PartyScoreText5]
+X =400
+Y =136
+Color =White
+Font =0
+Size =15
+Text =PARTY_SCORE_WINS2
+Align=1
+
+[PartyScoreTextWinner]
+X =400
+Y =98
+Color =White
+Font =0
+Size =18
+Text =The Winner is...
+Align=1
+
+[PartyScoreTextScoreTeam1]
+X =568
+Y =198
+Color =White
+Font =0
+Size =12
+Text =3000
+Align=2
+
+[PartyScoreTextScoreTeam2]
+X =568
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyScoreTextScoreTeam3]
+X =568
+Y =398
+Color =White
+Font =0
+Size =12
+Text =1000
+Align=2
+
+[PartyScoreTextNameTeam1]
+X =188
+Y =198
+Font=0
+Size=12
+Align=0
+Text=Team 1
+Color=White
+
+[PartyScoreTextNameTeam2]
+X =188
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyScoreTextNameTeam3]
+X =188
+Y =398
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyScoreStaticTeam1]
+X =188
+Y =230
+W =380
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam1BG]
+Tex=PartyTeamButton2
+X=178
+Y=200
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam1Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 191
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam2]
+X =188
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam2BG]
+Tex=PartyTeamButton2
+X=178
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam2Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam3]
+X =188
+Y =430
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam3BG]
+Tex=PartyTeamButton2
+X=178
+Y=400
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam3Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 391
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyWin]
+Texts=4
+
+[PartyWinBackground]
+Tex=PartyBG
+
+[PartyWinStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic3]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyWinStatic4]
+X =260
+Y =553
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[PartyWinText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyWinText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_WIN_DESC
+
+[PartyWinText3]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_WIN_WHEREAMI
+
+[PartyWinText4]
+X =290
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=PARTY_WIN_LEGEND_CONTINUE
+
+#[PartyWinTextWinner]
+#X =150
+#Y =120
+#Color =White
+#Font =1
+#Size =14
+#Text =The Winner is...
+#Align=0
+
+[PartyWinTextScoreTeam1]
+X =699
+Y =183
+Color =White
+Font =0
+Size =19
+Text =3000
+Align=2
+
+[PartyWinTextScoreTeam2]
+X =669
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyWinTextScoreTeam3]
+X =649
+Y =398
+Color =White
+Font =0
+Size =9
+Text =1000
+Align=2
+
+[PartyWinTextNameTeam1]
+X =169
+Y =183
+Font=0
+Size=19
+Align=0
+Text=Team 1
+Color=White
+
+[PartyWinTextNameTeam2]
+X =289
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyWinTextNameTeam3]
+X =369
+Y =398
+Color =White
+Font =0
+Size =9
+Text =Team 3
+Align=0
+
+[PartyWinStaticTeam1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BG]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank2]
+Tex=PartyTeamButton3
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank3]
+Tex=PartyTeamButton3
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyWinStaticTeam1Deco]
+Tex =PartyWinDeco1
+X = 91
+Y = 176
+W = 79
+H = 79
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BG]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamButton3
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank1]
+Tex=PartyTeamButton4
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank2]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank3]
+Tex=PartyTeamButton4
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Deco]
+Tex =PartyWinDeco2
+X = 226
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Silver
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BG]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank2]
+Tex=PartyTeamButton5
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank3]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Deco]
+Tex =PartyWinDeco3
+X = 316
+Y = 391
+W = 54
+H = 54
+Type =Font Black
+Color =Bronze
+Reflection=1
+ReflectionSpacing=3
+
+[PartyOptions]
+Texts = 5
+
+[PartyOptionsBackground]
+Tex=PartyBG
+
+[PartyOptionsStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsStatic3]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyOptionsStatic4]
+X =260
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[PartyOptionsStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[PartyOptionsText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyOptionsText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_OPTIONS_DESC
+
+[PartyOptionsText3]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_OPTIONS_WHEREAMI
+
+[PartyOptionsText4]
+X =294
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyOptionsText5]
+X =418
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[PartyOptionsSelectLevel]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_DIFFICULTY
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectRounds]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_ROUNDS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectTeams]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers1]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER1
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER2
+X = 40
+Y = 415
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers3]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER3
+X = 40
+Y = 470
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+
+
+[PartyPlayer]
+Texts=6
+
+[PartyPlayerBackground]
+Tex=PartyBG
+
+[PartyPlayerStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerStatic3]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyPlayerStatic4]
+X =260
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerStatic6]
+X =556
+Y =553
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyPlayerText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_PLAYER_DESC
+
+[PartyPlayerText3]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_PLAYER_WHEREAMI
+
+[PartyPlayerText4]
+X =294
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyPlayerText5]
+X =418
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_ENTER_NAME
+
+[PartyPlayerText6]
+X =586
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_LEGEND_CONTINUE
+
+[PartyPlayerTeam1Name]
+Tex=PartyTeamButton2
+X=85
+Y=100
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P1Dark
+DColor =DarkBlue
+
+[PartyPlayerTeam1NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 1
+Color=White
+
+[PartyPlayerPlayer1Name]
+Tex=Button
+X=85
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Dark
+DColor =DarkBlue
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer1NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 1
+Color=White
+
+[PartyPlayerPlayer2Name]
+Tex=Button
+X=245
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Dark
+DColor =DarkBlue
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer2NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 2
+Color=White
+
+[PartyPlayerPlayer3Name]
+Tex=Button
+X=405
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Dark
+DColor =DarkBlue
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer3NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 3
+Color=White
+
+[PartyPlayerPlayer4Name]
+Tex=Button
+X=565
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Dark
+DColor =DarkBlue
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer4NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 4
+Color=White
+
+[PartyPlayerTeam2Name]
+Tex=PartyTeamButton2
+X=85
+Y=240
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P2Dark
+DColor =DarkRed
+
+[PartyPlayerTeam2NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 2
+Color=White
+
+[PartyPlayerPlayer5Name]
+Tex=Button
+X=85
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Dark
+DColor =DarkRed
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer5NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 5
+Color=White
+
+[PartyPlayerPlayer6Name]
+Tex=Button
+X=245
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Dark
+DColor =DarkRed
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer6NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 6
+Color=White
+
+[PartyPlayerPlayer7Name]
+Tex=Button
+X=405
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Dark
+DColor =DarkRed
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer7NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 7
+Color=White
+
+[PartyPlayerPlayer8Name]
+Tex=Button
+X=565
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Dark
+DColor =DarkRed
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer8NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 8
+Color=White
+
+[PartyPlayerTeam3Name]
+Tex=Button
+Tex=PartyTeamButton2
+X=85
+Y=380
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P3Dark
+DColor =DarkGreen
+
+[PartyPlayerTeam3NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 3
+Color=White
+
+[PartyPlayerPlayer9Name]
+Tex=Button
+X=85
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Dark
+DColor =DarkGreen
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer9NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 9
+Color=White
+
+[PartyPlayerPlayer10Name]
+Tex=Button
+X=245
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Dark
+DColor =DarkGreen
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer10NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 10
+Color=White
+
+[PartyPlayerPlayer11Name]
+Tex=Button
+X=405
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Dark
+DColor =DarkGreen
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer11NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 11
+Color=White
+
+[PartyPlayerPlayer12Name]
+Tex=Button
+X=565
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Dark
+DColor =DarkGreen
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer12NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 12
+Color=White
+
+
+[SongMenu]
+Texts=0
+Statics=1
+
+[SongMenuButton1]
+X = 510
+Y = 165
+W = 270
+H = 25
+Tex =Rectangle
+Color =Gray
+DColor =GrayDark
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton1Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_PLAY
+Align=0
+Z=0.99
+
+[SongMenuButton2]
+X = 510
+Y = 195
+W = 270
+H = 25
+Tex =Rectangle
+Color =Gray
+DColor =GrayDark
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton2Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_EDIT
+Align=0
+Z=0.99
+
+[SongMenuButton3]
+X = 510
+Y = 225
+W = 270
+H = 25
+Tex =Rectangle
+Color =GrayLight
+DColor =GrayDark
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton3Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_MODI
+Align=0
+Z=0.99
+
+[SongMenuButton4]
+X = 510
+Y = 255
+W = 270
+H = 25
+Tex = Rectangle
+Color =Gray
+DColor =GrayDark
+Type=Font Black
+Texts=1
+Z = 0.98
+
+[SongMenuButton4Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_CANCEL
+Align=0
+Z=0.99
+
+[SongMenuSelectSlide3]
+Tex = Rectangle
+TexSBG = SongMenuSelectBG
+Text =
+X = 510
+Y = 225
+W = 0
+H = 25
+Z = 0.98
+SkipX = 0
+SBGW=270
+
+TextSize=8
+
+Color =ColorLight
+DColor = ColorDark
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorLight
+SBGDColor = ColorDark
+STColor = White
+STDColor = GrayDark
+
+[SongMenuTextMenu]
+X =539
+Y =125
+Color=White
+Font =0
+Size =14
+Text=MENU
+Align=0
+Z=0.99
+
+[SongMenuStatic2]
+X =513
+Y =135
+W =21
+H =21
+Color =White
+Tex =IconSongMenu
+Type=Font Black
+Z=0.98
+
+[SongMenuStatic1]
+Tex =SongMenuBG
+X =498
+Y =120
+W =300
+H =200
+Z =0.94
+Int=1
+Color =GrayDark
+Type=Font Black
+
+[SongJumpto]
+Texts=0
+Statics=1
+
+[SongJumptoStatic1]
+Tex =JumpToBG
+X =221
+Y =175
+W =355
+H =175
+Z =0.98
+Int=1
+Color =GrayDark
+Type=Font Black
+
+[SongJumptoStatic2]
+X =234
+Y =185
+W =21
+H =21
+Color =White
+Tex =MainSearch
+Type=Font Black
+Z=0.99
+
+[SongJumptoText1]
+X =310
+Y =175
+Color=White
+Font =0
+Size =14
+Text=SONG_JUMPTO_TYPE_DESC
+Align=0
+Z=0.99
+
+[SongJumptoSelectSlideType]
+Tex = button
+TexSBG = mainicon
+#Text = SONG_JUMPTO_TYPE_DESC
+Font=1
+X = 242
+Y = 205
+Z = 0.99
+W = 0
+H = 30
+SkipX = 4
+SBGW= 300
+Fields=2
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex = button
+SBGDColor = ColorLightest
+STColor = White
+STDColor = ColorLightest
+
+[SongJumptoButtonSearchText]
+X = 250
+Y = 215
+Z = 0.99
+W = 160
+H = 50
+Size=14
+Font=1
+Align=0
+
+[SongJumptoTextFound]
+X =234
+Y =295
+Color=White
+Font =0
+Size =8
+Text=SONG_JUMPTO_HELP
+Align=0
+Z=0.99
+
+[StatMain]
+Texts=0
+Statics=0
+
+[StatMainBackground]
+Tex=MainBG
+
+[StatMainButtonScores]
+X =589
+Y =100
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor =Gray
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonScoresText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SCORES
+Color=White
+
+[StatMainButtonSingers]
+X =589
+Y =160
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor =Gray
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSingersText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SINGERS
+Color=White
+
+[StatMainButtonSongs]
+X =589
+Y =220
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor =Gray
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSongsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_SONGS
+Color=White
+
+[StatMainButtonBands]
+X =589
+Y =280
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor =Gray
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonBandsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_BANDS
+Color=White
+
+[StatMainButtonExit]
+X =589
+Y =340
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor =Gray
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatMainTextOverview]
+X =45
+Y =125
+W =510
+Color=White
+Font =0
+Size =9
+Align=0
+Text=
+
+[StatMainStatic1]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =StatIcon
+Type=Font Black
+
+[StatMainStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatMainStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatMainStatic4]
+X =260
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[StatMainStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[StatMainStatic6]
+X =40
+Y =100
+W =520
+H =20
+Tex=StatMainBG1
+Color =Gray
+Type=Font Black
+
+[StatMainStatic7]
+X =40
+Y =120
+W =520
+H =300
+Tex=StatMainBG2
+Color =GrayDark
+Type=Font Black
+
+[StatMainStatic8]
+X =40
+Y =420
+W =520
+H =20
+Tex=StatMainBG3
+Color =Gray
+Type=Font Black
+
+[StatMainText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=STAT_MAIN
+Align=0
+
+[StatMainText2]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=STAT_MAIN_WHEREAMI
+
+[StatMainText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=STAT_MAIN_DESC
+
+[StatMainText4]
+X =294
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatMainText5]
+X =418
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[StatDetail]
+Texts=0
+Statics=0
+
+[StatDetailBackground]
+Tex=MainBG
+
+[StatDetailButtonNext]
+X =589
+Y =100
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor =Gray
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonNextText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_NEXT
+Color=White
+
+[StatDetailButtonPrev]
+X =589
+Y =160
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor =Gray
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonPrevText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_PREV
+Color=White
+
+[StatDetailButtonReverse]
+X =589
+Y =220
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor =Gray
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonReverseText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_REVERSE
+Color=White
+
+[StatDetailButtonExit]
+X =589
+Y =280
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor =Gray
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatDetailTextDescription]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=
+
+[StatDetailTextPage]
+X = 546
+Y = 98
+Color= Black
+Font = 0
+Size = 5
+Align=2
+Text=
+
+[StatDetailTextList1]
+X = 45
+Y = 122
+Color=White
+Font = 0
+Size = 7
+Text=Stat1
+
+[StatDetailTextList2]
+X = 45
+Y = 160
+Color=White
+Font = 0
+Size = 7
+Text=Stat2
+
+[StatDetailTextList3]
+X = 45
+Y = 198
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList4]
+X = 45
+Y = 236
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList5]
+X = 45
+Y = 274
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList6]
+X = 45
+Y = 312
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList7]
+X = 45
+Y = 350
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList8]
+X = 45
+Y = 388
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList9]
+X = 45
+Y = 426
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList10]
+X = 45
+Y = 464
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailStatic1]
+X =20
+Y =20
+W =32
+H =32
+Color =White
+Tex =StatIcon
+Type=Font Black
+
+[StatDetailStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatDetailStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatDetailStatic4]
+X =260
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[StatDetailStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[StatDetailStatic6]
+X =40
+Y =100
+W =520
+H =24
+Tex=StatDetailBG1
+Color =Gray
+Type=Font Black
+
+[StatDetailStatic7]
+X =40
+Y =124
+W =520
+H =376
+Tex=StatMainBG2
+Color =GrayDark
+Type=Font Black
+
+[StatDetailStatic8]
+X =40
+Y =500
+W =520
+H =20
+Tex=StatMainBG3
+Color =Gray
+Type=Font Black
+
+
+[StatDetailText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=STAT_DETAIL
+Align=0
+
+[StatDetailText2]
+X =238
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=STAT_DETAIL_WHEREAMI
+
+[StatDetailText3]
+X =294
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatDetailText4]
+X =418
+Y =552
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[CheckPopup]
+Texts=1
+Statics=1
+
+[CheckPopupButton1]
+X = 285
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=JA
+Align=1
+Z=1
+
+[CheckPopupButton2]
+X = 415
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton2Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=NEIN
+Align=1
+Z=1
+
+[CheckPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[CheckPopupText1]
+X =282
+Y =147
+Color=White
+Font =0
+Size =10
+Text=MSG_QUESTION_TITLE
+Align=0
+Z=1
+
+[CheckPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =GrayPopup
+Type=Font Black
+
+[CheckPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[CheckPopupStatic3]
+Tex =IconQuestion
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopup]
+Texts=1
+Statics=1
+
+[ErrorPopupButton1]
+X = 350
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[ErrorPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=OK
+Align=1
+Z=1
+
+[ErrorPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[ErrorPopupText1]
+X =282
+Y =148
+Color=White
+Font =0
+Size =10
+Text=MSG_ERROR_TITLE
+Align=0
+Z=1
+
+[ErrorPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =GrayPopup
+Type=Font Black
+
+[ErrorPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopupStatic3]
+Tex =IconError
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
diff --git a/Game/Output/Themes/TODOs/WiiStar.ini b/Game/Output/Themes/TODOs/WiiStar.ini
new file mode 100644
index 00000000..757392b6
--- /dev/null
+++ b/Game/Output/Themes/TODOs/WiiStar.ini
@@ -0,0 +1,7771 @@
+;for UltraStar Deluxe 1.0.1a
+
+[Theme]
+Name=WiiStar
+Creator=MasterPhW
+
+[Colors]
+White =255 255 255
+LightBlue =0 64 128
+DarkBlue = 28 126 171
+LightRed = 170 146 146
+DarkRed = 155 113 113
+LightGreen = 136 168 136
+DarkGreen = 106 152 104
+LightPurple = 155 136 168
+DarkPurple = 145 104 152
+LightOrange = 168 155 136
+DarkOrange = 151 131 76
+LightYellow = 168 168 136
+DarkYellow = 150 151 76
+Turkis = 13 186 167
+GrayLightest = 223 223 223
+GrayLight = 191 191 191
+Gray =0 64 128
+GrayDark = 63 63 63
+Black =0 64 128
+GrayPopup =0 255 255
+Gold = 255 223 31
+Silver = 223 223 223
+Bronze = 205 127 50
+
+[Loading]
+Texts =2
+Fade = 1
+
+[LoadingBackground]
+Tex=LoadingBG
+
+[LoadingText2]
+X =460
+Y =444
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=US_VERSION
+
+[Main]
+Texts =5
+Statics=4
+
+[MainBackground]
+Tex=MainBG
+
+[MainStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic3]
+X =260
+Y =550
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[MainText2]
+X =295
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[MainStatic4]
+X =388
+Y =550
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[MainText1]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_MENU
+
+[MainTextDescriptionLong]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=
+
+[MainButtonSolo]
+X =38
+Y =67
+W =158
+H =40
+Tex =Rectangle
+Color =ColorDark
+DColor =ColorLightest
+Type=Font Black
+Texts=1
+Reflection=0
+
+[MainButtonSoloText1]
+X =75
+Y =0
+Font=2
+Size=9
+Align=1
+Text=SING_SING
+Color=White
+
+[MainButtonMulti]
+X =226
+Y =67
+W =158
+H =40
+Tex =Rectangle
+Color =ColorDark
+DColor =ColorLightest
+Type=Font Black
+Texts=1
+Reflection=0
+
+[MainButtonMultiText1]
+X =75
+Y =0
+Font=2
+Size=9
+Align=1
+Text=SING_MULTI
+Color=White
+
+[MainButtonStats]
+X =415
+Y =67
+W =158
+H =40
+Tex =Rectangle
+Color =ColorDark
+DColor =ColorLightest
+Type=Font Black
+Texts=1
+Reflection=0
+
+[MainButtonStatsText1]
+X =70
+Y =0
+Font=2
+Size=9
+Align=1
+Text=SING_STATS
+Color=White
+
+[MainButtonEditor]
+X =602
+Y =67
+W =158
+H =40
+Tex =Rectangle
+Color =ColorDark
+DColor =ColorLightest
+Type=Font Black
+Texts=1
+Reflection=0
+
+[MainButtonEditorText1]
+X =70
+Y =0
+Font=2
+Size=9
+Align=1
+Text=SING_EDITOR
+Color=White
+
+[MainButtonOptions]
+X =148
+Y =221
+W =160
+H =40
+Tex =Rectangle
+Color =ColorDark
+DColor =ColorLightest
+Type=Font Black
+Texts=1
+Reflection=0
+
+[MainButtonOptionsText1]
+X =70
+Y =0
+Font=2
+Size=9
+Align=1
+Text=SING_OPTIONS
+Color=White
+
+[MainButtonExit]
+X =512
+Y =221
+W =158
+H =40
+Tex =Rectangle
+Color =ColorDark
+DColor =ColorLightest
+Type=Font Black
+Texts=1
+Reflection=0
+
+[MainButtonExitText1]
+X =70
+Y =0
+Font=2
+Size=9
+Align=1
+Text=SING_EXIT
+Color=White
+
+[Song]
+Texts =3
+
+[SongBackground]
+Tex=SongBG
+
+[SongCover]
+X=300
+Y=175
+W=320
+H=190
+Style=5
+Reflections=0
+
+[SongEqualizer]
+Visible=1
+Direction=1
+Color=White
+Alpha=1
+X=215
+Y=470
+Z=1
+PieceW=8
+PieceH=8
+Space=2
+Bands=7
+Length=10
+
+[SongVideoIcon]
+X =530
+Y =415
+W =32
+H =32
+Z=1
+Color=White
+Tex =VideoIcon
+Type=Font Black
+
+[SongStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[SongStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[SongStatic3]
+X =250
+Y =175
+W =300
+H =200
+Z =0.5
+Color =ColorDark
+Tex =SongSelection1
+Type=Font Black
+
+[SongStatic4]
+X =200
+Y =390
+W =400
+H =90
+Z=0.98
+Color =ColorDark
+Tex =SongSelection2
+Type=Font Black
+
+[SongTextCat]
+X =70
+Y =80
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=SING_SONG_SELECTION_DESC
+
+[SongTextArtist]
+X =400
+Y =390
+W =300
+Color=White
+Font =3
+Size =9
+Align =1
+Text=
+
+[SongTextTitle]
+X =400
+Y =420
+W = 190
+Color=White
+Font =0
+Size =9
+Align =1
+Text=
+
+[SongTextNumber]
+X =535
+Y =450
+Color=White
+Font =0
+Size =8
+Align =2
+Text=
+
+[SongStaticNonParty1]
+X =40
+Y =50
+W =27
+H =27
+Color =LightBlue
+Tex =SongCD
+Type=Font Black
+
+[SongStaticNonParty2]
+X =260
+Y =552
+W =26
+H =22
+Tex=ButtonAlt
+Color =White
+Type=Plain
+
+[SongStaticNonParty3]
+X =300
+Y =552
+W =26
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Plain
+
+[SongStaticNonParty4]
+X =425
+Y =552
+W =22
+H =22
+Tex=ButtonM
+Color =White
+Type=Plain
+
+[SongStaticNonParty5]
+X =515
+Y =552
+W =22
+H =22
+Tex=ButtonJ
+Color =White
+Type=Plain
+
+[SongStaticNonParty6]
+X =679
+Y =552
+W =22
+H =22
+Tex=ButtonP
+Color =White
+Type=Plain
+
+[SongTextNonParty1]
+X =70
+Y =35
+Color=LightBlue
+Font =0
+Size =20
+Text=SING_SONG_SELECTION
+Align=0
+
+[SongTextNonParty2]
+X =10
+Y =555
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_WHEREAMI
+
+[SongTextNonParty3]
+X =288
+Y =555
+Color=Black
+Font =1
+Size =5
+Align=0
+Text=+
+
+[SongTextNonParty4]
+X =330
+Y =555
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_GOTO
+
+[SongTextNonParty5]
+X =450
+Y =555
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_MENU
+
+[SongTextNonParty6]
+X =540
+Y =555
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SONG_JUMPTO_DESC
+
+[SongTextNonParty7]
+X =705
+Y =555
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_PLAYLIST
+
+[SongStaticParty1]
+X =25
+Y =45
+W =42
+H =20
+Color =Gray
+Tex =PartyIcon
+Type=Font Black
+
+[SongStaticParty2]
+X =260
+Y=551
+W =26
+H =22
+Tex=Button13
+Color =White
+Type=Plain
+
+[SongStaticParty3]
+X =400
+Y=551
+W =22
+H =22
+Tex=ButtonM
+Color =White
+Type=Plain
+
+[SongStaticParty4]
+X =540
+Y=551
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[SongTextParty1]
+X =70
+Y =25
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =Gray
+Text=PARTY_MODE
+
+[SongTextParty2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_SONG_WHEREAMI
+
+[SongTextParty3]
+X =288
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SONG_MENU_NAME_PARTY_JOKER
+
+[SongTextParty4]
+X =426
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_MENU
+
+[SongTextParty5]
+X =570
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_LEGEND_CONTINUE
+
+[SongStaticTeam1Joker1]
+Tex =Joker
+X =3
+Y =400
+W =20
+H =60
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker2]
+Tex =Joker
+X =23
+Y =400
+W =20
+H =60
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker3]
+Tex =Joker
+X =43
+Y =400
+W =20
+H =60
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker4]
+Tex =Joker
+X =63
+Y =400
+W =20
+H =60
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker5]
+Tex =Joker
+X =83
+Y =400
+W =20
+H =60
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker1]
+Tex =Joker
+X =108
+Y =400
+W =20
+H =60
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker2]
+Tex =Joker
+X =128
+Y =400
+W =20
+H =60
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker3]
+Tex =Joker
+X =148
+Y =400
+W =20
+H =60
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker4]
+Tex =Joker
+X =168
+Y =400
+W =20
+H =60
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker5]
+Tex =Joker
+X =188
+Y =400
+W =20
+H =60
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker1]
+Tex =Joker
+X =580
+Y =400
+W =20
+H =60
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker2]
+Tex =Joker
+X =600
+Y =400
+W =20
+H =60
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker3]
+Tex =Joker
+X =620
+Y =400
+W =20
+H =60
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker4]
+Tex =Joker
+X =640
+Y =400
+W =20
+H =60
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker5]
+Tex =Joker
+X =660
+Y =400
+W =20
+H =60
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+
+[Sing]
+Texts =1
+
+;not used for this skin
+;[SingText1]
+;Text =SING_TIME
+;X =90
+;Y =200
+;Font =1
+;Size =6
+;Color =White
+;Align=1
+
+[SingStatic1]
+;TextBG
+Tex =LyricBar
+X =10
+Y =490
+W =780
+H =85
+Color =GrayLightest
+Type=Font Black
+
+[SingStatic2]
+;TimeBar
+Tex =TimeBar1
+X =10
+Y =577
+W =780
+H =16
+Color =Black
+Type=Font Black
+
+[SingTimeProgress]
+X =20
+Y =581
+W =700
+H =7
+Color=White
+
+[SingStatic3]
+;the thing behind the time progress
+Tex =TimeBar2
+X =20
+Y =581
+W =700
+H =7
+Color=GrayLightest
+Type=Font Black
+
+[SingTimeText]
+Text =SING_TIME
+X =750
+Y =576
+Font =1
+Size =6
+Color =White
+Align=1
+
+[SingP1Static]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1Text]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1Static2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1SingBar]
+X =680
+Y =316
+W =100
+H =8
+
+[SingP1TwoPStatic]
+Tex =P
+X =20
+Y =117
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPText]
+Text =P1
+X =26
+Y =122
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1TwoPStatic2]
+Tex =ScoreBG
+X =680
+Y =102
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPTextScore]
+Text =00000
+X =690
+Y =104
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1TwoPSingBar]
+X =680
+Y =136
+W =100
+H =8
+
+[SingP2RStatic]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P2Dark
+Type=Transparent
+
+[SingP2RText]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP2RStatic2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2RTextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2RSingBar]
+X =680
+Y =316
+W =100
+H =8
+
+[SingP1ThreePStatic]
+Tex =P
+X =16
+Y =59
+W =50
+H =54
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePText]
+Text =P1
+X =27
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP1ThreePStatic2]
+Tex =ScoreBG
+X =75
+Y =61
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePTextScore]
+Text =00000
+X =85
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1ThreePSingBar]
+X =75
+Y =95
+W =100
+H =8
+
+[SingP2MStatic]
+Tex =P
+X =311
+Y =59
+W =50
+H =54
+Color =P2Dark
+Type=Transparent
+
+[SingP2MText]
+Text =P2
+X =321
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP2MStatic2]
+Tex =ScoreBG
+X =370
+Y =61
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2MTextScore]
+Text =00000
+X =380
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2MSingBar]
+X =370
+Y =95
+W =100
+H =8
+
+#Player Three
+[SingP3RStatic]
+Tex =P
+X =611
+Y =59
+W =50
+H =54
+Color =P3Dark
+Type=Transparent
+
+[SingP3RText]
+Text =P3
+X =621
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP3RStatic2]
+Tex =ScoreBG
+X =670
+Y =61
+W =100
+H =34
+Color =P3Dark
+Type=Transparent
+
+[SingP3RTextScore]
+Text =00000
+X =680
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP3SingBar]
+X =670
+Y =95
+W =100
+H =8
+
+[Score]
+Texts =1
+
+[ScoreBackground]
+Tex=OptionsSubBG
+
+[ScoreText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =16
+Text=SONG_SCORE
+Align=0
+
+[ScoreTextArtistTitle]
+X =70
+Y =40
+Color=White
+Font =0
+Size =10
+Align =0
+Text=ArtistTitle
+
+[ScoreStatic1]
+X =25
+Y =20
+W =42
+H =22
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[ScoreStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SONG_SCORE_WHEREAMI
+
+[ScoreStatic4]
+X =260
+Y=551
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[ScoreText3]
+X =290
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[ScoreTextName1]
+X =175
+Y =260
+Font =0
+Size =14
+Text =P1
+Color =Turkis
+Align=0
+
+[ScoreTextScore1]
+X =175
+Y =430
+Color=Turkis
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes1]
+X =175
+Y =340
+Color=Turkis
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore1]
+X =465
+Y =340
+Color=Turkis
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextLineBonus1]
+X =175
+Y =370
+Color=Turkis
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore1]
+X =465
+Y =370
+Color=Turkis
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextGoldenNotes1]
+X =175
+Y =400
+Color=Turkis
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore1]
+X =465
+Y =400
+Color=Turkis
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextTotal1]
+X =205
+Y =460
+Color=Turkis
+Font =0
+Size =14
+Text=SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore1]
+X =465
+Y =460
+Color=Turkis
+Font =0
+Size =14
+Align =2
+Text =0
+
+#Lines
+[ScorePlayer1Static1]
+Tex =ScoreLine
+X =173
+Y =338
+W =295
+H =2
+Color =Turkis
+Type =Font Black
+
+[ScorePlayer1Static2]
+Tex =ScoreLine
+X =173
+Y =368
+W =295
+H =2
+Color =Turkis
+Type =Font Black
+
+[ScorePlayer1Static3]
+Tex =ScoreLine
+X =173
+Y =398
+W =295
+H =2
+Color =Turkis
+Type =Font Black
+
+[ScorePlayer1Static4]
+Tex =ScoreLine
+X =173
+Y =428
+W =295
+H =2
+Color =Turkis
+Type =Font Black
+
+[ScorePlayer1Static5]
+Tex =ScoreLine
+X =173
+Y =458
+W =295
+H =4
+Type =Font Black
+Color =Turkis
+
+[ScoreStaticBoxDark1]
+Tex =PlayerNumberBox
+X =175
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Text1]
+X =179
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel1]
+Tex =ScoreLevel
+X =475
+Y =160
+W =150
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =130
+W =150
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel1]
+Tex =ScoreLevel
+X =475
+Y =410
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =380
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer1Static6]
+Tex =ScoreEndCap
+X =494
+Y =460
+W =112
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Static7]
+Tex =ScoreLine
+X =493
+Y =460
+W =114
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+[ScoreTextName2]
+X =20
+Y =260
+Font =0
+Size =14
+Text =P1
+Color =White
+Align=0
+
+[ScoreTextScore2]
+X =20
+Y =430
+Color=Turkis
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes2]
+X =20
+Y =340
+Color=Turkis
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore2]
+X =300
+Y =340
+Color=Turkis
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextLineBonus2]
+X =20
+Y =370
+Color=Turkis
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore2]
+X =300
+Y =370
+Color=Turkis
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextGoldenNotes2]
+X =20
+Y =400
+Color=Turkis
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore2]
+X =300
+Y =400
+Color=Turkis
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextTotal2]
+X =50
+Y =460
+Color=Turkis
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore2]
+X =300
+Y =460
+Color=Turkis
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[ScorePlayer2Static1]
+Tex =ScoreLine
+X =20
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =Turkis
+
+[ScorePlayer2Static2]
+Tex =ScoreLine
+X =20
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =Turkis
+
+[ScorePlayer2Static3]
+Tex =ScoreLine
+X =20
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =Turkis
+
+[ScorePlayer2Static4]
+Tex =ScoreLine
+X =20
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =Turkis
+
+[ScorePlayer2Static5]
+Tex =ScoreLine
+X =20
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =Turkis
+
+[ScoreStaticBoxDark2]
+Tex =PlayerNumberBox
+X =20
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Text1]
+X =24
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+[ScoreStaticBackLevel2]
+Tex =ScoreLevel
+X =293
+Y =160
+W =120
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =130
+W =120
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScoreStaticLevel2]
+Tex =ScoreLevel
+X =293
+Y =410
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =380
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScorePlayer2Static6]
+Tex =ScoreEndCap
+X =308
+Y =460
+W =90
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Static7]
+Tex =ScoreLine
+X =307
+Y =460
+W =92
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+[ScoreTextName3]
+X =780
+Y =260
+Font =0
+Size =14
+Text =P2
+Color =White
+Align=2
+
+[ScoreTextScore3]
+X =780
+Y =430
+Color=Turkis
+Font =1
+Size =9
+Text =Tone Deaf
+Align=2
+
+[ScoreTextNotes3]
+X =780
+Y =340
+Color=Turkis
+Font =0
+Size =9
+Text =SING_NOTES
+Align=2
+
+[ScoreTextNotesScore3]
+X =500
+Y =340
+Color=Turkis
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextLineBonus3]
+X =780
+Y =370
+Color=Turkis
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=2
+
+[ScoreTextLineBonusScore3]
+X =500
+Y =370
+Color=Turkis
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextGoldenNotes3]
+X =780
+Y =400
+Color=Turkis
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=2
+
+[ScoreTextGoldenNotesScore3]
+X =500
+Y =400
+Color=Turkis
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextTotal3]
+X =750
+Y =460
+Color=Turkis
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=2
+Reflection=1
+ReflectionSpacing=4
+
+[ScoreTextTotalScore3]
+X =500
+Y =460
+Color=Turkis
+Font =0
+Size =14
+Align =0
+Text =00000
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Static1]
+Tex =ScoreLine
+X =500
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =Turkis
+
+[ScorePlayer3Static2]
+Tex =ScoreLine
+X =500
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =Turkis
+
+[ScorePlayer3Static3]
+Tex =ScoreLine
+X =500
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =Turkis
+
+[ScorePlayer3Static4]
+Tex =ScoreLine
+X =500
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =Turkis
+
+[ScorePlayer3Static5]
+Tex =ScoreLine
+X =500
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =Turkis
+
+[ScoreStaticBoxDark3]
+Tex =PlayerNumberBox
+X =755
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Text1]
+X =759
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+[ScoreStaticBackLevel3]
+Tex =ScoreLevel
+X =387
+Y =160
+W =120
+H =300
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =130
+W =120
+H =30
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel3]
+Tex =ScoreLevel
+X =387
+Y =410
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =380
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScorePlayer3Static6]
+Tex =ScoreEndCap
+X =402
+Y =460
+W =90
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Static7]
+Tex =ScoreLine
+X =401
+Y =460
+W =92
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+[ScoreTextName4]
+X=20
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P1
+Color=P1Dark
+
+[ScoreTextNotes4]
+X=20
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=Turkis
+
+[ScoreTextNotesScore4]
+X=260
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Turkis
+
+[ScoreTextLineBonus4]
+X=20
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=Turkis
+
+[ScoreTextLineBonusScore4]
+X=260
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Turkis
+
+[ScoreTextGoldenNotes4]
+X=20
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=Turkis
+
+[ScoreTextGoldenNotesScore4]
+X=260
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Turkis
+
+[ScoreTextScore4]
+X=20
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=Turkis
+
+[ScoreTextTotal4]
+X=47
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=Turkis
+
+[ScoreTextTotalScore4]
+X=260
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=Turkis
+
+[ScoreStaticBoxDark4]
+Tex =PlayerNumberBox
+X =20
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer4Text1]
+X =24
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+[ScorePlayer4Static1]
+X=20
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=Turkis
+
+[ScorePlayer4Static2]
+X=20
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=Turkis
+
+[ScorePlayer4Static3]
+X=20
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=Turkis
+
+[ScorePlayer4Static4]
+X=20
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=Turkis
+
+[ScorePlayer4Static5]
+X=20
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=Turkis
+
+[ScoreTextName5]
+X=280
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P2
+Color=P2Dark
+
+[ScoreTextNotes5]
+X=280
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=Turkis
+
+[ScoreTextNotesScore5]
+X=520
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Turkis
+
+[ScoreTextLineBonus5]
+X=280
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=Turkis
+
+[ScoreTextLineBonusScore5]
+X=520
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Turkis
+
+[ScoreTextGoldenNotes5]
+X=280
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=Turkis
+
+[ScoreTextGoldenNotesScore5]
+X=520
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Turkis
+
+[ScoreTextScore5]
+X=280
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=Turkis
+
+[ScoreTextTotal5]
+X=307
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=Turkis
+
+[ScoreTextTotalScore5]
+X=520
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=Turkis
+
+[ScoreStaticBoxDark5]
+Tex =PlayerNumberBox
+X =280
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer5Text1]
+X =284
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+[ScorePlayer5Static1]
+X=280
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=Turkis
+
+[ScorePlayer5Static2]
+X=280
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=Turkis
+
+[ScorePlayer5Static3]
+X=280
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=Turkis
+
+[ScorePlayer5Static4]
+X=280
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=Turkis
+
+[ScorePlayer5Static5]
+X=280
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=Turkis
+
+[ScoreTextName6]
+X=540
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P3
+Color=P3Dark
+
+[ScoreTextNotes6]
+X=540
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=Turkis
+
+[ScoreTextNotesScore6]
+X=780
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Turkis
+
+[ScoreTextLineBonus6]
+X=540
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=Turkis
+
+[ScoreTextLineBonusScore6]
+X=780
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Turkis
+
+[ScoreTextGoldenNotes6]
+X=540
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=Turkis
+
+[ScoreTextGoldenNotesScore6]
+X=780
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Turkis
+
+[ScoreTextScore6]
+X=540
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=Turkis
+
+[ScoreTextTotal6]
+X=567
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=Turkis
+
+[ScoreTextTotalScore6]
+X=780
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=Turkis
+
+[ScoreStaticBoxDark6]
+Tex =PlayerNumberBox
+X =540
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P3Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer6Text1]
+X =544
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P3
+
+[ScorePlayer6Static1]
+X=540
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=Turkis
+
+[ScorePlayer6Static2]
+X=540
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=Turkis
+
+[ScorePlayer6Static3]
+X=540
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=Turkis
+
+[ScorePlayer6Static4]
+X=540
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=Turkis
+
+[ScorePlayer6Static5]
+X=540
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=Turkis
+
+[Options]
+Texts = 6
+Fade = 2
+
+[OptionsBackground]
+Tex=OptionsBG
+
+[OptionsStatic1]
+X =305
+Y =427
+W =24
+H =25
+Color =Turkis
+Tex =IconOption
+Type=Font Black
+
+[OptionsStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic4]
+X =260
+Y =551
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsStatic5]
+X =388
+Y =551
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[OptionsStatic6]
+X =512
+Y =551
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsText1]
+X =310
+Y =460
+Color=Turkis
+Font =0
+Size =16
+Text=SING_OPTIONS
+Align=0
+
+[OptionsText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_WHEREAMI
+
+[OptionsText3]
+X =290
+Y =500
+Color=Turkis
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_DESC
+
+[OptionsText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_SELECT
+
+[OptionsText6]
+X =538
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsButtonGame]
+X =38
+Y =67
+W =158
+H =40
+Tex =Rectangle
+Color =ColorDark
+DColor =ColorLightest
+Type=Font Black
+Texts=1
+Reflection=0
+
+[OptionsButtonGameText1]
+X =75
+Y =0
+Font=2
+Size=9
+Align=1
+Text=SING_OPTIONS_GAME
+Color=White
+
+[OptionsButtonGraphics]
+X =226
+Y =67
+W =158
+H =40
+Tex =Rectangle
+Color =ColorDark
+DColor =ColorLightest
+Type=Font Black
+Texts=1
+Reflection=0
+
+[OptionsButtonGraphicsText1]
+X =75
+Y =0
+Font=2
+Size=9
+Align=1
+Text=SING_OPTIONS_GRAPHICS
+Color=White
+
+[OptionsButtonSound]
+X =415
+Y =67
+W =158
+H =40
+Tex =Rectangle
+Color =ColorDark
+DColor =ColorLightest
+Type=Font Black
+Texts=1
+Reflection=0
+
+[OptionsButtonSoundText1]
+X =70
+Y =0
+Font=2
+Size=9
+Align=1
+Text=SING_OPTIONS_SOUND
+Color=White
+
+[OptionsButtonLyrics]
+X =602
+Y =67
+W =158
+H =40
+Tex =Rectangle
+Color =ColorDark
+DColor =ColorLightest
+Type=Font Black
+Texts=1
+Reflection=0
+
+[OptionsButtonLyricsText1]
+X =70
+Y =0
+Font=2
+Size=9
+Align=1
+Text=SING_OPTIONS_LYRICS
+Color=White
+
+[OptionsButtonThemes]
+X =36
+Y =220
+W =160
+H =40
+Tex =Rectangle
+Color =ColorDark
+DColor =ColorLightest
+Type=Font Black
+Texts=1
+Reflection=0
+
+[OptionsButtonThemesText1]
+X =70
+Y =0
+Font=2
+Size=9
+Align=1
+Text=SING_OPTIONS_THEMES
+Color=White
+
+[OptionsButtonRecord]
+X =226
+Y =220
+W =158
+H =40
+Tex =Rectangle
+Color =ColorDark
+DColor =ColorLightest
+Type=Font Black
+Texts=1
+Reflection=0
+
+[OptionsButtonRecordText1]
+X =70
+Y =0
+Font=2
+Size=9
+Align=1
+Text=SING_OPTIONS_RECORD
+Color=White
+Texts=1
+
+[OptionsButtonAdvanced]
+X =415
+Y =220
+W =158
+H =40
+Tex =Rectangle
+Color =ColorDark
+DColor =ColorLightest
+Type=Font Black
+Texts=1
+Reflection=0
+
+[OptionsButtonAdvancedText1]
+X =70
+Y =0
+Font=2
+Size=9
+Align=1
+Text=SING_OPTIONS_ADVANCED
+Color=White
+Texts=1
+
+[OptionsButtonExit]
+X =602
+Y =220
+W =158
+H =40
+Tex =Rectangle
+Color =ColorDark
+DColor =ColorLightest
+Type=Font Black
+Texts=1
+Reflection=0
+
+[OptionsButtonExitText1]
+X =70
+Y =0
+Font=2
+Size=9
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[OptionsGame]
+Texts = 5
+
+[OptionsGameBackground]
+Tex=OptionsSubBG
+
+[OptionsGameStatic1]
+X =40
+Y =22
+W =27
+H =29
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGameStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGameStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGameStatic4]
+X =260
+Y=551
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsGameStatic5]
+X =388
+Y=551
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsGameText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GAME_WHEREAMI
+
+[OptionsGameText3]
+X =70
+Y =20
+Color=White
+Font =0
+Size =12
+Align =0
+Text=SING_OPTIONS_GAME_DESC
+
+[OptionsGameText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGameText1]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGameSelectPlayers]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_PLAYERS
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDifficulty]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DIFFICULTY
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectSlideLanguage]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_LANGUAGE
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectTabs]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_TABS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectSlideSorting]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_SORTING
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDebug]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DEBUG
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsGraphics]
+Texts = 5
+
+[OptionsGraphicsBackground]
+Tex=OptionsSubBG
+
+[OptionsGraphicsStatic1]
+X =40
+Y =22
+W =27
+H =29
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGraphicsStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic4]
+X =260
+Y=551
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsGraphicsStatic5]
+X =388
+Y=551
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsGraphicsText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GRAPHICS_WHEREAMI
+
+[OptionsGraphicsText1]
+X =70
+Y =20
+Color=White
+Font =0
+Size =12
+Align =0
+Text=SING_OPTIONS_GRAPHICS_DESC
+
+[OptionsGraphicsText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGraphicsText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGraphicsSelectSlideResolution]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_GRAPHICS_RESOLUTION
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectFullscreen]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_FULLSCREEN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectDepth]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_DEPTH
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectOscilloscope]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_OSCILLOSCOPE
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectMovieSize]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_MOVIE_SIZE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsButtonExit]
+X = 40
+Y = 360
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsSound]
+Texts = 5
+
+[OptionsSoundBackground]
+Tex=OptionsSubBG
+
+[OptionsSoundStatic1]
+X =20
+Y =22
+W =48
+H =27
+Color =White
+Tex =IconSongMenu
+Type=Font Black
+
+[OptionsSoundStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic4]
+X =260
+Y=551
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsSoundStatic5]
+X =388
+Y=551
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsSoundText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_SOUND_WHEREAMI
+
+[OptionsSoundText3]
+X =70
+Y =20
+Color=White
+Font =0
+Size =12
+Align =0
+Text=SING_OPTIONS_SOUND_DESC
+
+[OptionsSoundText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsSoundText1]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsSoundSelectMicBoost]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_MIC_BOOST
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectClickAssist]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_CLICK_ASSIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectBeatClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_BEAT_CLICK
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectThreshold]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_THRESHOLD
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectTwoPlayerMode]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_TWO_PLAYERS_MODE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewVolume]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWVOLUME
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewFADING]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWFADING
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsLyrics]
+Texts = 1
+
+[OptionsLyricsBackground]
+Tex=OptionsSubBG
+
+[OptionsLyricsStatic1]
+X =40
+Y =22
+W =27
+H =29
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsLyricsStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic4]
+X =260
+Y=551
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsLyricsStatic5]
+X =388
+Y=551
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsLyricsText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_LYRICS_WHEREAMI
+
+[OptionsLyricsText3]
+X =70
+Y =20
+Color=White
+Font =0
+Size =12
+Align =0
+Text=SING_OPTIONS_LYRICS_DESC
+
+[OptionsLyricsText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsLyricsText1]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsLyricsSelectLyricsFont]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_FONT
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectLyricsEffect]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_EFFECT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectSolmization]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_SOLMIZATION
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsThemes]
+Texts = 5
+
+[OptionsThemesBackground]
+Tex=OptionsSubBG
+
+[OptionsThemesStatic1]
+X =40
+Y =22
+W =27
+H =29
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsThemesStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic4]
+X =260
+Y=551
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsThemesStatic5]
+X =388
+Y=551
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsThemesText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_THEMES_WHEREAMI
+
+[OptionsThemesText3]
+X =70
+Y =20
+Color=White
+Font =0
+Size =12
+Align =0
+Text=SING_OPTIONS_THEMES_DESC
+
+[OptionsThemesText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsThemesText1]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsThemesSelectTheme]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_THEME
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectSkin]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_SKIN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectColor]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_COLOR
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsRecord]
+Texts = 5
+
+[OptionsRecordBackground]
+Tex=OptionsSubBG
+
+[OptionsRecordStatic1]
+X =20
+Y =22
+W =45
+H =29
+Color =White
+Tex =IconSongMenu
+Type=Font Black
+
+[OptionsRecordStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic4]
+X =260
+Y=551
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsRecordStatic5]
+X =388
+Y=551
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsRecordText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_RECORD_WHEREAMI
+
+[OptionsRecordText3]
+X =70
+Y =20
+Color=White
+Font =0
+Size =12
+Align =0
+Text=SING_OPTIONS_RECORD_DESC
+
+[OptionsRecordText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsRecordText1]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsRecordSelectSlideCard]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CARD
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideInput]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_INPUT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelL]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELL
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelR]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELR
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordButtonExit]
+X = 40
+Y = 305
+W = 230
+H = 70
+Tex = MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsAdvanced]
+Texts = 5
+
+[OptionsAdvancedBackground]
+Tex=OptionsSubBG
+
+[OptionsAdvancedStatic1]
+X =40
+Y =22
+W =27
+H =29
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsAdvancedStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic4]
+X =260
+Y=551
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsAdvancedStatic5]
+X =388
+Y=551
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsAdvancedText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_ADVANCED_WHEREAMI
+
+[OptionsAdvancedText3]
+X =70
+Y =20
+Color=White
+Font =0
+Size =12
+Align =0
+Text=SING_OPTIONS_ADVANCED_DESC
+
+[OptionsAdvancedText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsAdvancedText1]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+
+#########unused at the moment#########
+#[OptionsAdvancedSelectLoadAnimation]
+#Tex =MainBar
+#TexSBG =SelectBG
+#Text=SING_OPTIONS_ADVANCED_LOADANIMATION
+#X = 40
+#Y = 85
+#W = 230
+#H = 70
+#SkipX = 50
+
+#Color = ColorDark
+#DColor = Gray
+#TColor = White
+#TDColor = White
+#SBGTex =MainBar
+#SBGColor = ColorDark
+#SBGDColor = Gray
+#STColor = White
+#STDColor = GrayDark
+
+[OptionsAdvancedSelectScreenFade]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_SCREENFADE
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectEffectSing]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_EFFECTSING
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectLineBonus]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_LINEBONUS
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectSlideOnSongClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_ADVANCED_ONSONGCLICK
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectAskbeforeDel]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_ASKBEFOREDEL
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectPartyPopup]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_PARTYPOPUP
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[Top5]
+Texts=1
+
+[Top5Background]
+Tex=OptionsSubBG
+
+[Top5Text1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =16
+Align=0
+Text =SING_TOP_5_CHARTS
+
+[Top5TextArtistTitle]
+X =70
+Y =40
+Color =White
+Font =0
+Size =10
+Align =0
+Text =artist - title
+
+[Top5Text4]
+X =70
+Y =73
+Color=Turkis
+Font =0
+Size =10
+Align=0
+Text =SING_OPTIONS_GAME_DIFFICULTY
+
+[Top5TextLevel]
+X =270
+Y =73
+Color =Turkis
+Font =0
+Size =10
+Align =1
+Text =easy
+
+[Top5Static1]
+X =25
+Y =20
+W =42
+H =22
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[Top5Static2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[Top5Static3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[Top5Text2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_TOP_5_CHARTS_WHEREAMI
+
+[Top5Static4]
+X =260
+Y=551
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[Top5Text3]
+X =290
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_TOP_5_CHARTS_CONTINUE
+
+[Top5TextName1]
+X =150
+Y =190
+Color =Turkis
+Font =0
+Size =14
+Align =0
+Text =1. Player1
+
+[Top5TextName2]
+X =150
+Y =240
+Color =Turkis
+Font =0
+Size =14
+Align =0
+Text =2. Player2
+
+[Top5TextName3]
+X =150
+Y =290
+Color =Turkis
+Font =0
+Size =14
+Align =0
+Text =3. Player3
+
+[Top5TextName4]
+X =150
+Y =340
+Color =Turkis
+Font =0
+Size =14
+Align =0
+Text =4. Player4
+
+[Top5TextName5]
+X =150
+Y =390
+Color =Turkis
+Font =0
+Size =14
+Align =0
+Text =5. Player5
+
+[Top5TextScore1]
+X =680
+Y =190
+Color =Turkis
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore2]
+X =680
+Y =240
+Color =Turkis
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore3]
+X =680
+Y =290
+Color =Turkis
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore4]
+X =680
+Y =340
+Color =Turkis
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore5]
+X =680
+Y =390
+Color =Turkis
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextNumber1]
+X =120
+Y =193
+Color =White
+Font =1
+Size =9
+Align =1
+Text =1
+
+[Top5TextNumber2]
+X =120
+Y =243
+Color =White
+Font =1
+Size =9
+Align =1
+Text =2
+
+[Top5TextNumber3]
+X =120
+Y =293
+Color =White
+Font =1
+Size =9
+Align =1
+Text =3
+
+[Top5TextNumber4]
+X =120
+Y =343
+Color =White
+Font =1
+Size =9
+Align =1
+Text =4
+
+[Top5TextNumber5]
+X =120
+Y =393
+Color =White
+Font =1
+Size =9
+Align =1
+Text =5
+
+[Top5StaticNumber1]
+Tex=PlayerNumberBox
+X=100
+Y=186
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber2]
+Tex=PlayerNumberBox
+X=100
+Y=236
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber3]
+Tex=PlayerNumberBox
+X=100
+Y=286
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber4]
+Tex=PlayerNumberBox
+X=100
+Y=336
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber5]
+Tex=PlayerNumberBox
+X=100
+Y=386
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Level]
+Texts=5
+
+[LevelBackground]
+Tex=PartyBG
+
+[LevelStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[LevelStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[LevelStatic3]
+X =360
+Y =160
+W =57
+H =45
+Color =Turkis
+Tex =MainIcon
+Type=Font Black
+
+[LevelStatic4]
+X =260
+Y=551
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[LevelStatic5]
+X =388
+Y=551
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[LevelText1]
+X =310
+Y =185
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size =20
+Color =Turkis
+Text=SING_MODE
+
+[LevelText2]
+X =300
+Y =230
+Color=Turkis
+Font =0
+Size =10
+Align =0
+Text=SING_DIFFICULTY_DESC
+
+[LevelText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_DIFFICULTY_WHEREAMI
+
+[LevelText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[LevelText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_DIFFICULTY_CONTINUE
+
+[LevelButtonEasy]
+X =335
+Y =275
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =ColorLightest
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=1
+
+[LevelButtonMedium]
+X =335
+Y =345
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =ColorLightest
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=1
+
+[LevelButtonHard]
+X =335
+Y =415
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =ColorLightest
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=1
+
+[LevelButtonEasyText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=SING_EASY
+
+[LevelButtonMediumText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=SING_MEDIUM
+
+[LevelButtonHardText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=SING_HARD
+
+[Name]
+Texts=2
+
+[NameBackground]
+Tex=PartyBG
+
+[NameStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[NameStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[NameStatic3]
+X =360
+Y =160
+W =57
+H =45
+Color =Turkis
+Tex =MainIcon
+Type=Font Black
+
+[NameText1]
+X =310
+Y =185
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =Turkis
+Text=SING_MODE
+
+[NameText2]
+X =300
+Y =230
+Color=Turkis
+Font =0
+Size =10
+Align =0
+Text=SING_PLAYER_DESC
+
+[NameText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_PLAYER_WHEREAMI
+
+[NameStatic4]
+X =260
+Y=551
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[NameText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[NameStatic5]
+X =388
+Y=551
+W =26
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Plain
+Style=5
+
+[NameText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_PLAYER_ENTER_NAME
+
+[NameStatic6]
+X =556
+Y=551
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[NameText6]
+X =586
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[NameButtonPlayer1]
+X =180
+Y =270
+W =150
+H =50
+Tex =Button
+Color =P1Dark
+DColor = P1Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer1Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer2]
+X =335
+Y =270
+W =150
+H =50
+Tex =Button
+Color =P2Dark
+DColor = P2Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer2Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer3]
+X =490
+Y =270
+W =150
+H =50
+Tex =Button
+Color =P3Dark
+DColor = P3Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer3Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer4]
+X =180
+Y =400
+W =150
+H =50
+Tex =Button
+Color =P4Dark
+DColor = P4Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer4Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer5]
+X =335
+Y =400
+W =150
+H =50
+Tex =Button
+Color =P5Dark
+DColor = P5Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer5Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer6]
+X =490
+Y =400
+W =150
+H =50
+Tex =Button
+Color =P6Dark
+DColor = P6Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer6Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[PartyNewRound]
+Texts =7
+
+[PartyNewRoundBackground]
+Tex=PartySubBG
+
+[PartyNewRoundStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic3]
+X =25
+Y =20
+W =42
+H =20
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyNewRoundText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size =16
+Color =White
+Text=PARTY_MODE
+
+[PartyNewRoundText2]
+X =70
+Y =40
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_ROUND_DESC
+
+[PartyNewRoundText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_ROUND_WHEREAMI
+
+[PartyNewRoundText4]
+X =290
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_ROUND_LEGEND_CONTINUE
+
+[PartyNewRoundText5]
+X =460
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND
+Align=0
+
+[PartyNewRoundText6]
+X =600
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND_WINNER
+Align=0
+
+[PartyNewRoundText7]
+X =448
+Y =350
+Color =White
+Font =0
+Size =18
+Text =PARTY_ROUND
+Align=2
+
+[PartyNewRoundTextTeam1Players]
+X =30
+Y =137
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam2Players]
+X =30
+Y =218
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam3Players]
+X =30
+Y =299
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundStatic4]
+Tex =PartyRoundBG1
+X =450
+Y =103
+W = 330
+H = 24
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[PartyNewRoundStatic5]
+X =260
+Y=551
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[PartyNewRoundStatic6]
+Tex =PartyRoundBG3
+X =250
+Y =350
+W = 300
+H = 50
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[PartyNewRoundStatic7]
+Tex =PartyRoundBG4
+X =50
+Y =495
+W = 700
+H = 30
+Int=1
+Color =ColorLight
+Type=Font Black
+
+[PartyNewRoundStaticTeam1]
+Tex =PartyTeamButton1
+X =20
+Y =110
+W =400
+H =50
+Int=1
+Color =P1Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam2]
+Tex =PartyTeamButton1
+X =20
+Y =191
+W =400
+H =50
+Int=1
+Color =P2Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam3]
+Tex =PartyTeamButton1
+X =20
+Y =272
+W =400
+H =50
+Int=1
+Color =P3Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticNextPlayer1]
+Tex=PartyPlayerButton
+X=155
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P1Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer2]
+Tex=PartyPlayerButton
+X=325
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P2Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer3]
+Tex=PartyPlayerButton
+X=495
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P3Light
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyNewRoundTextRound1]
+X =460
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Round 1
+Align=0
+
+[PartyNewRoundTextRound2]
+X =460
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Round 2
+Align=0
+
+[PartyNewRoundTextRound3]
+X =460
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Round 3
+Align=0
+
+[PartyNewRoundTextRound4]
+X =460
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Round 4
+Align=0
+
+[PartyNewRoundTextRound5]
+X =460
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Round 5
+Align=0
+
+[PartyNewRoundTextRound6]
+X =460
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Round 6
+Align=0
+
+[PartyNewRoundTextRound7]
+X =460
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Round 7
+Align=0
+
+[PartyNewRoundTextWinner1]
+X =600
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Winner 1
+Align=0
+
+[PartyNewRoundTextWinner2]
+X =600
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Winner 2
+Align=0
+
+[PartyNewRoundTextWinner3]
+X =600
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Winner 3
+Align=0
+
+[PartyNewRoundTextWinner4]
+X =600
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Winner 4
+Align=0
+
+[PartyNewRoundTextWinner5]
+X =600
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Winner 5
+Align=0
+
+[PartyNewRoundTextWinner6]
+X =600
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Winner 6
+Align=0
+
+[PartyNewRoundTextWinner7]
+X =600
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Winner 7
+Align=0
+
+[PartyNewRoundStaticRound1]
+Tex =PartyRoundBG2
+X =450
+Y =135
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound2]
+Tex =PartyRoundBG2
+X =450
+Y =164
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound3]
+Tex =PartyRoundBG2
+X =450
+Y =193
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound4]
+Tex =PartyRoundBG2
+X =450
+Y =222
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound5]
+Tex =PartyRoundBG2
+X =450
+Y =251
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound6]
+Tex =PartyRoundBG2
+X =450
+Y =280
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound7]
+Tex =PartyRoundBG2
+X =450
+Y =309
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundTextNextRound]
+X =400
+Y =495
+Color =White
+Font =0
+Size =10
+Text =Next Round
+Align=1
+
+[PartyNewRoundTextNextRoundNo]
+X =457
+Y =350
+Color =White
+Font =0
+Size =18
+Text =99
+Align=0
+
+[PartyNewRoundTextScoreTeam1]
+X =390
+Y =110
+Color =White
+Font =0
+Size =17
+Text =3000
+Align=1
+
+[PartyNewRoundTextScoreTeam2]
+X =390
+Y =191
+Color =White
+Font =0
+Size =17
+Text =2000
+Align=1
+
+[PartyNewRoundTextScoreTeam3]
+X =390
+Y =272
+Color =White
+Font =0
+Size =17
+Text =1000
+Align=1
+
+[PartyNewRoundTextNameTeam1]
+X =30
+Y =108
+Color =White
+Font =0
+Size =12
+Text =Team 1
+Align=0
+
+[PartyNewRoundTextNameTeam2]
+X =30
+Y =189
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyNewRoundTextNameTeam3]
+X =30
+Y =270
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyNewRoundTextNextPlayer1]
+X =230
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 1
+Align=1
+
+[PartyNewRoundTextNextPlayer2]
+X =400
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 2
+Align=1
+
+[PartyNewRoundTextNextPlayer3]
+X =570
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 3
+Align=1
+
+
+[PartyScore]
+Texts=5
+
+[PartyScoreBackground]
+Tex=PartyScoreBG
+
+[PartyScoreDecoTextures]
+ChangeTextures =1
+
+FirstTexture =PartyScoreDeco
+FirstTyp =Font Black
+FirstColor =Gold
+
+SecondTexture =PartyScoreDeco
+SecondTyp =Font Black
+SecondColor =Silver
+
+ThirdTexture =PartyScoreDeco
+ThirdTyp =Font Black
+ThirdColor =Bronze
+
+[PartyScoreStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic3]
+X =25
+Y =25
+W =42
+H =20
+Color =Turkis
+Tex =PartyIcon
+Type=Font Black
+
+[PartyScoreStatic4]
+X =260
+Y=551
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[PartyScoreText1]
+X =70
+Y =12
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size =16
+Color =Turkis
+Text=PARTY_MODE
+
+[PartyScoreText2]
+X =50
+Y =53
+Color=Turkis
+Font =0
+Size =10
+Align =0
+Text=PARTY_SCORE_DESC
+
+[PartyScoreText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_SCORE_WHEREAMI
+
+[PartyScoreText4]
+X =290
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_LEGEND_CONTINUE
+
+[PartyScoreStatic5]
+Tex =PartyScoreBG1
+X =50
+Y =100
+W = 700
+H = 80
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[PartyScoreStatic6]
+Tex =PartyScoreBG2
+X =50
+Y =495
+W = 700
+H = 20
+Int=1
+Color =ColorLight
+Type=Font Black
+
+[PartyScoreText5]
+X =400
+Y =136
+Color =White
+Font =0
+Size =15
+Text =PARTY_SCORE_WINS2
+Align=1
+
+[PartyScoreTextWinner]
+X =400
+Y =98
+Color =White
+Font =0
+Size =18
+Text =The Winner is...
+Align=1
+
+[PartyScoreTextScoreTeam1]
+X =568
+Y =198
+Color =White
+Font =0
+Size =12
+Text =3000
+Align=2
+
+[PartyScoreTextScoreTeam2]
+X =568
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyScoreTextScoreTeam3]
+X =568
+Y =398
+Color =White
+Font =0
+Size =12
+Text =1000
+Align=2
+
+[PartyScoreTextNameTeam1]
+X =188
+Y =198
+Font=0
+Size=12
+Align=0
+Text=Team 1
+Color=White
+
+[PartyScoreTextNameTeam2]
+X =188
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyScoreTextNameTeam3]
+X =188
+Y =398
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyScoreStaticTeam1]
+X =188
+Y =230
+W =380
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam1BG]
+Tex=PartyTeamButton2
+X=178
+Y=200
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam1Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 191
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam2]
+X =188
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam2BG]
+Tex=PartyTeamButton2
+X=178
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam2Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam3]
+X =188
+Y =430
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam3BG]
+Tex=PartyTeamButton2
+X=178
+Y=400
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam3Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 391
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyWin]
+Texts=4
+
+[PartyWinBackground]
+Tex=PartyScoreBG2
+
+[PartyWinStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic3]
+X =25
+Y =22
+W =42
+H =20
+Color =Turkis
+Tex =PartyIcon
+Type=Font Black
+
+[PartyWinStatic4]
+X =260
+Y=551
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[PartyWinText1]
+X =70
+Y =10
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size =16
+Color =Turkis
+Text=PARTY_MODE
+
+[PartyWinText2]
+X =35
+Y =53
+Color=Turkis
+Font =0
+Size =9
+Align =0
+Text=PARTY_WIN_DESC
+
+[PartyWinText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_WIN_WHEREAMI
+
+[PartyWinText4]
+X =290
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_WIN_LEGEND_CONTINUE
+
+#[PartyWinTextWinner]
+#X =150
+#Y =120
+#Color =White
+#Font =1
+#Size =14
+#Text =The Winner is...
+#Align=0
+
+[PartyWinTextScoreTeam1]
+X =699
+Y =183
+Color =White
+Font =0
+Size =19
+Text =3000
+Align=2
+
+[PartyWinTextScoreTeam2]
+X =669
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyWinTextScoreTeam3]
+X =649
+Y =398
+Color =White
+Font =0
+Size =9
+Text =1000
+Align=2
+
+[PartyWinTextNameTeam1]
+X =169
+Y =183
+Font=0
+Size=19
+Align=0
+Text=Team 1
+Color=White
+
+[PartyWinTextNameTeam2]
+X =289
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyWinTextNameTeam3]
+X =369
+Y =398
+Color =White
+Font =0
+Size =9
+Text =Team 3
+Align=0
+
+[PartyWinStaticTeam1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BG]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank2]
+Tex=PartyTeamButton3
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank3]
+Tex=PartyTeamButton3
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyWinStaticTeam1Deco]
+Tex =PartyWinDeco1
+X = 91
+Y = 176
+W = 79
+H = 79
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BG]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamButton3
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank1]
+Tex=PartyTeamButton4
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank2]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank3]
+Tex=PartyTeamButton4
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Deco]
+Tex =PartyWinDeco2
+X = 226
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Silver
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BG]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank2]
+Tex=PartyTeamButton5
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank3]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Deco]
+Tex =PartyWinDeco3
+X = 316
+Y = 391
+W = 54
+H = 54
+Type =Font Black
+Color =Bronze
+Reflection=1
+ReflectionSpacing=3
+
+[PartyOptions]
+Texts = 5
+
+[PartyOptionsBackground]
+Tex=OptionsSubBG
+
+[PartyOptionsStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsStatic3]
+X =25
+Y =17
+W =42
+H =20
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyOptionsStatic4]
+X =260
+Y=551
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[PartyOptionsStatic5]
+X =388
+Y=551
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[PartyOptionsText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size =16
+Color =White
+Text=PARTY_MODE
+
+[PartyOptionsText2]
+X =70
+Y =40
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_OPTIONS_DESC
+
+[PartyOptionsText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_OPTIONS_WHEREAMI
+
+[PartyOptionsText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyOptionsText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[PartyOptionsSelectLevel]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_DIFFICULTY
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectRounds]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_ROUNDS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectTeams]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers1]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER1
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER2
+X = 40
+Y = 415
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers3]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER3
+X = 40
+Y = 470
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+
+
+[PartyPlayer]
+Texts=6
+
+[PartyPlayerBackground]
+Tex=OptionsSubBG
+
+[PartyPlayerStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerStatic3]
+X =25
+Y =17
+W =42
+H =20
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyPlayerStatic4]
+X =260
+Y=551
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[PartyPlayerStatic5]
+X =388
+Y=551
+W =26
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Plain
+Style=5
+
+[PartyPlayerStatic6]
+X =556
+Y=551
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[PartyPlayerText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size =16
+Color =White
+Text=PARTY_MODE
+
+[PartyPlayerText2]
+X =70
+Y =40
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_PLAYER_DESC
+
+[PartyPlayerText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_PLAYER_WHEREAMI
+
+[PartyPlayerText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyPlayerText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_ENTER_NAME
+
+[PartyPlayerText6]
+X =586
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_LEGEND_CONTINUE
+
+[PartyPlayerTeam1Name]
+Tex=PartyTeamButton2
+X=85
+Y=100
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Dark
+
+[PartyPlayerTeam1NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 1
+Color=White
+
+[PartyPlayerPlayer1Name]
+Tex=Button
+X=85
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer1NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 1
+Color=White
+
+[PartyPlayerPlayer2Name]
+Tex=Button
+X=245
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer2NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 2
+Color=White
+
+[PartyPlayerPlayer3Name]
+Tex=Button
+X=405
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer3NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 3
+Color=White
+
+[PartyPlayerPlayer4Name]
+Tex=Button
+X=565
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer4NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 4
+Color=White
+
+[PartyPlayerTeam2Name]
+Tex=PartyTeamButton2
+X=85
+Y=240
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Dark
+
+[PartyPlayerTeam2NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 2
+Color=White
+
+[PartyPlayerPlayer5Name]
+Tex=Button
+X=85
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer5NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 5
+Color=White
+
+[PartyPlayerPlayer6Name]
+Tex=Button
+X=245
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer6NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 6
+Color=White
+
+[PartyPlayerPlayer7Name]
+Tex=Button
+X=405
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer7NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 7
+Color=White
+
+[PartyPlayerPlayer8Name]
+Tex=Button
+X=565
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer8NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 8
+Color=White
+
+[PartyPlayerTeam3Name]
+Tex=Button
+Tex=PartyTeamButton2
+X=85
+Y=380
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Dark
+
+[PartyPlayerTeam3NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 3
+Color=White
+
+[PartyPlayerPlayer9Name]
+Tex=Button
+X=85
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer9NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 9
+Color=White
+
+[PartyPlayerPlayer10Name]
+Tex=Button
+X=245
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer10NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 10
+Color=White
+
+[PartyPlayerPlayer11Name]
+Tex=Button
+X=405
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer11NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 11
+Color=White
+
+[PartyPlayerPlayer12Name]
+Tex=Button
+X=565
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer12NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 12
+Color=White
+
+
+[SongMenu]
+Texts=0
+Statics=1
+
+[SongMenuButton1]
+X = 510
+Y = 165
+W = 270
+H = 25
+Tex =ButtonFade
+Color =ColorLight
+DColor = ColorDark
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton1Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_PLAY
+Align=0
+Z=0.99
+
+[SongMenuButton2]
+X = 510
+Y = 195
+W = 270
+H = 25
+Tex =ButtonFade
+Color =ColorLight
+DColor = ColorDark
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton2Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_EDIT
+Align=0
+Z=0.99
+
+[SongMenuButton3]
+X = 510
+Y = 225
+W = 270
+H = 25
+Tex =ButtonFade
+Color =ColorLight
+DColor = ColorDark
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton3Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_MODI
+Align=0
+Z=0.99
+
+[SongMenuButton4]
+X = 510
+Y = 255
+W = 270
+H = 25
+Tex =ButtonFade
+Color =ColorLight
+DColor = ColorDark
+Type=Font Black
+Texts=1
+Z = 0.98
+
+[SongMenuButton4Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_CANCEL
+Align=0
+Z=0.99
+
+[SongMenuSelectSlide3]
+Tex = Rectangle
+TexSBG = SongMenuSelectBG
+Text =
+X = 510
+Y = 225
+W = 0
+H = 25
+Z = 0.98
+SkipX = 0
+SBGW=270
+
+TextSize=8
+
+Color =ColorLight
+DColor = ColorDark
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorLight
+SBGDColor = ColorDark
+STColor = White
+STDColor = GrayDark
+
+[SongMenuTextMenu]
+X =560
+Y =125
+Color=White
+Font =0
+Size =14
+Text=MENU
+Align=0
+Z=0.99
+
+[SongMenuStatic2]
+X =513
+Y =130
+W =37
+H =21
+Color =White
+Tex =IconSongMenu
+Type=Font Black
+Z=0.98
+
+[SongMenuStatic1]
+Tex =SongMenuBG
+X =498
+Y =120
+W =300
+H =200
+Z =0.94
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[SongJumpto]
+Texts=0
+Statics=1
+
+[SongJumptoStatic1]
+Tex =JumpToBG
+X =221
+Y =175
+W =355
+H =175
+Z =0.98
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[SongJumptoStatic2]
+X =234
+Y =185
+W =21
+H =21
+Color =White
+Tex =MainSearch
+Type=Font Black
+Z=0.99
+
+[SongJumptoText1]
+X =310
+Y =175
+Color=White
+Font =0
+Size =14
+Text=SONG_JUMPTO_TYPE_DESC
+Align=0
+Z=0.99
+
+[SongJumptoSelectSlideType]
+Tex = button
+TexSBG = mainicon
+#Text = SONG_JUMPTO_TYPE_DESC
+Font=1
+X = 242
+Y = 205
+Z = 0.99
+W = 0
+H = 30
+SkipX = 4
+SBGW= 300
+Fields=2
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex = button
+SBGDColor = ColorLightest
+STColor = White
+STDColor = ColorLightest
+
+[SongJumptoButtonSearchText]
+X = 250
+Y = 215
+Z = 0.99
+W = 160
+H = 50
+Size=14
+Font=1
+Align=0
+
+[SongJumptoTextFound]
+X =234
+Y =295
+Color=White
+Font =0
+Size =8
+Text=SONG_JUMPTO_HELP
+Align=0
+Z=0.99
+
+[StatMain]
+Texts=0
+Statics=0
+
+[StatMainBackground]
+Tex=StatsBG
+
+[StatMainButtonScores]
+X =589
+Y =100
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonScoresText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SCORES
+Color=White
+
+[StatMainButtonSingers]
+X =589
+Y =160
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSingersText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SINGERS
+Color=White
+
+[StatMainButtonSongs]
+X =589
+Y =220
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSongsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_SONGS
+Color=White
+
+[StatMainButtonBands]
+X =589
+Y =280
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonBandsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_BANDS
+Color=White
+
+[StatMainButtonExit]
+X =589
+Y =340
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatMainTextOverview]
+X =45
+Y =125
+W =510
+Color=White
+Font =0
+Size =9
+Align=0
+Text=
+
+[StatMainStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =Turkis
+Tex =StatIcon
+Type=Font Black
+
+[StatMainStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatMainStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatMainStatic4]
+X =260
+Y =551
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[StatMainStatic5]
+X =388
+Y =551
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[StatMainStatic6]
+X =40
+Y =100
+W =520
+H =20
+Tex=StatMainBG1
+Color =ColorLight
+Type=Font Black
+
+[StatMainStatic7]
+X =40
+Y =120
+W =520
+H =300
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatMainStatic8]
+X =40
+Y =420
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+[StatMainText1]
+X =70
+Y =6
+Color=Turkis
+Font =0
+Size =20
+Text=STAT_MAIN
+Align=0
+
+[StatMainText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=STAT_MAIN_WHEREAMI
+
+[StatMainText3]
+X =70
+Y =53
+Color=Turkis
+Font =0
+Size =10
+Align =0
+Text=STAT_MAIN_DESC
+
+[StatMainText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatMainText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[StatDetail]
+Texts=0
+Statics=0
+
+[StatDetailBackground]
+Tex=StatsBGDet
+
+[StatDetailButtonNext]
+X =589
+Y =100
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonNextText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_NEXT
+Color=White
+
+[StatDetailButtonPrev]
+X =589
+Y =160
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonPrevText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_PREV
+Color=White
+
+[StatDetailButtonReverse]
+X =589
+Y =220
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonReverseText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_REVERSE
+Color=White
+
+[StatDetailButtonExit]
+X =589
+Y =280
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatDetailTextDescription]
+X =70
+Y =53
+Color=Turkis
+Font =0
+Size =10
+Align =0
+Text=
+
+[StatDetailTextPage]
+X = 546
+Y = 98
+Color= Black
+Font = 0
+Size = 5
+Align=2
+Text=
+
+[StatDetailTextList1]
+X = 45
+Y = 122
+Color=White
+Font = 0
+Size = 7
+Text=Stat1
+
+[StatDetailTextList2]
+X = 45
+Y = 160
+Color=White
+Font = 0
+Size = 7
+Text=Stat2
+
+[StatDetailTextList3]
+X = 45
+Y = 198
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList4]
+X = 45
+Y = 236
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList5]
+X = 45
+Y = 274
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList6]
+X = 45
+Y = 312
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList7]
+X = 45
+Y = 350
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList8]
+X = 45
+Y = 388
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList9]
+X = 45
+Y = 426
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList10]
+X = 45
+Y = 464
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =Turkis
+Tex =StatIcon
+Type=Font Black
+
+[StatDetailStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatDetailStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatDetailStatic4]
+X =260
+Y=551
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[StatDetailStatic5]
+X =388
+Y=551
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[StatDetailStatic6]
+X =40
+Y =100
+W =520
+H =24
+Tex=StatDetailBG1
+Color =ColorLight
+Type=Font Black
+
+[StatDetailStatic7]
+X =40
+Y =124
+W =520
+H =376
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatDetailStatic8]
+X =40
+Y =500
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+
+[StatDetailText1]
+X =70
+Y =6
+Color=Turkis
+Font =0
+Size =20
+Text=STAT_DETAIL
+Align=0
+
+[StatDetailText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=STAT_DETAIL_WHEREAMI
+
+[StatDetailText3]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatDetailText4]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[CheckPopup]
+Texts=1
+Statics=1
+
+[CheckPopupButton1]
+X = 285
+Y = 310
+W = 100
+H = 25
+Tex =ButtonFade
+Color =GrayPopup
+DColor =Turkis
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=JA
+Align=1
+Z=1
+
+[CheckPopupButton2]
+X = 415
+Y = 310
+W = 100
+H = 25
+Tex =ButtonFade
+Color =GrayPopup
+DColor =Turkis
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton2Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=NEIN
+Align=1
+Z=1
+
+[CheckPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[CheckPopupText1]
+X =282
+Y =147
+Color=White
+Font =0
+Size =10
+Text=MSG_QUESTION_TITLE
+Align=0
+Z=1
+
+[CheckPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =Turkis
+Type=Font Black
+
+[CheckPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[CheckPopupStatic3]
+Tex =IconQuestion
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopup]
+Texts=1
+Statics=1
+
+[ErrorPopupButton1]
+X = 350
+Y = 310
+W = 100
+H = 25
+Tex =ButtonFade
+Color =Turkis
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[ErrorPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=OK
+Align=1
+Z=1
+
+[ErrorPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[ErrorPopupText1]
+X =282
+Y =148
+Color=White
+Font =0
+Size =10
+Text=MSG_ERROR_TITLE
+Align=0
+Z=1
+
+[ErrorPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =Turkis
+Type=Font Black
+
+[ErrorPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopupStatic3]
+Tex =IconError
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
diff --git a/Game/Output/Themes/TODOs/iStar.ini b/Game/Output/Themes/TODOs/iStar.ini
new file mode 100644
index 00000000..5b7f2a54
--- /dev/null
+++ b/Game/Output/Themes/TODOs/iStar.ini
@@ -0,0 +1,7953 @@
+;1.0.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Theme]
+Name=iStar
+Creator=MezzoX
+
+[Colors]
+White = 255 255 255
+LightBlue = 119 187 210
+DarkBlue = 28 126 171
+LightRed = 170 146 146
+DarkRed = 155 113 113
+LightGreen = 136 168 136
+DarkGreen = 106 152 104
+LightPurple = 155 136 168
+DarkPurple = 145 104 152
+LightOrange = 168 155 136
+DarkOrange = 151 131 76
+LightYellow = 168 168 136
+DarkYellow = 150 151 76
+Turkis = 13 186 167
+GrayLightest = 223 223 223
+GrayLight = 191 191 191
+Gray = 127 127 127
+GrayDark = 63 63 63
+Black = 0 0 0
+GrayPopup = 51 51 51
+Gold = 255 223 31
+Silver = 223 223 223
+Bronze = 205 127 50
+
+[Loading]
+Texts =2
+Fade = 1
+
+[LoadingBackground]
+Tex=LoadingBG
+
+[LoadingText1]
+X =400
+Y =330
+Color =White
+Font =0
+Align =1
+Size =10
+Text =SING_LOADING
+
+[LoadingText2]
+X =790
+Y =552
+Color=White
+Font =0
+Size =7
+Align=2
+Text=US_VERSION
+
+[Main]
+Texts =2
+Statics=4
+
+[MainBackground]
+Tex=MenuBG
+
+[MainStatic1]
+X =0
+Y =0
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic2]
+X =252
+Y =0
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic3]
+X =260
+Y =0
+W =32
+H =24
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[MainText2]
+X =295
+Y =2
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[MainStatic4]
+X =385
+Y =0
+W =32
+H =24
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[MainText1]
+X =238
+Y =2
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_MENU
+
+[MainTextDescriptionLong]
+X =418
+Y =2
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=
+
+[MainButtonSolo]
+X =135
+Y =480
+W =90
+H =90
+Tex =Buttonmenu1
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+ReflectionSpacing=15
+DeSelectReflectionSpacing=280
+Fade=1
+FadeText=1
+SelectH=50
+FadeTex=ButtonFadeMenu
+FadeTexPos=0
+
+[MainButtonSoloText1]
+X =45
+Y =85
+Font=0
+Size=9
+Align=1
+Text=SING_SING
+Color=White
+
+[MainButtonMulti]
+X =245
+Y =480
+W =90
+H =90
+Tex =Buttonmenu2
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+ReflectionSpacing=15
+DeSelectReflectionSpacing=280
+Fade=1
+FadeText=1
+SelectH=50
+FadeTex=ButtonFadeMenu
+FadeTexPos=0
+
+[MainButtonMultiText1]
+X =45
+Y =85
+Font=0
+Size=9
+Align=1
+Text=SING_MULTI
+Color=White
+
+[MainButtonStats]
+X =355
+Y =480
+W =90
+H =90
+Tex =Buttonmenu3
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+ReflectionSpacing=15
+DeSelectReflectionSpacing=280
+Fade=1
+FadeText=1
+SelectH=50
+FadeTex=ButtonFadeMenu
+FadeTexPos=0
+
+[MainButtonStatsText1]
+X =45
+Y =85
+Font=0
+Size=9
+Align=1
+Text=SING_STATS
+Color=White
+
+[MainButtonOptions]
+X =465
+Y =480
+W =90
+H =90
+Tex =Buttonmenu4
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+ReflectionSpacing=15
+DeSelectReflectionSpacing=280
+Fade=1
+FadeText=1
+SelectH=50
+FadeTex=ButtonFadeMenu
+FadeTexPos=0
+
+[MainButtonOptionsText1]
+X =45
+Y =85
+Font=0
+Size=9
+Align=1
+Text=SING_OPTIONS
+Color=White
+
+[MainButtonExit]
+X =575
+Y =480
+W =90
+H =90
+Tex =Buttonmenu5
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+ReflectionSpacing=15
+DeSelectReflectionSpacing=280
+Fade=1
+FadeText=1
+SelectH=50
+FadeTex=ButtonFadeMenu
+FadeTexPos=0
+
+[MainButtonExitText1]
+X =45
+Y =85
+Font=0
+Size=9
+Align=1
+Text=SING_EXIT
+Color=White
+
+[Song]
+Texts =3
+
+[SongBackground]
+Tex=SongBG
+
+[SongCover]
+X=305
+Y=125
+W=320
+H=190
+Z=0.99
+Style=5
+Reflections=1
+
+[SongEqualizer]
+Visible=1
+Direction=1
+Color=White
+Alpha=1
+X=305
+Y=505
+Z=1
+PieceW=4
+PieceH=4
+Space=1
+Bands=17
+Length=10
+
+[SongVideoIcon]
+X =50
+Y =549
+W =27
+H =24
+Color=White
+Tex =VideoIcon
+Type=Plain
+
+[SongStatic1]
+X =0
+Y =549
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[SongStatic2]
+X =252
+Y =549
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[SongStatic3]
+X =300
+Y =119
+W =200
+H =400
+Z =0.98
+Color =ColorDark
+Tex =SongSelection1
+Type=Font Black
+
+[SongStatic4]
+X =305
+Y =125
+W =190
+H =190
+Z=0.5
+Color =ColorDark
+Tex =SongSelection2
+Type=Font Black
+
+[SongTextCat]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_SONG_SELECTION_DESC
+
+[SongTextArtist]
+X =400
+Y =325
+W =190
+Color=White
+Font =1
+Size =9
+Align =1
+Text=
+
+[SongTextTitle]
+X =400
+Y =380
+W =190
+Color=White
+Font =0
+Size =9
+Align =1
+Text=
+
+[SongTextNumber]
+X =495
+Y =490
+Color=White
+Font =0
+Size =8
+Align =2
+Text=
+
+#Variable statics and texts for song-screen in sing- and partymode
+# There can be an unlimited Number of Statics and Texts, As long
+# as the numbers are in order.
+# Statics that are shown in PartyMode Only are Named_
+# SongStaticParty[No]
+# Texts that are shown in PartyMode Only are Named_
+# SongTextParty[No]
+# Statics that are shown in Normal Mode Only are Named_
+# SongStaticNonParty[No]
+# Texts that are shown in Normal Mode Only are Named_
+# SongTextNonParty[No]
+#Here are the ones for singmode
+
+[SongStaticNonParty1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =SongCD
+Type=Font Black
+
+[SongStaticNonParty2]
+X =254
+Y =549
+W =32
+H =24
+Tex=ButtonAlt
+Color =White
+Type=Plain
+
+[SongStaticNonParty3]
+X =297
+Y =549
+W =32
+H =24
+Tex=ButtonAZ
+Color =White
+Type=Plain
+
+[SongStaticNonParty4]
+X =425
+Y =549
+W =25
+H =24
+Tex=ButtonM
+Color =White
+Type=Plain
+
+[SongStaticNonParty5]
+X =515
+Y =549
+W =25
+H =24
+Tex=ButtonJ
+Color =White
+Type=Plain
+
+[SongStaticNonParty6]
+X =679
+Y =549
+W =25
+H =24
+Tex=ButtonP
+Color =White
+Type=Plain
+
+#Texts Non Party
+[SongTextNonParty1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_SONG_SELECTION
+Align=0
+
+[SongTextNonParty2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_SONG_SELECTION_WHEREAMI
+
+[SongTextNonParty3]
+X =286
+Y =556
+Color=Black
+Font =1
+Size =5
+Align=0
+Text=+
+
+[SongTextNonParty4]
+X =330
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_GOTO
+
+[SongTextNonParty5]
+X =452
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_MENU
+
+[SongTextNonParty6]
+X =542
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SONG_JUMPTO_DESC
+
+[SongTextNonParty7]
+X =707
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_PLAYLIST
+
+
+#and theese are the ones for partymode
+
+[SongStaticParty1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[SongStaticParty2]
+X =260
+Y =549
+W =32
+H =24
+Tex=Button13
+Color =White
+Type=Plain
+
+[SongStaticParty3]
+X =400
+Y =549
+W =25
+H =24
+Tex=ButtonM
+Color =White
+Type=Plain
+
+[SongStaticParty4]
+X =540
+Y =549
+W =28
+H =24
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+#Texts for Party Mode
+
+[SongTextParty1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[SongTextParty2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_SONG_WHEREAMI
+
+[SongTextParty3]
+X =293
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SONG_MENU_NAME_PARTY_JOKER
+
+[SongTextParty4]
+X =426
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_MENU
+
+[SongTextParty5]
+X =570
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_LEGEND_CONTINUE
+
+#variable statics end
+
+
+# Jokers, 5 for each team, only shown in party Mode
+[SongStaticTeam1Joker1]
+Tex =Joker
+X =530
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker2]
+Tex =Joker
+X =580
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker3]
+Tex =Joker
+X =630
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker4]
+Tex =Joker
+X =680
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker5]
+Tex =Joker
+X =730
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker1]
+Tex =Joker
+X =530
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker2]
+Tex =Joker
+X =580
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker3]
+Tex =Joker
+X =630
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker4]
+Tex =Joker
+X =680
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker5]
+Tex =Joker
+X =730
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker1]
+Tex =Joker
+X =530
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker2]
+Tex =Joker
+X =580
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker3]
+Tex =Joker
+X =630
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker4]
+Tex =Joker
+X =680
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker5]
+Tex =Joker
+X =730
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+
+##################### Sing ####################
+
+[SingText1]
+Text =SING_TIME
+X =21
+Y =574
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingStatic1]
+;TextBG
+Tex =LyricBar
+X =10
+Y =490
+W =780
+H =85
+Color =White
+Type=Font Black
+
+[SingStatic2]
+;TimeBar
+Tex =TimeBar1
+X =10
+Y =575
+W =780
+H =16
+Color=Black
+Type=Font Black
+
+[SingTimeProgress]
+X =70
+Y =580
+W =652
+H =7
+Color=White
+
+[SingStatic3]
+;the thing behind the time progress
+Tex =TimeBar2
+X =70
+Y =580
+W =652
+H =7
+Color=GrayDark
+Type=Font Black
+
+[SingTimeText]
+Text =SING_TIME
+X =754
+Y =574
+Font =1
+Size =6
+Color =White
+Align=1
+
+
+# O N E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#PlayerOne
+[SingP1Static]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1Text]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1Static2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1SingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T W O P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1TwoPStatic]
+Tex =P
+X =20
+Y =117
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPText]
+Text =P1
+X =26
+Y =122
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1TwoPStatic2]
+Tex =ScoreBG
+X =680
+Y =102
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPTextScore]
+Text =00000
+X =690
+Y =104
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1TwoPSingBar]
+X =680
+Y =136
+W =100
+H =8
+
+#Player Two
+[SingP2RStatic]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P2Dark
+Type=Transparent
+
+[SingP2RText]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP2RStatic2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2RTextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2RSingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T H R E E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1ThreePStatic]
+Tex =P
+X =16
+Y =59
+W =50
+H =54
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePText]
+Text =P1
+X =27
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP1ThreePStatic2]
+Tex =ScoreBG
+X =75
+Y =61
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePTextScore]
+Text =00000
+X =85
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1ThreePSingBar]
+X =75
+Y =95
+W =100
+H =8
+
+#Player Two
+[SingP2MStatic]
+Tex =P
+X =311
+Y =59
+W =50
+H =54
+Color =P2Dark
+Type=Transparent
+
+[SingP2MText]
+Text =P2
+X =321
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP2MStatic2]
+Tex =ScoreBG
+X =370
+Y =61
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2MTextScore]
+Text =00000
+X =380
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2MSingBar]
+X =370
+Y =95
+W =100
+H =8
+
+#Player Three
+[SingP3RStatic]
+Tex =P
+X =611
+Y =59
+W =50
+H =54
+Color =P3Dark
+Type=Transparent
+
+[SingP3RText]
+Text =P3
+X =621
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP3RStatic2]
+Tex =ScoreBG
+X =670
+Y =61
+W =100
+H =34
+Color =P3Dark
+Type=Transparent
+
+[SingP3RTextScore]
+Text =00000
+X =680
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP3SingBar]
+X =670
+Y =95
+W =100
+H =8
+
+[Score]
+Texts =1
+
+[ScoreBackground]
+Tex=ScoreScreenBG
+
+[ScoreText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SONG_SCORE
+Align=0
+
+[ScoreTextArtistTitle]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=ArtistTitle
+
+[ScoreStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[ScoreStatic2]
+X =0
+Y =549
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreStatic3]
+X =252
+Y =549
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SONG_SCORE_WHEREAMI
+
+[ScoreStatic4]
+X =260
+Y =549
+W =28
+H =24
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[ScoreText3]
+X =290
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+#end of main stuff
+
+# # # # # # # # # # # # # # # # # # One Player Score # # # # # # # # # # # #
+[ScoreTextName1]
+X =175
+Y =260
+Font =0
+Size =14
+Text =P1
+Color =White
+Align=0
+
+[ScoreTextScore1]
+X =175
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes1]
+X =175
+Y =340
+Color=White
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore1]
+X =465
+Y =340
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextLineBonus1]
+X =175
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore1]
+X =465
+Y =370
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextGoldenNotes1]
+X =175
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore1]
+X =465
+Y =400
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextTotal1]
+X =205
+Y =460
+Color=White
+Font =0
+Size =14
+Text=SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore1]
+X =465
+Y =460
+Color=White
+Font =0
+Size =14
+Align =2
+Text =0
+
+#Lines
+[ScorePlayer1Static1]
+Tex =ScoreLine
+X =173
+Y =338
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static2]
+Tex =ScoreLine
+X =173
+Y =368
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static3]
+Tex =ScoreLine
+X =173
+Y =398
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static4]
+Tex =ScoreLine
+X =173
+Y =428
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static5]
+Tex =ScoreLine
+X =173
+Y =458
+W =295
+H =4
+Type =Font Black
+Color =White
+
+[ScoreStaticBoxDark1]
+Tex =PlayerNumberBox
+X =175
+Y =467
+W =25
+H =24
+Type =Font Black
+Color =P1Dark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Text1]
+X =179
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel1]
+Tex =ScoreLevel
+X =475
+Y =160
+W =150
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =130
+W =150
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel1]
+Tex =ScoreLevel
+X =475
+Y =410
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =380
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer1Static6]
+Tex =ScoreEndCap
+X =494
+Y =460
+W =112
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Static7]
+Tex =ScoreLine
+X =493
+Y =460
+W =114
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+
+# # # # # # # # # # # # # # # # # # Two Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName2]
+X =20
+Y =260
+Font =0
+Size =14
+Text =P1
+Color =White
+Align=0
+
+[ScoreTextScore2]
+X =20
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes2]
+X =20
+Y =340
+Color=White
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore2]
+X =300
+Y =340
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextLineBonus2]
+X =20
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore2]
+X =300
+Y =370
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextGoldenNotes2]
+X =20
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore2]
+X =300
+Y =400
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextTotal2]
+X =50
+Y =460
+Color=White
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore2]
+X =300
+Y =460
+Color=White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+# Lines
+[ScorePlayer2Static1]
+Tex =ScoreLine
+X =20
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static2]
+Tex =ScoreLine
+X =20
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static3]
+Tex =ScoreLine
+X =20
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static4]
+Tex =ScoreLine
+X =20
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static5]
+Tex =ScoreLine
+X =20
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =White
+
+[ScoreStaticBoxDark2]
+Tex =PlayerNumberBox
+X =20
+Y =467
+W =25
+H =24
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Text1]
+X =24
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel2]
+Tex =ScoreLevel
+X =293
+Y =160
+W =120
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =130
+W =120
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScoreStaticLevel2]
+Tex =ScoreLevel
+X =293
+Y =410
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =380
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScorePlayer2Static6]
+Tex =ScoreEndCap
+X =308
+Y =460
+W =90
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Static7]
+Tex =ScoreLine
+X =307
+Y =460
+W =92
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# P L A Y E R T W O
+[ScoreTextName3]
+X =780
+Y =260
+Font =0
+Size =14
+Text =P2
+Color =White
+Align=2
+
+[ScoreTextScore3]
+X =780
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=2
+
+[ScoreTextNotes3]
+X =780
+Y =340
+Color=White
+Font =0
+Size =9
+Text =SING_NOTES
+Align=2
+
+[ScoreTextNotesScore3]
+X =500
+Y =340
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextLineBonus3]
+X =780
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=2
+
+[ScoreTextLineBonusScore3]
+X =500
+Y =370
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextGoldenNotes3]
+X =780
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=2
+
+[ScoreTextGoldenNotesScore3]
+X =500
+Y =400
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextTotal3]
+X =750
+Y =460
+Color=White
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=2
+Reflection=1
+ReflectionSpacing=4
+
+[ScoreTextTotalScore3]
+X =500
+Y =460
+Color=White
+Font =0
+Size =14
+Align =0
+Text =00000
+Reflection=1
+ReflectionSpacing=4
+
+#Lines
+[ScorePlayer3Static1]
+Tex =ScoreLine
+X =500
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static2]
+Tex =ScoreLine
+X =500
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static3]
+Tex =ScoreLine
+X =500
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static4]
+Tex =ScoreLine
+X =500
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static5]
+Tex =ScoreLine
+X =500
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =White
+
+[ScoreStaticBoxDark3]
+Tex =PlayerNumberBox
+X =755
+Y =467
+W =25
+H =24
+Type =Font Black
+Color =P2Dark
+Z=0.9
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Text1]
+X =759
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+#ScoreBar
+[ScoreStaticBackLevel3]
+Tex =ScoreLevel
+X =387
+Y =160
+W =120
+H =300
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =130
+W =120
+H =30
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel3]
+Tex =ScoreLevel
+X =387
+Y =410
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =380
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScorePlayer3Static6]
+Tex =ScoreEndCap
+X =402
+Y =460
+W =90
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Static7]
+Tex =ScoreLine
+X =401
+Y =460
+W =92
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# # # # # # # # # # # # # # # # # # Three Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName4]
+X=20
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P1
+Color=P1Dark
+
+[ScoreTextNotes4]
+X=20
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore4]
+X=260
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus4]
+X=20
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore4]
+X=260
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes4]
+X=20
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore4]
+X=260
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore4]
+X=20
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal4]
+X=47
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore4]
+X=260
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark4]
+Tex =PlayerNumberBox
+X =20
+Y =370
+W =25
+H =24
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer4Text1]
+X =24
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#lines
+[ScorePlayer4Static1]
+X=20
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static2]
+X=20
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static3]
+X=20
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static4]
+X=20
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static5]
+X=20
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+# P L A Y E R T W O
+[ScoreTextName5]
+X=280
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P2
+Color=P2Dark
+
+[ScoreTextNotes5]
+X=280
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore5]
+X=520
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus5]
+X=280
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore5]
+X=520
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes5]
+X=280
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore5]
+X=520
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore5]
+X=280
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal5]
+X=307
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore5]
+X=520
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark5]
+Tex =PlayerNumberBox
+X =280
+Y =370
+W =25
+H =24
+Type =Font Black
+Color =P2Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer5Text1]
+X =284
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+[ScorePlayer5Static1]
+X=280
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static2]
+X=280
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static3]
+X=280
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static4]
+X=280
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static5]
+X=280
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+# P L A Y E R T H R E E
+[ScoreTextName6]
+X=540
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P3
+Color=P3Dark
+
+[ScoreTextNotes6]
+X=540
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore6]
+X=780
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus6]
+X=540
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore6]
+X=780
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes6]
+X=540
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore6]
+X=780
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore6]
+X=540
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal6]
+X=567
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore6]
+X=780
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark6]
+Tex =PlayerNumberBox
+X =540
+Y =370
+W =25
+H =24
+Type =Font Black
+Color =P3Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer6Text1]
+X =544
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P3
+
+#lines
+[ScorePlayer6Static1]
+X=540
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static2]
+X=540
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static3]
+X=540
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static4]
+X=540
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static5]
+X=540
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[Options]
+Texts = 6
+Fade = 2
+
+[OptionsBackground]
+Tex=OptionsBG
+
+[OptionsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsStatic2]
+X =0
+Y =549
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic3]
+X =252
+Y =549
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic4]
+X =260
+Y =549
+W =30
+H =24
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsStatic5]
+X =388
+Y =549
+W =28
+H =24
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[OptionsStatic6]
+X =512
+Y =549
+W =32
+H =24
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsText2]
+X =238
+Y =550
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_WHEREAMI
+
+[OptionsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_DESC
+
+[OptionsText4]
+X =294
+Y =550
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsText5]
+X =418
+Y =550
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_SELECT
+
+[OptionsText6]
+X =545
+Y =550
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsButtonGame]
+X =100
+Y =215
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=50
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonGameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_GAME
+Color=White
+
+[OptionsButtonGraphics]
+X =255
+Y =215
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=50
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonGraphicsText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_GRAPHICS
+Color=White
+
+[OptionsButtonSound]
+X =410
+Y =215
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=50
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonSoundText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_SOUND
+Color=White
+
+[OptionsButtonLyrics]
+X =565
+Y =215
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=50
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonLyricsText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_LYRICS
+Color=White
+
+[OptionsButtonThemes]
+X =100
+Y =335
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=50
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonThemesText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_THEMES
+Color=White
+
+[OptionsButtonRecord]
+X =255
+Y =335
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=50
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonRecordText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_RECORD
+Color=White
+Texts=1
+
+[OptionsButtonAdvanced]
+X =410
+Y =335
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=50
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonAdvancedText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_ADVANCED
+Color=White
+Texts=1
+
+[OptionsButtonExit]
+X =565
+Y =335
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =ColorLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=50
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonExitText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[OptionsGame]
+Texts = 5
+
+[OptionsGameBackground]
+Tex=OptionsBG
+
+[OptionsGameStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGameStatic2]
+X =0
+Y =549
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGameStatic3]
+X =252
+Y =549
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGameStatic4]
+X =260
+Y =549
+W =32
+H =24
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsGameStatic5]
+X =388
+Y =549
+W =32
+H =24
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsGameText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGameText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GAME_WHEREAMI
+
+[OptionsGameText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GAME_DESC
+
+[OptionsGameText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGameText5]
+X =423
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGameSelectPlayers]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_PLAYERS
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDifficulty]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DIFFICULTY
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+
+[OptionsGameSelectSlideLanguage]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_LANGUAGE
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectTabs]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_TABS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectSlideSorting]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_SORTING
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDebug]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DEBUG
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsGraphics]
+Texts = 5
+
+[OptionsGraphicsBackground]
+Tex=OptionsBG
+
+[OptionsGraphicsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGraphicsStatic2]
+X =0
+Y =549
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic3]
+X =252
+Y =549
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic4]
+X =260
+Y =549
+W =32
+H =24
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsGraphicsStatic5]
+X =388
+Y =549
+W =32
+H =24
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsGraphicsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGraphicsText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GRAPHICS_WHEREAMI
+
+[OptionsGraphicsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GRAPHICS_DESC
+
+[OptionsGraphicsText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGraphicsText5]
+X =423
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGraphicsSelectSlideResolution]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_GRAPHICS_RESOLUTION
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectFullscreen]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_FULLSCREEN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectDepth]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_DEPTH
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectOscilloscope]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_OSCILLOSCOPE
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectMovieSize]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_MOVIE_SIZE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsButtonExit]
+X = 40
+Y = 360
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsSound]
+Texts = 5
+
+[OptionsSoundBackground]
+Tex=OptionsBG
+
+[OptionsSoundStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsSoundStatic2]
+X =0
+Y =549
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic3]
+X =252
+Y =549
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic4]
+X =260
+Y =549
+W =32
+H =24
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsSoundStatic5]
+X =388
+Y =549
+W =32
+H =24
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsSoundText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsSoundText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_SOUND_WHEREAMI
+
+[OptionsSoundText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_SOUND_DESC
+
+[OptionsSoundText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsSoundText5]
+X =423
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsSoundSelectMicBoost]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_MIC_BOOST
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectClickAssist]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_CLICK_ASSIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectBeatClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_BEAT_CLICK
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectThreshold]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_THRESHOLD
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectTwoPlayerMode]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_TWO_PLAYERS_MODE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewVolume]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWVOLUME
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewFADING]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWFADING
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsLyrics]
+Texts = 1
+
+[OptionsLyricsBackground]
+Tex=OptionsBG
+
+[OptionsLyricsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsLyricsStatic2]
+X =0
+Y =549
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic3]
+X =252
+Y =549
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic4]
+X =260
+Y =549
+W =32
+H =24
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsLyricsStatic5]
+X =388
+Y =549
+W =32
+H =24
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsLyricsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsLyricsText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_LYRICS_WHEREAMI
+
+[OptionsLyricsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_LYRICS_DESC
+
+[OptionsLyricsText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsLyricsText5]
+X =423
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsLyricsSelectLyricsFont]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_FONT
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectLyricsEffect]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_EFFECT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectSolmization]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_SOLMIZATION
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsThemes]
+Texts = 5
+
+[OptionsThemesBackground]
+Tex=OptionsBG
+
+[OptionsThemesStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsThemesStatic2]
+X =0
+Y =549
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic3]
+X =252
+Y =549
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic4]
+X =260
+Y =549
+W =32
+H =24
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsThemesStatic5]
+X =388
+Y =549
+W =32
+H =24
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsThemesText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsThemesText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_THEMES_WHEREAMI
+
+[OptionsThemesText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_THEMES_DESC
+
+[OptionsThemesText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsThemesText5]
+X =423
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsThemesSelectTheme]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_THEME
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectSkin]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_SKIN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectColor]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_COLOR
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsRecord]
+Texts = 5
+
+[OptionsRecordBackground]
+Tex=OptionsBG
+
+[OptionsRecordStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsRecordStatic2]
+X =0
+Y =549
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic3]
+X =252
+Y =549
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic4]
+X =260
+Y =549
+W =32
+H =24
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsRecordStatic5]
+X =388
+Y =549
+W =32
+H =24
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsRecordText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsRecordText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_RECORD_WHEREAMI
+
+[OptionsRecordText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_RECORD_DESC
+
+[OptionsRecordText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsRecordText5]
+X =423
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsRecordSelectSlideCard]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CARD
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideInput]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_INPUT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelL]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELL
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelR]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELR
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordButtonExit]
+X = 40
+Y = 305
+W = 230
+H = 70
+Tex = MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsAdvanced]
+Texts = 5
+
+[OptionsAdvancedBackground]
+Tex=OptionsBG
+
+[OptionsAdvancedStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsAdvancedStatic2]
+X =0
+Y =549
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic3]
+X =252
+Y =549
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic4]
+X =260
+Y =549
+W =32
+H =24
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsAdvancedStatic5]
+X =388
+Y =549
+W =32
+H =24
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsAdvancedText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsAdvancedText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_ADVANCED_WHEREAMI
+
+[OptionsAdvancedText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_ADVANCED_DESC
+
+[OptionsAdvancedText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsAdvancedText5]
+X =423
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+
+#########unused at the moment#########
+#[OptionsAdvancedSelectLoadAnimation]
+#Tex =MainBar
+#TexSBG =SelectBG
+#Text=SING_OPTIONS_ADVANCED_LOADANIMATION
+#X = 40
+#Y = 85
+#W = 230
+#H = 70
+#SkipX = 50
+
+#Color = ColorDark
+#DColor = Gray
+#TColor = White
+#TDColor = White
+#SBGTex =MainBar
+#SBGColor = ColorDark
+#SBGDColor = Gray
+#STColor = White
+#STDColor = GrayDark
+
+[OptionsAdvancedSelectScreenFade]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_SCREENFADE
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectEffectSing]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_EFFECTSING
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectLineBonus]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_LINEBONUS
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectSlideOnSongClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_ADVANCED_ONSONGCLICK
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectAskbeforeDel]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_ASKBEFOREDEL
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectPartyPopup]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_PARTYPOPUP
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[Top5]
+Texts=1
+
+[Top5Background]
+Tex=Top5BG
+
+[Top5Text1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Align=0
+Text =SING_TOP_5_CHARTS
+
+[Top5TextArtistTitle]
+X =70
+Y =53
+Color =White
+Font =0
+Size =10
+Align =0
+Text =artist - title
+
+[Top5Text4]
+X =70
+Y =73
+Color=White
+Font =0
+Size =10
+Align=0
+Text =SING_OPTIONS_GAME_DIFFICULTY
+
+[Top5TextLevel]
+X =270
+Y =73
+Color =White
+Font =0
+Size =10
+Align =1
+Text =easy
+
+[Top5Static1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[Top5Static2]
+X =0
+Y =549
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[Top5Static3]
+X =252
+Y =549
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[Top5Text2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_TOP_5_CHARTS_WHEREAMI
+
+[Top5Static4]
+X =260
+Y =549
+W =28
+H =24
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[Top5Text3]
+X =292
+Y =551
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_TOP_5_CHARTS_CONTINUE
+
+[Top5TextName1]
+X =150
+Y =190
+Color =White
+Font =0
+Size =14
+Align =0
+Text =1. Player1
+
+[Top5TextName2]
+X =150
+Y =240
+Color =White
+Font =0
+Size =14
+Align =0
+Text =2. Player2
+
+[Top5TextName3]
+X =150
+Y =290
+Color =White
+Font =0
+Size =14
+Align =0
+Text =3. Player3
+
+[Top5TextName4]
+X =150
+Y =340
+Color =White
+Font =0
+Size =14
+Align =0
+Text =4. Player4
+
+[Top5TextName5]
+X =150
+Y =390
+Color =White
+Font =0
+Size =14
+Align =0
+Text =5. Player5
+
+[Top5TextScore1]
+X =680
+Y =190
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore2]
+X =680
+Y =240
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore3]
+X =680
+Y =290
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore4]
+X =680
+Y =340
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore5]
+X =680
+Y =390
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextNumber1]
+X =120
+Y =193
+Color =White
+Font =1
+Size =9
+Align =1
+Text =1
+
+[Top5TextNumber2]
+X =120
+Y =243
+Color =White
+Font =1
+Size =9
+Align =1
+Text =2
+
+[Top5TextNumber3]
+X =120
+Y =293
+Color =White
+Font =1
+Size =9
+Align =1
+Text =3
+
+[Top5TextNumber4]
+X =120
+Y =343
+Color =White
+Font =1
+Size =9
+Align =1
+Text =4
+
+[Top5TextNumber5]
+X =120
+Y =393
+Color =White
+Font =1
+Size =9
+Align =1
+Text =5
+
+[Top5StaticNumber1]
+Tex=PlayerNumberBox
+X=100
+Y=186
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber2]
+Tex=PlayerNumberBox
+X=100
+Y=236
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber3]
+Tex=PlayerNumberBox
+X=100
+Y=286
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber4]
+Tex=PlayerNumberBox
+X=100
+Y=336
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber5]
+Tex=PlayerNumberBox
+X=100
+Y=386
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Level]
+Texts=5
+
+[LevelBackground]
+Tex=MainBG
+
+[LevelStatic1]
+X =0
+Y =549
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[LevelStatic2]
+X =252
+Y =549
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[LevelStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =MainIcon
+Type=Font Black
+
+[LevelStatic4]
+X =260
+Y =549
+W =32
+H =24
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[LevelStatic5]
+X =388
+Y =549
+W =28
+H =24
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[LevelText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=SING_MODE
+
+[LevelText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_DIFFICULTY_DESC
+
+[LevelText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_DIFFICULTY_WHEREAMI
+
+[LevelText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[LevelText5]
+X =420
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_DIFFICULTY_CONTINUE
+
+[LevelButtonEasy]
+X =180
+Y =270
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=50
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[LevelButtonMedium]
+X =335
+Y =270
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=50
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[LevelButtonHard]
+X =490
+Y =270
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=50
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[LevelButtonEasyText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=SING_EASY
+
+[LevelButtonMediumText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=SING_MEDIUM
+
+[LevelButtonHardText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=SING_HARD
+
+[Name]
+Texts=2
+
+[NameBackground]
+Tex=MainBG
+
+[NameStatic1]
+X =0
+Y =549
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[NameStatic2]
+X =252
+Y =549
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[NameStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =MainIcon
+Type=Font Black
+
+[NameText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=SING_MODE
+
+[NameText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_PLAYER_DESC
+
+[NameText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_PLAYER_WHEREAMI
+
+[NameStatic4]
+X =260
+Y =549
+W =32
+H =24
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[NameText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[NameStatic5]
+X =388
+Y =549
+W =32
+H =24
+Tex=ButtonAZ
+Color =White
+Type=Plain
+Style=5
+
+[NameText5]
+X =423
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_PLAYER_ENTER_NAME
+
+[NameStatic6]
+X =556
+Y =549
+W =28
+H =24
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[NameText6]
+X =586
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[NameButtonPlayer1]
+X =180
+Y =270
+W =150
+H =50
+Tex =Button
+Color =P1Dark
+DColor = P1Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer1Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer2]
+X =335
+Y =270
+W =150
+H =50
+Tex =Button
+Color =P2Dark
+DColor = P2Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer2Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer3]
+X =490
+Y =270
+W =150
+H =50
+Tex =Button
+Color =P3Dark
+DColor = P3Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer3Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer4]
+X =180
+Y =400
+W =150
+H =50
+Tex =Button
+Color =P4Dark
+DColor = P4Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer4Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer5]
+X =335
+Y =400
+W =150
+H =50
+Tex =Button
+Color =P5Dark
+DColor = P5Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer5Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer6]
+X =490
+Y =400
+W =150
+H =50
+Tex =Button
+Color =P6Dark
+DColor = P6Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer6Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[PartyNewRound]
+Texts =7
+
+[PartyNewRoundBackground]
+Tex=MainBG
+
+[PartyNewRoundStatic1]
+X =0
+Y =549
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic2]
+X =252
+Y =549
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyNewRoundText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyNewRoundText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_ROUND_DESC
+
+[PartyNewRoundText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_ROUND_WHEREAMI
+
+[PartyNewRoundText4]
+X =290
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_ROUND_LEGEND_CONTINUE
+
+[PartyNewRoundText5]
+X =460
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND
+Align=0
+
+[PartyNewRoundText6]
+X =600
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND_WINNER
+Align=0
+
+[PartyNewRoundText7]
+X =448
+Y =350
+Color =White
+Font =0
+Size =18
+Text =PARTY_ROUND
+Align=2
+
+[PartyNewRoundTextTeam1Players]
+X =30
+Y =137
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam2Players]
+X =30
+Y =218
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam3Players]
+X =30
+Y =299
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundStatic4]
+Tex =PartyRoundBG1
+X =450
+Y =103
+W = 330
+H = 24
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[PartyNewRoundStatic5]
+X =260
+Y =549
+W =28
+H =24
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[PartyNewRoundStatic6]
+Tex =PartyRoundBG3
+X =250
+Y =350
+W = 300
+H = 50
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[PartyNewRoundStatic7]
+Tex =PartyRoundBG4
+X =50
+Y =495
+W = 700
+H = 30
+Int=1
+Color =ColorLight
+Type=Font Black
+
+[PartyNewRoundStaticTeam1]
+Tex =PartyTeamButton1
+X =20
+Y =110
+W =400
+H =50
+Int=1
+Color =P1Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam2]
+Tex =PartyTeamButton1
+X =20
+Y =191
+W =400
+H =50
+Int=1
+Color =P2Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam3]
+Tex =PartyTeamButton1
+X =20
+Y =272
+W =400
+H =50
+Int=1
+Color =P3Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticNextPlayer1]
+Tex=PartyPlayerButton
+X=155
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P1Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer2]
+Tex=PartyPlayerButton
+X=325
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P2Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer3]
+Tex=PartyPlayerButton
+X=495
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P3Light
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyNewRoundTextRound1]
+X =460
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Round 1
+Align=0
+
+[PartyNewRoundTextRound2]
+X =460
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Round 2
+Align=0
+
+[PartyNewRoundTextRound3]
+X =460
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Round 3
+Align=0
+
+[PartyNewRoundTextRound4]
+X =460
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Round 4
+Align=0
+
+[PartyNewRoundTextRound5]
+X =460
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Round 5
+Align=0
+
+[PartyNewRoundTextRound6]
+X =460
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Round 6
+Align=0
+
+[PartyNewRoundTextRound7]
+X =460
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Round 7
+Align=0
+
+[PartyNewRoundTextWinner1]
+X =600
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Winner 1
+Align=0
+
+[PartyNewRoundTextWinner2]
+X =600
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Winner 2
+Align=0
+
+[PartyNewRoundTextWinner3]
+X =600
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Winner 3
+Align=0
+
+[PartyNewRoundTextWinner4]
+X =600
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Winner 4
+Align=0
+
+[PartyNewRoundTextWinner5]
+X =600
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Winner 5
+Align=0
+
+[PartyNewRoundTextWinner6]
+X =600
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Winner 6
+Align=0
+
+[PartyNewRoundTextWinner7]
+X =600
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Winner 7
+Align=0
+
+[PartyNewRoundStaticRound1]
+Tex =PartyRoundBG2
+X =450
+Y =135
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound2]
+Tex =PartyRoundBG2
+X =450
+Y =164
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound3]
+Tex =PartyRoundBG2
+X =450
+Y =193
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound4]
+Tex =PartyRoundBG2
+X =450
+Y =222
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound5]
+Tex =PartyRoundBG2
+X =450
+Y =251
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound6]
+Tex =PartyRoundBG2
+X =450
+Y =280
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound7]
+Tex =PartyRoundBG2
+X =450
+Y =309
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundTextNextRound]
+X =400
+Y =495
+Color =White
+Font =0
+Size =10
+Text =Next Round
+Align=1
+
+[PartyNewRoundTextNextRoundNo]
+X =457
+Y =350
+Color =White
+Font =0
+Size =18
+Text =99
+Align=0
+
+[PartyNewRoundTextScoreTeam1]
+X =390
+Y =110
+Color =White
+Font =0
+Size =17
+Text =3000
+Align=1
+
+[PartyNewRoundTextScoreTeam2]
+X =390
+Y =191
+Color =White
+Font =0
+Size =17
+Text =2000
+Align=1
+
+[PartyNewRoundTextScoreTeam3]
+X =390
+Y =272
+Color =White
+Font =0
+Size =17
+Text =1000
+Align=1
+
+[PartyNewRoundTextNameTeam1]
+X =30
+Y =108
+Color =White
+Font =0
+Size =12
+Text =Team 1
+Align=0
+
+[PartyNewRoundTextNameTeam2]
+X =30
+Y =189
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyNewRoundTextNameTeam3]
+X =30
+Y =270
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyNewRoundTextNextPlayer1]
+X =230
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 1
+Align=1
+
+[PartyNewRoundTextNextPlayer2]
+X =400
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 2
+Align=1
+
+[PartyNewRoundTextNextPlayer3]
+X =570
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 3
+Align=1
+
+
+[PartyScore]
+Texts=5
+
+[PartyScoreBackground]
+Tex=PartyBG
+
+[PartyScoreDecoTextures]
+ChangeTextures =1
+
+FirstTexture =PartyScoreDeco
+FirstTyp =Font Black
+FirstColor =Gold
+
+SecondTexture =PartyScoreDeco
+SecondTyp =Font Black
+SecondColor =Silver
+
+ThirdTexture =PartyScoreDeco
+ThirdTyp =Font Black
+ThirdColor =Bronze
+
+[PartyScoreStatic1]
+X =0
+Y =549
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic2]
+X =252
+Y =549
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyScoreStatic4]
+X =260
+Y =549
+W =28
+H =24
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[PartyScoreText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyScoreText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_SCORE_DESC
+
+[PartyScoreText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_SCORE_WHEREAMI
+
+[PartyScoreText4]
+X =290
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_LEGEND_CONTINUE
+
+[PartyScoreStatic5]
+Tex =PartyScoreBG1
+X =50
+Y =100
+W = 700
+H = 80
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[PartyScoreStatic6]
+Tex =PartyScoreBG2
+X =50
+Y =495
+W = 700
+H = 20
+Int=1
+Color =ColorLight
+Type=Font Black
+
+[PartyScoreText5]
+X =400
+Y =136
+Color =White
+Font =0
+Size =15
+Text =PARTY_SCORE_WINS2
+Align=1
+
+[PartyScoreTextWinner]
+X =400
+Y =98
+Color =White
+Font =0
+Size =18
+Text =The Winner is...
+Align=1
+
+[PartyScoreTextScoreTeam1]
+X =568
+Y =198
+Color =White
+Font =0
+Size =12
+Text =3000
+Align=2
+
+[PartyScoreTextScoreTeam2]
+X =568
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyScoreTextScoreTeam3]
+X =568
+Y =398
+Color =White
+Font =0
+Size =12
+Text =1000
+Align=2
+
+[PartyScoreTextNameTeam1]
+X =188
+Y =198
+Font=0
+Size=12
+Align=0
+Text=Team 1
+Color=White
+
+[PartyScoreTextNameTeam2]
+X =188
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyScoreTextNameTeam3]
+X =188
+Y =398
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyScoreStaticTeam1]
+X =188
+Y =230
+W =380
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam1BG]
+Tex=PartyTeamButton2
+X=178
+Y=200
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam1Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 191
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam2]
+X =188
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam2BG]
+Tex=PartyTeamButton2
+X=178
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam2Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam3]
+X =188
+Y =430
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam3BG]
+Tex=PartyTeamButton2
+X=178
+Y=400
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam3Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 391
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyWin]
+Texts=4
+
+[PartyWinBackground]
+Tex=PartyBG
+
+[PartyWinStatic1]
+X =0
+Y =549
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic2]
+X =252
+Y =549
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyWinStatic4]
+X =260
+Y =549
+W =28
+H =24
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[PartyWinText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyWinText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_WIN_DESC
+
+[PartyWinText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_WIN_WHEREAMI
+
+[PartyWinText4]
+X =290
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_WIN_LEGEND_CONTINUE
+
+#[PartyWinTextWinner]
+#X =150
+#Y =120
+#Color =White
+#Font =1
+#Size =14
+#Text =The Winner is...
+#Align=0
+
+[PartyWinTextScoreTeam1]
+X =699
+Y =183
+Color =White
+Font =0
+Size =19
+Text =3000
+Align=2
+
+[PartyWinTextScoreTeam2]
+X =669
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyWinTextScoreTeam3]
+X =649
+Y =398
+Color =White
+Font =0
+Size =9
+Text =1000
+Align=2
+
+[PartyWinTextNameTeam1]
+X =169
+Y =183
+Font=0
+Size=19
+Align=0
+Text=Team 1
+Color=White
+
+[PartyWinTextNameTeam2]
+X =289
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyWinTextNameTeam3]
+X =369
+Y =398
+Color =White
+Font =0
+Size =9
+Text =Team 3
+Align=0
+
+[PartyWinStaticTeam1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BG]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank2]
+Tex=PartyTeamButton3
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank3]
+Tex=PartyTeamButton3
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyWinStaticTeam1Deco]
+Tex =PartyWinDeco1
+X = 91
+Y = 176
+W = 79
+H = 79
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BG]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamButton3
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank1]
+Tex=PartyTeamButton4
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank2]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank3]
+Tex=PartyTeamButton4
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Deco]
+Tex =PartyWinDeco2
+X = 226
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Silver
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BG]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank2]
+Tex=PartyTeamButton5
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank3]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Deco]
+Tex =PartyWinDeco3
+X = 316
+Y = 391
+W = 54
+H = 54
+Type =Font Black
+Color =Bronze
+Reflection=1
+ReflectionSpacing=3
+
+[PartyOptions]
+Texts = 5
+
+[PartyOptionsBackground]
+Tex=PartyBG
+
+[PartyOptionsStatic1]
+X =0
+Y =549
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsStatic2]
+X =252
+Y =549
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyOptionsStatic4]
+X =260
+Y =549
+W =32
+H =24
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[PartyOptionsStatic5]
+X =388
+Y =549
+W =28
+H =24
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[PartyOptionsText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyOptionsText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_OPTIONS_DESC
+
+[PartyOptionsText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_OPTIONS_WHEREAMI
+
+[PartyOptionsText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyOptionsText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[PartyOptionsSelectLevel]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_DIFFICULTY
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectRounds]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_ROUNDS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectTeams]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers1]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER1
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER2
+X = 40
+Y = 415
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers3]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER3
+X = 40
+Y = 470
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+
+
+[PartyPlayer]
+Texts=6
+
+[PartyPlayerBackground]
+Tex=PartyBG
+
+[PartyPlayerStatic1]
+X =0
+Y =549
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerStatic2]
+X =252
+Y =549
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyPlayerStatic4]
+X =260
+Y =549
+W =32
+H =24
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[PartyPlayerStatic5]
+X =388
+Y =549
+W =32
+H =24
+Tex=ButtonAZ
+Color =White
+Type=Plain
+Style=5
+
+[PartyPlayerStatic6]
+X =556
+Y =549
+W =28
+H =24
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[PartyPlayerText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyPlayerText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_PLAYER_DESC
+
+[PartyPlayerText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_PLAYER_WHEREAMI
+
+[PartyPlayerText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyPlayerText5]
+X =423
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_ENTER_NAME
+
+[PartyPlayerText6]
+X =586
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_LEGEND_CONTINUE
+
+[PartyPlayerTeam1Name]
+Tex=PartyTeamButton2
+X=85
+Y=100
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Dark
+
+[PartyPlayerTeam1NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 1
+Color=White
+
+[PartyPlayerPlayer1Name]
+Tex=Button
+X=85
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer1NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 1
+Color=White
+
+[PartyPlayerPlayer2Name]
+Tex=Button
+X=245
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer2NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 2
+Color=White
+
+[PartyPlayerPlayer3Name]
+Tex=Button
+X=405
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer3NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 3
+Color=White
+
+[PartyPlayerPlayer4Name]
+Tex=Button
+X=565
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer4NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 4
+Color=White
+
+[PartyPlayerTeam2Name]
+Tex=PartyTeamButton2
+X=85
+Y=240
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Dark
+
+[PartyPlayerTeam2NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 2
+Color=White
+
+[PartyPlayerPlayer5Name]
+Tex=Button
+X=85
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer5NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 5
+Color=White
+
+[PartyPlayerPlayer6Name]
+Tex=Button
+X=245
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer6NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 6
+Color=White
+
+[PartyPlayerPlayer7Name]
+Tex=Button
+X=405
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer7NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 7
+Color=White
+
+[PartyPlayerPlayer8Name]
+Tex=Button
+X=565
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer8NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 8
+Color=White
+
+[PartyPlayerTeam3Name]
+Tex=Button
+Tex=PartyTeamButton2
+X=85
+Y=380
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Dark
+
+[PartyPlayerTeam3NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 3
+Color=White
+
+[PartyPlayerPlayer9Name]
+Tex=Button
+X=85
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer9NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 9
+Color=White
+
+[PartyPlayerPlayer10Name]
+Tex=Button
+X=245
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer10NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 10
+Color=White
+
+[PartyPlayerPlayer11Name]
+Tex=Button
+X=405
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer11NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 11
+Color=White
+
+[PartyPlayerPlayer12Name]
+Tex=Button
+X=565
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer12NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 12
+Color=White
+
+
+[SongMenu]
+Texts=0
+Statics=1
+
+[SongMenuButton1]
+X = 510
+Y = 165
+W = 270
+H = 25
+Tex =Rectangle
+Color =ColorLight
+DColor = ColorDark
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton1Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_PLAY
+Align=0
+Z=0.99
+
+[SongMenuButton2]
+X = 510
+Y = 195
+W = 270
+H = 25
+Tex =Rectangle
+Color =ColorLight
+DColor = ColorDark
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton2Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_EDIT
+Align=0
+Z=0.99
+
+[SongMenuButton3]
+X = 510
+Y = 225
+W = 270
+H = 25
+Tex =Rectangle
+Color =ColorLight
+DColor = ColorDark
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton3Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_MODI
+Align=0
+Z=0.99
+
+[SongMenuButton4]
+X = 510
+Y = 255
+W = 270
+H = 25
+Tex = Rectangle
+Color =ColorLight
+DColor = ColorDark
+Type=Font Black
+Texts=1
+Z = 0.98
+
+[SongMenuButton4Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_CANCEL
+Align=0
+Z=0.99
+
+[SongMenuSelectSlide3]
+Tex = Rectangle
+TexSBG = SongMenuSelectBG
+Text =
+X = 510
+Y = 225
+W = 0
+H = 25
+Z = 0.98
+SkipX = 0
+SBGW=270
+
+TextSize=8
+
+Color =ColorLight
+DColor = ColorDark
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorLight
+SBGDColor = ColorDark
+STColor = White
+STDColor = GrayDark
+
+[SongMenuTextMenu]
+X =539
+Y =125
+Color=White
+Font =0
+Size =14
+Text=MENU
+Align=0
+Z=0.99
+
+[SongMenuStatic2]
+X =513
+Y =135
+W =21
+H =21
+Color =White
+Tex =IconSongMenu
+Type=Font Black
+Z=0.98
+
+[SongMenuStatic1]
+Tex =SongMenuBG
+X =498
+Y =120
+W =300
+H =200
+Z =0.94
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[SongJumpto]
+Texts=0
+Statics=1
+
+[SongJumptoStatic1]
+Tex =JumpToBG
+X =221
+Y =175
+W =355
+H =175
+Z =0.98
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[SongJumptoStatic2]
+X =234
+Y =185
+W =21
+H =21
+Color =White
+Tex =MainSearch
+Type=Font Black
+Z=0.99
+
+[SongJumptoText1]
+X =310
+Y =175
+Color=White
+Font =0
+Size =14
+Text=SONG_JUMPTO_TYPE_DESC
+Align=0
+Z=0.99
+
+[SongJumptoSelectSlideType]
+Tex = button
+TexSBG = mainicon
+#Text = SONG_JUMPTO_TYPE_DESC
+Font=1
+X = 242
+Y = 205
+Z = 0.99
+W = 0
+H = 30
+SkipX = 4
+SBGW= 300
+Fields=2
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex = button
+SBGDColor = ColorLightest
+STColor = White
+STDColor = ColorLightest
+
+[SongJumptoButtonSearchText]
+X = 250
+Y = 215
+Z = 0.99
+W = 160
+H = 50
+Size=14
+Font=1
+Align=0
+
+[SongJumptoTextFound]
+X =234
+Y =295
+Color=White
+Font =0
+Size =8
+Text=SONG_JUMPTO_HELP
+Align=0
+Z=0.99
+
+[StatMain]
+Texts=0
+Statics=0
+
+[StatMainBackground]
+Tex=MainBG
+
+[StatMainButtonScores]
+X =589
+Y =100
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonScoresText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SCORES
+Color=White
+
+[StatMainButtonSingers]
+X =589
+Y =160
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSingersText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SINGERS
+Color=White
+
+[StatMainButtonSongs]
+X =589
+Y =220
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSongsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_SONGS
+Color=White
+
+[StatMainButtonBands]
+X =589
+Y =280
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonBandsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_BANDS
+Color=White
+
+[StatMainButtonExit]
+X =589
+Y =340
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatMainTextOverview]
+X =45
+Y =125
+W =510
+Color=White
+Font =0
+Size =9
+Align=0
+Text=
+
+[StatMainStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =StatIcon
+Type=Font Black
+
+[StatMainStatic2]
+X =0
+Y =549
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatMainStatic3]
+X =252
+Y =549
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatMainStatic4]
+X =260
+Y =549
+W =32
+H =24
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[StatMainStatic5]
+X =388
+Y =549
+W =32
+H =24
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[StatMainStatic6]
+X =40
+Y =100
+W =520
+H =20
+Tex=StatMainBG1
+Color =ColorLight
+Type=Font Black
+
+[StatMainStatic7]
+X =40
+Y =120
+W =520
+H =300
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatMainStatic8]
+X =40
+Y =420
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+[StatMainText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=STAT_MAIN
+Align=0
+
+[StatMainText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=STAT_MAIN_WHEREAMI
+
+[StatMainText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=STAT_MAIN_DESC
+
+[StatMainText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatMainText5]
+X =423
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[StatDetail]
+Texts=0
+Statics=0
+
+[StatDetailBackground]
+Tex=MainBG
+
+[StatDetailButtonNext]
+X =589
+Y =100
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonNextText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_NEXT
+Color=White
+
+[StatDetailButtonPrev]
+X =589
+Y =160
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonPrevText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_PREV
+Color=White
+
+[StatDetailButtonReverse]
+X =589
+Y =220
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonReverseText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_REVERSE
+Color=White
+
+[StatDetailButtonExit]
+X =589
+Y =280
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatDetailTextDescription]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=
+
+[StatDetailTextPage]
+X = 546
+Y = 98
+Color= Black
+Font = 0
+Size = 5
+Align=2
+Text=
+
+[StatDetailTextList1]
+X = 45
+Y = 122
+Color=White
+Font = 0
+Size = 7
+Text=Stat1
+
+[StatDetailTextList2]
+X = 45
+Y = 160
+Color=White
+Font = 0
+Size = 7
+Text=Stat2
+
+[StatDetailTextList3]
+X = 45
+Y = 198
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList4]
+X = 45
+Y = 236
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList5]
+X = 45
+Y = 274
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList6]
+X = 45
+Y = 312
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList7]
+X = 45
+Y = 350
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList8]
+X = 45
+Y = 388
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList9]
+X = 45
+Y = 426
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList10]
+X = 45
+Y = 464
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =StatIcon
+Type=Font Black
+
+[StatDetailStatic2]
+X =0
+Y =549
+W =252
+H =25
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatDetailStatic3]
+X =252
+Y =549
+W =548
+H =25
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatDetailStatic4]
+X =260
+Y =549
+W =32
+H =24
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[StatDetailStatic5]
+X =388
+Y =549
+W =32
+H =24
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[StatDetailStatic6]
+X =40
+Y =100
+W =520
+H =24
+Tex=StatDetailBG1
+Color =ColorLight
+Type=Font Black
+
+[StatDetailStatic7]
+X =40
+Y =124
+W =520
+H =376
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatDetailStatic8]
+X =40
+Y =500
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+
+[StatDetailText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=STAT_DETAIL
+Align=0
+
+[StatDetailText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=STAT_DETAIL_WHEREAMI
+
+[StatDetailText3]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatDetailText4]
+X =423
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[CheckPopup]
+Texts=1
+Statics=1
+
+[CheckPopupButton1]
+X = 285
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=JA
+Align=1
+Z=1
+
+[CheckPopupButton2]
+X = 415
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton2Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=NEIN
+Align=1
+Z=1
+
+[CheckPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[CheckPopupText1]
+X =282
+Y =147
+Color=White
+Font =0
+Size =10
+Text=MSG_QUESTION_TITLE
+Align=0
+Z=1
+
+[CheckPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =GrayPopup
+Type=Font Black
+
+[CheckPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[CheckPopupStatic3]
+Tex =IconQuestion
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopup]
+Texts=1
+Statics=1
+
+[ErrorPopupButton1]
+X = 350
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[ErrorPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=OK
+Align=1
+Z=1
+
+[ErrorPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[ErrorPopupText1]
+X =282
+Y =148
+Color=White
+Font =0
+Size =10
+Text=MSG_ERROR_TITLE
+Align=0
+Z=1
+
+[ErrorPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =GrayPopup
+Type=Font Black
+
+[ErrorPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopupStatic3]
+Tex =IconError
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
diff --git a/Game/Output/acinerella.dll b/Game/Output/acinerella.dll
new file mode 100644
index 00000000..4a376225
--- /dev/null
+++ b/Game/Output/acinerella.dll
Binary files differ
diff --git a/Game/Output/bass.dll b/Game/Output/bass.dll
new file mode 100644
index 00000000..964d8996
--- /dev/null
+++ b/Game/Output/bass.dll
Binary files differ
diff --git a/Game/Output/documentation.pdf b/Game/Output/documentation.pdf
new file mode 100644
index 00000000..16267bb9
--- /dev/null
+++ b/Game/Output/documentation.pdf
Binary files differ
diff --git a/Game/Output/sqlite3.dll b/Game/Output/sqlite3.dll
new file mode 100644
index 00000000..7111873f
--- /dev/null
+++ b/Game/Output/sqlite3.dll
Binary files differ
diff --git a/Game/ReadMe.txt b/Game/ReadMe.txt
new file mode 100644
index 00000000..dcb9f3bc
--- /dev/null
+++ b/Game/ReadMe.txt
@@ -0,0 +1,112 @@
+Ultrastar Deluxe 1.0.1a Readme.txt
+----------------------------
+1. Authors
+2. Release Notes
+3. Command-Line Parameters
+4. Controls
+5. License
+----------------------------
+
+SF.Net Page: http://sourceforge.net/projects/ultrastardx/
+
+This is just a little introduction, for more information open documentation.pdf
+
+----------------------------
+1. Authors
+----------------------------
+This game was introduced by Corvus5 who has written most of the code by himself.
+Basing on the official release 0.5.0 Mota and Whiteshark started to write little patches and modifications, and released this package named ultra-star.dl.am Mod.
+This modification was continued at Sourceforge.net by the Ultrastar Deluxe Team:
+ Blindy
+ Mog
+ Mota
+ Sawyer
+ Whiteshark
+And this piece of software is the Result!
+
+
+----------------------------
+2. Release Notes
+----------------------------
+- To change the path to the song directory add to config.ini:
+ [Path]
+ Songs=[SongFolder] (e.g. C:\Program Files\Ultrastar\Songs)
+
+- To take a screenshot press "PrintScreen" Key
+ Screenshots are saved in the directory "Screenshots".
+
+- To enable joypad support change config.ini:
+
+ [Controller]
+ Joypad=Off
+
+ to
+
+ [Controller]
+ Joypad=On
+
+
+- To Enable 4 to 6 Playermode 2 Screens are needed.
+ Disable the fullscreen mode, extend your desktop horizontaly, set the resolution to fill one
+ screen.
+ Add to Config.ini:
+ [Graphics]
+ Screens=2
+
+- Press Alt + F[1..12] in NameScreen to Save a Playername
+ Press F[1..12] to Load a Playername
+
+- To enable benchmark run the game with -benchmark parameter
+
+
+----------------------------
+3. Command-Line Parameters
+----------------------------
+Command-Line Parameters are passed to the game adding it to the Path of a Shortcut or starting the game within the console.
+
+The following parameters are possible. They can be joined in any possible way.
+
+-Benchmark : Create a benchmark.log file with start timings.
+-NoLog : Do not create any .log files
+-Joypad : Start with Joypad support
+-Language [ID] : Load Language [ID] on startup. Example: -Language german
+
+-Songpath [Path] : Some as config Songpath. Example: -SongPath "C:\Ultrastar Songs"
+-ConfigFile [File] : Load Configfile [File] instead of config.ini. Path to the file have to exist. Example: -ConfigFile config.SongCreation.ini
+-ScoreFile [File] : Use [File] instead of Ultrastar.db. Path to the file have to exist. Example: -ScoreFile HouseParty.db
+
+-FullScreen : Start the game in Fullscreen Mode
+-Depth [16/32] : Force Depth 16 or 32. Example: -Depth 16
+-Resolution [ID] : Force resolution. Example: -Resolution 800x600
+-Screens [1/2] : Force 1 or 2 Screen Mode. Example: -Screens 2
+
+Some Examples:
+
+Start with Resolution 1024x768 32 Bit Depth and Fullscreen:
+ultrastar.exe -Resolution 1024x768 -Depth 32 -Fullscreen
+
+Start without logging and polish Language
+ultrastar.exe -NoLog -Language polish
+
+Start with custom config File and Score DB:
+ultrastar.exe -ConfigFile C:\Ultrastar\Configs\PartyConfig.ini -ScoreFile C:\Ultrastar\Scores\PartyScores.db
+
+
+----------------------------
+4. Controls
+----------------------------
+Use the Arrowkeys to navigate through the Screens.
+Use Enter to select and Escape to go to the previous screen.
+In Songscreen you can use R, Shift + R or Strg + R to select a random song/category
+Use Alt + [Letter] to jump to a songs artist with the first letter [Letter]
+Use Alt + Shift + [Letter] to jump to a song title with the first letter [Letter]
+Press J to open the "Search for a Song" Interface
+
+Editor Controls are described in documentation.pdf
+
+
+----------------------------
+5. License
+----------------------------
+Ultrastar Deluxe is licensed under the terms of the GNU General Public License 2.0
+See License.txt for more Information. \ No newline at end of file
diff --git a/Game/Sounds/dismissed.mp3 b/Game/Sounds/dismissed.mp3
new file mode 100644
index 00000000..f478e7a3
--- /dev/null
+++ b/Game/Sounds/dismissed.mp3
Binary files differ
diff --git a/Game/Sounds/wome_-_echoes.mp3 b/Game/Sounds/wome_-_echoes.mp3
new file mode 100644
index 00000000..ddde2d60
--- /dev/null
+++ b/Game/Sounds/wome_-_echoes.mp3
Binary files differ
diff --git a/Installer/Readme.txt b/Installer/Readme.txt
new file mode 100644
index 00000000..a10b8ac2
--- /dev/null
+++ b/Installer/Readme.txt
@@ -0,0 +1,19 @@
+SOURCE (23th of December 2007, 13:00 UTC+1 MESZ)
+
+Build using Nullsoft Install System
+(http://nsis.sourceforge.net/)
+
+-----------------------------------------------
+Dependencies
+-----------------------------------------------
+
+The installer needs the plugins
+within the ..\InstallerDependencies\plugins dir.
+
+-----------------------------------------------
+Custom language files (Dir: clanguage):
+-----------------------------------------------
+
+Place the edited custom languages files in:
+
+.\NSIS\Contrib\Modern UI\Language files
diff --git a/Installer/UltraStarDeluxe.nsi b/Installer/UltraStarDeluxe.nsi
new file mode 100644
index 00000000..cb1b7745
--- /dev/null
+++ b/Installer/UltraStarDeluxe.nsi
@@ -0,0 +1,557 @@
+; --------------------------------------------------------------
+; UltraStar Deluxe - Installation Wizard with NSIS (USDXIWWNSIS)
+; --------------------------------------------------------------
+
+!include "MUI.nsh" ; Include the macros for the Modern User Interface
+!include "LogicLib.nsh"
+!include ".\settings\GameExplorer.nsh"
+!include ".\settings\functions.nsh"
+!include "WinVer.nsh"
+
+!define icon_inst "ustar.ico" ; Icon for Installation
+!define icon_uninst "uninstall.ico" ; Icon for Uninstallation
+
+SetCompress Auto
+SetCompressor /SOLID lzma
+SetCompressorDictSize 32
+SetDatablockOptimize On
+
+; XPStyle on
+
+; ------------------------------------------------------
+; Declaration of Variables (See .\settings\variables.nsh)
+; ------------------------------------------------------
+
+!include ".\settings\variables.nsh"
+
+!addPluginDir "..\InstallerDependencies\plugins\"
+
+; -------------------------------
+; Strings for Installation Wizard
+; -------------------------------
+
+!define MUI_WELCOMEPAGE_TITLE "$(wp_title)"
+
+!define MUI_WELCOMEPAGE_TEXT "$(wp_text)"
+;!define MUI_FINISHPAGE_SHOWREADME_TEXT "$(fp_showreadme)"
+!define MUI_FINISHPAGE_LINK "$(fp_link)"
+!define MUI_UNCONFIRMPAGE_TEXT_TOP "UltraStar Deluxe - $(sm_uninstall)"
+
+!define MUI_LICENSEPAGE_RADIOBUTTONS
+!define MUI_WELCOMEPAGE_TITLE_3LINES
+
+!define MUI_FINISHPAGE_TITLE_3LINES
+
+!define MUI_FINISHPAGE_RUN "$INSTDIR\${exe}.exe"
+!define MUI_FINISHPAGE_RUN_NOTCHECKED
+
+;!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\ReadMe.txt"
+
+!define MUI_FINISHPAGE_LINK_LOCATION "${homepage}"
+!define MUI_FINISHPAGE_NOREBOOTSUPPORT
+!define MUI_FINISHPAGE_TEXT_LARGE
+!define MUI_FINISHPAGE_TEXT "$(fp_text)"
+
+!define MUI_UNFINISHPAGE_LINK_LOCATION "${forum}"
+
+!define MUI_COMPONENTSPAGE_SMALLDESC
+
+; The other (multi) language Strings are at the bottom of this file
+
+; --------------------------------------------------
+; Begin of the installation wizard
+; --------------------------------------------------
+
+Name "${p_name} V.${version}"
+Brandingtext "${p_name} Installation"
+OutFile "ultrastardx-${version}-installer-lite.exe"
+!define ins_name "Install ${p_name} V.${version}.exe"
+
+InstallDir "$PROGRAMFILES\${p_name}"
+
+ShowInstDetails show
+ShowUnInstDetails show
+
+!define PRODUCT_NAME "${p_name}"
+!define PRODUCT_VERSION "${version}"
+!define PRODUCT_PUBLISHER "${publisher}"
+!define PRODUCT_WEB_SITE "${homepage}"
+!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
+!define PRODUCT_UNINST_ROOT_KEY "HKLM"
+!define PRODUCT_STARTMENU_REGVAL "NSIS:StartMenuDir"
+
+; Modern User Interface (MUI) Stuff
+
+!define MUI_ICON "${icon_inst}" ; Icon for Installation
+!define MUI_UNICON "${icon_uninst}" ; Icon for Uninstallation
+
+!define MUI_HEADERIMAGE
+!define MUI_HEADERIMAGE_BITMAP "${bmp_header}" ; Header Bitmap of the installation (Size: 150x57 px)
+!define MUI_HEADERIMAGE_UNBITMAP "${bmp_header}" ; Header Bitmap of the uninstallation (Size: 150x57 px)
+!define MUI_WELCOMEFINISHPAGE_BITMAP "${bmp_side}" ; Left Side Bitmap of Welcome & Finish Page while Installation (Size: 164x314 px)
+!define MUI_UNWELCOMEFINISHPAGE_BITMAP "${bmp_side}" ; Left Side Bitmap of Welcome & Finish Page while Uninstallation (Size: 164x314 px)
+!define MUI_BGCOLOR "FFFFFF" ; RGB Background color (for header, welcome & finish page)
+!define MUI_WELCOMEFINISHPAGE_INI "${mui_ini}" ; Installation Options for Welcome & Finish Page (Installation)
+!define MUI_UNWELCOMEFINISHPAGE_INI "${mui_ini}" ; Installation Options for Welcome & Finish Page (Uninstallation)
+!define MUI_LICENSEPAGE_BGCOLOR "${license_bgcolor}" ; Background Color of Licence agreement
+!define MUI_COMPONENTSPAGE_CHECKBITMAP "${bmp_check}" ; Bitmap of Checks at Components Selection Page
+!define MUI_DIRECTORYPAGE_BGCOLOR "${directory_bgcolor}" ; RGB Background Color for Directory textbox
+!define MUI_STARTMENUPAGE_BGCOLOR "${smp_bgcolor}" ; RGB Background of Startmenu List and Textbox
+;!define MUI_INSTFILESPAGE_COLORS "${dets_bgcolor}" ; Background Color of Details Screen while files are being extracted
+
+
+!define MUI_LANGDLL_WINDOWTITLE "USdx In-/Uninstaller: Choose language"
+!define MUI_LANGDLL_ALWAYSSHOW
+
+!define MUI_FINISHPAGE_NOAUTOCLOSE ; Allows user to check the log file of installation (Comment out if unwanted)
+!define MUI_UNFINISHPAGE_NOAUTOCLOSE ; Allows user to check the log file of uninstallation (Comment out if unwanted)
+
+!define MUI_ABORTWARNING
+!define MUI_ABORTWARNING_TEXT $(str_abort) ; Abort Warning message
+!define MUI_ABORTWARNING_CANCEL_DEFAULT ; Default: Cancel abort (Comment out if unwanted)
+
+!define MUI_FINISHPAGE_SHOWREADME
+!define MUI_FINISHPAGE_SHOWREADME_TEXT $(sc_desktop)
+!define MUI_FINISHPAGE_SHOWREADME_FUNCTION CreateDesktopShortCuts
+
+; --------------------------------------------------
+; Begin of the installation routine
+; --------------------------------------------------
+
+; Pages for MUI Installation
+
+!insertmacro MUI_PAGE_WELCOME
+!insertmacro MUI_PAGE_LICENSE "${file_license}"
+!insertmacro MUI_PAGE_COMPONENTS
+!insertmacro MUI_PAGE_DIRECTORY
+
+
+; Start menu page
+
+var ICONS_GROUP
+!define MUI_STARTMENUPAGE_NODISABLE
+!define MUI_STARTMENUPAGE_DEFAULTFOLDER "UltraStar Deluxe"
+!define MUI_STARTMENUPAGE_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
+!define MUI_STARTMENUPAGE_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
+!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${PRODUCT_STARTMENU_REGVAL}"
+!insertmacro MUI_PAGE_STARTMENU Application $ICONS_GROUP
+
+!insertmacro MUI_PAGE_INSTFILES
+Page custom Settings
+
+; USDX Settings Page
+
+Function Settings
+
+!insertmacro MUI_HEADER_TEXT "$(Settings_TITLE)" "$(Settings_SUBTITLE)"
+
+ !insertmacro MUI_INSTALLOPTIONS_DISPLAY "Settings-$LANGUAGE"
+
+; Get all the variables:
+
+var /GLOBAL fullscreen
+var /GLOBAL language2
+var /GLOBAL resolution
+var /GLOBAL tabs
+var /GLOBAL animations
+ !insertmacro MUI_INSTALLOPTIONS_READ $fullscreen "Settings-$LANGUAGE" "Field 6" "State"
+ !insertmacro MUI_INSTALLOPTIONS_READ $language2 "Settings-$LANGUAGE" "Field 7" "State"
+ !insertmacro MUI_INSTALLOPTIONS_READ $resolution "Settings-$LANGUAGE" "Field 8" "State"
+ !insertmacro MUI_INSTALLOPTIONS_READ $tabs "Settings-$LANGUAGE" "Field 9" "State"
+ !insertmacro MUI_INSTALLOPTIONS_READ $animations "Settings-$LANGUAGE" "Field 10" "State"
+
+; Write all variables to config.ini
+
+FileOpen $0 '$INSTDIR\config.ini' w
+FileWrite $0 '[Game]$\r$\n'
+FileClose $0
+
+${If} $language2 != ""
+
+${WriteToConfig} "Language=$language2$\r$\n" "$INSTDIR\config.ini"
+
+${EndIf}
+
+${If} $tabs != ""
+
+${WriteToConfig} "Tabs=$tabs$\r$\n" "$INSTDIR\config.ini"
+
+${EndIf}
+
+${WriteToConfig} "[Graphics]$\r$\n" "$INSTDIR\config.ini"
+
+${If} $fullscreen != ""
+
+${WriteToConfig} "FullScreen=$fullscreen$\r$\n" "$INSTDIR\config.ini"
+
+${EndIf}
+
+${If} $resolution != ""
+
+${WriteToConfig} "Resolution=$resolution$\r$\n" "$INSTDIR\config.ini"
+
+${EndIf}
+
+${WriteToConfig} "[Advanced]$\r$\n" "$INSTDIR\config.ini"
+
+; Animations On / Off Tasks
+
+${If} $animations == "Off"
+
+${WriteToConfig} "LoadAnimation=Off$\r$\n" "$INSTDIR\config.ini"
+
+${WriteToConfig} "EffectSing=Off$\r$\n" "$INSTDIR\config.ini"
+
+${WriteToConfig} "ScreenFade=Off$\r$\n" "$INSTDIR\config.ini"
+
+${EndIf}
+
+
+FunctionEnd ;Custom page end
+
+!insertmacro MUI_PAGE_FINISH
+
+; Pages for MUI Uninstallation
+
+!insertmacro MUI_UNPAGE_WELCOME
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+
+; Language files
+
+!insertmacro MUI_LANGUAGE "English"
+!insertmacro MUI_LANGUAGE "German"
+
+; Finish Page
+
+!insertmacro MUI_UNPAGE_FINISH
+
+; ---------------------------------------------------------
+; Section1: Main components of UltraStar Deluxe
+; ---------------------------------------------------------
+
+LangString DESC_Section1 ${LANG_ENGLISH} "${eng_sec1_desc}" ; Adds the description to section1
+LangString DESC_Section1 ${LANG_GERMAN} "${ger_sec1_desc}"
+
+LangString sec1 ${LANG_ENGLISH} "${eng_sec1}" ; Name of section1
+LangString sec1 ${LANG_GERMAN} "${ger_sec1}"
+
+Section $(sec1) Section1
+ SectionIn RO ; readonly
+ SetOutPath $INSTDIR
+ SetOverwrite try
+
+!include ".\settings\files_in.nsh"
+
+; Create shortcuts
+
+ SetOutPath "$INSTDIR"
+
+ !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
+
+ SetShellVarContext all
+ SetOutPath "$INSTDIR"
+
+ CreateDirectory "${p_name}"
+ CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
+ CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(sm_shortcut).lnk" "$INSTDIR\${exe}.exe"
+; CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(sm_documentation).lnk" "$INSTDIR\documentation.pdf"
+ CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(sm_website).lnk" "http://www.ultrastardeluxe.org/"
+ CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(sm_readme).lnk" "$INSTDIR\ReadMe.txt"
+ CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(sm_license).lnk" "$INSTDIR\License.txt"
+ CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(sm_uninstall).lnk" "$INSTDIR\Uninstall.exe"
+ !insertmacro MUI_STARTMENU_WRITE_END
+
+; WINDOWS VISTA GAME EXPLORER
+
+${If} ${AtLeastWinVista}
+
+${GameExplorer_GenerateGUID}
+Pop $0
+
+${GameExplorer_AddGame} all "${gdf_path}" $WINDIR $INSTDIR\${exe}.exe $0
+
+CreateDirectory $APPDATA\Microsoft\Windows\GameExplorer\$0\PlayTasks\1
+CreateShortcut "$APPDATA\Microsoft\Windows\GameExplorer\$0\PlayTasks\1\Benchmark.lnk" \
+ "$INSTDIR\${exe}.exe" "-Benchmark"
+
+CreateDirectory $APPDATA\Microsoft\Windows\GameExplorer\$0\PlayTasks\2
+CreateShortcut "$APPDATA\Microsoft\Windows\GameExplorer\$0\PlayTasks\2\Joypad.lnk" \
+ "$INSTDIR\${exe}.exe" "-Joypad"
+
+CreateDirectory $APPDATA\Microsoft\Windows\GameExplorer\$0\PlayTasks\3
+CreateShortcut "$APPDATA\Microsoft\Windows\GameExplorer\$0\PlayTasks\3\Fullscreen.lnk" \
+ "$INSTDIR\${exe}.exe" "-FullScreen"
+
+CreateDirectory $APPDATA\Microsoft\Windows\GameExplorer\$0\PlayTasks\3
+CreateShortcut "$APPDATA\Microsoft\Windows\GameExplorer\$0\PlayTasks\3\Dual Screen.lnk" \
+ "$INSTDIR\${exe}.exe" "-Screen 2"
+
+CreateDirectory $APPDATA\Microsoft\Windows\GameExplorer\$0\SupportTasks\0
+CreateShortcut "$APPDATA\Microsoft\Windows\GameExplorer\$0\SupportTasks\0\Support Forum.lnk" \
+ "http://forum.ultrastardeluxe.org"
+
+${EndIf}
+
+; Create Uninstaller:
+
+ WriteUninstaller "$INSTDIR\Uninstall.exe"
+
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "${p_name}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\Uninstall.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
+
+SectionEnd
+
+; ---------------------------------------------------------
+; Section2: Example Song "Dead Smiling Pirates"
+; ---------------------------------------------------------
+
+; LangString DESC_g2Section1 ${LANG_ENGLISH} "${eng_g2Section1_desc}"
+; LangString DESC_g2Section1 ${LANG_GERMAN} "${ger_g2Section1_desc}"
+
+; LangString DESC_g2Section2 ${LANG_ENGLISH} "${eng_g2Section2_desc}"
+; LangString DESC_g2Section2 ${LANG_GERMAN} "${ger_g2Section2_desc}"
+
+; LangString sec2 ${LANG_ENGLISH} "${eng_sec2}"
+; LangString sec2 ${LANG_GERMAN} "${ger_sec2}"
+
+; SectionGroup $(sec2) Section2
+
+; Section /o "Dead Smiling Pirates - I 18" g2Section1
+; AddSize 2816
+; SetOverwrite try
+; SetOutPath "$INSTDIR"
+; CreateDirectory "$INSTDIR\Songs\Dead Smiling Pirates - I 18 [DEMO]"
+; SetOutPath "$INSTDIR\Songs\Dead Smiling Pirates - I 18 [DEMO]\"
+
+; Download song:
+; NSISdl::download /TIMEOUT=30000 ${demosong} $TEMP\Song-I-18.zip
+;
+; Pop $R0 ;Get the return value
+; StrCmp $R0 "success" dlok
+; MessageBox MB_OK|MB_ICONEXCLAMATION "Download Error, click OK to Continue" /SD IDOK
+; dlok:
+; nsisunz::Unzip "$TEMP\Song-I-18.zip" "$INSTDIR\Songs\Dead Smiling Pirates - I 18 [DEMO]\"
+
+; Delete "$TEMP\Song-I-18.zip"
+
+; SetOutPath "$INSTDIR"
+
+; SectionEnd
+
+; Section /o "Steven Dunston - Northern Star" g2Section2
+; AddSize 3769
+; SetOverwrite try
+; SetOutPath "$INSTDIR"
+; CreateDirectory "$INSTDIR\Songs\Steven Dunston - Northern Star [DEMO]"
+; SetOutPath "$INSTDIR\Songs\Steven Dunston - Northern Star [DEMO]\"
+
+; Download song:
+; NSISdl::download /TIMEOUT=30000 ${demosong2} $TEMP\Song-Northern-Star.zip
+
+; Pop $R0 ;Get the return value
+; StrCmp $R0 "success" dlok
+; MessageBox MB_OK|MB_ICONEXCLAMATION "Download Error, click OK to Continue" /SD IDOK
+; dlok:
+; nsisunz::Unzip "$TEMP\Song-Northern-Star.zip" "$INSTDIR\Songs\Steven Dunston - Northern Star [DEMO]\"
+
+; Delete "$TEMP\Song-Northern-Star.zip"
+
+; SetOutPath "$INSTDIR"
+
+; SectionEnd
+
+; SectionGroupEnd
+
+; ---------------------------------------------------------
+; Section3: Optional Themes
+; ---------------------------------------------------------
+
+LangString DESC_Section3 ${LANG_ENGLISH} "${eng_sec3_desc}"
+LangString DESC_Section3 ${LANG_GERMAN} "${ger_sec3_desc}"
+
+LangString DESC_g1Sec1 ${LANG_ENGLISH} "${eng_g1Sec1_desc}"
+LangString DESC_g1Sec1 ${LANG_GERMAN} "${ger_g1Sec1_desc}"
+
+LangString DESC_g1Sec2 ${LANG_ENGLISH} "${eng_g1Sec2_desc}"
+LangString DESC_g1Sec2 ${LANG_GERMAN} "${ger_g1Sec2_desc}"
+
+LangString DESC_g1Sec3 ${LANG_ENGLISH} "${eng_g1Sec3_desc}"
+LangString DESC_g1Sec3 ${LANG_GERMAN} "${ger_g1Sec3_desc}"
+
+LangString sec_group ${LANG_ENGLISH} "${eng_sec3}"
+LangString sec_group ${LANG_GERMAN} "${ger_sec3}"
+
+SectionGroup $(sec_group) Section3
+
+ Section "Orange" g1Sec1
+
+; Download theme orange:
+; NSISdl::download /TIMEOUT=30000 ${dl_orange} $TEMP\Theme-Orange.zip
+
+; Pop $R0 ;Get the return value
+; StrCmp $R0 "success" dlok
+; MessageBox MB_OK|MB_ICONEXCLAMATION "Download Error, click OK to Continue" /SD IDOK
+; dlok:
+; nsisunz::Unzip "$TEMP\Theme-Orange.zip" "$INSTDIR\"
+
+; Delete "$TEMP\Theme-Orange.zip"
+
+ SetOutPath "$INSTDIR"
+
+!include ".\settings\optional\in_orange.nsh"
+
+ SetOutPath "$INSTDIR"
+
+SectionEnd
+
+ Section "Streetlight" g1Sec2
+
+; Download theme Streetlight:
+; NSISdl::download /TIMEOUT=30000 ${dl_streetlight} $TEMP\Theme-Streetlight.zip
+
+; Pop $R0 ;Get the return value
+; StrCmp $R0 "success" dlok
+; MessageBox MB_OK|MB_ICONEXCLAMATION "Download Error, click OK to Continue" /SD IDOK
+; dlok:
+; nsisunz::Unzip "$TEMP\Theme-Streetlight.zip" "$INSTDIR\"
+
+; Delete "$TEMP\Theme-Streetlight.zip"
+
+ SetOutPath "$INSTDIR"
+
+!include ".\settings\optional\in_streetlight.nsh"
+
+ SetOutPath "$INSTDIR"
+
+SectionEnd
+
+ Section "Vistar" g1Sec3
+
+; Download theme Vistar:
+
+; NSISdl::download /TIMEOUT=30000 ${dl_vistar} $TEMP\Theme-Vistar.zip
+
+; Pop $R0 ;Get the return value
+; StrCmp $R0 "success" dlok
+; MessageBox MB_OK|MB_ICONEXCLAMATION "Download Error, click OK to Continue" /SD IDOK
+; dlok:
+; nsisunz::Unzip "$TEMP\Theme-Vistar.zip" "$INSTDIR\"
+
+; Delete "$TEMP\Theme-Vistar.zip"
+
+ SetOutPath "$INSTDIR"
+
+!include ".\settings\optional\in_vistar.nsh"
+
+ SetOutPath "$INSTDIR"
+
+SectionEnd
+
+
+SectionGroupEnd
+
+; ---------------------------------------------------------
+; Section4: Uninstallation Wizard
+; ---------------------------------------------------------
+
+Section Uninstall
+ !insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
+
+ !include ".\settings\optional\opt_uninstall.nsh"
+ !include ".\settings\files_un.nsh"
+
+ DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
+
+; Unregister from Windows Vista Game Explorer
+
+${If} ${AtLeastWinVista}
+
+${GameExplorer_RemoveGame} $0
+
+${EndIf}
+
+SectionEnd
+
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+ !insertmacro MUI_DESCRIPTION_TEXT ${Section1} $(DESC_Section1)
+
+; !insertmacro MUI_DESCRIPTION_TEXT ${Section2} $(DESC_Section2)
+; !insertmacro MUI_DESCRIPTION_TEXT ${Section3} $(DESC_Section3)
+
+ !insertmacro MUI_DESCRIPTION_TEXT ${g1Sec1} $(DESC_g1Sec1)
+ !insertmacro MUI_DESCRIPTION_TEXT ${g1Sec2} $(DESC_g1Sec2)
+ !insertmacro MUI_DESCRIPTION_TEXT ${g1Sec3} $(DESC_g1Sec3)
+
+; !insertmacro MUI_DESCRIPTION_TEXT ${g2Section1} $(DESC_g2Section1)
+; !insertmacro MUI_DESCRIPTION_TEXT ${g2Section2} $(DESC_g2Section2)
+
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+; -----------------------------------------------------------------------
+; Language Strings for Installation / Uninstallation Wizard
+; can be found at .\settings\langstrings.nsh
+; -----------------------------------------------------------------------
+
+!include .\settings\langstrings.nsh
+
+; ------------------------------------------------------------------
+; Functions for the beginning of the installation and uninstallation
+; ------------------------------------------------------------------
+
+; Function for Installation
+
+Function .onInit
+
+ System::Call 'kernel32::CreateMutexA(i 0, i 0, t "USdx Installer.exe") ?e'
+
+ Pop $R0
+
+ StrCmp $R0 0 +3
+ MessageBox MB_OK "The installer is already running."
+ Abort
+
+ !insertmacro MUI_LANGDLL_DISPLAY
+
+ ReadRegStr $R0 HKLM \
+ "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
+ "UninstallString"
+ StrCmp $R0 "" done
+
+ MessageBox MB_YESNO|MB_ICONEXCLAMATION \
+ "${PRODUCT_NAME} is already installed. $\n$\nAre you sure you want to \
+ install it again?" \
+ IDYES done
+ Abort
+
+
+done:
+
+ !insertmacro MUI_INSTALLOPTIONS_EXTRACT_AS ".\settings\settings-1031.ini" "Settings-1031"
+ !insertmacro MUI_INSTALLOPTIONS_EXTRACT_AS ".\settings\settings-1033.ini" "Settings-1033"
+
+FunctionEnd
+
+; Function for Uninstallation
+
+Function un.onInit
+
+ ${nsProcess::FindProcess} "USdx.exe" $R0
+ StrCmp $R0 0 0 +2
+ MessageBox MB_YESNO|MB_ICONEXCLAMATION 'UltraStar Deluxe cannot be uninstalled while its running! Do you want to close it?' IDYES closeit IDNO end
+
+ closeit:
+ ${nsProcess::KillProcess} "USdx.exe" $R0
+ goto continue
+
+ end:
+ ${nsProcess::Unload}
+ Abort
+
+ continue:
+ !insertmacro MUI_LANGDLL_DISPLAY
+
+FunctionEnd \ No newline at end of file
diff --git a/Installer/UltraStarDeluxeFull.nsi b/Installer/UltraStarDeluxeFull.nsi
new file mode 100644
index 00000000..95bb628a
--- /dev/null
+++ b/Installer/UltraStarDeluxeFull.nsi
@@ -0,0 +1,599 @@
+; --------------------------------------------------------------
+; UltraStar Deluxe - Installation Wizard with NSIS (USDXIWWNSIS)
+; --------------------------------------------------------------
+
+!include "MUI.nsh" ; Include the macros for the Modern User Interface
+!include "LogicLib.nsh"
+!include ".\settings\GameExplorer.nsh"
+!include ".\settings\functions.nsh"
+!include "WinVer.nsh"
+
+!define icon_inst "ustar.ico" ; Icon for Installation
+!define icon_uninst "uninstall.ico" ; Icon for Uninstallation
+
+SetCompress Auto
+SetCompressor /SOLID lzma
+SetCompressorDictSize 32
+SetDatablockOptimize On
+
+; XPStyle on
+
+; ------------------------------------------------------
+; Declaration of Variables (See .\settings\variables.nsh)
+; ------------------------------------------------------
+
+!include ".\settings\variables.nsh"
+
+!addPluginDir "..\InstallerDependencies\plugins\"
+
+; -------------------------------
+; Strings for Installation Wizard
+; -------------------------------
+
+!define MUI_WELCOMEPAGE_TITLE "$(wp_title)"
+
+!define MUI_WELCOMEPAGE_TEXT "$(wp_text)"
+;!define MUI_FINISHPAGE_SHOWREADME_TEXT "$(fp_showreadme)"
+!define MUI_FINISHPAGE_LINK "$(fp_link)"
+!define MUI_UNCONFIRMPAGE_TEXT_TOP "UltraStar Deluxe - $(sm_uninstall)"
+
+!define MUI_LICENSEPAGE_RADIOBUTTONS
+!define MUI_WELCOMEPAGE_TITLE_3LINES
+
+!define MUI_FINISHPAGE_TITLE_3LINES
+
+!define MUI_FINISHPAGE_RUN "$INSTDIR\${exe}.exe"
+!define MUI_FINISHPAGE_RUN_NOTCHECKED
+
+;!define MUI_FINISHPAGE_SHOWREADME "$INSTDIR\ReadMe.txt"
+
+!define MUI_FINISHPAGE_LINK_LOCATION "${homepage}"
+!define MUI_FINISHPAGE_NOREBOOTSUPPORT
+!define MUI_FINISHPAGE_TEXT_LARGE
+!define MUI_FINISHPAGE_TEXT "$(fp_text)"
+
+!define MUI_UNFINISHPAGE_LINK_LOCATION "${forum}"
+
+!define MUI_COMPONENTSPAGE_SMALLDESC
+
+; The other (multi) language Strings are at the bottom of this file
+
+; --------------------------------------------------
+; Begin of the installation wizard
+; --------------------------------------------------
+
+Name "${p_name} V.${version}"
+Brandingtext "${p_name} Installation"
+OutFile "ultrastardx-${version}-installer-full.exe"
+!define ins_name "Install ${p_name} V.${version}.exe"
+
+InstallDir "$PROGRAMFILES\${p_name}"
+
+ShowInstDetails show
+ShowUnInstDetails show
+
+!define PRODUCT_NAME "${p_name}"
+!define PRODUCT_VERSION "${version}"
+!define PRODUCT_PUBLISHER "${publisher}"
+!define PRODUCT_WEB_SITE "${homepage}"
+!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
+!define PRODUCT_UNINST_ROOT_KEY "HKLM"
+!define PRODUCT_STARTMENU_REGVAL "NSIS:StartMenuDir"
+
+; Modern User Interface (MUI) Stuff
+
+!define MUI_ICON "${icon_inst}" ; Icon for Installation
+!define MUI_UNICON "${icon_uninst}" ; Icon for Uninstallation
+
+!define MUI_HEADERIMAGE
+!define MUI_HEADERIMAGE_BITMAP "${bmp_header}" ; Header Bitmap of the installation (Size: 150x57 px)
+!define MUI_HEADERIMAGE_UNBITMAP "${bmp_header}" ; Header Bitmap of the uninstallation (Size: 150x57 px)
+!define MUI_WELCOMEFINISHPAGE_BITMAP "${bmp_side}" ; Left Side Bitmap of Welcome & Finish Page while Installation (Size: 164x314 px)
+!define MUI_UNWELCOMEFINISHPAGE_BITMAP "${bmp_side}" ; Left Side Bitmap of Welcome & Finish Page while Uninstallation (Size: 164x314 px)
+!define MUI_BGCOLOR "FFFFFF" ; RGB Background color (for header, welcome & finish page)
+!define MUI_WELCOMEFINISHPAGE_INI "${mui_ini}" ; Installation Options for Welcome & Finish Page (Installation)
+!define MUI_UNWELCOMEFINISHPAGE_INI "${mui_ini}" ; Installation Options for Welcome & Finish Page (Uninstallation)
+!define MUI_LICENSEPAGE_BGCOLOR "${license_bgcolor}" ; Background Color of Licence agreement
+!define MUI_COMPONENTSPAGE_CHECKBITMAP "${bmp_check}" ; Bitmap of Checks at Components Selection Page
+!define MUI_DIRECTORYPAGE_BGCOLOR "${directory_bgcolor}" ; RGB Background Color for Directory textbox
+!define MUI_STARTMENUPAGE_BGCOLOR "${smp_bgcolor}" ; RGB Background of Startmenu List and Textbox
+;!define MUI_INSTFILESPAGE_COLORS "${dets_bgcolor}" ; Background Color of Details Screen while files are being extracted
+
+
+!define MUI_LANGDLL_WINDOWTITLE "USdx In-/Uninstaller: Choose language"
+!define MUI_LANGDLL_ALWAYSSHOW
+
+!define MUI_FINISHPAGE_NOAUTOCLOSE ; Allows user to check the log file of installation (Comment out if unwanted)
+!define MUI_UNFINISHPAGE_NOAUTOCLOSE ; Allows user to check the log file of uninstallation (Comment out if unwanted)
+
+!define MUI_ABORTWARNING
+!define MUI_ABORTWARNING_TEXT $(str_abort) ; Abort Warning message
+!define MUI_ABORTWARNING_CANCEL_DEFAULT ; Default: Cancel abort (Comment out if unwanted)
+
+!define MUI_FINISHPAGE_SHOWREADME
+!define MUI_FINISHPAGE_SHOWREADME_TEXT $(sc_desktop)
+!define MUI_FINISHPAGE_SHOWREADME_FUNCTION CreateDesktopShortCuts
+
+; --------------------------------------------------
+; Begin of the installation routine
+; --------------------------------------------------
+
+; Pages for MUI Installation
+
+!insertmacro MUI_PAGE_WELCOME
+!insertmacro MUI_PAGE_LICENSE "${file_license}"
+!insertmacro MUI_PAGE_COMPONENTS
+!insertmacro MUI_PAGE_DIRECTORY
+
+
+; Start menu page
+
+var ICONS_GROUP
+!define MUI_STARTMENUPAGE_NODISABLE
+!define MUI_STARTMENUPAGE_DEFAULTFOLDER "UltraStar Deluxe"
+!define MUI_STARTMENUPAGE_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
+!define MUI_STARTMENUPAGE_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
+!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${PRODUCT_STARTMENU_REGVAL}"
+!insertmacro MUI_PAGE_STARTMENU Application $ICONS_GROUP
+
+!insertmacro MUI_PAGE_INSTFILES
+Page custom Settings
+
+; USDX Settings Page
+
+Function Settings
+
+!insertmacro MUI_HEADER_TEXT "$(Settings_TITLE)" "$(Settings_SUBTITLE)"
+
+ !insertmacro MUI_INSTALLOPTIONS_DISPLAY "Settings-$LANGUAGE"
+
+; Get all the variables:
+
+var /GLOBAL fullscreen
+var /GLOBAL language2
+var /GLOBAL resolution
+var /GLOBAL tabs
+var /GLOBAL animations
+ !insertmacro MUI_INSTALLOPTIONS_READ $fullscreen "Settings-$LANGUAGE" "Field 6" "State"
+ !insertmacro MUI_INSTALLOPTIONS_READ $language2 "Settings-$LANGUAGE" "Field 7" "State"
+ !insertmacro MUI_INSTALLOPTIONS_READ $resolution "Settings-$LANGUAGE" "Field 8" "State"
+ !insertmacro MUI_INSTALLOPTIONS_READ $tabs "Settings-$LANGUAGE" "Field 9" "State"
+ !insertmacro MUI_INSTALLOPTIONS_READ $animations "Settings-$LANGUAGE" "Field 10" "State"
+
+; Write all variables to config.ini
+
+FileOpen $0 '$INSTDIR\config.ini' w
+FileWrite $0 '[Game]$\r$\n'
+FileClose $0
+
+${If} $language2 != ""
+
+${WriteToConfig} "Language=$language2$\r$\n" "$INSTDIR\config.ini"
+
+${EndIf}
+
+${If} $tabs != ""
+
+${WriteToConfig} "Tabs=$tabs$\r$\n" "$INSTDIR\config.ini"
+
+${EndIf}
+
+${WriteToConfig} "[Graphics]$\r$\n" "$INSTDIR\config.ini"
+
+${If} $fullscreen != ""
+
+${WriteToConfig} "FullScreen=$fullscreen$\r$\n" "$INSTDIR\config.ini"
+
+${EndIf}
+
+${If} $resolution != ""
+
+${WriteToConfig} "Resolution=$resolution$\r$\n" "$INSTDIR\config.ini"
+
+${EndIf}
+
+${WriteToConfig} "[Advanced]$\r$\n" "$INSTDIR\config.ini"
+
+; Animations On / Off Tasks
+
+${If} $animations == "Off"
+
+${WriteToConfig} "LoadAnimation=Off$\r$\n" "$INSTDIR\config.ini"
+
+${WriteToConfig} "EffectSing=Off$\r$\n" "$INSTDIR\config.ini"
+
+${WriteToConfig} "ScreenFade=Off$\r$\n" "$INSTDIR\config.ini"
+
+${EndIf}
+
+
+FunctionEnd ;Custom page end
+
+!insertmacro MUI_PAGE_FINISH
+
+; Pages for MUI Uninstallation
+
+!insertmacro MUI_UNPAGE_WELCOME
+!insertmacro MUI_UNPAGE_CONFIRM
+!insertmacro MUI_UNPAGE_INSTFILES
+
+; Language files
+
+!insertmacro MUI_LANGUAGE "English"
+!insertmacro MUI_LANGUAGE "German"
+
+; Finish Page
+
+!insertmacro MUI_UNPAGE_FINISH
+
+; ---------------------------------------------------------
+; Section1: Main components of UltraStar Deluxe
+; ---------------------------------------------------------
+
+LangString DESC_Section1 ${LANG_ENGLISH} "${eng_sec1_desc}" ; Adds the description to section1
+LangString DESC_Section1 ${LANG_GERMAN} "${ger_sec1_desc}"
+
+LangString sec1 ${LANG_ENGLISH} "${eng_sec1}" ; Name of section1
+LangString sec1 ${LANG_GERMAN} "${ger_sec1}"
+
+Section $(sec1) Section1
+ SectionIn RO ; readonly
+ SetOutPath $INSTDIR
+ SetOverwrite try
+
+!include ".\settings\files_in.nsh"
+
+; Create shortcuts
+
+ SetOutPath "$INSTDIR"
+
+ !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
+
+ SetShellVarContext all
+ SetOutPath "$INSTDIR"
+
+ CreateDirectory "${p_name}"
+ CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
+ CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(sm_shortcut).lnk" "$INSTDIR\${exe}.exe"
+; CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(sm_documentation).lnk" "$INSTDIR\documentation.pdf"
+ CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(sm_website).lnk" "http://www.ultrastardeluxe.org/"
+ CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(sm_readme).lnk" "$INSTDIR\ReadMe.txt"
+ CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(sm_license).lnk" "$INSTDIR\License.txt"
+ CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\$(sm_uninstall).lnk" "$INSTDIR\Uninstall.exe"
+ !insertmacro MUI_STARTMENU_WRITE_END
+
+; WINDOWS VISTA GAME EXPLORER
+
+${If} ${AtLeastWinVista}
+
+${GameExplorer_GenerateGUID}
+Pop $0
+
+${GameExplorer_AddGame} all "${gdf_path}" $WINDIR $INSTDIR\${exe}.exe $0
+
+CreateDirectory $APPDATA\Microsoft\Windows\GameExplorer\$0\PlayTasks\1
+CreateShortcut "$APPDATA\Microsoft\Windows\GameExplorer\$0\PlayTasks\1\Benchmark.lnk" \
+ "$INSTDIR\${exe}.exe" "-Benchmark"
+
+CreateDirectory $APPDATA\Microsoft\Windows\GameExplorer\$0\PlayTasks\2
+CreateShortcut "$APPDATA\Microsoft\Windows\GameExplorer\$0\PlayTasks\2\Joypad.lnk" \
+ "$INSTDIR\${exe}.exe" "-Joypad"
+
+CreateDirectory $APPDATA\Microsoft\Windows\GameExplorer\$0\PlayTasks\3
+CreateShortcut "$APPDATA\Microsoft\Windows\GameExplorer\$0\PlayTasks\3\Fullscreen.lnk" \
+ "$INSTDIR\${exe}.exe" "-FullScreen"
+
+CreateDirectory $APPDATA\Microsoft\Windows\GameExplorer\$0\PlayTasks\3
+CreateShortcut "$APPDATA\Microsoft\Windows\GameExplorer\$0\PlayTasks\3\Dual Screen.lnk" \
+ "$INSTDIR\${exe}.exe" "-Screen 2"
+
+CreateDirectory $APPDATA\Microsoft\Windows\GameExplorer\$0\SupportTasks\0
+CreateShortcut "$APPDATA\Microsoft\Windows\GameExplorer\$0\SupportTasks\0\Support Forum.lnk" \
+ "http://forum.ultrastardeluxe.org"
+
+${EndIf}
+
+; Create Uninstaller:
+
+ WriteUninstaller "$INSTDIR\Uninstall.exe"
+
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "${p_name}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\Uninstall.exe"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
+ WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
+
+SectionEnd
+
+; ---------------------------------------------------------
+; Section2: Example Song "Dead Smiling Pirates"
+; ---------------------------------------------------------
+
+ LangString DESC_g2Section1 ${LANG_ENGLISH} "${eng_g2Section1_desc}"
+ LangString DESC_g2Section1 ${LANG_GERMAN} "${ger_g2Section1_desc}"
+
+ LangString DESC_g2Section2 ${LANG_ENGLISH} "${eng_g2Section2_desc}"
+ LangString DESC_g2Section2 ${LANG_GERMAN} "${ger_g2Section2_desc}"
+
+ LangString DESC_g2Section3 ${LANG_ENGLISH} "${eng_g2Section3_desc}"
+ LangString DESC_g2Section3 ${LANG_GERMAN} "${ger_g2Section3_desc}"
+
+ LangString sec2 ${LANG_ENGLISH} "${eng_sec2}"
+ LangString sec2 ${LANG_GERMAN} "${ger_sec2}"
+
+SectionGroup $(sec2) Section2
+
+Section /o "Dead Smiling Pirates - I 18" g2Section1
+; AddSize 1400
+ SetOverwrite try
+ SetOutPath "$INSTDIR"
+ CreateDirectory "$INSTDIR\Songs\Dead Smiling Pirates - I 18 [DEMO]"
+ SetOutPath "$INSTDIR\Songs\Dead Smiling Pirates - I 18 [DEMO]\"
+
+; Download song:
+; NSISdl::download /TIMEOUT=30000 ${demosong} $TEMP\Song-I-18.zip
+;
+; Pop $R0 ;Get the return value
+; StrCmp $R0 "success" dlok
+; MessageBox MB_OK|MB_ICONEXCLAMATION "Download Error, click OK to Continue" /SD IDOK
+; dlok:
+; nsisunz::Unzip "$TEMP\Song-I-18.zip" "$INSTDIR\Songs\Dead Smiling Pirates - I 18 [DEMO]\"
+
+; Delete "$TEMP\Song-I-18.zip"
+
+
+ SetOutPath "$INSTDIR"
+
+!include ".\settings\optional\in_song1.nsh"
+
+ SetOutPath "$INSTDIR"
+
+ SectionEnd
+
+Section /o "Steven Dunston - Northern Star" g2Section2
+; AddSize 1500
+ SetOverwrite try
+ SetOutPath "$INSTDIR"
+ CreateDirectory "$INSTDIR\Songs\Steven Dunston - Northern Star [DEMO]"
+ SetOutPath "$INSTDIR\Songs\Steven Dunston - Northern Star [DEMO]\"
+
+; Download song:
+; NSISdl::download /TIMEOUT=30000 ${demosong2} $TEMP\Song-Northern-Star.zip
+
+; Pop $R0 ;Get the return value
+; StrCmp $R0 "success" dlok
+; MessageBox MB_OK|MB_ICONEXCLAMATION "Download Error, click OK to Continue" /SD IDOK
+; dlok:
+; nsisunz::Unzip "$TEMP\Song-Northern-Star.zip" "$INSTDIR\Songs\Steven Dunston - Northern Star [DEMO]\"
+
+; Delete "$TEMP\Song-Northern-Star.zip"
+
+ SetOutPath "$INSTDIR"
+
+!include ".\settings\optional\in_song2.nsh"
+
+ SetOutPath "$INSTDIR"
+
+ SectionEnd
+
+Section /o "Joshua Morin - On the run" g2Section3
+; AddSize 2200
+ SetOverwrite try
+ SetOutPath "$INSTDIR"
+ CreateDirectory "$INSTDIR\Songs\Joshua Morin - On the run [DEMO]"
+ SetOutPath "$INSTDIR\Songs\Joshua Morin - On the run [DEMO]\"
+
+; Download song:
+; NSISdl::download /TIMEOUT=30000 ${demosong3} $TEMP\Song-On-the-run.zip
+
+; Pop $R0 ;Get the return value
+; StrCmp $R0 "success" dlok
+; MessageBox MB_OK|MB_ICONEXCLAMATION "Download Error, click OK to Continue" /SD IDOK
+; dlok:
+; nsisunz::Unzip "$TEMP\Song-On-the-run.zip" "$INSTDIR\Songs\Joshua Morin - On the run [DEMO]\"
+
+; Delete "$TEMP\Song-On-the-run.zip"
+
+ SetOutPath "$INSTDIR"
+
+!include ".\settings\optional\in_song3.nsh"
+
+ SetOutPath "$INSTDIR"
+
+ SectionEnd
+
+ SectionGroupEnd
+
+; ---------------------------------------------------------
+; Section3: Optional Themes
+; ---------------------------------------------------------
+
+LangString DESC_Section3 ${LANG_ENGLISH} "${eng_sec3_desc}"
+LangString DESC_Section3 ${LANG_GERMAN} "${ger_sec3_desc}"
+
+LangString DESC_g1Sec1 ${LANG_ENGLISH} "${eng_g1Sec1_desc}"
+LangString DESC_g1Sec1 ${LANG_GERMAN} "${ger_g1Sec1_desc}"
+
+LangString DESC_g1Sec2 ${LANG_ENGLISH} "${eng_g1Sec2_desc}"
+LangString DESC_g1Sec2 ${LANG_GERMAN} "${ger_g1Sec2_desc}"
+
+LangString DESC_g1Sec3 ${LANG_ENGLISH} "${eng_g1Sec3_desc}"
+LangString DESC_g1Sec3 ${LANG_GERMAN} "${ger_g1Sec3_desc}"
+
+LangString sec_group ${LANG_ENGLISH} "${eng_sec3}"
+LangString sec_group ${LANG_GERMAN} "${ger_sec3}"
+
+SectionGroup $(sec_group) Section3
+
+ Section "Orange" g1Sec1
+; AddSize 700
+
+; Download theme orange:
+; NSISdl::download /TIMEOUT=30000 ${dl_orange} $TEMP\Theme-Orange.zip
+
+; Pop $R0 ;Get the return value
+; StrCmp $R0 "success" dlok
+; MessageBox MB_OK|MB_ICONEXCLAMATION "Download Error, click OK to Continue" /SD IDOK
+; dlok:
+; nsisunz::Unzip "$TEMP\Theme-Orange.zip" "$INSTDIR\"
+
+; Delete "$TEMP\Theme-Orange.zip"
+
+ SetOutPath "$INSTDIR"
+
+!include ".\settings\optional\in_orange.nsh"
+
+ SetOutPath "$INSTDIR"
+
+SectionEnd
+
+ Section "Streetlight" g1Sec2
+; AddSize 1000
+
+; Download theme Streetlight:
+; NSISdl::download /TIMEOUT=30000 ${dl_streetlight} $TEMP\Theme-Streetlight.zip
+
+; Pop $R0 ;Get the return value
+; StrCmp $R0 "success" dlok
+; MessageBox MB_OK|MB_ICONEXCLAMATION "Download Error, click OK to Continue" /SD IDOK
+; dlok:
+; nsisunz::Unzip "$TEMP\Theme-Streetlight.zip" "$INSTDIR\"
+
+; Delete "$TEMP\Theme-Streetlight.zip"
+
+ SetOutPath "$INSTDIR"
+
+!include ".\settings\optional\in_streetlight.nsh"
+
+ SetOutPath "$INSTDIR"
+
+SectionEnd
+
+ Section "Vistar" g1Sec3
+; AddSize 1000
+
+; Download theme Vistar:
+
+; NSISdl::download /TIMEOUT=30000 ${dl_vistar} $TEMP\Theme-Vistar.zip
+
+; Pop $R0 ;Get the return value
+; StrCmp $R0 "success" dlok
+; MessageBox MB_OK|MB_ICONEXCLAMATION "Download Error, click OK to Continue" /SD IDOK
+; dlok:
+; nsisunz::Unzip "$TEMP\Theme-Vistar.zip" "$INSTDIR\"
+
+; Delete "$TEMP\Theme-Vistar.zip"
+
+ SetOutPath "$INSTDIR"
+
+!include ".\settings\optional\in_vistar.nsh"
+
+ SetOutPath "$INSTDIR"
+
+SectionEnd
+
+
+SectionGroupEnd
+
+; ---------------------------------------------------------
+; Section4: Uninstallation Wizard
+; ---------------------------------------------------------
+
+Section Uninstall
+ !insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
+
+ !include ".\settings\optional\opt_uninstall.nsh"
+ !include ".\settings\files_un.nsh"
+
+ DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
+
+; Unregister from Windows Vista Game Explorer
+
+${If} ${AtLeastWinVista}
+
+${GameExplorer_RemoveGame} $0
+
+${EndIf}
+
+SectionEnd
+
+!insertmacro MUI_FUNCTION_DESCRIPTION_BEGIN
+ !insertmacro MUI_DESCRIPTION_TEXT ${Section1} $(DESC_Section1)
+
+; !insertmacro MUI_DESCRIPTION_TEXT ${Section2} $(DESC_Section2)
+; !insertmacro MUI_DESCRIPTION_TEXT ${Section3} $(DESC_Section3)
+
+ !insertmacro MUI_DESCRIPTION_TEXT ${g1Sec1} $(DESC_g1Sec1)
+ !insertmacro MUI_DESCRIPTION_TEXT ${g1Sec2} $(DESC_g1Sec2)
+ !insertmacro MUI_DESCRIPTION_TEXT ${g1Sec3} $(DESC_g1Sec3)
+
+ !insertmacro MUI_DESCRIPTION_TEXT ${g2Section1} $(DESC_g2Section1)
+ !insertmacro MUI_DESCRIPTION_TEXT ${g2Section2} $(DESC_g2Section2)
+ !insertmacro MUI_DESCRIPTION_TEXT ${g2Section3} $(DESC_g2Section3)
+
+!insertmacro MUI_FUNCTION_DESCRIPTION_END
+
+; -----------------------------------------------------------------------
+; Language Strings for Installation / Uninstallation Wizard
+; can be found at .\settings\langstrings.nsh
+; -----------------------------------------------------------------------
+
+!include .\settings\langstrings.nsh
+
+; ------------------------------------------------------------------
+; Functions for the beginning of the installation and uninstallation
+; ------------------------------------------------------------------
+
+; Function for Installation
+
+Function .onInit
+
+ System::Call 'kernel32::CreateMutexA(i 0, i 0, t "USdx Installer.exe") ?e'
+
+ Pop $R0
+
+ StrCmp $R0 0 +3
+ MessageBox MB_OK "The installer is already running."
+ Abort
+
+ !insertmacro MUI_LANGDLL_DISPLAY
+
+ ReadRegStr $R0 HKLM \
+ "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" \
+ "UninstallString"
+ StrCmp $R0 "" done
+
+ MessageBox MB_YESNO|MB_ICONEXCLAMATION \
+ "${PRODUCT_NAME} is already installed. $\n$\nAre you sure you want to \
+ install it again?" \
+ IDYES done
+ Abort
+
+
+done:
+
+ !insertmacro MUI_INSTALLOPTIONS_EXTRACT_AS ".\settings\settings-1031.ini" "Settings-1031"
+ !insertmacro MUI_INSTALLOPTIONS_EXTRACT_AS ".\settings\settings-1033.ini" "Settings-1033"
+
+FunctionEnd
+
+; Function for Uninstallation
+
+Function un.onInit
+
+ ${nsProcess::FindProcess} "USdx.exe" $R0
+ StrCmp $R0 0 0 +2
+ MessageBox MB_YESNO|MB_ICONEXCLAMATION 'UltraStar Deluxe cannot be uninstalled while its running! Do you want to close it?' IDYES closeit IDNO end
+
+ closeit:
+ ${nsProcess::KillProcess} "USdx.exe" $R0
+ goto continue
+
+ end:
+ ${nsProcess::Unload}
+ Abort
+
+ continue:
+ !insertmacro MUI_LANGDLL_DISPLAY
+
+FunctionEnd \ No newline at end of file
diff --git a/Installer/clanguage/English.nsh b/Installer/clanguage/English.nsh
new file mode 100644
index 00000000..795abfde
--- /dev/null
+++ b/Installer/clanguage/English.nsh
@@ -0,0 +1,94 @@
+;NSIS Modern User Interface - Language File
+;Compatible with Modern UI 1.68
+
+;Language: English (1033)
+;By Joost Verburg
+
+;--------------------------------
+
+!insertmacro MUI_LANGUAGEFILE_BEGIN "English"
+
+ !define MUI_LANGNAME "English" ;Use only ASCII characters (if this is not possible, use the English name)
+
+ !define MUI_TEXT_WELCOME_INFO_TITLE "Welcome to the $(^NameDA) Setup Wizard"
+ !define MUI_TEXT_WELCOME_INFO_TEXT "This wizard will guide you through the installation of $(^NameDA).\r\n\r\nIt is recommended that you close all other applications before starting Setup. This will make it possible to update relevant system files without having to reboot your computer.\r\n\r\n$_CLICK"
+
+ !define MUI_TEXT_LICENSE_TITLE "License Agreement"
+ !define MUI_TEXT_LICENSE_SUBTITLE "Please review the license terms before installing $(^NameDA)."
+ !define MUI_INNERTEXT_LICENSE_TOP "Press Page Down to see the rest of the agreement."
+ !define MUI_INNERTEXT_LICENSE_BOTTOM "If you accept the terms of the agreement, click I Agree to continue. You must accept the agreement to install $(^NameDA)."
+ !define MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "If you accept the terms of the agreement, click the check box below. You must accept the agreement to install $(^NameDA). $_CLICK"
+ !define MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "If you accept the terms of the agreement, select the first option below. You must accept the agreement to install $(^NameDA). $_CLICK"
+
+ !define MUI_TEXT_COMPONENTS_TITLE "Choose Components"
+ !define MUI_TEXT_COMPONENTS_SUBTITLE "Choose which features of $(^NameDA) you want to install."
+ !define MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Description"
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ !define MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Position your mouse over a component to see its description."
+ !else
+ !define MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Select a component to see its description."
+ !endif
+
+ !define MUI_TEXT_DIRECTORY_TITLE "Choose Install Location"
+ !define MUI_TEXT_DIRECTORY_SUBTITLE "Choose the folder in which to install $(^NameDA)."
+
+ !define MUI_TEXT_INSTALLING_TITLE "Installing"
+ !define MUI_TEXT_INSTALLING_SUBTITLE "Please wait while $(^NameDA) is being installed."
+
+ !define MUI_TEXT_FINISH_TITLE "Installation Complete"
+ !define MUI_TEXT_FINISH_SUBTITLE "Setup was completed successfully."
+
+ !define MUI_TEXT_ABORT_TITLE "Installation Aborted"
+ !define MUI_TEXT_ABORT_SUBTITLE "Setup was not completed successfully."
+
+ !define MUI_BUTTONTEXT_FINISH "&Finish"
+ !define MUI_TEXT_FINISH_INFO_TITLE "Completing the $(^NameDA) Setup Wizard"
+ !define MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) has been installed on your computer.\r\n\r\nClick Finish to close this wizard."
+ !define MUI_TEXT_FINISH_INFO_REBOOT "Your computer must be restarted in order to complete the installation of $(^NameDA). Do you want to reboot now?"
+ !define MUI_TEXT_FINISH_REBOOTNOW "Reboot now"
+ !define MUI_TEXT_FINISH_REBOOTLATER "I want to manually reboot later"
+ !define MUI_TEXT_FINISH_RUN "&Run $(^NameDA)"
+ !define MUI_TEXT_FINISH_SHOWREADME "&Show Readme"
+
+ !define MUI_TEXT_STARTMENU_TITLE "Choose Start Menu Folder"
+ !define MUI_TEXT_STARTMENU_SUBTITLE "Choose a Start Menu folder for the $(^NameDA) shortcuts."
+ !define MUI_INNERTEXT_STARTMENU_TOP "Select the Start Menu folder in which you would like to create the program's shortcuts. You can also enter a name to create a new folder."
+ !define MUI_INNERTEXT_STARTMENU_CHECKBOX "Do not create shortcuts"
+
+ !define MUI_TEXT_ABORTWARNING "Are you sure you want to quit $(^Name) Setup?"
+
+
+ !define MUI_UNTEXT_WELCOME_INFO_TITLE "Welcome to the $(^NameDA) Uninstall Wizard"
+ !define MUI_UNTEXT_WELCOME_INFO_TEXT "This wizard will guide you through the uninstallation of $(^NameDA).\r\n\r\nBefore starting the uninstallation, make sure $(^NameDA) is not running.\r\n\r\n$_CLICK"
+
+ !define MUI_UNTEXT_CONFIRM_TITLE "Uninstall $(^NameDA)"
+ !define MUI_UNTEXT_CONFIRM_SUBTITLE "Remove $(^NameDA) from your computer."
+
+ !define MUI_UNTEXT_LICENSE_TITLE "License Agreement"
+ !define MUI_UNTEXT_LICENSE_SUBTITLE "Please review the license terms before uninstalling $(^NameDA)."
+ !define MUI_UNINNERTEXT_LICENSE_BOTTOM "If you accept the terms of the agreement, click I Agree to continue. You must accept the agreement to uninstall $(^NameDA)."
+ !define MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "If you accept the terms of the agreement, click the check box below. You must accept the agreement to uninstall $(^NameDA). $_CLICK"
+ !define MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "If you accept the terms of the agreement, select the first option below. You must accept the agreement to uninstall $(^NameDA). $_CLICK"
+
+ !define MUI_UNTEXT_COMPONENTS_TITLE "Choose Components"
+ !define MUI_UNTEXT_COMPONENTS_SUBTITLE "Choose which features of $(^NameDA) you want to uninstall."
+
+ !define MUI_UNTEXT_DIRECTORY_TITLE "Choose Uninstall Location"
+ !define MUI_UNTEXT_DIRECTORY_SUBTITLE "Choose the folder from which to uninstall $(^NameDA)."
+
+ !define MUI_UNTEXT_UNINSTALLING_TITLE "Uninstalling"
+ !define MUI_UNTEXT_UNINSTALLING_SUBTITLE "Please wait while $(^NameDA) is being uninstalled."
+
+ !define MUI_UNTEXT_FINISH_TITLE "Uninstallation Complete"
+ !define MUI_UNTEXT_FINISH_SUBTITLE "Uninstall was completed successfully."
+
+ !define MUI_UNTEXT_ABORT_TITLE "Uninstallation Aborted"
+ !define MUI_UNTEXT_ABORT_SUBTITLE "Uninstall was not completed successfully."
+
+ !define MUI_UNTEXT_FINISH_INFO_TITLE "Completing the $(^NameDA) Uninstall Wizard"
+ !define MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) has been uninstalled from your computer.\r\n\r\nClick Finish to close this wizard."
+ !define MUI_UNTEXT_FINISH_INFO_REBOOT "Your computer must be restarted in order to complete the uninstallation of $(^NameDA). Do you want to reboot now?"
+
+ !define MUI_UNTEXT_ABORTWARNING "Are you sure you want to quit $(^Name) Uninstall?"
+
+!insertmacro MUI_LANGUAGEFILE_END \ No newline at end of file
diff --git a/Installer/clanguage/German.nsh b/Installer/clanguage/German.nsh
new file mode 100644
index 00000000..54c271b8
--- /dev/null
+++ b/Installer/clanguage/German.nsh
@@ -0,0 +1,94 @@
+;NSIS Modern User Interface - Language File
+;Compatible with Modern UI 1.68
+
+;Language: German (1031)
+;By L.King, changes by K. Windszus & R. Bisswanger & M. Simmack & D. Weiß
+
+;--------------------------------
+
+!insertmacro MUI_LANGUAGEFILE_BEGIN "German"
+
+ !define MUI_LANGNAME "Deutsch" ;Use only ASCII characters (if this is not possible, use the English name)
+
+ !define MUI_TEXT_WELCOME_INFO_TITLE "Willkommen beim Installations-\r\nAssistenten für $(^NameDA)"
+ !define MUI_TEXT_WELCOME_INFO_TEXT "Dieser Assistent wird Sie durch die Installation von $(^NameDA) begleiten.\r\n\r\nEs wird empfohlen, vor der Installation alle anderen Programme zu schließen, damit bestimmte Systemdateien ohne Neustart ersetzt werden können.\r\n\r\n$_CLICK"
+
+ !define MUI_TEXT_LICENSE_TITLE "Lizenzabkommen"
+ !define MUI_TEXT_LICENSE_SUBTITLE "Bitte lesen Sie die Lizenzbedingungen durch, bevor Sie mit der Installation fortfahren."
+ !define MUI_INNERTEXT_LICENSE_TOP "Drücken Sie die Bild-nach-unten Taste, um den Rest des Abkommens zu sehen."
+ !define MUI_INNERTEXT_LICENSE_BOTTOM "Falls Sie alle Bedingungen des Abkommens akzeptieren, klicken Sie auf Annehmen. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) installieren zu können."
+ !define MUI_INNERTEXT_LICENSE_BOTTOM_CHECKBOX "Falls Sie alle Bedingungen des Abkommens akzeptieren, aktivieren Sie das Kästchen. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) installieren zu können. $_CLICK"
+ !define MUI_INNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Falls Sie alle Bedingungen des Abkommens akzeptieren, wählen Sie unten die entsprechende Option. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) installieren zu können. $_CLICK"
+
+ !define MUI_TEXT_COMPONENTS_TITLE "Komponenten auswählen"
+ !define MUI_TEXT_COMPONENTS_SUBTITLE "Wählen Sie die Komponenten aus, die Sie installieren möchten."
+ !define MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE "Beschreibung"
+ !ifndef NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
+ !define MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Bewegen Sie den Mauszeiger über eine Komponente, um ihre Beschreibung zu sehen."
+ !else
+ !define MUI_INNERTEXT_COMPONENTS_DESCRIPTION_INFO "Selektieren Sie eine Komponente, um ihre Beschreibung zu sehen."
+ !endif
+
+ !define MUI_TEXT_DIRECTORY_TITLE "Zielverzeichnis auswählen"
+ !define MUI_TEXT_DIRECTORY_SUBTITLE "Wählen Sie das Verzeichnis aus, in das $(^NameDA) installiert werden soll."
+
+ !define MUI_TEXT_INSTALLING_TITLE "Installiere..."
+ !define MUI_TEXT_INSTALLING_SUBTITLE "Bitte warten Sie, während $(^NameDA) installiert wird."
+
+ !define MUI_TEXT_FINISH_TITLE "Die Installation ist vollständig"
+ !define MUI_TEXT_FINISH_SUBTITLE "Die Installation wurde erfolgreich abgeschlossen."
+
+ !define MUI_TEXT_ABORT_TITLE "Abbruch der Installation"
+ !define MUI_TEXT_ABORT_SUBTITLE "Die Installation wurde nicht vollständig abgeschlossen."
+
+ !define MUI_BUTTONTEXT_FINISH "&Fertig stellen"
+ !define MUI_TEXT_FINISH_INFO_TITLE "Die Installation von $(^NameDA) wird abgeschlossen"
+ !define MUI_TEXT_FINISH_INFO_TEXT "$(^NameDA) wurde auf Ihrem Computer installiert.\r\n\r\nKlicken Sie auf Fertig stellen, um den Installations-Assistenten zu schließen."
+ !define MUI_TEXT_FINISH_INFO_REBOOT "Windows muss neu gestartet werden, um die Installation von $(^NameDA) zu vervollständigen. Möchten Sie Windows jetzt neu starten?"
+ !define MUI_TEXT_FINISH_REBOOTNOW "Jetzt neu starten"
+ !define MUI_TEXT_FINISH_REBOOTLATER "Windows später selbst neu starten"
+ !define MUI_TEXT_FINISH_RUN "$(^NameDA) ausführen"
+ !define MUI_TEXT_FINISH_SHOWREADME "Liesmich anzeigen"
+
+ !define MUI_TEXT_STARTMENU_TITLE "Startmenü-Ordner bestimmen"
+ !define MUI_TEXT_STARTMENU_SUBTITLE "Bestimmen Sie einen Startmenü-Ordner für die Programmverknüpfungen."
+ !define MUI_INNERTEXT_STARTMENU_TOP "Wählen Sie den Startmenü-Ordner für die Programmverknüpfungen aus. Falls Sie einen neuen Ordner erstellen möchten, geben Sie dessen Namen ein."
+ !define MUI_INNERTEXT_STARTMENU_CHECKBOX "Keine Verknüpfungen erstellen"
+
+ !define MUI_TEXT_ABORTWARNING "Sind Sie sicher, dass Sie die Installation von $(^Name) abbrechen wollen?"
+
+
+ !define MUI_UNTEXT_WELCOME_INFO_TITLE "Deinstallations-Assistent von $(^NameDA)"
+ !define MUI_UNTEXT_WELCOME_INFO_TEXT "Dieser Assistent wird Sie durch die Deinstallation von $(^NameDA) begleiten.\r\n\r\nBitte beenden Sie $(^NameDA), bevor Sie mit der Deinstallation fortfahren.\r\n\r\n$_CLICK"
+
+ !define MUI_UNTEXT_CONFIRM_TITLE "Deinstallation von $(^NameDA)"
+ !define MUI_UNTEXT_CONFIRM_SUBTITLE "$(^NameDA) wird von Ihrem Computer entfernt."
+
+ !define MUI_UNTEXT_LICENSE_TITLE "Lizenzabkommen"
+ !define MUI_UNTEXT_LICENSE_SUBTITLE "Bitte lesen Sie die Lizenzbedingungen durch, bevor Sie mit der Deinstallation von $(^NameDA) fortfahren."
+ !define MUI_UNINNERTEXT_LICENSE_BOTTOM "Falls Sie alle Bedingungen des Abkommens akzeptieren, klicken Sie auf Annehmen. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) deinstallieren zu können."
+ !define MUI_UNINNERTEXT_LICENSE_BOTTOM_CHECKBOX "Falls Sie alle Bedingungen des Abkommens akzeptieren, aktivieren Sie das Kästchen. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) deinstallieren zu können. $_CLICK"
+ !define MUI_UNINNERTEXT_LICENSE_BOTTOM_RADIOBUTTONS "Falls Sie alle Bedingungen des Abkommens akzeptieren, wählen Sie unten die entsprechende Option. Sie müssen die Lizenzvereinbarungen anerkennen, um $(^NameDA) deinstallieren zu können. $_CLICK"
+
+ !define MUI_UNTEXT_COMPONENTS_TITLE "Komponenten auswählen"
+ !define MUI_UNTEXT_COMPONENTS_SUBTITLE "Wählen Sie die Komponenten aus, die Sie entfernen möchten."
+
+ !define MUI_UNTEXT_DIRECTORY_TITLE "Verzeichnis für Deinstallation auswählen"
+ !define MUI_UNTEXT_DIRECTORY_SUBTITLE "Wählen Sie das Verzeichnis aus, aus dem $(^NameDA) entfernt werden soll."
+
+ !define MUI_UNTEXT_UNINSTALLING_TITLE "Deinstalliere..."
+ !define MUI_UNTEXT_UNINSTALLING_SUBTITLE "Bitte warten Sie, während $(^NameDA) entfernt wird."
+
+ !define MUI_UNTEXT_FINISH_TITLE "Die Deinstallation ist vollständig"
+ !define MUI_UNTEXT_FINISH_SUBTITLE "Die Deinstallation wurde erfolgreich abgeschlossen."
+
+ !define MUI_UNTEXT_ABORT_TITLE "Abbruch der Deinstallation"
+ !define MUI_UNTEXT_ABORT_SUBTITLE "Die Deinstallation wurde nicht vollständig abgeschlossen."
+
+ !define MUI_UNTEXT_FINISH_INFO_TITLE "Die Deinstallation von $(^NameDA) wird abgeschlossen"
+ !define MUI_UNTEXT_FINISH_INFO_TEXT "$(^NameDA) ist von ihrem Computer entfernt worden.\r\n\r\nKlicken Sie auf Fertig stellen, um den Assistenten zu schließen."
+ !define MUI_UNTEXT_FINISH_INFO_REBOOT "Windows muss neu gestartet werden, um die Deinstallation von $(^NameDA) zu vervollständigen. Möchten Sie Windows jetzt neu starten?"
+
+ !define MUI_UNTEXT_ABORTWARNING "Sind Sie sicher, dass Sie die Deinstallation von $(^Name) abbrechen möchten?"
+
+!insertmacro MUI_LANGUAGEFILE_END \ No newline at end of file
diff --git a/Installer/gdf/UltraStar Deluxe.gdf.xml b/Installer/gdf/UltraStar Deluxe.gdf.xml
new file mode 100644
index 00000000..89d7ea16
--- /dev/null
+++ b/Installer/gdf/UltraStar Deluxe.gdf.xml
Binary files differ
diff --git a/Installer/gdf/UltraStar Deluxe.rc b/Installer/gdf/UltraStar Deluxe.rc
new file mode 100644
index 00000000..0bced87c
--- /dev/null
+++ b/Installer/gdf/UltraStar Deluxe.rc
@@ -0,0 +1,33 @@
+/////////////////////////////////////////////////////////////////////////////
+// Resource File for : UltraStar Deluxe
+#include "UltraStar Deluxe.h"
+
+#define _INC_CRTDEFS
+
+
+/////////////////////////////////////////////////////////////////////////////
+// This resource files requires the Platform SDK to be compiled.
+#include <gameux.h>
+
+
+#define APSTUDIO_READONLY_SYMBOLS
+
+#include <afxres.h>
+
+#undef APSTUDIO_READONLY_SYMBOLS
+
+/////////////////////////////////////////////////////////////////////////////
+// Neutral Resources
+#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_NEU)
+#ifdef _WIN32
+
+LANGUAGE LANG_NEUTRAL, SUBLANG_DEFAULT
+#pragma code_page(DEFAULT)
+#endif //_WIN32
+
+ID_GDF_XML DATA "UltraStar Deluxe.gdf.xml"
+ID_GDF_THUMBNAIL DATA "boxart.png"
+ID_ICON ICON "icon.ico"
+
+#endif // Neutral resources
+/////////////////////////////////////////////////////////////////////////////
diff --git a/Installer/gdf/boxart.png b/Installer/gdf/boxart.png
new file mode 100644
index 00000000..c3b1d788
--- /dev/null
+++ b/Installer/gdf/boxart.png
Binary files differ
diff --git a/Installer/gdf/gameux.h b/Installer/gdf/gameux.h
new file mode 100644
index 00000000..fa5b20a2
--- /dev/null
+++ b/Installer/gdf/gameux.h
@@ -0,0 +1,250 @@
+
+
+/* this ALWAYS GENERATED file contains the definitions for the interfaces */
+
+
+ /* File created by MIDL compiler version 7.00.0486 */
+/* Compiler settings for gameux.idl:
+ Oicf, W1, Zp8, env=Win32 (32b run)
+ protocol : dce , ms_ext, c_ext, robust
+ error checks: allocation ref bounds_check enum stub_data
+ VC __declspec() decoration level:
+ __declspec(uuid()), __declspec(selectany), __declspec(novtable)
+ DECLSPEC_UUID(), MIDL_INTERFACE()
+*/
+//@@MIDL_FILE_HEADING( )
+
+#pragma warning( disable: 4049 ) /* more than 64k source lines */
+
+
+/* verify that the <rpcndr.h> version is high enough to compile this file*/
+#ifndef __REQUIRED_RPCNDR_H_VERSION__
+#define __REQUIRED_RPCNDR_H_VERSION__ 475
+#endif
+
+/* verify that the <rpcsal.h> version is high enough to compile this file*/
+#ifndef __REQUIRED_RPCSAL_H_VERSION__
+#define __REQUIRED_RPCSAL_H_VERSION__ 100
+#endif
+
+#include "rpc.h"
+#include "rpcndr.h"
+
+#ifndef __RPCNDR_H_VERSION__
+#error this stub requires an updated version of <rpcndr.h>
+#endif // __RPCNDR_H_VERSION__
+
+#ifndef COM_NO_WINDOWS_H
+#include "windows.h"
+#include "ole2.h"
+#endif /*COM_NO_WINDOWS_H*/
+
+#ifndef __gameux_h__
+#define __gameux_h__
+
+#if defined(_MSC_VER) && (_MSC_VER >= 1020)
+#pragma once
+#endif
+
+/* Forward Declarations */
+
+#ifndef __IGameExplorer_FWD_DEFINED__
+#define __IGameExplorer_FWD_DEFINED__
+typedef interface IGameExplorer IGameExplorer;
+#endif /* __IGameExplorer_FWD_DEFINED__ */
+
+
+#ifndef __GameExplorer_FWD_DEFINED__
+#define __GameExplorer_FWD_DEFINED__
+
+#ifdef __cplusplus
+typedef class GameExplorer GameExplorer;
+#else
+typedef struct GameExplorer GameExplorer;
+#endif /* __cplusplus */
+
+#endif /* __GameExplorer_FWD_DEFINED__ */
+
+
+/* header files for imported files */
+#include "oaidl.h"
+#include "ocidl.h"
+#include "shobjidl.h"
+
+#ifdef __cplusplus
+extern "C"{
+#endif
+
+
+/* interface __MIDL_itf_gameux_0000_0000 */
+/* [local] */
+
+#define ID_GDF_XML __GDF_XML
+#define ID_GDF_THUMBNAIL __GDF_THUMBNAIL
+#define ID_ICON_ICO __ICON_ICO
+#define ID_GDF_XML_STR L"__GDF_XML"
+#define ID_GDF_THUMBNAIL_STR L"__GDF_THUMBNAIL"
+typedef /* [v1_enum] */
+enum GAME_INSTALL_SCOPE
+ { GIS_NOT_INSTALLED = 1,
+ GIS_CURRENT_USER = 2,
+ GIS_ALL_USERS = 3
+ } GAME_INSTALL_SCOPE;
+
+
+
+extern RPC_IF_HANDLE __MIDL_itf_gameux_0000_0000_v0_0_c_ifspec;
+extern RPC_IF_HANDLE __MIDL_itf_gameux_0000_0000_v0_0_s_ifspec;
+
+#ifndef __IGameExplorer_INTERFACE_DEFINED__
+#define __IGameExplorer_INTERFACE_DEFINED__
+
+/* interface IGameExplorer */
+/* [unique][helpstring][uuid][object] */
+
+
+EXTERN_C const IID IID_IGameExplorer;
+
+#if defined(__cplusplus) && !defined(CINTERFACE)
+
+ MIDL_INTERFACE("E7B2FB72-D728-49B3-A5F2-18EBF5F1349E")
+ IGameExplorer : public IUnknown
+ {
+ public:
+ virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE AddGame(
+ /* [in] */ __RPC__in BSTR bstrGDFBinaryPath,
+ /* [in] */ __RPC__in BSTR bstrGameInstallDirectory,
+ /* [in] */ GAME_INSTALL_SCOPE installScope,
+ /* [out][in] */ __RPC__inout GUID *pguidInstanceID) = 0;
+
+ virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE RemoveGame(
+ /* [in] */ GUID guidInstanceID) = 0;
+
+ virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE UpdateGame(
+ /* [in] */ GUID guidInstanceID) = 0;
+
+ virtual /* [helpstring] */ HRESULT STDMETHODCALLTYPE VerifyAccess(
+ /* [in] */ __RPC__in BSTR bstrGDFBinaryPath,
+ /* [out] */ __RPC__out BOOL *pfHasAccess) = 0;
+
+ };
+
+#else /* C style interface */
+
+ typedef struct IGameExplorerVtbl
+ {
+ BEGIN_INTERFACE
+
+ HRESULT ( STDMETHODCALLTYPE *QueryInterface )(
+ IGameExplorer * This,
+ /* [in] */ __RPC__in REFIID riid,
+ /* [iid_is][out] */
+ __RPC__deref_out void **ppvObject);
+
+ ULONG ( STDMETHODCALLTYPE *AddRef )(
+ IGameExplorer * This);
+
+ ULONG ( STDMETHODCALLTYPE *Release )(
+ IGameExplorer * This);
+
+ /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *AddGame )(
+ IGameExplorer * This,
+ /* [in] */ __RPC__in BSTR bstrGDFBinaryPath,
+ /* [in] */ __RPC__in BSTR bstrGameInstallDirectory,
+ /* [in] */ GAME_INSTALL_SCOPE installScope,
+ /* [out][in] */ __RPC__inout GUID *pguidInstanceID);
+
+ /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *RemoveGame )(
+ IGameExplorer * This,
+ /* [in] */ GUID guidInstanceID);
+
+ /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *UpdateGame )(
+ IGameExplorer * This,
+ /* [in] */ GUID guidInstanceID);
+
+ /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE *VerifyAccess )(
+ IGameExplorer * This,
+ /* [in] */ __RPC__in BSTR bstrGDFBinaryPath,
+ /* [out] */ __RPC__out BOOL *pfHasAccess);
+
+ END_INTERFACE
+ } IGameExplorerVtbl;
+
+ interface IGameExplorer
+ {
+ CONST_VTBL struct IGameExplorerVtbl *lpVtbl;
+ };
+
+
+
+#ifdef COBJMACROS
+
+
+#define IGameExplorer_QueryInterface(This,riid,ppvObject) \
+ ( (This)->lpVtbl -> QueryInterface(This,riid,ppvObject) )
+
+#define IGameExplorer_AddRef(This) \
+ ( (This)->lpVtbl -> AddRef(This) )
+
+#define IGameExplorer_Release(This) \
+ ( (This)->lpVtbl -> Release(This) )
+
+
+#define IGameExplorer_AddGame(This,bstrGDFBinaryPath,bstrGameInstallDirectory,installScope,pguidInstanceID) \
+ ( (This)->lpVtbl -> AddGame(This,bstrGDFBinaryPath,bstrGameInstallDirectory,installScope,pguidInstanceID) )
+
+#define IGameExplorer_RemoveGame(This,guidInstanceID) \
+ ( (This)->lpVtbl -> RemoveGame(This,guidInstanceID) )
+
+#define IGameExplorer_UpdateGame(This,guidInstanceID) \
+ ( (This)->lpVtbl -> UpdateGame(This,guidInstanceID) )
+
+#define IGameExplorer_VerifyAccess(This,bstrGDFBinaryPath,pfHasAccess) \
+ ( (This)->lpVtbl -> VerifyAccess(This,bstrGDFBinaryPath,pfHasAccess) )
+
+#endif /* COBJMACROS */
+
+
+#endif /* C style interface */
+
+
+
+
+#endif /* __IGameExplorer_INTERFACE_DEFINED__ */
+
+
+
+#ifndef __gameuxLib_LIBRARY_DEFINED__
+#define __gameuxLib_LIBRARY_DEFINED__
+
+/* library gameuxLib */
+/* [helpstring][version][uuid] */
+
+
+EXTERN_C const IID LIBID_gameuxLib;
+
+EXTERN_C const CLSID CLSID_GameExplorer;
+
+#ifdef __cplusplus
+
+class DECLSPEC_UUID("9A5EA990-3034-4D6F-9128-01F3C61022BC")
+GameExplorer;
+#endif
+#endif /* __gameuxLib_LIBRARY_DEFINED__ */
+
+/* Additional Prototypes for ALL interfaces */
+
+unsigned long __RPC_USER BSTR_UserSize( unsigned long *, unsigned long , BSTR * );
+unsigned char * __RPC_USER BSTR_UserMarshal( unsigned long *, unsigned char *, BSTR * );
+unsigned char * __RPC_USER BSTR_UserUnmarshal(unsigned long *, unsigned char *, BSTR * );
+void __RPC_USER BSTR_UserFree( unsigned long *, BSTR * );
+
+/* end of Additional Prototypes */
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
+
+
diff --git a/Installer/gdf/icon.ico b/Installer/gdf/icon.ico
new file mode 100644
index 00000000..f3214d1a
--- /dev/null
+++ b/Installer/gdf/icon.ico
Binary files differ
diff --git a/Installer/settings/GameExplorer.nsh b/Installer/settings/GameExplorer.nsh
new file mode 100644
index 00000000..d5056661
--- /dev/null
+++ b/Installer/settings/GameExplorer.nsh
@@ -0,0 +1,198 @@
+# user interface
+
+!define GameExplorer_GenerateGUID '!insertmacro GameExplorer_GenerateGUID'
+!define GameExplorer_AddGame '!insertmacro GameExplorer_AddGame'
+!define GameExplorer_UpdateGame '!insertmacro GameExplorer_UpdateGame'
+!define GameExplorer_RemoveGame '!insertmacro GameExplorer_RemoveGame'
+
+# internal stuff
+
+!define CLSCTX_INPROC_SERVER 1
+!define IID_IGameExplorer {E7B2FB72-D728-49B3-A5F2-18EBF5F1349E}
+!define CLSID_GameExplorer {9A5EA990-3034-4D6F-9128-01F3C61022BC}
+
+!define GIS_CURRENT_USER 2
+!define GIS_ALL_USERS 3
+
+!define IGameExplorer_QueryInterface 0
+!define IGameExplorer_AddRef 1
+!define IGameExplorer_Release 2
+!define IGameExplorer_AddGame 3
+!define IGameExplorer_RemoveGame 4
+!define IGameExplorer_UpdateGame 5
+!define IGameExplorer_VerifyAccess 6
+
+# includes
+
+!include LogicLib.nsh
+
+# the actual code
+
+!macro GameExplorer_GenerateGUID
+
+ System::Call 'ole32::CoCreateGuid(g .s)'
+
+!macroend
+
+!macro GameExplorer_AddGame CONTEXT GDF INSTDIR EXE GUID
+
+ !define __GAME_EXPLORER_UNIQUE "${__LINE__}${__FILE__}"
+
+ Push $0
+ Push $1
+
+ Push $R0
+ Push $R1
+ Push $R2
+ Push $R3
+
+ Push "${EXE}"
+ Push "${GUID}"
+ Push "${INSTDIR}"
+ Push "${GDF}"
+
+ Pop $R0 # == ${GDF}
+ Pop $R1 # == ${INSTDIR}
+ Pop $R2 # == ${GUID}
+ Pop $R3 # == ${EXE}
+
+ ClearErrors
+
+ System::Call "ole32::CoCreateInstance( \
+ g '${CLSID_GameExplorer}', i 0, \
+ i ${CLSCTX_INPROC_SERVER}, \
+ g '${IID_IGameExplorer}', *i .r1) i .r0"
+
+ ${If} $0 != 0 # S_OK
+
+ SetErrors
+ Goto "done_${__GAME_EXPLORER_UNIQUE}"
+
+ ${EndIf}
+
+ !if ${CONTEXT} == all
+
+ System::Call "$1->${IGameExplorer_AddGame}(w R0, w R1, i ${GIS_ALL_USERS}, g R2) i .r0"
+
+ !else if ${CONTEXT} == user
+
+ System::Call "$1->${IGameExplorer_AddGame}(w R1, w R0, i ${GIS_CURRENT_USER}, g R2) i .r0"
+
+ !else
+
+ !error "Invalid CONTEXT passed to GameExplorer_AddGame! Must be `user` or `all`."
+
+ !endif
+
+ ${If} $0 != 0 # S_OK
+
+ SetErrors
+
+ ${Else}
+
+ # Create play task
+
+ !if ${CONTEXT} == all
+
+ SetShellVarContext all
+
+ !else if if ${CONTEXT} == user
+
+ SetShellVarContext user
+
+ !endif
+
+ CreateDirectory $APPDATA\Microsoft\Windows\GameExplorer\$R2\PlayTasks\0
+ CreateShortcut $APPDATA\Microsoft\Windows\GameExplorer\$R2\PlayTasks\0\Play.lnk $R3
+
+ ${EndIf}
+
+ System::Call "$1->${IGameExplorer_Release}()"
+
+ "done_${__GAME_EXPLORER_UNIQUE}:"
+
+ Pop $R3
+ Pop $R2
+ Pop $R1
+ Pop $R0
+
+ Pop $1
+ Pop $0
+
+ !undef __GAME_EXPLORER_UNIQUE
+
+!macroend
+
+!macro _GameExplorer_GUID_Function Function GUID
+
+ !define __GAME_EXPLORER_UNIQUE "${__LINE__}${__FILE__}"
+
+ Push $0
+ Push $1
+ Push $2
+ Push $3
+ Push $4
+ Push $5
+
+ Push $R0
+
+ Push "${GUID}"
+
+ Pop $R0 # == ${GUID}
+
+ System::Alloc 16
+ Exch $R0
+ System::Call "ole32::CLSIDFromString(w s, i R0)"
+ System::Call "*$R0(i .r2, i .r3, i .r4, i .r5)"
+ System::Free $R0
+
+ ClearErrors
+
+ System::Call "ole32::CoCreateInstance( \
+ g '${CLSID_GameExplorer}', i 0, \
+ i ${CLSCTX_INPROC_SERVER}, \
+ g '${IID_IGameExplorer}', *i .r1) i .r0"
+
+ ${If} $0 != 0 # S_OK
+
+ SetErrors
+ Goto "done_${__GAME_EXPLORER_UNIQUE}"
+
+ ${EndIf}
+
+ System::Call "$1->${Function}(i r2, i r3, i r4, i r5) i .r0"
+
+ ${If} $0 != 0 # S_OK
+
+ SetErrors
+
+ ${EndIf}
+
+ System::Call "$1->${IGameExplorer_Release}()"
+
+ "done_${__GAME_EXPLORER_UNIQUE}:"
+
+ Pop $R0
+
+ Pop $5
+ Pop $4
+ Pop $3
+ Pop $2
+ Pop $1
+ Pop $0
+
+ !undef __GAME_EXPLORER_UNIQUE
+
+!macroend
+
+!macro GameExplorer_UpdateGame GUID
+
+ !insertmacro _GameExplorer_GUID_Function ${IGameExplorer_UpdateGame} "${GUID}"
+
+!macroend
+
+!macro GameExplorer_RemoveGame GUID
+
+ !insertmacro _GameExplorer_GUID_Function ${IGameExplorer_RemoveGame} "${GUID}"
+
+!macroend \ No newline at end of file
diff --git a/Installer/settings/files_in.nsh b/Installer/settings/files_in.nsh
new file mode 100644
index 00000000..41464613
--- /dev/null
+++ b/Installer/settings/files_in.nsh
@@ -0,0 +1,269 @@
+; This list contains the files that will be installed
+
+; Create required directories:
+
+ CreateDirectory "$INSTDIR\Covers"
+ CreateDirectory "$INSTDIR\Languages"
+ CreateDirectory "$INSTDIR\Plugins"
+ CreateDirectory "$INSTDIR\Skins"
+ CreateDirectory "$INSTDIR\Skins\Classic"
+ CreateDirectory "$INSTDIR\Skins\Deluxe"
+ CreateDirectory "$INSTDIR\Songs"
+ CreateDirectory "$INSTDIR\Sounds"
+ CreateDirectory "$INSTDIR\Themes"
+
+; Extract files to the directories:
+
+ SetOutPath "$INSTDIR"
+ File "..\InstallerDependencies\dll\bass.dll"
+ File "..\InstallerDependencies\dll\SDL.dll"
+ File "..\InstallerDependencies\dll\sqlite3.dll"
+ File "..\InstallerDependencies\dll\avcodec-51.dll"
+ File "..\InstallerDependencies\dll\avformat-50.dll"
+ File "..\InstallerDependencies\dll\avutil-49.dll"
+
+ File "..\InstallerDependencies\documents\Changelog.german.txt"
+ File "..\InstallerDependencies\documents\Changelog.txt"
+ File "..\InstallerDependencies\documents\documentation.pdf"
+ File "..\InstallerDependencies\documents\License.txt"
+ File "..\InstallerDependencies\documents\ReadMe.txt"
+
+ File "..\ScoreConverter.exe"
+ File "..\${exe}.exe"
+
+${If} ${AtLeastWinVista}
+
+ SetOutPath "$WINDIR"
+ File "..\InstallerDependencies\plugins\gdf.dll"
+
+${EndIf}
+
+ SetOutPath "$INSTDIR\Covers\"
+ File "..\Covers\Covers.ini"
+ File "..\Covers\NoCover.jpg"
+
+ SetOutPath "$INSTDIR\Languages\"
+
+ File "..\Languages\readme.txt"
+
+ File "..\Languages\Catalan.ini"
+ File "..\Languages\Dutch.ini"
+ File "..\Languages\English.ini"
+ File "..\Languages\Euskara.ini"
+ File "..\Languages\French.ini"
+ File "..\Languages\German.ini"
+ File "..\Languages\Italian.ini"
+ File "..\Languages\Norwegian.ini"
+ File "..\Languages\Polish.ini"
+ File "..\Languages\Portuguese.ini"
+ File "..\Languages\Serbian.ini"
+ File "..\Languages\Slovak.ini"
+ File "..\Languages\Spanish.ini"
+ File "..\Languages\Swedish.ini"
+
+ SetOutPath "$INSTDIR\Plugins\"
+ File "..\Plugins\Blind.dll"
+ File "..\Plugins\Duell.dll"
+ File "..\Plugins\Hold_The_Line.dll"
+ File "..\Plugins\TeamDuell.dll"
+ File "..\Plugins\Until5000.dll"
+
+ SetOutPath "$INSTDIR\Skins\Classic\"
+ File "..\Skins\Classic\[button]13.jpg"
+ File "..\Skins\Classic\[button]alt.jpg"
+ File "..\Skins\Classic\[button]az.jpg"
+ File "..\Skins\Classic\[button]e.jpg"
+ File "..\Skins\Classic\[button]enter.jpg"
+ File "..\Skins\Classic\[button]esc.jpg"
+ File "..\Skins\Classic\[button]j.jpg"
+ File "..\Skins\Classic\[button]m.jpg"
+ File "..\Skins\Classic\[button]navi.jpg"
+ File "..\Skins\Classic\[button]p.jpg"
+ File "..\Skins\Classic\[effect]goldenNoteStar.jpg"
+ File "..\Skins\Classic\[effect]perfectNoteStar.jpg"
+ File "..\Skins\Classic\[helper]rectangle.jpg"
+ File "..\Skins\Classic\[icon]error.jpg"
+ File "..\Skins\Classic\[icon]question.jpg"
+ File "..\Skins\Classic\[icon]Star.jpg"
+ File "..\Skins\Classic\[icon]stats.jpg"
+ File "..\Skins\Classic\[icon]video.jpg"
+ File "..\Skins\Classic\[main]Bar.jpg"
+ File "..\Skins\Classic\[main]Bar1.jpg"
+ File "..\Skins\Classic\[main]Button.jpg"
+ File "..\Skins\Classic\[main]Button2.jpg"
+ File "..\Skins\Classic\[main]Button3.jpg"
+ File "..\Skins\Classic\[main]ButtonEditor.jpg"
+ File "..\Skins\Classic\[main]Logo.jpg"
+ File "..\Skins\Classic\[main]songCover.jpg"
+ File "..\Skins\Classic\[main]square.jpg"
+ File "..\Skins\Classic\[mainbutton]Exit.jpg"
+ File "..\Skins\Classic\[mainbutton]Multi.jpg"
+ File "..\Skins\Classic\[mainbutton]Options.jpg"
+ File "..\Skins\Classic\[mainbutton]Solo.jpg"
+ File "..\Skins\Classic\[mainbutton]Stats.jpg"
+ File "..\Skins\Classic\[menu]jumpToBg.jpg"
+ File "..\Skins\Classic\[menu]PopUpBg.JPG"
+ File "..\Skins\Classic\[menu]PopUpFg.JPG"
+ File "..\Skins\Classic\[menu]songMenuBg.jpg"
+ File "..\Skins\Classic\[menu]songMenuBorder.jpg"
+ File "..\Skins\Classic\[menu]songMenuButtonBG.jpg"
+ File "..\Skins\Classic\[menu]songMenuSelectBG.jpg"
+ File "..\Skins\Classic\[party]Joker.jpg"
+ File "..\Skins\Classic\[party]playerButton.jpg"
+ File "..\Skins\Classic\[party]playerTeamButton.jpg"
+ File "..\Skins\Classic\[party]pointer.bmp"
+ File "..\Skins\Classic\[party]roundBG1.jpg"
+ File "..\Skins\Classic\[party]roundBG2.jpg"
+ File "..\Skins\Classic\[party]roundBG3.jpg"
+ File "..\Skins\Classic\[party]roundBG4.jpg"
+ File "..\Skins\Classic\[party]roundTeamButton.jpg"
+ File "..\Skins\Classic\[party]scoreBG1.jpg"
+ File "..\Skins\Classic\[party]scoreBG2.jpg"
+ File "..\Skins\Classic\[party]scoreDecoration.jpg"
+ File "..\Skins\Classic\[party]teamPoints.jpg"
+ File "..\Skins\Classic\[party]winDecoration.jpg"
+ File "..\Skins\Classic\[party]winTeamButton1.jpg"
+ File "..\Skins\Classic\[party]winTeamButton2.jpg"
+ File "..\Skins\Classic\[party]winTeamButton3.jpg"
+ File "..\Skins\Classic\[score]box.jpg"
+ File "..\Skins\Classic\[score]level.jpg"
+ File "..\Skins\Classic\[score]levelround.jpg"
+ File "..\Skins\Classic\[score]line.jpg"
+ File "..\Skins\Classic\[sing]lineBonusPopUp.jpg"
+ File "..\Skins\Classic\[sing]LyricsBall.bmp"
+ File "..\Skins\Classic\[sing]lyricsHelpBar.bmp"
+ File "..\Skins\Classic\[sing]notesBgLeft.bmp"
+ File "..\Skins\Classic\[sing]notesBgMid.bmp"
+ File "..\Skins\Classic\[sing]notesBgRight.bmp"
+ File "..\Skins\Classic\[sing]notesLeft.bmp"
+ File "..\Skins\Classic\[sing]notesMid.bmp"
+ File "..\Skins\Classic\[sing]notesRight.bmp"
+ File "..\Skins\Classic\[sing]p.jpg"
+ File "..\Skins\Classic\[sing]scoreBg.jpg"
+ File "..\Skins\Classic\[sing]singBarBack.jpg"
+ File "..\Skins\Classic\[sing]singBarBar.jpg"
+ File "..\Skins\Classic\[sing]singBarFront.jpg"
+ File "..\Skins\Classic\[sing]textBar.jpg"
+ File "..\Skins\Classic\[song]BGFade.jpg"
+ File "..\Skins\Classic\[song]EqualizerBG.jpg"
+ File "..\Skins\Classic\[song]selection.jpg"
+ File "..\Skins\Classic\[stat]detailBG1.jpg"
+ File "..\Skins\Classic\[stat]mainBG1.jpg"
+ File "..\Skins\Classic\[stat]mainBG2.jpg"
+ File "..\Skins\Classic\[stat]mainBG3.jpg"
+ File "..\Skins\Classic\Star.ini"
+
+ SetOutPath "$INSTDIR\Skins\Deluxe\"
+ File "..\Skins\Deluxe\[bg-load]blue.jpg"
+ File "..\Skins\Deluxe\[bg-load]fall.jpg"
+ File "..\Skins\Deluxe\[bg-load]summer.jpg"
+ File "..\Skins\Deluxe\[bg-load]winter.jpg"
+ File "..\Skins\Deluxe\[bg-main]blue.jpg"
+ File "..\Skins\Deluxe\[bg-main]fall.jpg"
+ File "..\Skins\Deluxe\[bg-main]summer.jpg"
+ File "..\Skins\Deluxe\[bg-main]winter.jpg"
+ File "..\Skins\Deluxe\[button]13.jpg"
+ File "..\Skins\Deluxe\[button]alt.jpg"
+ File "..\Skins\Deluxe\[button]az.jpg"
+ File "..\Skins\Deluxe\[button]enter.jpg"
+ File "..\Skins\Deluxe\[button]esc.jpg"
+ File "..\Skins\Deluxe\[button]j.jpg"
+ File "..\Skins\Deluxe\[button]m.jpg"
+ File "..\Skins\Deluxe\[button]navi.jpg"
+ File "..\Skins\Deluxe\[button]p.jpg"
+ File "..\Skins\Deluxe\[effect]goldenNoteStar.jpg"
+ File "..\Skins\Deluxe\[effect]perfectNoteStar.jpg"
+ File "..\Skins\Deluxe\[helper]buttonFade.jpg"
+ File "..\Skins\Deluxe\[helper]rectangle.jpg"
+ File "..\Skins\Deluxe\[icon]cd.jpg"
+ File "..\Skins\Deluxe\[icon]error.jpg"
+ File "..\Skins\Deluxe\[icon]main.jpg"
+ File "..\Skins\Deluxe\[icon]options.jpg"
+ File "..\Skins\Deluxe\[icon]party.jpg"
+ File "..\Skins\Deluxe\[icon]question.jpg"
+ File "..\Skins\Deluxe\[icon]score.jpg"
+ File "..\Skins\Deluxe\[icon]search.jpg"
+ File "..\Skins\Deluxe\[icon]songmenu.jpg"
+ File "..\Skins\Deluxe\[icon]stats.jpg"
+ File "..\Skins\Deluxe\[icon]video.jpg"
+ File "..\Skins\Deluxe\[main]button.jpg"
+ File "..\Skins\Deluxe\[main]buttonf.jpg"
+ File "..\Skins\Deluxe\[main]mainBar.jpg"
+ File "..\Skins\Deluxe\[main]playerNumberBox.jpg"
+ File "..\Skins\Deluxe\[main]selectbg.jpg"
+ File "..\Skins\Deluxe\[main]songCover.jpg"
+ File "..\Skins\Deluxe\[main]songSelection1.jpg"
+ File "..\Skins\Deluxe\[main]songSelection2.jpg"
+ File "..\Skins\Deluxe\[menu]jumpToBg.jpg"
+ File "..\Skins\Deluxe\[menu]PopUpBg.JPG"
+ File "..\Skins\Deluxe\[menu]PopUpFg.JPG"
+ File "..\Skins\Deluxe\[menu]songMenuBg.jpg"
+ File "..\Skins\Deluxe\[menu]songMenuSelectBg.jpg"
+ File "..\Skins\Deluxe\[party]Joker.jpg"
+ File "..\Skins\Deluxe\[party]playerButton.jpg"
+ File "..\Skins\Deluxe\[party]playerTeamButton.jpg"
+ File "..\Skins\Deluxe\[party]pointer.bmp"
+ File "..\Skins\Deluxe\[party]roundBG1.jpg"
+ File "..\Skins\Deluxe\[party]roundBG2.jpg"
+ File "..\Skins\Deluxe\[party]roundBG3.jpg"
+ File "..\Skins\Deluxe\[party]roundBG4.jpg"
+ File "..\Skins\Deluxe\[party]roundTeamButton.jpg"
+ File "..\Skins\Deluxe\[party]scoreBG1.jpg"
+ File "..\Skins\Deluxe\[party]scoreBG2.jpg"
+ File "..\Skins\Deluxe\[party]scoreDecoration.jpg"
+ File "..\Skins\Deluxe\[party]teamPoints.jpg"
+ File "..\Skins\Deluxe\[party]winDecoration1.jpg"
+ File "..\Skins\Deluxe\[party]winTeamButton1.jpg"
+ File "..\Skins\Deluxe\[party]winTeamButton2.jpg"
+ File "..\Skins\Deluxe\[party]winTeamButton3.jpg"
+ File "..\Skins\Deluxe\[score]box.jpg"
+ File "..\Skins\Deluxe\[score]endcap.jpg"
+ File "..\Skins\Deluxe\[score]level.jpg"
+ File "..\Skins\Deluxe\[score]levelRound.jpg"
+ File "..\Skins\Deluxe\[score]Line.jpg"
+ File "..\Skins\Deluxe\[sing]lineBonusPopUp.jpg"
+ File "..\Skins\Deluxe\[sing]LyricsBall.bmp"
+ File "..\Skins\Deluxe\[sing]lyricsHelpBar.bmp"
+ File "..\Skins\Deluxe\[sing]notesBgLeft.bmp"
+ File "..\Skins\Deluxe\[sing]notesBgMid.bmp"
+ File "..\Skins\Deluxe\[sing]notesBgRight.bmp"
+ File "..\Skins\Deluxe\[sing]notesLeft.bmp"
+ File "..\Skins\Deluxe\[sing]notesMid.bmp"
+ File "..\Skins\Deluxe\[sing]notesRight.bmp"
+ File "..\Skins\Deluxe\[sing]p.jpg"
+ File "..\Skins\Deluxe\[sing]scoreBg.jpg"
+ File "..\Skins\Deluxe\[sing]singBarBack.jpg"
+ File "..\Skins\Deluxe\[sing]singBarBar.jpg"
+ File "..\Skins\Deluxe\[sing]singBarFront.jpg"
+ File "..\Skins\Deluxe\[sing]textBar.jpg"
+ File "..\Skins\Deluxe\[sing]timeBar.jpg"
+ File "..\Skins\Deluxe\[sing]timeBar1.jpg"
+ File "..\Skins\Deluxe\[sing]timeBarBG.jpg"
+ File "..\Skins\Deluxe\[special]bar1.jpg"
+ File "..\Skins\Deluxe\[special]bar2.jpg"
+ File "..\Skins\Deluxe\[stat]detailBG1.jpg"
+ File "..\Skins\Deluxe\[stat]mainBG1.jpg"
+ File "..\Skins\Deluxe\[stat]mainBG2.jpg"
+ File "..\Skins\Deluxe\[stat]mainBG3.jpg"
+ File "..\Skins\Deluxe\Blue.ini"
+ File "..\Skins\Deluxe\Fall.ini"
+ File "..\Skins\Deluxe\Summer.ini"
+ File "..\Skins\Deluxe\Winter.ini"
+
+ SetOutPath "$INSTDIR\Sounds\"
+ File "..\Sounds\Common back.mp3"
+ File "..\Sounds\Common start.mp3"
+ File "..\Sounds\credits-outro-tune.mp3"
+ File "..\Sounds\dismissed.mp3"
+ File "..\Sounds\menu swoosh.mp3"
+ File "..\Sounds\option change col.mp3"
+ File "..\Sounds\rimshot022b.mp3"
+ File "..\Sounds\select music change music 50.mp3"
+ File "..\Sounds\select music change music.mp3"
+ File "..\Sounds\wome-credits-tune.mp3"
+
+ SetOutPath "$INSTDIR\Themes\"
+ File "..\Themes\Classic.ini"
+ File "..\Themes\Deluxe.ini"
+
+ SetOutPath "$INSTDIR" \ No newline at end of file
diff --git a/Installer/settings/files_un.nsh b/Installer/settings/files_un.nsh
new file mode 100644
index 00000000..adaf625b
--- /dev/null
+++ b/Installer/settings/files_un.nsh
@@ -0,0 +1,349 @@
+; This list contains the files that will be uninstalled
+
+; Delete provided Game Exe and provided Tools
+ Delete "$INSTDIR\ScoreConverter.exe"
+ Delete "$INSTDIR\${exe}.exe"
+
+; Delete other provided/created stuff
+ Delete "$INSTDIR\bass.dll"
+ Delete "$INSTDIR\Changelog.german.txt"
+ Delete "$INSTDIR\Changelog.txt"
+ Delete "$INSTDIR\documentation.pdf"
+ Delete "$INSTDIR\License.txt"
+ Delete "$INSTDIR\ReadMe.txt"
+ Delete "$INSTDIR\SDL.dll"
+
+ Delete "$INSTDIR\sqlite3.dll"
+ Delete "$INSTDIR\avcodec-51.dll"
+ Delete "$INSTDIR\avformat-50.dll"
+ Delete "$INSTDIR\avutil-49.dll"
+
+ Delete "$INSTDIR\sqlite3.dll"
+ Delete "$INSTDIR\config.ini"
+ Delete "$INSTDIR\Error.log"
+ Delete "$INSTDIR\covers.cache"
+ Delete "$INSTDIR\Uninstall.exe"
+
+${If} ${AtLeastWinVista}
+
+; Delete gdf.dll
+ Delete "$WINDIR\gdf.dll"
+
+${EndIf}
+
+; Delete provided Covers
+ Delete "$INSTDIR\Covers\Covers.ini"
+ Delete "$INSTDIR\Covers\NoCover.jpg"
+
+; Delete provided languages
+ Delete "$INSTDIR\Languages\Catalan.ini"
+ Delete "$INSTDIR\Languages\Dutch.ini"
+ Delete "$INSTDIR\Languages\English.ini"
+ Delete "$INSTDIR\Languages\Euskara.ini"
+ Delete "$INSTDIR\Languages\French.ini"
+ Delete "$INSTDIR\Languages\German.ini"
+ Delete "$INSTDIR\Languages\Italian.ini"
+ Delete "$INSTDIR\Languages\Norwegian.ini"
+ Delete "$INSTDIR\Languages\Polish.ini"
+ Delete "$INSTDIR\Languages\Portuguese.ini"
+ Delete "$INSTDIR\Languages\readme.txt"
+ Delete "$INSTDIR\Languages\Serbian.ini"
+ Delete "$INSTDIR\Languages\Slovak.ini"
+ Delete "$INSTDIR\Languages\Spanish.ini"
+ Delete "$INSTDIR\Languages\Swedish.ini"
+
+; Delete provided plugins
+ Delete "$INSTDIR\Plugins\Blind.dll"
+ Delete "$INSTDIR\Plugins\Duell.dll"
+ Delete "$INSTDIR\Plugins\Hold_The_Line.dll"
+ Delete "$INSTDIR\Plugins\TeamDuell.dll"
+ Delete "$INSTDIR\Plugins\Until5000.dll"
+
+; Delete provided Classic Skin
+ Delete "$INSTDIR\Skins\Classic\Star.ini"
+ Delete "$INSTDIR\Skins\Classic\[button]13.jpg"
+ Delete "$INSTDIR\Skins\Classic\[button]alt.jpg"
+ Delete "$INSTDIR\Skins\Classic\[button]az.jpg"
+ Delete "$INSTDIR\Skins\Classic\[button]e.jpg"
+ Delete "$INSTDIR\Skins\Classic\[button]enter.jpg"
+ Delete "$INSTDIR\Skins\Classic\[button]esc.jpg"
+ Delete "$INSTDIR\Skins\Classic\[button]j.jpg"
+ Delete "$INSTDIR\Skins\Classic\[button]m.jpg"
+ Delete "$INSTDIR\Skins\Classic\[button]navi.jpg"
+ Delete "$INSTDIR\Skins\Classic\[button]p.jpg"
+ Delete "$INSTDIR\Skins\Classic\[effect]goldenNoteStar.jpg"
+ Delete "$INSTDIR\Skins\Classic\[effect]perfectNoteStar.jpg"
+ Delete "$INSTDIR\Skins\Classic\[helper]rectangle.jpg"
+ Delete "$INSTDIR\Skins\Classic\[icon]error.jpg"
+ Delete "$INSTDIR\Skins\Classic\[icon]question.jpg"
+ Delete "$INSTDIR\Skins\Classic\[icon]Star.jpg"
+ Delete "$INSTDIR\Skins\Classic\[icon]stats.jpg"
+ Delete "$INSTDIR\Skins\Classic\[icon]video.jpg"
+ Delete "$INSTDIR\Skins\Classic\[mainbutton]Exit.jpg"
+ Delete "$INSTDIR\Skins\Classic\[mainbutton]Multi.jpg"
+ Delete "$INSTDIR\Skins\Classic\[mainbutton]Options.jpg"
+ Delete "$INSTDIR\Skins\Classic\[mainbutton]Solo.jpg"
+ Delete "$INSTDIR\Skins\Classic\[mainbutton]Stats.jpg"
+ Delete "$INSTDIR\Skins\Classic\[main]Bar.jpg"
+ Delete "$INSTDIR\Skins\Classic\[main]Bar1.jpg"
+ Delete "$INSTDIR\Skins\Classic\[main]Button.jpg"
+ Delete "$INSTDIR\Skins\Classic\[main]Button2.jpg"
+ Delete "$INSTDIR\Skins\Classic\[main]Button3.jpg"
+ Delete "$INSTDIR\Skins\Classic\[main]ButtonEditor.jpg"
+ Delete "$INSTDIR\Skins\Classic\[main]Logo.jpg"
+ Delete "$INSTDIR\Skins\Classic\[main]songCover.jpg"
+ Delete "$INSTDIR\Skins\Classic\[main]square.jpg"
+ Delete "$INSTDIR\Skins\Classic\[menu]jumpToBg.jpg"
+ Delete "$INSTDIR\Skins\Classic\[menu]PopUpBg.JPG"
+ Delete "$INSTDIR\Skins\Classic\[menu]PopUpFg.JPG"
+ Delete "$INSTDIR\Skins\Classic\[menu]songMenuBg.jpg"
+ Delete "$INSTDIR\Skins\Classic\[menu]songMenuBorder.jpg"
+ Delete "$INSTDIR\Skins\Classic\[menu]songMenuButtonBG.jpg"
+ Delete "$INSTDIR\Skins\Classic\[menu]songMenuSelectBG.jpg"
+ Delete "$INSTDIR\Skins\Classic\[party]Joker.jpg"
+ Delete "$INSTDIR\Skins\Classic\[party]playerButton.jpg"
+ Delete "$INSTDIR\Skins\Classic\[party]playerTeamButton.jpg"
+ Delete "$INSTDIR\Skins\Classic\[party]pointer.bmp"
+ Delete "$INSTDIR\Skins\Classic\[party]roundBG1.jpg"
+ Delete "$INSTDIR\Skins\Classic\[party]roundBG2.jpg"
+ Delete "$INSTDIR\Skins\Classic\[party]roundBG3.jpg"
+ Delete "$INSTDIR\Skins\Classic\[party]roundBG4.jpg"
+ Delete "$INSTDIR\Skins\Classic\[party]roundTeamButton.jpg"
+ Delete "$INSTDIR\Skins\Classic\[party]scoreBG1.jpg"
+ Delete "$INSTDIR\Skins\Classic\[party]scoreBG2.jpg"
+ Delete "$INSTDIR\Skins\Classic\[party]scoreDecoration.jpg"
+ Delete "$INSTDIR\Skins\Classic\[party]teamPoints.jpg"
+ Delete "$INSTDIR\Skins\Classic\[party]winDecoration.jpg"
+ Delete "$INSTDIR\Skins\Classic\[party]winTeamButton1.jpg"
+ Delete "$INSTDIR\Skins\Classic\[party]winTeamButton2.jpg"
+ Delete "$INSTDIR\Skins\Classic\[party]winTeamButton3.jpg"
+ Delete "$INSTDIR\Skins\Classic\[score]box.jpg"
+ Delete "$INSTDIR\Skins\Classic\[score]level.jpg"
+ Delete "$INSTDIR\Skins\Classic\[score]levelround.jpg"
+ Delete "$INSTDIR\Skins\Classic\[score]line.jpg"
+ Delete "$INSTDIR\Skins\Classic\[sing]lineBonusPopUp.jpg"
+ Delete "$INSTDIR\Skins\Classic\[sing]LyricsBall.bmp"
+ Delete "$INSTDIR\Skins\Classic\[sing]lyricsHelpBar.bmp"
+ Delete "$INSTDIR\Skins\Classic\[sing]notesBgLeft.bmp"
+ Delete "$INSTDIR\Skins\Classic\[sing]notesBgMid.bmp"
+ Delete "$INSTDIR\Skins\Classic\[sing]notesBgRight.bmp"
+ Delete "$INSTDIR\Skins\Classic\[sing]notesLeft.bmp"
+ Delete "$INSTDIR\Skins\Classic\[sing]notesMid.bmp"
+ Delete "$INSTDIR\Skins\Classic\[sing]notesRight.bmp"
+ Delete "$INSTDIR\Skins\Classic\[sing]p.jpg"
+ Delete "$INSTDIR\Skins\Classic\[sing]scoreBg.jpg"
+ Delete "$INSTDIR\Skins\Classic\[sing]singBarBack.jpg"
+ Delete "$INSTDIR\Skins\Classic\[sing]singBarBar.jpg"
+ Delete "$INSTDIR\Skins\Classic\[sing]singBarFront.jpg"
+ Delete "$INSTDIR\Skins\Classic\[sing]textBar.jpg"
+ Delete "$INSTDIR\Skins\Classic\[song]BGFade.jpg"
+ Delete "$INSTDIR\Skins\Classic\[song]EqualizerBG.jpg"
+ Delete "$INSTDIR\Skins\Classic\[song]selection.jpg"
+ Delete "$INSTDIR\Skins\Classic\[stat]detailBG1.jpg"
+ Delete "$INSTDIR\Skins\Classic\[stat]mainBG1.jpg"
+ Delete "$INSTDIR\Skins\Classic\[stat]mainBG2.jpg"
+ Delete "$INSTDIR\Skins\Classic\[stat]mainBG3.jpg"
+
+; Delete provided Deluxe Skin
+ Delete "$INSTDIR\Skins\Deluxe\Blue.ini"
+ Delete "$INSTDIR\Skins\Deluxe\Fall.ini"
+ Delete "$INSTDIR\Skins\Deluxe\Summer.ini"
+ Delete "$INSTDIR\Skins\Deluxe\Winter.ini"
+ Delete "$INSTDIR\Skins\Deluxe\[bg-load]blue.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[bg-load]fall.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[bg-load]summer.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[bg-load]winter.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[bg-main]blue.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[bg-main]fall.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[bg-main]summer.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[bg-main]winter.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[button]13.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[button]alt.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[button]az.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[button]enter.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[button]esc.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[button]j.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[button]m.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[button]navi.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[button]p.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[effect]goldenNoteStar.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[effect]perfectNoteStar.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[helper]buttonFade.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[helper]rectangle.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[icon]cd.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[icon]error.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[icon]main.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[icon]options.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[icon]party.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[icon]question.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[icon]score.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[icon]search.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[icon]songmenu.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[icon]stats.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[icon]video.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[main]button.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[main]buttonf.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[main]mainBar.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[main]playerNumberBox.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[main]selectbg.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[main]songCover.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[main]songSelection1.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[main]songSelection2.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[menu]jumpToBg.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[menu]PopUpBg.JPG"
+ Delete "$INSTDIR\Skins\Deluxe\[menu]PopUpFg.JPG"
+ Delete "$INSTDIR\Skins\Deluxe\[menu]songMenuBg.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[menu]songMenuSelectBg.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[party]Joker.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[party]playerButton.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[party]playerTeamButton.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[party]pointer.bmp"
+ Delete "$INSTDIR\Skins\Deluxe\[party]roundBG1.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[party]roundBG2.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[party]roundBG3.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[party]roundBG4.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[party]roundTeamButton.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[party]scoreBG1.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[party]scoreBG2.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[party]scoreDecoration.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[party]teamPoints.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[party]winDecoration1.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[party]winTeamButton1.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[party]winTeamButton2.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[party]winTeamButton3.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[score]box.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[score]endcap.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[score]level.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[score]levelRound.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[score]Line.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[sing]lineBonusPopUp.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[sing]LyricsBall.bmp"
+ Delete "$INSTDIR\Skins\Deluxe\[sing]lyricsHelpBar.bmp"
+ Delete "$INSTDIR\Skins\Deluxe\[sing]notesBgLeft.bmp"
+ Delete "$INSTDIR\Skins\Deluxe\[sing]notesBgMid.bmp"
+ Delete "$INSTDIR\Skins\Deluxe\[sing]notesBgRight.bmp"
+ Delete "$INSTDIR\Skins\Deluxe\[sing]notesLeft.bmp"
+ Delete "$INSTDIR\Skins\Deluxe\[sing]notesMid.bmp"
+ Delete "$INSTDIR\Skins\Deluxe\[sing]notesRight.bmp"
+ Delete "$INSTDIR\Skins\Deluxe\[sing]p.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[sing]scoreBg.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[sing]singBarBack.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[sing]singBarBar.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[sing]singBarFront.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[sing]textBar.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[sing]timeBar.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[sing]timeBar1.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[sing]timeBarBG.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[special]bar1.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[special]bar2.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[stat]detailBG1.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[stat]mainBG1.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[stat]mainBG2.jpg"
+ Delete "$INSTDIR\Skins\Deluxe\[stat]mainBG3.jpg"
+
+; Delete provided sounds
+ Delete "$INSTDIR\Sounds\Common back.mp3"
+ Delete "$INSTDIR\Sounds\Common start.mp3"
+ Delete "$INSTDIR\Sounds\credits-outro-tune.mp3"
+ Delete "$INSTDIR\Sounds\dismissed.mp3"
+ Delete "$INSTDIR\Sounds\menu swoosh.mp3"
+ Delete "$INSTDIR\Sounds\option change col.mp3"
+ Delete "$INSTDIR\Sounds\rimshot022b.mp3"
+ Delete "$INSTDIR\Sounds\select music change music 50.mp3"
+ Delete "$INSTDIR\Sounds\select music change music.mp3"
+ Delete "$INSTDIR\Sounds\wome-credits-tune.mp3"
+
+; Delete provided Themes
+ Delete "$INSTDIR\Themes\Classic.ini"
+ Delete "$INSTDIR\Themes\Deluxe.ini"
+
+; Delete provided Songs
+ Delete "$INSTDIR\Songs\Dead Smiling Pirates - I 18 [DEMO]\Dead Smiling Pirates - I 18 [BG].jpg"
+ Delete "$INSTDIR\Songs\Dead Smiling Pirates - I 18 [DEMO]\Dead Smiling Pirates - I 18 [CO].jpg"
+ Delete "$INSTDIR\Songs\Dead Smiling Pirates - I 18 [DEMO]\Dead Smiling Pirates - I 18.ogg"
+ Delete "$INSTDIR\Songs\Dead Smiling Pirates - I 18 [DEMO]\Dead Smiling Pirates - I 18.txt"
+ Delete "$INSTDIR\Songs\Dead Smiling Pirates - I 18 [DEMO]\License.txt"
+
+ Delete "$INSTDIR\Songs\Steven Dunston - Northern Star [DEMO]\Steven Dunston - Northern Star [BG].jpg"
+ Delete "$INSTDIR\Songs\Steven Dunston - Northern Star [DEMO]\Steven Dunston - Northern Star [CO].jpg"
+ Delete "$INSTDIR\Songs\Steven Dunston - Northern Star [DEMO]\Steven Dunston - Northern Star.ogg"
+ Delete "$INSTDIR\Songs\Steven Dunston - Northern Star [DEMO]\Steven Dunston - Northern Star.txt"
+ Delete "$INSTDIR\Songs\Steven Dunston - Northern Star [DEMO]\License.txt"
+
+ Delete "$INSTDIR\Songs\Joshua Morin - On the run [DEMO]\License.txt"
+ Delete "$INSTDIR\Songs\Joshua Morin - On the run [DEMO]\Joshua Morin - On the run.txt"
+ Delete "$INSTDIR\Songs\Joshua Morin - On the run [DEMO]\Joshua Morin - On the run [BG].jpg"
+ Delete "$INSTDIR\Songs\Joshua Morin - On the run [DEMO]\Joshua Morin - On the run [CO].jpg"
+ Delete "$INSTDIR\Songs\Joshua Morin - On the run [DEMO]\Joshua Morin - On the run.ogg"
+
+; Delete only empty directories:
+
+StrCpy $0 "$INSTDIR\Covers"
+Call un.DeleteIfEmpty
+
+StrCpy $0 "$INSTDIR\Languages"
+Call un.DeleteIfEmpty
+
+StrCpy $0 "$INSTDIR\Plugins"
+Call un.DeleteIfEmpty
+
+StrCpy $0 "$INSTDIR\Skins\Classic"
+Call un.DeleteIfEmpty
+
+StrCpy $0 "$INSTDIR\Skins\Deluxe"
+Call un.DeleteIfEmpty
+
+StrCpy $0 "$INSTDIR\Skins"
+Call un.DeleteIfEmpty
+
+StrCpy $0 "$INSTDIR\Songs\Dead Smiling Pirates - I 18 [DEMO]"
+Call un.DeleteIfEmpty
+
+StrCpy $0 "$INSTDIR\Songs\Steven Dunston - Northern Star [DEMO]"
+Call un.DeleteIfEmpty
+
+StrCpy $0 "$INSTDIR\Songs\Joshua Morin - On the run [DEMO]"
+Call un.DeleteIfEmpty
+
+StrCpy $0 "$INSTDIR\Songs"
+Call un.DeleteIfEmpty
+
+StrCpy $0 "$INSTDIR\Sounds"
+Call un.DeleteIfEmpty
+
+StrCpy $0 "$INSTDIR\Themes"
+Call un.DeleteIfEmpty
+
+StrCpy $0 "$INSTDIR\Screenshots"
+Call un.DeleteIfEmpty
+
+StrCpy $0 "$INSTDIR\Playlists"
+Call un.DeleteIfEmpty
+
+StrCpy $0 "$INSTDIR"
+Call un.DeleteIfEmpty
+
+
+; Delete created Icons in startmenu
+
+ SetShellVarContext all
+
+ Delete "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk"
+ Delete "$SMPROGRAMS\$ICONS_GROUP\Deinstallieren.lnk"
+ Delete "$SMPROGRAMS\$ICONS_GROUP\Website.lnk"
+ Delete "$SMPROGRAMS\$ICONS_GROUP\Internetseite.lnk"
+ Delete "$SMPROGRAMS\$ICONS_GROUP\UltraStar Deluxe spielen.lnk"
+ Delete "$SMPROGRAMS\$ICONS_GROUP\Play UltraStar Deluxe.lnk"
+ Delete "$SMPROGRAMS\$ICONS_GROUP\Readme.lnk"
+ Delete "$SMPROGRAMS\$ICONS_GROUP\Lies mich.lnk"
+ Delete "$SMPROGRAMS\$ICONS_GROUP\Lizenz.lnk"
+ Delete "$SMPROGRAMS\$ICONS_GROUP\License.lnk"
+
+; Delete created Icon on Desktop
+
+Delete "$Desktop\Play UltraStar Deluxe.lnk"
+Delete "$Desktop\UltraStar Deluxe spielen.lnk"
+
+StrCpy $0 "$SMPROGRAMS\$ICONS_GROUP"
+Call un.DeleteIfEmpty
+
diff --git a/Installer/settings/functions.nsh b/Installer/settings/functions.nsh
new file mode 100644
index 00000000..147ec76c
--- /dev/null
+++ b/Installer/settings/functions.nsh
@@ -0,0 +1,78 @@
+!define exe2 "USdx" ; Current name of start exe
+; Creates Desktop Shortcut(s) if
+; checked on Finish Page
+
+Function CreateDesktopShortCuts
+
+SetOutPath "$INSTDIR"
+
+CreateShortcut "$Desktop\$(sm_shortcut).lnk" "$INSTDIR\${exe2}.exe"
+
+FunctionEnd
+
+; Deletes only empty dirs which are
+; at the top of the stack.
+
+Function un.DeleteIfEmpty
+ FindFirst $R0 $R1 "$0\*.*"
+ strcmp $R1 "." 0 NoDelete
+ FindNext $R0 $R1
+ strcmp $R1 ".." 0 NoDelete
+ ClearErrors
+ FindNext $R0 $R1
+ IfErrors 0 NoDelete
+ FindClose $R0
+ Sleep 1000
+ RMDir "$0"
+ NoDelete:
+ FindClose $R0
+FunctionEnd
+
+; This is used to write a
+; string to config.ini
+
+Function WriteToConfig
+ Exch $0
+ Exch
+ Exch $1
+
+ FileOpen $0 $0 a
+ FileSeek $0 0 END
+ FileWrite $0 $1
+ FileClose $0
+
+ Pop $1
+ Pop $0
+FunctionEnd
+
+!macro WriteToConfig String File
+ Push "${String}"
+ Push "${File}"
+ Call WriteToConfig
+!macroend
+!define WriteToConfig "!insertmacro WriteToConfig"
+
+; Finds UltraStar Deluxe process
+;
+
+!define nsProcess::FindProcess `!insertmacro nsProcess::FindProcess`
+
+!macro nsProcess::FindProcess _FILE _ERR
+ nsProcess::_FindProcess /NOUNLOAD `${_FILE}`
+ Pop ${_ERR}
+!macroend
+
+
+!define nsProcess::KillProcess `!insertmacro nsProcess::KillProcess`
+
+!macro nsProcess::KillProcess _FILE _ERR
+ nsProcess::_KillProcess /NOUNLOAD `${_FILE}`
+ Pop ${_ERR}
+!macroend
+
+
+!define nsProcess::Unload `!insertmacro nsProcess::Unload`
+
+!macro nsProcess::Unload
+ nsProcess::_Unload
+!macroend \ No newline at end of file
diff --git a/Installer/settings/io.ini b/Installer/settings/io.ini
new file mode 100644
index 00000000..55dc5a69
--- /dev/null
+++ b/Installer/settings/io.ini
@@ -0,0 +1,19 @@
+[Settings]
+Rect=1044
+NumFields=3
+[Field 1]
+Type=bitmap
+Left=0
+Right=109
+Top=0
+Bottom=193
+Flags=RESIZETOFIT
+[Field 2]
+Type=label
+Left=120
+Right=315
+Top=10
+[Field 3]
+Type=label
+Left=120
+Right=315 \ No newline at end of file
diff --git a/Installer/settings/langstrings.nsh b/Installer/settings/langstrings.nsh
new file mode 100644
index 00000000..baed5f94
--- /dev/null
+++ b/Installer/settings/langstrings.nsh
@@ -0,0 +1,69 @@
+; Language Strings which are used in the main program
+
+LangString str_continue ${LANG_GERMAN} "Dies wird UltraStar Deluxe installieren. Fortsetzen?"
+LangString str_continue ${LANG_ENGLISH} "This will install UltraStar Deluxe. Continue?"
+
+LangString str_abort ${LANG_ENGLISH} "Are you sure to abort Installation?"
+LangString str_abort ${LANG_GERMAN} "Wollen Sie die Installation wirklich abbrechen?"
+
+LangString uninst_begin ${LANG_ENGLISH} "This will uninstall UltraStar Deluxe completely (with Songs!). Continue ?"
+LangString uninst_begin ${LANG_GERMAN} "Dies wird UltraStar Deluxe vollständig deinstallieren (inkl. Songs!). Fortfahren?"
+
+LangString MUI_UNTEXT_FINISH_INFO_TEXT ${LANG_ENGLISH} "We hope you enjoyed UltraStar Deluxe. Please leave us a comment why you uninstalled UltraStar Deluxe in our forum: ${forum}. We would also be pleased to recieve your feedback on UltraStar Deluxe there."
+LangString MUI_UNTEXT_FINISH_INFO_TEXT ${LANG_GERMAN} "Wir hoffen du hast UltraStar Deluxe genossen. Bitte hinterlasse uns einen Kommentar im Forum, warum du UltraStar Deluxe deinstalliert hast: ${forum}. Wir würden uns dort ebenso über eine Rückmeldung für UltraStar Deluxe freuen."
+
+LangString MUI_UNTEXT_FINISH_INFO_TITLE ${LANG_ENGLISH} "The uninstallation finished successfully!"
+LangString MUI_UNTEXT_FINISH_INFO_TITLE ${LANG_GERMAN} "Die Deinstallation wurde erfolgreich abgeschlossen."
+
+LangString MUI_UNTEXT_FINISH_INFO_REBOOT ${LANG_ENGLISH} "Not supported for good reason."
+LangString MUI_UNTEXT_FINISH_INFO_REBOOT ${LANG_GERMAN} "Aus gutem Grund nicht unterstüzt."
+
+LangString str_header ${LANG_ENGLISH} "Custom options for Installation"
+LangString str_header ${LANG_GERMAN} "Eigene Optionen zur Installation"
+
+LangString str_header_subtitle ${LANG_ENGLISH} ""
+LangString str_header_subtitle ${LANG_GERMAN} ""
+
+LangString sm_shortcut ${LANG_GERMAN} "UltraStar Deluxe spielen" ; Name for start Icon in startmenu
+LangString sm_shortcut ${LANG_ENGLISH} "Play UltraStar Deluxe"
+
+LangString sc_desktop ${LANG_GERMAN} "Verknüpfung auf dem Desktop erstellen?" ; Finish Page: Readme = Create Desktop Shortcut
+LangString sc_desktop ${LANG_ENGLISH} "Create Desktop Shortcut?"
+
+LangString sc_play ${LANG_GERMAN} "Spielen" ; Shortcut name play or spielen (used for MCE)
+LangString sc_play ${LANG_ENGLISH} "Play"
+
+LangString sm_uninstall ${LANG_GERMAN} "Deinstallieren" ; Name for uninstall icon in startmenu
+LangString sm_uninstall ${LANG_ENGLISH} "Uninstall"
+
+LangString sm_website ${LANG_GERMAN} "Internetseite" ; Name for website icon in startmenu
+LangString sm_website ${LANG_ENGLISH} "Website"
+
+LangString sm_license ${LANG_GERMAN} "Lizenz" ; Name for license.txt icon in startmenu
+LangString sm_license ${LANG_ENGLISH} "License"
+
+LangString sm_readme ${LANG_GERMAN} "Lies mich" ; Name for readme.txt icon in startmenu
+LangString sm_readme ${LANG_ENGLISH} "Readme"
+
+LangString Settings_TITLE ${LANG_ENGLISH} " "
+LangString Settings_TITLE ${LANG_GERMAN} " "
+LangString Settings_SUBTITLE ${LANG_ENGLISH} "Specify your favorite settings for UltraStar Deluxe"
+LangString Settings_SUBTITLE ${LANG_GERMAN} "Lege deine favorisierten Einstellungen für UltraStar Deluxe fest."
+
+LangString wp_title ${LANG_GERMAN} "Willkommen zur Installationsroutine von UltraStar Deluxe" ; Title String in Welcome Page
+LangString wp_title ${LANG_ENGLISH} "Welcome to the UltraStar Deluxe Setup Wizard"
+
+LangString wp_text ${LANG_GERMAN} "Dieser Assistent wird Sie durch die Installation von UltraStar Deluxe begleiten. UltraStar Deluxe ist ein kostenloses quelloffenes Karaokespiel, welches Singstar ähnelt. \n\r\n\rDas UltraStar Deluxe Team wünscht viel Spaß.\n\rProjekthomepage: http://www.ultrastardeluxe.org\n\rSupport Forum: http://forum.ultrastardeluxe.org"
+LangString wp_text ${LANG_ENGLISH} "This wizard will guide you through the Installation of UltraStar Deluxe. UltraStar Deluxe is a free open source Karaoke game, which can be compared with Singstar.\n\r\n\rThe UltraStar Deluxe Team wishes you fun.\n\rProject website: http://www.ultrastardeluxe.org\n\rSupport Forum: http://forum.ultrastardeluxe.org"
+
+LangString fp_showreadme ${LANG_GERMAN} "Dokumentation ansehen (PDF)" ; "Show Readme" String in Finish Page
+LangString fp_showreadme ${LANG_ENGLISH} "See documentation (PDF)"
+
+LangString fp_text ${LANG_GERMAN} "UltraStar Deluxe wurde erfolgreich auf Ihrem System installiert.\n\r\n\rBesuchen Sie unsere Projektwebseite um die neusten Updates und News zu erhalten."
+LangString fp_text ${LANG_ENGLISH} "UltraStar Deluxe was installed successfully on you system.\n\r\n\rVisit out project website to get latest news and updates."
+
+LangString fp_link ${LANG_GERMAN} "Projektwebseite" ; Link to developers website - String in Finish Page
+LangString fp_link ${LANG_ENGLISH} "Project website"
+
+LangString uncp_text ${LANG_GERMAN} "Willkommen beim Deinstallations-Assistent für UltraStar Deluxe"
+LangString uncp_text ${LANG_ENGLISH} "Welcome to the UltraStar Deluxe Uninstall Wizard" \ No newline at end of file
diff --git a/Installer/settings/optional/in_orange.nsh b/Installer/settings/optional/in_orange.nsh
new file mode 100644
index 00000000..53eb09a8
--- /dev/null
+++ b/Installer/settings/optional/in_orange.nsh
@@ -0,0 +1,102 @@
+ CreateDirectory "$INSTDIR\Skins\Orange"
+
+ SetOutPath "$INSTDIR\Skins\Orange"
+
+ File "..\Skins\Orange\[bg-load].jpg"
+ File "..\Skins\Orange\[button]13.jpg"
+ File "..\Skins\Orange\[button]alt.jpg"
+ File "..\Skins\Orange\[button]az.jpg"
+ File "..\Skins\Orange\[button]enter.jpg"
+ File "..\Skins\Orange\[button]esc.jpg"
+ File "..\Skins\Orange\[button]j.jpg"
+ File "..\Skins\Orange\[button]m.jpg"
+ File "..\Skins\Orange\[button]navi.jpg"
+ File "..\Skins\Orange\[button]p.jpg"
+ File "..\Skins\Orange\[effect]goldenNoteStar.jpg"
+ File "..\Skins\Orange\[effect]perfectNoteStar.jpg"
+ File "..\Skins\Orange\[helper]buttonFade.jpg"
+ File "..\Skins\Orange\[helper]rectangle.jpg"
+ File "..\Skins\Orange\[icon]cd.jpg"
+ File "..\Skins\Orange\[icon]error.jpg"
+ File "..\Skins\Orange\[icon]main.jpg"
+ File "..\Skins\Orange\[icon]options.jpg"
+ File "..\Skins\Orange\[icon]party.jpg"
+ File "..\Skins\Orange\[icon]question.jpg"
+ File "..\Skins\Orange\[icon]score.jpg"
+ File "..\Skins\Orange\[icon]search.jpg"
+ File "..\Skins\Orange\[icon]songmenu.jpg"
+ File "..\Skins\Orange\[icon]stats.jpg"
+ File "..\Skins\Orange\[icon]video.jpg"
+ File "..\Skins\Orange\[main]button.jpg"
+ File "..\Skins\Orange\[main]button2.jpg"
+ File "..\Skins\Orange\[main]button3.jpg"
+ File "..\Skins\Orange\[main]buttonf.jpg"
+ File "..\Skins\Orange\[main]button-m-1.jpg"
+ File "..\Skins\Orange\[main]button-m-2.jpg"
+ File "..\Skins\Orange\[main]button-m-3.jpg"
+ File "..\Skins\Orange\[main]button-m-4.jpg"
+ File "..\Skins\Orange\[main]mainBar.jpg"
+ File "..\Skins\Orange\[main]playerNumberBox.jpg"
+ File "..\Skins\Orange\[main]selectbg.jpg"
+ File "..\Skins\Orange\[main]songCover.jpg"
+ File "..\Skins\Orange\[main]songSelection1.jpg"
+ File "..\Skins\Orange\[main]songSelection2.jpg"
+ File "..\Skins\Orange\[menu]jumpToBg.jpg"
+ File "..\Skins\Orange\[menu]PopUpBg.JPG"
+ File "..\Skins\Orange\[menu]PopUpFg.JPG"
+ File "..\Skins\Orange\[menu]songMenuBg.jpg"
+ File "..\Skins\Orange\[menu]songMenuSelectBg.jpg"
+ File "..\Skins\Orange\[party]Joker.jpg"
+ File "..\Skins\Orange\[party]playerButton.jpg"
+ File "..\Skins\Orange\[party]playerTeamButton.jpg"
+ File "..\Skins\Orange\[party]pointer.bmp"
+ File "..\Skins\Orange\[party]roundBG1.jpg"
+ File "..\Skins\Orange\[party]roundBG2.jpg"
+ File "..\Skins\Orange\[party]roundBG3.jpg"
+ File "..\Skins\Orange\[party]roundBG4.jpg"
+ File "..\Skins\Orange\[party]roundTeamButton.jpg"
+ File "..\Skins\Orange\[party]scoreBG1.jpg"
+ File "..\Skins\Orange\[party]scoreBG2.jpg"
+ File "..\Skins\Orange\[party]scoreDecoration.jpg"
+ File "..\Skins\Orange\[party]teamPoints.jpg"
+ File "..\Skins\Orange\[party]winDecoration1.jpg"
+ File "..\Skins\Orange\[party]winTeamButton1.jpg"
+ File "..\Skins\Orange\[party]winTeamButton2.jpg"
+ File "..\Skins\Orange\[party]winTeamButton3.jpg"
+ File "..\Skins\Orange\[score]box.jpg"
+ File "..\Skins\Orange\[score]endcap.jpg"
+ File "..\Skins\Orange\[score]level.jpg"
+ File "..\Skins\Orange\[score]levelRound.jpg"
+ File "..\Skins\Orange\[score]Line.jpg"
+ File "..\Skins\Orange\[sing]lineBonusPopUp.jpg"
+ File "..\Skins\Orange\[sing]LyricsBall.bmp"
+ File "..\Skins\Orange\[sing]lyricsHelpBar.bmp"
+ File "..\Skins\Orange\[sing]notesBgLeft.bmp"
+ File "..\Skins\Orange\[sing]notesBgMid.bmp"
+ File "..\Skins\Orange\[sing]notesBgRight.bmp"
+ File "..\Skins\Orange\[sing]notesLeft.bmp"
+ File "..\Skins\Orange\[sing]notesMid.bmp"
+ File "..\Skins\Orange\[sing]notesRight.bmp"
+ File "..\Skins\Orange\[sing]p.jpg"
+ File "..\Skins\Orange\[sing]scoreBg.jpg"
+ File "..\Skins\Orange\[sing]singBarBack.jpg"
+ File "..\Skins\Orange\[sing]singBarBar.jpg"
+ File "..\Skins\Orange\[sing]singBarFront.jpg"
+ File "..\Skins\Orange\[sing]textBar.jpg"
+ File "..\Skins\Orange\[sing]timeBar.jpg"
+ File "..\Skins\Orange\[sing]timeBarBG.jpg"
+ File "..\Skins\Orange\[special]bar1.jpg"
+ File "..\Skins\Orange\[special]bar2.jpg"
+ File "..\Skins\Orange\[stat]detailBG1.jpg"
+ File "..\Skins\Orange\[stat]mainBG1.jpg"
+ File "..\Skins\Orange\[stat]mainBG2.jpg"
+ File "..\Skins\Orange\[stat]mainBG3.jpg"
+ File "..\Skins\Orange\bg-main.jpg"
+ File "..\Skins\Orange\bg-song.jpg"
+ File "..\Skins\Orange\Orange.ini"
+
+ SetOutPath "$INSTDIR\Themes"
+
+ File "..\Themes\Orange.ini"
+
+ SetOutPath "$INSTDIR"
diff --git a/Installer/settings/optional/in_song1.nsh b/Installer/settings/optional/in_song1.nsh
new file mode 100644
index 00000000..50c1e20a
--- /dev/null
+++ b/Installer/settings/optional/in_song1.nsh
@@ -0,0 +1,10 @@
+
+ SetOutPath "$INSTDIR\Songs\Dead Smiling Pirates - I 18 [DEMO]\"
+
+ File "..\Songs\Dead Smiling Pirates - I 18 [DEMO]\Dead Smiling Pirates - I 18 [BG].jpg"
+ File "..\Songs\Dead Smiling Pirates - I 18 [DEMO]\Dead Smiling Pirates - I 18 [CO].jpg"
+ File "..\Songs\Dead Smiling Pirates - I 18 [DEMO]\Dead Smiling Pirates - I 18.ogg"
+ File "..\Songs\Dead Smiling Pirates - I 18 [DEMO]\Dead Smiling Pirates - I 18.txt"
+ File "..\Songs\Dead Smiling Pirates - I 18 [DEMO]\License.txt"
+
+ SetOutPath "$INSTDIR" \ No newline at end of file
diff --git a/Installer/settings/optional/in_song2.nsh b/Installer/settings/optional/in_song2.nsh
new file mode 100644
index 00000000..29478c56
--- /dev/null
+++ b/Installer/settings/optional/in_song2.nsh
@@ -0,0 +1,11 @@
+
+ SetOutPath "$INSTDIR\Songs\Steven Dunston - Northern Star [DEMO]\"
+
+ File "..\Songs\Steven Dunston - Northern Star [DEMO]\License.txt"
+ File "..\Songs\Steven Dunston - Northern Star [DEMO]\Steven Dunston - Northern Star.txt"
+ File "..\Songs\Steven Dunston - Northern Star [DEMO]\Steven Dunston - Northern Star [BG].jpg"
+ File "..\Songs\Steven Dunston - Northern Star [DEMO]\Steven Dunston - Northern Star [CO].jpg"
+ File "..\Songs\Steven Dunston - Northern Star [DEMO]\Steven Dunston - Northern Star.ogg"
+
+
+ SetOutPath "$INSTDIR" \ No newline at end of file
diff --git a/Installer/settings/optional/in_song3.nsh b/Installer/settings/optional/in_song3.nsh
new file mode 100644
index 00000000..844accdd
--- /dev/null
+++ b/Installer/settings/optional/in_song3.nsh
@@ -0,0 +1,11 @@
+
+ SetOutPath "$INSTDIR\Songs\Joshua Morin - On the run [DEMO]\"
+
+ File "..\Songs\Joshua Morin - On the run [DEMO]\License.txt"
+ File "..\Songs\Joshua Morin - On the run [DEMO]\Joshua Morin - On the run.txt"
+ File "..\Songs\Joshua Morin - On the run [DEMO]\Joshua Morin - On the run [BG].jpg"
+ File "..\Songs\Joshua Morin - On the run [DEMO]\Joshua Morin - On the run [CO].jpg"
+ File "..\Songs\Joshua Morin - On the run [DEMO]\Joshua Morin - On the run.ogg"
+
+
+ SetOutPath "$INSTDIR" \ No newline at end of file
diff --git a/Installer/settings/optional/in_streetlight.nsh b/Installer/settings/optional/in_streetlight.nsh
new file mode 100644
index 00000000..1d8d147f
--- /dev/null
+++ b/Installer/settings/optional/in_streetlight.nsh
@@ -0,0 +1,100 @@
+
+ CreateDirectory "$INSTDIR\Skins\Streetlight"
+
+ SetOutPath "$INSTDIR\Skins\Streetlight"
+
+ File "..\Skins\Streetlight\[bg-load].jpg"
+ File "..\Skins\Streetlight\[button]13.jpg"
+ File "..\Skins\Streetlight\[button]alt.jpg"
+ File "..\Skins\Streetlight\[button]az.jpg"
+ File "..\Skins\Streetlight\[button]enter.jpg"
+ File "..\Skins\Streetlight\[button]esc.jpg"
+ File "..\Skins\Streetlight\[button]j.jpg"
+ File "..\Skins\Streetlight\[button]m.jpg"
+ File "..\Skins\Streetlight\[button]navi.jpg"
+ File "..\Skins\Streetlight\[button]p.jpg"
+ File "..\Skins\Streetlight\[effect]goldenNoteStar.jpg"
+ File "..\Skins\Streetlight\[effect]perfectNoteStar.jpg"
+ File "..\Skins\Streetlight\[helper]buttonFade.jpg"
+ File "..\Skins\Streetlight\[helper]rectangle.jpg"
+ File "..\Skins\Streetlight\[icon]cd.jpg"
+ File "..\Skins\Streetlight\[icon]error.jpg"
+ File "..\Skins\Streetlight\[icon]main.jpg"
+ File "..\Skins\Streetlight\[icon]options.jpg"
+ File "..\Skins\Streetlight\[icon]party.jpg"
+ File "..\Skins\Streetlight\[icon]question.jpg"
+ File "..\Skins\Streetlight\[icon]score.jpg"
+ File "..\Skins\Streetlight\[icon]search.jpg"
+ File "..\Skins\Streetlight\[icon]songmenu.jpg"
+ File "..\Skins\Streetlight\[icon]stats.jpg"
+ File "..\Skins\Streetlight\[icon]video.jpg"
+ File "..\Skins\Streetlight\[main]button.jpg"
+ File "..\Skins\Streetlight\[main]button2.jpg"
+ File "..\Skins\Streetlight\[main]buttonf.jpg"
+ File "..\Skins\Streetlight\[main]mainBar.jpg"
+ File "..\Skins\Streetlight\[main]playerNumberBox.jpg"
+ File "..\Skins\Streetlight\[main]selectbg.jpg"
+ File "..\Skins\Streetlight\[main]songCover.jpg"
+ File "..\Skins\Streetlight\[main]songSelection1.jpg"
+ File "..\Skins\Streetlight\[main]songSelection2.jpg"
+ File "..\Skins\Streetlight\[menu]jumpToBg.jpg"
+ File "..\Skins\Streetlight\[menu]PopUpBg.JPG"
+ File "..\Skins\Streetlight\[menu]PopUpFg.JPG"
+ File "..\Skins\Streetlight\[menu]songMenuBg.jpg"
+ File "..\Skins\Streetlight\[menu]songMenuSelectBg.jpg"
+ File "..\Skins\Streetlight\[party]Joker.jpg"
+ File "..\Skins\Streetlight\[party]playerButton.jpg"
+ File "..\Skins\Streetlight\[party]playerTeamButton.jpg"
+ File "..\Skins\Streetlight\[party]pointer.bmp"
+ File "..\Skins\Streetlight\[party]roundBG1.jpg"
+ File "..\Skins\Streetlight\[party]roundBG2.jpg"
+ File "..\Skins\Streetlight\[party]roundBG3.jpg"
+ File "..\Skins\Streetlight\[party]roundBG4.jpg"
+ File "..\Skins\Streetlight\[party]roundTeamButton.jpg"
+ File "..\Skins\Streetlight\[party]scoreBG1.jpg"
+ File "..\Skins\Streetlight\[party]scoreBG2.jpg"
+ File "..\Skins\Streetlight\[party]scoreDecoration.jpg"
+ File "..\Skins\Streetlight\[party]teamPoints.jpg"
+ File "..\Skins\Streetlight\[party]winDecoration1.jpg"
+ File "..\Skins\Streetlight\[party]winTeamButton1.jpg"
+ File "..\Skins\Streetlight\[party]winTeamButton2.jpg"
+ File "..\Skins\Streetlight\[party]winTeamButton3.jpg"
+ File "..\Skins\Streetlight\[score]box.jpg"
+ File "..\Skins\Streetlight\[score]endcap.jpg"
+ File "..\Skins\Streetlight\[score]level.jpg"
+ File "..\Skins\Streetlight\[score]levelRound.jpg"
+ File "..\Skins\Streetlight\[score]Line.jpg"
+ File "..\Skins\Streetlight\[sing]lineBonusPopUp.jpg"
+ File "..\Skins\Streetlight\[sing]LyricsBall.bmp"
+ File "..\Skins\Streetlight\[sing]lyricsHelpBar.bmp"
+ File "..\Skins\Streetlight\[sing]notesBgLeft.bmp"
+ File "..\Skins\Streetlight\[sing]notesBgMid.bmp"
+ File "..\Skins\Streetlight\[sing]notesBgRight.bmp"
+ File "..\Skins\Streetlight\[sing]notesLeft.bmp"
+ File "..\Skins\Streetlight\[sing]notesMid.bmp"
+ File "..\Skins\Streetlight\[sing]notesRight.bmp"
+ File "..\Skins\Streetlight\[sing]p.jpg"
+ File "..\Skins\Streetlight\[sing]scoreBg.jpg"
+ File "..\Skins\Streetlight\[sing]singBarBack.jpg"
+ File "..\Skins\Streetlight\[sing]singBarBar.jpg"
+ File "..\Skins\Streetlight\[sing]singBarFront.jpg"
+ File "..\Skins\Streetlight\[sing]textBar.jpg"
+ File "..\Skins\Streetlight\[sing]timeBar.jpg"
+ File "..\Skins\Streetlight\[sing]timeBarBG.jpg"
+ File "..\Skins\Streetlight\[special]bar1.jpg"
+ File "..\Skins\Streetlight\[special]bar2.jpg"
+ File "..\Skins\Streetlight\[stat]detailBG1.jpg"
+ File "..\Skins\Streetlight\[stat]mainBG1.jpg"
+ File "..\Skins\Streetlight\[stat]mainBG2.jpg"
+ File "..\Skins\Streetlight\[stat]mainBG3.jpg"
+ File "..\Skins\Streetlight\bg-main.jpg"
+ File "..\Skins\Streetlight\bg-song.jpg"
+ File "..\Skins\Streetlight\Streetlight lite.ini"
+ File "..\Skins\Streetlight\Streetlight.ini"
+
+ SetOutPath "$INSTDIR\Themes"
+
+ File "..\Themes\Streetlight lite.ini"
+ File "..\Themes\Streetlight.ini"
+
+ SetOutPath "$INSTDIR" \ No newline at end of file
diff --git a/Installer/settings/optional/in_vistar.nsh b/Installer/settings/optional/in_vistar.nsh
new file mode 100644
index 00000000..47f9f371
--- /dev/null
+++ b/Installer/settings/optional/in_vistar.nsh
@@ -0,0 +1,102 @@
+
+ CreateDirectory "$INSTDIR\Skins\Vistar"
+
+ SetOutPath "$INSTDIR\Skins\Vistar"
+
+ File "..\Skins\Vistar\[button]13.jpg"
+ File "..\Skins\Vistar\[button]alt.jpg"
+ File "..\Skins\Vistar\[button]az.jpg"
+ File "..\Skins\Vistar\[button]enter.jpg"
+ File "..\Skins\Vistar\[button]esc.jpg"
+ File "..\Skins\Vistar\[button]j.jpg"
+ File "..\Skins\Vistar\[button]m.jpg"
+ File "..\Skins\Vistar\[button]navi.jpg"
+ File "..\Skins\Vistar\[button]p.jpg"
+ File "..\Skins\Vistar\[effect]goldenNoteStar.jpg"
+ File "..\Skins\Vistar\[effect]perfectNoteStar.jpg"
+ File "..\Skins\Vistar\[helper]rectangle.jpg"
+ File "..\Skins\Vistar\[icon]cd.jpg"
+ File "..\Skins\Vistar\[icon]error.jpg"
+ File "..\Skins\Vistar\[icon]main.jpg"
+ File "..\Skins\Vistar\[icon]options.jpg"
+ File "..\Skins\Vistar\[icon]party.jpg"
+ File "..\Skins\Vistar\[icon]question.jpg"
+ File "..\Skins\Vistar\[icon]score.jpg"
+ File "..\Skins\Vistar\[icon]search.jpg"
+ File "..\Skins\Vistar\[icon]songmenu.jpg"
+ File "..\Skins\Vistar\[icon]stats.jpg"
+ File "..\Skins\Vistar\[icon]video.jpg"
+ File "..\Skins\Vistar\[main]button.jpg"
+ File "..\Skins\Vistar\[main]buttonf.jpg"
+ File "..\Skins\Vistar\[main]mainBar.jpg"
+ File "..\Skins\Vistar\[main]playerNumberBox.jpg"
+ File "..\Skins\Vistar\[main]selectbg.jpg"
+ File "..\Skins\Vistar\[main]songCover.jpg"
+ File "..\Skins\Vistar\[main]songSelection2.jpg"
+ File "..\Skins\Vistar\[mainbutton]Exit.jpg"
+ File "..\Skins\Vistar\[mainbutton]Multi.jpg"
+ File "..\Skins\Vistar\[mainbutton]Options.jpg"
+ File "..\Skins\Vistar\[mainbutton]Solo.jpg"
+ File "..\Skins\Vistar\[mainbutton]Stats.jpg"
+ File "..\Skins\Vistar\[menu]jumpToBg.jpg"
+ File "..\Skins\Vistar\[menu]PopUpBg.JPG"
+ File "..\Skins\Vistar\[menu]PopUpFg.JPG"
+ File "..\Skins\Vistar\[menu]songMenuBg.jpg"
+ File "..\Skins\Vistar\[menu]songMenuSelectBg.jpg"
+ File "..\Skins\Vistar\[party]Joker.jpg"
+ File "..\Skins\Vistar\[party]playerButton.jpg"
+ File "..\Skins\Vistar\[party]playerTeamButton.jpg"
+ File "..\Skins\Vistar\[party]pointer.bmp"
+ File "..\Skins\Vistar\[party]roundBG1.jpg"
+ File "..\Skins\Vistar\[party]roundBG2.jpg"
+ File "..\Skins\Vistar\[party]roundBG3.jpg"
+ File "..\Skins\Vistar\[party]roundBG4.jpg"
+ File "..\Skins\Vistar\[party]roundTeamButton.jpg"
+ File "..\Skins\Vistar\[party]scoreBG1.jpg"
+ File "..\Skins\Vistar\[party]scoreBG2.jpg"
+ File "..\Skins\Vistar\[party]scoreDecoration.jpg"
+ File "..\Skins\Vistar\[party]teamPoints.jpg"
+ File "..\Skins\Vistar\[party]winDecoration1.jpg"
+ File "..\Skins\Vistar\[party]winTeamButton1.jpg"
+ File "..\Skins\Vistar\[party]winTeamButton2.jpg"
+ File "..\Skins\Vistar\[party]winTeamButton3.jpg"
+ File "..\Skins\Vistar\[score]box.jpg"
+ File "..\Skins\Vistar\[score]endcap.jpg"
+ File "..\Skins\Vistar\[score]level.jpg"
+ File "..\Skins\Vistar\[score]levelRound.jpg"
+ File "..\Skins\Vistar\[score]Line.jpg"
+ File "..\Skins\Vistar\[sing]lineBonusPopUp.jpg"
+ File "..\Skins\Vistar\[sing]LyricsBall.bmp"
+ File "..\Skins\Vistar\[sing]lyricsHelpBar.bmp"
+ File "..\Skins\Vistar\[sing]notesBgLeft.bmp"
+ File "..\Skins\Vistar\[sing]notesBgMid.bmp"
+ File "..\Skins\Vistar\[sing]notesBgRight.bmp"
+ File "..\Skins\Vistar\[sing]notesLeft.bmp"
+ File "..\Skins\Vistar\[sing]notesMid.bmp"
+ File "..\Skins\Vistar\[sing]notesRight.bmp"
+ File "..\Skins\Vistar\[sing]p.jpg"
+ File "..\Skins\Vistar\[sing]scoreBg.jpg"
+ File "..\Skins\Vistar\[sing]singBarBack.jpg"
+ File "..\Skins\Vistar\[sing]singBarBar.jpg"
+ File "..\Skins\Vistar\[sing]singBarFront.jpg"
+ File "..\Skins\Vistar\[sing]textBar.jpg"
+ File "..\Skins\Vistar\[sing]timeBar.jpg"
+ File "..\Skins\Vistar\[sing]timeBar1.jpg"
+ File "..\Skins\Vistar\[sing]timeBarBG.jpg"
+ File "..\Skins\Vistar\[stat]detailBG1.jpg"
+ File "..\Skins\Vistar\[stat]mainBG1.jpg"
+ File "..\Skins\Vistar\[stat]mainBG2.jpg"
+ File "..\Skins\Vistar\[stat]mainBG3.jpg"
+ File "..\Skins\Vistar\bg-lite.jpg"
+ File "..\Skins\Vistar\bg-load.jpg"
+ File "..\Skins\Vistar\bg-main.jpg"
+ File "..\Skins\Vistar\bg-score.jpg"
+ File "..\Skins\Vistar\bg-song.jpg"
+ File "..\Skins\Vistar\main-buttons.jpg"
+ File "..\Skins\Vistar\Vistar.ini"
+
+ SetOutPath "$INSTDIR\Themes"
+
+ File "..\Themes\Vistar.ini"
+
+ SetOutPath "$INSTDIR" \ No newline at end of file
diff --git a/Installer/settings/optional/opt_uninstall.nsh b/Installer/settings/optional/opt_uninstall.nsh
new file mode 100644
index 00000000..cb0de81b
--- /dev/null
+++ b/Installer/settings/optional/opt_uninstall.nsh
@@ -0,0 +1,292 @@
+; Uninstall all optional Themes
+
+ Delete "$INSTDIR\Skins\Orange\[bg-load].jpg"
+ Delete "$INSTDIR\Skins\Orange\[button]13.jpg"
+ Delete "$INSTDIR\Skins\Orange\[button]alt.jpg"
+ Delete "$INSTDIR\Skins\Orange\[button]az.jpg"
+ Delete "$INSTDIR\Skins\Orange\[button]enter.jpg"
+ Delete "$INSTDIR\Skins\Orange\[button]esc.jpg"
+ Delete "$INSTDIR\Skins\Orange\[button]j.jpg"
+ Delete "$INSTDIR\Skins\Orange\[button]m.jpg"
+ Delete "$INSTDIR\Skins\Orange\[button]navi.jpg"
+ Delete "$INSTDIR\Skins\Orange\[button]p.jpg"
+ Delete "$INSTDIR\Skins\Orange\[effect]goldenNoteStar.jpg"
+ Delete "$INSTDIR\Skins\Orange\[effect]perfectNoteStar.jpg"
+ Delete "$INSTDIR\Skins\Orange\[helper]buttonFade.jpg"
+ Delete "$INSTDIR\Skins\Orange\[helper]rectangle.jpg"
+ Delete "$INSTDIR\Skins\Orange\[icon]cd.jpg"
+ Delete "$INSTDIR\Skins\Orange\[icon]error.jpg"
+ Delete "$INSTDIR\Skins\Orange\[icon]main.jpg"
+ Delete "$INSTDIR\Skins\Orange\[icon]options.jpg"
+ Delete "$INSTDIR\Skins\Orange\[icon]party.jpg"
+ Delete "$INSTDIR\Skins\Orange\[icon]question.jpg"
+ Delete "$INSTDIR\Skins\Orange\[icon]score.jpg"
+ Delete "$INSTDIR\Skins\Orange\[icon]search.jpg"
+ Delete "$INSTDIR\Skins\Orange\[icon]songmenu.jpg"
+ Delete "$INSTDIR\Skins\Orange\[icon]stats.jpg"
+ Delete "$INSTDIR\Skins\Orange\[icon]video.jpg"
+ Delete "$INSTDIR\Skins\Orange\[main]button.jpg"
+ Delete "$INSTDIR\Skins\Orange\[main]button2.jpg"
+ Delete "$INSTDIR\Skins\Orange\[main]button3.jpg"
+ Delete "$INSTDIR\Skins\Orange\[main]buttonf.jpg"
+ Delete "$INSTDIR\Skins\Orange\[main]button-m-1.jpg"
+ Delete "$INSTDIR\Skins\Orange\[main]button-m-2.jpg"
+ Delete "$INSTDIR\Skins\Orange\[main]button-m-3.jpg"
+ Delete "$INSTDIR\Skins\Orange\[main]button-m-4.jpg"
+ Delete "$INSTDIR\Skins\Orange\[main]mainBar.jpg"
+ Delete "$INSTDIR\Skins\Orange\[main]playerNumberBox.jpg"
+ Delete "$INSTDIR\Skins\Orange\[main]selectbg.jpg"
+ Delete "$INSTDIR\Skins\Orange\[main]songCover.jpg"
+ Delete "$INSTDIR\Skins\Orange\[main]songSelection1.jpg"
+ Delete "$INSTDIR\Skins\Orange\[main]songSelection2.jpg"
+ Delete "$INSTDIR\Skins\Orange\[menu]jumpToBg.jpg"
+ Delete "$INSTDIR\Skins\Orange\[menu]PopUpBg.JPG"
+ Delete "$INSTDIR\Skins\Orange\[menu]PopUpFg.JPG"
+ Delete "$INSTDIR\Skins\Orange\[menu]songMenuBg.jpg"
+ Delete "$INSTDIR\Skins\Orange\[menu]songMenuSelectBg.jpg"
+ Delete "$INSTDIR\Skins\Orange\[party]Joker.jpg"
+ Delete "$INSTDIR\Skins\Orange\[party]playerButton.jpg"
+ Delete "$INSTDIR\Skins\Orange\[party]playerTeamButton.jpg"
+ Delete "$INSTDIR\Skins\Orange\[party]pointer.bmp"
+ Delete "$INSTDIR\Skins\Orange\[party]roundBG1.jpg"
+ Delete "$INSTDIR\Skins\Orange\[party]roundBG2.jpg"
+ Delete "$INSTDIR\Skins\Orange\[party]roundBG3.jpg"
+ Delete "$INSTDIR\Skins\Orange\[party]roundBG4.jpg"
+ Delete "$INSTDIR\Skins\Orange\[party]roundTeamButton.jpg"
+ Delete "$INSTDIR\Skins\Orange\[party]scoreBG1.jpg"
+ Delete "$INSTDIR\Skins\Orange\[party]scoreBG2.jpg"
+ Delete "$INSTDIR\Skins\Orange\[party]scoreDecoration.jpg"
+ Delete "$INSTDIR\Skins\Orange\[party]teamPoints.jpg"
+ Delete "$INSTDIR\Skins\Orange\[party]winDecoration1.jpg"
+ Delete "$INSTDIR\Skins\Orange\[party]winTeamButton1.jpg"
+ Delete "$INSTDIR\Skins\Orange\[party]winTeamButton2.jpg"
+ Delete "$INSTDIR\Skins\Orange\[party]winTeamButton3.jpg"
+ Delete "$INSTDIR\Skins\Orange\[score]box.jpg"
+ Delete "$INSTDIR\Skins\Orange\[score]endcap.jpg"
+ Delete "$INSTDIR\Skins\Orange\[score]level.jpg"
+ Delete "$INSTDIR\Skins\Orange\[score]levelRound.jpg"
+ Delete "$INSTDIR\Skins\Orange\[score]Line.jpg"
+ Delete "$INSTDIR\Skins\Orange\[sing]lineBonusPopUp.jpg"
+ Delete "$INSTDIR\Skins\Orange\[sing]LyricsBall.bmp"
+ Delete "$INSTDIR\Skins\Orange\[sing]lyricsHelpBar.bmp"
+ Delete "$INSTDIR\Skins\Orange\[sing]notesBgLeft.bmp"
+ Delete "$INSTDIR\Skins\Orange\[sing]notesBgMid.bmp"
+ Delete "$INSTDIR\Skins\Orange\[sing]notesBgRight.bmp"
+ Delete "$INSTDIR\Skins\Orange\[sing]notesLeft.bmp"
+ Delete "$INSTDIR\Skins\Orange\[sing]notesMid.bmp"
+ Delete "$INSTDIR\Skins\Orange\[sing]notesRight.bmp"
+ Delete "$INSTDIR\Skins\Orange\[sing]p.jpg"
+ Delete "$INSTDIR\Skins\Orange\[sing]scoreBg.jpg"
+ Delete "$INSTDIR\Skins\Orange\[sing]singBarBack.jpg"
+ Delete "$INSTDIR\Skins\Orange\[sing]singBarBar.jpg"
+ Delete "$INSTDIR\Skins\Orange\[sing]singBarFront.jpg"
+ Delete "$INSTDIR\Skins\Orange\[sing]textBar.jpg"
+ Delete "$INSTDIR\Skins\Orange\[sing]timeBar.jpg"
+ Delete "$INSTDIR\Skins\Orange\[sing]timeBarBG.jpg"
+ Delete "$INSTDIR\Skins\Orange\[special]bar1.jpg"
+ Delete "$INSTDIR\Skins\Orange\[special]bar2.jpg"
+ Delete "$INSTDIR\Skins\Orange\[stat]detailBG1.jpg"
+ Delete "$INSTDIR\Skins\Orange\[stat]mainBG1.jpg"
+ Delete "$INSTDIR\Skins\Orange\[stat]mainBG2.jpg"
+ Delete "$INSTDIR\Skins\Orange\[stat]mainBG3.jpg"
+ Delete "$INSTDIR\Skins\Orange\bg-main.jpg"
+ Delete "$INSTDIR\Skins\Orange\bg-song.jpg"
+ Delete "$INSTDIR\Skins\Orange\Orange.ini"
+
+ Delete "$INSTDIR\Themes\Orange.ini"
+
+
+ Delete "$INSTDIR\Skins\Streetlight\[bg-load].jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[button]13.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[button]alt.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[button]az.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[button]enter.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[button]esc.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[button]j.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[button]m.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[button]navi.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[button]p.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[effect]goldenNoteStar.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[effect]perfectNoteStar.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[helper]buttonFade.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[helper]rectangle.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[icon]cd.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[icon]error.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[icon]main.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[icon]options.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[icon]party.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[icon]question.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[icon]score.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[icon]search.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[icon]songmenu.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[icon]stats.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[icon]video.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[main]button.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[main]button2.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[main]buttonf.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[main]mainBar.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[main]playerNumberBox.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[main]selectbg.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[main]songCover.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[main]songSelection1.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[main]songSelection2.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[menu]jumpToBg.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[menu]PopUpBg.JPG"
+ Delete "$INSTDIR\Skins\Streetlight\[menu]PopUpFg.JPG"
+ Delete "$INSTDIR\Skins\Streetlight\[menu]songMenuBg.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[menu]songMenuSelectBg.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[party]Joker.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[party]playerButton.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[party]playerTeamButton.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[party]pointer.bmp"
+ Delete "$INSTDIR\Skins\Streetlight\[party]roundBG1.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[party]roundBG2.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[party]roundBG3.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[party]roundBG4.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[party]roundTeamButton.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[party]scoreBG1.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[party]scoreBG2.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[party]scoreDecoration.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[party]teamPoints.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[party]winDecoration1.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[party]winTeamButton1.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[party]winTeamButton2.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[party]winTeamButton3.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[score]box.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[score]endcap.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[score]level.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[score]levelRound.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[score]Line.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[sing]lineBonusPopUp.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[sing]LyricsBall.bmp"
+ Delete "$INSTDIR\Skins\Streetlight\[sing]lyricsHelpBar.bmp"
+ Delete "$INSTDIR\Skins\Streetlight\[sing]notesBgLeft.bmp"
+ Delete "$INSTDIR\Skins\Streetlight\[sing]notesBgMid.bmp"
+ Delete "$INSTDIR\Skins\Streetlight\[sing]notesBgRight.bmp"
+ Delete "$INSTDIR\Skins\Streetlight\[sing]notesLeft.bmp"
+ Delete "$INSTDIR\Skins\Streetlight\[sing]notesMid.bmp"
+ Delete "$INSTDIR\Skins\Streetlight\[sing]notesRight.bmp"
+ Delete "$INSTDIR\Skins\Streetlight\[sing]p.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[sing]scoreBg.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[sing]singBarBack.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[sing]singBarBar.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[sing]singBarFront.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[sing]textBar.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[sing]timeBar.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[sing]timeBarBG.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[special]bar1.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[special]bar2.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[stat]detailBG1.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[stat]mainBG1.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[stat]mainBG2.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\[stat]mainBG3.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\bg-main.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\bg-song.jpg"
+ Delete "$INSTDIR\Skins\Streetlight\Streetlight lite.ini"
+ Delete "$INSTDIR\Skins\Streetlight\Streetlight.ini"
+
+ Delete "$INSTDIR\Themes\Streetlight lite.ini"
+ Delete "$INSTDIR\Themes\Streetlight.ini"
+
+ Delete "$INSTDIR\Skins\Vistar\[button]13.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[button]alt.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[button]az.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[button]enter.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[button]esc.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[button]j.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[button]m.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[button]navi.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[button]p.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[effect]goldenNoteStar.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[effect]perfectNoteStar.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[helper]rectangle.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[icon]cd.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[icon]error.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[icon]main.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[icon]options.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[icon]party.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[icon]question.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[icon]score.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[icon]search.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[icon]songmenu.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[icon]stats.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[icon]video.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[main]button.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[main]buttonf.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[main]mainBar.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[main]playerNumberBox.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[main]selectbg.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[main]songCover.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[main]songSelection2.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[mainbutton]Exit.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[mainbutton]Multi.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[mainbutton]Options.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[mainbutton]Solo.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[mainbutton]Stats.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[menu]jumpToBg.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[menu]PopUpBg.JPG"
+ Delete "$INSTDIR\Skins\Vistar\[menu]PopUpFg.JPG"
+ Delete "$INSTDIR\Skins\Vistar\[menu]songMenuBg.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[menu]songMenuSelectBg.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[party]Joker.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[party]playerButton.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[party]playerTeamButton.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[party]pointer.bmp"
+ Delete "$INSTDIR\Skins\Vistar\[party]roundBG1.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[party]roundBG2.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[party]roundBG3.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[party]roundBG4.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[party]roundTeamButton.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[party]scoreBG1.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[party]scoreBG2.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[party]scoreDecoration.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[party]teamPoints.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[party]winDecoration1.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[party]winTeamButton1.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[party]winTeamButton2.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[party]winTeamButton3.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[score]box.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[score]endcap.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[score]level.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[score]levelRound.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[score]Line.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[sing]lineBonusPopUp.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[sing]LyricsBall.bmp"
+ Delete "$INSTDIR\Skins\Vistar\[sing]lyricsHelpBar.bmp"
+ Delete "$INSTDIR\Skins\Vistar\[sing]notesBgLeft.bmp"
+ Delete "$INSTDIR\Skins\Vistar\[sing]notesBgMid.bmp"
+ Delete "$INSTDIR\Skins\Vistar\[sing]notesBgRight.bmp"
+ Delete "$INSTDIR\Skins\Vistar\[sing]notesLeft.bmp"
+ Delete "$INSTDIR\Skins\Vistar\[sing]notesMid.bmp"
+ Delete "$INSTDIR\Skins\Vistar\[sing]notesRight.bmp"
+ Delete "$INSTDIR\Skins\Vistar\[sing]p.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[sing]scoreBg.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[sing]singBarBack.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[sing]singBarBar.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[sing]singBarFront.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[sing]textBar.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[sing]timeBar.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[sing]timeBar1.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[sing]timeBarBG.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[stat]detailBG1.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[stat]mainBG1.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[stat]mainBG2.jpg"
+ Delete "$INSTDIR\Skins\Vistar\[stat]mainBG3.jpg"
+ Delete "$INSTDIR\Skins\Vistar\bg-lite.jpg"
+ Delete "$INSTDIR\Skins\Vistar\bg-load.jpg"
+ Delete "$INSTDIR\Skins\Vistar\bg-main.jpg"
+ Delete "$INSTDIR\Skins\Vistar\bg-score.jpg"
+ Delete "$INSTDIR\Skins\Vistar\bg-song.jpg"
+ Delete "$INSTDIR\Skins\Vistar\main-buttons.jpg"
+ Delete "$INSTDIR\Skins\Vistar\Vistar.ini"
+
+ Delete "$INSTDIR\Themes\Vistar.ini"
+
+ StrCpy $0 "$INSTDIR\Skins\Orange"
+ Call un.DeleteIfEmpty
+
+ StrCpy $0 "$INSTDIR\Skins\Streetlight"
+ Call un.DeleteIfEmpty
+
+ StrCpy $0 "$INSTDIR\Skins\Vistar"
+ Call un.DeleteIfEmpty \ No newline at end of file
diff --git a/Installer/settings/settings-1031.ini b/Installer/settings/settings-1031.ini
new file mode 100644
index 00000000..642f577e
--- /dev/null
+++ b/Installer/settings/settings-1031.ini
@@ -0,0 +1,131 @@
+[Settings]
+NumFields=16
+
+[Field 1]
+Type=Label
+Text="Vollbild Modus:"
+Left=0
+Right=53
+Top=27
+Bottom=35
+
+[Field 2]
+Type=Label
+Text="Sprache:"
+Left=0
+Right=53
+Top=51
+Bottom=59
+
+[Field 3]
+Type=Label
+Text="Auflösung:"
+Left=0
+Right=53
+Top=73
+Bottom=81
+
+[Field 4]
+Type=Label
+Text="Ordnerstruktur:"
+Left=0
+Right=53
+Top=97
+Bottom=105
+
+[Field 5]
+Type=Label
+Text="Animationen/Effekte:"
+Left=0
+Right=70
+Top=124
+Bottom=132
+
+[Field 6]
+Type=Droplist
+ListItems=On|Off
+Left=71
+Right=161
+Top=25
+Bottom=38
+
+[Field 7]
+Type=Droplist
+ListItems=Catalan|Croatian|Danish|Dutch|English|Euskara|French|German|Italian|Norwegian|Polish|Portuguese|Serbian|Slovak|Spanish|Swedish
+Left=71
+Right=161
+Top=48
+Bottom=62
+
+[Field 8]
+Type=Droplist
+ListItems=320x200|640x480|800x600|1024x768|1280x1024|1440x900|1680x1050|1920x1200
+Left=71
+Right=161
+Top=72
+Bottom=86
+
+[Field 9]
+Type=Droplist
+ListItems=On|Off
+Left=71
+Right=161
+Top=96
+Bottom=110
+
+[Field 10]
+Type=Droplist
+ListItems=On|Off
+Left=71
+Right=161
+Top=121
+Bottom=136
+
+[Field 11]
+Type=Label
+Text="Wähle aus, ob das Spiel im Fenster oder \r\nals Vollbild gestartet werden soll."
+Left=170
+Right=315
+Top=24
+Bottom=44
+
+[Field 12]
+Type=Label
+Text="Hier können einige Einstellungen für UltraStar Deluxe vorgenommen werden.\r\nAlle Einstellungen können später im Spielmenü geändert werden."
+Left=0
+Right=315
+Top=3
+Bottom=20
+
+[Field 13]
+Type=Label
+Text="Wähle deine favorisierte Sprache, in der UltraStar Deluxe angezeigt werden soll."
+Left=170
+Right=315
+Top=46
+Bottom=68
+
+[Field 14]
+Type=Label
+Text="Wähle deine, dem Monitor angepasste, bevorzugte Auflösung."
+Left=170
+Right=315
+Top=70
+Bottom=96
+
+[Field 15]
+Type=Label
+Text="Wähle aus, ob UltraStar Deluxe eine Ordnerstruktur zum Anzeigen der Lieder verwenden soll."
+Left=170
+Right=315
+Top=92
+Bottom=116
+
+[Field 16]
+Type=Label
+Text="Wähle, ob Spezialeffekte und \r\nAnimationen benutzt werden sollen."
+Left=170
+Right=315
+Top=121
+Bottom=137
+
diff --git a/Installer/settings/settings-1033.ini b/Installer/settings/settings-1033.ini
new file mode 100644
index 00000000..2a3dfdba
--- /dev/null
+++ b/Installer/settings/settings-1033.ini
@@ -0,0 +1,131 @@
+[Settings]
+NumFields=16
+
+[Field 1]
+Type=Label
+Text="Fullscreen Mode:"
+Left=0
+Right=50
+Top=27
+Bottom=35
+
+[Field 2]
+Type=Label
+Text="Language:"
+Left=0
+Right=50
+Top=51
+Bottom=59
+
+[Field 3]
+Type=Label
+Text="Resolution:"
+Left=0
+Right=50
+Top=73
+Bottom=81
+
+[Field 4]
+Type=Label
+Text="Tabs:"
+Left=0
+Right=50
+Top=100
+Bottom=108
+
+[Field 5]
+Type=Label
+Text="Animations/Effects:"
+Left=0
+Right=67
+Top=124
+Bottom=132
+
+[Field 6]
+Type=Droplist
+ListItems=On|Off
+Left=70
+Right=160
+Top=24
+Bottom=36
+
+[Field 7]
+Type=Droplist
+ListItems=Catalan|Croatian|Danish|Dutch|English|Euskara|French|German|Italian|Norwegian|Polish|Portuguese|Serbian|Slovak|Spanish|Swedish
+Left=70
+Right=160
+Top=48
+Bottom=60
+
+[Field 8]
+Type=Droplist
+ListItems=320x200|640x480|800x600|1024x768|1280x1024|1440x900|1680x1050|1920x1200
+Left=70
+Right=160
+Top=72
+Bottom=86
+
+[Field 9]
+Type=Droplist
+ListItems=On|Off
+Left=70
+Right=160
+Top=99
+Bottom=113
+
+[Field 10]
+Type=Droplist
+ListItems=On|Off
+Left=70
+Right=160
+Top=123
+Bottom=137
+
+[Field 11]
+Type=Label
+Text="Choose if you want to run UltraStar Deluxe in a window or fullscreen."
+Left=170
+Right=305
+Top=25
+Bottom=46
+
+[Field 12]
+Type=Label
+Text="Choose your favorite language, in that UltraStar Deluxe should be displayed."
+Left=170
+Right=305
+Top=48
+Bottom=70
+
+[Field 13]
+Type=Label
+Text="Choose your favorite screen resolution for UltraStar Deluxe adjusted to your display device."
+Left=170
+Right=305
+Top=72
+Bottom=97
+
+[Field 14]
+Type=Label
+Text="Choose whether you would like to view folders in UltraStar Deluxe or not."
+Left=170
+Right=305
+Top=99
+Bottom=122
+
+[Field 15]
+Type=Label
+Text="Here you can define some settings for UltraStar Deluxe. The settings can\r\nalso be changed in the GUI later."
+Left=0
+Right=289
+Top=3
+Bottom=20
+
+[Field 16]
+Type=Label
+Text="Choose if special effects or animations should be used by UltraStar Deluxe. Recommended: On"
+Left=170
+Right=305
+Top=123
+Bottom=139
+
diff --git a/Installer/settings/variables.nsh b/Installer/settings/variables.nsh
new file mode 100644
index 00000000..7f41776e
--- /dev/null
+++ b/Installer/settings/variables.nsh
@@ -0,0 +1,70 @@
+; These are the common used variables
+; for the USdx Installation Wizard
+
+!define version "1.0.1a" ; Current version of UltraStar Deluxe
+!define p_name "UltraStar Deluxe" ; Just the name of the program
+!define publisher "USDX Team" ; Publisher
+!define homepage "http://www.ultrastardeluxe.org/" ; Project Homepage
+!define forum "http://forum.ultrastardeluxe.org/" ; Forum Homepage
+
+!define exe "USdx" ; Current name of start exe (must also be defined in functions.nsh)
+
+!define demosong "http://ultrastardeluxe.xtremeweb-hosting.net/installer/songs/song.zip" ; URL from where the demo song "I18" will be downloaded
+!define demosong2 "http://ultrastardeluxe.xtremeweb-hosting.net/installer/songs/song2.zip" ; URL from where the demo song "Northern Star" will be downloaded
+
+; Theme URLs:
+
+!define dl_orange "http://ultrastardeluxe.xtremeweb-hosting.net/installer/themes/orange.zip"
+!define dl_vistar "http://ultrastardeluxe.xtremeweb-hosting.net/installer/themes/vistar.zip"
+!define dl_streetlight "http://ultrastardeluxe.xtremeweb-hosting.net/installer/themes/streetlight.zip"
+
+; Other Language Strings (except Section Language Strings)
+; can be found at .\langstrings.nsh
+
+!define eng_sec1_desc "These are the basic files needed by UltraStar Deluxe" ; English Description of Base components
+!define ger_sec1_desc "Dies sind die von UltraStar Deluxe benötigten Grunddateien" ; German Description of Base components
+
+!define eng_sec3_desc "You can choose which optional themes should also be installed." ; English Description of "Optional Themes"-Section
+!define ger_sec3_desc "Hier können optionale Motive zum Installieren gewählt werden." ; German Description of "Optional Themes"-Section
+
+!define eng_g2Section1_desc "Install the demo song 'Dead Smiling Pirates - I 18'." ; English Description of the Example Song "I 18"
+!define ger_g2Section1_desc "Installiert das freie Beispiellied 'Dead Smiling Pirates - I 18'." ; German Description of the Example Song "I 18"
+
+!define eng_g2Section2_desc "Install the demo song 'Steven Dunston - Northern Star'." ; English Description of the Example Song "Northern Star"
+!define ger_g2Section2_desc "Installiert das freie Beispiellied 'Steven Dunston - Northern Star'." ; German Description of the Example Song "Northern Star"
+
+!define eng_g2Section3_desc "Install the demo song 'Joshua Morin - On the run'." ; English Description of the Example Song "On the run"
+!define ger_g2Section3_desc "Installiert das freie Beispiellied 'Joshua Morin - On the run'."; German Description of the Example Song "On the run"
+
+!define eng_sec1 "Base components" ; English Name of the component section1
+!define ger_sec1 "Basiskomponenten" ; German Name of the component section1
+
+!define eng_sec2 "Demo Songs" ; English Name of the component section2
+!define ger_sec2 "Beispiellieder" ; German Name of the component section2
+
+!define eng_sec3 "Optional Themes" ; English Name of the component section group1
+!define ger_sec3 "Optionale Motive" ; German Name of the component section group1
+
+; Group Section Descriptions:
+
+!define eng_g1Sec1_desc "This will install the optional theme 'Orange' by Skar."
+!define ger_g1Sec1_desc "Dies installiert das optionale Motiv 'Orange' von Skar."
+
+!define eng_g1Sec2_desc "This will install the optional theme 'Streetlight' by Skar."
+!define ger_g1Sec2_desc "Dies installiert das optionale Motiv 'Streetlight' von Skar."
+
+!define eng_g1Sec3_desc "This will install the optional theme 'Vistar' by Skar."
+!define ger_g1Sec3_desc "Dies installiert das optionale Motiv 'Vistar' von Skar."
+
+; Skin:
+
+!define gdf_path "$WINDIR\gdf.dll" ; Path to gdf.dll for Vista Game Explorer
+!define bmp_header "..\InstallerDependencies\images\header.bmp" ; Bitmap of the Installation Header (Size: 150x57 px)
+!define bmp_side "..\InstallerDependencies\images\left.bmp" ; Bitmap on the left side of Welcome & Finish Page (Size: 164x314 px)
+!define mui_ini ".\settings\io.ini" ; Installation Options for Welcome & Finish Page
+!define license_bgcolor "FFFFFF" ; RGB Background Color for Licence agreement
+!define bmp_check "..\InstallerDependencies\images\modern.bmp" ; Bitmap of Checks at Components Selection Page
+!define directory_bgcolor "FFFFFF" ; RGB Background Color for Directory textbox
+!define smp_bgcolor "FFFFFF" ; RGB Background of Startmenu List and Textbox
+;!define dets_bgcolor "FFFFFF" ; Background Color of Details Screen while files are being extracted
+!define file_license "..\InstallerDependencies\documents\License.txt" ; Choose the file with the license agreement \ No newline at end of file
diff --git a/Installer/u3portable/7za.exe b/Installer/u3portable/7za.exe
new file mode 100644
index 00000000..bd30a516
--- /dev/null
+++ b/Installer/u3portable/7za.exe
Binary files differ
diff --git a/Installer/u3portable/Data/Ultrastar.db b/Installer/u3portable/Data/Ultrastar.db
new file mode 100644
index 00000000..27b27392
--- /dev/null
+++ b/Installer/u3portable/Data/Ultrastar.db
Binary files differ
diff --git a/Installer/u3portable/Data/config.ini b/Installer/u3portable/Data/config.ini
new file mode 100644
index 00000000..e69de29b
--- /dev/null
+++ b/Installer/u3portable/Data/config.ini
diff --git a/Installer/u3portable/Host/U3.lnk b/Installer/u3portable/Host/U3.lnk
new file mode 100644
index 00000000..45f0a494
--- /dev/null
+++ b/Installer/u3portable/Host/U3.lnk
Binary files differ
diff --git a/Installer/u3portable/Host/appstop.exe b/Installer/u3portable/Host/appstop.exe
new file mode 100644
index 00000000..7bb115f2
--- /dev/null
+++ b/Installer/u3portable/Host/appstop.exe
Binary files differ
diff --git a/Installer/u3portable/Host/start.bat b/Installer/u3portable/Host/start.bat
new file mode 100644
index 00000000..a50814d9
--- /dev/null
+++ b/Installer/u3portable/Host/start.bat
@@ -0,0 +1,21 @@
+@echo off
+
+SET FILE=%U3_DEVICE_PATH%\System\Apps\0B458BEB-A9BB-4E93-B48F-F1EBA58D05BD\Data\config.ini
+
+for /F "Tokens=*" %%i in (%FILE%) do Set Var=%%i
+
+type %FILE% | find "[Path]"
+if errorlevel 1 goto write
+if errorlevel 0 goto start
+
+:write
+
+ECHO. >> %FILE%
+ECHO [Path] >> %FILE%
+ECHO Songs=%U3_DEVICE_PATH%\System\Apps\0B458BEB-A9BB-4E93-B48F-F1EBA58D05BD\Data\Songs >> %FILE%
+
+goto start
+
+:start
+
+start U3.lnk
diff --git a/Installer/u3portable/License.txt b/Installer/u3portable/License.txt
new file mode 100644
index 00000000..f69d566a
--- /dev/null
+++ b/Installer/u3portable/License.txt
@@ -0,0 +1,549 @@
+7-Zip Command line version 4.42
+-------------------------------
+
+7-Zip is a file archiver with hig compression ratio.
+7za.exe is a standalone command line version if 7-Zip.
+
+7-Zip Copyright (C) 1999-2006 Igor Pavlov.
+
+Features of 7za.exe:
+ - Highest compression ratio in new 7z format
+ - 7z, ZIP, GZIP, BZIP2, Z and TAR formats support
+ - Highest compression ratio for ZIP and GZIP formats
+ - Fast compression and decompression
+ - Strong AES-256 encryption in 7z format
+
+This library is free software; you can redistribute it and/or
+modify it under the terms of the GNU Lesser General Public
+License as published by the Free Software Foundation; either
+version 2.1 of the License, or (at your option) any later version.
+
+This library is distributed in the hope that it will be useful,
+but WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+Lesser General Public License for more details.
+
+7-Zip is a free software. However, you can support
+development of 7-Zip by registering.
+For information about how to register 7-Zip visit page
+http://www.7-zip.org/register.html
+
+Source code of 7za.exe and 7-Zip can be found at
+http://www.7-zip.org/
+
+7za.exe can work in Windows 95/98/ME/NT/2000/XP/2003 and
+in Linux via Wine program.
+
+ This distrubutive packet contains the following files:
+
+ 7za.exe - 7-Zip standalone command line version.
+ readme.txt - This file.
+ license.txt - GNU LGPL.
+
+---
+End of document
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+ <one line to give the library's name and a brief idea of what it does.>
+ Copyright (C) <year> <name of author>
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ <signature of Ty Coon>, 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/Installer/u3portable/Manifest/USdx.ico b/Installer/u3portable/Manifest/USdx.ico
new file mode 100644
index 00000000..4c7d95df
--- /dev/null
+++ b/Installer/u3portable/Manifest/USdx.ico
Binary files differ
diff --git a/Installer/u3portable/Manifest/manifest.u3i b/Installer/u3portable/Manifest/manifest.u3i
new file mode 100644
index 00000000..fcbc3ffc
--- /dev/null
+++ b/Installer/u3portable/Manifest/manifest.u3i
@@ -0,0 +1,17 @@
+<u3manifest version="1.0">
+ <application uuid="0B458BEB-A9BB-4E93-B48F-F1EBA58D05BD" version="1.0.1">
+ <icon>USdx.ico</icon>
+ <name>UltraStar Deluxe Portable</name>
+ <vendor url="http://www.ultrastardeluxe.org">USdx Team</vendor>
+ <description>UltraStar Deluxe is a free open-source karaoke software for Windows that can be compared with Singstar.</description>
+ <options>
+ <minFreeSpace>7.0</minFreeSpace>
+ </options>
+ <i18n></i18n>
+ </application>
+ <actions>
+ <appStart cmd="%U3_HOST_EXEC_PATH%\start.bat"></appStart>
+ <appStop cmd="%U3_HOST_EXEC_PATH%\appstop.exe"> -t -s USdx</appStop>
+ <hostCleanUp cmd="%U3_HOST_EXEC_PATH%\appstop.exe"> -t -s USdx</hostCleanUp>
+ </actions>
+</u3manifest>
diff --git a/Installer/u3portable/Readme.txt b/Installer/u3portable/Readme.txt
new file mode 100644
index 00000000..22c01696
--- /dev/null
+++ b/Installer/u3portable/Readme.txt
@@ -0,0 +1,5 @@
+UltraStar Deluxe U3 Portable
+----------------------------
+
+This is the UltraStar Deluxe
+- U3 Portable Source. \ No newline at end of file
diff --git a/Installer/u3portable/copy.bat b/Installer/u3portable/copy.bat
new file mode 100644
index 00000000..608ea056
--- /dev/null
+++ b/Installer/u3portable/copy.bat
@@ -0,0 +1,20 @@
+@echo off
+
+cd ..\..\
+
+SET PATH=.\Installer\u3portable\Host
+
+xcopy .\Covers\*.* %PATH% /Y /T /E
+xcopy .\Languages\*.* %PATH% /Y /T /E
+xcopy .\Plugins\*.* %PATH% /Y /T /E
+xcopy .\Skins\*.* %PATH% /Y /T /E
+xcopy .\Sounds\*.* %PATH% /Y /T /E
+xcopy .\Themes\*.* %PATH% /Y /T /E
+xcopy .\Covers\*.* %PATH% /Y /T /E
+copy .\UltraStar.exe %PATH% /Y /T /E
+
+xcopy .\InstallerDependencies\dll\*.* %PATH% /Y /T /E
+
+cd .\Installer\u3portable\Host
+
+ren UltraStar.exe USdx.exe \ No newline at end of file
diff --git a/Installer/uninstall.ico b/Installer/uninstall.ico
new file mode 100644
index 00000000..1c72432a
--- /dev/null
+++ b/Installer/uninstall.ico
Binary files differ
diff --git a/Installer/ustar.ico b/Installer/ustar.ico
new file mode 100644
index 00000000..f3214d1a
--- /dev/null
+++ b/Installer/ustar.ico
Binary files differ
diff --git a/InstallerDependencies/dll/SDL.dll b/InstallerDependencies/dll/SDL.dll
new file mode 100644
index 00000000..a5da7bbd
--- /dev/null
+++ b/InstallerDependencies/dll/SDL.dll
Binary files differ
diff --git a/InstallerDependencies/dll/avcodec-51.dll b/InstallerDependencies/dll/avcodec-51.dll
new file mode 100644
index 00000000..c55ed9ec
--- /dev/null
+++ b/InstallerDependencies/dll/avcodec-51.dll
Binary files differ
diff --git a/InstallerDependencies/dll/avformat-50.dll b/InstallerDependencies/dll/avformat-50.dll
new file mode 100644
index 00000000..e35173dd
--- /dev/null
+++ b/InstallerDependencies/dll/avformat-50.dll
Binary files differ
diff --git a/InstallerDependencies/dll/avutil-49.dll b/InstallerDependencies/dll/avutil-49.dll
new file mode 100644
index 00000000..ff07b136
--- /dev/null
+++ b/InstallerDependencies/dll/avutil-49.dll
Binary files differ
diff --git a/InstallerDependencies/dll/bass.dll b/InstallerDependencies/dll/bass.dll
new file mode 100644
index 00000000..964d8996
--- /dev/null
+++ b/InstallerDependencies/dll/bass.dll
Binary files differ
diff --git a/InstallerDependencies/dll/sqlite3.dll b/InstallerDependencies/dll/sqlite3.dll
new file mode 100644
index 00000000..7111873f
--- /dev/null
+++ b/InstallerDependencies/dll/sqlite3.dll
Binary files differ
diff --git a/InstallerDependencies/documents/Changelog.german.txt b/InstallerDependencies/documents/Changelog.german.txt
new file mode 100644
index 00000000..bd7c1ccf
--- /dev/null
+++ b/InstallerDependencies/documents/Changelog.german.txt
@@ -0,0 +1,237 @@
+UltraStar Deluxe 1.01a
+-----------------------------
+Fix: VideoGap funktioniert wieder mit Mpeg Videos
+Fix: Video Start wird nun richtig berechnet wenn der Start-Tag benutzt wird
+Fix: Screenshot Funktion funktioniert nun wie sie sollte
+
+UltraStar Deluxe 1.01
+-----------------------------
+Upd: Neue SDL-Lib
+Upd: Neue Bass.dll
+Upd: Video support neu geschrieben (FFMpeg anstatt SMPeg)
+ ->Fast alle Videoformate werden nun unterstützt. Bessere Synchronisation der meisten Videos.
+Upd: Theme, Skin und Farbe können ohne Neustart geändert werden
+Upd: Einige Geschwindigkeitsverbesserungen
+Upd: Backspace ist nun identisch mit ESC bei den meisten Screens
+Upd: Editor: Singlenote-playback (SHIFT + Leertaste / STRG + SHIFT + Leertaste)
+Upd: Editor: Mehr Buchstaben funktionieren nun im Texteditmodus z.B. '~'
+Upd: Deluxe-Theme verschönert.
+ - Neue Texturen für die Leiste
+ - Neue Hintergründe für die Deluxe Skins
+ - Farbe ist nun im Deluxe-Theme änderbar \o/
+Upd: Executable Name zu USdx.exe geändert
+Upd: Neue Sounds für die Menüs
+Upd: 3 neue Skins von Skar/Alajasam hinzugefügt
+Upd: TeamDuell (ähnlich Gib das Mikro weiter) Modiplugin hinzugefügt
+
+Add: Installer verfügbar
+
+Fix: 4/6 Spieler: Richtige Punktzahlen werden auf dem Scorescreen angezeigt
+Fix: Doppeltes hinzufügen der Scores bei Screens=2
+Fix: Überlappen einiger Artistennamen mit den Songname sollte nun in den meisten Fällen gefixed sein.
+Fix: License- und Readme.txt Dateien tauchen nicht mehr in der error.log auf
+Fix: Einige Sounds, (hauptsächlich der Editor 'klick'-Sound) waren zu leise
+Fix: USdx sollte nun mit Girder funktionieren
+
+UltraStar Deluxe 1.00 (by Ultrastar Deluxe Team)
+-----------------------------
+
+--------------
+Theme System
+--------------
+Upd: Neues Skin/Theme System aus Ultrastar 0.5.1
+Upd: Laden von selbsterstellten Themes ermöglicht
+Upd: Covereigenschaften in Theme.ini ausgelagert (z.B. Position)
+Upd: Optionale Coverspiegelungen hinzugefügt
+Upd: Neue Coveranordnung (Bessereres Aussehen mit vielen Songs). (Kann im Theme an und ausgeschaltet werden)
+Upd: SongScreen Equalizer Objekt hinzugefügt
+Upd: Optionale Spiegelungen zu Buttons und Statics hinzugefügt. (Reflection = 1)
+Upd: Buttons können nun im Theme zu Gruppen zusammengefasst werden.z.B. Deluxe Theme Main Menu Tools Collection.
+Upd: Buttons könen vom Theme ausgeblendet werden. z.B. für den Exit Button, oder falls Hotkeys existieren.
+Upd: Texte können nun eine Länge (w= ..) erhalten. Sie werden dann bei der gegebenen Länge umgebrochen.
+
+--------------
+Aufnahme Optionen
+--------------
+Upd: Ultrastar 0.5.2 Recording Optionen hinzugefügt
+Fix: Soundcard Einträge wurden mehrmals in die Config.Ini eingetragen
+Fix: Mehr als ein Singstaradapter sind jetzt möglich(2 Soundkarten mit dem selben Namen)
+
+--------------
+Song Screen
+--------------
+Upd: Playlist Support hinzugefügt
+
+Upd: Song Suche (mit Interface)
+Upd: Jump to Letter Hotkey
+Upd: Songscreen Menu ähnlich wie bei Singstar
+Upd: Spielernamen können nun vor dem Singen geändert werden
+Upd: Song Vorschau Lautstärke kann nun geändert werden
+Upd: Song Vorschau kann eingefadet werden
+
+--------------
+Party Modus
+--------------
+Upd: Party Modus hinzugefügt:
+ 3 Teams mit bis zu 4 Spielern möglich
+ => insgesamt 12 Spieler
+Upd: Modi SDK: Party Modi können mit etwas Programmiererfahrung leicht erstellt werden.
+Upd: 4 Standard Party Modi Plugins: Duell, Hold the Line, Until 5000, Blind Mode
+
+--------------
+Effekte
+--------------
+Upd: Neue Perfect Note Effekte
+Upd: Effekt bei perfekt gesungenem Satz hinzugefügt
+Upd: Goldene Noten haben jetzt einen Singstar ähnlichen Glitzereffekt, und sind nicht mehr gelb.
+Upd: Neuer Effekt bei getroffenen Goldenen Noten
+Upd: Neuer Menü-Übergangs-Effekt: Screen verschwimmt und "fliegt aus dem Bild heraus". Neue Möglichkeiten für Theme-Ersteller
+
+--------------
+Sonstiges
+--------------
+Upd: Deluxe Theme hinzugefügt: Theme mit PS3 ähnlichem Aussehen
+Upd: Neues Score Speicherungssystem (basierend auf SQLite)
+Upd: Statistiken hinzugefügt. Generelle Statistiken und
+ Beste Scores, Beste Sänger, beliebteste Songs, beliebteste Bands
+Upd: Einige On Screen Fehler Benachrichtigungen hinzugefügt, die neuen Spielern helfen sollten.
+Upd: Neuer Erweiterter Options Screen hinzugefügt
+Upd: Abfrage vor dem Beenden hinzugefügt
+Upd: Song Hintergrundbilder können jetzt auch auf voller Bildschrimfläche dargestellt werden.
+Upd: Im Editor werden jetzt zusätzlich die richtigen Notennamen ausgegeben (C, F#, etc.)
+Upd: Neue Schriftarten
+Upd: Bessere Unterstützung für Kommandozeilen Parameter
+Fix: Nahezu keine Abstürze mehr wegen fehlerhaften TXT-Dateien.
+ In Game Popup hinzugefügt und einen Rücksprunk zum Songscreen.
+ Selbst der Partymodus wird nicht unterbrochen.
+Fix: Workaround für Cover und Hintergrund JPEG-Errors
+Fix: Videosize kann wieder geändert werden.
+Fix: Bug in LineBonus Popup behoben das zu Speicherüberläufen führen kann.
+Fix: Bug in SelectSlide behoben der zu Fehlern mit weniger als 3 optionen führen kann.
+ Automatisches Resizing hinzugefügt
+Fix: Backgrounds can be used now in option Screens, too
+Fix: Unnützer Speicherverbauch wenn ein Song mit Video abgespielt wird. Einige Videodaten blieben im Speicher nachdem der Song beendet wurde.
+ Dies könnte zu einem Out Of Memory Error führen wenn viele Songs mit Video gespielt werden.
+Fix: Einige Speichernutzungs und Ladezeit Updates
+Fix: Falsche Satzübergänge wenn T im Editor benutzt wurde und sich 2 Noten von verschiedenen
+ Sätzen überlagerten.
+Fix: Editor stürzte ab wenn die letzte Note eines Satzes gelöscht wurde.
+Fix: [Midi Converter]Noten wurden mehrmals hinzugefügt wenn eine Datei mehrmals geöffnet wurde
+ oder der Save Button mehrmals gedrückt wurde.
+Fix: [Midi Converter]Satzübergänge werden nun vom Mide Converter automatisch berechnet.
+
+UltraStar 0.5.0 ultra-star.dl.am Mod X-Mas Edition (by Mota und Whiteshark)
+-----------------------------
+Upd: Neue schnellerer und fehlerresistenter Headereinlesefunktion
+Upd: Bewertungs Bar (Singstar Like)
+Upd: PhrasenBonus + Popups
+
+Upd: Skin verschönert
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r10 (by Mota und Whiteshark)
+-----------------------------
+Fix: Ein kleiner Bug bei der Pause Funktion wurde gefixt.
+Fix: Ein Bug im Theme System wurde behoben. (SelectSlide konnte nicht weniger als 3 Einträge enthalten.)
+Fix: Skin, Beschränkung auf 4 Skins aufgehoben
+Fix: Noten Texturen werden anders/besser eingelesen
+
+Upd: Zahlen bei der Songauswahl sind jetzt sinnvoller.
+Upd: Anzahl der Songs die eine Kategorie beinhaltet wird in der Übersicht angezeigt
+Upd: Neuer Notenskin
+
+Upd: LanguageTag + Sortierung
+Upd: Unterstützung der Covers.ini aus 0.5.1 - Für alle Sortier-Funtionen. Die alte Möglichkeit ohne die Covers.ini ist weiterhin möglich, genauso wie eine Kombination beider Methoden.
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r9 (Release by Whiteshark)
+-----------------------------
+
+Upd: BPM und VideoGap Angaben mit Punkt werden jetzt auch eingelesen. Es wird aber in diesem Fall in der Error.log eine meldung mit dem Namen des Fehlerhaften Songs ausgegeben.
+Upd: Sollte beim Einlesen eines Songs(speziell beim Header) ein Fehler auftreten wird in der Error.log der Songname + Zeile ausgegeben.
+
+Upd, Beta: Pause. P drücken und der Song wird pausiert, nocheinmal P und es kann wieder gesungen werden. Noch keine Anzeige ob Pause aktiviert wird, und noch kein Pause Menü.
+
+bekannte Probleme:
+Stellt man die Aufnahme Funktion ein, kommt es zu einem extremen CPU-Zeit verbrauch und es fängt an zu Laggen
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r8b (Release by Whiteshark)
+-----------------------------
+Fix: Random Funktionen funktionieren alle ohne Fehler
+Fix: In der Kategorieauswahl wird jetzt beim Start immer die erste Kategorie angezeigt
+Fix: Musik wird nach Kategoriewechsel korrekt abgespielt
+Fix: Richtiger Text wird jetzt nicht mehr zu falscher Musik abgespielt
+Fix: Nach Beenden eines Songs ist dieser jetzt wieder in der Übersicht angewählt
+Fix: Midi-konvertor Bug behoben (Nur Freestyle Noten anstatt Normalen)
+
+Thx to: dennisthemenace und mota für die super Bug-Reports :P
+
+Upd: doomhammers Cover sind Integriert: thx to doomhammer
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r8a (Release by Whiteshark)
+-----------------------------
+Fix: Theme System konnte nicht ausgewählt werden (workaround: Nur bis zu 4 Themes möglich)
+Fix: Richtige Kategorie wird angezeigt nach Druck von Escape
+
+Upd: Neue Random Funktionen: R + [Strg]: Random in allen Kategorien (Hier wird die Kategorie oben noch falsch angezeigt); R + [Shift]: Zufällige Kategorie
+Upd: Gerade gewählte Kategorie wird oben links in der Ecke gezeigt
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r8 (Release by Whiteshark)
+-----------------------------
+Fix: Creatorbug behoben
+Fix: Wenn Tabs=on kam es manchmal vor das der angewählte Song nicht mit dem Angezeigten übereingestimmt hat
+
+Upd: Theme System komplett
+ -Bei Start nach Themes Suchen
+ -Den ThemeOptions Screen ändern
+Upd: Neue Farben für Themes :)
+Upd: kleine änderungen am Editor
+ -Leerzeichen im Header werden automatisch korrigiert
+ -Header ist nicht mehr Case Sensitive
+
+Upd: Skin Ordner gesäubert, Es gibt jetzt 2 Skins: Motas und der Original Skin
+Upd: Ordner haben ihr eigenes Cover, welches angezeigt wird falls kein spezielles Cover vorhanden ist
+Upd: Der BewertungsText (Ultrastar, Singstar, etc.) kann jetzt übersetzt werden
+
+Upd: Falls eine Sprache nicht komplett ist werden die nicht übersetzten Texte, mit der Englischen Sprachdatei übersetzt. (Falls es zu nicht kompletten Sprachdateien kommt)
+
+Upd: neues Kategorie System:
+ -Wenn eine Kategorie angewählt wird, werden nur die enthaltenden Songs angezeigt.
+ -Mit Escape gehts zurück in die Kategorie Auswahl
+ -Mit Hoch und Runter kann die Kategorie gewechselt werden.
+
+UltraStar 0.5.0 mota patch r7 (Release by Mota)
+-----------------------------
+- Neues Notendesign.
+- versch. Neue Grafiken.
+- Neue Bewertung "Ultrastar" ab 9810 Punkte.
+- Textgröße-Bug im Editor behoben.
+
+UltraStar 0.5.0 mota patch r6 - 17.11.06 (Release by Mota)
+----------------------------------------
+- Editiorfunktionen für Goldene/Freestyle-Noten. (Tasten [G] und [F])
+- Speicherfunktion des Editors angepasst.
+- Verändertes Theme "SingStar".
+
+UltraStar 0.5.0 mota patch r5 - 16.11.06 (Release by Mota)
+----------------------------------------
+- Goldene Noten werden dargestellt
+- Zufallsauswahl verbessert
+
+UltraStar 0.5.0 mota patch r4 (Release by Mota)
+-----------------------------
+- Perfekt-Stern animation
+
+UltraStar 0.5.0 mota patch r3 (Release by Mota)
+-----------------------------
+- Sortierung Title2 und Artist2 -> Zahlen in Ordner "#"
+
+UltraStar 0.5.0 mota patch r2 (Release by Mota)
+-----------------------------
+- Eigene Cover für alle Sortierungen
+
+UltraStar 0.5.0 mota patch (Release by Mota)
+--------------------------
+- Eigene Cover für Sortierung nach Edition.
+
+UltraStar 0.5.0 (by Corvus5)
+--------------------------
+- Original Code \ No newline at end of file
diff --git a/InstallerDependencies/documents/Changelog.txt b/InstallerDependencies/documents/Changelog.txt
new file mode 100644
index 00000000..733ab095
--- /dev/null
+++ b/InstallerDependencies/documents/Changelog.txt
@@ -0,0 +1,230 @@
+UltraStar Deluxe 1.01a
+-----------------------------
+Fix: VideoGap works now again with mpeg videos
+Fix: Video start is calculated correctly now if start tag is used
+Fix: Screenshot function works now as it should
+
+UltraStar Deluxe 1.01
+-----------------------------
+Upd: SDL-Lib update
+Upd: Bass update
+Upd: New video support (FFMpeg instead of SMPeg)
+ ->nearly all video formats are supported. Better synchronisation of most vids.
+Upd: On demand theme, skin and color changing
+Upd: Some speed improvements
+Upd: Backspace works now like ESC on most screens
+Upd: Editor: Singlenote-playback (SHIFT + Space / CTRL + SHIFT + Space)
+Upd: Editor: More characters work in text-edit-mode e.g. '~'
+Upd: Beautified Deluxe theme.
+ - New textures for the bar
+ - New backgrounds for the Deluxe skins
+ - Color is changeable in Deluxe theme now \o/
+Upd: Executable name changed to USdx.exe
+Upd: New menusounds
+Upd: Added 3 new skins by Skar/Alajasam
+Upd: Added TeamDuell modi-plugin
+
+Add: Installer available
+
+Fix: 4/6 Players: Scores are shown correctly on the scorescreen
+Fix: Double adding of Highscores if screens=2
+Fix: Overlapping of some artists names with songs should be fixed in most cases
+Fix: License and Readme files caused error messages in error.log
+Fix: Some sounds, (mainly the editors 'click' sound) were to quiet
+Fix: Should now work with Girder
+
+UltraStar Deluxe 1.00 (by Ultrastar Deluxe Team)
+-----------------------------
+
+--------------
+Theme System
+--------------
+Upd: New Ultrastar 0.5.1 Skin/Theme Sytem
+Upd: Add ability to 0.5.1 System to load third party Themes to add usability
+Upd: Add ability to change Positions and some other things relating to Covers within the Theme
+Upd: Add ability to add reflections to the Covers
+Upd: New Method for displaying Covers in a Circle. Looks better with many Songs. (Turn Off On within the Theme)
+Upd: Add Equalizer Object to SongScreen
+Upd: Add ability to add reflection to Buttons and Statics (Reflection = 1)
+Upd: Add ability to Group Buttons to a Buttonmenu, see Deluxe Theme Main Menu Tools Collection
+Upd: Add ability to Hide Buttons within Theme. Useful for example for Mainscreen Exit Button
+Upd: Add ability to give Texts a Width, so the Text breaks at the given Position.
+
+--------------
+Recording Options
+--------------
+Upd: Ultrastar 0.5.2 Recording Options added
+Fix: Write Soundcards more then one Time to Ini
+Fix: Use of more then one SingStar Mic. adapter now Possible(2 Soundcards with same Name Patch)
+
+--------------
+Song Screen
+--------------
+Upd: Added Playlist Support
+
+Upd: Song Search (with Screen interface)
+Upd: Jump to Letter Hotkey
+Upd: Menu in Songscreen similar to Singstars
+Upd: Ability to change Playernames before singing
+Upd: Ability to change Song Preview Volume
+Upd: Song Preview Fade in
+
+--------------
+Party Mode
+--------------
+Upd: Added Party Mode:
+ 3 Teams possible with up to 4 Players
+ => total of 12 Players
+Upd: Modi SDK: Possibility to create nearly any Modi with some Programming Skill
+Upd: 4 Custom Party Modi Plugins: Duell, Hold the Line, Until 5000, Blind Mode
+
+--------------
+Effects
+--------------
+Upd: New Perfect Note Effects
+Upd: Add Perfect Sentence Effect
+Upd: Golden Notes now with Singstar like Star Twinkle Effect, instead of just Yellow coloring
+Upd: Add Effect: Golden notes "Glow" when they are hit
+Upd: New Screen Fading Effect: Screen Blurs and "Flys" out of the Screen
+ looks better with every Background. More possibility for Theme Creators
+
+--------------
+Other
+--------------
+Upd: Added Deluxe Theme: Theme that has a look similiar to PS3 Singstar.
+Upd: New Score Saving System (SQLite Based)
+Upd: Statistic Screen with general Statistics and some Tables:
+ Best Scores, Best Singers, Most Popular Songs, Most Popular Bands
+Upd: Add some on Screen Error Messages helping new Peoples
+Upd: Add Advanced Screen with some new Options.
+Upd: Add a Question PopUp before exiting
+Upd: Add ability to scale Background Images in Singscreen to Fullsize
+Upd: Show real Note in Editor (C, F#, etc.)
+Upd: New fonts added
+Upd: Add better support for Command-Line Parameters
+Fix: No crashes caused by corrupted Textfiles anymore.
+ Added inGame Errormessage Popup and Jump Back to Songscreen. So even the Party Mode,
+ isn't interuppted.
+Fix: Workaround for Cover and BG JPG Errors
+Fix: Videosize can now be changed again
+Fix: Bug in LineBonus Popup that can end up in a Memory Overflow
+Fix: Bug in SelectSlide with less then 3 Options, No Overlapping anymore. Automatic resizing
+Fix: Backgrounds can be used now in option Screens, too
+Fix: useless Memory usement when Song with Video is Played. When a Song with Video is played
+ there was some Memory that was not freeed at the End of the Song. This could have caused
+ too much Memory usement when many Songs with Video are Played.
+Fix: Some Changes in Memory usement and better Loading speed.
+Fix: Wrong Timings pressing T in Editor if 2 Notes from different Sentences overlap
+Fix: Editor crashes when last note of a sentence is deleted
+Fix: [Midi Converter]Notes are added more than once when a File is opened twice or the save button is pressed multiple times.
+Fix: [Midi Converter]Sentence Timings are calculated automaticly when Midi File is converted
+
+UltraStar 0.5.0 ultra-star.dl.am Mod X-Mas Edition (by Mota und Whiteshark)
+-----------------------------
+Upd: New faster and Error resistant Header reader
+Upd: Bewertungs Bar (Singstar Like)
+Upd: LineBonus + Popups
+
+Upd: Skin beautified
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r10 (by Mota und Whiteshark)
+-----------------------------
+Fix: Minor Bug in Pause Method fixed.
+Fix: Fixed a Bug in Theme System
+Fix: New Note Texture Reading
+
+Upd: Numbers in SongSelection are now more meaningful
+Upd: Show Count of Songs in Category in Category Overview
+Upd: New Note Texture
+
+Upd: LanguageTag + Sorting
+Upd: Support for the Covers.ini from 0.5.1 - for all sorting options. The old behaviour without Covers.ini is also possible, just as well as a combination of both methods.
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r9 (Release by Whiteshark)
+-----------------------------
+
+Upd: BPM and VideoGap Can now be read, too. But there will be an Errormessage in Error.log
+
+Upd, Beta: Pause. Press P and the Song will be paused, press P again and it will be continued. Pause Display and Menu missing.
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r8b (Release by Whiteshark)
+-----------------------------
+Fix: Random Methods now work without Errors
+Fix: First Category is now shown at Startup.
+Fix: Music is played correctly after categorychange
+Fix: No wrong MP3 playing anymore
+Fix: After exit Singing Mode the Song is chossen in Song Screen
+Fix: Midi-konvertor Bug (Only Freestyle Notes instead of normal)
+
+Thx to: dennisthemenace and mota for Bug-Reports :P
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r8a (Release by Whiteshark)
+-----------------------------
+Fix: Themes could not be Selected (workaround: Only 4 Themes possible)
+Fix: Correct category is displayed after pressing Escape
+
+Upd: new Random functions: R + [Strg]: Random in all Categorys;
+ R + [Shift]: Random Category
+Upd: Chossen Category is displayed in the top left
+
+UltraStar 0.5.0 ultra-star.dl.am Mod r8 (Release by Whiteshark)
+-----------------------------
+Fix: Creatorbug fixed
+Fix: Tabs=on Preview Bug
+
+Upd: Theme System ready
+ -Look for Themes at Startup
+ -ThemeOptions Screen working
+Upd: New Theme Colors :)
+Upd: Little changes at Editor
+ -Spaces in Header are corrected automaticaly
+ -Header is not Case Sensitive anymore
+
+Upd: Skin Folder Cleaned up, There are 2 Skins now: Motas and the Original Skin
+Upd: Categorys have their own noCover Image
+Upd: Rating Text (Ultrastar, Singstar, etc.) can now be Translated
+
+Upd: Inomplete Languages are corrected with Entrys from the English Language File
+
+Upd: new Category System:
+ -If a category is choosen only the Songs from this category are shown
+ -Press Escape to leave a category
+ -Press up or down to change the category.
+
+UltraStar 0.5.0 mota patch r7 (Release by Mota)
+-----------------------------
+- New Note Texture.
+- other new grafics.
+- New rating "Ultrastar" with more than 9810 Points.
+- Textsize-Bug in editor fixed.
+
+UltraStar 0.5.0 mota patch r6 - 17.11.06 (Release by Mota)
+----------------------------------------
+- Editiorfunctions for Golden/Freestyle-Notes. (Press [G] or [F])
+- Saving Methods of Editor changed
+- Changed Theme "SingStar".
+
+UltraStar 0.5.0 mota patch r5 - 16.11.06 (Release by Mota)
+----------------------------------------
+- Goldene Notes are displayed
+- Randomizing improved
+
+UltraStar 0.5.0 mota patch r4 (Release by Mota)
+-----------------------------
+- Perfect-Star animation
+
+UltraStar 0.5.0 mota patch r3 (Release by Mota)
+-----------------------------
+- Sorting Title2 and Artist2 -> Numbers in Category "#"
+
+UltraStar 0.5.0 mota patch r2 (Release by Mota)
+-----------------------------
+- Cover for all Categorys and Sortings can be choosen
+
+UltraStar 0.5.0 mota patch (Release by Mota)
+--------------------------
+- Cover for Edition sorting can be choosen
+
+UltraStar 0.5.0 (by Corvus5)
+--------------------------
+- Original Code \ No newline at end of file
diff --git a/InstallerDependencies/documents/License.txt b/InstallerDependencies/documents/License.txt
new file mode 100644
index 00000000..4964fc70
--- /dev/null
+++ b/InstallerDependencies/documents/License.txt
@@ -0,0 +1,125 @@
+The GNU General Public License (GPL)
+Version 2, June 1991
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
+
+a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
+
+b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
+
+c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
+
+3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
+
+a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+
+b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+
+c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
+
+one line to give the program's name and a brief idea of what it does.
+Copyright (C)
+
+This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
+
+Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
+
+Yoyodyne, Inc., hereby disclaims all copyright interest
+in the program `Gnomovision' (which makes passes at compilers)
+written by James Hacker.
+
+signature of Ty Coon, 1 April 1989
+Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
diff --git a/InstallerDependencies/documents/ReadMe.txt b/InstallerDependencies/documents/ReadMe.txt
new file mode 100644
index 00000000..dcb9f3bc
--- /dev/null
+++ b/InstallerDependencies/documents/ReadMe.txt
@@ -0,0 +1,112 @@
+Ultrastar Deluxe 1.0.1a Readme.txt
+----------------------------
+1. Authors
+2. Release Notes
+3. Command-Line Parameters
+4. Controls
+5. License
+----------------------------
+
+SF.Net Page: http://sourceforge.net/projects/ultrastardx/
+
+This is just a little introduction, for more information open documentation.pdf
+
+----------------------------
+1. Authors
+----------------------------
+This game was introduced by Corvus5 who has written most of the code by himself.
+Basing on the official release 0.5.0 Mota and Whiteshark started to write little patches and modifications, and released this package named ultra-star.dl.am Mod.
+This modification was continued at Sourceforge.net by the Ultrastar Deluxe Team:
+ Blindy
+ Mog
+ Mota
+ Sawyer
+ Whiteshark
+And this piece of software is the Result!
+
+
+----------------------------
+2. Release Notes
+----------------------------
+- To change the path to the song directory add to config.ini:
+ [Path]
+ Songs=[SongFolder] (e.g. C:\Program Files\Ultrastar\Songs)
+
+- To take a screenshot press "PrintScreen" Key
+ Screenshots are saved in the directory "Screenshots".
+
+- To enable joypad support change config.ini:
+
+ [Controller]
+ Joypad=Off
+
+ to
+
+ [Controller]
+ Joypad=On
+
+
+- To Enable 4 to 6 Playermode 2 Screens are needed.
+ Disable the fullscreen mode, extend your desktop horizontaly, set the resolution to fill one
+ screen.
+ Add to Config.ini:
+ [Graphics]
+ Screens=2
+
+- Press Alt + F[1..12] in NameScreen to Save a Playername
+ Press F[1..12] to Load a Playername
+
+- To enable benchmark run the game with -benchmark parameter
+
+
+----------------------------
+3. Command-Line Parameters
+----------------------------
+Command-Line Parameters are passed to the game adding it to the Path of a Shortcut or starting the game within the console.
+
+The following parameters are possible. They can be joined in any possible way.
+
+-Benchmark : Create a benchmark.log file with start timings.
+-NoLog : Do not create any .log files
+-Joypad : Start with Joypad support
+-Language [ID] : Load Language [ID] on startup. Example: -Language german
+
+-Songpath [Path] : Some as config Songpath. Example: -SongPath "C:\Ultrastar Songs"
+-ConfigFile [File] : Load Configfile [File] instead of config.ini. Path to the file have to exist. Example: -ConfigFile config.SongCreation.ini
+-ScoreFile [File] : Use [File] instead of Ultrastar.db. Path to the file have to exist. Example: -ScoreFile HouseParty.db
+
+-FullScreen : Start the game in Fullscreen Mode
+-Depth [16/32] : Force Depth 16 or 32. Example: -Depth 16
+-Resolution [ID] : Force resolution. Example: -Resolution 800x600
+-Screens [1/2] : Force 1 or 2 Screen Mode. Example: -Screens 2
+
+Some Examples:
+
+Start with Resolution 1024x768 32 Bit Depth and Fullscreen:
+ultrastar.exe -Resolution 1024x768 -Depth 32 -Fullscreen
+
+Start without logging and polish Language
+ultrastar.exe -NoLog -Language polish
+
+Start with custom config File and Score DB:
+ultrastar.exe -ConfigFile C:\Ultrastar\Configs\PartyConfig.ini -ScoreFile C:\Ultrastar\Scores\PartyScores.db
+
+
+----------------------------
+4. Controls
+----------------------------
+Use the Arrowkeys to navigate through the Screens.
+Use Enter to select and Escape to go to the previous screen.
+In Songscreen you can use R, Shift + R or Strg + R to select a random song/category
+Use Alt + [Letter] to jump to a songs artist with the first letter [Letter]
+Use Alt + Shift + [Letter] to jump to a song title with the first letter [Letter]
+Press J to open the "Search for a Song" Interface
+
+Editor Controls are described in documentation.pdf
+
+
+----------------------------
+5. License
+----------------------------
+Ultrastar Deluxe is licensed under the terms of the GNU General Public License 2.0
+See License.txt for more Information. \ No newline at end of file
diff --git a/InstallerDependencies/documents/documentation.pdf b/InstallerDependencies/documents/documentation.pdf
new file mode 100644
index 00000000..16267bb9
--- /dev/null
+++ b/InstallerDependencies/documents/documentation.pdf
Binary files differ
diff --git a/InstallerDependencies/images/header.bmp b/InstallerDependencies/images/header.bmp
new file mode 100644
index 00000000..058eafd3
--- /dev/null
+++ b/InstallerDependencies/images/header.bmp
Binary files differ
diff --git a/InstallerDependencies/images/left.bmp b/InstallerDependencies/images/left.bmp
new file mode 100644
index 00000000..3883fa09
--- /dev/null
+++ b/InstallerDependencies/images/left.bmp
Binary files differ
diff --git a/InstallerDependencies/images/modern.bmp b/InstallerDependencies/images/modern.bmp
new file mode 100644
index 00000000..62468ded
--- /dev/null
+++ b/InstallerDependencies/images/modern.bmp
Binary files differ
diff --git a/InstallerDependencies/plugins/NSISdl.dll b/InstallerDependencies/plugins/NSISdl.dll
new file mode 100644
index 00000000..a3675054
--- /dev/null
+++ b/InstallerDependencies/plugins/NSISdl.dll
Binary files differ
diff --git a/InstallerDependencies/plugins/gdf.dll b/InstallerDependencies/plugins/gdf.dll
new file mode 100644
index 00000000..e3400051
--- /dev/null
+++ b/InstallerDependencies/plugins/gdf.dll
Binary files differ
diff --git a/InstallerDependencies/plugins/nsProcess.dll b/InstallerDependencies/plugins/nsProcess.dll
new file mode 100644
index 00000000..064097a3
--- /dev/null
+++ b/InstallerDependencies/plugins/nsProcess.dll
Binary files differ
diff --git a/InstallerDependencies/plugins/nsisunz.dll b/InstallerDependencies/plugins/nsisunz.dll
new file mode 100644
index 00000000..5466f156
--- /dev/null
+++ b/InstallerDependencies/plugins/nsisunz.dll
Binary files differ
diff --git a/Languages/Catalan.ini b/Languages/Catalan.ini
new file mode 100644
index 00000000..713aec51
--- /dev/null
+++ b/Languages/Catalan.ini
@@ -0,0 +1,299 @@
+[Text]
+SING_LOADING=Carregant...
+
+SING_CHOOSE_MODE=Triar mode
+SING_SING=cantar
+SING_SING_DESC=joc ràpid: cantar un solo o un duet
+
+SING_MULTI=festa
+SING_MULTI_DESC=cantar en mode festa
+
+SING_TOOLS=eines
+
+SING_STATS=estadístiques
+SING_STATS_DESC=veure estadístiques
+
+SING_EDITOR=editor
+SING_EDITOR_DESC=crea les teves propies cançons
+
+SING_GAME_OPTIONS=opcions de joc
+SING_GAME_OPTIONS_DESC=canviar preferències de joc
+
+SING_EXIT=sortir
+SING_EXIT_DESC=sortir del joc
+
+SING_OPTIONS=opcions
+SING_OPTIONS_DESC=canviar preferències
+SING_OPTIONS_WHEREAMI=Opcions
+
+SING_OPTIONS_GAME=joc
+SING_OPTIONS_GRAPHICS=gràfics
+SING_OPTIONS_SOUND=so
+SING_OPTIONS_LYRICS=lletres
+SING_OPTIONS_THEMES=aparença
+SING_OPTIONS_RECORD=gravar
+SING_OPTIONS_ADVANCED=avançat
+SING_OPTIONS_EXIT=enrere
+
+SING_OPTIONS_GAME_WHEREAMI=Opcions de joc
+SING_OPTIONS_GAME_DESC=opcions generals del joc
+SING_OPTIONS_GAME_PLAYERS=Jugadors
+SING_OPTIONS_GAME_DIFFICULTY=Dificultat
+SING_OPTIONS_GAME_LANGUAGE=Idioma
+SING_OPTIONS_GAME_TABS=Pestanyes
+SING_OPTIONS_GAME_SORTING=Ordenació
+SING_OPTIONS_GAME_DEBUG=Debug
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Opcions Gràfiques
+SING_OPTIONS_GRAPHICS_DESC=configurar gràfics
+SING_OPTIONS_GRAPHICS_RESOLUTION=Resoluciò
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Pantalla complerta
+SING_OPTIONS_GRAPHICS_DEPTH=Profunditat
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Oscil·loscopi
+SING_OPTIONS_GRAPHICS_LINEBONUS=Bonus de línia
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Mida pel·lícula
+
+SING_OPTIONS_SOUND_WHEREAMI=Opcions de so
+SING_OPTIONS_SOUND_DESC=configurar so
+SING_OPTIONS_SOUND_MIC_BOOST=Ampli Micro
+SING_OPTIONS_SOUND_CLICK_ASSIST=Assistència Click
+SING_OPTIONS_SOUND_BEAT_CLICK=Clic de ritme
+SING_OPTIONS_SOUND_THRESHOLD=Llindar
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Mode dos jugadors
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Volum previsualitzar
+SING_OPTIONS_SOUND_PREVIEWFADING=Fos previsualitzar
+
+SING_OPTIONS_LYRICS_WHEREAMI=Opcions Lletra
+SING_OPTIONS_LYRICS_DESC=configuració de lletres
+SING_OPTIONS_LYRICS_FONT=Font
+SING_OPTIONS_LYRICS_EFFECT=Efecte
+SING_OPTIONS_LYRICS_SOLMIZATION=Solfeig
+
+SING_OPTIONS_THEMES_WHEREAMI=Options d'Aparença
+SING_OPTIONS_THEMES_DESC=Configuració d'aparença
+SING_OPTIONS_THEMES_THEME=Aparença
+SING_OPTIONS_THEMES_SKIN=Pell
+SING_OPTIONS_THEMES_COLOR=Color
+
+SING_OPTIONS_RECORD_WHEREAMI=Opcions de micro
+SING_OPTIONS_RECORD_DESC=configuració del micro
+SING_OPTIONS_RECORD_CARD=Tarjeta de so
+SING_OPTIONS_RECORD_INPUT=Entrada
+SING_OPTIONS_RECORD_CHANNELL=Canal esquerre
+SING_OPTIONS_RECORD_CHANNELR=Canal dret
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Opcions Avançades
+SING_OPTIONS_ADVANCED_DESC=opcions avançades
+SING_OPTIONS_ADVANCED_EFFECTSING=Efectes de cantar
+SING_OPTIONS_ADVANCED_SCREENFADE=Fos de pantalla
+SING_OPTIONS_ADVANCED_LOADANIMATION=Animació càrrega
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Prequnta abans d'esborrar
+SING_OPTIONS_ADVANCED_LINEBONUS=Bonus de línia
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=Quantes vegades cantada
+SING_OPTIONS_ADVANCED_ONSONGCLICK=després de triar cançó
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Menú Automàtic de festa
+
+SING_LEGEND_SELECT=seleccionar
+SING_LEGEND_NAVIGATE=navegar
+SING_LEGEND_CONTINUE=continuar
+SING_LEGEND_ESC=enrere
+
+SING_PLAYER_DESC=entrar nom de jugador/s
+SING_PLAYER_WHEREAMI=Nom dels jugadors
+SING_PLAYER_ENTER_NAME=introduir nom
+
+SING_DIFFICULTY_DESC=triar dificultat
+SING_DIFFICULTY_WHEREAMI=Dificultat
+SING_DIFFICULTY_CONTINUE=a selecció de cançó
+SING_EASY=Fàcil
+SING_MEDIUM=Mitjà
+SING_HARD=Difícil
+
+SING_SONG_SELECTION_DESC=triar cançó
+SING_SONG_SELECTION_WHEREAMI=Selecció de cançons
+SING_SONG_SELECTION_GOTO=Anar a ..
+SING_SONG_SELECTION=selecció de cançons
+SING_SONG_SELECTION_MENU=menú
+SING_SONG_SELECTION_PLAYLIST=llista
+SING_SONGS_IN_CAT=Cançons
+PLAYLIST_CATTEXT=Playlist: %s
+
+SING_TIME=TEMPS
+SING_TOTAL=total
+SING_MODE=cantar sol
+SING_NOTES=notes
+SING_GOLDEN_NOTES=notes daurades
+SING_PHRASE_BONUS=bonus de línia
+
+SING_MENU=Menú principal
+
+SONG_SCORE=puntuació cançó
+SONG_SCORE_WHEREAMI=Puntuació
+
+SING_SCORE_TONE_DEAF=Sense oïda
+SING_SCORE_AMATEUR=Aficionat
+SING_SCORE_RISING_STAR=Futura estrella
+SING_SCORE_LEAD_SINGER=Bon cantant
+SING_SCORE_HIT_ARTIST=Líder de grup
+SING_SCORE_SUPERSTAR=Super estrella
+SING_SCORE_ULTRASTAR=Ultra estrella
+
+SING_TOP_5_CHARTS=millors 5 jugadors
+SING_TOP_5_CHARTS_WHEREAMI=millors 5
+SING_TOP_5_CHARTS_CONTINUE=a selecció de cançó
+
+POPUP_PERFECT=perfecte!
+POPUP_AWESOME=genial!
+POPUP_GREAT=molt bo!
+POPUP_GOOD=esta bé!
+POPUP_NOTBAD=pots millorar!
+POPUP_BAD=malament!
+POPUP_POOR=pobre!
+POPUP_AWFUL=boo fora!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= i
+
+SONG_MENU_NAME_MAIN=menú de cançons
+SONG_MENU_PLAY=Cantar
+SONG_MENU_CHANGEPLAYERS=Canviar jugadors
+SONG_MENU_EDIT=Editar
+SONG_MENU_MODI=Cantar un Modi
+SONG_MENU_CANCEL=Cancel·lar
+
+SONG_MENU_NAME_PLAYLIST=Menú de cançons
+SONG_MENU_PLAYLIST_ADD=Afegir Cançó
+SONG_MENU_PLAYLIST_DEL=Esborrar Cançó
+
+SONG_MENU_NAME_PLAYLIST_ADD=Afegir Song
+SONG_MENU_PLAYLIST_ADD_NEW=a nova llista
+SONG_MENU_PLAYLIST_ADD_EXISTING=a llista existent
+SONG_MENU_PLAYLIST_NOEXISTING=No hi ha llistes
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nova llista
+SONG_MENU_PLAYLIST_NEW_CREATE=Crear
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Sense nom
+
+SONG_MENU_NAME_PLAYLIST_DEL=Segur que vols esborrar?
+SONG_MENU_YES=Si
+SONG_MENU_NO=No
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Obrir llista
+SONG_MENU_PLAYLIST_LOAD=obrir
+SONG_MENU_PLAYLIST_DELCURRENT=esborrar llista
+
+SONG_MENU_NAME_PLAYLIST_DEL=Esborrar llista?
+
+SONG_MENU_NAME_PARTY_MAIN=Menú festa
+SONG_MENU_JOKER=Comodí
+
+SONG_MENU_NAME_PARTY_JOKER=utilitzar comodí
+
+SONG_JUMPTO_DESC=buscar cançó
+SONG_JUMPTO_TYPE_DESC=Buscar:
+SONG_JUMPTO_TYPE1=Tot
+SONG_JUMPTO_TYPE2=Títol
+SONG_JUMPTO_TYPE3=Artista
+SONG_JUMPTO_SONGSFOUND=%d Cançons trobades
+SONG_JUMPTO_NOSONGSFOUND=No s'han trobat cançons
+SONG_JUMPTO_HELP=Introduir text a cercar
+SONG_JUMPTO_CATTEXT=Cercant: %s
+
+PARTY_MODE=mode festa
+PARTY_DIFFICULTY=Dificultat
+PARTY_PLAYLIST=Mode llista
+PARTY_PLAYLIST_ALL=Tot
+PARTY_PLAYLIST_CATEGORY=Directori
+PARTY_PLAYLIST_PLAYLIST=llista
+PARTY_ROUNDS=Rondes
+PARTY_TEAMS=Equips
+PARTY_TEAMS_PLAYER1=Player Team1
+PARTY_TEAMS_PLAYER2=Player Team2
+PARTY_TEAMS_PLAYER3=Player Team3
+
+PARTY_LEGEND_CONTINUE=continuar
+
+PARTY_OPTIONS_DESC=opcions mode festa
+PARTY_OPTIONS_WHEREAMI=Opcions Festa
+
+PARTY_PLAYER_DESC=introduïr noms de jugadors i equips
+PARTY_PLAYER_WHEREAMI=Noms
+PARTY_PLAYER_ENTER_NAME=introduïr noms
+PARTY_PLAYER_LEGEND_CONTINUE=iniciar festa
+
+PARTY_ROUND_DESC=següent jugador al micro
+PARTY_ROUND_WHEREAMI=Següent Ronda
+PARTY_ROUND_LEGEND_CONTINUE=iniciar ronda
+
+PARTY_SONG_WHEREAMI=Selecció de cançó mode festa
+PARTY_SONG_LEGEND_CONTINUE=cantar
+PARTY_SONG_MENU=menú festa
+
+PARTY_SCORE_DESC=puntuació de l'última ronda
+PARTY_SCORE_WHEREAMI=Punts mode festa
+
+PARTY_WIN_DESC=guanyador de la festa
+PARTY_WIN_WHEREAMI=Guanyador
+PARTY_WIN_LEGEND_CONTINUE=tornar al menú principal
+
+PARTY_ROUND=Ronda
+PARTY_ROUND_WINNER=Guanyador
+PARTY_NOTPLAYEDYET=no s'ha jugat encara
+PARTY_NOBODY=ningú
+NEXT_ROUND=Següent ronda:
+
+PARTY_DISMISSED=Abandona!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=guanya!
+
+PLUGIN_HDL_NAME=Aguantar la línia
+PLUGIN_HDL_DESC=No baixis de la fletxa a la barra de qualitat
+
+PLUGIN_UNTIL5000_NAME=Fins a 5000
+PLUGIN_UNTIL5000_DESC=El primer a arribar a 5000 punts guanya
+
+PLUGIN_DUELL_NAME=Duel
+PLUGIN_DUELL_DESC=Cantar un duela fins a 10000 punts
+
+PLUGIN_BLIND_NAME=Mode cec
+PLUGIN_BLIND_DESC=Duel sense veure les notes
+
+STAT_MAIN=Estadístiques
+STAT_MAIN_DESC=General
+STAT_MAIN_WHEREAMI=Estadístiques
+
+STAT_OVERVIEW_INTRO=%0:s Estadístiques\nÚltima reinicialització %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Cançons(%3:d amb Video), de les que %1:d ya han sonat i %2:d encara no s'han jugat mai.\n La cançó més popular és %5:s de %4:s.
+STAT_OVERVIEW_PLAYER=Des de l'última reinicialització hi han hagut %0:d jugadors diferents.\n El millor jugador és %1:s amb una mitjana de %2:d Punts.\n %3:s ha fet la màxima puntuació amb %4:d Punts.
+
+STAT_DETAIL=Estadístques
+STAT_DETAIL_WHEREAMI=Estadístiques
+
+STAT_NEXT=Següent pàgina
+STAT_PREV=Pàgina anterior
+STAT_REVERSE=Ordre invers
+STAT_PAGE=%0:d de %1:d Pàgines\n (%2:d de %3:d Entrades)
+
+STAT_DESC_SCORES=Màximes puntuacions
+STAT_DESC_SCORES_REVERSED=Mínimes puntuacions
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Millors cantants
+STAT_DESC_SINGERS_REVERSED=Pitjors cantants
+STAT_FORMAT_SINGERS=%0:s \n Puntuació mitjana: %1:d
+
+STAT_DESC_SONGS=Cançons més populars
+STAT_DESC_SONGS_REVERSED=Cançons menys populars
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx cantades
+
+STAT_DESC_BANDS=Grups més populars
+STAT_DESC_BANDS_REVERSED=Grups menys populars
+STAT_FORMAT_BANDS=%0:s \n %1:dx Cantades
+
+MSG_ERROR_TITLE=Error
+MSG_QUESTION_TITLE=Qüestió
+MSG_QUIT_USDX=Realment vols sortir d'UltraStar?
+MSG_END_PARTY=Realment vols sortir del mode festa?
+ERROR_NO_SONGS=No hi ha cançons
+ERROR_NO_PLUGINS=No hi ha Plugins
+ERROR_CORRUPT_SONG=No es poden carregar les cançons \ No newline at end of file
diff --git a/Languages/Croatian.ini b/Languages/Croatian.ini
new file mode 100644
index 00000000..7e2c4225
--- /dev/null
+++ b/Languages/Croatian.ini
@@ -0,0 +1,308 @@
+[Text]
+SING_LOADING=Ucitavanje...
+
+SING_CHOOSE_MODE=Izaberi nacin igre
+SING_SING=pjevaj
+SING_SING_DESC=brza igra: pjevaj solo ili duet
+
+SING_MULTI=party
+SING_MULTI_DESC=pjevaj u party mode-u
+
+SING_TOOLS=alati
+
+SING_STATS=statistika
+SING_STATS_DESC=pogledaj statistiku
+
+SING_EDITOR=editor
+SING_EDITOR_DESC=napravi svoje pjesme
+
+SING_GAME_OPTIONS=opcije igre
+SING_GAME_OPTIONS_DESC=promijeni postavke
+
+SING_EXIT=izlaz
+SING_EXIT_DESC=izlaz iz igre
+
+SING_OPTIONS=opcije
+SING_OPTIONS_DESC=promijeni postavke
+SING_OPTIONS_WHEREAMI=Opcije
+
+SING_OPTIONS_GAME=igra
+SING_OPTIONS_GRAPHICS=video
+SING_OPTIONS_SOUND=audio
+SING_OPTIONS_LYRICS=tekstovi
+SING_OPTIONS_THEMES=teme
+SING_OPTIONS_RECORD=snimanje
+SING_OPTIONS_ADVANCED=ostalo
+SING_OPTIONS_EXIT=natrag
+
+SING_OPTIONS_GAME_WHEREAMI=Opcije Igre
+SING_OPTIONS_GAME_DESC=osnovne opcije igre
+SING_OPTIONS_GAME_PLAYERS=Br. igraca
+SING_OPTIONS_GAME_DIFFICULTY=Težina
+SING_OPTIONS_GAME_LANGUAGE=Jezik
+SING_OPTIONS_GAME_TABS=Tabovi
+SING_OPTIONS_GAME_SORTING=Sortiranje
+SING_OPTIONS_GAME_DEBUG=Debug
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Opcije Videa
+SING_OPTIONS_GRAPHICS_DESC=video opcije
+SING_OPTIONS_GRAPHICS_RESOLUTION=Rezolucija
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Cijeli ekran
+SING_OPTIONS_GRAPHICS_DEPTH=Dubina boja
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Osciloskop
+SING_OPTIONS_GRAPHICS_LINEBONUS=Bonus linije
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Velicina videa
+
+SING_OPTIONS_SOUND_WHEREAMI=Opcije Zvuka
+SING_OPTIONS_SOUND_DESC=postavke zvuka
+SING_OPTIONS_SOUND_MIC_BOOST=Mic boost
+SING_OPTIONS_SOUND_CLICK_ASSIST=Pomoc klikovima
+SING_OPTIONS_SOUND_BEAT_CLICK=Klik na udarce
+SING_OPTIONS_SOUND_THRESHOLD=Threshold
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Igra za dva igraca
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Glasnoca prikaza
+SING_OPTIONS_SOUND_PREVIEWFADING=Fade-in vrijeme
+
+SING_OPTIONS_LYRICS_WHEREAMI=Opcije Tekstova
+SING_OPTIONS_LYRICS_DESC=postavke tekstova
+SING_OPTIONS_LYRICS_FONT=Font
+SING_OPTIONS_LYRICS_EFFECT=Efekt
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmizacija
+
+SING_OPTIONS_THEMES_WHEREAMI=Opcije Tema
+SING_OPTIONS_THEMES_DESC=postavke tema i skinova
+SING_OPTIONS_THEMES_THEME=Tema
+SING_OPTIONS_THEMES_SKIN=Skin
+SING_OPTIONS_THEMES_COLOR=Boja
+
+SING_OPTIONS_RECORD_WHEREAMI=Opcije Snimanja
+SING_OPTIONS_RECORD_DESC=postavke mikrofona
+SING_OPTIONS_RECORD_CARD=Zv. kartica
+SING_OPTIONS_RECORD_INPUT=Ulaz
+SING_OPTIONS_RECORD_CHANNELL=Lijevi kanal
+SING_OPTIONS_RECORD_CHANNELR=Desni kanal
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Ostale Opcije
+SING_OPTIONS_ADVANCED_DESC=ostale postavke
+SING_OPTIONS_ADVANCED_EFFECTSING=Efekti kod pjevanja
+SING_OPTIONS_ADVANCED_SCREENFADE=Fade-out ekrana
+SING_OPTIONS_ADVANCED_LOADANIMATION=Anim. tijekom ucit.
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Sigurn. pitanja
+SING_OPTIONS_ADVANCED_LINEBONUS=Bonus linije
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=Zapamti broj pjev.
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Nakon pjesme
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto party meni
+
+SING_LEGEND_SELECT=odaberi
+SING_LEGEND_NAVIGATE=navigacija
+SING_LEGEND_CONTINUE=nastavi
+SING_LEGEND_ESC=natrag
+
+SING_PLAYER_DESC=unesi ime igraca
+SING_PLAYER_WHEREAMI=Imena igraca
+SING_PLAYER_ENTER_NAME=unesi ime
+
+SING_DIFFICULTY_DESC=odaberi težinu
+SING_DIFFICULTY_WHEREAMI=Težina
+SING_DIFFICULTY_CONTINUE=odabir pjesme
+SING_EASY=Lako
+SING_MEDIUM=Srednje
+SING_HARD=Teško
+
+SING_SONG_SELECTION_DESC=odaberi pjesmu
+SING_SONG_SELECTION_WHEREAMI=Odabir Pjesme
+SING_SONG_SELECTION_GOTO=idi na ..
+SING_SONG_SELECTION=odabir pjesme
+SING_SONG_SELECTION_MENU=meni
+SING_SONG_SELECTION_PLAYLIST=playlista
+SING_SONGS_IN_CAT=Pjesme
+PLAYLIST_CATTEXT=Playlista: %s
+
+SING_TIME=TIME
+SING_TOTAL=ukupno
+SING_MODE=pjevaj solo
+SING_NOTES=note
+SING_GOLDEN_NOTES=zlatne note
+SING_PHRASE_BONUS=bonus
+
+SING_MENU=Glavni Meni
+
+SONG_SCORE=bodovi
+SONG_SCORE_WHEREAMI=Rezultat
+
+SING_SCORE_TONE_DEAF=Bez sluha
+SING_SCORE_AMATEUR=Amater
+SING_SCORE_RISING_STAR=Zvijezda u usponu
+SING_SCORE_LEAD_SINGER=Vodeci pjevac
+SING_SCORE_HIT_ARTIST=Hit Artist
+SING_SCORE_SUPERSTAR=Superstar
+SING_SCORE_ULTRASTAR=Ultrastar
+
+SING_TOP_5_CHARTS=top 5 Igraca
+SING_TOP_5_CHARTS_WHEREAMI=top 5
+SING_TOP_5_CHARTS_CONTINUE=odabir pjesme
+
+POPUP_PERFECT=izvanredno!
+POPUP_AWESOME=predivno!
+POPUP_GREAT=odlicno!
+POPUP_GOOD=dobro!
+POPUP_NOTBAD=nije loše!
+POPUP_BAD=loše!
+POPUP_POOR=jadno!
+POPUP_AWFUL=grozno!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= i
+
+SONG_MENU_NAME_MAIN=Kolekcija pjesama
+SONG_MENU_PLAY=Pjevaj
+SONG_MENU_CHANGEPLAYERS=Promijeni igrace
+SONG_MENU_EDIT=Uredi
+SONG_MENU_MODI=Pjevaj Modi
+SONG_MENU_CANCEL=Poništi
+
+SONG_MENU_NAME_PLAYLIST=Playliste
+SONG_MENU_PLAYLIST_ADD=Dodaj Pjesmu
+SONG_MENU_PLAYLIST_DEL=Izbriši Pjesmu
+
+SONG_MENU_NAME_PLAYLIST_ADD=Dodaj Pjesmu
+SONG_MENU_PLAYLIST_ADD_NEW=na novu playlistu
+SONG_MENU_PLAYLIST_ADD_EXISTING=na postojecu playlistu
+SONG_MENU_PLAYLIST_NOEXISTING=Nema playlisti.
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nova Playlista
+SONG_MENU_PLAYLIST_NEW_CREATE=Napravi
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Bez imena
+
+SONG_MENU_NAME_PLAYLIST_DEL=Stvarno obrisati?
+SONG_MENU_YES=Da
+SONG_MENU_NO=Ne
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Otvori Playlistu
+SONG_MENU_PLAYLIST_LOAD=otvori
+SONG_MENU_PLAYLIST_DELCURRENT=obriši trenutnu Playlistu
+
+SONG_MENU_NAME_PLAYLIST_DEL=Obriši Playlistu?
+
+SONG_MENU_NAME_PARTY_MAIN=Party Meni
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=iskoristi joker
+
+SONG_JUMPTO_DESC=pretraži pjesme
+SONG_JUMPTO_TYPE_DESC=Traži :
+SONG_JUMPTO_TYPE1=Sve
+SONG_JUMPTO_TYPE2=Naslov
+SONG_JUMPTO_TYPE3=Izvoðac
+SONG_JUMPTO_SONGSFOUND=%d pjes(a)ma naðeno
+SONG_JUMPTO_NOSONGSFOUND=Niti jedna pjesma nije pronaðena.
+SONG_JUMPTO_HELP=Unesi tekst koji želiš tražiti.
+SONG_JUMPTO_CATTEXT=Traži: %s
+
+PARTY_MODE=party mod
+PARTY_DIFFICULTY=Težina
+PARTY_PLAYLIST=Playlist Mod
+PARTY_PLAYLIST_ALL=Sve pjesme
+PARTY_PLAYLIST_CATEGORY=Folder
+PARTY_PLAYLIST_PLAYLIST=Playliste
+PARTY_ROUNDS=Runde
+PARTY_TEAMS=Br. Timova
+PARTY_TEAMS_PLAYER1=Br. Igraca - Tim1
+PARTY_TEAMS_PLAYER2=Br. Igraca - Tim2
+PARTY_TEAMS_PLAYER3=Br. Igraca - Tim3
+
+PARTY_LEGEND_CONTINUE=nastavi
+
+PARTY_OPTIONS_DESC=postavke za party igru
+PARTY_OPTIONS_WHEREAMI=Party Opcije
+
+PARTY_PLAYER_DESC=unesi imena timova i igraca!
+PARTY_PLAYER_WHEREAMI=Party Imena
+PARTY_PLAYER_ENTER_NAME=unesi imena
+PARTY_PLAYER_LEGEND_CONTINUE=zapocni party-igru
+
+PARTY_ROUND_DESC=sljed. igraci za mikr.
+PARTY_ROUND_WHEREAMI=Party Sljed runda
+PARTY_ROUND_LEGEND_CONTINUE=zapocni rundu
+
+PARTY_SONG_WHEREAMI=Party Odabir pjesme
+PARTY_SONG_LEGEND_CONTINUE=pjevaj
+PARTY_SONG_MENU=party meni
+
+PARTY_SCORE_DESC=bodovi zadnje runde
+PARTY_SCORE_WHEREAMI=Party Bodovi
+
+PARTY_WIN_DESC=pobjednik party igre
+PARTY_WIN_WHEREAMI=Party Pobjednik
+PARTY_WIN_LEGEND_CONTINUE=natrag na glavni meni
+
+PARTY_ROUND=Runda
+PARTY_ROUND_WINNER=Pobjednik
+PARTY_NOTPLAYEDYET=nije još odigr.
+PARTY_NOBODY=nitko ni
+NEXT_ROUND=Sljed. runda:
+
+PARTY_DISMISSED=Izbacen!
+PARTY_SCORE_WINS=%s je
+PARTY_SCORE_WINS2=pobijedio!
+
+PLUGIN_HDL_NAME=Zadrži liniju
+PLUGIN_HDL_DESC=Nemoj biti gori od pointera na rating baru.
+
+PLUGIN_UNTIL5000_NAME=Do 5000
+PLUGIN_UNTIL5000_DESC=Pobjeðuje onaj tko prvi doðe do 5000 bodova.
+
+PLUGIN_DUELL_NAME=Dvoboj
+PLUGIN_DUELL_DESC=Pjevaj dvoboj do 10000 bodova.
+
+PLUGIN_TEAMDUELL_NAME=Dvoboj timova
+PLUGIN_TEAMDUELL_DESC=Dodaj mikrofon!
+
+PLUGIN_BLIND_NAME=Slijepi nacin
+PLUGIN_BLIND_DESC=Dvoboj bez gledanja nota.
+
+PLUGIN_BLIND_NOSCORE_NAME=Slijepi nacin 2
+PLUGIN_BLIND_NOSCORE_DESC=Dvoboj bez gledanja nota i bodova.
+
+PLUGIN_MORE1000_NAME=1000 Više
+PLUGIN_MORE1000_DESC=Pjevajte dok jedan od igraca ne skupi 1000 bod više.
+
+STAT_MAIN=Statistika
+STAT_MAIN_DESC=General
+STAT_MAIN_WHEREAMI=Statistika
+
+STAT_OVERVIEW_INTRO=%0:s Statistika. \n Zadnji reset je bio %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d pjesama (%3:d sa Videom), od cega je %1:d pjesama otpjevano a %2:d nije.\n Najpopularnija pjesma je %5:s od %4:s.
+STAT_OVERVIEW_PLAYER=Od zadnjeg reseta bilo je %0:d razlicitih igraca.\n Najbolji igrac je %1:s sa prosjekom od %2:d bodova.\n %3:s je napravio/la najveci rezultat sa %4:d bodova.
+
+STAT_DETAIL=Statistika
+STAT_DETAIL_WHEREAMI=Detaljna statistika
+
+STAT_NEXT=Sljed. strana
+STAT_PREV=Preth. strana
+STAT_REVERSE=Obrnuti redoslijed
+STAT_PAGE=Strana %0:d od %1:d\n (%2:d od %3:d unosa)
+
+STAT_DESC_SCORES=HighScores
+STAT_DESC_SCORES_REVERSED=LowScores
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Najbolji pjevaci
+STAT_DESC_SINGERS_REVERSED=Najgori pjevaci
+STAT_FORMAT_SINGERS=%0:s \n Prosjecni bodovi: %1:d
+
+STAT_DESC_SONGS=Popularne pjesme
+STAT_DESC_SONGS_REVERSED=Nepopularne pjesme
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx otpjevano
+
+STAT_DESC_BANDS=Popularni bendovi
+STAT_DESC_BANDS_REVERSED=Nepopularni bendovi
+STAT_FORMAT_BANDS=%0:s \n %1:dx otpjevano
+
+MSG_ERROR_TITLE=Greška
+MSG_QUESTION_TITLE=Pitanje
+MSG_QUIT_USDX=Napustiti UltraStar?
+MSG_END_PARTY=Napustiti Party igru?
+ERROR_NO_SONGS=Nema ucitanih pjesama
+ERROR_NO_PLUGINS=Nema ucitanih pluginova
+ERROR_CORRUPT_SONG=Pjesma se ne može ucitati. \ No newline at end of file
diff --git a/Languages/Danish.ini b/Languages/Danish.ini
new file mode 100644
index 00000000..abf0f20c
--- /dev/null
+++ b/Languages/Danish.ini
@@ -0,0 +1,298 @@
+[Text]
+SING_LOADING=Loader...
+
+SING_CHOOSE_MODE=Vælg modus
+SING_SING=Syng
+SING_SING_DESC=Hurtigt spil: Syng solo eller duet
+
+SING_MULTI=Fest
+SING_MULTI_DESC=Syng i fest modus
+
+SING_TOOLS=Værktøjer
+
+SING_STATS=stats
+SING_STATS_DESC=Se statestikker
+
+SING_EDITOR=editor
+SING_EDITOR_DESC=Lav dine egne sange
+SING_GAME_OPTIONS=Spil Indstillinger
+SING_GAME_OPTIONS_DESC=Ændre spil Indstillinger
+
+SING_EXIT=Forlad
+SING_EXIT_DESC=Forlad spillet
+
+SING_OPTIONS=Indstillinger
+SING_OPTIONS_DESC=Ændre Instillinger
+SING_OPTIONS_WHEREAMI=Indstillinger
+
+SING_OPTIONS_GAME=Spil
+SING_OPTIONS_GRAPHICS=Grafik
+SING_OPTIONS_SOUND=Lyd
+SING_OPTIONS_LYRICS=Tekster
+SING_OPTIONS_THEMES=Temaer
+SING_OPTIONS_RECORD=Optag
+SING_OPTIONS_ADVANCED=Advanceret
+SING_OPTIONS_EXIT=Tilbage
+
+SING_OPTIONS_GAME_WHEREAMI=Spil Indstillinger
+SING_OPTIONS_GAME_DESC=Generelle Spil Indstillinger
+SING_OPTIONS_GAME_PLAYERS=Spillere
+SING_OPTIONS_GAME_DIFFICULTY=Sværhedsgrad
+SING_OPTIONS_GAME_LANGUAGE=Sprog
+SING_OPTIONS_GAME_TABS=Tabs
+SING_OPTIONS_GAME_SORTING=Sorting
+SING_OPTIONS_GAME_DEBUG=Debug
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Grafik Indstillinger
+SING_OPTIONS_GRAPHICS_DESC=Grafik Indstillinger
+SING_OPTIONS_GRAPHICS_RESOLUTION=Opløsning
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Fuldskærm
+SING_OPTIONS_GRAPHICS_DEPTH=Farve dybte
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Oscilloskop
+SING_OPTIONS_GRAPHICS_LINEBONUS=Linie Bonus
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Film Størrelse
+
+SING_OPTIONS_SOUND_WHEREAMI=Lyd Indstillinger
+SING_OPTIONS_SOUND_DESC=Lyd Indstillinger
+SING_OPTIONS_SOUND_MIC_BOOST=Mikrofon Boost
+SING_OPTIONS_SOUND_CLICK_ASSIST=Click assist
+SING_OPTIONS_SOUND_BEAT_CLICK=Beat click
+SING_OPTIONS_SOUND_THRESHOLD=Tærskel
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=2 Spiller modus
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Frosmag Volume
+SING_OPTIONS_SOUND_PREVIEWFADING=Forsmag Fader
+
+SING_OPTIONS_LYRICS_WHEREAMI=Tekst Indstillinger
+SING_OPTIONS_LYRICS_DESC=Tekst Indstillinger
+SING_OPTIONS_LYRICS_FONT=Tekst Type
+SING_OPTIONS_LYRICS_EFFECT=Effekt
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmization
+
+SING_OPTIONS_THEMES_WHEREAMI=Tema Indstillinger
+SING_OPTIONS_THEMES_DESC=Tema og Skin Indstillinger
+SING_OPTIONS_THEMES_THEME=Tema
+SING_OPTIONS_THEMES_SKIN=Skin
+SING_OPTIONS_THEMES_COLOR=Farve
+
+SING_OPTIONS_RECORD_WHEREAMI=Optagelses Indstillinger
+SING_OPTIONS_RECORD_DESC=Mikrofon Indstillinger
+SING_OPTIONS_RECORD_CARD=Lydkort
+SING_OPTIONS_RECORD_INPUT=Input
+SING_OPTIONS_RECORD_CHANNELL=Venstre kanal
+SING_OPTIONS_RECORD_CHANNELR=Højre Kanal
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Advancerede Indstillinger
+SING_OPTIONS_ADVANCED_DESC=Advancerede Indstillinger
+SING_OPTIONS_ADVANCED_EFFECTSING=Sang Effekter
+SING_OPTIONS_ADVANCED_SCREENFADE=Skærm Fading
+SING_OPTIONS_ADVANCED_LOADANIMATION=Load Animation
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Savety Questions
+SING_OPTIONS_ADVANCED_LINEBONUS=Linie Bonus
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Efter sang valg
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto Festmodus
+
+SING_LEGEND_SELECT=Vælg
+SING_LEGEND_NAVIGATE=Naviger
+SING_LEGEND_CONTINUE=Fortsæt
+SING_LEGEND_ESC=Tilbage
+
+SING_PLAYER_DESC=Skriv Spiller Navn/e
+SING_PLAYER_WHEREAMI=Spiller Navne
+SING_PLAYER_ENTER_NAME=Skriv navn
+
+SING_DIFFICULTY_DESC=Vælg Sværhedsgrad
+SING_DIFFICULTY_WHEREAMI=Sværhedsgrad
+SING_DIFFICULTY_CONTINUE=Til sang valg
+SING_EASY=Let
+SING_MEDIUM=Normal
+SING_HARD=Svær
+
+SING_SONG_SELECTION_DESC=Vælg Din Sang
+SING_SONG_SELECTION_WHEREAMI=Sang Valg
+SING_SONG_SELECTION_GOTO=Gå Til ..
+SING_SONG_SELECTION=Sang Valg
+SING_SONG_SELECTION_MENU=Menu
+SING_SONG_SELECTION_PLAYLIST=Afspilningsliste
+SING_SONGS_IN_CAT=Songs
+PLAYLIST_CATTEXT=Playlist: %s
+
+SING_TIME=TID
+SING_TOTAL=Total
+SING_MODE=Syng Solo
+SING_NOTES=Noder
+SING_GOLDEN_NOTES=Gyldne Noder
+SING_PHRASE_BONUS=Linie Bonus
+
+SING_MENU=Hoved Menu
+
+SONG_SCORE=Sang score
+SONG_SCORE_WHEREAMI=Score
+
+SING_SCORE_TONE_DEAF=Tone Døv!
+SING_SCORE_AMATEUR=Amatør!
+SING_SCORE_RISING_STAR=Aspirende Stjerne
+SING_SCORE_LEAD_SINGER=Forsanger
+SING_SCORE_HIT_ARTIST=Etableret Stjerne
+SING_SCORE_SUPERSTAR=Super Stjerne
+SING_SCORE_ULTRASTAR=Ultra Stjerne
+
+SING_TOP_5_CHARTS=Top 5 Spillere
+SING_TOP_5_CHARTS_WHEREAMI=Top 5
+SING_TOP_5_CHARTS_CONTINUE=Til Sang Valg
+
+POPUP_PERFECT=Perfekt!
+POPUP_AWESOME=Utroligt!
+POPUP_GREAT=Meget Godt!
+POPUP_GOOD=Godt!
+POPUP_NOTBAD=Ikke dårligt!
+POPUP_BAD=Dårligt!
+POPUP_POOR=Meget Dårligt!
+POPUP_AWFUL=Ringe!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= og
+
+SONG_MENU_NAME_MAIN=Sang Menu
+SONG_MENU_PLAY=Syng
+SONG_MENU_CHANGEPLAYERS=Skift Spillere
+SONG_MENU_EDIT=Ændre
+SONG_MENU_MODI=Sing a Modi
+SONG_MENU_CANCEL=Annuller
+
+SONG_MENU_NAME_PLAYLIST=Sang Menu
+SONG_MENU_PLAYLIST_ADD=Tilføj Sang
+SONG_MENU_PLAYLIST_DEL=Slet Sang
+
+SONG_MENU_NAME_PLAYLIST_ADD=Tilføj Song
+SONG_MENU_PLAYLIST_ADD_NEW=Til Ny Afspilningsliste
+SONG_MENU_PLAYLIST_ADD_EXISTING=Til Eksisterende Afspilningsliste
+SONG_MENU_PLAYLIST_NOEXISTING=Ingen Tilgængelige Afspilningslister
+
+SONG_MENU_NAME_PLAYLIST_NEW=Ny Afspilningsliste
+SONG_MENU_PLAYLIST_NEW_CREATE=Skab
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Unavngiven
+
+SONG_MENU_NAME_PLAYLIST_DEL=Vil Du Virkelig Slette?
+SONG_MENU_YES=Ja
+SONG_MENU_NO=Nej
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Åben Afspilningsliste
+SONG_MENU_PLAYLIST_LOAD=Åben
+SONG_MENU_PLAYLIST_DELCURRENT=Slet Nuværende Afspilningsliste
+
+SONG_MENU_NAME_PLAYLIST_DEL=Slet Afspilningslisten?
+
+SONG_MENU_NAME_PARTY_MAIN=Fest Menu
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=Brug Jokeren
+
+SONG_JUMPTO_DESC=Søg Sang
+SONG_JUMPTO_TYPE_DESC=Søg Efter:
+SONG_JUMPTO_TYPE1=Alle
+SONG_JUMPTO_TYPE2=Titel
+SONG_JUMPTO_TYPE3=Kunstner
+SONG_JUMPTO_SONGSFOUND=%d Sang(e) fundet!
+SONG_JUMPTO_NOSONGSFOUND=Ingen Sange Fundet
+SONG_JUMPTO_HELP=Skriv Teksten Du Vil Søge Efter
+SONG_JUMPTO_CATTEXT=Søg Efter: %s
+
+PARTY_MODE=Fest modus
+PARTY_DIFFICULTY=Sværhedsgrad
+PARTY_PLAYLIST=Afspilningsliste modus
+PARTY_PLAYLIST_ALL=Alle sange
+PARTY_PLAYLIST_CATEGORY=Mappe
+PARTY_PLAYLIST_PLAYLIST=Afspilningsliste
+PARTY_ROUNDS=Runder
+PARTY_TEAMS=Teams
+PARTY_TEAMS_PLAYER1=Spiller Team 1
+PARTY_TEAMS_PLAYER2=Spiller Team 2
+PARTY_TEAMS_PLAYER3=Spiller Team 3
+
+PARTY_LEGEND_CONTINUE=Fortsæt
+
+PARTY_OPTIONS_DESC=Indstillinger for Fest spil
+PARTY_OPTIONS_WHEREAMI=Fest Indstillinger
+
+PARTY_PLAYER_DESC=Skriv Spiller of Team Navn!
+PARTY_PLAYER_WHEREAMI=Fest navne
+PARTY_PLAYER_ENTER_NAME=Skriv Navne
+PARTY_PLAYER_LEGEND_CONTINUE=Start Fest Spil
+
+PARTY_ROUND_DESC=Næste spillere til mikrofonerne
+PARTY_ROUND_WHEREAMI=Fest Næste runde
+PARTY_ROUND_LEGEND_CONTINUE=Start runde
+
+PARTY_SONG_WHEREAMI=Fest Sang-Valg
+PARTY_SONG_LEGEND_CONTINUE=Syng
+PARTY_SONG_MENU=Fest menu
+
+PARTY_SCORE_DESC=Sidste Rundes Score
+PARTY_SCORE_WHEREAMI=Fest Point
+
+PARTY_WIN_DESC=Vinderen Af Fest Spillet
+PARTY_WIN_WHEREAMI=Fest Vinder
+PARTY_WIN_LEGEND_CONTINUE=Tilbage til Hoved Menuen
+
+PARTY_ROUND=Runde
+PARTY_ROUND_WINNER=vinder
+PARTY_NOTPLAYEDYET=Ikke spillet endnu
+PARTY_NOBODY=Ingen
+NEXT_ROUND=Næste Runde:
+
+PARTY_DISMISSED=Afsluttet!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=Vinder!
+
+PLUGIN_HDL_NAME=Hold Linien
+PLUGIN_HDL_DESC=Få ikke værrer end pilen på skalaen peger på
+
+PLUGIN_UNTIL5000_NAME=Until 5000
+PLUGIN_UNTIL5000_DESC=Hvem får 5000 point først vinder the kampen.
+
+PLUGIN_DUELL_NAME=Duell
+PLUGIN_DUELL_DESC=Syng en duel intil 10000 point.
+
+PLUGIN_BLIND_NAME=Blind Modus
+PLUGIN_BLIND_DESC=Duel med usynlige noder.
+
+STAT_MAIN=Statestikker
+STAT_MAIN_DESC=Generelle
+STAT_MAIN_WHEREAMI=Statestikker
+
+STAT_OVERVIEW_INTRO=%0:s Statistics. \n Last Reset at %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Songs(%3:d with Video), whereof %1:d already were played and %2:d were not played yet.\n The most popular Song is %5:s from %4:s.
+STAT_OVERVIEW_PLAYER=Since the last Reset there were/was %0:d different Player(s).\n The best Player is %1:s with an average Score of %2:d Points.\n %3:s did the highest Score with %4:d Points.
+
+STAT_DETAIL=Statestikker
+STAT_DETAIL_WHEREAMI=Detaljerede Statestikker
+
+STAT_NEXT=Næste Side
+STAT_PREV=Tidligere Side
+STAT_REVERSE=Omvendt Orden
+STAT_PAGE=Seite %0:d of %1:d Pages\n (%2:d of %3:d Entrys)
+
+STAT_DESC_SCORES=HighScore
+STAT_DESC_SCORES_REVERSED=LowScore
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Bedste Sangere
+STAT_DESC_SINGERS_REVERSED=Værste Sangere
+STAT_FORMAT_SINGERS=%0:s \n Average Score: %1:d
+
+STAT_DESC_SONGS=Mest Populære Sange
+STAT_DESC_SONGS_REVERSED=Mindst Populære Sange
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx sung
+
+STAT_DESC_BANDS=Mest Populære Bands
+STAT_DESC_BANDS_REVERSED=Mindst Populære Bands
+STAT_FORMAT_BANDS=%0:s \n %1:dx Sung
+
+MSG_ERROR_TITLE=Fejl
+MSG_QUESTION_TITLE=Spørgsmål
+MSG_QUIT_USDX=Vil du virkelig forlade UltraStar?
+MSG_END_PARTY=Vil du virkelig forlade fest Modus?
+ERROR_NO_SONGS=Ingen Sange hentet
+ERROR_NO_PLUGINS=Igen Plugins hentet
+ERROR_CORRUPT_SONG=Sangen kunne ikke hentes. \ No newline at end of file
diff --git a/Languages/Dutch.ini b/Languages/Dutch.ini
new file mode 100644
index 00000000..1724751a
--- /dev/null
+++ b/Languages/Dutch.ini
@@ -0,0 +1,299 @@
+[Text]
+SING_LOADING=Laden...
+
+SING_CHOOSE_MODE=Kies modus
+SING_SING=Zingen
+SING_SING_DESC=Snel spelen: zing een solo of een duet
+
+SING_MULTI=Party
+SING_MULTI_DESC=Zing in party-modus
+
+SING_TOOLS=Extra
+
+SING_STATS=Statistieken
+SING_STATS_DESC=Bekijk de statistieken
+
+SING_EDITOR=Editor
+SING_EDITOR_DESC=Creeër je eigen nummers
+
+SING_GAME_OPTIONS=Spel opties
+SING_GAME_OPTIONS_DESC=Verander de spel instellingen
+
+SING_EXIT=Afsluiten
+SING_EXIT_DESC=Spel beëindigen
+
+SING_OPTIONS=Opties
+SING_OPTIONS_DESC=Verander instellingen
+SING_OPTIONS_WHEREAMI=Opties
+
+SING_OPTIONS_GAME=Spel
+SING_OPTIONS_GRAPHICS=Grafisch
+SING_OPTIONS_SOUND=Geluid
+SING_OPTIONS_LYRICS=Teksten
+SING_OPTIONS_THEMES=Thema's
+SING_OPTIONS_RECORD=Opnamen
+SING_OPTIONS_ADVANCED=Geavanceerd
+SING_OPTIONS_EXIT=Terug
+
+SING_OPTIONS_GAME_WHEREAMI=Opties Spel
+SING_OPTIONS_GAME_DESC=Algemene spelinstellingen
+SING_OPTIONS_GAME_PLAYERS=Spelers
+SING_OPTIONS_GAME_DIFFICULTY=Moeilijkheidsgraad
+SING_OPTIONS_GAME_LANGUAGE=Taal
+SING_OPTIONS_GAME_TABS=Tabbladen
+SING_OPTIONS_GAME_SORTING=Sorteren
+SING_OPTIONS_GAME_DEBUG=Debug
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Opties Grafisch
+SING_OPTIONS_GRAPHICS_DESC=Grafische instellingen
+SING_OPTIONS_GRAPHICS_RESOLUTION=Resolutie
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Volledig scherm
+SING_OPTIONS_GRAPHICS_DEPTH=Kleurdiepte
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Oscilloscoop
+SING_OPTIONS_GRAPHICS_LINEBONUS=Regel Bonus
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Video formaat
+
+SING_OPTIONS_SOUND_WHEREAMI=Opties geluid
+SING_OPTIONS_SOUND_DESC=Geluidsinstellingen
+SING_OPTIONS_SOUND_MIC_BOOST=Mic versterken
+SING_OPTIONS_SOUND_CLICK_ASSIST=Klik assistent
+SING_OPTIONS_SOUND_BEAT_CLICK=Metronoom
+SING_OPTIONS_SOUND_THRESHOLD=Drempelwaarde
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Twee speler modus
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Selectie Volume
+SING_OPTIONS_SOUND_PREVIEWFADING=Crossfading
+
+SING_OPTIONS_LYRICS_WHEREAMI=Opties Teksten
+SING_OPTIONS_LYRICS_DESC=Tekstinstellingen
+SING_OPTIONS_LYRICS_FONT=Lettertype
+SING_OPTIONS_LYRICS_EFFECT=Effect
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmisatie
+
+SING_OPTIONS_THEMES_WHEREAMI=Opties Thema's
+SING_OPTIONS_THEMES_DESC=Thema en Skin instellingen
+SING_OPTIONS_THEMES_THEME=Thema
+SING_OPTIONS_THEMES_SKIN=Skin
+SING_OPTIONS_THEMES_COLOR=Kleur
+
+SING_OPTIONS_RECORD_WHEREAMI=Opties Opnamen
+SING_OPTIONS_RECORD_DESC=Microfoon instellingen
+SING_OPTIONS_RECORD_CARD=Geluidskaart
+SING_OPTIONS_RECORD_INPUT=Aansluiting
+SING_OPTIONS_RECORD_CHANNELL=Linkerkanaal
+SING_OPTIONS_RECORD_CHANNELR=Rechterkanaal
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Opties Geavanceerd
+SING_OPTIONS_ADVANCED_DESC=Geavanceerde instellingen
+SING_OPTIONS_ADVANCED_EFFECTSING=Noot effecten
+SING_OPTIONS_ADVANCED_SCREENFADE=Schermovergang
+SING_OPTIONS_ADVANCED_LOADANIMATION=Laad Animaties
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Veiligheidsvragen
+SING_OPTIONS_ADVANCED_LINEBONUS=Regel Bonus
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Na Selectie
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto Partymenu
+
+SING_LEGEND_SELECT=Selecteer
+SING_LEGEND_NAVIGATE=Navigeer
+SING_LEGEND_CONTINUE=Verder
+SING_LEGEND_ESC=Terug
+
+SING_PLAYER_DESC=Type spelersnaam
+SING_PLAYER_WHEREAMI=Spelernaam
+SING_PLAYER_ENTER_NAME=type de naam
+
+SING_DIFFICULTY_DESC=Selecteer moeilijkheidsgraad
+SING_DIFFICULTY_WHEREAMI=Moeilijkheidsgraad
+SING_DIFFICULTY_CONTINUE=Verder een nummer selecteren
+SING_EASY=Makkelijk
+SING_MEDIUM=Gemiddeld
+SING_HARD=Moeilijk
+
+SING_SONG_SELECTION_DESC=Kies een nummer
+SING_SONG_SELECTION_WHEREAMI=Nummer selecteren
+SING_SONG_SELECTION_GOTO=Ga naar...
+SING_SONG_SELECTION=Nummer Selectie
+SING_SONG_SELECTION_MENU=Menu
+SING_SONG_SELECTION_PLAYLIST=Speellijst
+SING_SONGS_IN_CAT=Nummers
+PLAYLIST_CATTEXT=Speellijst: %s
+
+SING_TIME=TIJD
+SING_TOTAL=Totaal
+SING_MODE=Zing een solo
+SING_NOTES=Noten
+SING_GOLDEN_NOTES=Gouden noten
+SING_PHRASE_BONUS=Regel bonus
+
+SING_MENU=Hoofdmenu
+
+SONG_SCORE=Nummer score
+SONG_SCORE_WHEREAMI=Score
+
+SING_SCORE_TONE_DEAF=Toon Doof
+SING_SCORE_AMATEUR=Amateur
+SING_SCORE_RISING_STAR=Beginnende Ster
+SING_SCORE_LEAD_SINGER=Hoofd Zanger
+SING_SCORE_HIT_ARTIST=Hit Artiest
+SING_SCORE_SUPERSTAR=Superster
+SING_SCORE_ULTRASTAR=Ultrastar
+
+SING_TOP_5_CHARTS=Top 5 Spelers
+SING_TOP_5_CHARTS_WHEREAMI=Top 5
+SING_TOP_5_CHARTS_CONTINUE=Naar de nummer selectie
+
+POPUP_PERFECT=perfect!
+POPUP_AWESOME=super!
+POPUP_GREAT=geweldig!
+POPUP_GOOD=goed!
+POPUP_NOTBAD=niet slecht!
+POPUP_BAD=slecht!
+POPUP_POOR=beroerd!
+POPUP_AWFUL=verschrikking!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= en
+
+SONG_MENU_NAME_MAIN=Nummer menu
+SONG_MENU_PLAY=Zing
+SONG_MENU_CHANGEPLAYERS=Verander spelers
+SONG_MENU_EDIT=Bewerken
+SONG_MENU_MODI=Zing modus
+SONG_MENU_CANCEL=Afbreken
+
+SONG_MENU_NAME_PLAYLIST=Nummer Menu
+SONG_MENU_PLAYLIST_ADD=Nummer toevoegen
+SONG_MENU_PLAYLIST_DEL=Nummer verwijderen
+
+SONG_MENU_NAME_PLAYLIST_ADD=Nummer toevoegen
+SONG_MENU_PLAYLIST_ADD_NEW=Nieuwe speellijst
+SONG_MENU_PLAYLIST_ADD_EXISTING=Afsluiten speellijst
+SONG_MENU_PLAYLIST_NOEXISTING=Geen speellijst aanwezig
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nieuwe speellijst
+SONG_MENU_PLAYLIST_NEW_CREATE=Creeër
+SONG_MENU_PLAYLIST_NEW_UNNAMED=geennaam
+
+SONG_MENU_NAME_PLAYLIST_DEL=Werkelijk verwijderen?
+SONG_MENU_YES=Ja
+SONG_MENU_NO=Nee
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Speellijst openen
+SONG_MENU_PLAYLIST_LOAD=Openen
+SONG_MENU_PLAYLIST_DELCURRENT=Verwijder huidige speellijst
+
+SONG_MENU_NAME_PLAYLIST_DEL=Verwijder speellijst?
+
+SONG_MENU_NAME_PARTY_MAIN=Party Menu
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=Gebruik joker
+
+SONG_JUMPTO_DESC=Zoek nummer
+SONG_JUMPTO_TYPE_DESC=Zoek naar:
+SONG_JUMPTO_TYPE1=Alles
+SONG_JUMPTO_TYPE2=Titel
+SONG_JUMPTO_TYPE3=Artiest
+SONG_JUMPTO_SONGSFOUND=%d Nummer(s) gevonden
+SONG_JUMPTO_NOSONGSFOUND=Geen nummers gevonden
+SONG_JUMPTO_HELP=Type tekst om te zoeken naar
+SONG_JUMPTO_CATTEXT=Zoek naar: %s
+
+PARTY_MODE=Party modus
+PARTY_DIFFICULTY=Moeilijkheidsgraad
+PARTY_PLAYLIST=Speellijst modus
+PARTY_PLAYLIST_ALL=Alle nummers
+PARTY_PLAYLIST_CATEGORY=Map
+PARTY_PLAYLIST_PLAYLIST=Speellijst
+PARTY_ROUNDS=Rondes
+PARTY_TEAMS=Teams
+PARTY_TEAMS_PLAYER1=Spelers Team1
+PARTY_TEAMS_PLAYER2=Spelers Team2
+PARTY_TEAMS_PLAYER3=Spelers Team3
+
+PARTY_LEGEND_CONTINUE=Verder
+
+PARTY_OPTIONS_DESC=Instellingen voor de party-spellen
+PARTY_OPTIONS_WHEREAMI=Party Opties
+
+PARTY_PLAYER_DESC=Type speler- en teamnamen!
+PARTY_PLAYER_WHEREAMI=Party Namen
+PARTY_PLAYER_ENTER_NAME=Type namen
+PARTY_PLAYER_LEGEND_CONTINUE=Start Party spel
+
+PARTY_ROUND_DESC=Volgende spelers naar de microfoons
+PARTY_ROUND_WHEREAMI=Party Volgende Ronde
+PARTY_ROUND_LEGEND_CONTINUE=Start ronde
+
+PARTY_SONG_WHEREAMI=Party nummer selectie
+PARTY_SONG_LEGEND_CONTINUE=Zing
+PARTY_SONG_MENU=Party menu
+
+PARTY_SCORE_DESC=scores van de laatste ronde
+PARTY_SCORE_WHEREAMI=Party Punten
+
+PARTY_WIN_DESC=winnaar van het party spel
+PARTY_WIN_WHEREAMI=Party Winnaar
+PARTY_WIN_LEGEND_CONTINUE=Terug naar het hoofdmenu
+
+PARTY_ROUND=Ronde
+PARTY_ROUND_WINNER=Winnaar
+PARTY_NOTPLAYEDYET=nog niet gespeeld
+PARTY_NOBODY=niemand
+NEXT_ROUND=Volgende ronde:
+
+PARTY_DISMISSED=Verworpen!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=gewonnen!
+
+PLUGIN_HDL_NAME=Houd de Regel
+PLUGIN_HDL_DESC=Zing niet slechter dan de wijzer in de zing-o-meter aangeeft
+
+PLUGIN_UNTIL5000_NAME=Tot 5000
+PLUGIN_UNTIL5000_DESC=Wie het eerst 5000 punten heeft wint het spel.
+
+PLUGIN_DUELL_NAME=Duel
+PLUGIN_DUELL_DESC=Zing een duel tot 10000 punten.
+
+PLUGIN_BLIND_NAME=Blinde Modus
+PLUGIN_BLIND_DESC=Duel zonder de dat je de noten ziet.
+
+STAT_MAIN=Statistieken
+STAT_MAIN_DESC=Algemeen
+STAT_MAIN_WHEREAMI=Statistieken
+
+STAT_OVERVIEW_INTRO=%0:s Statistieken. \n Laaste herstart was op %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d nummers(%3:d met Video), waarvan %1:d al zijn gespeeld en %2:d nog niet gespeeld.\n Het meest populaire nummer is %5:s van %4:s.
+STAT_OVERVIEW_PLAYER=Sinds de laatste herstart zijn er %0:d verschillende speler(s).\n De beste speler is %1:s met een gemiddelde score van %2:d punten.\n %3:s Heeft de hoogste Score behaald met %4:d punten.
+
+STAT_DETAIL=Statistieken
+STAT_DETAIL_WHEREAMI=Gedetaileerde statistieken
+
+STAT_NEXT=Volgende pagina
+STAT_PREV=Vorige pagina
+STAT_REVERSE=Anders om
+STAT_PAGE=Pagina %0:d van %1:d Pagina's\n (%2:d van %3:d records)
+
+STAT_DESC_SCORES=Hoogste scores
+STAT_DESC_SCORES_REVERSED=Laagste scores
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Beste Zangers
+STAT_DESC_SINGERS_REVERSED=Slechtste Zangers
+STAT_FORMAT_SINGERS=%0:s \n Gemiddelde score: %1:d
+
+STAT_DESC_SONGS=Populairste nummer
+STAT_DESC_SONGS_REVERSED=Minst populaire nummer
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx gezongen
+
+STAT_DESC_BANDS=Populairste artiest
+STAT_DESC_BANDS_REVERSED=Minst populaire artiest
+STAT_FORMAT_BANDS=%0:s \n %1:dx gezongen
+
+MSG_ERROR_TITLE=FOUT!
+MSG_QUESTION_TITLE=Vraag
+MSG_QUIT_USDX=Ultrastar afsluiten?
+MSG_END_PARTY=Party modus afsluiten?
+ERROR_NO_SONGS=Geen nummers geladen
+ERROR_NO_PLUGINS=Geen plugins geladen
+ERROR_CORRUPT_SONG=Nummer kan niet worden geladen. \ No newline at end of file
diff --git a/Languages/English.ini b/Languages/English.ini
new file mode 100644
index 00000000..dfc18fee
--- /dev/null
+++ b/Languages/English.ini
@@ -0,0 +1,302 @@
+[Text]
+SING_LOADING=Loading...
+
+SING_CHOOSE_MODE=choose mode
+SING_SING=sing
+SING_SING_DESC=quick game: sing solo or duet
+
+SING_MULTI=party
+SING_MULTI_DESC=sing in party-mode
+
+SING_TOOLS=tools
+
+SING_STATS=stats
+SING_STATS_DESC=view the statistics
+
+SING_EDITOR=editor
+SING_EDITOR_DESC=create your own songs
+
+SING_GAME_OPTIONS=game options
+SING_GAME_OPTIONS_DESC=change game settings
+
+SING_EXIT=quit
+SING_EXIT_DESC=quit game
+
+SING_OPTIONS=options
+SING_OPTIONS_DESC=change settings
+SING_OPTIONS_WHEREAMI=Options
+
+SING_OPTIONS_GAME=game
+SING_OPTIONS_GRAPHICS=graphics
+SING_OPTIONS_SOUND=sound
+SING_OPTIONS_LYRICS=lyrics
+SING_OPTIONS_THEMES=themes
+SING_OPTIONS_RECORD=record
+SING_OPTIONS_ADVANCED=advanced
+SING_OPTIONS_EXIT=back
+
+SING_OPTIONS_GAME_WHEREAMI=Options Game
+SING_OPTIONS_GAME_DESC=general game settings
+SING_OPTIONS_GAME_PLAYERS=Players
+SING_OPTIONS_GAME_DIFFICULTY=Difficulty
+SING_OPTIONS_GAME_LANGUAGE=Language
+SING_OPTIONS_GAME_TABS=Tabs
+SING_OPTIONS_GAME_SORTING=Sorting
+SING_OPTIONS_GAME_DEBUG=Debug
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Options Graphics
+SING_OPTIONS_GRAPHICS_DESC=graphic settings
+SING_OPTIONS_GRAPHICS_RESOLUTION=Resolution
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Fullscreen
+SING_OPTIONS_GRAPHICS_DEPTH=Depth
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Oscilloscope
+SING_OPTIONS_GRAPHICS_LINEBONUS=Line Bonus
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Movie size
+
+SING_OPTIONS_SOUND_WHEREAMI=Options Sound
+SING_OPTIONS_SOUND_DESC=sound settings
+SING_OPTIONS_SOUND_MIC_BOOST=Mic boost
+SING_OPTIONS_SOUND_CLICK_ASSIST=Click assist
+SING_OPTIONS_SOUND_BEAT_CLICK=Beat click
+SING_OPTIONS_SOUND_THRESHOLD=Threshold
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Two players mode
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Preview Volume
+SING_OPTIONS_SOUND_PREVIEWFADING=Preview Fading
+
+SING_OPTIONS_LYRICS_WHEREAMI=Options Lyrics
+SING_OPTIONS_LYRICS_DESC=lyrics settings
+SING_OPTIONS_LYRICS_FONT=Font
+SING_OPTIONS_LYRICS_EFFECT=Effect
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmization
+
+SING_OPTIONS_THEMES_WHEREAMI=Options Themes
+SING_OPTIONS_THEMES_DESC=theme and skin settings
+SING_OPTIONS_THEMES_THEME=Theme
+SING_OPTIONS_THEMES_SKIN=Skin
+SING_OPTIONS_THEMES_COLOR=Color
+
+SING_OPTIONS_RECORD_WHEREAMI=Options Record
+SING_OPTIONS_RECORD_DESC=microphone settings
+SING_OPTIONS_RECORD_CARD=Soundcard
+SING_OPTIONS_RECORD_INPUT=Input
+SING_OPTIONS_RECORD_CHANNELL=Left channel
+SING_OPTIONS_RECORD_CHANNELR=Right channel
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Options Advanced
+SING_OPTIONS_ADVANCED_DESC=advanced settings
+SING_OPTIONS_ADVANCED_EFFECTSING=Sing Effects
+SING_OPTIONS_ADVANCED_SCREENFADE=Screen Fading
+SING_OPTIONS_ADVANCED_LOADANIMATION=Load Animation
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Safety Questions
+SING_OPTIONS_ADVANCED_LINEBONUS=Line Bonus
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=after Song Select
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto PartyMenu
+
+SING_LEGEND_SELECT=select
+SING_LEGEND_NAVIGATE=navigate
+SING_LEGEND_CONTINUE=continue
+SING_LEGEND_ESC=back
+
+SING_PLAYER_DESC=enter player name/s
+SING_PLAYER_WHEREAMI=Playernames
+SING_PLAYER_ENTER_NAME=enter name
+
+SING_DIFFICULTY_DESC=select difficulty
+SING_DIFFICULTY_WHEREAMI=Difficulty
+SING_DIFFICULTY_CONTINUE=to song selection
+SING_EASY=Easy
+SING_MEDIUM=Medium
+SING_HARD=Hard
+
+SING_SONG_SELECTION_DESC=choose your song
+SING_SONG_SELECTION_WHEREAMI=Song Selection
+SING_SONG_SELECTION_GOTO=go to ..
+SING_SONG_SELECTION=song selection
+SING_SONG_SELECTION_MENU=menu
+SING_SONG_SELECTION_PLAYLIST=playlist
+SING_SONGS_IN_CAT=Songs
+PLAYLIST_CATTEXT=Playlist: %s
+
+SING_TIME=TIME
+SING_TOTAL=total
+SING_MODE=sing solo
+SING_NOTES=notes
+SING_GOLDEN_NOTES=golden notes
+SING_PHRASE_BONUS=line bonus
+
+SING_MENU=Main Menu
+
+SONG_SCORE=song score
+SONG_SCORE_WHEREAMI=Score
+
+SING_SCORE_TONE_DEAF=Tone Deaf
+SING_SCORE_AMATEUR=Amateur
+SING_SCORE_RISING_STAR=Rising Star
+SING_SCORE_LEAD_SINGER=Lead Singer
+SING_SCORE_HIT_ARTIST=Hit Artist
+SING_SCORE_SUPERSTAR=Superstar
+SING_SCORE_ULTRASTAR=Ultrastar
+
+SING_TOP_5_CHARTS=top 5 Players
+SING_TOP_5_CHARTS_WHEREAMI=top 5
+SING_TOP_5_CHARTS_CONTINUE=to song selection
+
+POPUP_PERFECT=perfect!
+POPUP_AWESOME=awesome!
+POPUP_GREAT=great!
+POPUP_GOOD=good!
+POPUP_NOTBAD=not bad!
+POPUP_BAD=bad!
+POPUP_POOR=poor!
+POPUP_AWFUL=awful!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= and
+
+SONG_MENU_NAME_MAIN=song menu
+SONG_MENU_PLAY=Sing
+SONG_MENU_CHANGEPLAYERS=Change Players
+SONG_MENU_EDIT=Edit
+SONG_MENU_MODI=Sing a Modi
+SONG_MENU_CANCEL=Cancel
+
+SONG_MENU_NAME_PLAYLIST=Song Menu
+SONG_MENU_PLAYLIST_ADD=Add Song
+SONG_MENU_PLAYLIST_DEL=Delete Song
+
+SONG_MENU_NAME_PLAYLIST_ADD=Add Song
+SONG_MENU_PLAYLIST_ADD_NEW=to new playlist
+SONG_MENU_PLAYLIST_ADD_EXISTING=to exsiting playlist
+SONG_MENU_PLAYLIST_NOEXISTING=No playlist available
+
+SONG_MENU_NAME_PLAYLIST_NEW=New Playlist
+SONG_MENU_PLAYLIST_NEW_CREATE=Create
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Unnamed
+
+SONG_MENU_NAME_PLAYLIST_DEL=Really Delete?
+SONG_MENU_YES=Yes
+SONG_MENU_NO=No
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Open Playlist
+SONG_MENU_PLAYLIST_LOAD=open
+SONG_MENU_PLAYLIST_DELCURRENT=delete current Playlist
+
+SONG_MENU_NAME_PLAYLIST_DEL=Delete Playlist?
+
+SONG_MENU_NAME_PARTY_MAIN=Party Menu
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=take joker
+
+SONG_JUMPTO_DESC=search song
+SONG_JUMPTO_TYPE_DESC=Search for:
+SONG_JUMPTO_TYPE1=All
+SONG_JUMPTO_TYPE2=Title
+SONG_JUMPTO_TYPE3=Artist
+SONG_JUMPTO_SONGSFOUND=%d Song(s) found
+SONG_JUMPTO_NOSONGSFOUND=No Song found
+SONG_JUMPTO_HELP=Type Text to Search for
+SONG_JUMPTO_CATTEXT=Search for: %s
+
+PARTY_MODE=party mode
+PARTY_DIFFICULTY=Difficulty
+PARTY_PLAYLIST=Playlist Mode
+PARTY_PLAYLIST_ALL=All songs
+PARTY_PLAYLIST_CATEGORY=Folder
+PARTY_PLAYLIST_PLAYLIST=Playlist
+PARTY_ROUNDS=Rounds
+PARTY_TEAMS=Teams
+PARTY_TEAMS_PLAYER1=Player Team1
+PARTY_TEAMS_PLAYER2=Player Team2
+PARTY_TEAMS_PLAYER3=Player Team3
+
+PARTY_LEGEND_CONTINUE=continue
+
+PARTY_OPTIONS_DESC=settings for the party-game
+PARTY_OPTIONS_WHEREAMI=Party Options
+
+PARTY_PLAYER_DESC=enter player- and teamnames!
+PARTY_PLAYER_WHEREAMI=Party Names
+PARTY_PLAYER_ENTER_NAME=enter names
+PARTY_PLAYER_LEGEND_CONTINUE=start party-game
+
+PARTY_ROUND_DESC=next players to the mics
+PARTY_ROUND_WHEREAMI=Party Next Round
+PARTY_ROUND_LEGEND_CONTINUE=start round
+
+PARTY_SONG_WHEREAMI=Party Song-Selection
+PARTY_SONG_LEGEND_CONTINUE=sing
+PARTY_SONG_MENU=party menu
+
+PARTY_SCORE_DESC=score of the last round
+PARTY_SCORE_WHEREAMI=Party Points
+
+PARTY_WIN_DESC=winner of the party-game
+PARTY_WIN_WHEREAMI=Party Winner
+PARTY_WIN_LEGEND_CONTINUE=back to main-menu
+
+PARTY_ROUND=Round
+PARTY_ROUND_WINNER=Winner
+PARTY_NOTPLAYEDYET=not played yet
+PARTY_NOBODY=nobody
+NEXT_ROUND=Next round:
+
+PARTY_DISMISSED=Dismissed!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=wins!
+
+PLUGIN_HDL_NAME=Hold the Line
+PLUGIN_HDL_DESC=Don't get worse than the pointer at the rating bar shows you.
+
+PLUGIN_UNTIL5000_NAME=Until 5000
+PLUGIN_UNTIL5000_DESC=Who gets 5000 points first wins the match.
+
+PLUGIN_DUELL_NAME=Duel
+PLUGIN_DUELL_DESC=Sing a duel until 10000 points.
+
+PLUGIN_TEAMDUELL_NAME=Team Duell
+PLUGIN_TEAMDUELL_DESC=Pass The Mic!
+
+PLUGIN_BLIND_NAME=Blind Mode
+PLUGIN_BLIND_DESC=Duel without seeing the notes.
+
+STAT_MAIN=Statistics
+STAT_MAIN_DESC=General
+STAT_MAIN_WHEREAMI=Statistics
+
+STAT_OVERVIEW_INTRO=%0:s Statistics. \n Last Reset at %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Songs(%3:d with Video), whereof %1:d already were played and %2:d were not played yet.\n The most popular Song is %5:s from %4:s.
+STAT_OVERVIEW_PLAYER=Since the last Reset there were/was %0:d different Player(s).\n The best Player is %1:s with an average Score of %2:d Points.\n %3:s did the highest Score with %4:d Points.
+
+STAT_DETAIL=Statistics
+STAT_DETAIL_WHEREAMI=Detail Statistics
+
+STAT_NEXT=Next Page
+STAT_PREV=Previous Page
+STAT_REVERSE=Reverse Order
+STAT_PAGE=Seite %0:d of %1:d Pages\n (%2:d of %3:d Entrys)
+
+STAT_DESC_SCORES=HighScores
+STAT_DESC_SCORES_REVERSED=LowScores
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Best Singers
+STAT_DESC_SINGERS_REVERSED=Worst Singers
+STAT_FORMAT_SINGERS=%0:s \n Average Score: %1:d
+
+STAT_DESC_SONGS=Most popular Songs
+STAT_DESC_SONGS_REVERSED=Least popular Songs
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx sung
+
+STAT_DESC_BANDS=Most popular Bands
+STAT_DESC_BANDS_REVERSED=Least popular Bands
+STAT_FORMAT_BANDS=%0:s \n %1:dx Sung
+
+MSG_ERROR_TITLE=Error
+MSG_QUESTION_TITLE=Question
+MSG_QUIT_USDX=Really leave UltraStar?
+MSG_END_PARTY=Really end Party Mode?
+ERROR_NO_SONGS=No Songs loaded
+ERROR_NO_PLUGINS=No Plugins loaded
+ERROR_CORRUPT_SONG=Song could not be loaded. \ No newline at end of file
diff --git a/Languages/Euskara.ini b/Languages/Euskara.ini
new file mode 100644
index 00000000..ed851806
--- /dev/null
+++ b/Languages/Euskara.ini
@@ -0,0 +1,298 @@
+[Text]
+SING_LOADING=Kargatzen...
+
+SING_CHOOSE_MODE=Aukeratu
+SING_SING=Kantatu
+SING_SING_DESC=Kantatu
+
+SING_MULTI=Taldea
+SING_MULTI_DESC=Taldean kantatu
+
+SING_TOOLS=Erremintak
+
+SING_STATS=Estatistikak
+SING_STATS_DESC=Estatistikak ikusi
+
+SING_EDITOR=Editorea
+SING_EDITOR_DESC=Zure kantuak sortu
+
+SING_GAME_OPTIONS=Aukerak
+SING_GAME_OPTIONS_DESC=Jokoaren aukerak aldatu
+
+SING_EXIT=Irten
+SING_EXIT_DESC=Jokotik irten
+
+SING_OPTIONS=Aukerak
+SING_OPTIONS_DESC=Aukerak aldatu
+SING_OPTIONS_WHEREAMI=Aukerak
+
+SING_OPTIONS_GAME=Jokoa
+SING_OPTIONS_GRAPHICS=Grafikoak
+SING_OPTIONS_SOUND=Soinua
+SING_OPTIONS_LYRICS=Letrak
+SING_OPTIONS_THEMES=Gaiak
+SING_OPTIONS_RECORD=Grabazioa
+SING_OPTIONS_ADVANCED=Aurreratuak
+SING_OPTIONS_EXIT=Itzuli
+
+SING_OPTIONS_GAME_WHEREAMI=Jokoaren aukerak
+SING_OPTIONS_GAME_DESC=Jokoaren aukera orokorrak
+SING_OPTIONS_GAME_PLAYERS=Jokalariak
+SING_OPTIONS_GAME_DIFFICULTY=Zailtasuna
+SING_OPTIONS_GAME_LANGUAGE=Hizkuntz
+SING_OPTIONS_GAME_TABS=Etiketa
+SING_OPTIONS_GAME_SORTING=Sailkatu
+SING_OPTIONS_GAME_DEBUG=Arazketa era
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Aukera grafikoak
+SING_OPTIONS_GRAPHICS_DESC=Aukera grafikoak
+SING_OPTIONS_GRAPHICS_RESOLUTION=Erresoluzioa
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Pantaila osoa
+SING_OPTIONS_GRAPHICS_DEPTH=Kolorearen kalitatea
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Osziloskopioa
+SING_OPTIONS_GRAPHICS_LINEBONUS=Bonus marra
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Bideoaren tamaina
+
+SING_OPTIONS_SOUND_WHEREAMI=Soinuaren aukerak
+SING_OPTIONS_SOUND_DESC=Soinuaren aukerak
+SING_OPTIONS_SOUND_MIC_BOOST=Mikrofonoa indartu
+SING_OPTIONS_SOUND_CLICK_ASSIST=Noten laguntza
+SING_OPTIONS_SOUND_BEAT_CLICK=Kolpeen laguntza
+SING_OPTIONS_SOUND_THRESHOLD=Mikrofonoa arindu
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Bi jokalariren era
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Bolumen aurreratua
+SING_OPTIONS_SOUND_PREVIEWFADING=Joanaldia
+
+SING_OPTIONS_LYRICS_WHEREAMI=Letren aukerak
+SING_OPTIONS_LYRICS_DESC=Letren aukerak
+SING_OPTIONS_LYRICS_FONT=Iturria
+SING_OPTIONS_LYRICS_EFFECT=Efektua
+SING_OPTIONS_LYRICS_SOLMIZATION=Solfeoa
+
+SING_OPTIONS_THEMES_WHEREAMI=Gaien aukerak
+SING_OPTIONS_THEMES_DESC=Gaien aukerak
+SING_OPTIONS_THEMES_THEME=Gaia
+SING_OPTIONS_THEMES_SKIN=Azala
+SING_OPTIONS_THEMES_COLOR=Kolorea
+
+SING_OPTIONS_RECORD_WHEREAMI=Grabazioaren aukerak
+SING_OPTIONS_RECORD_DESC=Grabazioaren akerak
+SING_OPTIONS_RECORD_CARD=Soinu txartela
+SING_OPTIONS_RECORD_INPUT=Captura
+SING_OPTIONS_RECORD_CHANNELL=Ezkerreko kanala
+SING_OPTIONS_RECORD_CHANNELR=Eskuineko kanala
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Aukera aurreratuak
+SING_OPTIONS_ADVANCED_DESC=Aukera aurreratuak
+SING_OPTIONS_ADVANCED_EFFECTSING=Kantuan efektuak
+SING_OPTIONS_ADVANCED_SCREENFADE=Desvanecimiento
+SING_OPTIONS_ADVANCED_LOADANIMATION=Kargatzearen animazioa
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Galdetu
+SING_OPTIONS_ADVANCED_LINEBONUS=Bonus marra
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Kantua aukeratzean
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Taldearen menu automatikoa
+
+SING_LEGEND_SELECT=Aukeratu
+SING_LEGEND_NAVIGATE=Nabigatu
+SING_LEGEND_CONTINUE=Jarraitu
+SING_LEGEND_ESC=Itzuli
+
+SING_PLAYER_DESC=Jokalarien izenak
+SING_PLAYER_WHEREAMI=Jokalarien izenak
+SING_PLAYER_ENTER_NAME=Izenak idatzi
+
+SING_DIFFICULTY_DESC=Zailtasuna aukeratu
+SING_DIFFICULTY_WHEREAMI=Zailtasuna
+SING_DIFFICULTY_CONTINUE=Hurrengoa
+SING_EASY=Erreza
+SING_MEDIUM=Ertaina
+SING_HARD=Zaila
+
+SING_SONG_SELECTION_DESC=Kantua hautatu
+SING_SONG_SELECTION_WHEREAMI=Kantuaren hautaketa
+SING_SONG_SELECTION_GOTO=Joan...
+SING_SONG_SELECTION=Kantuaren hautaketa
+SING_SONG_SELECTION_MENU=Menua
+SING_SONG_SELECTION_PLAYLIST=Zerrenda
+SING_SONGS_IN_CAT=Kantuak
+PLAYLIST_CATTEXT=Lista: %
+
+SING_TIME=Denbora
+SING_TOTAL=Guztira
+SING_MODE=Bakarrik
+SING_NOTES=Notak
+SING_GOLDEN_NOTES=Urrezko notak
+SING_PHRASE_BONUS=Bonus marra
+
+SING_MENU=Menu nagusia
+
+SONG_SCORE=Puntuak
+SONG_SCORE_WHEREAMI=
+
+SING_SCORE_TONE_DEAF=Desafinatu
+SING_SCORE_AMATEUR=Zale (Aficionado)
+SING_SCORE_RISING_STAR=Hobetzen
+SING_SCORE_LEAD_SINGER=Kantaria
+SING_SCORE_HIT_ARTIST=Kantari handia
+SING_SCORE_SUPERSTAR=Superizarra
+SING_SCORE_ULTRASTAR=Ultraizarra
+
+SING_TOP_5_CHARTS=Onenak
+SING_TOP_5_CHARTS_WHEREAMI=
+SING_TOP_5_CHARTS_CONTINUE=Jarraitu
+
+POPUP_PERFECT=Perfektu!
+POPUP_AWESOME=Txundigarri!
+POPUP_GREAT=Sekulakoa!
+POPUP_GOOD=Ongi!
+POPUP_NOTBAD=Ez dago gaizki!
+POPUP_BAD=Gaizki!
+POPUP_POOR=Oso gaizki!
+POPUP_AWFUL=Gaizkiago ezin!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= eta
+
+SONG_MENU_NAME_MAIN=Kantuaren menua
+SONG_MENU_PLAY=Kantatu
+SONG_MENU_CHANGEPLAYERS=Jokalaria aukeratu
+SONG_MENU_EDIT=Aldatu
+SONG_MENU_MODI=Motza kantatu
+SONG_MENU_CANCEL=Ezeztatu
+
+SONG_MENU_NAME_PLAYLIST=Menua
+SONG_MENU_PLAYLIST_ADD=Kantua gehitu
+SONG_MENU_PLAYLIST_DEL=Kantua kendu
+
+SONG_MENU_NAME_PLAYLIST_ADD=Kantua gehitu
+SONG_MENU_PLAYLIST_ADD_NEW=Zerrenda berrira
+SONG_MENU_PLAYLIST_ADD_EXISTING=Zerrendara
+SONG_MENU_PLAYLIST_NOEXISTING=Ez dago zerrendarik
+
+SONG_MENU_NAME_PLAYLIST_NEW=Zerrenda berria
+SONG_MENU_PLAYLIST_NEW_CREATE=Sortu
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Izen gabe
+
+SONG_MENU_NAME_PLAYLIST_DEL=Kendu?
+SONG_MENU_YES=Bai
+SONG_MENU_NO=Ez
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Zerrenda zabaldu
+SONG_MENU_PLAYLIST_LOAD=Zabaldu
+SONG_MENU_PLAYLIST_DELCURRENT=Zerrenda hau kendu
+SONG_MENU_NAME_PLAYLIST_DEL=Kendu?
+
+SONG_MENU_NAME_PARTY_MAIN=Menua
+SONG_MENU_JOKER=Aleatorio
+
+SONG_MENU_NAME_PARTY_JOKER=Aleatorio
+
+SONG_JUMPTO_DESC=Bilatu
+SONG_JUMPTO_TYPE_DESC=Bilatu:
+SONG_JUMPTO_TYPE1=Dena
+SONG_JUMPTO_TYPE2=Tituloa
+SONG_JUMPTO_TYPE3=Artista
+SONG_JUMPTO_SONGSFOUND=%d kantu aurkitu dira
+SONG_JUMPTO_NOSONGSFOUND=Ez daugo kanturik
+SONG_JUMPTO_HELP=Idatzi hitz gakoak
+SONG_JUMPTO_CATTEXT=Bilatu: %s
+
+PARTY_MODE=Taldeko modua
+PARTY_DIFFICULTY=Zailtasuna
+PARTY_PLAYLIST=Zerrenda modua
+PARTY_PLAYLIST_ALL=Dena
+PARTY_PLAYLIST_CATEGORY=Karpeta
+PARTY_PLAYLIST_PLAYLIST=Zerrendak
+PARTY_ROUNDS=Errondak
+PARTY_TEAMS=Taldeak
+PARTY_TEAMS_PLAYER1=1 taldeko jokalariak
+PARTY_TEAMS_PLAYER2=2 taldeko jokalariak
+PARTY_TEAMS_PLAYER3=3 taldeko jokalariak
+
+PARTY_LEGEND_CONTINUE=Jarraitu
+
+PARTY_OPTIONS_DESC=Taldeko jokoaren aukerak
+PARTY_OPTIONS_WHEREAMI=
+
+PARTY_PLAYER_DESC=Jokalarien eta taldeen izenak idatzi
+PARTY_PLAYER_WHEREAMI=Taldeen izenak
+PARTY_PLAYER_ENTER_NAME=Izena idatzi
+PARTY_PLAYER_LEGEND_CONTINUE=Hasi
+
+PARTY_ROUND_DESC=Hurrengo jokalaria
+PARTY_ROUND_WHEREAMI=Hurrngo erronda
+PARTY_ROUND_LEGEND_CONTINUE=Erronda hasi
+
+PARTY_SONG_WHEREAMI=Kantua aukeratu
+PARTY_SONG_LEGEND_CONTINUE=Kantatu
+PARTY_SONG_MENU=Menua
+
+PARTY_SCORE_DESC=Azkeneko errondaren puntoak
+PARTY_SCORE_WHEREAMI=
+
+PARTY_WIN_DESC=Talde irabazlea
+PARTY_WIN_WHEREAMI=
+PARTY_WIN_LEGEND_CONTINUE=Menu nagusira joan
+
+PARTY_ROUND=Erronda
+PARTY_ROUND_WINNER=Irabazlea
+PARTY_NOTPLAYEDYET=Jokatu gabe
+PARTY_NOBODY=Inor
+NEXT_ROUND=Hurrengo erronda:
+
+PARTY_DISMISSED=Galdu duzu!
+PARTY_SCORE_WINS=%
+PARTY_SCORE_WINS2=Irabazi duzu!
+
+PLUGIN_HDL_NAME=Jarraitu horrela
+PLUGIN_HDL_DESC=Ez jaitsi pantailan markatutako puntuak!
+
+PLUGIN_UNTIL5000_NAME=5000-arte
+PLUGIN_UNTIL5000_DESC=5000 puntu hartzen duena irabazle.
+
+PLUGIN_DUELL_NAME=Duelua
+PLUGIN_DUELL_DESC=Duelu bat egin 10.000 punturarte.
+
+PLUGIN_BLIND_NAME=Itsu modua
+PLUGIN_BLIND_DESC=Notak begiratu gabeko duelua.
+
+STAT_MAIN=Estadistikak
+STAT_MAIN_DESC=Orokorra
+STAT_MAIN_WHEREAMI=Estadistikak
+
+STAT_OVERVIEW_INTRO=%0:s Estatistikak. \n Azkenengo aldiz erabili zen: %3:d-%2:.2d-%1:.2d
+STAT_OVERVIEW_SONG=%0:d Kantu daude (%3:d bideoarekin), eta hauetatik %1:d kantatu dira eta %2:d oraindik ez.\n Kanturik ospetsuena "%5:s" da %4:s taldearena.
+STAT_OVERVIEW_PLAYER= %0:d jokalari daude.\n Onena %1:s da bataz-besteko %2:d punturekin.\n %3:s -(e)k puntu gehien egin ditu: %4:d puntu.
+
+STAT_DETAIL=Estatistikak
+STAT_DETAIL_WHEREAMI=Estatistika zehaztuak
+
+STAT_NEXT=Hurrengoa
+STAT_PREV=Aurrekoa
+STAT_REVERSE=Atzekoz aurrera jarri
+STAT_PAGE=Página %0:d de %1:d \n (%2:d of %3:d Entrys)
+
+STAT_DESC_SCORES=Punturik onenak
+STAT_DESC_SCORES_REVERSED=Punturik txarrenak
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Jokalari onenak
+STAT_DESC_SINGERS_REVERSED=Jokalari txarrenak
+STAT_FORMAT_SINGERS=%0:s \n Bataz-besteko puntuak: %1:d
+
+STAT_DESC_SONGS=Kantu ospetsuenak
+STAT_DESC_SONGS_REVERSED=Kantu ez ospetsuak
+STAT_FORMAT_SONGS=%0: - %1: \n %2: aldi kantatua
+
+STAT_DESC_BANDS=Talde ospetsuena
+STAT_DESC_BANDS_REVERSED=Ospe gutxieneko taldea
+STAT_FORMAT_BANDS=%0: \n %1:d aldi kantatua
+
+MSG_ERROR_TITLE=Errorea
+MSG_QUESTION_TITLE=Galdera
+MSG_QUIT_USDX=Irten nahi duzu?
+MSG_END_PARTY=Bukatu nahi duzu?
+ERROR_NO_SONGS=Kantu gabe
+ERROR_NO_PLUGINS=Plugin gabe
+ERROR_CORRUPT_SONG=Ezin da kantua kargatu \ No newline at end of file
diff --git a/Languages/French.ini b/Languages/French.ini
new file mode 100644
index 00000000..be9bf524
--- /dev/null
+++ b/Languages/French.ini
@@ -0,0 +1,300 @@
+[Text]
+SING_LOADING=Chargement...
+
+SING_CHOOSE_MODE=Choisir un mode
+SING_SING=Solo
+SING_SING_DESC=Chanter
+
+SING_MULTI=Multi
+SING_MULTI_DESC=Chanter à plusieurs
+
+SING_TOOLS=Outils
+
+SING_STATS=Statistiques
+SING_STATS_DESC=Consulter les statistiques
+
+SING_EDITOR=Éditeur
+SING_EDITOR_DESC=Créer vos propre chansons
+
+SING_GAME_OPTIONS=Options
+SING_GAME_OPTIONS_DESC=Modifier les paramètres du jeu
+
+SING_EXIT=Quitter
+SING_EXIT_DESC=Quitter le jeu
+
+SING_OPTIONS=Options
+SING_OPTIONS_DESC=Changer les paramètres
+SING_OPTIONS_WHEREAMI=Options
+
+SING_OPTIONS_GAME=Jeu
+SING_OPTIONS_GRAPHICS=Graphismes
+SING_OPTIONS_SOUND=Audio
+SING_OPTIONS_LYRICS=Paroles
+SING_OPTIONS_THEMES=Thèmes
+SING_OPTIONS_RECORD=Micros
+SING_OPTIONS_ADVANCED=Avancé
+SING_OPTIONS_EXIT=Retour
+
+SING_OPTIONS_GAME_WHEREAMI=Options de jeu
+SING_OPTIONS_GAME_DESC=Options générales de jeu
+SING_OPTIONS_GAME_PLAYERS=Joueurs
+SING_OPTIONS_GAME_DIFFICULTY=Difficulté
+SING_OPTIONS_GAME_LANGUAGE=Langue
+SING_OPTIONS_GAME_TABS=Dossier
+SING_OPTIONS_GAME_SORTING=Tri
+SING_OPTIONS_GAME_DEBUG=Débogage
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Options graphiques
+SING_OPTIONS_GRAPHICS_DESC=Paramètres des graphismes
+SING_OPTIONS_GRAPHICS_RESOLUTION=Résolution
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Plein écran
+SING_OPTIONS_GRAPHICS_DEPTH=Couleurs
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Oscilloscope
+SING_OPTIONS_GRAPHICS_LINEBONUS=Bonus de phrases
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Taille vidéo
+
+SING_OPTIONS_SOUND_WHEREAMI=Options de son
+SING_OPTIONS_SOUND_DESC=Paramètres de son
+SING_OPTIONS_SOUND_MIC_BOOST=Amplif. mic.
+SING_OPTIONS_SOUND_CLICK_ASSIST=Clics d'aide
+SING_OPTIONS_SOUND_BEAT_CLICK=Métronome
+SING_OPTIONS_SOUND_THRESHOLD=Suppression bruit
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Mode 2 joueurs
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Prévis. volume
+SING_OPTIONS_SOUND_PREVIEWFADING=Prévis. baisse
+
+SING_OPTIONS_LYRICS_WHEREAMI=Options de paroles
+SING_OPTIONS_LYRICS_DESC=Paramètres de paroles
+SING_OPTIONS_LYRICS_FONT=Caractères
+SING_OPTIONS_LYRICS_EFFECT=Effet
+SING_OPTIONS_LYRICS_SOLMIZATION=Afficher gamme
+
+SING_OPTIONS_THEMES_WHEREAMI=Options des thèmes
+SING_OPTIONS_THEMES_DESC=Paramètres des thèmes
+SING_OPTIONS_THEMES_THEME=Thèmes
+SING_OPTIONS_THEMES_SKIN=Aspect
+SING_OPTIONS_THEMES_COLOR=Couleur
+
+SING_OPTIONS_RECORD_WHEREAMI=Options d'enregistrement
+SING_OPTIONS_RECORD_DESC=Paramètres des micros
+SING_OPTIONS_RECORD_CARD=Carte son
+SING_OPTIONS_RECORD_INPUT=Entrée
+SING_OPTIONS_RECORD_CHANNELL=Canal gauche
+SING_OPTIONS_RECORD_CHANNELR=Canal droit
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Options avancées
+SING_OPTIONS_ADVANCED_DESC=Paramètres avancés
+SING_OPTIONS_ADVANCED_EFFECTSING=Effet de chant
+SING_OPTIONS_ADVANCED_SCREENFADE=Fondu écran
+SING_OPTIONS_ADVANCED_LOADANIMATION=Charge animation
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Confirm sup.
+SING_OPTIONS_ADVANCED_LINEBONUS=Bonus de phrases
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=Compteur de titres chantés
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Choix ap. chanson
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Menu multi auto
+
+SING_LEGEND_SELECT=Valider
+SING_LEGEND_NAVIGATE=Naviguer
+SING_LEGEND_CONTINUE=Valider
+SING_LEGEND_ESC=Retour
+
+SING_PLAYER_DESC=Entrer le nom du joueur
+SING_PLAYER_WHEREAMI=Nom du joueur
+SING_PLAYER_ENTER_NAME=Modifier
+
+SING_DIFFICULTY_DESC=Choisir le niveau de difficulté
+SING_DIFFICULTY_WHEREAMI=Difficulté
+SING_DIFFICULTY_CONTINUE=Valider
+SING_EASY=Facile
+SING_MEDIUM=Moyen
+SING_HARD=Difficile
+
+SING_SONG_SELECTION_DESC=Choisir une chanson
+SING_SONG_SELECTION_WHEREAMI=Sélection du titre
+SING_SONG_SELECTION_GOTO=Atteindre
+SING_SONG_SELECTION=Choix de chanson
+SING_SONG_SELECTION_MENU=Menu
+SING_SONG_SELECTION_PLAYLIST=Playlist
+SING_SONGS_IN_CAT=Chansons
+PLAYLIST_CATTEXT=Playlist: %s
+
+SING_TIME=TEMPS
+SING_TOTAL=Total
+SING_MODE=Mode
+SING_NOTES=Notes
+SING_GOLDEN_NOTES=Notes en or
+SING_PHRASE_BONUS=Bonus de phrases
+
+SING_MENU=Menu principal
+
+SONG_SCORE=Score
+SONG_SCORE_WHEREAMI=Points
+
+SING_SCORE_TONE_DEAF=Casserole
+SING_SCORE_AMATEUR=Amateur
+SING_SCORE_RISING_STAR=Star en herbe
+SING_SCORE_LEAD_SINGER=Artiste
+SING_SCORE_HIT_ARTIST=Révélation
+SING_SCORE_SUPERSTAR=Superstar
+SING_SCORE_ULTRASTAR=Ultrastar
+
+SING_TOP_5_CHARTS=Top 5
+SING_TOP_5_CHARTS_WHEREAMI=Meilleurs joueurs
+SING_TOP_5_CHARTS_CONTINUE=Continuer
+
+POPUP_PERFECT=Parfait !
+POPUP_AWESOME=Cool !
+POPUP_GREAT=Grandiose !
+POPUP_GOOD=Bien !
+POPUP_NOTBAD=O.K. !
+POPUP_BAD=Pas terrible !
+POPUP_POOR=Mauvais !
+POPUP_AWFUL=Nul !
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= et
+
+SONG_MENU_NAME_MAIN=Menu
+SONG_MENU_PLAY=Chanter
+SONG_MENU_CHANGEPLAYERS=Changer de joueur
+SONG_MENU_EDIT=Éditeur
+SONG_MENU_MODI=Chanter un mode
+SONG_MENU_CANCEL=Annuler
+
+SONG_MENU_NAME_PLAYLIST=Menu
+SONG_MENU_PLAYLIST_ADD=Ajouter une chanson
+SONG_MENU_PLAYLIST_DEL=Supprimer la chanson
+
+SONG_MENU_NAME_PLAYLIST_ADD=Ajouter chanson
+SONG_MENU_PLAYLIST_ADD_NEW=À la nouvelle playlist
+SONG_MENU_PLAYLIST_ADD_EXISTING=Ajouter à la playlist
+SONG_MENU_PLAYLIST_NOEXISTING=Pas de playlist
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nouvelle playlist
+SONG_MENU_PLAYLIST_NEW_CREATE=Créer
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Sans-nom
+
+SONG_MENU_NAME_PLAYLIST_DELITEM=Supprimer ?
+SONG_MENU_YES=Oui
+SONG_MENU_NO=Non
+
+SONG_MENU_NAME_PLAYLIST_DEL=Supprimer la playlist ?
+
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Ouvrir une playlist
+SONG_MENU_PLAYLIST_LOAD=Ouvrir
+SONG_MENU_PLAYLIST_DELCURRENT=Supprimer la playlist actuel
+
+SONG_MENU_NAME_PARTY_MAIN=Menu
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=Joker
+
+SONG_JUMPTO_DESC=Rechercher
+SONG_JUMPTO_TYPE_DESC=Recherche :
+SONG_JUMPTO_TYPE1=Tout
+SONG_JUMPTO_TYPE2=Titre
+SONG_JUMPTO_TYPE3=Artiste
+SONG_JUMPTO_SONGSFOUND=%d Chanson(s) trouvée(s)
+SONG_JUMPTO_NOSONGSFOUND=Aucune chanson trouvée
+SONG_JUMPTO_HELP=Entrer le texte à rechercher
+SONG_JUMPTO_CATTEXT=Recherche: %s
+
+PARTY_MODE=Mode multi
+PARTY_DIFFICULTY=Difficulté
+PARTY_PLAYLIST=Playlist
+PARTY_PLAYLIST_ALL=Toutes les chansons
+PARTY_PLAYLIST_CATEGORY=Dossier
+PARTY_PLAYLIST_PLAYLIST=Playlist
+PARTY_ROUNDS=Nbre manches
+PARTY_TEAMS=Nbre équipes
+PARTY_TEAMS_PLAYER1=Joueur(s) équipe 1
+PARTY_TEAMS_PLAYER2=Joueur(s) équipe 2
+PARTY_TEAMS_PLAYER3=Joueur(s) équipe 3
+
+PARTY_LEGEND_CONTINUE=Suivant
+
+PARTY_OPTIONS_DESC=Paramètres du mode multi
+PARTY_OPTIONS_WHEREAMI=Options du mode multi
+
+PARTY_PLAYER_DESC=Entrer le nom des équipes et des joueurs
+PARTY_PLAYER_WHEREAMI=Mode multi: Equipes
+PARTY_PLAYER_ENTER_NAME=Modifier
+PARTY_PLAYER_LEGEND_CONTINUE=Valider
+
+PARTY_ROUND_DESC=Joueurs suivants à vos micros !
+PARTY_ROUND_WHEREAMI=Mode multi: Manche suivante
+PARTY_ROUND_LEGEND_CONTINUE=Commencer
+
+PARTY_SONG_WHEREAMI=Mode multi: Choix de la chanson
+PARTY_SONG_LEGEND_CONTINUE=Chanter
+PARTY_SONG_MENU=Menu
+
+PARTY_SCORE_DESC=Score de la manche
+PARTY_SCORE_WHEREAMI=Mode multi: Score
+
+PARTY_WIN_DESC=Gagnant de la partie
+PARTY_WIN_WHEREAMI=Mode multi: Gagnant
+PARTY_WIN_LEGEND_CONTINUE=Retour au menu principal
+
+PARTY_ROUND=Manche
+PARTY_ROUND_WINNER=Gagnant
+PARTY_NOTPLAYEDYET=-
+PARTY_NOBODY=Personne ne
+NEXT_ROUND=Manche suivante:
+
+PARTY_DISMISSED=Rétrogradé
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=l'emporte !
+
+PLUGIN_HDL_NAME=Tiens la barre
+PLUGIN_HDL_DESC=Maintiens la jauge dans le secteur indiqué
+
+PLUGIN_UNTIL5000_NAME=A 5000
+PLUGIN_UNTIL5000_DESC=Le 1er qui atteint 5000 points remporte la manche
+
+PLUGIN_DUELL_NAME=Duel
+PLUGIN_DUELL_DESC=Le meilleur score remporte la manche
+
+PLUGIN_BLIND_NAME=A l'aveugle
+PLUGIN_BLIND_DESC=Obtiens le meilleur score sans regarder l'écran.
+
+STAT_MAIN=Statistiques
+STAT_MAIN_DESC=Général
+STAT_MAIN_WHEREAMI=Statistiques
+
+STAT_OVERVIEW_INTRO=Statistiques d'%0:s \n Dernière réinitialisation le %1:.2d.%2:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d chansons (%3:d avec vidéo)\n%1:d ont déjà été chantées une fois, %2:d pas encore. \n\n La chanson la plus chantée est %5:s de %4:s.
+STAT_OVERVIEW_PLAYER=%0:d joueurs différents ont chantés depuis la dernière réinitialisation . \n\n Le meilleur joueur est %1:s avec %2:d points. \n Meilleur score, %4:d, atteint par %3:s.
+
+STAT_DETAIL=Statistiques
+STAT_DETAIL_WHEREAMI=Statistiques détaillées
+
+STAT_NEXT=Page suiv.
+STAT_PREV=Page préc.
+STAT_REVERSE=Inverser
+STAT_PAGE=Page %0:d de %1:d \n (%2:d entrées sur %3:d)
+
+STAT_DESC_SCORES=Score
+STAT_DESC_SCORES_REVERSED=Pires scores
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Chanteurs
+STAT_DESC_SINGERS_REVERSED=Pires chanteurs
+STAT_FORMAT_SINGERS=%0:s \n Score moyen: %1:d
+
+STAT_DESC_SONGS=Chansons
+STAT_DESC_SONGS_REVERSED=Chansons impopulaires
+STAT_FORMAT_SONGS=%0:s - %1:s \n Chanté %2:dx
+
+STAT_DESC_BANDS=Artistes
+STAT_DESC_BANDS_REVERSED=Artistes impopulaires
+STAT_FORMAT_BANDS=%0:s \n Chansons chantées: %1:d
+
+MSG_ERROR_TITLE=Erreur
+MSG_QUESTION_TITLE=Confirmation
+MSG_QUIT_USDX=Quitter le jeu ?
+MSG_END_PARTY=Quitter la partie ?
+ERROR_NO_SONGS=Aucune chanson.
+ERROR_NO_PLUGINS=Aucun plugin.
+ERROR_CORRUPT_SONG=Impossible de charger la chanson. \ No newline at end of file
diff --git a/Languages/German.ini b/Languages/German.ini
new file mode 100644
index 00000000..99ac2d10
--- /dev/null
+++ b/Languages/German.ini
@@ -0,0 +1,303 @@
+[Text]
+SING_LOADING=Lade...
+
+SING_CHOOSE_MODE=Modus wählen
+SING_SING=Singen
+SING_SING_DESC=Singen
+
+SING_MULTI=Party
+SING_MULTI_DESC=Ein rundenbasierendes Teamspiel spielen
+
+SING_TOOLS=Tools
+
+SING_STATS=Statistiken
+SING_STATS_DESC=Die Statistiken anschauen
+
+SING_EDITOR=Editor
+SING_EDITOR_DESC=Mach deinen eigenen Song
+
+SING_GAME_OPTIONS=Spiel-Optionen
+SING_GAME_OPTIONS_DESC=Verändere die Spieleinstellungen
+
+SING_EXIT=Beenden
+SING_EXIT_DESC=Spiel verlassen
+
+SING_OPTIONS=Optionen
+SING_OPTIONS_DESC=Einstellungen verändern
+SING_OPTIONS_WHEREAMI=Optionen
+
+SING_OPTIONS_GAME=Spiel
+SING_OPTIONS_GRAPHICS=Grafik
+SING_OPTIONS_SOUND=Sound
+SING_OPTIONS_LYRICS=Lyrics
+SING_OPTIONS_THEMES=Themes
+SING_OPTIONS_RECORD=Aufnahme
+SING_OPTIONS_ADVANCED=Erweitert
+SING_OPTIONS_EXIT=zurück
+
+SING_OPTIONS_GAME_WHEREAMI=Optionen Spiel
+SING_OPTIONS_GAME_DESC=Allgemeine Spieleinstellungen
+SING_OPTIONS_GAME_PLAYERS=Spieler
+SING_OPTIONS_GAME_DIFFICULTY=Schwierigkeit
+SING_OPTIONS_GAME_LANGUAGE=Sprache
+SING_OPTIONS_GAME_TABS=Ordner
+SING_OPTIONS_GAME_SORTING=Sortierung
+SING_OPTIONS_GAME_DEBUG=Debug
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Optionen Grafik
+SING_OPTIONS_GRAPHICS_DESC=Einstellungen für die Grafik
+SING_OPTIONS_GRAPHICS_RESOLUTION=Auflösung
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Vollbild
+SING_OPTIONS_GRAPHICS_DEPTH=Farbtiefe
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Oszilloskop
+SING_OPTIONS_GRAPHICS_LINEBONUS=Phrasenbonus
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Videogröße
+
+SING_OPTIONS_SOUND_WHEREAMI=Optionen Sound
+SING_OPTIONS_SOUND_DESC=Einstellungen für den Sound
+SING_OPTIONS_SOUND_MIC_BOOST=Mic-Anhebung
+SING_OPTIONS_SOUND_CLICK_ASSIST=Click-Assistent
+SING_OPTIONS_SOUND_BEAT_CLICK=Beat-Click
+SING_OPTIONS_SOUND_THRESHOLD=Rauschunterdr.
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=2-Spieler-Modus
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Vorschau Lautst.
+SING_OPTIONS_SOUND_PREVIEWFADING=Vorschau Fading
+
+SING_OPTIONS_LYRICS_WHEREAMI=Optionen Lyrics
+SING_OPTIONS_LYRICS_DESC=Einstellungen für die Lyrics
+SING_OPTIONS_LYRICS_FONT=Schriftart
+SING_OPTIONS_LYRICS_EFFECT=Effekt
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmisation
+
+SING_OPTIONS_THEMES_WHEREAMI=Optionen Themes
+SING_OPTIONS_THEMES_DESC=Einstellungen für Theme und Skin
+SING_OPTIONS_THEMES_THEME=Theme
+SING_OPTIONS_THEMES_SKIN=Skin
+SING_OPTIONS_THEMES_COLOR=Farbe
+
+SING_OPTIONS_RECORD_WHEREAMI=Optionen Aufnahme
+SING_OPTIONS_RECORD_DESC=Einstellungen für die Mikrofone
+SING_OPTIONS_RECORD_CARD=Soundkarte
+SING_OPTIONS_RECORD_INPUT=Eingang
+SING_OPTIONS_RECORD_CHANNELL=Linker Kanal
+SING_OPTIONS_RECORD_CHANNELR=Rechter Kanal
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Optionen Erweitert
+SING_OPTIONS_ADVANCED_DESC=Erweiterte Einstellungen
+SING_OPTIONS_ADVANCED_EFFECTSING=Singeffekte
+SING_OPTIONS_ADVANCED_SCREENFADE=Bildschirm-Fade
+SING_OPTIONS_ADVANCED_LOADANIMATION=Lade-Animation
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Sicherheitsabfr.
+SING_OPTIONS_ADVANCED_LINEBONUS=Phrasenbonus
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=Wie oft gesungen mitzählen
+SING_OPTIONS_ADVANCED_ONSONGCLICK=nach Song-Wahl
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto Party-Menü
+
+SING_LEGEND_SELECT=Auswählen
+SING_LEGEND_NAVIGATE=Navigieren
+SING_LEGEND_CONTINUE=Weiter
+SING_LEGEND_ESC=Zurück
+
+SING_PLAYER_DESC=Spielernamen eingeben.
+SING_PLAYER_WHEREAMI=Spielernamen
+SING_PLAYER_ENTER_NAME=Namen eingeben
+
+SING_DIFFICULTY_DESC=Schwierigkeitsgrad auswählen
+SING_DIFFICULTY_WHEREAMI=Schwierigkeitsgrad
+SING_DIFFICULTY_CONTINUE=zur Song-Auswahl
+SING_EASY=Einfach
+SING_MEDIUM=Mittel
+SING_HARD=Schwierig
+
+SING_SONG_SELECTION_DESC=Wähle deinen Song
+SING_SONG_SELECTION_WHEREAMI=Song-Auswahl
+SING_SONG_SELECTION_GOTO=Gehe zu ..
+SING_SONG_SELECTION=Song-Auswahl
+SING_SONG_SELECTION_MENU=Menü
+SING_SONG_SELECTION_PLAYLIST=Playlist
+SING_SONGS_IN_CAT=Songs
+PLAYLIST_CATTEXT=Playlist: %s
+
+SING_TIME=ZEIT
+SING_TOTAL=Gesamt
+SING_MODE=Singmodus
+SING_NOTES=Noten
+SING_GOLDEN_NOTES=Goldener Ton
+SING_PHRASE_BONUS=Phrasenbonus
+
+SING_MENU=Hauptmenü
+
+SONG_SCORE=Song Punkte
+SONG_SCORE_WHEREAMI=Punkte
+
+SING_SCORE_TONE_DEAF=Anti-Talent
+SING_SCORE_AMATEUR=Amateur
+SING_SCORE_RISING_STAR=Möchtegern
+SING_SCORE_LEAD_SINGER=Sternchen
+SING_SCORE_HIT_ARTIST=Hit-Künstler
+SING_SCORE_SUPERSTAR=Superstar
+SING_SCORE_ULTRASTAR=UltraStar
+
+SING_TOP_5_CHARTS=Top-5-Spieler
+SING_TOP_5_CHARTS_WHEREAMI=Top-5
+SING_TOP_5_CHARTS_CONTINUE=zur Song-Auswahl
+
+POPUP_PERFECT=Perfekt!
+POPUP_AWESOME=Cool!
+POPUP_GREAT=Gut!
+POPUP_GOOD=Gut!
+POPUP_NOTBAD=O.K.!
+POPUP_BAD=Schlecht!
+POPUP_POOR=Mies!
+POPUP_AWFUL=Grausam!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= und
+
+SONG_MENU_NAME_MAIN=Menü
+SONG_MENU_PLAY=Singen
+SONG_MENU_CHANGEPLAYERS=Spieler Wechseln
+SONG_MENU_EDIT=Editor
+SONG_MENU_MODI=Einen Modus singen
+SONG_MENU_CANCEL=Abbrechen
+
+SONG_MENU_NAME_PLAYLIST=Menü
+SONG_MENU_PLAYLIST_ADD=Song hinzufügen
+SONG_MENU_PLAYLIST_DEL=Song löschen
+
+SONG_MENU_NAME_PLAYLIST_ADD=Song hinzufügen
+SONG_MENU_PLAYLIST_ADD_NEW=Zu neuer Playlist
+SONG_MENU_PLAYLIST_ADD_EXISTING=Zu existierender Playlist
+SONG_MENU_PLAYLIST_NOEXISTING=Keine Playlist vorhanden
+
+SONG_MENU_NAME_PLAYLIST_NEW=Neue Playlist
+SONG_MENU_PLAYLIST_NEW_CREATE=Erstellen
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Unbenannt
+
+SONG_MENU_NAME_PLAYLIST_DELITEM=Wirklich löschen?
+SONG_MENU_YES=Ja
+SONG_MENU_NO=Nein
+
+SONG_MENU_NAME_PLAYLIST_DEL=Playlist löschen?
+
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Playlist öffnen
+SONG_MENU_PLAYLIST_LOAD=Öffnen
+SONG_MENU_PLAYLIST_DELCURRENT=Aktuelle Playlist löschen
+
+SONG_MENU_NAME_PARTY_MAIN=Party-Menü
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=Joker spielen
+
+SONG_JUMPTO_DESC=Song suchen
+SONG_JUMPTO_TYPE_DESC=Suchen in:
+SONG_JUMPTO_TYPE1=Allem
+SONG_JUMPTO_TYPE2=Titel
+SONG_JUMPTO_TYPE3=Artist
+SONG_JUMPTO_SONGSFOUND=%d Song(s) gefunden
+SONG_JUMPTO_NOSONGSFOUND=Keinen Song gefunden
+SONG_JUMPTO_HELP=Text eingeben um zu suchen
+SONG_JUMPTO_CATTEXT=Suche nach: %s
+
+PARTY_MODE=Party-Modus
+PARTY_DIFFICULTY=Schwierigkeit
+PARTY_PLAYLIST=Playlist-Modus
+PARTY_PLAYLIST_ALL=Alle Lieder
+PARTY_PLAYLIST_CATEGORY=Ordner
+PARTY_PLAYLIST_PLAYLIST=Playlist
+PARTY_ROUNDS=Runden
+PARTY_TEAMS=Teams
+PARTY_TEAMS_PLAYER1=Spieler Team 1
+PARTY_TEAMS_PLAYER2=Spieler Team 2
+PARTY_TEAMS_PLAYER3=Spieler Team 3
+
+PARTY_LEGEND_CONTINUE=weiter
+
+PARTY_OPTIONS_DESC=Einstellungen für das Partyspiel.
+PARTY_OPTIONS_WHEREAMI=Party Optionen
+
+PARTY_PLAYER_DESC=Team- und Spielernamen eingeben.
+PARTY_PLAYER_WHEREAMI=Party Spielernamen
+PARTY_PLAYER_ENTER_NAME=Namen eingeben
+PARTY_PLAYER_LEGEND_CONTINUE=Party-Spiel starten
+
+PARTY_ROUND_DESC=Die nächsten Spieler an die Mikros!
+PARTY_ROUND_WHEREAMI=Party nächste Runde
+PARTY_ROUND_LEGEND_CONTINUE=Runde starten
+
+PARTY_SONG_WHEREAMI=Party Song-Auswahl
+PARTY_SONG_LEGEND_CONTINUE=Singen
+PARTY_SONG_MENU=Party-Menü
+
+PARTY_SCORE_DESC=Punkte der letzten Runde.
+PARTY_SCORE_WHEREAMI=Party Punkte
+
+PARTY_WIN_DESC=Gewinner des Partyspiels.
+PARTY_WIN_WHEREAMI=Party Gewinner
+PARTY_WIN_LEGEND_CONTINUE=zurück zum Hauptmenü
+
+PARTY_ROUND=Runde
+PARTY_ROUND_WINNER=Sieger
+PARTY_NOTPLAYEDYET=Noch nicht gespielt
+PARTY_NOBODY=Niemand
+NEXT_ROUND=Nächste Runde:
+
+PARTY_DISMISSED=Ausgeschieden
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=hat gewonnen!
+
+PLUGIN_HDL_NAME=Balken halten
+PLUGIN_HDL_DESC=Halte die Bewertungsanzeige im angezeigten Bereich.
+
+PLUGIN_UNTIL5000_NAME=Bis 5000
+PLUGIN_UNTIL5000_DESC=Wer zuerst 5000 Punkte hat, gewinnt.
+
+PLUGIN_DUELL_NAME=Duell
+PLUGIN_DUELL_DESC=Normales Spiel. Höchste Punktzahl gewinnt.
+
+PLUGIN_BLIND_NAME=Blind Mode
+PLUGIN_BLIND_DESC=Erreiche blind die höchste Punktzahl.
+
+PLUGIN_TEAMDUELL_NAME=Teamsingen
+PLUGIN_TEAMDUELL_DESC=Gib das Mikro weiter!
+
+STAT_MAIN=Statistiken
+STAT_MAIN_DESC=Allgemein
+STAT_MAIN_WHEREAMI=Statistiken
+
+STAT_OVERVIEW_INTRO=%0:s Statistiken. \n Letzter Reset am %1:.2d.%2:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Songs(%3:d mit Video), davon wurden %1:d schon einmal gesungen und %2:d noch nicht. \n Der am häufigsten gesungene Song ist %5:s von %4:s.
+STAT_OVERVIEW_PLAYER=Seit dem letzten Reset haben %0:d verschiedene Spieler gesungen. \n Der beste Spieler ist %1:s mit %2:d Punkten. \n Die höchste Punktzahl, %4:d, wurde von %3:s erreicht.
+
+STAT_DETAIL=Statistiken
+STAT_DETAIL_WHEREAMI=Detaillierte Statistiken
+
+STAT_NEXT=Nächste Seite
+STAT_PREV=Vorherige Seite
+STAT_REVERSE=Umkehren
+STAT_PAGE=Seite %0:d von %1:d \n (%2:d von %3:d Einträgen)
+
+STAT_DESC_SCORES=Highscores
+STAT_DESC_SCORES_REVERSED=Lowscores
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Beste Sänger
+STAT_DESC_SINGERS_REVERSED=Schlechteste Sänger
+STAT_FORMAT_SINGERS=%0:s \n Durchschnittliche Punktzahl: %1:d
+
+STAT_DESC_SONGS=Beliebteste Songs
+STAT_DESC_SONGS_REVERSED=Unbeliebteste Songs
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx gesungen
+
+STAT_DESC_BANDS=Beliebteste Bands
+STAT_DESC_BANDS_REVERSED=Unbeliebteste Bands
+STAT_FORMAT_BANDS=%0:s \n Gesungene Songs: %1:d
+
+MSG_ERROR_TITLE=Fehler
+MSG_QUESTION_TITLE=Frage
+MSG_QUIT_USDX=UltraStar wirklich verlassen?
+MSG_END_PARTY=Party-Modus beenden?
+ERROR_NO_SONGS=Keine Songs vorhanden.
+ERROR_NO_PLUGINS=Keine Plugins vorhanden.
+ERROR_CORRUPT_SONG=Song konnte nicht geladen werden. \ No newline at end of file
diff --git a/Languages/Italian.ini b/Languages/Italian.ini
new file mode 100644
index 00000000..06c0e550
--- /dev/null
+++ b/Languages/Italian.ini
@@ -0,0 +1,299 @@
+[Text]
+SING_LOADING=Caricamento...
+
+SING_CHOOSE_MODE=scegli modalita'
+SING_SING=canto
+SING_SING_DESC=partita rapida: canta da solo o in duetto
+
+SING_MULTI=party
+SING_MULTI_DESC=canta in modalita' party
+
+SING_TOOLS=strumenti
+
+SING_STATS=statistiche
+SING_STATS_DESC=visualizza le statistiche
+
+SING_EDITOR=editor
+SING_EDITOR_DESC=crea nuove canzoni
+
+SING_GAME_OPTIONS=opzioni di gioco
+SING_GAME_OPTIONS_DESC=cambia le impostazioni di gioco
+
+SING_EXIT=esci
+SING_EXIT_DESC=esci dal gioco
+
+SING_OPTIONS=opzioni
+SING_OPTIONS_DESC=cambia le impostazioni
+SING_OPTIONS_WHEREAMI=Opzioni
+
+SING_OPTIONS_GAME=gioco
+SING_OPTIONS_GRAPHICS=grafica
+SING_OPTIONS_SOUND=sonoro
+SING_OPTIONS_LYRICS=testi
+SING_OPTIONS_THEMES=temi
+SING_OPTIONS_RECORD=registrazione
+SING_OPTIONS_ADVANCED=avanzate
+SING_OPTIONS_EXIT=indietro
+
+SING_OPTIONS_GAME_WHEREAMI=Opzioni Gioco
+SING_OPTIONS_GAME_DESC=impostazioni di gioco generali
+SING_OPTIONS_GAME_PLAYERS=Giocatori
+SING_OPTIONS_GAME_DIFFICULTY=Difficolta'
+SING_OPTIONS_GAME_LANGUAGE=Lingua
+SING_OPTIONS_GAME_TABS=Tab
+SING_OPTIONS_GAME_SORTING=Catalogazione
+SING_OPTIONS_GAME_DEBUG=Debug
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Opzioni Grafica
+SING_OPTIONS_GRAPHICS_DESC=impostazioni della grafica
+SING_OPTIONS_GRAPHICS_RESOLUTION=Risoluzione
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Schermo intero
+SING_OPTIONS_GRAPHICS_DEPTH=Profondita' Colore
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Oscilloscopio
+SING_OPTIONS_GRAPHICS_LINEBONUS=Bonus Linea
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Dimensione video
+
+SING_OPTIONS_SOUND_WHEREAMI=Opzioni Sonoro
+SING_OPTIONS_SOUND_DESC=impostazioni del sonoro
+SING_OPTIONS_SOUND_MIC_BOOST=Boost microfono
+SING_OPTIONS_SOUND_CLICK_ASSIST=Click aiuto
+SING_OPTIONS_SOUND_BEAT_CLICK=Click battuta
+SING_OPTIONS_SOUND_THRESHOLD=Tolleranza
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Modalita' due giocatori
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Volume Anteprima
+SING_OPTIONS_SOUND_PREVIEWFADING=Dissolvenza Ant.
+
+SING_OPTIONS_LYRICS_WHEREAMI=Opzioni Testi
+SING_OPTIONS_LYRICS_DESC=impostazioni dei testi
+SING_OPTIONS_LYRICS_FONT=Carattere
+SING_OPTIONS_LYRICS_EFFECT=Effetto
+SING_OPTIONS_LYRICS_SOLMIZATION=Solfeggio
+
+SING_OPTIONS_THEMES_WHEREAMI=Opzioni Temi
+SING_OPTIONS_THEMES_DESC=impostazioni temi e maschere
+SING_OPTIONS_THEMES_THEME=Tema
+SING_OPTIONS_THEMES_SKIN=Maschera
+SING_OPTIONS_THEMES_COLOR=Colore
+
+SING_OPTIONS_RECORD_WHEREAMI=Opzioni Registrazione
+SING_OPTIONS_RECORD_DESC=impostazioni del microfono
+SING_OPTIONS_RECORD_CARD=Scheda audio
+SING_OPTIONS_RECORD_INPUT=Ingresso
+SING_OPTIONS_RECORD_CHANNELL=Canale sinistro
+SING_OPTIONS_RECORD_CHANNELR=Canale destro
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Options Avanzate
+SING_OPTIONS_ADVANCED_DESC=impostazioni avanzate
+SING_OPTIONS_ADVANCED_EFFECTSING=Effetti cantato
+SING_OPTIONS_ADVANCED_SCREENFADE=Dissolvenza
+SING_OPTIONS_ADVANCED_LOADANIMATION=Carica Animazione
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Conferme
+SING_OPTIONS_ADVANCED_LINEBONUS=Bonus di linea
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=se Sel. Canzone
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto MenuParty
+
+SING_LEGEND_SELECT=seleziona
+SING_LEGEND_NAVIGATE=naviga
+SING_LEGEND_CONTINUE=continua
+SING_LEGEND_ESC=indietro
+
+SING_PLAYER_DESC=inserisci nome giocatore/i
+SING_PLAYER_WHEREAMI=Nomigiocatori
+SING_PLAYER_ENTER_NAME=inserisci nome
+
+SING_DIFFICULTY_DESC=seleziona difficolta'
+SING_DIFFICULTY_WHEREAMI=Difficolta'
+SING_DIFFICULTY_CONTINUE=a selezione canzone
+SING_EASY=Facile
+SING_MEDIUM=Medio
+SING_HARD=Difficile
+
+SING_SONG_SELECTION_DESC=scegli la tua canzone
+SING_SONG_SELECTION_WHEREAMI=Seleziona Canzone
+SING_SONG_SELECTION_GOTO=vai a...
+SING_SONG_SELECTION=selezione canzone
+SING_SONG_SELECTION_MENU=menu
+SING_SONG_SELECTION_PLAYLIST=playlist
+SING_SONGS_IN_CAT=Canzoni
+PLAYLIST_CATTEXT=Playlist: %s
+
+SING_TIME=TEMPO
+SING_TOTAL=totale
+SING_MODE=canto da solo
+SING_NOTES=note
+SING_GOLDEN_NOTES=note d'oro
+SING_PHRASE_BONUS=bonus di linea
+
+SING_MENU=Menu Principale
+
+SONG_SCORE=punteggio canzoni
+SONG_SCORE_WHEREAMI=Punteggio
+
+SING_SCORE_TONE_DEAF=Campana
+SING_SCORE_AMATEUR=Dilettante
+SING_SCORE_RISING_STAR=Stella nascente
+SING_SCORE_LEAD_SINGER=Cantante solista
+SING_SCORE_HIT_ARTIST=Artista di successo
+SING_SCORE_SUPERSTAR=Superstar
+SING_SCORE_ULTRASTAR=Ultrastar
+
+SING_TOP_5_CHARTS=i migliori 5 giocatori
+SING_TOP_5_CHARTS_WHEREAMI=i migliori 5
+SING_TOP_5_CHARTS_CONTINUE=a selezione canzone
+
+POPUP_PERFECT=perfetto!
+POPUP_AWESOME=fantastico!
+POPUP_GREAT=grande!
+POPUP_GOOD=bene!
+POPUP_NOTBAD=non male!
+POPUP_BAD=male!
+POPUP_POOR=pessimo!
+POPUP_AWFUL=disastroso!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= e
+
+SONG_MENU_NAME_MAIN=menu canzone
+SONG_MENU_PLAY=Canta
+SONG_MENU_CHANGEPLAYERS=Cambia giocatori
+SONG_MENU_EDIT=Modifica
+SONG_MENU_MODI=Canta un Modi
+SONG_MENU_CANCEL=Cancella
+
+SONG_MENU_NAME_PLAYLIST=Menu Canzone
+SONG_MENU_PLAYLIST_ADD=Aggiungi Canzone
+SONG_MENU_PLAYLIST_DEL=Elimina Canzone
+
+SONG_MENU_NAME_PLAYLIST_ADD=Aggiungi Canzone
+SONG_MENU_PLAYLIST_ADD_NEW=a playlist nuova
+SONG_MENU_PLAYLIST_ADD_EXISTING=a playlist esistente
+SONG_MENU_PLAYLIST_NOEXISTING=Nessuna playlist disponibile
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nuova Playlist
+SONG_MENU_PLAYLIST_NEW_CREATE=Crea
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Senza nome
+
+SONG_MENU_NAME_PLAYLIST_DEL=Confermi l'eliminazione?
+SONG_MENU_YES=Si'
+SONG_MENU_NO=No
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Apri Playlist
+SONG_MENU_PLAYLIST_LOAD=apri
+SONG_MENU_PLAYLIST_DELCURRENT=elimina Playlist corrente
+
+SONG_MENU_NAME_PLAYLIST_DEL=Elimina Playlist?
+
+SONG_MENU_NAME_PARTY_MAIN=Menu Party
+SONG_MENU_JOKER=Jolly
+
+SONG_MENU_NAME_PARTY_JOKER=pesca jolly
+
+SONG_JUMPTO_DESC=cerca canzoni
+SONG_JUMPTO_TYPE_DESC=Cerca Per:
+SONG_JUMPTO_TYPE1=Tutto
+SONG_JUMPTO_TYPE2=Titolo
+SONG_JUMPTO_TYPE3=Artista
+SONG_JUMPTO_SONGSFOUND=%d Risultati
+SONG_JUMPTO_NOSONGSFOUND=Nessun risultato
+SONG_JUMPTO_HELP=Digita il Testo da Cercare
+SONG_JUMPTO_CATTEXT=Cerca per: %s
+
+PARTY_MODE=modalita' party
+PARTY_DIFFICULTY=Difficolta'
+PARTY_PLAYLIST=Modalita' Playlist
+PARTY_PLAYLIST_ALL=Tutte le canzoni
+PARTY_PLAYLIST_CATEGORY=Cartella
+PARTY_PLAYLIST_PLAYLIST=Playlist
+PARTY_ROUNDS=Turni
+PARTY_TEAMS=Squadre
+PARTY_TEAMS_PLAYER1=Giocatori Sq.1
+PARTY_TEAMS_PLAYER2=Giocatori Sq.2
+PARTY_TEAMS_PLAYER3=Giocatori Sq.3
+
+PARTY_LEGEND_CONTINUE=continua
+
+PARTY_OPTIONS_DESC=impostazione per il gioco-party
+PARTY_OPTIONS_WHEREAMI=Opzioni Party
+
+PARTY_PLAYER_DESC=inserisci nome giocatore e squadra!
+PARTY_PLAYER_WHEREAMI=Nomi Party
+PARTY_PLAYER_ENTER_NAME=inserisci nomi
+PARTY_PLAYER_LEGEND_CONTINUE=inizia gioco-party
+
+PARTY_ROUND_DESC=prossimi giocatori ai microfoni
+PARTY_ROUND_WHEREAMI=Party Turno Successivo
+PARTY_ROUND_LEGEND_CONTINUE=Comincia turno
+
+PARTY_SONG_WHEREAMI=Party Selezione-Canzone
+PARTY_SONG_LEGEND_CONTINUE=canta
+PARTY_SONG_MENU=menu party
+
+PARTY_SCORE_DESC=punteggio dell'ultimo turno
+PARTY_SCORE_WHEREAMI=Punti Party
+
+PARTY_WIN_DESC=vincitore del gioco-party
+PARTY_WIN_WHEREAMI=Party Vincitore
+PARTY_WIN_LEGEND_CONTINUE=torna al menu principale
+
+PARTY_ROUND=Turno
+PARTY_ROUND_WINNER=Vincitore
+PARTY_NOTPLAYEDYET=non ancora giocato
+PARTY_NOBODY=nessuno
+NEXT_ROUND=Prossimo Turno:
+
+PARTY_DISMISSED=Scaricato!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=vince!
+
+PLUGIN_HDL_NAME=Tieni la linea
+PLUGIN_HDL_DESC=Non far peggio di quanto ti mostra il puntatore nella barra di giudizio.
+
+PLUGIN_UNTIL5000_NAME=Fino a 5000
+PLUGIN_UNTIL5000_DESC=Chi raggiunge per primo 5000 punti vince la partita.
+
+PLUGIN_DUELL_NAME=Duello
+PLUGIN_DUELL_DESC=Canta un duello fino a 10000 points.
+
+PLUGIN_BLIND_NAME=Modalita' cieco
+PLUGIN_BLIND_DESC=Duella senza vedere le note.
+
+STAT_MAIN=Statistiche
+STAT_MAIN_DESC=Generale
+STAT_MAIN_WHEREAMI=Statistiche
+
+STAT_OVERVIEW_INTRO=%0:s Statistiche. \n Ultimo azzeramento alle %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Canzoni(%3:d con Video), delle quali %1:d gia' suonate e %2:d non ancora suonate.\n La Canzone piu' popolare e' %5:s di %4:s.
+STAT_OVERVIEW_PLAYER=Dall'ultimo azzeramento ci sono stati %0:d diversi giocatori.\n Il Miglior Giocatore e' %1:s con un Punteggio medio di %2:d Punti.\n %3:s ha ottenuto il punteggio piu' alto con %4:d Punti.
+
+STAT_DETAIL=Statistiche
+STAT_DETAIL_WHEREAMI=Dettagli Statistiche
+
+STAT_NEXT=Pag. Successiva
+STAT_PREV=Pag. Precedente
+STAT_REVERSE=Inverti Ordine
+STAT_PAGE=Seite Pagina %0:d di %1:d \n (Dato %2:d di %3:d)
+
+STAT_DESC_SCORES=Punti Massimi
+STAT_DESC_SCORES_REVERSED=Punti Minimi
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Cantanti Migliori
+STAT_DESC_SINGERS_REVERSED=Cantanti Peggiori
+STAT_FORMAT_SINGERS=%0:s \n Punteggio Medio: %1:d
+
+STAT_DESC_SONGS=Canzoni piu' popolari
+STAT_DESC_SONGS_REVERSED=Canzoni meno popolari
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx cantate
+
+STAT_DESC_BANDS=Gruppi piu' popolari
+STAT_DESC_BANDS_REVERSED=Gruppi meno popolari
+STAT_FORMAT_BANDS=%0:s \n %1:dx cantate
+
+MSG_ERROR_TITLE=Errore
+MSG_QUESTION_TITLE=Domanda
+MSG_QUIT_USDX=Uscire da UltraStar?
+MSG_END_PARTY=Uscire da Modalita'Party?
+ERROR_NO_SONGS=Nessuna Canzone caricata
+ERROR_NO_PLUGINS=Nessun Plugin caricato
+ERROR_CORRUPT_SONG=Impossibile caricare la canzone. \ No newline at end of file
diff --git a/Languages/Norwegian.ini b/Languages/Norwegian.ini
new file mode 100644
index 00000000..b08db4a8
--- /dev/null
+++ b/Languages/Norwegian.ini
@@ -0,0 +1,298 @@
+[Text]
+SING_LOADING=Laster...
+
+SING_CHOOSE_MODE=velg modus
+SING_SING=syng
+SING_SING_DESC=hurtigspill: syng solo eller duett
+
+SING_MULTI=party
+SING_MULTI_DESC=syng i party-modus
+
+SING_TOOLS=verktøy
+
+SING_STATS=statistikk
+SING_STATS_DESC=vis statistikk
+
+SING_EDITOR=editor
+SING_EDITOR_DESC=lag dine egne sanger
+
+SING_GAME_OPTIONS=spillinnstillinger
+SING_GAME_OPTIONS_DESC=endre spillinstillinger
+SING_EXIT=avslutt
+SING_EXIT_DESC=avslutt spillet
+
+SING_OPTIONS=innstillinger
+SING_OPTIONS_DESC=endre innstillinger
+SING_OPTIONS_WHEREAMI=Innstillinger
+
+SING_OPTIONS_GAME=spill
+SING_OPTIONS_GRAPHICS=grafikk
+SING_OPTIONS_SOUND=lyd
+SING_OPTIONS_LYRICS=tekst
+SING_OPTIONS_THEMES=utseende
+SING_OPTIONS_RECORD=opptak
+SING_OPTIONS_ADVANCED=avansert
+SING_OPTIONS_EXIT=tilbake
+
+SING_OPTIONS_GAME_WHEREAMI=Innstillinger Spill
+SING_OPTIONS_GAME_DESC=hovedspillinnstillinger
+SING_OPTIONS_GAME_PLAYERS=Spillere
+SING_OPTIONS_GAME_DIFFICULTY=Vanskelighet
+SING_OPTIONS_GAME_LANGUAGE=Språk
+SING_OPTIONS_GAME_TABS=Mappeinndeling
+SING_OPTIONS_GAME_SORTING=Sortering
+SING_OPTIONS_GAME_DEBUG=Feilsøking
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Innstillinger Grafikk
+SING_OPTIONS_GRAPHICS_DESC=Grafiske innstillinger
+SING_OPTIONS_GRAPHICS_RESOLUTION=Oppløsning
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Fullskjerm
+SING_OPTIONS_GRAPHICS_DEPTH=Fargedybde
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Oscilloskop
+SING_OPTIONS_GRAPHICS_LINEBONUS=Linjebonus
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Filmstørrelse
+
+SING_OPTIONS_SOUND_WHEREAMI=Innstillinger Lyd
+SING_OPTIONS_SOUND_DESC=lydinnstillinger
+SING_OPTIONS_SOUND_MIC_BOOST=Mikrofon-gain
+SING_OPTIONS_SOUND_CLICK_ASSIST=Klikke-assistanse
+SING_OPTIONS_SOUND_BEAT_CLICK=Beat-klikk
+SING_OPTIONS_SOUND_THRESHOLD=Toleransegrense
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Tospiller-modus
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Preview-volum
+SING_OPTIONS_SOUND_PREVIEWFADING=Preview-fading
+
+SING_OPTIONS_LYRICS_WHEREAMI=Innstillinger Tekst
+SING_OPTIONS_LYRICS_DESC=tekstinnstillinger
+SING_OPTIONS_LYRICS_FONT=Fonter
+SING_OPTIONS_LYRICS_EFFECT=Effekter
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmisasjon
+
+SING_OPTIONS_THEMES_WHEREAMI=Innstillinger Utseende
+SING_OPTIONS_THEMES_DESC=tema og skin-innstillinger
+SING_OPTIONS_THEMES_THEME=Tema
+SING_OPTIONS_THEMES_SKIN=Skin
+SING_OPTIONS_THEMES_COLOR=Farge
+
+SING_OPTIONS_RECORD_WHEREAMI=Innstillinger Opptak
+SING_OPTIONS_RECORD_DESC=mikrofoninnstillinger
+SING_OPTIONS_RECORD_CARD=Lydkort
+SING_OPTIONS_RECORD_INPUT=Input
+SING_OPTIONS_RECORD_CHANNELL=Venstre kanal
+SING_OPTIONS_RECORD_CHANNELR=Høyre kanal
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Innstillinger Avansert
+SING_OPTIONS_ADVANCED_DESC=avanserte innstillinger
+SING_OPTIONS_ADVANCED_EFFECTSING=Sangeffekter
+SING_OPTIONS_ADVANCED_SCREENFADE=Skjermfading
+SING_OPTIONS_ADVANCED_LOADANIMATION=Animasjonslasting
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Sikkerhetsspørsmål
+SING_OPTIONS_ADVANCED_LINEBONUS=Linjebonus
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Etter sang:
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto partymeny
+
+SING_LEGEND_SELECT=velg
+SING_LEGEND_NAVIGATE=naviger
+SING_LEGEND_CONTINUE=fortsett
+SING_LEGEND_ESC=tilbake
+
+SING_PLAYER_DESC=velg spillernavn
+SING_PLAYER_WHEREAMI=Spillernavn
+SING_PLAYER_ENTER_NAME=velg navn
+
+SING_DIFFICULTY_DESC=velg vanskelighetsgrad
+SING_DIFFICULTY_WHEREAMI=Vanskelighet
+SING_DIFFICULTY_CONTINUE=til sangvalg
+SING_EASY=Lett
+SING_MEDIUM=Moderat
+SING_HARD=Vanskelig
+
+SING_SONG_SELECTION_DESC=velg sang
+SING_SONG_SELECTION_WHEREAMI=Sangvalg
+SING_SONG_SELECTION_GOTO=gå til ..
+SING_SONG_SELECTION=Sangvalg
+SING_SONG_SELECTION_MENU=meny
+SING_SONG_SELECTION_PLAYLIST=spilleliste
+SING_SONGS_IN_CAT=Sanger
+PLAYLIST_CATTEXT=Spilleliste: %s
+
+SING_TIME=TID
+SING_TOTAL=total
+SING_MODE=syng solo
+SING_NOTES=toner
+SING_GOLDEN_NOTES=gyldne noter
+SING_PHRASE_BONUS=linjebonus
+
+SING_MENU=Hovedmeny
+
+SONG_SCORE=sangscore
+SONG_SCORE_WHEREAMI=Score
+
+SING_SCORE_TONE_DEAF=Tonedøv
+SING_SCORE_AMATEUR=Amatør
+SING_SCORE_RISING_STAR=Stigende stjerne
+SING_SCORE_LEAD_SINGER=Toppvokalist
+SING_SCORE_HIT_ARTIST=Hitartist
+SING_SCORE_SUPERSTAR=Superstjerne
+SING_SCORE_ULTRASTAR=Ultrastjerne
+
+SING_TOP_5_CHARTS=topp 5 spillere
+SING_TOP_5_CHARTS_WHEREAMI=topp 5
+SING_TOP_5_CHARTS_CONTINUE=til sangvalg
+
+POPUP_PERFECT=perfekt!
+POPUP_AWESOME=fantastisk!
+POPUP_GREAT=kjempebra!
+POPUP_GOOD=bra!
+POPUP_NOTBAD=brukbart!
+POPUP_BAD=dårlig!
+POPUP_POOR=elendig!
+POPUP_AWFUL=grusomt!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= og
+
+SONG_MENU_NAME_MAIN=sangmeny
+SONG_MENU_PLAY=Syng
+SONG_MENU_CHANGEPLAYERS=Endre spillere
+SONG_MENU_EDIT=Endre
+SONG_MENU_MODI=Syng en modus
+SONG_MENU_CANCEL=AVbryt
+
+SONG_MENU_NAME_PLAYLIST=Sangmeny
+SONG_MENU_PLAYLIST_ADD=Legg til sang
+SONG_MENU_PLAYLIST_DEL=Ta bort sang
+
+SONG_MENU_NAME_PLAYLIST_ADD=Legg til sang
+SONG_MENU_PLAYLIST_ADD_NEW=til ny spilleliste
+SONG_MENU_PLAYLIST_ADD_EXISTING=til eksisterende spilleliste
+SONG_MENU_PLAYLIST_NOEXISTING=ingen spilleliste eksisterer
+
+SONG_MENU_NAME_PLAYLIST_NEW=Ny spilleliste
+SONG_MENU_PLAYLIST_NEW_CREATE=Opprett
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Uten navn
+
+SONG_MENU_NAME_PLAYLIST_DEL=Virkelig slette?
+SONG_MENU_YES=Ja
+SONG_MENU_NO=Nei
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Åpne spilleliste
+SONG_MENU_PLAYLIST_LOAD=åpne
+SONG_MENU_PLAYLIST_DELCURRENT=slett nåværende spilleliste
+
+SONG_MENU_NAME_PLAYLIST_DEL=Slett spilleliste?
+
+SONG_MENU_NAME_PARTY_MAIN=Partymeny
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=bruk joker
+
+SONG_JUMPTO_DESC=søk etter sang
+SONG_JUMPTO_TYPE_DESC=Søk etter:
+SONG_JUMPTO_TYPE1=Alt
+SONG_JUMPTO_TYPE2=Tittel
+SONG_JUMPTO_TYPE3=Artist
+SONG_JUMPTO_SONGSFOUND=%d Sang(er) funnet
+SONG_JUMPTO_NOSONGSFOUND=Ingen funnet
+SONG_JUMPTO_HELP=Skriv inn tekst å lete etter
+SONG_JUMPTO_CATTEXT=Søk etter: %s
+
+PARTY_MODE=Partymodus
+PARTY_DIFFICULTY=Vanskelighetsgrad
+PARTY_PLAYLIST=Spilleliste-modus
+PARTY_PLAYLIST_ALL=Alle sanger
+PARTY_PLAYLIST_CATEGORY=Mappe
+PARTY_PLAYLIST_PLAYLIST=Spillelist
+PARTY_ROUNDS=Runder
+PARTY_TEAMS=Lag
+PARTY_TEAMS_PLAYER1=Spiller Lag1
+PARTY_TEAMS_PLAYER2=Spiller Lag2
+PARTY_TEAMS_PLAYER3=Spiller Lag3
+
+PARTY_LEGEND_CONTINUE=Fortsett
+
+PARTY_OPTIONS_DESC=Innstillinger for party-spillet
+PARTY_OPTIONS_WHEREAMI=Party-innstillinger
+
+PARTY_PLAYER_DESC=skriv spiller- og lagnavn!
+PARTY_PLAYER_WHEREAMI=Party-navn
+PARTY_PLAYER_ENTER_NAME=skriv navn
+PARTY_PLAYER_LEGEND_CONTINUE=start party-game
+
+PARTY_ROUND_DESC=neste spillere til mikrofonene
+PARTY_ROUND_WHEREAMI=Party neste runde
+PARTY_ROUND_LEGEND_CONTINUE=start runden
+
+PARTY_SONG_WHEREAMI=Party sangvalg
+PARTY_SONG_LEGEND_CONTINUE=syng
+PARTY_SONG_MENU=partymeny
+
+PARTY_SCORE_DESC=Siste rundes poengsum
+PARTY_SCORE_WHEREAMI=Partypoeng
+
+PARTY_WIN_DESC=vinner av partyspillet
+PARTY_WIN_WHEREAMI=Party-vinner
+PARTY_WIN_LEGEND_CONTINUE=tilbake til hovedmenyen
+
+PARTY_ROUND=Runde
+PARTY_ROUND_WINNER=Vinner
+PARTY_NOTPLAYEDYET=Ikke spilt ennå
+PARTY_NOBODY=ingen
+NEXT_ROUND=Neste runde:
+
+PARTY_DISMISSED=Avbrutt!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=Vinner!
+
+PLUGIN_HDL_NAME=Hold linja
+PLUGIN_HDL_DESC=Ikke syng dårligere enn hva markøren på statuslinja viser.
+
+PLUGIN_UNTIL5000_NAME=Først til 5000
+PLUGIN_UNTIL5000_DESC=Førstemann til 5000 poeng vinner.
+
+PLUGIN_DUELL_NAME=Duell
+PLUGIN_DUELL_DESC=Syng en duell - først til 10000.
+
+PLUGIN_BLIND_NAME=Blindemodus
+PLUGIN_BLIND_DESC=Duell der notene ikke vises
+
+STAT_MAIN=Statistikk
+STAT_MAIN_DESC=Hoved
+STAT_MAIN_WHEREAMI=Statistikk
+
+STAT_OVERVIEW_INTRO=%0:s Statistikk. \n Siste avslutning ved %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Sanger(%3:d med video), hvorav %1:d allerede har vært sunget og %2:d ennå ikke har vært sunget.\n Den mest populære sangen er %5:s av %4:s.
+STAT_OVERVIEW_PLAYER=Siden den siste avlutningen var det %0:d ulike spillere.\n Den beste spilleren er %1:s med en gjennomsnitts-score på %2:d poeng.\n %3:s fikk høyeste score med %4:d poeng.
+
+STAT_DETAIL=Statistikk
+STAT_DETAIL_WHEREAMI=Detaljert statistikk
+
+STAT_NEXT=Neste side
+STAT_PREV=Forrige side
+STAT_REVERSE=Bytt rekkefølge
+STAT_PAGE=Side %0:d av %1:d Sider\n (%2:d av %3:d )
+
+STAT_DESC_SCORES=Toppscore
+STAT_DESC_SCORES_REVERSED=Bunnscore
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Beste sangere
+STAT_DESC_SINGERS_REVERSED=Dårligste sangere
+STAT_FORMAT_SINGERS=%0:s \n Gjennomsnitts-score: %1:d
+
+STAT_DESC_SONGS=Mest populære sang
+STAT_DESC_SONGS_REVERSED=Minst populære sang
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx sunget
+
+STAT_DESC_BANDS=Mest populære artist
+STAT_DESC_BANDS_REVERSED=Minst populære artist
+STAT_FORMAT_BANDS=%0:s \n %1:dx Sunget
+
+MSG_ERROR_TITLE=Feil
+MSG_QUESTION_TITLE=Spørsmål
+MSG_QUIT_USDX=Vil du virkelig avslutte UltraStar?
+MSG_END_PARTY=Vil du virkelig forlate party-modusen?
+ERROR_NO_SONGS=Ingen sanger lastet
+ERROR_NO_PLUGINS=Ingen plug-ins lastet
+ERROR_CORRUPT_SONG=Sangen kunne ikke lastes \ No newline at end of file
diff --git a/Languages/Polish.ini b/Languages/Polish.ini
new file mode 100644
index 00000000..bf9443e7
--- /dev/null
+++ b/Languages/Polish.ini
@@ -0,0 +1,305 @@
+[Text]
+SING_LOADING=Wczytywanie...
+
+SING_CHOOSE_MODE=wybierz tryb
+SING_SING=œpiewaj
+SING_SING_DESC=œpiewaj solo lub w kilka osób
+
+SING_MULTI=impreza
+SING_MULTI_DESC=rozkrêæ imprezê!
+
+SING_TOOLS=narzêdzia
+
+SING_STATS=statystyki
+SING_STATS_DESC=zobacz statystyki
+
+SING_EDITOR=edytor
+SING_EDITOR_DESC=stwórz w³asne piosenki
+
+SING_GAME_OPTIONS=opcje
+SING_GAME_OPTIONS_DESC=zmieñ ustawienia
+
+SING_EXIT=wyjœcie
+SING_EXIT_DESC=wyjdŸ z gry
+
+SING_OPTIONS=opcje
+SING_OPTIONS_DESC=zmieñ ustawienia
+SING_OPTIONS_WHEREAMI=Opcje
+
+SING_OPTIONS_GAME=gra
+SING_OPTIONS_GRAPHICS=grafika
+SING_OPTIONS_SOUND=dŸwiêk
+SING_OPTIONS_LYRICS=s³owa
+SING_OPTIONS_THEMES=tematy
+SING_OPTIONS_RECORD=nagrywanie
+SING_OPTIONS_ADVANCED=zaawansowane
+SING_OPTIONS_EXIT=wstecz
+
+SING_OPTIONS_GAME_WHEREAMI=Opcje Gra
+SING_OPTIONS_GAME_DESC=opcje gry
+SING_OPTIONS_GAME_PLAYERS=IloϾ graczy
+SING_OPTIONS_GAME_DIFFICULTY=Poziom trudnoœci
+SING_OPTIONS_GAME_LANGUAGE=Jêzyk
+SING_OPTIONS_GAME_TABS=Zak³adki
+SING_OPTIONS_GAME_SORTING=Sortowanie
+SING_OPTIONS_GAME_DEBUG=Debug
+
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Opcje Grafika
+SING_OPTIONS_GAME_DESC=opcje gry
+SING_OPTIONS_GAME_PLAYERS=IloϾ graczy
+SING_OPTIONS_GAME_DIFFICULTY=Poziom trudnoœci
+SING_OPTIONS_GAME_LANGUAGE=Jêzyk
+SING_OPTIONS_GAME_TABS=Zak³adki
+SING_OPTIONS_GAME_SORTING=Sortowanie
+SING_OPTIONS_GAME_DEBUG=Debug
+
+SING_OPTIONS_GRAPHICS_LINEBONUS=Bonus Linii
+
+SING_OPTIONS_SOUND_WHEREAMI=Opcje DŸwiêk
+SING_OPTIONS_SOUND_DESC=opcje dŸwiêku
+SING_OPTIONS_SOUND_MIC_BOOST=Podbicie mikrofonu
+SING_OPTIONS_SOUND_CLICK_ASSIST=Pomoc klikniêciami
+SING_OPTIONS_SOUND_BEAT_CLICK=Klikniêcia w rytm
+SING_OPTIONS_SOUND_THRESHOLD=Próg
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Tryb dwóch graczy
+SING_OPTIONS_SOUND_PREVIEWVOLUME=G³oœnoœæ w podgl¹dzie
+SING_OPTIONS_SOUND_PREVIEWFADING=Zanikanie w podgl¹dzie
+
+SING_OPTIONS_LYRICS_WHEREAMI=Opcje S³owa
+SING_OPTIONS_LYRICS_DESC=opcje s³ów
+SING_OPTIONS_LYRICS_FONT=Czcionka
+SING_OPTIONS_LYRICS_EFFECT=Efekt
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmizacja
+
+SING_OPTIONS_THEMES_WHEREAMI=Options Tematy
+SING_OPTIONS_THEMES_DESC=opcje tematów
+SING_OPTIONS_THEMES_THEME=Temat
+SING_OPTIONS_THEMES_SKIN=Skóra
+SING_OPTIONS_THEMES_COLOR=Kolor
+
+SING_OPTIONS_RECORD_WHEREAMI=Opcje Nagrywanie
+SING_OPTIONS_RECORD_DESC=opcje nagrywania
+SING_OPTIONS_RECORD_CARD=Karta dŸwiêkowa
+SING_OPTIONS_RECORD_INPUT=Wejœcie
+SING_OPTIONS_RECORD_CHANNELL=Lewy kana³
+SING_OPTIONS_RECORD_CHANNELR=Prawy kana³
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Opcje Zaawansowane
+SING_OPTIONS_ADVANCED_DESC=ustawienia zaawansowane
+SING_OPTIONS_ADVANCED_EFFECTSING=Efekty specjalne
+SING_OPTIONS_ADVANCED_SCREENFADE=Przenikanie
+SING_OPTIONS_ADVANCED_LOADANIMATION=Animacja ³adowania
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Pytania przy wyjœciu
+SING_OPTIONS_ADVANCED_LINEBONUS=Bonus Linii
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=Licznik
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Po wyborze piosenki
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto Menu Imprezy
+
+SING_LEGEND_SELECT=wybierz
+SING_LEGEND_NAVIGATE=nawigacja
+SING_LEGEND_CONTINUE=dalej
+SING_LEGEND_ESC=wstecz
+
+SING_PLAYER_DESC=wprowadŸ imiê gracza
+SING_PLAYER_WHEREAMI=Imiê
+SING_PLAYER_ENTER_NAME=wpisz imiê
+
+SING_DIFFICULTY_DESC=wybierz poziom trudnoœci
+SING_DIFFICULTY_WHEREAMI=Poziom
+SING_DIFFICULTY_CONTINUE=do wyboru piosenki
+SING_EASY=³atwo
+SING_MEDIUM=œrednio
+SING_HARD=trudno
+
+SING_SONG_SELECTION_DESC=wybierz piosenkê
+SING_SONG_SELECTION_WHEREAMI=Wybór Piosenki
+SING_SONG_SELECTION_GOTO=idŸ do...
+SING_SONG_SELECTION=wybór piosenki
+SING_SONG_SELECTION_MENU=menu
+SING_SONG_SELECTION_PLAYLIST=playlista
+SING_SONGS_IN_CAT=Piosenki
+PLAYLIST_CATTEXT=Playlista: %s
+
+SING_TIME=CZAS
+SING_TOTAL=³¹cznie
+SING_MODE=œpiew solo
+SING_NOTES=nuty
+SING_GOLDEN_NOTES=z³ote nuty
+SING_PHRASE_BONUS=Bonus Linii
+
+SING_MENU=Menu G³ówne
+
+SONG_SCORE=wynik
+SONG_SCORE_WHEREAMI=Wynik
+
+SING_SCORE_TONE_DEAF=G³uche nuty
+SING_SCORE_AMATEUR=Amator
+SING_SCORE_RISING_STAR=Wschodz¹ca gwiazda
+SING_SCORE_LEAD_SINGER=Niez³y grajek
+SING_SCORE_HIT_ARTIST=Wielki Artysta
+SING_SCORE_SUPERSTAR=Supergwiazda
+SING_SCORE_ULTRASTAR=Ultrastar
+
+SING_TOP_5_CHARTS=lista 5 najlepszych
+SING_TOP_5_CHARTS_WHEREAMI=top 5
+SING_TOP_5_CHARTS_CONTINUE=do wyboru piosenki
+
+POPUP_PERFECT=idealnie!
+POPUP_AWESOME=niesamowicie!
+POPUP_GREAT=œwietnie!
+POPUP_GOOD=dobrze!
+POPUP_NOTBAD=nieŸle!
+POPUP_BAD=Ÿle!
+POPUP_POOR=s³abo!
+POPUP_AWFUL=okropnie!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= oraz
+
+SONG_MENU_NAME_MAIN=menu piosenki
+SONG_MENU_PLAY=Œpiewaj
+SONG_MENU_CHANGEPLAYERS=Zmieñ graczy
+SONG_MENU_EDIT=Edytuj
+SONG_MENU_MODI=Œpiewaj Modi
+SONG_MENU_CANCEL=Anuluj
+
+SONG_MENU_NAME_PLAYLIST=Menu Piosenki
+SONG_MENU_PLAYLIST_ADD=Dodaj piosenkê
+SONG_MENU_PLAYLIST_DEL=Usuñ piosenkê
+
+SONG_MENU_NAME_PLAYLIST_ADD=Dodaj piosenkê
+SONG_MENU_PLAYLIST_ADD_NEW=do nowej playlisty
+SONG_MENU_PLAYLIST_ADD_EXISTING=do istniej¹cej playlisty
+SONG_MENU_PLAYLIST_NOEXISTING=Brak playlist
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nowa Playlista
+SONG_MENU_PLAYLIST_NEW_CREATE=Stwórz
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Bez nazwy
+
+SONG_MENU_NAME_PLAYLIST_DEL=Usun¹æ?
+SONG_MENU_YES=Tak
+SONG_MENU_NO=Nie
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Otwórz Playlistê
+SONG_MENU_PLAYLIST_LOAD=otwórz
+SONG_MENU_PLAYLIST_DELCURRENT=usuñ tê playlistê
+
+SONG_MENU_NAME_PLAYLIST_DEL=Usun¹æ playlistê?
+
+SONG_MENU_NAME_PARTY_MAIN=Menu Imprezy
+SONG_MENU_JOKER=Jokera
+
+SONG_MENU_NAME_PARTY_JOKER=weŸ jokera
+
+SONG_JUMPTO_DESC=szukaj
+SONG_JUMPTO_TYPE_DESC=Szukaj:
+SONG_JUMPTO_TYPE1=Wszêdzie
+SONG_JUMPTO_TYPE2=Tytu³
+SONG_JUMPTO_TYPE3=Wykonawca
+SONG_JUMPTO_SONGSFOUND=Znaleziono %d utworów
+SONG_JUMPTO_NOSONGSFOUND=Nic nie znaleziono
+SONG_JUMPTO_HELP=Wpisz tekst do wyszukania
+SONG_JUMPTO_CATTEXT=Szukaj: %s
+
+PARTY_MODE=tryb imprezy
+PARTY_DIFFICULTY=Poziom
+PARTY_PLAYLIST=Tryb playlisty
+PARTY_PLAYLIST_ALL=Wszystko
+PARTY_PLAYLIST_CATEGORY=Folder
+PARTY_PLAYLIST_PLAYLIST=Playlista
+PARTY_ROUNDS=Rundy
+PARTY_TEAMS=Dru¿yny
+PARTY_TEAMS_PLAYER1=Dru¿yna 1
+PARTY_TEAMS_PLAYER2=Dru¿yna 2
+PARTY_TEAMS_PLAYER3=Dru¿yna 3
+
+PARTY_LEGEND_CONTINUE=dalej
+
+PARTY_OPTIONS_DESC=ustawienia trybu imprezy
+PARTY_OPTIONS_WHEREAMI=Impreza - Ustawienia
+
+PARTY_PLAYER_DESC=wpisz nazwy graczy i dru¿yn
+PARTY_PLAYER_WHEREAMI=Nazwy dru¿yn
+PARTY_PLAYER_ENTER_NAME=wpisz nazwy
+PARTY_PLAYER_LEGEND_CONTINUE=start!
+
+PARTY_ROUND_DESC=nastêpni do mikrofonów
+PARTY_ROUND_WHEREAMI=Nastêpna Runda
+PARTY_ROUND_LEGEND_CONTINUE=rozpocznij rundê
+
+PARTY_SONG_WHEREAMI=Wybór piosenki
+PARTY_SONG_LEGEND_CONTINUE=œpiewaj
+PARTY_SONG_MENU=menu
+
+PARTY_SCORE_DESC=wynik ostatniej rundy
+PARTY_SCORE_WHEREAMI=Punkty
+
+PARTY_WIN_DESC=zwyciêzca gry
+PARTY_WIN_WHEREAMI=Zwyciêzca
+PARTY_WIN_LEGEND_CONTINUE=do menu g³ównego
+
+PARTY_ROUND=Runda
+PARTY_ROUND_WINNER=Zwyciêzca
+PARTY_NOTPLAYEDYET=jeszcze nie gra³
+PARTY_NOBODY=nikt
+NEXT_ROUND=Nastêpna runda:
+
+PARTY_DISMISSED=Odpada!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=wygrywa!
+
+PLUGIN_HDL_NAME=Trzymaj liniê
+PLUGIN_HDL_DESC=Œpiewaj lepiej ni¿ linia na wykresie.
+
+PLUGIN_UNTIL5000_NAME=Do 5000
+PLUGIN_UNTIL5000_DESC=Wygrywa ten, kto pierwszy uzyska 5000 punktów.
+
+PLUGIN_DUELL_NAME=Pojedynek
+PLUGIN_DUELL_DESC=Œpiewacie w pojedynku do 10000 punktów.
+
+PLUGIN_TEAMDUELL_NAME=Team Duell
+PLUGIN_TEAMDUELL_DESC=Pass The Mic!
+
+PLUGIN_BLIND_NAME=Œlepiec
+PLUGIN_BLIND_DESC=Pojedynek, w którym nie widzicie nut.
+
+STAT_MAIN=Statystyki
+STAT_MAIN_DESC=Ogólne
+STAT_MAIN_WHEREAMI=Statystyki
+
+STAT_OVERVIEW_INTRO=Statystyki dla: %0:d. \n Ostatnio resetowane: %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Piosenek (%3:d z filmem), z czego %1:d by³o granych a %2:d jeszcze nie.\n Najpopularniejsz¹ piosenk¹ jest %5:s z %4:s.
+STAT_OVERVIEW_PLAYER=Od ostatniego resetu:%0:d ró¿nych graczy.\n Najlepszym graczem jest %1:s ze œrednim wynikiem %2:d punktów.\n %3:s ustanowi³ rekord wynikiem %4:d punktów.
+
+STAT_DETAIL=Statystyki
+STAT_DETAIL_WHEREAMI=Statystyki szczegó³owe
+
+STAT_NEXT=Nastêpna strona
+STAT_PREV=Poprzednia strona
+STAT_REVERSE=Odwróæ kolejnoœæ
+STAT_PAGE=Strona %0:d z %1:d \n (%2:d of %3:d wpisów)
+
+STAT_DESC_SCORES=Najwy¿sze wyniki
+STAT_DESC_SCORES_REVERSED=Najni¿sze wyniki
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Najlepsi
+STAT_DESC_SINGERS_REVERSED=Najgorsi
+STAT_FORMAT_SINGERS=%0:s \n Œredni wynik: %1:d
+
+STAT_DESC_SONGS=Najpopularniejsze piosenki
+STAT_DESC_SONGS_REVERSED=Najmniej popularne piosenki
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx œpiewane
+
+STAT_DESC_BANDS=Najpopularniejsi wykonawcy
+STAT_DESC_BANDS_REVERSED=Najmniej popularni wykonawcy
+STAT_FORMAT_BANDS=%0:s \n %1:dx œpiewani
+
+MSG_ERROR_TITLE=B³¹d
+MSG_QUESTION_TITLE=Pytanie
+MSG_QUIT_USDX=Na pewno chcesz wyjϾ?
+MSG_END_PARTY=Na pewno chcesz zakoñczyæ tryb imprezy?
+ERROR_NO_SONGS=Brak piosenek
+ERROR_NO_PLUGINS=Brak wtyczek
+ERROR_CORRUPT_SONG=Piosenka nie mog³a zostaæ za³adowana. \ No newline at end of file
diff --git a/Languages/Portuguese.ini b/Languages/Portuguese.ini
new file mode 100644
index 00000000..0cabc467
--- /dev/null
+++ b/Languages/Portuguese.ini
@@ -0,0 +1,299 @@
+[Text]
+SING_LOADING=A Ler...
+
+SING_CHOOSE_MODE=Escolha o Modo
+SING_SING=Cantar
+SING_SING_DESC=Jogo Rápido: cantar a Solo ou em Dueto
+
+SING_MULTI=Festa
+SING_MULTI_DESC=Cantar em Modo Festa
+
+SING_TOOLS=Ferramentas
+
+SING_STATS=Estatísticas
+SING_STATS_DESC=Ver Estatísticas
+
+SING_EDITOR=Editor
+SING_EDITOR_DESC=Criar canções
+
+SING_GAME_OPTIONS=Opções de Jogo
+SING_GAME_OPTIONS_DESC=Alterar configurações de Jogo
+
+SING_EXIT=Sair
+SING_EXIT_DESC=Sair do Jogo
+
+SING_OPTIONS=Opções
+SING_OPTIONS_DESC=Alterar configurações
+SING_OPTIONS_WHEREAMI=Opções
+
+SING_OPTIONS_GAME=Jogo
+SING_OPTIONS_GRAPHICS=Gráficos
+SING_OPTIONS_SOUND=Som
+SING_OPTIONS_LYRICS=Letras
+SING_OPTIONS_THEMES=Temas
+SING_OPTIONS_RECORD=Gravação
+SING_OPTIONS_ADVANCED=Avançado
+SING_OPTIONS_EXIT=Voltar
+
+SING_OPTIONS_GAME_WHEREAMI=Opções de Jogo
+SING_OPTIONS_GAME_DESC=Configurações Gerais do Jogo
+SING_OPTIONS_GAME_PLAYERS=Jogadores
+SING_OPTIONS_GAME_DIFFICULTY=Dificuldade
+SING_OPTIONS_GAME_LANGUAGE=Linguagem
+SING_OPTIONS_GAME_TABS=Tabulatura
+SING_OPTIONS_GAME_SORTING=Ordenação
+SING_OPTIONS_GAME_DEBUG=Modo Debug
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Opção de Gráficos
+SING_OPTIONS_GRAPHICS_DESC=configuração de Gráficos
+SING_OPTIONS_GRAPHICS_RESOLUTION=Resolução
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Ecrã Total
+SING_OPTIONS_GRAPHICS_DEPTH=Profundidade
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Osciloscópio
+SING_OPTIONS_GRAPHICS_LINEBONUS=Linha Bonus
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Tamanho do Filme
+
+SING_OPTIONS_SOUND_WHEREAMI=Opções de Som
+SING_OPTIONS_SOUND_DESC=configuração de Som
+SING_OPTIONS_SOUND_MIC_BOOST=Microfone boost
+SING_OPTIONS_SOUND_CLICK_ASSIST=Click de Ajuda
+SING_OPTIONS_SOUND_BEAT_CLICK=Click de Batida
+SING_OPTIONS_SOUND_THRESHOLD=Threshold
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Modo de dois jogadores
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Preview Volume
+SING_OPTIONS_SOUND_PREVIEWFADING=Preview Fading
+
+SING_OPTIONS_LYRICS_WHEREAMI=Opções de Letras
+SING_OPTIONS_LYRICS_DESC=configuração de Letras
+SING_OPTIONS_LYRICS_FONT=Fonte
+SING_OPTIONS_LYRICS_EFFECT=Efeitos
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmization
+
+SING_OPTIONS_THEMES_WHEREAMI=Opção de Tema
+SING_OPTIONS_THEMES_DESC=configuração de tema e skin
+SING_OPTIONS_THEMES_THEME=Tema
+SING_OPTIONS_THEMES_SKIN=Skin
+SING_OPTIONS_THEMES_COLOR=Côr
+
+SING_OPTIONS_RECORD_WHEREAMI=Opções de Gravação
+SING_OPTIONS_RECORD_DESC=configuração do microfone
+SING_OPTIONS_RECORD_CARD=Placa de Som
+SING_OPTIONS_RECORD_INPUT=Entrada
+SING_OPTIONS_RECORD_CHANNELL=Canal esquerdo
+SING_OPTIONS_RECORD_CHANNELR=Canal direito
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Opções Avançadas
+SING_OPTIONS_ADVANCED_DESC=opções avançadas
+SING_OPTIONS_ADVANCED_EFFECTSING=Efeitos
+SING_OPTIONS_ADVANCED_SCREENFADE=Fade do Ecrã
+SING_OPTIONS_ADVANCED_LOADANIMATION=Abrir Animação
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Segurança
+SING_OPTIONS_ADVANCED_LINEBONUS=Linha de Bónus
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Escolha da Canção
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Menu de Festa
+
+SING_LEGEND_SELECT=seleccionar
+SING_LEGEND_NAVIGATE=navegar
+SING_LEGEND_CONTINUE=continuar
+SING_LEGEND_ESC=voltar
+
+SING_PLAYER_DESC=introduza nome(s) de jogador(es)
+SING_PLAYER_WHEREAMI=Nome dos Jogadores
+SING_PLAYER_ENTER_NAME=introduzir nome
+
+SING_DIFFICULTY_DESC=escolha a dificuldade
+SING_DIFFICULTY_WHEREAMI=Dificuldade
+SING_DIFFICULTY_CONTINUE=para a escolha da canção
+SING_EASY=Fácil
+SING_MEDIUM=Médio
+SING_HARD=Difícil
+
+SING_SONG_SELECTION_DESC=escolha a canção
+SING_SONG_SELECTION_WHEREAMI=Escolha de Canção
+SING_SONG_SELECTION_GOTO=ir para ..
+SING_SONG_SELECTION=escolha de canção
+SING_SONG_SELECTION_MENU=menu
+SING_SONG_SELECTION_PLAYLIST=playlist
+SING_SONGS_IN_CAT=Canções
+PLAYLIST_CATTEXT=Playlist: %s
+
+SING_TIME=TEMPO
+SING_TOTAL=Total
+SING_MODE=Cantar a Solo
+SING_NOTES=Notas
+SING_GOLDEN_NOTES=Notas de Ouro
+SING_PHRASE_BONUS=Linha de Bónus
+
+SING_MENU=Menu Principal
+
+SONG_SCORE=Pontuação da Canção
+SONG_SCORE_WHEREAMI=Pontuação
+
+SING_SCORE_TONE_DEAF=Ouvido Mouco
+SING_SCORE_AMATEUR=Amador
+SING_SCORE_RISING_STAR=Estrela em Ascenção
+SING_SCORE_LEAD_SINGER=Cantor Principal
+SING_SCORE_HIT_ARTIST=Artista
+SING_SCORE_SUPERSTAR=SuperStar
+SING_SCORE_ULTRASTAR=UltraStar
+
+SING_TOP_5_CHARTS=5 melhores Jogadores
+SING_TOP_5_CHARTS_WHEREAMI=5 melhores
+SING_TOP_5_CHARTS_CONTINUE=para a escolha da Canção
+
+POPUP_PERFECT=Perfeito!
+POPUP_AWESOME=Fantástico!
+POPUP_GREAT=Óptimo!
+POPUP_GOOD=Bom!
+POPUP_NOTBAD=Nada Mal!
+POPUP_BAD=Mau!
+POPUP_POOR=Fraco!
+POPUP_AWFUL=Horrível!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= e
+
+SONG_MENU_NAME_MAIN=menu de canções
+SONG_MENU_PLAY=Cantar
+SONG_MENU_CHANGEPLAYERS=Mudar Jogadores
+SONG_MENU_EDIT=Editar
+SONG_MENU_MODI=Cantar uma Modi
+SONG_MENU_CANCEL=Cancelar
+
+SONG_MENU_NAME_PLAYLIST=Menu de Canções
+SONG_MENU_PLAYLIST_ADD=Adicionar Canção
+SONG_MENU_PLAYLIST_DEL=Apagar Canção
+
+SONG_MENU_NAME_PLAYLIST_ADD=Adicionar Canção
+SONG_MENU_PLAYLIST_ADD_NEW=a uma nova playlist
+SONG_MENU_PLAYLIST_ADD_EXISTING=a uma playlist existente
+SONG_MENU_PLAYLIST_NOEXISTING=Sem playlist disponível
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nova Playlist
+SONG_MENU_PLAYLIST_NEW_CREATE=Criar
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Sem nome
+
+SONG_MENU_NAME_PLAYLIST_DEL=Apagar mesmo?
+SONG_MENU_YES=Sim
+SONG_MENU_NO=Não
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Abrir Playlist
+SONG_MENU_PLAYLIST_LOAD=abrir
+SONG_MENU_PLAYLIST_DELCURRENT=apagar Playlist actual
+
+SONG_MENU_NAME_PLAYLIST_DEL=Apagar Playlist?
+
+SONG_MENU_NAME_PARTY_MAIN=Menu de Festa
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=usar joker
+
+SONG_JUMPTO_DESC=procurar Canção
+SONG_JUMPTO_TYPE_DESC=Procurar por:
+SONG_JUMPTO_TYPE1=Todos
+SONG_JUMPTO_TYPE2=Título
+SONG_JUMPTO_TYPE3=Artista
+SONG_JUMPTO_SONGSFOUND=%d Música(s) encontrada(s)
+SONG_JUMPTO_NOSONGSFOUND=Nenhuma Canção encontrada
+SONG_JUMPTO_HELP=Escreva para procurar
+SONG_JUMPTO_CATTEXT=Procurar por: %s
+
+PARTY_MODE=modo Festa
+PARTY_DIFFICULTY=Dificuldade
+PARTY_PLAYLIST=Modo Playlist
+PARTY_PLAYLIST_ALL=Todas as Canções
+PARTY_PLAYLIST_CATEGORY=Directório
+PARTY_PLAYLIST_PLAYLIST=Playlist
+PARTY_ROUNDS=Rondas
+PARTY_TEAMS=Equipas
+PARTY_TEAMS_PLAYER1=Jogador Equipa1
+PARTY_TEAMS_PLAYER2=Jogador Equipa2
+PARTY_TEAMS_PLAYER3=Jogador Equipa3
+
+PARTY_LEGEND_CONTINUE=continuar
+
+PARTY_OPTIONS_DESC=configurações para o modo festa
+PARTY_OPTIONS_WHEREAMI=Opções de Festa
+
+PARTY_PLAYER_DESC=inserir nomes de jogadores e equipas
+PARTY_PLAYER_WHEREAMI=Nomes de Festa
+PARTY_PLAYER_ENTER_NAME=inserir nomes
+PARTY_PLAYER_LEGEND_CONTINUE=iniciar Festa
+
+PARTY_ROUND_DESC=Jogadores seguintes para os microsfones
+PARTY_ROUND_WHEREAMIFesta - Ronda seguinte
+PARTY_ROUND_LEGEND_CONTINUE=inicio da Ronda
+
+PARTY_SONG_WHEREAMI=Escolha da Canção - Festa
+PARTY_SONG_LEGEND_CONTINUE=cantar
+PARTY_SONG_MENU=menu Festa
+
+PARTY_SCORE_DESC=pontuação da última ronda
+PARTY_SCORE_WHEREAMI=Pontos da Festa
+
+PARTY_WIN_DESC=vencedor do Jogo Festa
+PARTY_WIN_WHEREAMI=Vencedor da Festa
+PARTY_WIN_LEGEND_CONTINUE=voltar ao menu principal
+
+PARTY_ROUND=Ronda
+PARTY_ROUND_WINNER=Vencedor
+PARTY_NOTPLAYEDYET=ainda não tocadas
+PARTY_NOBODY=ninguém
+NEXT_ROUND=Ronda seguinte:
+
+PARTY_DISMISSED=Dispensado!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=ganhou!
+
+PLUGIN_HDL_NAME=Manter a linha
+PLUGIN_HDL_DESC=Não piorar o ponteiro que é mostrado na barra de pontuação
+
+PLUGIN_UNTIL5000_NAME=Até 5000
+PLUGIN_UNTIL5000_DESC=Quem obter primeiro 5000 pontos ganha a partida
+
+PLUGIN_DUELL_NAME=Duelo
+PLUGIN_DUELL_DESC=Fazer um Duelo até aos 10000 pontos.
+
+PLUGIN_BLIND_NAME=Modo Cego
+PLUGIN_BLIND_DESC=Duelo sem ver as notas.
+
+STAT_MAIN=Estatísticas
+STAT_MAIN_DESC=Geral
+STAT_MAIN_WHEREAMI=Estatísticas
+
+STAT_OVERVIEW_INTRO=%0:s Estatisticas. \n Último Reset a %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Canções(%3:d com Video), das quais %1:d já tocaram e %2:d ainda não tocaram.\n A Canção mais popular é %5:s de %4:s.
+STAT_OVERVIEW_PLAYER=Desde o último Reset houve %0:d Jogador(es) diferente(s).\n O Melhor Jogador é %1:s com a Pontuação média de %2:d Pontos.\n %3:s teve a Pontuação mais alta com %4:d Pontos.
+
+STAT_DETAIL=Estatísticas
+STAT_DETAIL_WHEREAMI=Estatísticas Detalhadas
+
+STAT_NEXT=Página Seguinte
+STAT_PREV=Página Anterior
+STAT_REVERSE=Ordem Inversa
+STAT_PAGE=%0:d de %1:d Páginas\n (%2:d de %3:d Entradas)
+
+STAT_DESC_SCORES=Pontuções Altas
+STAT_DESC_SCORES_REVERSED=Pontuações Baixas
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Top Cantores
+STAT_DESC_SINGERS_REVERSED=Piores Cantores
+STAT_FORMAT_SINGERS=%0:s \n Pontuação Média: %1:d
+
+STAT_DESC_SONGS=Top Canções
+STAT_DESC_SONGS_REVERSED=Canções menos populares
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx cantaram
+
+STAT_DESC_BANDS=Top Bandas
+STAT_DESC_BANDS_REVERSED=Bandas menos populares
+STAT_FORMAT_BANDS=%0:s \n %1:dx Cantaram
+
+MSG_ERROR_TITLE=Erro
+MSG_QUESTION_TITLE=Questão
+MSG_QUIT_USDX=Deseja mesmo sair do UltraStar?
+MSG_END_PARTY=Deseja mesmo terminar o modo Festa?
+ERROR_NO_SONGS=Nenhuma Canção lida
+ERROR_NO_PLUGINS=Nenhum Plugin lido
+ERROR_CORRUPT_SONG=Canção não pôde ser lida. \ No newline at end of file
diff --git a/Languages/Serbian.ini b/Languages/Serbian.ini
new file mode 100644
index 00000000..13fd1bcc
--- /dev/null
+++ b/Languages/Serbian.ini
@@ -0,0 +1,299 @@
+[Text]
+SING_LOADING=Ucitava se...
+
+SING_CHOOSE_MODE=izaberi mod
+SING_SING=pevaj
+SING_SING_DESC=brza igra: pevaj solo ili u duetu
+
+SING_MULTI=tim
+SING_MULTI_DESC=pevaj u timskom modu
+
+SING_TOOLS=alati
+
+SING_STATS=statistike
+SING_STATS_DESC=pogledaj statistike
+
+SING_EDITOR=editor
+SING_EDITOR_DESC=napravi svoje pesme
+
+SING_GAME_OPTIONS=oprcije igre
+SING_GAME_OPTIONS_DESC=promeni podesavanja igre
+
+SING_EXIT=izlaz
+SING_EXIT_DESC=izadji iz igre
+
+SING_OPTIONS=opcije
+SING_OPTIONS_DESC=promeni podesavanja
+SING_OPTIONS_WHEREAMI=Opcije
+
+SING_OPTIONS_GAME=igra
+SING_OPTIONS_GRAPHICS=grafika
+SING_OPTIONS_SOUND=zvuk
+SING_OPTIONS_LYRICS=lirike
+SING_OPTIONS_THEMES=teme
+SING_OPTIONS_RECORD=snimanje
+SING_OPTIONS_ADVANCED=ostalo
+SING_OPTIONS_EXIT=nazad
+
+SING_OPTIONS_GAME_WHEREAMI=Opcije Igra
+SING_OPTIONS_GAME_DESC=opsta podesavanja igre
+SING_OPTIONS_GAME_PLAYERS=Igraci
+SING_OPTIONS_GAME_DIFFICULTY=Tezina
+SING_OPTIONS_GAME_LANGUAGE=Jezik
+SING_OPTIONS_GAME_TABS=Tabovi
+SING_OPTIONS_GAME_SORTING=Sortiranje
+SING_OPTIONS_GAME_DEBUG=Dibagiranje
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Opcije Grafika
+SING_OPTIONS_GRAPHICS_DESC=graficka podesavanja
+SING_OPTIONS_GRAPHICS_RESOLUTION=Rezolucija
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Pun Ekran
+SING_OPTIONS_GRAPHICS_DEPTH=Boje
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Osciloskop
+SING_OPTIONS_GRAPHICS_LINEBONUS=Bonus Linija
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Velicina Videa
+
+SING_OPTIONS_SOUND_WHEREAMI=Opcije Zvuk
+SING_OPTIONS_SOUND_DESC=podesavanja zvuka
+SING_OPTIONS_SOUND_MIC_BOOST=Pojacanje mikrofona
+SING_OPTIONS_SOUND_CLICK_ASSIST=Click assist
+SING_OPTIONS_SOUND_BEAT_CLICK=Beat click
+SING_OPTIONS_SOUND_THRESHOLD=Stepen Cujnosti
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Mod za dva igraca
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Provera jacine tona
+SING_OPTIONS_SOUND_PREVIEWFADING=Provera pomracenja
+
+SING_OPTIONS_LYRICS_WHEREAMI=Opcije Lirike
+SING_OPTIONS_LYRICS_DESC=Podesavanja lirika
+SING_OPTIONS_LYRICS_FONT=Font
+SING_OPTIONS_LYRICS_EFFECT=Efekti
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmizacija
+
+SING_OPTIONS_THEMES_WHEREAMI=Opcije Teme
+SING_OPTIONS_THEMES_DESC=podesavanja teme i skina
+SING_OPTIONS_THEMES_THEME=Tema
+SING_OPTIONS_THEMES_SKIN=Skin
+SING_OPTIONS_THEMES_COLOR=Boja
+
+SING_OPTIONS_RECORD_WHEREAMI=Opcije Snimanje
+SING_OPTIONS_RECORD_DESC=podesavanja mikrofona
+SING_OPTIONS_RECORD_CARD=Zvucna Kartica
+SING_OPTIONS_RECORD_INPUT=Ulaz
+SING_OPTIONS_RECORD_CHANNELL=Levi Kanal
+SING_OPTIONS_RECORD_CHANNELR=Desni Kanal
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Opcije Ostalo
+SING_OPTIONS_ADVANCED_DESC=ostala podesavanja
+SING_OPTIONS_ADVANCED_EFFECTSING=Efekti Pevanja
+SING_OPTIONS_ADVANCED_SCREENFADE=Pomracenje Ekrana
+SING_OPTIONS_ADVANCED_LOADANIMATION=Animacija Ucitavanja
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Bezbednosna Pitanja
+SING_OPTIONS_ADVANCED_LINEBONUS=Linijski Bonus
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Posle Odabira Pesme
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Automatski Timski Meni
+
+SING_LEGEND_SELECT=izaberi
+SING_LEGEND_NAVIGATE=biraj
+SING_LEGEND_CONTINUE=nastavi
+SING_LEGEND_ESC=nazad
+
+SING_PLAYER_DESC=unesi ime igraca
+SING_PLAYER_WHEREAMI=Imenaigraca
+SING_PLAYER_ENTER_NAME=unesi ime
+
+SING_DIFFICULTY_DESC=izaberi tezinu
+SING_DIFFICULTY_WHEREAMI=Tezina
+SING_DIFFICULTY_CONTINUE=do odabira pesme
+SING_EASY=Lako
+SING_MEDIUM=Normalno
+SING_HARD=Tesko
+
+SING_SONG_SELECTION_DESC=izaberi svoju pesmu
+SING_SONG_SELECTION_WHEREAMI=Izbor Pesme
+SING_SONG_SELECTION_GOTO=idi na...
+SING_SONG_SELECTION=izbor pesme
+SING_SONG_SELECTION_MENU=meni
+SING_SONG_SELECTION_PLAYLIST=lista pesama
+SING_SONGS_IN_CAT=Pesme
+PLAYLIST_CATTEXT=Playlist: %s
+
+SING_TIME=TIME
+SING_TOTAL=total
+SING_MODE=pevaj solo
+SING_NOTES=note
+SING_GOLDEN_NOTES=zlatne note
+SING_PHRASE_BONUS=linijski bonus
+
+SING_MENU=Glavni Meni
+
+SONG_SCORE=rezultat pesme
+SONG_SCORE_WHEREAMI=Rezultat
+
+SING_SCORE_TONE_DEAF=Antitalenat
+SING_SCORE_AMATEUR=Amater
+SING_SCORE_RISING_STAR=Zvezda U Usponu
+SING_SCORE_LEAD_SINGER=Solista
+SING_SCORE_HIT_ARTIST=Hit Pevac
+SING_SCORE_SUPERSTAR=SuperZvezda
+SING_SCORE_ULTRASTAR=UltraZvezda
+
+SING_TOP_5_CHARTS=najboljih 5 Igraca
+SING_TOP_5_CHARTS_WHEREAMI=najboljih pet
+SING_TOP_5_CHARTS_CONTINUE=do izbora pesme
+
+POPUP_PERFECT=savrseno!
+POPUP_AWESOME=odlicno!
+POPUP_GREAT=sjajno!
+POPUP_GOOD=dobro!
+POPUP_NOTBAD=nije lose!
+POPUP_BAD=lose!
+POPUP_POOR=jedno!
+POPUP_AWFUL=grozno!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= i
+
+SONG_MENU_NAME_MAIN=meni pesme
+SONG_MENU_PLAY=Pevaj
+SONG_MENU_CHANGEPLAYERS=Promeni Igrace
+SONG_MENU_EDIT=Edituj
+SONG_MENU_MODI=Pevaj Modi
+SONG_MENU_CANCEL=Nazad
+
+SONG_MENU_NAME_PLAYLIST=Meni Pesme
+SONG_MENU_PLAYLIST_ADD=Dodaj Pesmu
+SONG_MENU_PLAYLIST_DEL=Obrisi Pesmu
+
+SONG_MENU_NAME_PLAYLIST_ADD=Dodaj Pesmu
+SONG_MENU_PLAYLIST_ADD_NEW=na novu listu
+SONG_MENU_PLAYLIST_ADD_EXISTING=na postojecu listu
+SONG_MENU_PLAYLIST_NOEXISTING=Nema dostupnih lista
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nova Lista
+SONG_MENU_PLAYLIST_NEW_CREATE=Napravi
+SONG_MENU_PLAYLIST_NEW_UNNAMED=BezNaziva
+
+SONG_MENU_NAME_PLAYLIST_DEL=Zaista Obrisati?
+SONG_MENU_YES=Da
+SONG_MENU_NO=Ne
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Otvori Listu
+SONG_MENU_PLAYLIST_LOAD=otvori
+SONG_MENU_PLAYLIST_DELCURRENT=obrisi Trenutnu Listu
+
+SONG_MENU_NAME_PLAYLIST_DEL=Obrisi listu?
+
+SONG_MENU_NAME_PARTY_MAIN=Timski Meni
+SONG_MENU_JOKER=Dzoker
+
+SONG_MENU_NAME_PARTY_JOKER=uzmi dzokera
+
+SONG_JUMPTO_DESC=trazi pesmu
+SONG_JUMPTO_TYPE_DESC=Trazi:
+SONG_JUMPTO_TYPE1=Sve
+SONG_JUMPTO_TYPE2=Naziv
+SONG_JUMPTO_TYPE3=Izvodjac
+SONG_JUMPTO_SONGSFOUND=%d Pesma(pesama) nadjeno
+SONG_JUMPTO_NOSONGSFOUND=Nema nadjenih pesama
+SONG_JUMPTO_HELP=Upisi tekst koji trazis
+SONG_JUMPTO_CATTEXT=Search for: %s
+
+PARTY_MODE=timski mod
+PARTY_DIFFICULTY=Tezina
+PARTY_PLAYLIST=Mod Liste Pesama
+PARTY_PLAYLIST_ALL=Sve Pesme
+PARTY_PLAYLIST_CATEGORY=Direktorijum
+PARTY_PLAYLIST_PLAYLIST=Lista Pesama
+PARTY_ROUNDS=Runde
+PARTY_TEAMS=Timovi
+PARTY_TEAMS_PLAYER1=Igrac Tim1
+PARTY_TEAMS_PLAYER2=Igrac Tim2
+PARTY_TEAMS_PLAYER3=Igrac Tim3
+
+PARTY_LEGEND_CONTINUE=nastavi
+
+PARTY_OPTIONS_DESC=podesavanja za timsku igru
+PARTY_OPTIONS_WHEREAMI=Timske Opcije
+
+PARTY_PLAYER_DESC=unesi imena igraca i timova!
+PARTY_PLAYER_WHEREAMI=Imena Timova
+PARTY_PLAYER_ENTER_NAME=unesi imena
+PARTY_PLAYER_LEGEND_CONTINUE=zapocni timsku igru
+
+PARTY_ROUND_DESC=sledeci igraci za mikrofonom
+PARTY_ROUND_WHEREAMI=Timska Sledeca Runda
+PARTY_ROUND_LEGEND_CONTINUE=pocni rundu
+
+PARTY_SONG_WHEREAMI=Timski Izbor Pesama
+PARTY_SONG_LEGEND_CONTINUE=povaj
+PARTY_SONG_MENU=timski meni
+
+PARTY_SCORE_DESC=rezultat poslednje runde
+PARTY_SCORE_WHEREAMI=Timski Poeni
+
+PARTY_WIN_DESC=pobednik timske igre
+PARTY_WIN_WHEREAMI=Timski Pobednik
+PARTY_WIN_LEGEND_CONTINUE=nazad u glavni meni
+
+PARTY_ROUND=Runda
+PARTY_ROUND_WINNER=Pobednik
+PARTY_NOTPLAYEDYET=nije jos igrao
+PARTY_NOBODY=niko
+NEXT_ROUND=Sledeca runda:
+
+PARTY_DISMISSED=Otpusten!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=Pobedio!
+
+PLUGIN_HDL_NAME=Drzi liniju
+PLUGIN_HDL_DESC=Ne budi losiji nego sto ti strelica pokazuje.
+
+PLUGIN_UNTIL5000_NAME=Do 5000
+PLUGIN_UNTIL5000_DESC=Ko stigne prvi do 5000 poena pobedjuje.
+
+PLUGIN_DUELL_NAME=Duel
+PLUGIN_DUELL_DESC=Pevaj duel do 10000 poena.
+
+PLUGIN_BLIND_NAME=Slepi Mod
+PLUGIN_BLIND_DESC=Duel bez gledanja nota.
+
+STAT_MAIN=Statistike
+STAT_MAIN_DESC=Generalne
+STAT_MAIN_WHEREAMI=Statistike
+
+STAT_OVERVIEW_INTRO=%0:s Statistike. \n Poslednji reset bio je %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Pesme(%3:d sa Videom), gde su %1:d vec igrane i %2:d nisu jos igrane.\n Najpopularnija pesma je %5:s sa %4:s.
+STAT_OVERVIEW_PLAYER=Od poslednjeg reseta bilo je %0:d razlicitih igraca.\n Najbolji igrac je %1:s sa prosecnim rezultatom od %2:d poena.\n %3:s je imao najveci rezultat sa %4:d poena.
+
+STAT_DETAIL=Statistike
+STAT_DETAIL_WHEREAMI=Detalji Statistike
+
+STAT_NEXT=Sledeca Strana
+STAT_PREV=Prethodna Strana
+STAT_REVERSE=Obrnuti Redosled
+STAT_PAGE=Seite %0:d of %1:d strana\n (%2:d od %3:d unosa)
+
+STAT_DESC_SCORES=NajboljiRezultati
+STAT_DESC_SCORES_REVERSED=NajgoriRezultati
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Najbolji Pevaci
+STAT_DESC_SINGERS_REVERSED=Najgori Pevaci
+STAT_FORMAT_SINGERS=%0:s \n Prosecan Rezultat: %1:d
+
+STAT_DESC_SONGS=Najpopularnije Pesme
+STAT_DESC_SONGS_REVERSED=Najmanje Popularne Pesme
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx pevano
+
+STAT_DESC_BANDS=Najpopularniji Bendovi
+STAT_DESC_BANDS_REVERSED=Najmanje Popularni Bendovi
+STAT_FORMAT_BANDS=%0:s \n %1:dx Pevano
+
+MSG_ERROR_TITLE=Greska
+MSG_QUESTION_TITLE=Pitanje
+MSG_QUIT_USDX=Stvarno napustate UltraStar?
+MSG_END_PARTY=Stvarno napustate Timski Mod?
+ERROR_NO_SONGS=Nema ucitanih pesama
+ERROR_NO_PLUGINS=Nema ucitanih plugin-ova
+ERROR_CORRUPT_SONG=Pesma se ne moze ucitati. \ No newline at end of file
diff --git a/Languages/Slovak.ini b/Languages/Slovak.ini
new file mode 100644
index 00000000..2853bff6
--- /dev/null
+++ b/Languages/Slovak.ini
@@ -0,0 +1,302 @@
+[Text]
+SING_LOADING=... nahráva sa hra !
+
+SING_CHOOSE_MODE=vyberte si z možností
+SING_SING=Hra
+SING_SING_DESC=sólo alebo duet
+
+SING_MULTI=Párty
+SING_MULTI_DESC=párty-mód
+
+SING_TOOLS=Nástroje
+
+SING_STATS=štatistika
+SING_STATS_DESC=zobrazi štatistiku
+
+SING_EDITOR=editor
+SING_EDITOR_DESC=vytvorte si vlastnú skladbu
+
+SING_GAME_OPTIONS=nastavenia
+SING_GAME_OPTIONS_DESC=nastavenia hry
+
+SING_EXIT=Koniec
+SING_EXIT_DESC=návrat do systému
+
+SING_OPTIONS=nastavenia
+SING_OPTIONS_DESC=zmeni nastavenia
+SING_OPTIONS_WHEREAMI=Nastavenia
+
+SING_OPTIONS_GAME=hra
+SING_OPTIONS_GRAPHICS=grafika
+SING_OPTIONS_SOUND=zvuk
+SING_OPTIONS_LYRICS=text
+SING_OPTIONS_THEMES=témy
+SING_OPTIONS_RECORD=mikrofón
+SING_OPTIONS_ADVANCED=iné
+SING_OPTIONS_EXIT=spä
+
+SING_OPTIONS_GAME_WHEREAMI=Nastavenia hry
+SING_OPTIONS_GAME_DESC=všeobecné nastavenia
+SING_OPTIONS_GAME_PLAYERS=Poèet hráèov
+SING_OPTIONS_GAME_DIFFICULTY=Obtiažnos
+SING_OPTIONS_GAME_LANGUAGE=Jazyk
+SING_OPTIONS_GAME_TABS=Kategórie
+SING_OPTIONS_GAME_SORTING=Zoradenie
+SING_OPTIONS_GAME_DEBUG=Debug mód
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Grafika
+SING_OPTIONS_GRAPHICS_DESC=nastavenie grafických detailov
+SING_OPTIONS_GRAPHICS_RESOLUTION=Rozlíšenie
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Celá obrazovka
+SING_OPTIONS_GRAPHICS_DEPTH=Far. håbka
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Osciloskop
+SING_OPTIONS_GRAPHICS_LINEBONUS=Èiarový Bonus
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Zobrazenie videa
+
+SING_OPTIONS_SOUND_WHEREAMI=Zvuk
+SING_OPTIONS_SOUND_DESC=nastavenie zvuku
+SING_OPTIONS_SOUND_MIC_BOOST=Zosilnenie mikrof.
+SING_OPTIONS_SOUND_CLICK_ASSIST=Pomocný klik
+SING_OPTIONS_SOUND_BEAT_CLICK=Rytmický klik
+SING_OPTIONS_SOUND_THRESHOLD=Prah poèute¾.
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Mód dvoch hráèov
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Náh¾ad(volume)
+SING_OPTIONS_SOUND_PREVIEWFADING=Prechod skladieb
+
+SING_OPTIONS_LYRICS_WHEREAMI=Text
+SING_OPTIONS_LYRICS_DESC=nastavenia zobrazovania textov piesní
+SING_OPTIONS_LYRICS_FONT=Písmo
+SING_OPTIONS_LYRICS_EFFECT=Efekt zvýraznenia
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmizácia
+
+SING_OPTIONS_THEMES_WHEREAMI=Témy
+SING_OPTIONS_THEMES_DESC=zmena témy
+SING_OPTIONS_THEMES_THEME=Téma
+SING_OPTIONS_THEMES_SKIN=Vzh¾ad
+SING_OPTIONS_THEMES_COLOR=Farba
+
+SING_OPTIONS_RECORD_WHEREAMI=Mikrofón
+SING_OPTIONS_RECORD_DESC=nastavenie mikrofónu
+SING_OPTIONS_RECORD_CARD=Zvuková karta
+SING_OPTIONS_RECORD_INPUT=Vstup
+SING_OPTIONS_RECORD_CHANNELL=¼avý kanál
+SING_OPTIONS_RECORD_CHANNELR=Pravý kanál
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Iné
+SING_OPTIONS_ADVANCED_DESC=rozširujúce nastavenia
+SING_OPTIONS_ADVANCED_EFFECTSING=Efekty pri speve
+SING_OPTIONS_ADVANCED_SCREENFADE=Jemný prechod
+SING_OPTIONS_ADVANCED_LOADANIMATION=Animácia loading(u)
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Potvrdzovanie
+SING_OPTIONS_ADVANCED_LINEBONUS=Bonus za riadok
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Po zvolení skladby
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto PartyMenu
+
+SING_LEGEND_SELECT=výber
+SING_LEGEND_NAVIGATE=navigácia
+SING_LEGEND_CONTINUE=pokraèova
+SING_LEGEND_ESC=spä
+
+SING_PLAYER_DESC=zadajte meno hráèa(ov)
+SING_PLAYER_WHEREAMI=Mená hráèov
+SING_PLAYER_ENTER_NAME=zadávanie mena
+
+SING_DIFFICULTY_DESC=Vyberte obtiažnos
+SING_DIFFICULTY_WHEREAMI=Obtiažnos
+SING_DIFFICULTY_CONTINUE=pokraèova
+SING_EASY=¼ahká
+SING_MEDIUM=Stredná
+SING_HARD=ažká
+
+SING_SONG_SELECTION_DESC=Vyberte skladbu
+SING_SONG_SELECTION_WHEREAMI=výber skladby
+SING_SONG_SELECTION_GOTO=choï na ..
+SING_SONG_SELECTION=výber skladby
+SING_SONG_SELECTION_MENU=menu
+SING_SONG_SELECTION_PLAYLIST=playlist
+SING_SONGS_IN_CAT=Skladba
+PLAYLIST_CATTEXT=Playlist: %s
+
+SING_TIME=Èas
+SING_TOTAL=celkovo
+SING_MODE=spieva sólo
+SING_NOTES=noty
+SING_GOLDEN_NOTES=zlaté noty
+SING_PHRASE_BONUS=bonus za riadok
+
+SING_MENU=Hlavné Menu
+
+SONG_SCORE=hodnotenie
+SONG_SCORE_WHEREAMI=Skóre
+
+SING_SCORE_TONE_DEAF=Antitalent
+SING_SCORE_AMATEUR=Amatér
+SING_SCORE_RISING_STAR=Vychádzajúca hviezda
+SING_SCORE_LEAD_SINGER=Spevák
+SING_SCORE_HIT_ARTIST=Star
+SING_SCORE_SUPERSTAR=Superstar
+SING_SCORE_ULTRASTAR=Ultrastar
+
+SING_TOP_5_CHARTS=najlepších 5
+SING_TOP_5_CHARTS_WHEREAMI=top 5
+SING_TOP_5_CHARTS_CONTINUE=pre výber skladby
+
+POPUP_PERFECT=neskutoèné!
+POPUP_AWESOME=paráda!
+POPUP_GREAT=super!
+POPUP_GOOD=dobré!
+POPUP_NOTBAD=nie zlé!
+POPUP_BAD=zle!
+POPUP_POOR=bieda!
+POPUP_AWFUL=otrasné!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= a
+
+SONG_MENU_NAME_MAIN=Výber hudby
+SONG_MENU_PLAY=Štart
+SONG_MENU_CHANGEPLAYERS=Iný hráè
+SONG_MENU_EDIT=Uprav
+SONG_MENU_MODI=Sing a Modi
+SONG_MENU_CANCEL=Zruši
+
+SONG_MENU_NAME_PLAYLIST=Skladby
+SONG_MENU_PLAYLIST_ADD=Pridaj skladbu
+SONG_MENU_PLAYLIST_DEL=Zmaž skladbu
+
+SONG_MENU_NAME_PLAYLIST_ADD=Pridaj Skladbu
+SONG_MENU_PLAYLIST_ADD_NEW=do nového playlistu
+SONG_MENU_PLAYLIST_ADD_EXISTING=do existujúceho playlistu
+SONG_MENU_PLAYLIST_NOEXISTING=Nie je dostupný žiadny playlist
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nový Playlist
+SONG_MENU_PLAYLIST_NEW_CREATE=Vytvor
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Bez mena
+
+SONG_MENU_NAME_PLAYLIST_DEL=Skutoène Zmaza ?
+SONG_MENU_YES=Áno
+SONG_MENU_NO=Nie
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Naèítaj Playlist
+SONG_MENU_PLAYLIST_LOAD=naèítaj
+SONG_MENU_PLAYLIST_DELCURRENT=zmaž tento Playlist
+
+SONG_MENU_NAME_PLAYLIST_DEL=Zmaza Playlist?
+
+SONG_MENU_NAME_PARTY_MAIN=Party Menu
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=použi jokera
+
+SONG_JUMPTO_DESC=h¾adaj skladbu
+SONG_JUMPTO_TYPE_DESC=h¾adaj:
+SONG_JUMPTO_TYPE1=všade
+SONG_JUMPTO_TYPE2=v názve skladby
+SONG_JUMPTO_TYPE3=v mene autora
+SONG_JUMPTO_SONGSFOUND=%d skladieb vyhovuje filtru
+SONG_JUMPTO_NOSONGSFOUND=Žiadna skladba
+SONG_JUMPTO_HELP=Napíš k¾úèové slovo pre h¾adanie
+SONG_JUMPTO_CATTEXT=H¾adaj: %s
+
+PARTY_MODE=párty mód
+PARTY_DIFFICULTY=Obtiažnos
+PARTY_PLAYLIST=Skladby z playlistu
+PARTY_PLAYLIST_ALL=Všetky skladby
+PARTY_PLAYLIST_CATEGORY=Kategória
+PARTY_PLAYLIST_PLAYLIST=Playlist
+PARTY_ROUNDS=Poèet kôl
+PARTY_TEAMS=Poèet tímov
+PARTY_TEAMS_PLAYER1=Hráèov v Tíme 1
+PARTY_TEAMS_PLAYER2=Hráèov v Tíme 2
+PARTY_TEAMS_PLAYER3=Hráèov v Tíme 3
+
+PARTY_LEGEND_CONTINUE=pokraèova
+
+PARTY_OPTIONS_DESC=nastavenia pre párty-mód
+PARTY_OPTIONS_WHEREAMI=Párty nastavenia
+
+PARTY_PLAYER_DESC=Zadajte mená tímov a hráèov!
+PARTY_PLAYER_WHEREAMI=Párty mená
+PARTY_PLAYER_ENTER_NAME=zadajte mená
+PARTY_PLAYER_LEGEND_CONTINUE=Pokraèova
+
+PARTY_ROUND_DESC=párty pre hráèov
+PARTY_ROUND_WHEREAMI=List párty disciplín
+PARTY_ROUND_LEGEND_CONTINUE=Štart disciplíny
+
+PARTY_SONG_WHEREAMI=Párty - Výver Skladby
+PARTY_SONG_LEGEND_CONTINUE=Štart
+PARTY_SONG_MENU=party menu
+
+PARTY_SCORE_DESC=skóre posledného kola
+PARTY_SCORE_WHEREAMI=Párty skóre
+
+PARTY_WIN_DESC=Víaz párty
+PARTY_WIN_WHEREAMI=Stupeò víazov
+PARTY_WIN_LEGEND_CONTINUE=spä do hlavného menu
+
+PARTY_ROUND=Kolo
+PARTY_ROUND_WINNER=Víaz
+PARTY_NOTPLAYEDYET=nehralo
+PARTY_NOBODY=ani jedno družstvo
+NEXT_ROUND=Ïalšie kolo:
+
+PARTY_DISMISSED=Ukonèené !
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=víaz tohto kola
+
+PLUGIN_HDL_NAME=Superstar
+PLUGIN_HDL_DESC=nesmieš klesnú pod hranicu ukazovate¾a úspešnosti
+
+PLUGIN_UNTIL5000_NAME=Po 5000
+PLUGIN_UNTIL5000_DESC=kto prvý získa 5000 bodov sa stane víazom
+
+PLUGIN_DUELL_NAME=Duel
+PLUGIN_DUELL_DESC=spievaj, kým nedosiahneš 10000 bodov
+
+PLUGIN_TEAMDUELL_NAME=Duel Tímov
+PLUGIN_TEAMDUELL_DESC=každý hráè sa vystrieda za mikrofónom
+
+PLUGIN_BLIND_NAME=Slepý
+PLUGIN_BLIND_DESC=neuvidíš noty pre hlas
+
+STAT_MAIN=Štatistika
+STAT_MAIN_DESC=Všeobecne
+STAT_MAIN_WHEREAMI=Štatistiky
+
+STAT_OVERVIEW_INTRO=%0:s štatistika \n Štatistika od %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=SKLADBY \n Celkove: %0:d z toho %3:d s videom\n Poèet už hraných: %1:d \n Poèet nehraných: %2:d \n Najhranejšia skladba: %5:s od %4:s
+STAT_OVERVIEW_PLAYER=HRÁÈI \n Celkove: %0:d rôznych hráèov.\n Najlepší hráè: %1:s (%2:d - priemer bodov)\n Najvyššie skóre: %3:s (%4:d bodov)
+
+STAT_DETAIL=Štatistiky
+STAT_DETAIL_WHEREAMI=Podrobná štatistika
+
+STAT_NEXT=Ïalšia strana
+STAT_PREV=Predošlá strana
+STAT_REVERSE=Otoè poradie
+STAT_PAGE=%0:d. z %1:d strán\n (%2:d z %3:d položiek)
+
+STAT_DESC_SCORES=Najvyššie skóre
+STAT_DESC_SCORES_REVERSED=Najhoršie skóre
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Najlepší speváci
+STAT_DESC_SINGERS_REVERSED=Najhorší speváci
+STAT_FORMAT_SINGERS=%0:s \n Priemer skóre: %1:d
+
+STAT_DESC_SONGS=Najhranejšie skladby
+STAT_DESC_SONGS_REVERSED=Najmenej hrané skladby
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx spievaná
+
+STAT_DESC_BANDS=Najhranejšia kapela
+STAT_DESC_BANDS_REVERSED=Najmenej hraná kapela
+STAT_FORMAT_BANDS=%0:s \n %1:dx spievaná
+
+MSG_ERROR_TITLE=Chyba
+MSG_QUESTION_TITLE=Otázka
+MSG_QUIT_USDX=Skutoène chcete skonèi UltraStar?
+MSG_END_PARTY=Skutoène chcete skonèit Párty Mód ?
+ERROR_NO_SONGS=Žiadna skladba
+ERROR_NO_PLUGINS=Žiadny zásuvný modul
+ERROR_CORRUPT_SONG=Skladbu sa nepodarilo nahra.
diff --git a/Languages/Spanish.ini b/Languages/Spanish.ini
new file mode 100644
index 00000000..0eae1d36
--- /dev/null
+++ b/Languages/Spanish.ini
@@ -0,0 +1,298 @@
+[Text]
+SING_LOADING=Cargando...
+
+SING_CHOOSE_MODE=Escoge
+SING_SING=¡Canta!
+SING_SING_DESC=Cantar
+
+SING_MULTI=Grupo
+SING_MULTI_DESC=Cantar en grupos
+
+SING_TOOLS=Utilidades
+
+SING_STATS=Estadisticas
+SING_STATS_DESC=Ver las estadisticas
+
+SING_EDITOR=Editor
+SING_EDITOR_DESC=Crea tus propias canciones
+
+SING_GAME_OPTIONS=Opciones
+SING_GAME_OPTIONS_DESC=Cambia las opciones del juego
+
+SING_EXIT=Salir
+SING_EXIT_DESC=Salir del juego
+
+SING_OPTIONS=Opciones
+SING_OPTIONS_DESC=Cambia las opciones
+SING_OPTIONS_WHEREAMI=Opciones
+
+SING_OPTIONS_GAME=Juego
+SING_OPTIONS_GRAPHICS=Gráficos
+SING_OPTIONS_SOUND=Sonido
+SING_OPTIONS_LYRICS=Letras
+SING_OPTIONS_THEMES=Temas
+SING_OPTIONS_RECORD=Grabación
+SING_OPTIONS_ADVANCED=Avanzadas
+SING_OPTIONS_EXIT=Regresar
+
+SING_OPTIONS_GAME_WHEREAMI=Opciones del juego
+SING_OPTIONS_GAME_DESC=Opciones generales del juego
+SING_OPTIONS_GAME_PLAYERS=Jugadores
+SING_OPTIONS_GAME_DIFFICULTY=Dificultad
+SING_OPTIONS_GAME_LANGUAGE=Idioma
+SING_OPTIONS_GAME_TABS=Etiquetas
+SING_OPTIONS_GAME_SORTING=Clasificar por
+SING_OPTIONS_GAME_DEBUG=Modo depuración
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Opciones gráficas
+SING_OPTIONS_GRAPHICS_DESC=Opciones gráficas
+SING_OPTIONS_GRAPHICS_RESOLUTION=Resolución
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Pantalla completa
+SING_OPTIONS_GRAPHICS_DEPTH=Calidad de color
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Osciloscopio
+SING_OPTIONS_GRAPHICS_LINEBONUS=Bonus de línea
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Tamaño del vídeo
+
+SING_OPTIONS_SOUND_WHEREAMI=Opciones de sonido
+SING_OPTIONS_SOUND_DESC=Opciones de sonido
+SING_OPTIONS_SOUND_MIC_BOOST=Potenciar micro.
+SING_OPTIONS_SOUND_CLICK_ASSIST=Asist. de notas
+SING_OPTIONS_SOUND_BEAT_CLICK=Asist. de golpes
+SING_OPTIONS_SOUND_THRESHOLD=Atenuar micro.
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Modo dos jugadores
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Volum. de avance
+SING_OPTIONS_SOUND_PREVIEWFADING=Desvanecimiento
+
+SING_OPTIONS_LYRICS_WHEREAMI=Opciones de letras
+SING_OPTIONS_LYRICS_DESC=Opciones de letras
+SING_OPTIONS_LYRICS_FONT=Fuente
+SING_OPTIONS_LYRICS_EFFECT=Efecto
+SING_OPTIONS_LYRICS_SOLMIZATION=Solfeo
+
+SING_OPTIONS_THEMES_WHEREAMI=Opciones de temas
+SING_OPTIONS_THEMES_DESC=Opciones de temas
+SING_OPTIONS_THEMES_THEME=Tema
+SING_OPTIONS_THEMES_SKIN=Piel
+SING_OPTIONS_THEMES_COLOR=Color
+
+SING_OPTIONS_RECORD_WHEREAMI=Opciones de grabación
+SING_OPTIONS_RECORD_DESC=Opciones del micrófono
+SING_OPTIONS_RECORD_CARD=Tarjeta de sonido
+SING_OPTIONS_RECORD_INPUT=Captura
+SING_OPTIONS_RECORD_CHANNELL=Canal izquierdo
+SING_OPTIONS_RECORD_CHANNELR=Canal derecho
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Opciones avanzadas
+SING_OPTIONS_ADVANCED_DESC=Opciones avanzadas
+SING_OPTIONS_ADVANCED_EFFECTSING=Efectos al cantar
+SING_OPTIONS_ADVANCED_SCREENFADE=Desvanecimiento
+SING_OPTIONS_ADVANCED_LOADANIMATION=Animación de carga
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Preguntar
+SING_OPTIONS_ADVANCED_LINEBONUS=Bonus de línea
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Al selecionar canción
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Auto menú de grupo
+
+SING_LEGEND_SELECT=Seleccionar
+SING_LEGEND_NAVIGATE=Navegar
+SING_LEGEND_CONTINUE=continuar
+SING_LEGEND_ESC=Regresar
+
+SING_PLAYER_DESC=Nombre(s) de jugador(es)
+SING_PLAYER_WHEREAMI=Nombre(s) de jugador(es)
+SING_PLAYER_ENTER_NAME=Escribe el nombre
+
+SING_DIFFICULTY_DESC=Selecciona la dificultad
+SING_DIFFICULTY_WHEREAMI=Dificultad
+SING_DIFFICULTY_CONTINUE=Siguiente
+SING_EASY=Fácil
+SING_MEDIUM=Normal
+SING_HARD=Difícil
+
+SING_SONG_SELECTION_DESC=Selecciona tu canción
+SING_SONG_SELECTION_WHEREAMI=Selección de canción
+SING_SONG_SELECTION_GOTO=Ir a...
+SING_SONG_SELECTION=Selección de canción
+SING_SONG_SELECTION_MENU=Menú
+SING_SONG_SELECTION_PLAYLIST=Lista
+SING_SONGS_IN_CAT=Canciones
+PLAYLIST_CATTEXT=Lista: %s
+
+SING_TIME=Tiempo
+SING_TOTAL=Total
+SING_MODE=Solo
+SING_NOTES=Notas
+SING_GOLDEN_NOTES=Notas doradas
+SING_PHRASE_BONUS=Bonus de línea
+
+SING_MENU=Menú principal
+
+SONG_SCORE=Puntaje
+SONG_SCORE_WHEREAMI=
+
+SING_SCORE_TONE_DEAF=Desafinado
+SING_SCORE_AMATEUR=Aficionado
+SING_SCORE_RISING_STAR=Progresando
+SING_SCORE_LEAD_SINGER=Cantante
+SING_SCORE_HIT_ARTIST=Gran cantante
+SING_SCORE_SUPERSTAR=Superestrella
+SING_SCORE_ULTRASTAR=Ultraestrella
+
+SING_TOP_5_CHARTS=Los mejores
+SING_TOP_5_CHARTS_WHEREAMI=
+SING_TOP_5_CHARTS_CONTINUE=Continuar
+
+POPUP_PERFECT=¡Perfecto!
+POPUP_AWESOME=¡Asombroso!
+POPUP_GREAT=¡Genial!
+POPUP_GOOD=¡Bien!
+POPUP_NOTBAD=¡No está mal!
+POPUP_BAD=¡Mal!
+POPUP_POOR=¡Pésimo!
+POPUP_AWFUL=¡Horrible!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= y
+
+SONG_MENU_NAME_MAIN=Menú de canto
+SONG_MENU_PLAY=Cantar
+SONG_MENU_CHANGEPLAYERS=Escoger jugador
+SONG_MENU_EDIT=Editar
+SONG_MENU_MODI=Cantar una Modi
+SONG_MENU_CANCEL=Cancelar
+
+SONG_MENU_NAME_PLAYLIST=Menú
+SONG_MENU_PLAYLIST_ADD=Añadir Canción
+SONG_MENU_PLAYLIST_DEL=Eliminar Canción
+
+SONG_MENU_NAME_PLAYLIST_ADD=Añadir canción
+SONG_MENU_PLAYLIST_ADD_NEW=A nueva lista
+SONG_MENU_PLAYLIST_ADD_EXISTING=A lista existente
+SONG_MENU_PLAYLIST_NOEXISTING=No hay listas
+
+SONG_MENU_NAME_PLAYLIST_NEW=Nueva lista
+SONG_MENU_PLAYLIST_NEW_CREATE=Crear
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Sin nombre
+
+SONG_MENU_NAME_PLAYLIST_DEL=¿Suprimir?
+SONG_MENU_YES=Sí
+SONG_MENU_NO=No
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Abrir lista
+SONG_MENU_PLAYLIST_LOAD=Abrir
+SONG_MENU_PLAYLIST_DELCURRENT=Borrar la lista actual
+SONG_MENU_NAME_PLAYLIST_DEL=¿Suprimir?
+
+SONG_MENU_NAME_PARTY_MAIN=Menú
+SONG_MENU_JOKER=Aleatorio
+
+SONG_MENU_NAME_PARTY_JOKER=Aleatorio
+
+SONG_JUMPTO_DESC=Buscar
+SONG_JUMPTO_TYPE_DESC=Buscar por:
+SONG_JUMPTO_TYPE1=Todo
+SONG_JUMPTO_TYPE2=Título
+SONG_JUMPTO_TYPE3=Artista
+SONG_JUMPTO_SONGSFOUND=%d Canción(es) encontrada(as)
+SONG_JUMPTO_NOSONGSFOUND=Sin resultados
+SONG_JUMPTO_HELP=Escribe palabra(s) clave(s)
+SONG_JUMPTO_CATTEXT=Buscar por: %s
+
+PARTY_MODE=Modo Grupo
+PARTY_DIFFICULTY=Dificultad
+PARTY_PLAYLIST=Modo lista
+PARTY_PLAYLIST_ALL=Todo
+PARTY_PLAYLIST_CATEGORY=Carpeta
+PARTY_PLAYLIST_PLAYLIST=Lista
+PARTY_ROUNDS=Rondas
+PARTY_TEAMS=Equipos
+PARTY_TEAMS_PLAYER1=Miembros Eq. 1
+PARTY_TEAMS_PLAYER2=Miembros Eq .2
+PARTY_TEAMS_PLAYER3=Miembros Eq. 3
+
+PARTY_LEGEND_CONTINUE=Continuar
+
+PARTY_OPTIONS_DESC=Opciones del modo grupo
+PARTY_OPTIONS_WHEREAMI=
+
+PARTY_PLAYER_DESC=Escribe los nombre de jugadores y de equipos
+PARTY_PLAYER_WHEREAMI=Nombre equipos
+PARTY_PLAYER_ENTER_NAME=Digita un nombre
+PARTY_PLAYER_LEGEND_CONTINUE=Comenzar
+
+PARTY_ROUND_DESC=Siguientes jugadores
+PARTY_ROUND_WHEREAMI=Siguiente ronda
+PARTY_ROUND_LEGEND_CONTINUE=Iniciar ronda
+
+PARTY_SONG_WHEREAMI=Selección de cacnión
+PARTY_SONG_LEGEND_CONTINUE=Cantar
+PARTY_SONG_MENU=Menú
+
+PARTY_SCORE_DESC=Puntaje de la última ronda
+PARTY_SCORE_WHEREAMI=
+
+PARTY_WIN_DESC=Equipo ganador
+PARTY_WIN_WHEREAMI=
+PARTY_WIN_LEGEND_CONTINUE=Regresar al menú principal
+
+PARTY_ROUND=Ronda
+PARTY_ROUND_WINNER=Ganador
+PARTY_NOTPLAYEDYET=Aún no jugado
+PARTY_NOBODY=Nadie
+NEXT_ROUND=Siguiente ronda:
+
+PARTY_DISMISSED=¡Perdió!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=¡Ganó!
+
+PLUGIN_HDL_NAME=Mantén la línea
+PLUGIN_HDL_DESC=¡No bajes tu puntaje del mostrado en pantalla!
+
+PLUGIN_UNTIL5000_NAME=Hasta 5000
+PLUGIN_UNTIL5000_DESC=Gana quién obtenga 5000 puntos.
+
+PLUGIN_DUELL_NAME=Duelo
+PLUGIN_DUELL_DESC=Canta un duelo hasta 10000 puntos.
+
+PLUGIN_BLIND_NAME=Modo a ciegas
+PLUGIN_BLIND_DESC=Duelo sin mirar las notas.
+
+STAT_MAIN=Estadisticas
+STAT_MAIN_DESC=General
+STAT_MAIN_WHEREAMI=Estadisticas
+
+STAT_OVERVIEW_INTRO=%0:s Estadisticas. \n Último reinicio el %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=Hay %0:d canciones (%3:d con Vídeo), de las cuales %1:d han sido cantadas y %2:d aún no.\n La canción más popular es "%5:s" de %4:s.
+STAT_OVERVIEW_PLAYER=Hay registrados %0:d diferentes jugador(es).\n El mejor es %1:s con un puntaje promedio de %2:d puntos.\n %3:s ha hecho el mejor puntaje: %4:d puntos.
+
+STAT_DETAIL=Estadisticas
+STAT_DETAIL_WHEREAMI=Estadisticas detalladas
+
+STAT_NEXT=Siguiente
+STAT_PREV=Anterior
+STAT_REVERSE=Invertir
+STAT_PAGE=Página %0:d de %1:d \n (%2:d of %3:d Entrys)
+
+STAT_DESC_SCORES=Mejores puntajes
+STAT_DESC_SCORES_REVERSED=Peores puntajes
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Mejores jugadores
+STAT_DESC_SINGERS_REVERSED=Peores jugadores
+STAT_FORMAT_SINGERS=%0:s \n Puntaje promedio: %1:d
+
+STAT_DESC_SONGS=Canciones más populares
+STAT_DESC_SONGS_REVERSED=Canciones menos populares
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:d veces cantada
+
+STAT_DESC_BANDS=Bandas más populares
+STAT_DESC_BANDS_REVERSED=Bandas menos populares
+STAT_FORMAT_BANDS=%0:s \n %1:d veces cantada
+
+MSG_ERROR_TITLE=Error
+MSG_QUESTION_TITLE=Pregunta
+MSG_QUIT_USDX=¿Realmente quieres salir?
+MSG_END_PARTY=¿Realmente quieres terminar?
+ERROR_NO_SONGS=Sin canciones
+ERROR_NO_PLUGINS=Sin plugins
+ERROR_CORRUPT_SONG=Imposible cargar canciones \ No newline at end of file
diff --git a/Languages/Swedish.ini b/Languages/Swedish.ini
new file mode 100644
index 00000000..47ea996b
--- /dev/null
+++ b/Languages/Swedish.ini
@@ -0,0 +1,299 @@
+[Text]
+SING_LOADING=Laddar...
+
+SING_CHOOSE_MODE=välj spelläge
+SING_SING=sjung
+SING_SING_DESC=snabb-spel: sjung solo eller duett
+
+SING_MULTI=party
+SING_MULTI_DESC=sjung i party-läge
+
+SING_TOOLS=verktyg
+
+SING_STATS=statistik
+SING_STATS_DESC=visa statistiken
+
+SING_EDITOR=redigerare
+SING_EDITOR_DESC=skapa egna låtar
+
+SING_GAME_OPTIONS=spelinställningar
+SING_GAME_OPTIONS_DESC=ändra spelinställningarna
+
+SING_EXIT=avsluta
+SING_EXIT_DESC=avsluta spelet
+
+SING_OPTIONS=inställningar
+SING_OPTIONS_DESC=ändra inställningarna
+SING_OPTIONS_WHEREAMI=Inställningar
+
+SING_OPTIONS_GAME=spel
+SING_OPTIONS_GRAPHICS=grafik
+SING_OPTIONS_SOUND=ljud
+SING_OPTIONS_LYRICS=text
+SING_OPTIONS_THEMES=teman
+SING_OPTIONS_RECORD=inspelning
+SING_OPTIONS_ADVANCED=avancerat
+SING_OPTIONS_EXIT=tillbaka
+
+SING_OPTIONS_GAME_WHEREAMI=Inställningar Spel
+SING_OPTIONS_GAME_DESC=allmänna spelinställningar
+SING_OPTIONS_GAME_PLAYERS=Spelare
+SING_OPTIONS_GAME_DIFFICULTY=Svårighetsgrad
+SING_OPTIONS_GAME_LANGUAGE=Språk
+SING_OPTIONS_GAME_TABS=Flikar
+SING_OPTIONS_GAME_SORTING=Sortering efter
+SING_OPTIONS_GAME_DEBUG=Debug
+
+SING_OPTIONS_GRAPHICS_WHEREAMI=Inställningar Grafik
+SING_OPTIONS_GRAPHICS_DESC=grafikinställningar
+SING_OPTIONS_GRAPHICS_RESOLUTION=Upplösning
+SING_OPTIONS_GRAPHICS_FULLSCREEN=Fullskärm
+SING_OPTIONS_GRAPHICS_DEPTH=Färgdjup
+SING_OPTIONS_GRAPHICS_OSCILLOSCOPE=Oscilloskåp
+SING_OPTIONS_GRAPHICS_LINEBONUS=Radbonus
+SING_OPTIONS_GRAPHICS_MOVIE_SIZE=Filmstorlek
+
+SING_OPTIONS_SOUND_WHEREAMI=Inställningar Ljud
+SING_OPTIONS_SOUND_DESC=ljudinställningar
+SING_OPTIONS_SOUND_MIC_BOOST=Öka mikrofonljudet
+SING_OPTIONS_SOUND_CLICK_ASSIST=Hjälpljud
+SING_OPTIONS_SOUND_BEAT_CLICK=Taktljud
+SING_OPTIONS_SOUND_THRESHOLD=Ljudtröskel
+SING_OPTIONS_SOUND_TWO_PLAYERS_MODE=Tvåspelarläge
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Volym i låtvalsmeny
+SING_OPTIONS_SOUND_PREVIEWFADING=Toning i låtvalsmeny
+
+SING_OPTIONS_LYRICS_WHEREAMI=Inställningar Sångtext
+SING_OPTIONS_LYRICS_DESC=sångtextsinställningar
+SING_OPTIONS_LYRICS_FONT=Textstil
+SING_OPTIONS_LYRICS_EFFECT=Effekt
+SING_OPTIONS_LYRICS_SOLMIZATION=Solmisation
+
+SING_OPTIONS_THEMES_WHEREAMI=Inställningar Teman
+SING_OPTIONS_THEMES_DESC=tema- och skalinställningar
+SING_OPTIONS_THEMES_THEME=Tema
+SING_OPTIONS_THEMES_SKIN=Skal
+SING_OPTIONS_THEMES_COLOR=Färg
+
+SING_OPTIONS_RECORD_WHEREAMI=Inställningar Inspelning
+SING_OPTIONS_RECORD_DESC=mikrofoninställningar
+SING_OPTIONS_RECORD_CARD=Ljudkort
+SING_OPTIONS_RECORD_INPUT=Ingång
+SING_OPTIONS_RECORD_CHANNELL=Vänster kanal
+SING_OPTIONS_RECORD_CHANNELR=Höger kanal
+
+SING_OPTIONS_ADVANCED_WHEREAMI=Inställningar Avancerat
+SING_OPTIONS_ADVANCED_DESC=avancerade inställningar
+SING_OPTIONS_ADVANCED_EFFECTSING=Sångeffekt
+SING_OPTIONS_ADVANCED_SCREENFADE=Rutblekning
+SING_OPTIONS_ADVANCED_LOADANIMATION=Ladda animation
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Säkerhetsfråga
+SING_OPTIONS_ADVANCED_LINEBONUS=Radbonus
+SING_OPTIONS_ADVANCED_COUNT_HOW_OFTEN_SUNG=
+SING_OPTIONS_ADVANCED_ONSONGCLICK=Vid låtval
+SING_OPTIONS_ADVANCED_PARTYPOPUP=Automatisk partymeny
+
+SING_LEGEND_SELECT=välj
+SING_LEGEND_NAVIGATE=navigera
+SING_LEGEND_CONTINUE=fortsätt
+SING_LEGEND_ESC=tillbaka
+
+SING_PLAYER_DESC=skriv spelarens/nas namn
+SING_PLAYER_WHEREAMI=Spelarnamn
+SING_PLAYER_ENTER_NAME=skriv namn
+
+SING_DIFFICULTY_DESC=välj svårighetsgrad
+SING_DIFFICULTY_WHEREAMI=Svårighetsgrad
+SING_DIFFICULTY_CONTINUE=fortsätt till låtval
+SING_EASY=Lätt
+SING_MEDIUM=Medel
+SING_HARD=Svår
+
+SING_SONG_SELECTION_DESC=välj låt
+SING_SONG_SELECTION_WHEREAMI=Låtval
+SING_SONG_SELECTION_GOTO=gå till ..
+SING_SONG_SELECTION=låtval
+SING_SONG_SELECTION_MENU=meny
+SING_SONG_SELECTION_PLAYLIST=spellista
+SING_SONGS_IN_CAT=Låtar
+PLAYLIST_CATTEXT=Spellista: %s
+
+SING_TIME=Tid
+SING_TOTAL=total
+SING_MODE=sing solo
+SING_NOTES=noter
+SING_GOLDEN_NOTES=gyllene noter
+SING_PHRASE_BONUS=radbonus
+
+SING_MENU=Huvudmenyn
+
+SONG_SCORE=sångpoäng
+SONG_SCORE_WHEREAMI=Poäng
+
+SING_SCORE_TONE_DEAF=Tondöv
+SING_SCORE_AMATEUR=Amatör
+SING_SCORE_RISING_STAR=Stigande stjärna
+SING_SCORE_LEAD_SINGER=Lead Singer
+SING_SCORE_HIT_ARTIST=Hitartist
+SING_SCORE_SUPERSTAR=Superstjärna
+SING_SCORE_ULTRASTAR=Ultrastar
+
+SING_TOP_5_CHARTS=topp 5 Spelare
+SING_TOP_5_CHARTS_WHEREAMI=topp 5
+SING_TOP_5_CHARTS_CONTINUE=till låtval
+
+POPUP_PERFECT=perfekt!
+POPUP_AWESOME=storartat!
+POPUP_GREAT=riktigt bra!
+POPUP_GOOD=bra!
+POPUP_NOTBAD=godkänt!
+POPUP_BAD=dåligt!
+POPUP_POOR=usel!
+POPUP_AWFUL=avskyvärt!
+
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= och
+
+SONG_MENU_NAME_MAIN=låtmeny
+SONG_MENU_PLAY=Sjung
+SONG_MENU_CHANGEPLAYERS=Ändra spelare
+SONG_MENU_EDIT=Redigera
+SONG_MENU_MODI=Sjung en mod
+SONG_MENU_CANCEL=Ångra
+
+SONG_MENU_NAME_PLAYLIST=Låtmeny
+SONG_MENU_PLAYLIST_ADD=Lägg till en låt
+SONG_MENU_PLAYLIST_DEL=Ta bort en låt
+
+SONG_MENU_NAME_PLAYLIST_ADD=Lägg till en låt
+SONG_MENU_PLAYLIST_ADD_NEW=till en ny spellista
+SONG_MENU_PLAYLIST_ADD_EXISTING=till en existerande spellista
+SONG_MENU_PLAYLIST_NOEXISTING=Ingen spellista tillgänglig
+
+SONG_MENU_NAME_PLAYLIST_NEW=Ny spellist
+SONG_MENU_PLAYLIST_NEW_CREATE=Skapa
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Namnlös
+
+SONG_MENU_NAME_PLAYLIST_DEL=Vill du verkligen ta bort?
+SONG_MENU_YES=Ja
+SONG_MENU_NO=Nej
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Öppna spellista
+SONG_MENU_PLAYLIST_LOAD=öppna
+SONG_MENU_PLAYLIST_DELCURRENT=ta bort nuvarande spellista
+
+SONG_MENU_NAME_PLAYLIST_DEL=Ta bort spellista?
+
+SONG_MENU_NAME_PARTY_MAIN=Partymeny
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=ta joker
+
+SONG_JUMPTO_DESC=sök låt
+SONG_JUMPTO_TYPE_DESC=Sök efter:
+SONG_JUMPTO_TYPE1=Alla
+SONG_JUMPTO_TYPE2=Titel
+SONG_JUMPTO_TYPE3=Artist
+SONG_JUMPTO_SONGSFOUND=%d Låt(ar) hittade
+SONG_JUMPTO_NOSONGSFOUND=Inga låtar hittade
+SONG_JUMPTO_HELP=Skriv text för att söka
+SONG_JUMPTO_CATTEXT=Sök efter: %s
+
+PARTY_MODE=partyläge
+PARTY_DIFFICULTY=Svårighestagrad
+PARTY_PLAYLIST=Spellistsläge
+PARTY_PLAYLIST_ALL=Alla låtar
+PARTY_PLAYLIST_CATEGORY=Mapp
+PARTY_PLAYLIST_PLAYLIST=Spellista
+PARTY_ROUNDS=Omgångar
+PARTY_TEAMS=Lag
+PARTY_TEAMS_PLAYER1=Spelare Lag1
+PARTY_TEAMS_PLAYER2=Spelare Lag2
+PARTY_TEAMS_PLAYER3=Spelare Lag3
+
+PARTY_LEGEND_CONTINUE=fortsätt
+
+PARTY_OPTIONS_DESC=inställningar för partyspel
+PARTY_OPTIONS_WHEREAMI=Partyinställningar
+
+PARTY_PLAYER_DESC=skriv spelar- och lagnamn
+PARTY_PLAYER_WHEREAMI=Partynamn
+PARTY_PLAYER_ENTER_NAME=skriv namn
+PARTY_PLAYER_LEGEND_CONTINUE=starta partyspel
+
+PARTY_ROUND_DESC=nästa spelare till mikrofonerna
+PARTY_ROUND_WHEREAMI=Party Nästa omgång
+PARTY_ROUND_LEGEND_CONTINUE=starta omgång
+
+PARTY_SONG_WHEREAMI=Party Låtval
+PARTY_SONG_LEGEND_CONTINUE=sjung
+PARTY_SONG_MENU=partymeny
+
+PARTY_SCORE_DESC=poäng från senaste omgången
+PARTY_SCORE_WHEREAMI=Partypoäng
+
+PARTY_WIN_DESC=vinnare av partyspelet
+PARTY_WIN_WHEREAMI=Partyvinnare
+PARTY_WIN_LEGEND_CONTINUE=tillbaka till huvudmenyn
+
+PARTY_ROUND=Omgång
+PARTY_ROUND_WINNER=Vinnare
+PARTY_NOTPLAYEDYET=inte spelad än
+PARTY_NOBODY=ingen
+NEXT_ROUND=Nästa omgång:
+
+PARTY_DISMISSED=Avbröt!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=vann!
+
+PLUGIN_HDL_NAME=Håll stånd
+PLUGIN_HDL_DESC=Bli inte sämre än vad omdömesmätaren visar
+
+PLUGIN_UNTIL5000_NAME=Tills 5000
+PLUGIN_UNTIL5000_DESC=Den som först får 5000 poäng vinner matchen
+
+PLUGIN_DUELL_NAME=Duell
+PLUGIN_DUELL_DESC=Sjung en duell tills 10000 poäng
+
+PLUGIN_BLIND_NAME=Blindläge
+PLUGIN_BLIND_DESC=Duell utan att se noterna.
+
+STAT_MAIN=Statistik
+STAT_MAIN_DESC=Allmän
+STAT_MAIN_WHEREAMI=Statistik
+
+STAT_OVERVIEW_INTRO=%0:s Statistik. \n Senast återställd %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Låtar (%3:d med Video), varav %1:d redan har spelats och %2:d inte har spelats än.\n Den mest populära Låten är %5:s av %4:s.
+STAT_OVERVIEW_PLAYER=Sedan den senaste återställningen har %0:d olika spelare sjungit.\n Den bästa spelaren är %1:s med ett genomsnitt på %2:d poäng.\n %3:s har sjungit bäst med %4:d poäng.
+
+STAT_DETAIL=Statistik
+STAT_DETAIL_WHEREAMI=Detaljerad statistik
+
+STAT_NEXT=Nästa sida
+STAT_PREV=Föregående sida
+STAT_REVERSE=Omvänd ordning
+STAT_PAGE=Sida %0:d av %1:d Sidor\n (%2:d av %3:d Poster)
+
+STAT_DESC_SCORES=Högst resultat
+STAT_DESC_SCORES_REVERSED=Lägsta resultaten
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Bästa Låtarna
+STAT_DESC_SINGERS_REVERSED=Sämsta Låtarna
+STAT_FORMAT_SINGERS=%0:s \n Genomsnittlig poäng: %1:d
+
+STAT_DESC_SONGS=Populäraste Låtarna
+STAT_DESC_SONGS_REVERSED=Minst populära Låtarna
+STAT_FORMAT_SONGS=%0:s - %1:s \n Sjungen %2:d gånger
+
+STAT_DESC_BANDS=Populäraste Artisterna
+STAT_DESC_BANDS_REVERSED=Minst populära arrtisterna
+STAT_FORMAT_BANDS=%0:s \n %1:dx sjungna
+
+MSG_ERROR_TITLE=Error
+MSG_QUESTION_TITLE=Fråga
+MSG_QUIT_USDX=Vill du verkligen avsluta UltraStar?
+MSG_END_PARTY=Vill du verkligen avsluta party-läge?
+ERROR_NO_SONGS=Inga Låtar laddade
+ERROR_NO_PLUGINS=No Plugins loaded
+ERROR_CORRUPT_SONG=Song could not be loaded. \ No newline at end of file
diff --git a/Languages/readme.txt b/Languages/readme.txt
new file mode 100644
index 00000000..220001de
--- /dev/null
+++ b/Languages/readme.txt
@@ -0,0 +1,288 @@
+.o0 Ultrastar Deluxe in your Language 0o.
+
+-----------------------
+ Table of Contents
+-----------------------
+1. Introduction
+2. Statistic Wild-Cards
+3. Texts to Add
+
+
+
+-----------------------
+1. Introduction:
+-----------------------
+To translate USD to a new language, take the English Language File, or another one that is up to date and Edit the Texts behind the Equal Mark(=).
+
+-----------------------
+2. Statistic Wild-Cards:
+-----------------------
+Here are some Information about the Wild-Cars in the Language Texts for the Statistic Screens (STAT_...):
+Information that will replace the Wild-Cards:
+
+STAT_OVERVIEW_INTRO:
+ Format:
+ %0:d Ultrastar Version
+ %1:d Day of Reset (A1)
+ %2:d Month of Reset (A2)
+ %3:d Year of Reset (A3)
+
+STAT_OVERVIEW_SONG:
+ Format:
+ %0:d Count Songs (A1)
+ %1:d Count of Sung Songs (A2)
+ %2:d Count of UnSung Songs
+ %3:d Count of Songs with Video (A3)
+ %4:s Name of the most popular Song
+
+STAT_OVERVIEW_PLAYER:
+ Format:
+ %0:d Count Players (A1)
+ %1:s Best Player (Result)
+ %2:d Best Players Score
+ %3:s Best Score Player (Result2)
+ %4:d Best Score
+
+STAT_FORMAT_SCORES:
+ Format:
+ %0:s Singer
+ %1:d Score
+ %2:s Difficulty
+ %3:s Song Artist
+ %4:s Song Title
+
+STAT_FORMAT_SINGERS:
+ Format:
+ %0:s Singer
+ %1:d Average Score
+
+
+STAT_FORMAT_SONGS:
+ Format:
+ %0:s Artist
+ %1:s Title
+ %2:d Times Sung
+
+STAT_FORMAT_BANDS:
+ Format:
+ %0:s Artist Name
+ %1:d Times Sung
+
+Some further Explantation about the Wild-Cards:
+%x:[.y]z
+
+Where X is the Number of the Wildcard,
+Y is optional, it is the number of digits for Decimal Numbers (Z=d). So if y is 2 there and the number is only 0 to 9 there will be a Zero added in front of the number.
+z can be d for Numbers and s for texts
+
+For the date thing in STAT_OVERVIEW_INTRO you may use %1:.2d for the day and %2:.2d for the Month.
+
+-----------------------
+3. Texts to Add:
+-----------------------
+To port a LanguageFile from Ultrastar 0.5.2 or Higher add the following Texts to the end of the file:
+
+#Main Screen
+SING_MENU=Main Menu
+
+SING_MULTI=party
+SING_MULTI_DESC=Sing in PartyMode
+
+SING_TOOLS=Tools
+
+SING_STATS=stats
+SING_STATS_DESC=View the Statistics
+
+#Sound Options Screen
+SING_OPTIONS_SOUND_PREVIEWVOLUME=Preview Volume
+SING_OPTIONS_SOUND_PREVIEWFADING=Preview Fading
+
+#Advanced Options Screen
+SING_OPTIONS_ADVANCED=advanced
+SING_OPTIONS_ADVANCED_DESC=advanced options
+SING_OPTIONS_ADVANCED_EFFECTSING=Singscreen effects
+SING_OPTIONS_ADVANCED_SCREENFADE=Screen Fading
+SING_OPTIONS_ADVANCED_LOADANIMATION=Load Animation
+SING_OPTIONS_ADVANCED_ASKBEFOREDEL=Savety Questions
+SING_OPTIONS_ADVANCED_LINEBONUS=Line Bonus
+SING_OPTIONS_ADVANCED_ONSONGCLICK=after SongSelection
+
+#Ratings at the Score Screen
+SING_SCORE_TONE_DEAF=Tone Deaf
+SING_SCORE_AMATEUR=Amateur
+SING_SCORE_RISING_STAR=Rising Star
+SING_SCORE_LEAD_SINGER=Lead Singer
+SING_SCORE_HIT_ARTIST=Hit Artist
+SING_SCORE_SUPERSTAR=Superstar
+SING_SCORE_ULTRASTAR=Ultrastar
+
+#Line Bonus PopUps
+POPUP_PERFECT=perfect!
+POPUP_AWESOME=awesome!
+POPUP_GREAT=great!
+POPUP_GOOD=good!
+POPUP_NOTBAD=not bad!
+POPUP_BAD=bad!
+POPUP_POOR=poor!
+POPUP_AWFUL=awful!
+
+#To connect Strigns with, e.g.: He, you and I
+IMPLODE_GLUE1=,
+IMPLODE_GLUE2= and
+
+#Song Screen Legend
+PLAYLIST_CATTEXT=Playlist: %s
+
+#Text for the Legend Bar at the bottom
+SING_LEGEND_CONTINUE=Continue
+
+#Texts of the Menu that appears when M is Pressed at the SongSelection
+SONG_MENU_NAME_MAIN=Song Menu
+SONG_MENU_PLAY=Sing
+SONG_MENU_EDIT=Edit
+SONG_MENU_MODI=Sing a Modi
+SONG_MENU_CHANGEPLAYERS=Change Players
+SONG_MENU_CANCEL=Cancel
+
+#Playlist Menu
+SONG_MENU_NAME_MAIN=song menu
+SONG_MENU_PLAY=Sing
+SONG_MENU_CHANGEPLAYERS=Change Players
+SONG_MENU_EDIT=Edit
+SONG_MENU_MODI=Sing a Modi
+SONG_MENU_CANCEL=Cancel
+
+SONG_MENU_NAME_PLAYLIST=Song Menu
+SONG_MENU_PLAYLIST_ADD=Add Song
+SONG_MENU_PLAYLIST_DEL=Delete Song
+
+SONG_MENU_NAME_PLAYLIST_ADD=Add Song
+SONG_MENU_PLAYLIST_ADD_NEW=to new playlist
+SONG_MENU_PLAYLIST_ADD_EXISTING=to exiting playlist
+SONG_MENU_PLAYLIST_NOEXISTING=No playlist available
+
+SONG_MENU_NAME_PLAYLIST_NEW=New Playlist
+SONG_MENU_PLAYLIST_NEW_CREATE=Create
+SONG_MENU_PLAYLIST_NEW_UNNAMED=Unnamed
+
+SONG_MENU_NAME_PLAYLIST_DEL=Really Delete?
+SONG_MENU_YES=Yes
+SONG_MENU_NO=No
+
+SONG_MENU_NAME_PLAYLIST_LOAD=Open Playlist
+SONG_MENU_PLAYLIST_LOAD=open
+SONG_MENU_PLAYLIST_DELCURRENT=delete current Playlist
+
+SONG_MENU_NAME_PLAYLIST_DEL=Delete Playlist?
+
+#Menu Party Modus
+SONG_MENU_NAME_PARTY_MAIN=Menu
+SONG_MENU_JOKER=Joker
+
+SONG_MENU_NAME_PARTY_JOKER=take Joker
+
+#Texts of the jumpto Window
+SONG_JUMPTO_DESC=Jump to Song
+SONG_JUMPTO_TYPE_DESC=Search for:
+SONG_JUMPTO_TYPE1=All
+SONG_JUMPTO_TYPE2=Title
+SONG_JUMPTO_TYPE3=Artist
+SONG_JUMPTO_SONGSFOUND=%d Song(s) found
+SONG_JUMPTO_NOSONGSFOUND=No Song found
+SONG_JUMPTO_HELP=Type Text to Search for
+SONG_JUMPTO_CATTEXT=Search for: %s
+
+#Texts for Party Mode
+PARTY_MODE=party mode
+PARTY_DIFFICULTY=Difficulty
+PARTY_PLAYLIST=Playlist Mode
+PARTY_PLAYLIST_ALL=All songs
+PARTY_PLAYLIST_CATEGORY=Folder
+PARTY_PLAYLIST_PLAYLIST=Playlist
+PARTY_ROUNDS=Rounds
+PARTY_TEAMS=Teams
+PARTY_TEAMS_PLAYER1=Player Team1
+PARTY_TEAMS_PLAYER2=Player Team2
+PARTY_TEAMS_PLAYER3=Player Team3
+PARTY_LEGEND_CONTINUE=continue
+PARTY_OPTIONS_DESC=settings for the party-game
+PARTY_OPTIONS_WHEREAMI=Party Options
+PARTY_PLAYER_DESC=enter player- and teamnames!
+PARTY_PLAYER_WHEREAMI=Party Names
+PARTY_PLAYER_ENTER_NAME=enter names
+PARTY_PLAYER_LEGEND_CONTINUE=start party-game
+PARTY_SONG_WHEREAMI=Party Song-Selection
+PARTY_SONG_LEGEND_CONTINUE=sing
+PARTY_SONG_MENU=party menu
+PARTY_ROUND_DESC=next players to the mics
+PARTY_ROUND_WHEREAMI=Party Next Round
+PARTY_ROUND_LEGEND_CONTINUE=start round
+PARTY_SCORE_DESC=score of the last round
+PARTY_SCORE_WHEREAMI=Party Points
+PARTY_WIN_DESC=winner of the party-game
+PARTY_WIN_WHEREAMI=Party Winner
+PARTY_WIN_LEGEND_CONTINUE=back to main-menu
+PARTY_ROUND=Round
+PARTY_ROUND_WINNER=Winner
+PARTY_NOTPLAYEDYET=not played yet
+PARTY_NOBODY=nobody
+NEXT_ROUND=Next round:
+PARTY_DISMISSED=Dismissed!
+PARTY_SCORE_WINS=%s
+PARTY_SCORE_WINS2=wins!
+PARTY_SONG_WHEREAMI=Party Song-Selection
+PARTY_SONG_LEGEND_CONTINUE=Party-Menu
+
+#Texts that descripts Plugins or Modis
+PLUGIN_HDL_NAME=Hold the Line
+PLUGIN_HDL_DESC=Don't get worse than the pointer at the rating bar shows you.
+PLUGIN_UNTIL5000_NAME=Until 5000
+PLUGIN_UNTIL5000_DESC=Who gets 5000 points first wins the match.
+PLUGIN_DUELL_NAME=Duell
+PLUGIN_DUELL_DESC=Sing a duell until 10000 points.
+PLUGIN_BLIND_NAME=Blind Mode
+PLUGIN_BLIND_DESC=Duell without seeing the notes.
+PLUGIN_TEAMDUELL_NAME=Team Duell
+PLUGIN_TEAMDUELL_DESC=Pass The Mic!
+
+#Statistics Screen
+#For more Info about the Format Strings look at the SorceCode (UScreenStatMain)
+STAT_MAIN=Statistics
+STAT_MAIN_DESC=General
+STAT_MAIN_WHEREAMI=Statistics
+
+STAT_OVERVIEW_INTRO=%0:s Statistics. \n Last Reset at %2:.2d.%1:.2d.%3:d
+STAT_OVERVIEW_SONG=%0:d Songs(%3:d with Video), whereof %1:d already were played and %2:d were not played yet.\n The most popular Song is %5:s from %4:s.
+STAT_OVERVIEW_PLAYER=Since the last Reset there were/was %0:d different Player(s).\n The Best Player is %1:s with an average Score of %2:d Points.\n %3:s did the highest Score with %4:d Points.
+
+#Stat Detail Screen
+STAT_DETAIL=Statistics
+STAT_DETAIL_WHEREAMI=Detail Statistics
+
+STAT_NEXT=Next Page
+STAT_PREV=Previous Page
+STAT_REVERSE=Reverse Order
+STAT_PAGE=Seite %0:d of %1:d Pages\n (%2:d of %3:d Entrys)
+
+STAT_DESC_SCORES=HighScores
+STAT_DESC_SCORES_REVERSED=LowScores
+STAT_FORMAT_SCORES=%0:s - %1:d [%2:s] \n (%3:s - %4:s)
+
+STAT_DESC_SINGERS=Best Singers
+STAT_DESC_SINGERS_REVERSED=Worst Singers
+STAT_FORMAT_SINGERS=%0:s \n Average Score: %1:d
+
+STAT_DESC_SONGS=Most popular Songs
+STAT_DESC_SONGS_REVERSED=Least popular Songs
+STAT_FORMAT_SONGS=%0:s - %1:s \n %2:dx sung
+
+STAT_DESC_BANDS=Most popular Bands
+STAT_DESC_BANDS_REVERSED=Least popular Bands
+STAT_FORMAT_BANDS=%0:s \n %1:dx Sung
+
+#Messages for Popup Message Boxes
+MSG_QUESTION_TITLE=Chicken Out
+MSG_QUIT_USDX=Really leave\n\nUltraStar?
+MSG_END_PARTY=Really end\n\nParty Mode?
+ERROR_NO_SONGS=Error: \n No Songs \n loaded
+ERROR_NO_PLUGINS=Error: \n No Plugins \n loaded \ No newline at end of file
diff --git a/License.txt b/License.txt
new file mode 100644
index 00000000..4964fc70
--- /dev/null
+++ b/License.txt
@@ -0,0 +1,125 @@
+The GNU General Public License (GPL)
+Version 2, June 1991
+Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Everyone is permitted to copy and distribute verbatim copies
+of this license document, but changing it is not allowed.
+
+Preamble
+
+The licenses for most software are designed to take away your freedom to share and change it. By contrast, the GNU General Public License is intended to guarantee your freedom to share and change free software--to make sure the software is free for all its users. This General Public License applies to most of the Free Software Foundation's software and to any other program whose authors commit to using it. (Some other Free Software Foundation software is covered by the GNU Library General Public License instead.) You can apply it to your programs, too.
+
+When we speak of free software, we are referring to freedom, not price. Our General Public Licenses are designed to make sure that you have the freedom to distribute copies of free software (and charge for this service if you wish), that you receive source code or can get it if you want it, that you can change the software or use pieces of it in new free programs; and that you know you can do these things.
+
+To protect your rights, we need to make restrictions that forbid anyone to deny you these rights or to ask you to surrender the rights. These restrictions translate to certain responsibilities for you if you distribute copies of the software, or if you modify it.
+
+For example, if you distribute copies of such a program, whether gratis or for a fee, you must give the recipients all the rights that you have. You must make sure that they, too, receive or can get the source code. And you must show them these terms so they know their rights.
+
+We protect your rights with two steps: (1) copyright the software, and (2) offer you this license which gives you legal permission to copy, distribute and/or modify the software.
+
+Also, for each author's protection and ours, we want to make certain that everyone understands that there is no warranty for this free software. If the software is modified by someone else and passed on, we want its recipients to know that what they have is not the original, so that any problems introduced by others will not reflect on the original authors' reputations.
+
+Finally, any free program is threatened constantly by software patents. We wish to avoid the danger that redistributors of a free program will individually obtain patent licenses, in effect making the program proprietary. To prevent this, we have made it clear that any patent must be licensed for everyone's free use or not licensed at all.
+
+The precise terms and conditions for copying, distribution and modification follow.
+
+TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+0. This License applies to any program or other work which contains a notice placed by the copyright holder saying it may be distributed under the terms of this General Public License. The "Program", below, refers to any such program or work, and a "work based on the Program" means either the Program or any derivative work under copyright law: that is to say, a work containing the Program or a portion of it, either verbatim or with modifications and/or translated into another language. (Hereinafter, translation is included without limitation in the term "modification".) Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not covered by this License; they are outside its scope. The act of running the Program is not restricted, and the output from the Program is covered only if its contents constitute a work based on the Program (independent of having been made by running the Program). Whether that is true depends on what the Program does.
+
+1. You may copy and distribute verbatim copies of the Program's source code as you receive it, in any medium, provided that you conspicuously and appropriately publish on each copy an appropriate copyright notice and disclaimer of warranty; keep intact all the notices that refer to this License and to the absence of any warranty; and give any other recipients of the Program a copy of this License along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and you may at your option offer warranty protection in exchange for a fee.
+
+2. You may modify your copy or copies of the Program or any portion of it, thus forming a work based on the Program, and copy and distribute such modifications or work under the terms of Section 1 above, provided that you also meet all of these conditions:
+
+a) You must cause the modified files to carry prominent notices stating that you changed the files and the date of any change.
+
+b) You must cause any work that you distribute or publish, that in whole or in part contains or is derived from the Program or any part thereof, to be licensed as a whole at no charge to all third parties under the terms of this License.
+
+c) If the modified program normally reads commands interactively when run, you must cause it, when started running for such interactive use in the most ordinary way, to print or display an announcement including an appropriate copyright notice and a notice that there is no warranty (or else, saying that you provide a warranty) and that users may redistribute the program under these conditions, and telling the user how to view a copy of this License. (Exception: if the Program itself is interactive but does not normally print such an announcement, your work based on the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole. If identifiable sections of that work are not derived from the Program, and can be reasonably considered independent and separate works in themselves, then this License, and its terms, do not apply to those sections when you distribute them as separate works. But when you distribute the same sections as part of a whole which is a work based on the Program, the distribution of the whole must be on the terms of this License, whose permissions for other licensees extend to the entire whole, and thus to each and every part regardless of who wrote it.
+
+Thus, it is not the intent of this section to claim rights or contest your rights to work written entirely by you; rather, the intent is to exercise the right to control the distribution of derivative or collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program with the Program (or with a work based on the Program) on a volume of a storage or distribution medium does not bring the other work under the scope of this License.
+
+3. You may copy and distribute the Program (or a work based on it, under Section 2) in object code or executable form under the terms of Sections 1 and 2 above provided that you also do one of the following:
+
+a) Accompany it with the complete corresponding machine-readable source code, which must be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+
+b) Accompany it with a written offer, valid for at least three years, to give any third party, for a charge no more than your cost of physically performing source distribution, a complete machine-readable copy of the corresponding source code, to be distributed under the terms of Sections 1 and 2 above on a medium customarily used for software interchange; or,
+
+c) Accompany it with the information you received as to the offer to distribute corresponding source code. (This alternative is allowed only for noncommercial distribution and only if you received the program in object code or executable form with such an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for making modifications to it. For an executable work, complete source code means all the source code for all modules it contains, plus any associated interface definition files, plus the scripts used to control compilation and installation of the executable. However, as a special exception, the source code distributed need not include anything that is normally distributed (in either source or binary form) with the major components (compiler, kernel, and so on) of the operating system on which the executable runs, unless that component itself accompanies the executable.
+
+If distribution of executable or object code is made by offering access to copy from a designated place, then offering equivalent access to copy the source code from the same place counts as distribution of the source code, even though third parties are not compelled to copy the source along with the object code.
+
+4. You may not copy, modify, sublicense, or distribute the Program except as expressly provided under this License. Any attempt otherwise to copy, modify, sublicense or distribute the Program is void, and will automatically terminate your rights under this License. However, parties who have received copies, or rights, from you under this License will not have their licenses terminated so long as such parties remain in full compliance.
+
+5. You are not required to accept this License, since you have not signed it. However, nothing else grants you permission to modify or distribute the Program or its derivative works. These actions are prohibited by law if you do not accept this License. Therefore, by modifying or distributing the Program (or any work based on the Program), you indicate your acceptance of this License to do so, and all its terms and conditions for copying, distributing or modifying the Program or works based on it.
+
+6. Each time you redistribute the Program (or any work based on the Program), the recipient automatically receives a license from the original licensor to copy, distribute or modify the Program subject to these terms and conditions. You may not impose any further restrictions on the recipients' exercise of the rights granted herein. You are not responsible for enforcing compliance by third parties to this License.
+
+7. If, as a consequence of a court judgment or allegation of patent infringement or for any other reason (not limited to patent issues), conditions are imposed on you (whether by court order, agreement or otherwise) that contradict the conditions of this License, they do not excuse you from the conditions of this License. If you cannot distribute so as to satisfy simultaneously your obligations under this License and any other pertinent obligations, then as a consequence you may not distribute the Program at all. For example, if a patent license would not permit royalty-free redistribution of the Program by all those who receive copies directly or indirectly through you, then the only way you could satisfy both it and this License would be to refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under any particular circumstance, the balance of the section is intended to apply and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any patents or other property right claims or to contest validity of any such claims; this section has the sole purpose of protecting the integrity of the free software distribution system, which is implemented by public license practices. Many people have made generous contributions to the wide range of software distributed through that system in reliance on consistent application of that system; it is up to the author/donor to decide if he or she is willing to distribute software through any other system and a licensee cannot impose that choice.
+
+This section is intended to make thoroughly clear what is believed to be a consequence of the rest of this License.
+
+8. If the distribution and/or use of the Program is restricted in certain countries either by patents or by copyrighted interfaces, the original copyright holder who places the Program under this License may add an explicit geographical distribution limitation excluding those countries, so that distribution is permitted only in or among countries not thus excluded. In such case, this License incorporates the limitation as if written in the body of this License.
+
+9. The Free Software Foundation may publish revised and/or new versions of the General Public License from time to time. Such new versions will be similar in spirit to the present version, but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Program specifies a version number of this License which applies to it and "any later version", you have the option of following the terms and conditions either of that version or of any later version published by the Free Software Foundation. If the Program does not specify a version number of this License, you may choose any version ever published by the Free Software Foundation.
+
+10. If you wish to incorporate parts of the Program into other free programs whose distribution conditions are different, write to the author to ask for permission. For software which is copyrighted by the Free Software Foundation, write to the Free Software Foundation; we sometimes make exceptions for this. Our decision will be guided by the two goals of preserving the free status of all derivatives of our free software and of promoting the sharing and reuse of software generally.
+
+NO WARRANTY
+
+11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.
+
+END OF TERMS AND CONDITIONS
+
+How to Apply These Terms to Your New Programs
+
+If you develop a new program, and you want it to be of the greatest possible use to the public, the best way to achieve this is to make it free software which everyone can redistribute and change under these terms.
+
+To do so, attach the following notices to the program. It is safest to attach them to the start of each source file to most effectively convey the exclusion of warranty; and each file should have at least the "copyright" line and a pointer to where the full notice is found.
+
+one line to give the program's name and a brief idea of what it does.
+Copyright (C)
+
+This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version.
+
+This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
+
+You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+If the program is interactive, make it output a short notice like this when it starts in an interactive mode:
+
+Gnomovision version 69, Copyright (C) year name of author Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. This is free software, and you are welcome to redistribute it under certain conditions; type `show c' for details.
+
+The hypothetical commands `show w' and `show c' should show the appropriate parts of the General Public License. Of course, the commands you use may be called something other than `show w' and `show c'; they could even be mouse-clicks or menu items--whatever suits your program.
+
+You should also get your employer (if you work as a programmer) or your school, if any, to sign a "copyright disclaimer" for the program, if necessary. Here is a sample; alter the names:
+
+Yoyodyne, Inc., hereby disclaims all copyright interest
+in the program `Gnomovision' (which makes passes at compilers)
+written by James Hacker.
+
+signature of Ty Coon, 1 April 1989
+Ty Coon, President of Vice
+
+This General Public License does not permit incorporating your program into proprietary programs. If your program is a subroutine library, you may consider it more useful to permit linking proprietary applications with the library. If this is what you want to do, use the GNU Library General Public License instead of this License.
diff --git a/Modis/5000Points/Until5000.dpr b/Modis/5000Points/Until5000.dpr
new file mode 100644
index 00000000..b826d212
--- /dev/null
+++ b/Modis/5000Points/Until5000.dpr
@@ -0,0 +1,91 @@
+library Until5000;
+
+uses
+ ModiSDK in '..\SDK\ModiSDK.pas';
+
+//Gave the Plugins Info
+procedure PluginInfo (var Info: TPluginInfo); stdcall;
+begin
+ Info.Name := 'PLUGIN_UNTIL5000_NAME';
+
+ Info.Creator := 'Whiteshark';
+ Info.PluginDesc := 'PLUGIN_UNTIL5000_DESC';
+
+ //Set to Party Modi Plugin
+ Info.Typ := 8;
+
+ Info.NumPlayers := 31;
+ //Options
+ Info.LoadSong := True; //Whether or not a Song should be Loaded
+ //Only When Song is Loaded:
+ Info.ShowScore := True; //Whether or not the Score should be shown
+ Info.ShowNotes := True; //Whether the Note Lines should be displayed
+ Info.LoadVideo := True; //Should the Video be loaded ?
+ Info.LoadBack := True; //Should the Background be loaded ?
+
+ Info.BGShowFull := False; //Whether the Background or the Video should be shown Fullsize
+ Info.BGShowFull_O := True; //Whether the Background or the Video should be shown Fullsize
+
+ Info.ShowRateBar:= True; //Whether the Bar that shows how good the player was sould be displayed
+ Info.ShowRateBar_O := True; //Load from Ini whether the Bar should be Displayed
+
+ Info.EnLineBonus := False; //Whether LineBonus Should be enabled
+ Info.EnLineBonus_O := True; //Load from Ini whether LineBonus Should be enabled
+
+ //Options even when song is Not loaded
+ Info.ShowBars := False; //Whether the White Bars on Top and Bottom should be Drawn
+ Info.TeamModeOnly := False; //If True the Plugin can only be Played in Team Mode
+ Info.GetSoundData := False; //If True the RData Procedure is called when new SoundData is available
+ Info.Dummy := False; //Should be Set to False... for Updateing Plugin Interface
+end;
+
+//Executed on Game Start //If True Game begins, else Failure
+function Init (const TeamInfo: TTeamInfo; var Playerinfo: TPlayerinfo; const Sentences: TSentences; const Methods: TMethodRec): boolean; stdcall;
+begin
+Result := True;
+end;
+
+//Executed everytime the Screen is Drawed //If False The Game finishes
+function Draw (var Playerinfo: TPlayerinfo; const CurSentence: Cardinal): boolean; stdcall;
+var
+I: Integer;
+begin
+Result := False;
+ for I := 0 to PlayerInfo.NumPlayers-1 do
+ begin
+ PlayerInfo.Playerinfo[I].Bar := PlayerInfo.Playerinfo[I].Score div 50;
+ PlayerInfo.Playerinfo[I].Percentage := PlayerInfo.Playerinfo[I].Bar;
+ if (PlayerInfo.Playerinfo[I].Score >=5000) then
+ Exit;
+ end;
+Result := True;
+end;
+
+//Is Executed on Finish, Returns the Playernum of the Winner
+function Finish (var Playerinfo: TPlayerinfo): byte; stdcall;
+var
+ I:Integer;
+begin
+Result := 0;
+for I := 0 to PlayerInfo.NumPlayers-1 do
+ begin
+ if (PlayerInfo.Playerinfo[I].Score >=5000) then
+ begin
+ Case I of
+ 0: Result := Result OR 1;
+ 1: Result := Result OR 2;
+ 2: Result := Result OR 4;
+ 3: Result := Result OR 8;
+ 4: Result := Result OR 16;
+ 5: Result := Result OR 32;
+ end;
+ end;
+ end;
+end;
+
+exports
+PluginInfo, Init, Draw, Finish;
+
+begin
+
+end. \ No newline at end of file
diff --git a/Modis/5000Points/Until5000.identcache b/Modis/5000Points/Until5000.identcache
new file mode 100644
index 00000000..80f58a39
--- /dev/null
+++ b/Modis/5000Points/Until5000.identcache
Binary files differ
diff --git a/Modis/Blind/Blind.dpr b/Modis/Blind/Blind.dpr
new file mode 100644
index 00000000..c806171d
--- /dev/null
+++ b/Modis/Blind/Blind.dpr
@@ -0,0 +1,102 @@
+library Blind;
+
+uses
+ ModiSDK in '..\SDK\ModiSDK.pas';
+
+//Gave the Plugins Info
+procedure PluginInfo (var Info: TPluginInfo); stdcall;
+begin
+ Info.Name := 'PLUGIN_BLIND_NAME';
+
+ Info.Creator := 'Whiteshark';
+ Info.PluginDesc := 'PLUGIN_BLIND_DESC';
+
+ //Set to Party Modi Plugin
+ Info.Typ := 8;
+
+ Info.NumPlayers := 31;
+
+ //Options
+ Info.LoadSong := True; //Whether or not a Song should be Loaded
+ //Only When Song is Loaded:
+ Info.ShowScore := True; //Whether or not the Score should be shown
+ Info.ShowNotes := False; //Whether the Note Lines should be displayed
+ Info.LoadVideo := True; //Should the Video be loaded ?
+ Info.LoadBack := True; //Should the Background be loaded ?
+
+ Info.BGShowFull := False; //Whether the Background or the Video should be shown Fullsize
+ Info.BGShowFull_O := True; //Whether the Background or the Video should be shown Fullsize
+
+ Info.ShowRateBar:= False; //Whether the Bar that shows how good the player was sould be displayed
+ Info.ShowRateBar_O := True; //Load from Ini whether the Bar should be Displayed
+
+ Info.EnLineBonus := False; //Whether LineBonus Should be enabled
+ Info.EnLineBonus_O := True; //Load from Ini whether LineBonus Should be enabled
+
+ //Options even when song is Not loaded
+ Info.ShowBars := False; //Whether the White Bars on Top and Bottom should be Drawn
+ Info.TeamModeOnly := False; //If True the Plugin can only be Played in Team Mode
+ Info.GetSoundData := False; //If True the RData Procedure is called when new SoundData is available
+ Info.Dummy := False; //Should be Set to False... for Updateing Plugin Interface
+end;
+
+//Executed on Game Start //If True Game begins, else Failure
+function Init (const TeamInfo: TTeamInfo; var Playerinfo: TPlayerinfo; const Sentences: TSentences; const Methods: TMethodRec): boolean; stdcall;
+begin
+Result := True;
+end;
+
+//Executed everytime the Screen is Drawed //If False The Game finishes
+function Draw (var Playerinfo: TPlayerinfo; const CurSentence: Cardinal): boolean; stdcall;
+var
+I: Integer;
+begin
+Result := True;
+end;
+
+//Is Executed on Finish, Returns the Playernum of the Winner
+function Finish (var Playerinfo: TPlayerinfo): byte; stdcall;
+var
+ I:Integer;
+ MaxScore: Word;
+begin
+ Result := 0;
+ MaxScore := 0;
+ for I := 0 to PlayerInfo.NumPlayers-1 do
+ begin
+ PlayerInfo.Playerinfo[I].Percentage := PlayerInfo.Playerinfo[I].Score div 9999;
+ if (PlayerInfo.Playerinfo[I].Score > MaxScore) then
+ begin
+ MaxScore := PlayerInfo.Playerinfo[I].Score;
+ Case I of
+ 0: Result := 1;
+ 1: Result := 2;
+ 2: Result := 4;
+ 3: Result := 8;
+ 4: Result := 16;
+ 5: Result := 32;
+ end;
+ end
+ else if (PlayerInfo.Playerinfo[I].Score = MaxScore) AND (PlayerInfo.Playerinfo[I].Score <> 0) then
+ begin
+ Case I of
+ 0: Result := Result OR 1;
+ 1: Result := Result OR 2;
+ 2: Result := Result OR 4;
+ 3: Result := Result OR 8;
+ 4: Result := Result OR 16;
+ 5: Result := Result OR 32;
+ end;
+ end;
+ end;
+ //If everybody has 0 Points nobody Wins
+ If (MaxScore = 0) then
+ Result := 0;
+end;
+
+exports
+PluginInfo, Init, Draw, Finish;
+
+begin
+
+end. \ No newline at end of file
diff --git a/Modis/Don't_Get_Worse/Hold_The_Line.dpr b/Modis/Don't_Get_Worse/Hold_The_Line.dpr
new file mode 100644
index 00000000..de19858b
--- /dev/null
+++ b/Modis/Don't_Get_Worse/Hold_The_Line.dpr
@@ -0,0 +1,212 @@
+library Hold_The_Line;
+
+uses
+ ModiSDK in '..\SDK\ModiSDK.pas',
+ StrUtils in '..\SDK\StrUtils.pas',
+ OpenGL12,
+ Windows;
+
+var
+ PointerTex: TSmallTexture;
+ CountSentences: Cardinal;
+ Limit: Byte;
+ MethodRec: TMethodRec;
+ Frame: Integer;
+ PlayerTimes: array[0..5] of Integer;
+ LastTick: Cardinal;
+ PointerVisible: Boolean;
+
+ DismissedSound: Cardinal;
+
+//Gave the Plugins Info
+procedure PluginInfo (var Info: TPluginInfo); stdcall;
+begin
+ Info.Name := 'PLUGIN_HDL_NAME';
+
+ Info.Creator := 'Whiteshark';
+ Info.PluginDesc := 'PLUGIN_HDL_DESC';
+
+ //Set to Party Modi Plugin
+ Info.Typ := 8;
+
+ Info.NumPlayers := 31;
+ //Options
+ Info.LoadSong := True; //Whether or not a Song should be Loaded
+ //Only When Song is Loaded:
+ Info.ShowScore := True; //Whether or not the Score should be shown
+ Info.ShowNotes := True; //Whether the Note Lines should be displayed
+ Info.LoadVideo := True; //Should the Video be loaded ?
+ Info.LoadBack := True; //Should the Background be loaded ?
+
+ Info.BGShowFull := False; //Whether the Background or the Video should be shown Fullsize
+ Info.BGShowFull_O := True; //Whether the Background or the Video should be shown Fullsize
+
+ Info.ShowRateBar:= True; //Whether the Bar that shows how good the player was sould be displayed
+ Info.ShowRateBar_O := False; //Load from Ini whether the Bar should be Displayed
+
+ Info.EnLineBonus := False; //Whether LineBonus Should be enabled
+ Info.EnLineBonus_O := True; //Load from Ini whether LineBonus Should be enabled
+
+ //Options even when song is Not loaded
+ Info.ShowBars := False; //Whether the White Bars on Top and Bottom should be Drawn
+ Info.TeamModeOnly := False; //If True the Plugin can only be Played in Team Mode
+ Info.GetSoundData := False; //If True the RData Procedure is called when new SoundData is available
+ Info.Dummy := False; //Should be Set to False... for Updateing Plugin Interface
+end;
+
+//Executed on Game Start //If True Game begins, else Failure
+function Init (const TeamInfo: TTeamInfo; var Playerinfo: TPlayerinfo; const Sentences: TSentences; const Methods: TMethodRec): boolean; stdcall;
+var
+ I: Integer;
+ Texname, TexType: PChar;
+begin
+ TexName := CreateStr(PChar('HDL_Pointer'));
+ TexType := CreateStr(PChar('Font Black'));
+ PointerTex := Methods.LoadTex(TexName, TexType);
+
+ FreeStr(TexName);
+ FreeStr(TexType);
+
+ TexName := CreateStr(PChar('dismissed.mp3'));
+ DismissedSound := Methods.LoadSound (TexName);
+ FreeStr(TexName);
+
+ CountSentences := Sentences.High;
+ Limit := 0;
+ Frame := 0;
+
+ MethodRec := Methods;
+
+ for I := 0 to PlayerInfo.NumPlayers-1 do
+ begin
+ PlayerInfo.Playerinfo[I].Enabled := True;
+ PlayerInfo.Playerinfo[I].Percentage := 100;
+ PlayerTimes[I] := 0;
+ end;
+
+ LoadOpenGL;
+
+ Result := True;
+end;
+
+//Executed everytime the Screen is Drawed //If False The Game finishes
+function Draw (var Playerinfo: TPlayerinfo; const CurSentence: Cardinal): boolean; stdcall;
+var
+ I: Integer;
+ L: Byte;
+ C: Byte;
+ Text: PChar;
+ Blink: Boolean;
+ tick: Cardinal;
+begin
+ //Aktivate Blink
+ If (CurSentence = CountSentences div 5 * 2 - 1) OR (CurSentence = CountSentences div 3 * 2 - 1) then
+ begin
+ Tick := Gettickcount div 400;
+ If (Tick <> LastTick) then
+ begin
+ LastTick := Tick;
+ PointerVisible := Not PointerVisible;
+ end;
+ end
+ else
+ PointerVisible := True;
+
+ //Inc Limit
+ if (Limit = 0) And (CurSentence >= CountSentences div 5 * 2) then
+ Inc(Limit)
+ else if (Limit = 1) And (CurSentence >= CountSentences div 3 * 2) then
+ Inc(Limit);
+
+ case Limit of
+ 0: L := 20;
+ 1: L := 50;
+ 2: L := 75;
+ end;
+
+ C:= 0;
+
+ Result := True;
+
+ for I := 0 to PlayerInfo.NumPlayers-1 do
+ begin
+ if PlayerInfo.Playerinfo[I].Enabled then
+ begin
+ if PlayerInfo.Playerinfo[I].Bar < L then
+ begin
+ PlayerInfo.Playerinfo[I].Enabled := False;
+ Inc(C);
+ PlayerTimes[I] := CurSentence; //Save Time of Dismission
+ //PlaySound
+ MethodRec.PlaySound (DismissedSound);
+ end;
+
+ //Draw Pointer
+ if (PointerVisible) then
+ begin
+ glColor4f (0.2, 0.8, 0.1, 1);
+
+ glEnable(GL_TEXTURE_2D);
+ glEnable(GL_BLEND);
+ glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
+
+ glBindTexture(GL_TEXTURE_2D, PointerTex.TexNum);
+
+ glBegin(GL_QUADS);
+ glTexCoord2f(1/32, 0); glVertex2f(PlayerInfo.Playerinfo[I].PosX + L - 3, PlayerInfo.Playerinfo[I].PosY - 4);
+ glTexCoord2f(1/32, 1); glVertex2f(PlayerInfo.Playerinfo[I].PosX + L - 3, PlayerInfo.Playerinfo[I].PosY + 12);
+ glTexCoord2f(31/32, 1); glVertex2f(PlayerInfo.Playerinfo[I].PosX+ L + 3, PlayerInfo.Playerinfo[I].PosY + 12);
+ glTexCoord2f(31/32, 0); glVertex2f(PlayerInfo.Playerinfo[I].PosX+ L + 3, PlayerInfo.Playerinfo[I].PosY - 4);
+ glEnd;
+
+ glDisable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+ end;
+
+ end
+ else
+ begin
+ Inc(C);
+ //Draw Dismissed
+ Text := CreateStr(PChar('PARTY_DISMISSED'));
+
+ glColor4f (0.8, 0.8, 0.8, 1);
+
+ MethodRec.Print (1, 6, PlayerInfo.Playerinfo[I].PosX, PlayerInfo.Playerinfo[I].PosY-8, Text);
+ FreeStr(Text);
+ end;
+ end;
+ if (C >= PlayerInfo.NumPlayers-1) then
+ Result := False;
+end;
+
+//Is Executed on Finish, Returns the Playernum of the Winner
+function Finish (var Playerinfo: TPlayerinfo): byte; stdcall;
+var
+ I:Integer;
+begin
+Result := 0;
+for I := 0 to PlayerInfo.NumPlayers-1 do
+ begin
+ PlayerInfo.Playerinfo[I].Percentage := (PlayerTimes[I] * 100) div CountSentences;
+ if (PlayerInfo.Playerinfo[I].Enabled) then
+ begin
+ PlayerInfo.Playerinfo[I].Percentage := 100;
+ Case I of
+ 0: Result := Result OR 1;
+ 1: Result := Result OR 2;
+ 2: Result := Result OR 4;
+ 3: Result := Result OR 8;
+ 4: Result := Result OR 16;
+ 5: Result := Result OR 32;
+ end;
+ end;
+ end;
+end;
+
+exports
+PluginInfo, Init, Draw, Finish;
+
+begin
+
+end. \ No newline at end of file
diff --git a/Modis/Duell/Duell.dpr b/Modis/Duell/Duell.dpr
new file mode 100644
index 00000000..cff9d4ef
--- /dev/null
+++ b/Modis/Duell/Duell.dpr
@@ -0,0 +1,99 @@
+library Duell;
+
+uses
+ ModiSDK in '..\SDK\ModiSDK.pas';
+
+//Gave the Plugins Info
+procedure PluginInfo (var Info: TPluginInfo); stdcall;
+begin
+ Info.Name := 'PLUGIN_DUELL_NAME';
+
+ Info.Creator := 'Whiteshark';
+ Info.PluginDesc := 'PLUGIN_DUELL_DESC';
+
+ Info.Typ := 8;
+
+ Info.NumPlayers := 31;
+ //Options
+ Info.LoadSong := True; //Whether or not a Song should be Loaded
+ //Only When Song is Loaded:
+ Info.ShowScore := True; //Whether or not the Score should be shown
+ Info.ShowNotes := True; //Whether the Note Lines should be displayed
+ Info.LoadVideo := True; //Should the Video be loaded ?
+ Info.LoadBack := True; //Should the Background be loaded ?
+
+ Info.BGShowFull := False; //Whether the Background or the Video should be shown Fullsize
+ Info.BGShowFull_O := True; //Whether the Background or the Video should be shown Fullsize
+
+ Info.ShowRateBar:= False; //Whether the Bar that shows how good the player was sould be displayed
+ Info.ShowRateBar_O := True; //Load from Ini whether the Bar should be Displayed
+
+ Info.EnLineBonus := False; //Whether LineBonus Should be enabled
+ Info.EnLineBonus_O := True; //Load from Ini whether LineBonus Should be enabled
+
+ //Options even when song is Not loaded
+ Info.ShowBars := False; //Whether the White Bars on Top and Bottom should be Drawn
+ Info.TeamModeOnly := False; //If True the Plugin can only be Played in Team Mode
+ Info.GetSoundData := False; //If True the RData Procedure is called when new SoundData is available
+ Info.Dummy := False; //Should be Set to False... for Updateing Plugin Interface
+end;
+
+//Executed on Game Start //If True Game begins, else Failure
+function Init (const TeamInfo: TTeamInfo; var Playerinfo: TPlayerinfo; const Sentences: TSentences; const Methods: TMethodRec): boolean; stdcall;
+begin
+Result := True;
+end;
+
+//Executed everytime the Screen is Drawed //If False The Game finishes
+function Draw (var Playerinfo: TPlayerinfo; const CurSentence: Cardinal): boolean; stdcall;
+begin
+Result := True;
+end;
+
+//Is Executed on Finish, Returns the Playernum of the Winner
+function Finish (var Playerinfo: TPlayerinfo): byte; stdcall;
+var
+ I:Integer;
+ MaxScore: Word;
+begin
+ Result := 0;
+ MaxScore := 0;
+ for I := 0 to PlayerInfo.NumPlayers-1 do
+ begin
+ PlayerInfo.Playerinfo[I].Percentage := PlayerInfo.Playerinfo[I].Score div 9999;
+ if (PlayerInfo.Playerinfo[I].Score > MaxScore) then
+ begin
+ MaxScore := PlayerInfo.Playerinfo[I].Score;
+ Case I of
+ 0: Result := 1;
+ 1: Result := 2;
+ 2: Result := 4;
+ 3: Result := 8;
+ 4: Result := 16;
+ 5: Result := 32;
+ end;
+ end
+ else if (PlayerInfo.Playerinfo[I].Score = MaxScore) AND (PlayerInfo.Playerinfo[I].Score <> 0) then
+ begin
+ Case I of
+ 0: Result := Result OR 1;
+ 1: Result := Result OR 2;
+ 2: Result := Result OR 4;
+ 3: Result := Result OR 8;
+ 4: Result := Result OR 16;
+ 5: Result := Result OR 32;
+ end;
+ end;
+ end;
+
+ //When nobody has Points -> Everybody loose
+ if (MaxScore = 0) then
+ Result := 0;
+end;
+
+exports
+PluginInfo, Init, Draw, Finish;
+
+begin
+
+end. \ No newline at end of file
diff --git a/Modis/SDK/ModiSDK.dcu b/Modis/SDK/ModiSDK.dcu
new file mode 100644
index 00000000..1b6e82a1
--- /dev/null
+++ b/Modis/SDK/ModiSDK.dcu
Binary files differ
diff --git a/Modis/SDK/ModiSDK.pas b/Modis/SDK/ModiSDK.pas
new file mode 100644
index 00000000..7f260c64
--- /dev/null
+++ b/Modis/SDK/ModiSDK.pas
@@ -0,0 +1,160 @@
+unit ModiSDK;
+
+interface
+
+type //PluginInfo, for Init
+ TPluginInfo = record
+ //Info
+ Name: Array [0..32] of Char; //Modi to Register for the Plugin
+ Creator: Array [0..32] of Char; //Name of the Author
+ PluginDesc: Array [0..64] of Char; //Plugin Description
+
+ //Plugin Typ, atm: 8 only for PartyMode Modi
+ Case Typ: byte of
+ 8: (
+ //Options
+ LoadSong: boolean; //Whether or not a Song should be Loaded
+ //Only When Song is Loaded:
+ ShowNotes: boolean; //Whether the Note Lines should be displayed
+ LoadVideo: boolean; //Should the Video be loaded ?
+ LoadBack: boolean; //Should the Background be loaded ?
+
+ ShowRateBar: boolean; //Whether the Bar that shows how good the player was sould be displayed
+ ShowRateBar_O: boolean; //Load from Ini whether the Bar should be Displayed
+
+ EnLineBonus: boolean; //Whether LineBonus Should be enabled
+ EnLineBonus_O: boolean; //Load from Ini whether LineBonus Should be enabled
+
+ BGShowFull: boolean; //Whether the Background or the Video should be shown Fullsize
+ BGShowFull_O: boolean; //Whether the Background or the Video should be shown Fullsize
+
+ //Options -> everytime
+ ShowScore: boolean; //Whether or not the Score should be shown
+ ShowBars: boolean; //Whether the White Bars on Top and Bottom should be Drawn
+ TeamModeOnly: boolean; //If True the Plugin can only be Played in Team Mode
+ GetSoundData: boolean; //If True the RData Procedure is called when new SoundData is available
+ Dummy: boolean; //Should be Set to False... for Updateing Plugin Interface
+
+ NumPlayers: Byte //Number of Available Players for Modi
+ //Set different Bits
+ //1 -> One Player
+ //2 -> Two Players
+ //4 -> Three Players
+ //8 -> Four Players
+ //16-> Six Players
+ //e.g. : 10 -> Playable with 2 and 4 Players
+ );
+
+ end;
+
+ TPlayerInfo = record
+ NumPlayers: Byte;
+ Playerinfo: array[0..5] of record
+ Name: PChar; //Name of the Player
+ Score:Word; //Players Score
+ Bar: Byte; //Percentage of the SingBar filled
+ PosX: Real; //PosX of Players SingBar
+ PosY: Real; //PosY "
+ Enabled: Boolean; //Whether the Player could get Points
+ Percentage: Byte; //Percentage Shown on the Score Screen
+ end;
+ end;
+
+ TTeamInfo = record
+ NumTeams: Byte;
+ Teaminfo: array[0..5] of record
+ Name: PChar;
+ Score: Word;
+ Joker: Byte;
+ CurPlayer: Byte;
+ NumPlayers: Byte;
+ Playerinfo: array[0..3] of record
+ Name: PChar;
+ TimesPlayed: Byte;
+
+ end;
+ end;
+ end;
+
+ TPlayersInfo = record
+ NumPlayer: byte;
+ Playerinfo: array[0..8] of record
+ Name: PChar;
+ ScoreP: Integer;
+ ScoreN: Integer;
+ Wins: byte;
+ Defeats: byte;
+ Draws: byte;
+ Points: Integer;
+ Joker: byte;
+ NumPlayed: byte;
+ end;
+ end;
+
+ TsmallTexture = record
+ TexNum: integer;
+ W: real;
+ H: real;
+ end;
+
+ TSentences = record
+ Akt: integer; // aktualna czesc utworu do rysowania
+ High: integer;
+ Ilosc: integer;
+ Resolution: integer;
+ NotesGAP: integer;
+ TotalLength: integer;
+ Sentence: array of record
+ Start: integer;
+ StartNote: integer;
+ Lyric: string;
+ LyricWidth: real;
+ Koniec: integer;
+ BaseNote: integer;
+ HighNote: integer;
+ IlNut: integer;
+ TotalNotes: integer;
+ Note: array of record
+ Color: integer;
+ Start: integer;
+ Length: integer;
+ Ton: integer;
+ TonGamy: integer;
+ //Text: string;
+ FreeStyle: boolean;
+ Typ: integer; // zwykla nuta x1, zlota nuta x2
+ end;
+ end;
+ end;
+
+ DWORD = Longword;
+ HSTREAM = DWORD;
+
+ //Routines to gave to the Plugin
+ fModi_LoadTex = function (const Name, Typ: PChar): TsmallTexture; stdcall; //Pointer to Texture Loader
+ //fModi_Translate = function (const Name, Translation: AChar): Integer; stdcall; //Pointer to Translator
+ fModi_Print = procedure (const Style, Size: Byte; const X, Y: Real; const Text: PChar); stdcall; //Procedure to Print Text //Now translated automatically
+ fModi_LoadSound = function (const Name: PChar): Cardinal; stdcall; //Procedure that loads a Custom Sound
+ pModi_PlaySound = procedure (const Index: Cardinal); stdcall; //Plays a Custom Sound
+
+ TMethodRec = record
+ LoadTex: fModi_LoadTex;
+ Print: fModi_Print;
+ LoadSound: fModi_LoadSound;
+ PlaySound: pModi_PlaySound;
+ end;
+ //DLL Funktionen
+ //Gave the Plugins Info
+ pModi_PluginInfo = procedure (var Info: TPluginInfo); stdcall;
+ //Executed on Game Start //If True Game begins, else Failure
+ fModi_Init = function (const TeamInfo: TTeamInfo; var Playerinfo: TPlayerinfo; const Sentences: TSentences; const Methods: TMethodRec): boolean; stdcall;
+ //Executed everytime the Screen is Drawed //If False The Game finishes
+ fModi_Draw = function (var Playerinfo: TPlayerinfo; const CurSentence: Cardinal): boolean; stdcall;
+ //Is Executed on Finish, Returns the Playernum of the Winner
+ fModi_Finish = function (var Playerinfo: TPlayerinfo): byte; stdcall;
+ //Procedure called when new Sound Data is available
+ pModi_RData = procedure (handle: HSTREAM; buffer: Pointer; len: DWORD; user: DWORD); stdcall;
+
+implementation
+
+end.
diff --git a/Modis/SDK/StrUtils.pas b/Modis/SDK/StrUtils.pas
new file mode 100644
index 00000000..276d95a2
--- /dev/null
+++ b/Modis/SDK/StrUtils.pas
@@ -0,0 +1,70 @@
+unit StrUtils;
+
+interface
+uses ModiSDK;
+
+//function StrToAChar(Str: String): AChar;
+function CreateStr(Str: PChar): PChar;
+procedure FreeStr(Str: PChar);
+
+implementation
+
+{function StrToAChar(Str: String): AChar;
+var
+ L, I: Integer;
+begin
+ L := Length(Str);
+ For I := 0 to L-1 do
+ AChar[I] := Str[I+1];
+
+ For I := L to 254 do
+ AChar[I] := #0;
+end; }
+
+function StrCopy(Dest, Source: PChar): PChar; assembler;
+asm
+ PUSH EDI
+ PUSH ESI
+ MOV ESI,EAX
+ MOV EDI,EDX
+ MOV ECX,0FFFFFFFFH
+ XOR AL,AL
+ REPNE SCASB
+ NOT ECX
+ MOV EDI,ESI
+ MOV ESI,EDX
+ MOV EDX,ECX
+ MOV EAX,EDI
+ SHR ECX,2
+ REP MOVSD
+ MOV ECX,EDX
+ AND ECX,3
+ REP MOVSB
+ POP ESI
+ POP EDI
+end;
+
+function StrLen(Str: PChar): Cardinal; assembler;
+asm
+ MOV EDX,EDI
+ MOV EDI,EAX
+ MOV ECX,0FFFFFFFFH
+ XOR AL,AL
+ REPNE SCASB
+ MOV EAX,0FFFFFFFEH
+ SUB EAX,ECX
+ MOV EDI,EDX
+end;
+
+function CreateStr(Str: PChar): PChar;
+begin
+ GetMem(Result, StrLen(Str) + 1);
+ StrCopy(Result, Str);
+end;
+
+procedure FreeStr(Str: PChar);
+begin
+ FreeMem(Str);
+end;
+
+end. \ No newline at end of file
diff --git a/Modis/Team_Duell/TeamDuell.dpr b/Modis/Team_Duell/TeamDuell.dpr
new file mode 100644
index 00000000..5b90e8ad
--- /dev/null
+++ b/Modis/Team_Duell/TeamDuell.dpr
@@ -0,0 +1,237 @@
+library TeamDuell ;
+
+uses
+ ModiSDK in '..\SDK\ModiSDK.pas',
+ StrUtils in '..\SDK\StrUtils.pas',
+ sysutils,
+ OpenGL12,
+ Windows;
+
+var
+ TeamPlayer: array of array of String;
+ StartPoints: array of integer;
+ CurSinger, NextSinger: array[0..2] of Integer;
+ MethodRec: TMethodRec;
+ SPT, PlayerSelected: array[0..2] of Integer;
+ TtoNextChange, starttick, endtick, ChangeOnSentence : Cardinal;
+ bps, RTtoNextChange: Double;
+ firsttime, secondtime: boolean;
+
+
+//Gave the Plugins Info
+procedure PluginInfo (var Info: TPluginInfo); stdcall;
+begin
+ Info.Name := 'PLUGIN_TEAMDUELL_NAME';
+
+ Info.Creator := 'jekatt';
+ Info.PluginDesc := 'PLUGIN_TEAMDUELL_DESC';
+
+ Info.Typ := 8;
+
+ Info.NumPlayers := 31;
+ //Options
+ Info.LoadSong := True; //Whether or not a Song should be Loaded
+ //Only When Song is Loaded:
+ Info.ShowScore := True; //Whether or not the Score should be shown
+ Info.ShowNotes := True; //Whether the Note Lines should be displayed
+ Info.LoadVideo := True; //Should the Video be loaded ?
+ Info.LoadBack := True; //Should the Background be loaded ?
+
+ Info.BGShowFull := False; //Whether the Background or the Video should be shown Fullsize
+ Info.BGShowFull_O := True; //Whether the Background or the Video should be shown Fullsize
+
+ Info.ShowRateBar:= True; //Whether the Bar that shows how good the player was sould be displayed
+ Info.ShowRateBar_O := false; //Load from Ini whether the Bar should be Displayed
+
+ Info.EnLineBonus := False; //Whether LineBonus Should be enabled
+ Info.EnLineBonus_O := True; //Load from Ini whether LineBonus Should be enabled
+
+ //Options even when song is Not loaded
+ Info.ShowBars := False; //Whether the White Bars on Top and Bottom should be Drawn
+ Info.TeamModeOnly := True; //If True the Plugin can only be Played in Team Mode
+ Info.GetSoundData := False; //If True the RData Procedure is called when new SoundData is available
+ Info.Dummy := False; //Should be Set to False... for Updateing Plugin Interface
+end;
+
+//Executed on Game Start //If True Game begins, else Failure
+function Init (const TeamInfo: TTeamInfo; var Playerinfo: TPlayerinfo; const Sentences: TSentences; const Methods: TMethodRec): boolean; stdcall;
+var
+I,J: Integer;
+begin
+ // Get beginning of sentences
+ for I := 0 to Sentences.High do begin
+ SetLength(Startpoints, I+1);
+ Startpoints[I]:=Sentences.Sentence[I].Start;
+ end;
+ // Get Teams and Players
+ for I := 0 to TeamInfo.NumTeams-1 do
+ begin
+ SetLength(TeamPlayer, I+1);
+ for J := 0 to TeamInfo.Teaminfo[I].NumPlayers-1 do
+ begin
+ SetLength(TeamPlayer[I], J+1);
+ TeamPlayer[I,J] := Copy(String(TeamInfo.Teaminfo[I].Playerinfo[J].Name),1,8);
+ If (NOT(TeamPlayer[I,J] = (String(TeamInfo.Teaminfo[I].Playerinfo[J].Name)))) THEN TeamPlayer[I,J] := TeamPlayer[I,J]+'.';
+ SPT[I]:=J+1;
+ end;
+ CurSinger[I] := TeamInfo.Teaminfo[I].CurPlayer;
+ repeat
+ NextSinger[I] := random(SPT[I]);
+ until NOT(NextSinger[I] = CurSinger[I]) OR (SPT[I] = 1) ;
+ end;
+ ChangeOnSentence := 8;
+ starttick := GetTickCount;
+ firsttime := true;
+ secondtime := true;
+ bps := 1;
+ MethodRec := Methods;
+ LoadOpenGL;
+ Result := True;
+end;
+
+//Executed everytime the Screen is Drawed //If False The Game finishes
+function Draw (var Playerinfo: TPlayerinfo; const CurSentence: Cardinal): boolean; stdcall;
+var
+ I,timeline,x,y: Integer;
+ display: PChar;
+ start: boolean;
+begin
+ // TickCount(firstSentence) (not zero!)
+ If (CurSentence = ChangeOnSentence - 7) AND (firsttime) then
+ begin
+ firsttime := false;
+ starttick := GetTickCount;
+ end;
+ start := false;
+ // show first singers for 5sec
+ if (CurSentence < 1) AND ((starttick + 5000) > GetTickCount) then begin start := true; end;
+
+ // TickCount(thirdSentence)
+ If (CurSentence = 3) AND (secondtime) then
+ begin
+ secondtime := false;
+ firsttime := true;
+ endtick := GetTickCount;
+ bps := (Startpoints[3]-Startpoints[1]) * 1000 / (endtick-starttick); // BeatsPerSecond
+ end;
+
+ // Time to next Change
+ RTtoNextChange := ((Startpoints[ChangeOnSentence]-Startpoints[ChangeOnSentence - 7]) / bps) - ((GetTickCount - starttick) / 1000);
+ TtoNextChange := Trunc(RTtoNextChange) +1;
+
+ // Next Singer for Team I
+ for I := 0 to High(TeamPlayer) do begin
+ if (CurSentence = ChangeOnSentence) AND NOT(PlayerSelected[I] = CurSentence) then begin
+ PlayerSelected[I] := CurSentence;
+ CurSinger[I] := NextSinger[I];
+ repeat
+ NextSinger[I] := random(SPT[I]);
+ until NOT(NextSinger[I] = CurSinger[I]) OR (SPT[I] = 1) ;
+ end;
+
+ // display bg
+ glColor4f (0.8, 0.8, 0.8, 1);
+ display := PChar(TeamPlayer[I,CurSinger[I]]);
+ if (TtoNextChange <= 11) OR (start = true) Then begin
+ glEnable(GL_TEXTURE_2D);
+ glDisable(GL_BLEND);
+ glColor4f (0, 0, 0, 1);
+ glBegin(GL_QUADS);
+ glVertex2f(PlayerInfo.Playerinfo[I].PosX, PlayerInfo.Playerinfo[I].PosY+8);
+ glVertex2f(PlayerInfo.Playerinfo[I].PosX, PlayerInfo.Playerinfo[I].PosY + 30);
+ glVertex2f(PlayerInfo.Playerinfo[I].PosX + 100, PlayerInfo.Playerinfo[I].PosY + 30);
+ glVertex2f(PlayerInfo.Playerinfo[I].PosX + 100, PlayerInfo.Playerinfo[I].PosY+8);
+ glEnd;
+ display := 'Next Singer';
+
+ // timeline
+ x:= 270; y:= 472;
+ if (TtoNextChange <= 5) AND (RTtoNextChange > 0) then begin
+ timeline := Trunc(RTtoNextChange*50);
+ glColor3f (0, 0, 0);
+ glBegin(GL_QUADS);
+ glVertex2f(x, y);
+ glVertex2f(x, y+18);
+ glVertex2f(x+6+250, y+18);
+ glVertex2f(x+6+250, y);
+ glEnd;
+ glColor3f (0.2, 0.2, 0.2);
+ glBegin(GL_QUADS);
+ glVertex2f(x+3, y+3);
+ glVertex2f(x+3, y+15);
+ glVertex2f(x+3+250, y+15);
+ glVertex2f(x+3+250, y+3);
+ glEnd;
+ glColor3f (0.8, 0.2, 0.2);
+ glBegin(GL_QUADS);
+ glColor3f (0.9, 0, 0); glVertex2f(x+3, y+3);
+ glColor3f (0.8, 0.3, 0.3); glVertex2f(x+3, y+15);
+ glColor3f (0.8, 0.3, 0.3); glVertex2f(x+3+timeline, y+15);
+ glColor3f (0.9, 0, 0); glVertex2f(x+3+timeline, y+3);
+ glEnd;
+ end;
+ glDisable(GL_TEXTURE_2D);
+ end;
+
+ // Names, Timer
+ if (TtoNextChange <= 9) Then begin display := PChar(TeamPlayer[I,NextSinger[I]]);
+ glColor4f (0.8, 0.1, 0.2, 1);
+ MethodRec.Print (1, 6, PlayerInfo.Playerinfo[I].PosX+85, PlayerInfo.Playerinfo[I].PosY+10, CreateStr(PChar(IntToStr(Trunc(TtoNextChange)))));
+ end;
+ glColor4f (0.8, 0.8, 0.8, 1);
+ if (CurSentence = 0) then display := PChar(TeamPlayer[I,CurSinger[I]]);
+ if (TtoNextChange <= 11) OR (start) Then MethodRec.Print (1, 6, PlayerInfo.Playerinfo[I].PosX+5, PlayerInfo.Playerinfo[I].PosY+10, display);
+ end;
+ if (CurSentence = ChangeOnSentence) then begin ChangeOnSentence := CurSentence + 7; firsttime := true; end;
+Result := True;
+end;
+
+//Is Executed on Finish, Returns the Playernum of the Winner
+function Finish (var Playerinfo: TPlayerinfo): byte; stdcall;
+var
+ I:Integer;
+ MaxScore: Word;
+begin
+ Result := 0;
+ MaxScore := 0;
+ for I := 0 to PlayerInfo.NumPlayers-1 do
+ begin
+ PlayerInfo.Playerinfo[I].Percentage := PlayerInfo.Playerinfo[I].Score div 9999;
+ if (PlayerInfo.Playerinfo[I].Score > MaxScore) then
+ begin
+ MaxScore := PlayerInfo.Playerinfo[I].Score;
+ Case I of
+ 0: Result := 1;
+ 1: Result := 2;
+ 2: Result := 4;
+ 3: Result := 8;
+ 4: Result := 16;
+ 5: Result := 32;
+ end;
+ end
+ else if (PlayerInfo.Playerinfo[I].Score = MaxScore) AND (PlayerInfo.Playerinfo[I].Score <> 0) then
+ begin
+ Case I of
+ 0: Result := Result OR 1;
+ 1: Result := Result OR 2;
+ 2: Result := Result OR 4;
+ 3: Result := Result OR 8;
+ 4: Result := Result OR 16;
+ 5: Result := Result OR 32;
+ end;
+ end;
+ end;
+
+ //When nobody has Points -> Everybody loose
+ if (MaxScore = 0) then
+ Result := 0;
+end;
+
+exports
+PluginInfo, Init, Draw, Finish;
+
+begin
+
+end.
+
+
diff --git a/ScoreConverter/ScoreConverter.dpr b/ScoreConverter/ScoreConverter.dpr
new file mode 100644
index 00000000..5736b733
--- /dev/null
+++ b/ScoreConverter/ScoreConverter.dpr
@@ -0,0 +1,17 @@
+program ScoreConverter;
+
+uses
+ Forms,
+ Umainform in 'Umainform.pas' {mainform},
+ UScores in 'UScores.pas',
+ UDataBase in '..\Game\Code\Classes\UDataBase.pas',
+ USongs in 'USongs.pas';
+
+{$R *.res}
+
+begin
+ Application.Initialize;
+ Application.Title := 'Score Converter';
+ Application.CreateForm(Tmainform, mainform);
+ Application.Run;
+end.
diff --git a/ScoreConverter/ScoreConverter.ico b/ScoreConverter/ScoreConverter.ico
new file mode 100644
index 00000000..80319014
--- /dev/null
+++ b/ScoreConverter/ScoreConverter.ico
Binary files differ
diff --git a/ScoreConverter/ScoreConverter.res b/ScoreConverter/ScoreConverter.res
new file mode 100644
index 00000000..2d3bea87
--- /dev/null
+++ b/ScoreConverter/ScoreConverter.res
Binary files differ
diff --git a/ScoreConverter/UScores.pas b/ScoreConverter/UScores.pas
new file mode 100644
index 00000000..3e2c4e92
--- /dev/null
+++ b/ScoreConverter/UScores.pas
@@ -0,0 +1,102 @@
+unit UScores;
+
+interface
+
+uses USongs;
+
+procedure ReadScore(var Song: TSong);
+procedure WriteScore(var Song: TSong);
+procedure AddScore(var Song: TSong; Level: integer; Name: string; Score: integer);
+
+implementation
+
+uses IniFiles, SysUtils;
+
+procedure ReadScore(var Song: TSong);
+var
+ F: TIniFile;
+ S: string;
+ P: integer;
+ Lev: integer;
+ LevS: string;
+begin
+ F := TIniFile.Create(Song.Path + ChangeFileExt(Song.FileName, '.sco'));
+
+ for Lev := 0 to 2 do begin
+ case Lev of
+ 0: LevS := 'Easy';
+ 1: LevS := 'Normal';
+ 2: LevS := 'Hard';
+ end;
+
+ P := 1;
+ S := F.ReadString(LevS + IntToStr(P), 'Name', '');
+ while (S <> '') and (P<=5) do begin
+ SetLength(Song.Score[Lev], P);
+ Song.Score[Lev, P-1].Name := S;
+ Song.Score[Lev, P-1].Score := F.ReadInteger(LevS + IntToStr(P), 'Score', 0);
+
+ Inc(P);
+ S := F.ReadString(LevS + IntToStr(P), 'Name', '');
+ end;
+ end;
+end;
+
+procedure AddScore(var Song: TSong; Level: integer; Name: string; Score: integer);
+var
+ S: integer;
+ S2: integer;
+begin
+ S := 0;
+ while (S <= High(Song.Score[Level])) and (Score <= Song.Score[Level, S].Score) do
+ Inc(S);
+ // S has the number for new score
+
+
+ // we create new score
+ SetLength(Song.Score[Level], Length(Song.Score[Level]) + 1);
+
+ // we move down old scores
+ for S2 := High(Song.Score[Level])-1 downto S do
+ Song.Score[Level, S2+1] := Song.Score[Level, S2];
+
+ // we fill new score
+ Song.Score[Level, S].Name := Name;
+ Song.Score[Level, S].Score := Score;
+
+ if Length(Song.Score[Level]) > 5 then begin
+ SetLength(Song.Score[Level], 5);
+ end;
+end;
+
+procedure WriteScore(var Song: TSong);
+var
+ F: TIniFile;
+ S: integer;
+ Lev: integer;
+ LevS: string;
+ FileName: string;
+begin
+ FileName := Song.Path + ChangeFileExt(Song.FileName, '.sco');
+ if (not FileExists(FileName)) or (FileExists(FileName) and DeleteFile(FileName)) then begin
+ // file has been deleted -> creating new file
+ F := TIniFile.Create(FileName);
+
+ for Lev := 0 to 2 do begin
+ case Lev of
+ 0: LevS := 'Easy';
+ 1: LevS := 'Normal';
+ 2: LevS := 'Hard';
+ end;
+
+ for S := 0 to high(Song.Score[Lev]) do begin
+ F.WriteString(LevS + IntToStr(S+1), 'Name', Song.Score[Lev, S].Name);
+ F.WriteInteger(LevS + IntToStr(S+1), 'Score', Song.Score[Lev, S].Score);
+
+ end; // for S
+ end; // for Lev
+ F.Free;
+ end; // if
+end;
+
+end.
diff --git a/ScoreConverter/USongs.pas b/ScoreConverter/USongs.pas
new file mode 100644
index 00000000..a43ea61e
--- /dev/null
+++ b/ScoreConverter/USongs.pas
@@ -0,0 +1,160 @@
+unit USongs;
+
+interface
+
+type
+ TScore = record
+ Name: string;
+ Score: integer;
+ Length: string;
+ end;
+
+ TSong = record
+ Path: string;
+ FileName: string;
+
+ Title: string;
+ Artist: string;
+
+ Score: array[0..2] of array of TScore;
+ end;
+
+ TSongs = class
+ LastCount: Integer;
+ Song: array of TSong; // array of songs
+
+ function ReadHeader(var rSong: TSong): boolean;
+ procedure BrowseDir(Dir: string); // Browse a dir + subdirs for songfiles
+ end;
+
+ var Songs: TSongs;
+
+implementation
+uses Sysutils, UMainForm, Dialogs;
+
+function TSongs.ReadHeader(var rSong: TSong): boolean;
+var
+ Line, Identifier, Value: String;
+ Temp: word;
+ Done: byte;
+ SongFile: Textfile;
+begin
+ Result := False;
+
+
+ //Open File and set File Pointer to the beginning
+ AssignFile(SongFile, rSong.Path + rSong.FileName);
+ Reset(SongFile);
+
+ //Read Header
+ Result := true;
+
+ //Read first Line
+ ReadLn (SongFile, Line);
+
+ if (Length(Line)<=0) then
+ begin
+ Result := False;
+ Exit;
+ end;
+ Done := 0;
+ //Read Lines while Line starts with #
+ While (Line[1] = '#') do
+ begin
+ Temp := Pos(':', Line);
+
+ //Line has a Seperator-> Headerline
+ if (Temp <> 0) then
+ begin
+ //Read Identifier and Value
+ Identifier := Uppercase(Trim(Copy(Line, 2, Temp - 2))); //Uppercase is for Case Insensitive Checks
+ Value := Trim(Copy(Line, Temp + 1,Length(Line) - Temp));
+
+ //Check the Identifier (If Value is given)
+ if (Length(Value) <> 0) then
+ begin
+
+ //-----------
+ //Required Attributes
+ //-----------
+
+ //Title
+ if (Identifier = 'TITLE') then
+ begin
+ rSong.Title := Value;
+
+ //Add Title Flag to Done
+ Done := Done or 1;
+ end
+
+ //Artist
+ else if (Identifier = 'ARTIST') then
+ begin
+ rSong.Artist := Value;
+
+ //Add Artist Flag to Done
+ Done := Done or 2;
+ end;
+
+ end;
+ end;
+
+ if not EOf(SongFile) then
+ ReadLn (SongFile, Line)
+ else
+ begin
+ Result := False;
+ break;
+ end;
+
+ //End on first empty Line
+ if (Length(Line) = 0) then
+ break;
+ end;
+
+ //Check if all Required Values are given
+ if (Done <> 3) then
+ begin
+ Result := False;
+ end;
+
+ //And Close File
+ CloseFile(SongFile);
+end;
+
+procedure TSongs.BrowseDir(Dir: string);
+var
+ SR: TSearchRec; // for parsing Songs Directory
+ SLen: integer;
+begin
+ if FindFirst(Dir + '*', faDirectory, SR) = 0 then begin
+ repeat
+ if (SR.Name <> '.') and (SR.Name <> '..') then
+ BrowseDir(Dir + Sr.Name + '\');
+ until FindNext(SR) <> 0;
+ end;
+ FindClose(SR);
+
+ if FindFirst(Dir + '*.txt', 0, SR) = 0 then begin
+ repeat
+ SLen := Length(Song);
+ SetLength(Song, SLen + 1);
+
+ Song[SLen].Path := Dir;
+ Song[SLen].FileName := SR.Name;
+
+ if (ReadHeader(Song[SLen]) = false) then SetLength(Song, SLen);
+
+ //update Songs Label
+ if LastCount <> SLen div 30 then
+ begin
+ LastCount := SLen div 30;
+ MainForm.UpdateLoadedSongs(Dir, SLen);
+ end;
+
+ until FindNext(SR) <> 0;
+ end; // if FindFirst
+ FindClose(SR);
+end;
+
+end.
diff --git a/ScoreConverter/Umainform.dfm b/ScoreConverter/Umainform.dfm
new file mode 100644
index 00000000..a4291e7b
--- /dev/null
+++ b/ScoreConverter/Umainform.dfm
@@ -0,0 +1,123 @@
+object mainform: Tmainform
+ Left = 328
+ Top = 228
+ HorzScrollBar.Visible = False
+ VertScrollBar.Visible = False
+ BorderIcons = [biSystemMenu, biMinimize]
+ BorderStyle = bsSingle
+ Caption = 'Ultrastar Deluxe Score Converter'
+ ClientHeight = 159
+ ClientWidth = 449
+ Color = clBtnFace
+ Font.Charset = DEFAULT_CHARSET
+ Font.Color = clWindowText
+ Font.Height = -11
+ Font.Name = 'MS Sans Serif'
+ Font.Style = []
+ OldCreateOrder = False
+ Position = poDesktopCenter
+ OnCreate = FormCreate
+ PixelsPerInch = 96
+ TextHeight = 13
+ object Label1: TLabel
+ Left = 8
+ Top = 8
+ Width = 60
+ Height = 13
+ Caption = 'SongFolder: '
+ end
+ object lFolder: TLabel
+ Left = 8
+ Top = 24
+ Width = 29
+ Height = 13
+ Caption = 'Folder'
+ end
+ object Label2: TLabel
+ Left = 8
+ Top = 48
+ Width = 49
+ Height = 13
+ Caption = 'Database:'
+ end
+ object lDatabase: TLabel
+ Left = 8
+ Top = 64
+ Width = 46
+ Height = 13
+ Caption = 'Database'
+ end
+ object lDatabase2: TLabel
+ Left = 72
+ Top = 48
+ Width = 54
+ Height = 13
+ Caption = 'lDatabase2'
+ end
+ object lFolder2: TLabel
+ Left = 72
+ Top = 8
+ Width = 37
+ Height = 13
+ Caption = 'lFolder2'
+ end
+ object lStatus: TLabel
+ Left = 0
+ Top = 96
+ Width = 449
+ Height = 13
+ Alignment = taCenter
+ AutoSize = False
+ Caption = 'lStatus'
+ end
+ object bFLoad: TButton
+ Left = 176
+ Top = 8
+ Width = 57
+ Height = 17
+ Caption = 'Load'
+ TabOrder = 0
+ OnClick = bFLoadClick
+ end
+ object bDLoad: TButton
+ Left = 176
+ Top = 48
+ Width = 57
+ Height = 17
+ Caption = 'Load'
+ TabOrder = 1
+ OnClick = bDLoadClick
+ end
+ object bToDB: TButton
+ Left = 16
+ Top = 112
+ Width = 153
+ Height = 17
+ Caption = 'Convert *.SCO to Database'
+ Enabled = False
+ TabOrder = 2
+ OnClick = bToDBClick
+ end
+ object bFromDB: TButton
+ Left = 288
+ Top = 112
+ Width = 145
+ Height = 17
+ Caption = 'Convert Database to *.SCO'
+ Enabled = False
+ TabOrder = 3
+ OnClick = bFromDBClick
+ end
+ object pProgress: TProgressBar
+ Left = 8
+ Top = 136
+ Width = 433
+ Height = 17
+ TabOrder = 4
+ end
+ object oDatabase: TOpenDialog
+ Filter = 'Ultrastar Deluxe Database|ultrastar.db'
+ Left = 136
+ Top = 48
+ end
+end
diff --git a/ScoreConverter/Umainform.pas b/ScoreConverter/Umainform.pas
new file mode 100644
index 00000000..c5cc5347
--- /dev/null
+++ b/ScoreConverter/Umainform.pas
@@ -0,0 +1,230 @@
+unit Umainform;
+
+interface
+
+uses
+ Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
+ Dialogs, StdCtrls, ComCtrls, UDataBase, ShellAPI, ShlObj, USongs;
+
+type
+ Tmainform = class(TForm)
+ Label1: TLabel;
+ lFolder: TLabel;
+ bFLoad: TButton;
+ Label2: TLabel;
+ lDatabase: TLabel;
+ bDLoad: TButton;
+ lDatabase2: TLabel;
+ lFolder2: TLabel;
+ bToDB: TButton;
+ bFromDB: TButton;
+ pProgress: TProgressBar;
+ oDatabase: TOpenDialog;
+ lStatus: TLabel;
+ procedure FormCreate(Sender: TObject);
+ procedure bDLoadClick(Sender: TObject);
+ function BrowseDialog (const Title: string; const Flag: integer): string;
+ procedure bFLoadClick(Sender: TObject);
+ procedure UpdateLoadedSongs(Path: String; Count: integer);
+ procedure bToDBClick(Sender: TObject);
+ procedure bFromDBClick(Sender: TObject);
+ private
+ { Private-Deklarationen }
+ public
+ { Public-Deklarationen }
+ end;
+
+var
+ mainform: Tmainform;
+ DBLoaded: Boolean;
+ SFLoaded: Boolean;
+
+
+implementation
+
+uses UScores;
+
+{$R *.dfm}
+
+function Tmainform.BrowseDialog
+ (const Title: string; const Flag: integer): string;
+var
+ lpItemID : PItemIDList;
+ BrowseInfo : TBrowseInfo;
+ DisplayName : array[0..MAX_PATH] of char;
+ TempPath : array[0..MAX_PATH] of char;
+begin
+ Result:='';
+ FillChar(BrowseInfo, sizeof(TBrowseInfo), #0);
+ with BrowseInfo do begin
+ hwndOwner := Application.Handle;
+ pszDisplayName := @DisplayName;
+ lpszTitle := PChar(Title);
+ ulFlags := Flag;
+ end;
+ lpItemID := SHBrowseForFolder(BrowseInfo);
+ if lpItemId <> nil then begin
+ SHGetPathFromIDList(lpItemID, TempPath);
+ Result := TempPath;
+ GlobalFreePtr(lpItemID);
+ end;
+end;
+
+procedure Tmainform.FormCreate(Sender: TObject);
+begin
+ Database := TDataBaseSystem.Create;
+ Songs := TSongs.Create;
+ lStatus.Caption := 'Welcome to USD Score Converter';
+ lFolder2.Caption := 'No Songs loaded';
+ lFolder.Caption := '';
+ lDataBase2.Caption := 'No Database loaded';
+ lDataBase.Caption := '';
+end;
+
+procedure Tmainform.bDLoadClick(Sender: TObject);
+begin
+ if oDatabase.Execute then
+ begin
+ try
+ Database.Init(oDataBase.FileName);
+ lDataBase2.Caption := 'Database loaded';
+ lDataBase.Caption := oDataBase.FileName;
+ DBLoaded := True;
+ except
+ lDataBase2.Caption := 'No Database loaded';
+ lDataBase.Caption := '';
+ DBLoaded := False;
+ end;
+ end;
+ bToDB.Enabled := DBLoaded and SFLoaded;
+ bFromDB.Enabled := bToDB.Enabled;
+end;
+
+procedure Tmainform.bFLoadClick(Sender: TObject);
+var
+ Path: String;
+begin
+ Path := BrowseDialog('Select UltraStar SongFolder', BIF_RETURNONLYFSDIRS);
+
+ if Path <> '' then
+ begin
+ SetLength(Songs.Song, 0);
+ try
+ Songs.BrowseDir(Path + '\');
+ lFolder2.Caption := Inttostr(Length(Songs.Song)) + ' Songs loaded';
+ lFolder.Caption := Path;
+ SFLoaded := True;
+ except
+ lFolder2.Caption := 'No Songs loaded';
+ lFolder.Caption := '';
+ SFLoaded := False;
+ end;
+ end;
+
+ bToDB.Enabled := DBLoaded and SFLoaded;
+ bFromDB.Enabled := bToDB.Enabled;
+end;
+
+procedure Tmainform.UpdateLoadedSongs(Path: String; Count: integer);
+begin
+ lFolder2.Caption := Inttostr(Count) + ' Songs loaded';
+ lFolder.Caption := Path;
+ Application.ProcessMessages;
+end;
+
+procedure Tmainform.bToDBClick(Sender: TObject);
+var
+ I, J, K: Integer;
+ LastI: integer;
+begin
+ if (Messagebox(0, PChar('If the same directory is added more than one time the Score-File will be useless. Contìnue ?'), PChar(Mainform.Caption), MB_ICONWARNING or MB_YESNO) = IDYes) then
+ begin
+ pProgress.Max := high(Songs.Song);
+ pProgress.Position := 0;
+ // Go through all Songs
+ For I := 0 to high(Songs.Song) do
+ begin
+ try
+ //Read Scores from .SCO File
+ ReadScore (Songs.Song[I]);
+
+ //Go from Easy to Difficult
+ For J := 0 to 2 do
+ begin
+ //Go through all Score Entrys with Difficulty J
+ For K := 0 to high(Songs.Song[I].Score[J]) do
+ begin
+ //Add to DataBase
+ DataBase.AddScore(Songs.Song[I], J, Songs.Song[I].Score[J][K].Name, Songs.Song[I].Score[J][K].Score);
+ end;
+ end;
+
+ except
+ showmessage ('Error Converting Score From Song: ' + Songs.Song[I].Path + Songs.Song[I].FileName);
+ end;
+
+ //Update ProgressBar
+ J := I div 30;
+ if (LastI <> J) then
+ begin
+ LastI := J;
+ pProgress.Position := I;
+ lStatus.Caption := 'Adding Songscore: ' + Songs.Song[I].Artist + ' - ' + Songs.Song[I].Title;
+ Application.ProcessMessages;
+ end;
+ end;
+
+ pProgress.Position := pProgress.Max;
+ lStatus.Caption := 'Finished';
+ end;
+end;
+
+procedure Tmainform.bFromDBClick(Sender: TObject);
+var
+ I, J: Integer;
+ LastI: integer;
+ anyScoreinthere: boolean;
+begin
+ if (Messagebox(0, PChar('All Score Entrys in the Song Directory having an equivalent will be Overwritten. Contìnue ?'), PChar(Mainform.Caption), MB_ICONWARNING or MB_YESNO) = IDYes) then
+ begin
+ pProgress.Max := high(Songs.Song);
+ pProgress.Position := 0;
+ // Go through all Songs
+ For I := 0 to high(Songs.Song) do
+ begin
+ try
+ //Not Write ScoreFile when there are no Scores for this File
+ anyScoreinthere := false;
+ //Read Scores from DB File
+ Database.ReadScore (Songs.Song[I]);
+
+ //Go from Easy to Difficult
+ For J := 0 to 2 do
+ begin
+ anyScoreinthere := anyScoreinthere or (Length(Songs.Song[I].Score[J]) > 0);
+ end;
+
+ if AnyScoreinThere then
+ WriteScore(Songs.Song[I]);
+
+ except
+ showmessage ('Error Converting Score From Song: ' + Songs.Song[I].Path + Songs.Song[I].FileName);
+ end;
+
+ //Update ProgressBar
+ J := I div 30;
+ if (LastI <> J) then
+ begin
+ LastI := J;
+ pProgress.Position := I;
+ lStatus.Caption := 'Writing ScoreFile: ' + Songs.Song[I].Artist + ' - ' + Songs.Song[I].Title;
+ Application.ProcessMessages;
+ end;
+ end;
+
+ pProgress.Position := pProgress.Max;
+ lStatus.Caption := 'Finished';
+ end;
+end;
+
+end.
diff --git a/Skins/Classic/Star.ini b/Skins/Classic/Star.ini
new file mode 100644
index 00000000..314fac01
--- /dev/null
+++ b/Skins/Classic/Star.ini
@@ -0,0 +1,153 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=Classic
+Name=Star
+Creator=UltraStar Deluxe Team
+Color=Blue
+
+[Textures]
+
+# # # M A I N # # #
+Button = [main]Button.jpg
+ButtonF = [main]ButtonEditor.jpg
+MainBar = [main]Bar.jpg
+Logo = [main]Logo.jpg
+
+#Backgrounds
+#LoadingBG = #Placeholder for new Classic Skins
+#MainBG =
+#SongBG =
+#ScoresBG =
+#Top5BG =
+#OptionsBG =
+#PartyBG =
+
+#Icons on screen
+MainIcon = [icon]Star.jpg
+IconQuestion = [icon]question.jpg
+IconError = [icon]error.jpg
+VideoIcon = [icon]video.jpg
+
+# # # M A I N S C R E E N # # #
+ButtonSolo = [mainbutton]Solo.jpg
+ButtonMulti = [mainbutton]Multi.jpg
+ButtonEditor = [mainbutton]Solo.jpg
+ButtonStats = [mainbutton]Stats.jpg
+ButtonOptions = [mainbutton]Options.jpg
+ButtonExit = [mainbutton]Exit.jpg
+
+# # # S O N G S E L E C E T # # #
+SongSelection = [song]selection.jpg
+SongFade = [song]BGFade.jpg
+SongEqualizerBG= [song]EqualizerBG.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar (not skinned in this theme :P )
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]Box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =[party]winDecoration.jpg
+PartyWinDeco2 =[party]winDecoration.jpg
+PartyWinDeco3 =[party]winDecoration.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonE = [button]e.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+JumpToBG = [menu]JumptoBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuBorder = [menu]songMenuBorder.jpg
+SongMenuButton = [menu]songMenuButtonBG.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg \ No newline at end of file
diff --git a/Skins/Classic/Thumbs.db b/Skins/Classic/Thumbs.db
new file mode 100644
index 00000000..1e3e9328
--- /dev/null
+++ b/Skins/Classic/Thumbs.db
Binary files differ
diff --git a/Skins/Classic/[button]13.jpg b/Skins/Classic/[button]13.jpg
new file mode 100644
index 00000000..5787bb24
--- /dev/null
+++ b/Skins/Classic/[button]13.jpg
Binary files differ
diff --git a/Skins/Classic/[button]alt.jpg b/Skins/Classic/[button]alt.jpg
new file mode 100644
index 00000000..ec3e630f
--- /dev/null
+++ b/Skins/Classic/[button]alt.jpg
Binary files differ
diff --git a/Skins/Classic/[button]az.jpg b/Skins/Classic/[button]az.jpg
new file mode 100644
index 00000000..b486604e
--- /dev/null
+++ b/Skins/Classic/[button]az.jpg
Binary files differ
diff --git a/Skins/Classic/[button]e.jpg b/Skins/Classic/[button]e.jpg
new file mode 100644
index 00000000..7b247260
--- /dev/null
+++ b/Skins/Classic/[button]e.jpg
Binary files differ
diff --git a/Skins/Classic/[button]enter.jpg b/Skins/Classic/[button]enter.jpg
new file mode 100644
index 00000000..16ee885a
--- /dev/null
+++ b/Skins/Classic/[button]enter.jpg
Binary files differ
diff --git a/Skins/Classic/[button]esc.jpg b/Skins/Classic/[button]esc.jpg
new file mode 100644
index 00000000..7c40487a
--- /dev/null
+++ b/Skins/Classic/[button]esc.jpg
Binary files differ
diff --git a/Skins/Classic/[button]j.jpg b/Skins/Classic/[button]j.jpg
new file mode 100644
index 00000000..b6eed56c
--- /dev/null
+++ b/Skins/Classic/[button]j.jpg
Binary files differ
diff --git a/Skins/Classic/[button]m.jpg b/Skins/Classic/[button]m.jpg
new file mode 100644
index 00000000..ebb7156e
--- /dev/null
+++ b/Skins/Classic/[button]m.jpg
Binary files differ
diff --git a/Skins/Classic/[button]navi.jpg b/Skins/Classic/[button]navi.jpg
new file mode 100644
index 00000000..41b44525
--- /dev/null
+++ b/Skins/Classic/[button]navi.jpg
Binary files differ
diff --git a/Skins/Classic/[button]p.jpg b/Skins/Classic/[button]p.jpg
new file mode 100644
index 00000000..d2d60c02
--- /dev/null
+++ b/Skins/Classic/[button]p.jpg
Binary files differ
diff --git a/Skins/Classic/[effect]goldenNoteStar.jpg b/Skins/Classic/[effect]goldenNoteStar.jpg
new file mode 100644
index 00000000..1b31d267
--- /dev/null
+++ b/Skins/Classic/[effect]goldenNoteStar.jpg
Binary files differ
diff --git a/Skins/Classic/[effect]perfectNoteStar.jpg b/Skins/Classic/[effect]perfectNoteStar.jpg
new file mode 100644
index 00000000..189a22a3
--- /dev/null
+++ b/Skins/Classic/[effect]perfectNoteStar.jpg
Binary files differ
diff --git a/Skins/Classic/[helper]rectangle.jpg b/Skins/Classic/[helper]rectangle.jpg
new file mode 100644
index 00000000..e03f98fc
--- /dev/null
+++ b/Skins/Classic/[helper]rectangle.jpg
Binary files differ
diff --git a/Skins/Classic/[icon]Star.jpg b/Skins/Classic/[icon]Star.jpg
new file mode 100644
index 00000000..ee98f9d7
--- /dev/null
+++ b/Skins/Classic/[icon]Star.jpg
Binary files differ
diff --git a/Skins/Classic/[icon]error.jpg b/Skins/Classic/[icon]error.jpg
new file mode 100644
index 00000000..5802e312
--- /dev/null
+++ b/Skins/Classic/[icon]error.jpg
Binary files differ
diff --git a/Skins/Classic/[icon]question.jpg b/Skins/Classic/[icon]question.jpg
new file mode 100644
index 00000000..e78fe6a8
--- /dev/null
+++ b/Skins/Classic/[icon]question.jpg
Binary files differ
diff --git a/Skins/Classic/[icon]stats.jpg b/Skins/Classic/[icon]stats.jpg
new file mode 100644
index 00000000..cd5e03fb
--- /dev/null
+++ b/Skins/Classic/[icon]stats.jpg
Binary files differ
diff --git a/Skins/Classic/[icon]video.jpg b/Skins/Classic/[icon]video.jpg
new file mode 100644
index 00000000..12d71add
--- /dev/null
+++ b/Skins/Classic/[icon]video.jpg
Binary files differ
diff --git a/Skins/Classic/[main]Bar.jpg b/Skins/Classic/[main]Bar.jpg
new file mode 100644
index 00000000..2453cc3b
--- /dev/null
+++ b/Skins/Classic/[main]Bar.jpg
Binary files differ
diff --git a/Skins/Classic/[main]Bar1.jpg b/Skins/Classic/[main]Bar1.jpg
new file mode 100644
index 00000000..4e9693e3
--- /dev/null
+++ b/Skins/Classic/[main]Bar1.jpg
Binary files differ
diff --git a/Skins/Classic/[main]Button.jpg b/Skins/Classic/[main]Button.jpg
new file mode 100644
index 00000000..e6191a95
--- /dev/null
+++ b/Skins/Classic/[main]Button.jpg
Binary files differ
diff --git a/Skins/Classic/[main]Button2.jpg b/Skins/Classic/[main]Button2.jpg
new file mode 100644
index 00000000..e3e9679a
--- /dev/null
+++ b/Skins/Classic/[main]Button2.jpg
Binary files differ
diff --git a/Skins/Classic/[main]Button3.jpg b/Skins/Classic/[main]Button3.jpg
new file mode 100644
index 00000000..3ac1f442
--- /dev/null
+++ b/Skins/Classic/[main]Button3.jpg
Binary files differ
diff --git a/Skins/Classic/[main]ButtonEditor.jpg b/Skins/Classic/[main]ButtonEditor.jpg
new file mode 100644
index 00000000..32e455ef
--- /dev/null
+++ b/Skins/Classic/[main]ButtonEditor.jpg
Binary files differ
diff --git a/Skins/Classic/[main]Logo.jpg b/Skins/Classic/[main]Logo.jpg
new file mode 100644
index 00000000..1902cb02
--- /dev/null
+++ b/Skins/Classic/[main]Logo.jpg
Binary files differ
diff --git a/Skins/Classic/[main]songCover.jpg b/Skins/Classic/[main]songCover.jpg
new file mode 100644
index 00000000..426bf22d
--- /dev/null
+++ b/Skins/Classic/[main]songCover.jpg
Binary files differ
diff --git a/Skins/Classic/[main]square.jpg b/Skins/Classic/[main]square.jpg
new file mode 100644
index 00000000..8af62b71
--- /dev/null
+++ b/Skins/Classic/[main]square.jpg
Binary files differ
diff --git a/Skins/Classic/[mainbutton]Exit.jpg b/Skins/Classic/[mainbutton]Exit.jpg
new file mode 100644
index 00000000..55494e65
--- /dev/null
+++ b/Skins/Classic/[mainbutton]Exit.jpg
Binary files differ
diff --git a/Skins/Classic/[mainbutton]Multi.jpg b/Skins/Classic/[mainbutton]Multi.jpg
new file mode 100644
index 00000000..ad5980d7
--- /dev/null
+++ b/Skins/Classic/[mainbutton]Multi.jpg
Binary files differ
diff --git a/Skins/Classic/[mainbutton]Options.jpg b/Skins/Classic/[mainbutton]Options.jpg
new file mode 100644
index 00000000..5e1bff71
--- /dev/null
+++ b/Skins/Classic/[mainbutton]Options.jpg
Binary files differ
diff --git a/Skins/Classic/[mainbutton]Solo.jpg b/Skins/Classic/[mainbutton]Solo.jpg
new file mode 100644
index 00000000..a7e3d82a
--- /dev/null
+++ b/Skins/Classic/[mainbutton]Solo.jpg
Binary files differ
diff --git a/Skins/Classic/[mainbutton]Stats.jpg b/Skins/Classic/[mainbutton]Stats.jpg
new file mode 100644
index 00000000..71cc13ad
--- /dev/null
+++ b/Skins/Classic/[mainbutton]Stats.jpg
Binary files differ
diff --git a/Skins/Classic/[menu]PopUpBg.JPG b/Skins/Classic/[menu]PopUpBg.JPG
new file mode 100644
index 00000000..1a23a90c
--- /dev/null
+++ b/Skins/Classic/[menu]PopUpBg.JPG
Binary files differ
diff --git a/Skins/Classic/[menu]PopUpFg.JPG b/Skins/Classic/[menu]PopUpFg.JPG
new file mode 100644
index 00000000..530d4cf9
--- /dev/null
+++ b/Skins/Classic/[menu]PopUpFg.JPG
Binary files differ
diff --git a/Skins/Classic/[menu]jumpToBg.jpg b/Skins/Classic/[menu]jumpToBg.jpg
new file mode 100644
index 00000000..d0cd1da8
--- /dev/null
+++ b/Skins/Classic/[menu]jumpToBg.jpg
Binary files differ
diff --git a/Skins/Classic/[menu]songMenuBg.jpg b/Skins/Classic/[menu]songMenuBg.jpg
new file mode 100644
index 00000000..e4242fc5
--- /dev/null
+++ b/Skins/Classic/[menu]songMenuBg.jpg
Binary files differ
diff --git a/Skins/Classic/[menu]songMenuBorder.jpg b/Skins/Classic/[menu]songMenuBorder.jpg
new file mode 100644
index 00000000..11dd0604
--- /dev/null
+++ b/Skins/Classic/[menu]songMenuBorder.jpg
Binary files differ
diff --git a/Skins/Classic/[menu]songMenuButtonBG.jpg b/Skins/Classic/[menu]songMenuButtonBG.jpg
new file mode 100644
index 00000000..53f0da59
--- /dev/null
+++ b/Skins/Classic/[menu]songMenuButtonBG.jpg
Binary files differ
diff --git a/Skins/Classic/[menu]songMenuSelectBG.jpg b/Skins/Classic/[menu]songMenuSelectBG.jpg
new file mode 100644
index 00000000..cd3041e2
--- /dev/null
+++ b/Skins/Classic/[menu]songMenuSelectBG.jpg
Binary files differ
diff --git a/Skins/Classic/[party]Joker.jpg b/Skins/Classic/[party]Joker.jpg
new file mode 100644
index 00000000..78b66936
--- /dev/null
+++ b/Skins/Classic/[party]Joker.jpg
Binary files differ
diff --git a/Skins/Classic/[party]playerButton.jpg b/Skins/Classic/[party]playerButton.jpg
new file mode 100644
index 00000000..15a34c66
--- /dev/null
+++ b/Skins/Classic/[party]playerButton.jpg
Binary files differ
diff --git a/Skins/Classic/[party]playerTeamButton.jpg b/Skins/Classic/[party]playerTeamButton.jpg
new file mode 100644
index 00000000..2faf9c4b
--- /dev/null
+++ b/Skins/Classic/[party]playerTeamButton.jpg
Binary files differ
diff --git a/Skins/Classic/[party]pointer.bmp b/Skins/Classic/[party]pointer.bmp
new file mode 100644
index 00000000..88bbcc3d
--- /dev/null
+++ b/Skins/Classic/[party]pointer.bmp
Binary files differ
diff --git a/Skins/Classic/[party]roundBG1.jpg b/Skins/Classic/[party]roundBG1.jpg
new file mode 100644
index 00000000..464aabea
--- /dev/null
+++ b/Skins/Classic/[party]roundBG1.jpg
Binary files differ
diff --git a/Skins/Classic/[party]roundBG2.jpg b/Skins/Classic/[party]roundBG2.jpg
new file mode 100644
index 00000000..3413958f
--- /dev/null
+++ b/Skins/Classic/[party]roundBG2.jpg
Binary files differ
diff --git a/Skins/Classic/[party]roundBG3.jpg b/Skins/Classic/[party]roundBG3.jpg
new file mode 100644
index 00000000..c6b53caf
--- /dev/null
+++ b/Skins/Classic/[party]roundBG3.jpg
Binary files differ
diff --git a/Skins/Classic/[party]roundBG4.jpg b/Skins/Classic/[party]roundBG4.jpg
new file mode 100644
index 00000000..5e4da0ac
--- /dev/null
+++ b/Skins/Classic/[party]roundBG4.jpg
Binary files differ
diff --git a/Skins/Classic/[party]roundTeamButton.jpg b/Skins/Classic/[party]roundTeamButton.jpg
new file mode 100644
index 00000000..692db1bd
--- /dev/null
+++ b/Skins/Classic/[party]roundTeamButton.jpg
Binary files differ
diff --git a/Skins/Classic/[party]scoreBG1.jpg b/Skins/Classic/[party]scoreBG1.jpg
new file mode 100644
index 00000000..f558425d
--- /dev/null
+++ b/Skins/Classic/[party]scoreBG1.jpg
Binary files differ
diff --git a/Skins/Classic/[party]scoreBG2.jpg b/Skins/Classic/[party]scoreBG2.jpg
new file mode 100644
index 00000000..47239d85
--- /dev/null
+++ b/Skins/Classic/[party]scoreBG2.jpg
Binary files differ
diff --git a/Skins/Classic/[party]scoreDecoration.jpg b/Skins/Classic/[party]scoreDecoration.jpg
new file mode 100644
index 00000000..49204e19
--- /dev/null
+++ b/Skins/Classic/[party]scoreDecoration.jpg
Binary files differ
diff --git a/Skins/Classic/[party]teamPoints.jpg b/Skins/Classic/[party]teamPoints.jpg
new file mode 100644
index 00000000..96855bc9
--- /dev/null
+++ b/Skins/Classic/[party]teamPoints.jpg
Binary files differ
diff --git a/Skins/Classic/[party]winDecoration.jpg b/Skins/Classic/[party]winDecoration.jpg
new file mode 100644
index 00000000..1d48ddb3
--- /dev/null
+++ b/Skins/Classic/[party]winDecoration.jpg
Binary files differ
diff --git a/Skins/Classic/[party]winTeamButton1.jpg b/Skins/Classic/[party]winTeamButton1.jpg
new file mode 100644
index 00000000..10c8d80f
--- /dev/null
+++ b/Skins/Classic/[party]winTeamButton1.jpg
Binary files differ
diff --git a/Skins/Classic/[party]winTeamButton2.jpg b/Skins/Classic/[party]winTeamButton2.jpg
new file mode 100644
index 00000000..fbd85056
--- /dev/null
+++ b/Skins/Classic/[party]winTeamButton2.jpg
Binary files differ
diff --git a/Skins/Classic/[party]winTeamButton3.jpg b/Skins/Classic/[party]winTeamButton3.jpg
new file mode 100644
index 00000000..e8dd9566
--- /dev/null
+++ b/Skins/Classic/[party]winTeamButton3.jpg
Binary files differ
diff --git a/Skins/Classic/[score]box.jpg b/Skins/Classic/[score]box.jpg
new file mode 100644
index 00000000..b37f7e46
--- /dev/null
+++ b/Skins/Classic/[score]box.jpg
Binary files differ
diff --git a/Skins/Classic/[score]level.jpg b/Skins/Classic/[score]level.jpg
new file mode 100644
index 00000000..e47280cb
--- /dev/null
+++ b/Skins/Classic/[score]level.jpg
Binary files differ
diff --git a/Skins/Classic/[score]levelround.jpg b/Skins/Classic/[score]levelround.jpg
new file mode 100644
index 00000000..dbc5b5af
--- /dev/null
+++ b/Skins/Classic/[score]levelround.jpg
Binary files differ
diff --git a/Skins/Classic/[score]line.jpg b/Skins/Classic/[score]line.jpg
new file mode 100644
index 00000000..2fd951aa
--- /dev/null
+++ b/Skins/Classic/[score]line.jpg
Binary files differ
diff --git a/Skins/Classic/[sing]LyricsBall.bmp b/Skins/Classic/[sing]LyricsBall.bmp
new file mode 100644
index 00000000..5b7d7943
--- /dev/null
+++ b/Skins/Classic/[sing]LyricsBall.bmp
Binary files differ
diff --git a/Skins/Classic/[sing]lineBonusPopUp.jpg b/Skins/Classic/[sing]lineBonusPopUp.jpg
new file mode 100644
index 00000000..58d93130
--- /dev/null
+++ b/Skins/Classic/[sing]lineBonusPopUp.jpg
Binary files differ
diff --git a/Skins/Classic/[sing]lyricsHelpBar.bmp b/Skins/Classic/[sing]lyricsHelpBar.bmp
new file mode 100644
index 00000000..24fa2b52
--- /dev/null
+++ b/Skins/Classic/[sing]lyricsHelpBar.bmp
Binary files differ
diff --git a/Skins/Classic/[sing]notesBgLeft.bmp b/Skins/Classic/[sing]notesBgLeft.bmp
new file mode 100644
index 00000000..776e567c
--- /dev/null
+++ b/Skins/Classic/[sing]notesBgLeft.bmp
Binary files differ
diff --git a/Skins/Classic/[sing]notesBgMid.bmp b/Skins/Classic/[sing]notesBgMid.bmp
new file mode 100644
index 00000000..759ac8a3
--- /dev/null
+++ b/Skins/Classic/[sing]notesBgMid.bmp
Binary files differ
diff --git a/Skins/Classic/[sing]notesBgRight.bmp b/Skins/Classic/[sing]notesBgRight.bmp
new file mode 100644
index 00000000..9b1ffc18
--- /dev/null
+++ b/Skins/Classic/[sing]notesBgRight.bmp
Binary files differ
diff --git a/Skins/Classic/[sing]notesLeft.bmp b/Skins/Classic/[sing]notesLeft.bmp
new file mode 100644
index 00000000..c819849b
--- /dev/null
+++ b/Skins/Classic/[sing]notesLeft.bmp
Binary files differ
diff --git a/Skins/Classic/[sing]notesMid.bmp b/Skins/Classic/[sing]notesMid.bmp
new file mode 100644
index 00000000..2fdce32d
--- /dev/null
+++ b/Skins/Classic/[sing]notesMid.bmp
Binary files differ
diff --git a/Skins/Classic/[sing]notesRight.bmp b/Skins/Classic/[sing]notesRight.bmp
new file mode 100644
index 00000000..3241beeb
--- /dev/null
+++ b/Skins/Classic/[sing]notesRight.bmp
Binary files differ
diff --git a/Skins/Classic/[sing]p.jpg b/Skins/Classic/[sing]p.jpg
new file mode 100644
index 00000000..5217c6b1
--- /dev/null
+++ b/Skins/Classic/[sing]p.jpg
Binary files differ
diff --git a/Skins/Classic/[sing]scoreBg.jpg b/Skins/Classic/[sing]scoreBg.jpg
new file mode 100644
index 00000000..01d3ca75
--- /dev/null
+++ b/Skins/Classic/[sing]scoreBg.jpg
Binary files differ
diff --git a/Skins/Classic/[sing]singBarBack.jpg b/Skins/Classic/[sing]singBarBack.jpg
new file mode 100644
index 00000000..d7dcd791
--- /dev/null
+++ b/Skins/Classic/[sing]singBarBack.jpg
Binary files differ
diff --git a/Skins/Classic/[sing]singBarBar.jpg b/Skins/Classic/[sing]singBarBar.jpg
new file mode 100644
index 00000000..4fd9bde9
--- /dev/null
+++ b/Skins/Classic/[sing]singBarBar.jpg
Binary files differ
diff --git a/Skins/Classic/[sing]singBarFront.jpg b/Skins/Classic/[sing]singBarFront.jpg
new file mode 100644
index 00000000..eec27b79
--- /dev/null
+++ b/Skins/Classic/[sing]singBarFront.jpg
Binary files differ
diff --git a/Skins/Classic/[sing]textBar.jpg b/Skins/Classic/[sing]textBar.jpg
new file mode 100644
index 00000000..e2734bce
--- /dev/null
+++ b/Skins/Classic/[sing]textBar.jpg
Binary files differ
diff --git a/Skins/Classic/[song]BGFade.jpg b/Skins/Classic/[song]BGFade.jpg
new file mode 100644
index 00000000..1d6b80ff
--- /dev/null
+++ b/Skins/Classic/[song]BGFade.jpg
Binary files differ
diff --git a/Skins/Classic/[song]EqualizerBG.jpg b/Skins/Classic/[song]EqualizerBG.jpg
new file mode 100644
index 00000000..54ff27f2
--- /dev/null
+++ b/Skins/Classic/[song]EqualizerBG.jpg
Binary files differ
diff --git a/Skins/Classic/[song]selection.jpg b/Skins/Classic/[song]selection.jpg
new file mode 100644
index 00000000..b6c0065e
--- /dev/null
+++ b/Skins/Classic/[song]selection.jpg
Binary files differ
diff --git a/Skins/Classic/[stat]detailBG1.jpg b/Skins/Classic/[stat]detailBG1.jpg
new file mode 100644
index 00000000..120dc483
--- /dev/null
+++ b/Skins/Classic/[stat]detailBG1.jpg
Binary files differ
diff --git a/Skins/Classic/[stat]mainBG1.jpg b/Skins/Classic/[stat]mainBG1.jpg
new file mode 100644
index 00000000..a937b24a
--- /dev/null
+++ b/Skins/Classic/[stat]mainBG1.jpg
Binary files differ
diff --git a/Skins/Classic/[stat]mainBG2.jpg b/Skins/Classic/[stat]mainBG2.jpg
new file mode 100644
index 00000000..201d49b8
--- /dev/null
+++ b/Skins/Classic/[stat]mainBG2.jpg
Binary files differ
diff --git a/Skins/Classic/[stat]mainBG3.jpg b/Skins/Classic/[stat]mainBG3.jpg
new file mode 100644
index 00000000..812a8d78
--- /dev/null
+++ b/Skins/Classic/[stat]mainBG3.jpg
Binary files differ
diff --git a/Skins/Deluxe/Blue.ini b/Skins/Deluxe/Blue.ini
new file mode 100644
index 00000000..7f86780a
--- /dev/null
+++ b/Skins/Deluxe/Blue.ini
@@ -0,0 +1,154 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=Deluxe
+Name=Blue
+Color=Blue
+
+[Textures]
+
+
+# # # M A I N # # #
+Button = [main]button.jpg
+ButtonF = [main]buttonf.jpg
+MainBar = [main]mainBar.jpg
+SelectBG = [main]selectbg.jpg
+
+#Backgrounds
+LoadingBG = [bg-load]blue.jpg
+MainBG = [bg-main]blue.jpg
+SongBG = [bg-main]blue.jpg
+ScoreScreenBG = [bg-main]blue.jpg
+Top5BG = [bg-main]blue.jpg
+OptionsBG = [bg-main]blue.jpg
+PartyBG = [bg-main]blue.jpg
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu = [icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon = [icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon = [icon]video.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+# # # S O N G S E L E C E T # # #
+SongSelection1 = [main]songSelection1.jpg
+SongSelection2 = [main]songSelection2.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar (not skinned in this theme :P )
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =x_[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =x_[party]winDecoration1.jpg
+PartyWinDeco2 =x_[party]winDecoration1.jpg
+PartyWinDeco3 =x_[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+Leiste1 = [special]bar1.jpg
+Leiste2 = [special]bar2.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg
+ButtonFade = [helper]buttonFade.jpg \ No newline at end of file
diff --git a/Skins/Deluxe/Fall.ini b/Skins/Deluxe/Fall.ini
new file mode 100644
index 00000000..3df6974a
--- /dev/null
+++ b/Skins/Deluxe/Fall.ini
@@ -0,0 +1,155 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=Deluxe
+Name=Fall
+Color=Orange
+
+[Textures]
+
+
+# # # M A I N # # #
+Button = [main]button.jpg
+ButtonF = [main]buttonf.jpg
+MainBar = [main]mainBar.jpg
+SelectBG = [main]selectbg.jpg
+
+#Backgrounds
+LoadingBG = [bg-load]fall.jpg
+MainBG = [bg-main]fall.jpg
+SongBG = [bg-main]fall.jpg
+ScoreScreenBG = [bg-main]fall.jpg
+Top5BG = [bg-main]fall.jpg
+OptionsBG = [bg-main]fall.jpg
+PartyBG = [bg-main]fall.jpg
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu = [icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon = [icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon = [icon]video.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+
+# # # S O N G S E L E C E T # # #
+SongSelection1 = [main]songSelection1.jpg
+SongSelection2 = [main]songSelection2.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar (not skinned in this theme :P )
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =x_[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =x_[party]winDecoration1.jpg
+PartyWinDeco2 =x_[party]winDecoration1.jpg
+PartyWinDeco3 =x_[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+Leiste1 = [special]bar1_brown.jpg
+Leiste2 = [special]bar2.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg
+ButtonFade = [helper]buttonFade.jpg \ No newline at end of file
diff --git a/Skins/Deluxe/Summer.ini b/Skins/Deluxe/Summer.ini
new file mode 100644
index 00000000..9ab753b2
--- /dev/null
+++ b/Skins/Deluxe/Summer.ini
@@ -0,0 +1,154 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=Deluxe
+Name=Summer
+Color=Blue
+
+[Textures]
+
+
+# # # M A I N # # #
+Button = [main]button.jpg
+ButtonF = [main]buttonf.jpg
+MainBar = [main]mainBar.jpg
+SelectBG = [main]selectbg.jpg
+
+#Backgrounds
+LoadingBG = [bg-load]summer.jpg
+MainBG = [bg-main]summer.jpg
+SongBG = [bg-main]summer.jpg
+ScoreScreenBG = [bg-main]summer.jpg
+Top5BG = [bg-main]summer.jpg
+OptionsBG = [bg-main]summer.jpg
+PartyBG = [bg-main]summer.jpg
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu = [icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon = [icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon = [icon]video.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+# # # S O N G S E L E C E T # # #
+SongSelection1 = [main]songSelection1.jpg
+SongSelection2 = [main]songSelection2.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar (not skinned in this theme :P )
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =x_[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =x_[party]winDecoration1.jpg
+PartyWinDeco2 =x_[party]winDecoration1.jpg
+PartyWinDeco3 =x_[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+Leiste1 = [special]bar1_pink.jpg
+Leiste2 = [special]bar2.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg
+ButtonFade = [helper]buttonFade.jpg \ No newline at end of file
diff --git a/Skins/Deluxe/Thumbs.db b/Skins/Deluxe/Thumbs.db
new file mode 100644
index 00000000..159b04ae
--- /dev/null
+++ b/Skins/Deluxe/Thumbs.db
Binary files differ
diff --git a/Skins/Deluxe/Winter.ini b/Skins/Deluxe/Winter.ini
new file mode 100644
index 00000000..cfe6558d
--- /dev/null
+++ b/Skins/Deluxe/Winter.ini
@@ -0,0 +1,153 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=Deluxe
+Name=Winter
+Color=Blue
+
+[Textures]
+
+
+# # # M A I N # # #
+Button = [main]button.jpg
+ButtonF = [main]buttonf.jpg
+MainBar = [main]mainBar.jpg
+SelectBG = [main]selectbg.jpg
+
+#Backgrounds
+LoadingBG = [bg-load]winter.jpg
+MainBG = [bg-main]winter.jpg
+SongBG = [bg-main]winter.jpg
+ScoreScreenBG = [bg-main]winter.jpg
+Top5BG = [bg-main]winter.jpg
+OptionsBG = [bg-main]winter.jpg
+PartyBG = [bg-main]winter.jpg
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu = [icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon = [icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon = [icon]video.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+# # # S O N G S E L E C E T # # #
+SongSelection1 = [main]songSelection1.jpg
+SongSelection2 = [main]songSelection2.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar (not skinned in this theme :P )
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =x_[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =x_[party]winDecoration1.jpg
+PartyWinDeco2 =x_[party]winDecoration1.jpg
+PartyWinDeco3 =x_[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+Leiste1 = [special]bar1_blue.jpg
+Leiste2 = [special]bar2.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg
+ButtonFade = [helper]buttonFade.jpg \ No newline at end of file
diff --git a/Skins/Deluxe/[bg-load]blue.jpg b/Skins/Deluxe/[bg-load]blue.jpg
new file mode 100644
index 00000000..bea672c4
--- /dev/null
+++ b/Skins/Deluxe/[bg-load]blue.jpg
Binary files differ
diff --git a/Skins/Deluxe/[bg-load]fall.jpg b/Skins/Deluxe/[bg-load]fall.jpg
new file mode 100644
index 00000000..d205a4e4
--- /dev/null
+++ b/Skins/Deluxe/[bg-load]fall.jpg
Binary files differ
diff --git a/Skins/Deluxe/[bg-load]summer.jpg b/Skins/Deluxe/[bg-load]summer.jpg
new file mode 100644
index 00000000..af7fdaa7
--- /dev/null
+++ b/Skins/Deluxe/[bg-load]summer.jpg
Binary files differ
diff --git a/Skins/Deluxe/[bg-load]winter.jpg b/Skins/Deluxe/[bg-load]winter.jpg
new file mode 100644
index 00000000..826c22a7
--- /dev/null
+++ b/Skins/Deluxe/[bg-load]winter.jpg
Binary files differ
diff --git a/Skins/Deluxe/[bg-main]blue.jpg b/Skins/Deluxe/[bg-main]blue.jpg
new file mode 100644
index 00000000..67c4cbbe
--- /dev/null
+++ b/Skins/Deluxe/[bg-main]blue.jpg
Binary files differ
diff --git a/Skins/Deluxe/[bg-main]fall.jpg b/Skins/Deluxe/[bg-main]fall.jpg
new file mode 100644
index 00000000..e4736d99
--- /dev/null
+++ b/Skins/Deluxe/[bg-main]fall.jpg
Binary files differ
diff --git a/Skins/Deluxe/[bg-main]summer.jpg b/Skins/Deluxe/[bg-main]summer.jpg
new file mode 100644
index 00000000..9939dfcd
--- /dev/null
+++ b/Skins/Deluxe/[bg-main]summer.jpg
Binary files differ
diff --git a/Skins/Deluxe/[bg-main]winter.jpg b/Skins/Deluxe/[bg-main]winter.jpg
new file mode 100644
index 00000000..75cefa82
--- /dev/null
+++ b/Skins/Deluxe/[bg-main]winter.jpg
Binary files differ
diff --git a/Skins/Deluxe/[button]13.jpg b/Skins/Deluxe/[button]13.jpg
new file mode 100644
index 00000000..0d3188e4
--- /dev/null
+++ b/Skins/Deluxe/[button]13.jpg
Binary files differ
diff --git a/Skins/Deluxe/[button]alt.jpg b/Skins/Deluxe/[button]alt.jpg
new file mode 100644
index 00000000..99efd2ae
--- /dev/null
+++ b/Skins/Deluxe/[button]alt.jpg
Binary files differ
diff --git a/Skins/Deluxe/[button]az.jpg b/Skins/Deluxe/[button]az.jpg
new file mode 100644
index 00000000..4cbf3942
--- /dev/null
+++ b/Skins/Deluxe/[button]az.jpg
Binary files differ
diff --git a/Skins/Deluxe/[button]enter.jpg b/Skins/Deluxe/[button]enter.jpg
new file mode 100644
index 00000000..dff7b785
--- /dev/null
+++ b/Skins/Deluxe/[button]enter.jpg
Binary files differ
diff --git a/Skins/Deluxe/[button]esc.jpg b/Skins/Deluxe/[button]esc.jpg
new file mode 100644
index 00000000..21b595d4
--- /dev/null
+++ b/Skins/Deluxe/[button]esc.jpg
Binary files differ
diff --git a/Skins/Deluxe/[button]j.jpg b/Skins/Deluxe/[button]j.jpg
new file mode 100644
index 00000000..465e5972
--- /dev/null
+++ b/Skins/Deluxe/[button]j.jpg
Binary files differ
diff --git a/Skins/Deluxe/[button]m.jpg b/Skins/Deluxe/[button]m.jpg
new file mode 100644
index 00000000..8b657415
--- /dev/null
+++ b/Skins/Deluxe/[button]m.jpg
Binary files differ
diff --git a/Skins/Deluxe/[button]navi.jpg b/Skins/Deluxe/[button]navi.jpg
new file mode 100644
index 00000000..df8803cf
--- /dev/null
+++ b/Skins/Deluxe/[button]navi.jpg
Binary files differ
diff --git a/Skins/Deluxe/[button]p.jpg b/Skins/Deluxe/[button]p.jpg
new file mode 100644
index 00000000..da771ab3
--- /dev/null
+++ b/Skins/Deluxe/[button]p.jpg
Binary files differ
diff --git a/Skins/Deluxe/[effect]goldenNoteStar.jpg b/Skins/Deluxe/[effect]goldenNoteStar.jpg
new file mode 100644
index 00000000..1b31d267
--- /dev/null
+++ b/Skins/Deluxe/[effect]goldenNoteStar.jpg
Binary files differ
diff --git a/Skins/Deluxe/[effect]perfectNoteStar.jpg b/Skins/Deluxe/[effect]perfectNoteStar.jpg
new file mode 100644
index 00000000..189a22a3
--- /dev/null
+++ b/Skins/Deluxe/[effect]perfectNoteStar.jpg
Binary files differ
diff --git a/Skins/Deluxe/[helper]buttonFade.jpg b/Skins/Deluxe/[helper]buttonFade.jpg
new file mode 100644
index 00000000..6de293f7
--- /dev/null
+++ b/Skins/Deluxe/[helper]buttonFade.jpg
Binary files differ
diff --git a/Skins/Deluxe/[helper]rectangle.jpg b/Skins/Deluxe/[helper]rectangle.jpg
new file mode 100644
index 00000000..e03f98fc
--- /dev/null
+++ b/Skins/Deluxe/[helper]rectangle.jpg
Binary files differ
diff --git a/Skins/Deluxe/[icon]cd.jpg b/Skins/Deluxe/[icon]cd.jpg
new file mode 100644
index 00000000..d48dc4ff
--- /dev/null
+++ b/Skins/Deluxe/[icon]cd.jpg
Binary files differ
diff --git a/Skins/Deluxe/[icon]error.jpg b/Skins/Deluxe/[icon]error.jpg
new file mode 100644
index 00000000..a5140f0e
--- /dev/null
+++ b/Skins/Deluxe/[icon]error.jpg
Binary files differ
diff --git a/Skins/Deluxe/[icon]main.jpg b/Skins/Deluxe/[icon]main.jpg
new file mode 100644
index 00000000..5941256a
--- /dev/null
+++ b/Skins/Deluxe/[icon]main.jpg
Binary files differ
diff --git a/Skins/Deluxe/[icon]options.jpg b/Skins/Deluxe/[icon]options.jpg
new file mode 100644
index 00000000..278f0adc
--- /dev/null
+++ b/Skins/Deluxe/[icon]options.jpg
Binary files differ
diff --git a/Skins/Deluxe/[icon]party.jpg b/Skins/Deluxe/[icon]party.jpg
new file mode 100644
index 00000000..2bccd403
--- /dev/null
+++ b/Skins/Deluxe/[icon]party.jpg
Binary files differ
diff --git a/Skins/Deluxe/[icon]question.jpg b/Skins/Deluxe/[icon]question.jpg
new file mode 100644
index 00000000..029172de
--- /dev/null
+++ b/Skins/Deluxe/[icon]question.jpg
Binary files differ
diff --git a/Skins/Deluxe/[icon]score.jpg b/Skins/Deluxe/[icon]score.jpg
new file mode 100644
index 00000000..6402fa9a
--- /dev/null
+++ b/Skins/Deluxe/[icon]score.jpg
Binary files differ
diff --git a/Skins/Deluxe/[icon]search.jpg b/Skins/Deluxe/[icon]search.jpg
new file mode 100644
index 00000000..b5870592
--- /dev/null
+++ b/Skins/Deluxe/[icon]search.jpg
Binary files differ
diff --git a/Skins/Deluxe/[icon]songmenu.jpg b/Skins/Deluxe/[icon]songmenu.jpg
new file mode 100644
index 00000000..35f4b440
--- /dev/null
+++ b/Skins/Deluxe/[icon]songmenu.jpg
Binary files differ
diff --git a/Skins/Deluxe/[icon]stats.jpg b/Skins/Deluxe/[icon]stats.jpg
new file mode 100644
index 00000000..505a6709
--- /dev/null
+++ b/Skins/Deluxe/[icon]stats.jpg
Binary files differ
diff --git a/Skins/Deluxe/[icon]video.jpg b/Skins/Deluxe/[icon]video.jpg
new file mode 100644
index 00000000..12d71add
--- /dev/null
+++ b/Skins/Deluxe/[icon]video.jpg
Binary files differ
diff --git a/Skins/Deluxe/[main]button.jpg b/Skins/Deluxe/[main]button.jpg
new file mode 100644
index 00000000..15a34c66
--- /dev/null
+++ b/Skins/Deluxe/[main]button.jpg
Binary files differ
diff --git a/Skins/Deluxe/[main]buttonf.jpg b/Skins/Deluxe/[main]buttonf.jpg
new file mode 100644
index 00000000..d844add5
--- /dev/null
+++ b/Skins/Deluxe/[main]buttonf.jpg
Binary files differ
diff --git a/Skins/Deluxe/[main]mainBar.jpg b/Skins/Deluxe/[main]mainBar.jpg
new file mode 100644
index 00000000..fa4cbd78
--- /dev/null
+++ b/Skins/Deluxe/[main]mainBar.jpg
Binary files differ
diff --git a/Skins/Deluxe/[main]playerNumberBox.jpg b/Skins/Deluxe/[main]playerNumberBox.jpg
new file mode 100644
index 00000000..53e7964c
--- /dev/null
+++ b/Skins/Deluxe/[main]playerNumberBox.jpg
Binary files differ
diff --git a/Skins/Deluxe/[main]selectbg.jpg b/Skins/Deluxe/[main]selectbg.jpg
new file mode 100644
index 00000000..98dcb671
--- /dev/null
+++ b/Skins/Deluxe/[main]selectbg.jpg
Binary files differ
diff --git a/Skins/Deluxe/[main]songCover.jpg b/Skins/Deluxe/[main]songCover.jpg
new file mode 100644
index 00000000..426bf22d
--- /dev/null
+++ b/Skins/Deluxe/[main]songCover.jpg
Binary files differ
diff --git a/Skins/Deluxe/[main]songSelection1.jpg b/Skins/Deluxe/[main]songSelection1.jpg
new file mode 100644
index 00000000..533510cb
--- /dev/null
+++ b/Skins/Deluxe/[main]songSelection1.jpg
Binary files differ
diff --git a/Skins/Deluxe/[main]songSelection2.jpg b/Skins/Deluxe/[main]songSelection2.jpg
new file mode 100644
index 00000000..cb3a3396
--- /dev/null
+++ b/Skins/Deluxe/[main]songSelection2.jpg
Binary files differ
diff --git a/Skins/Deluxe/[menu]PopUpBg.JPG b/Skins/Deluxe/[menu]PopUpBg.JPG
new file mode 100644
index 00000000..141d740a
--- /dev/null
+++ b/Skins/Deluxe/[menu]PopUpBg.JPG
Binary files differ
diff --git a/Skins/Deluxe/[menu]PopUpFg.JPG b/Skins/Deluxe/[menu]PopUpFg.JPG
new file mode 100644
index 00000000..9e9c6dea
--- /dev/null
+++ b/Skins/Deluxe/[menu]PopUpFg.JPG
Binary files differ
diff --git a/Skins/Deluxe/[menu]jumpToBg.jpg b/Skins/Deluxe/[menu]jumpToBg.jpg
new file mode 100644
index 00000000..a8b93e10
--- /dev/null
+++ b/Skins/Deluxe/[menu]jumpToBg.jpg
Binary files differ
diff --git a/Skins/Deluxe/[menu]songMenuBg.jpg b/Skins/Deluxe/[menu]songMenuBg.jpg
new file mode 100644
index 00000000..ef530ef5
--- /dev/null
+++ b/Skins/Deluxe/[menu]songMenuBg.jpg
Binary files differ
diff --git a/Skins/Deluxe/[menu]songMenuSelectBg.jpg b/Skins/Deluxe/[menu]songMenuSelectBg.jpg
new file mode 100644
index 00000000..79966f3b
--- /dev/null
+++ b/Skins/Deluxe/[menu]songMenuSelectBg.jpg
Binary files differ
diff --git a/Skins/Deluxe/[party]Joker.jpg b/Skins/Deluxe/[party]Joker.jpg
new file mode 100644
index 00000000..e2a18684
--- /dev/null
+++ b/Skins/Deluxe/[party]Joker.jpg
Binary files differ
diff --git a/Skins/Deluxe/[party]playerButton.jpg b/Skins/Deluxe/[party]playerButton.jpg
new file mode 100644
index 00000000..15a34c66
--- /dev/null
+++ b/Skins/Deluxe/[party]playerButton.jpg
Binary files differ
diff --git a/Skins/Deluxe/[party]playerTeamButton.jpg b/Skins/Deluxe/[party]playerTeamButton.jpg
new file mode 100644
index 00000000..2faf9c4b
--- /dev/null
+++ b/Skins/Deluxe/[party]playerTeamButton.jpg
Binary files differ
diff --git a/Skins/Deluxe/[party]pointer.bmp b/Skins/Deluxe/[party]pointer.bmp
new file mode 100644
index 00000000..88bbcc3d
--- /dev/null
+++ b/Skins/Deluxe/[party]pointer.bmp
Binary files differ
diff --git a/Skins/Deluxe/[party]roundBG1.jpg b/Skins/Deluxe/[party]roundBG1.jpg
new file mode 100644
index 00000000..464aabea
--- /dev/null
+++ b/Skins/Deluxe/[party]roundBG1.jpg
Binary files differ
diff --git a/Skins/Deluxe/[party]roundBG2.jpg b/Skins/Deluxe/[party]roundBG2.jpg
new file mode 100644
index 00000000..3413958f
--- /dev/null
+++ b/Skins/Deluxe/[party]roundBG2.jpg
Binary files differ
diff --git a/Skins/Deluxe/[party]roundBG3.jpg b/Skins/Deluxe/[party]roundBG3.jpg
new file mode 100644
index 00000000..c6b53caf
--- /dev/null
+++ b/Skins/Deluxe/[party]roundBG3.jpg
Binary files differ
diff --git a/Skins/Deluxe/[party]roundBG4.jpg b/Skins/Deluxe/[party]roundBG4.jpg
new file mode 100644
index 00000000..5e4da0ac
--- /dev/null
+++ b/Skins/Deluxe/[party]roundBG4.jpg
Binary files differ
diff --git a/Skins/Deluxe/[party]roundTeamButton.jpg b/Skins/Deluxe/[party]roundTeamButton.jpg
new file mode 100644
index 00000000..692db1bd
--- /dev/null
+++ b/Skins/Deluxe/[party]roundTeamButton.jpg
Binary files differ
diff --git a/Skins/Deluxe/[party]scoreBG1.jpg b/Skins/Deluxe/[party]scoreBG1.jpg
new file mode 100644
index 00000000..f558425d
--- /dev/null
+++ b/Skins/Deluxe/[party]scoreBG1.jpg
Binary files differ
diff --git a/Skins/Deluxe/[party]scoreBG2.jpg b/Skins/Deluxe/[party]scoreBG2.jpg
new file mode 100644
index 00000000..47239d85
--- /dev/null
+++ b/Skins/Deluxe/[party]scoreBG2.jpg
Binary files differ
diff --git a/Skins/Deluxe/[party]scoreDecoration.jpg b/Skins/Deluxe/[party]scoreDecoration.jpg
new file mode 100644
index 00000000..49204e19
--- /dev/null
+++ b/Skins/Deluxe/[party]scoreDecoration.jpg
Binary files differ
diff --git a/Skins/Deluxe/[party]teamPoints.jpg b/Skins/Deluxe/[party]teamPoints.jpg
new file mode 100644
index 00000000..96855bc9
--- /dev/null
+++ b/Skins/Deluxe/[party]teamPoints.jpg
Binary files differ
diff --git a/Skins/Deluxe/[party]winDecoration1.jpg b/Skins/Deluxe/[party]winDecoration1.jpg
new file mode 100644
index 00000000..0277f529
--- /dev/null
+++ b/Skins/Deluxe/[party]winDecoration1.jpg
Binary files differ
diff --git a/Skins/Deluxe/[party]winTeamButton1.jpg b/Skins/Deluxe/[party]winTeamButton1.jpg
new file mode 100644
index 00000000..10c8d80f
--- /dev/null
+++ b/Skins/Deluxe/[party]winTeamButton1.jpg
Binary files differ
diff --git a/Skins/Deluxe/[party]winTeamButton2.jpg b/Skins/Deluxe/[party]winTeamButton2.jpg
new file mode 100644
index 00000000..fbd85056
--- /dev/null
+++ b/Skins/Deluxe/[party]winTeamButton2.jpg
Binary files differ
diff --git a/Skins/Deluxe/[party]winTeamButton3.jpg b/Skins/Deluxe/[party]winTeamButton3.jpg
new file mode 100644
index 00000000..e8dd9566
--- /dev/null
+++ b/Skins/Deluxe/[party]winTeamButton3.jpg
Binary files differ
diff --git a/Skins/Deluxe/[score]Line.jpg b/Skins/Deluxe/[score]Line.jpg
new file mode 100644
index 00000000..61cf33f5
--- /dev/null
+++ b/Skins/Deluxe/[score]Line.jpg
Binary files differ
diff --git a/Skins/Deluxe/[score]box.jpg b/Skins/Deluxe/[score]box.jpg
new file mode 100644
index 00000000..b37f7e46
--- /dev/null
+++ b/Skins/Deluxe/[score]box.jpg
Binary files differ
diff --git a/Skins/Deluxe/[score]endcap.jpg b/Skins/Deluxe/[score]endcap.jpg
new file mode 100644
index 00000000..0cad98a5
--- /dev/null
+++ b/Skins/Deluxe/[score]endcap.jpg
Binary files differ
diff --git a/Skins/Deluxe/[score]level.jpg b/Skins/Deluxe/[score]level.jpg
new file mode 100644
index 00000000..9e9c4086
--- /dev/null
+++ b/Skins/Deluxe/[score]level.jpg
Binary files differ
diff --git a/Skins/Deluxe/[score]levelRound.jpg b/Skins/Deluxe/[score]levelRound.jpg
new file mode 100644
index 00000000..38cfddea
--- /dev/null
+++ b/Skins/Deluxe/[score]levelRound.jpg
Binary files differ
diff --git a/Skins/Deluxe/[sing]LyricsBall.bmp b/Skins/Deluxe/[sing]LyricsBall.bmp
new file mode 100644
index 00000000..5b7d7943
--- /dev/null
+++ b/Skins/Deluxe/[sing]LyricsBall.bmp
Binary files differ
diff --git a/Skins/Deluxe/[sing]lineBonusPopUp.jpg b/Skins/Deluxe/[sing]lineBonusPopUp.jpg
new file mode 100644
index 00000000..58d93130
--- /dev/null
+++ b/Skins/Deluxe/[sing]lineBonusPopUp.jpg
Binary files differ
diff --git a/Skins/Deluxe/[sing]lyricsHelpBar.bmp b/Skins/Deluxe/[sing]lyricsHelpBar.bmp
new file mode 100644
index 00000000..87a22b6b
--- /dev/null
+++ b/Skins/Deluxe/[sing]lyricsHelpBar.bmp
Binary files differ
diff --git a/Skins/Deluxe/[sing]notesBgLeft.bmp b/Skins/Deluxe/[sing]notesBgLeft.bmp
new file mode 100644
index 00000000..776e567c
--- /dev/null
+++ b/Skins/Deluxe/[sing]notesBgLeft.bmp
Binary files differ
diff --git a/Skins/Deluxe/[sing]notesBgMid.bmp b/Skins/Deluxe/[sing]notesBgMid.bmp
new file mode 100644
index 00000000..759ac8a3
--- /dev/null
+++ b/Skins/Deluxe/[sing]notesBgMid.bmp
Binary files differ
diff --git a/Skins/Deluxe/[sing]notesBgRight.bmp b/Skins/Deluxe/[sing]notesBgRight.bmp
new file mode 100644
index 00000000..9b1ffc18
--- /dev/null
+++ b/Skins/Deluxe/[sing]notesBgRight.bmp
Binary files differ
diff --git a/Skins/Deluxe/[sing]notesLeft.bmp b/Skins/Deluxe/[sing]notesLeft.bmp
new file mode 100644
index 00000000..c819849b
--- /dev/null
+++ b/Skins/Deluxe/[sing]notesLeft.bmp
Binary files differ
diff --git a/Skins/Deluxe/[sing]notesMid.bmp b/Skins/Deluxe/[sing]notesMid.bmp
new file mode 100644
index 00000000..2fdce32d
--- /dev/null
+++ b/Skins/Deluxe/[sing]notesMid.bmp
Binary files differ
diff --git a/Skins/Deluxe/[sing]notesRight.bmp b/Skins/Deluxe/[sing]notesRight.bmp
new file mode 100644
index 00000000..3241beeb
--- /dev/null
+++ b/Skins/Deluxe/[sing]notesRight.bmp
Binary files differ
diff --git a/Skins/Deluxe/[sing]p.jpg b/Skins/Deluxe/[sing]p.jpg
new file mode 100644
index 00000000..e490fbf4
--- /dev/null
+++ b/Skins/Deluxe/[sing]p.jpg
Binary files differ
diff --git a/Skins/Deluxe/[sing]scoreBg.jpg b/Skins/Deluxe/[sing]scoreBg.jpg
new file mode 100644
index 00000000..01d3ca75
--- /dev/null
+++ b/Skins/Deluxe/[sing]scoreBg.jpg
Binary files differ
diff --git a/Skins/Deluxe/[sing]singBarBack.jpg b/Skins/Deluxe/[sing]singBarBack.jpg
new file mode 100644
index 00000000..d7dcd791
--- /dev/null
+++ b/Skins/Deluxe/[sing]singBarBack.jpg
Binary files differ
diff --git a/Skins/Deluxe/[sing]singBarBar.jpg b/Skins/Deluxe/[sing]singBarBar.jpg
new file mode 100644
index 00000000..4fd9bde9
--- /dev/null
+++ b/Skins/Deluxe/[sing]singBarBar.jpg
Binary files differ
diff --git a/Skins/Deluxe/[sing]singBarFront.jpg b/Skins/Deluxe/[sing]singBarFront.jpg
new file mode 100644
index 00000000..eec27b79
--- /dev/null
+++ b/Skins/Deluxe/[sing]singBarFront.jpg
Binary files differ
diff --git a/Skins/Deluxe/[sing]textBar.jpg b/Skins/Deluxe/[sing]textBar.jpg
new file mode 100644
index 00000000..e2734bce
--- /dev/null
+++ b/Skins/Deluxe/[sing]textBar.jpg
Binary files differ
diff --git a/Skins/Deluxe/[sing]timeBar.jpg b/Skins/Deluxe/[sing]timeBar.jpg
new file mode 100644
index 00000000..e1cc3bf4
--- /dev/null
+++ b/Skins/Deluxe/[sing]timeBar.jpg
Binary files differ
diff --git a/Skins/Deluxe/[sing]timeBar1.jpg b/Skins/Deluxe/[sing]timeBar1.jpg
new file mode 100644
index 00000000..924a2e9b
--- /dev/null
+++ b/Skins/Deluxe/[sing]timeBar1.jpg
Binary files differ
diff --git a/Skins/Deluxe/[sing]timeBarBG.jpg b/Skins/Deluxe/[sing]timeBarBG.jpg
new file mode 100644
index 00000000..e33352d5
--- /dev/null
+++ b/Skins/Deluxe/[sing]timeBarBG.jpg
Binary files differ
diff --git a/Skins/Deluxe/[special]bar1.jpg b/Skins/Deluxe/[special]bar1.jpg
new file mode 100644
index 00000000..867969b4
--- /dev/null
+++ b/Skins/Deluxe/[special]bar1.jpg
Binary files differ
diff --git a/Skins/Deluxe/[special]bar1_blue.jpg b/Skins/Deluxe/[special]bar1_blue.jpg
new file mode 100644
index 00000000..d11dc22b
--- /dev/null
+++ b/Skins/Deluxe/[special]bar1_blue.jpg
Binary files differ
diff --git a/Skins/Deluxe/[special]bar1_brown.jpg b/Skins/Deluxe/[special]bar1_brown.jpg
new file mode 100644
index 00000000..bad8c3f5
--- /dev/null
+++ b/Skins/Deluxe/[special]bar1_brown.jpg
Binary files differ
diff --git a/Skins/Deluxe/[special]bar1_pink.jpg b/Skins/Deluxe/[special]bar1_pink.jpg
new file mode 100644
index 00000000..fb0de242
--- /dev/null
+++ b/Skins/Deluxe/[special]bar1_pink.jpg
Binary files differ
diff --git a/Skins/Deluxe/[special]bar2.jpg b/Skins/Deluxe/[special]bar2.jpg
new file mode 100644
index 00000000..53069868
--- /dev/null
+++ b/Skins/Deluxe/[special]bar2.jpg
Binary files differ
diff --git a/Skins/Deluxe/[stat]detailBG1.jpg b/Skins/Deluxe/[stat]detailBG1.jpg
new file mode 100644
index 00000000..120dc483
--- /dev/null
+++ b/Skins/Deluxe/[stat]detailBG1.jpg
Binary files differ
diff --git a/Skins/Deluxe/[stat]mainBG1.jpg b/Skins/Deluxe/[stat]mainBG1.jpg
new file mode 100644
index 00000000..a937b24a
--- /dev/null
+++ b/Skins/Deluxe/[stat]mainBG1.jpg
Binary files differ
diff --git a/Skins/Deluxe/[stat]mainBG2.jpg b/Skins/Deluxe/[stat]mainBG2.jpg
new file mode 100644
index 00000000..201d49b8
--- /dev/null
+++ b/Skins/Deluxe/[stat]mainBG2.jpg
Binary files differ
diff --git a/Skins/Deluxe/[stat]mainBG3.jpg b/Skins/Deluxe/[stat]mainBG3.jpg
new file mode 100644
index 00000000..4fb6bc06
--- /dev/null
+++ b/Skins/Deluxe/[stat]mainBG3.jpg
Binary files differ
diff --git a/Skins/Deluxe/x_[party]scoreDecoration.jpg b/Skins/Deluxe/x_[party]scoreDecoration.jpg
new file mode 100644
index 00000000..49204e19
--- /dev/null
+++ b/Skins/Deluxe/x_[party]scoreDecoration.jpg
Binary files differ
diff --git a/Skins/Deluxe/x_[party]winDecoration1.jpg b/Skins/Deluxe/x_[party]winDecoration1.jpg
new file mode 100644
index 00000000..0277f529
--- /dev/null
+++ b/Skins/Deluxe/x_[party]winDecoration1.jpg
Binary files differ
diff --git a/Skins/Orange/Orange.ini b/Skins/Orange/Orange.ini
new file mode 100644
index 00000000..fedd0999
--- /dev/null
+++ b/Skins/Orange/Orange.ini
@@ -0,0 +1,162 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=Orange
+Name=Standard
+Color=Orange
+Autor=Skar
+
+[Textures]
+
+
+# # # M A I N # # #
+Button = [main]button.jpg
+ButtonMirror = [main]button2.jpg
+ButtonCollection = [main]button3.jpg
+ButtonF = [main]buttonf.jpg
+MainBar = [main]mainBar.jpg
+SelectBG = [main]selectbg.jpg
+Button-m-1 = [main]button-m-1.jpg
+Button-m-2 = [main]button-m-2.jpg
+Button-m-3 = [main]button-m-3.jpg
+Button-m-4 = [main]button-m-4.jpg
+
+
+#Backgrounds
+LoadingBG = [bg-load].jpg
+MainBG = bg-main.jpg
+SongBG = bg-song.jpg
+ScoreScreenBG = bg-song.jpg
+Top5BG = bg-song.jpg
+OptionsBG = bg-song.jpg
+PartyBG = bg-song.jpg
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu = [icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon = [icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon = [icon]video.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+# # # S O N G S E L E C E T # # #
+SongSelection1 = [main]songSelection1.jpg
+SongSelection2 = [main]songSelection2.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =[party]winDecoration1.jpg
+PartyWinDeco2 =[party]winDecoration1.jpg
+PartyWinDeco3 =[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+Leiste1 = [special]bar1.jpg
+Leiste2 = [special]bar2.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg
+ButtonFade = [helper]buttonFade.jpg \ No newline at end of file
diff --git a/Skins/Orange/Thumbs.db b/Skins/Orange/Thumbs.db
new file mode 100644
index 00000000..fc571fe5
--- /dev/null
+++ b/Skins/Orange/Thumbs.db
Binary files differ
diff --git a/Skins/Orange/[bg-load].jpg b/Skins/Orange/[bg-load].jpg
new file mode 100644
index 00000000..c58dea03
--- /dev/null
+++ b/Skins/Orange/[bg-load].jpg
Binary files differ
diff --git a/Skins/Orange/[button]13.jpg b/Skins/Orange/[button]13.jpg
new file mode 100644
index 00000000..dd3453b2
--- /dev/null
+++ b/Skins/Orange/[button]13.jpg
Binary files differ
diff --git a/Skins/Orange/[button]alt.jpg b/Skins/Orange/[button]alt.jpg
new file mode 100644
index 00000000..bb94afa0
--- /dev/null
+++ b/Skins/Orange/[button]alt.jpg
Binary files differ
diff --git a/Skins/Orange/[button]az.jpg b/Skins/Orange/[button]az.jpg
new file mode 100644
index 00000000..34e02271
--- /dev/null
+++ b/Skins/Orange/[button]az.jpg
Binary files differ
diff --git a/Skins/Orange/[button]enter.jpg b/Skins/Orange/[button]enter.jpg
new file mode 100644
index 00000000..70ded774
--- /dev/null
+++ b/Skins/Orange/[button]enter.jpg
Binary files differ
diff --git a/Skins/Orange/[button]esc.jpg b/Skins/Orange/[button]esc.jpg
new file mode 100644
index 00000000..42665788
--- /dev/null
+++ b/Skins/Orange/[button]esc.jpg
Binary files differ
diff --git a/Skins/Orange/[button]j.jpg b/Skins/Orange/[button]j.jpg
new file mode 100644
index 00000000..0c85dcc8
--- /dev/null
+++ b/Skins/Orange/[button]j.jpg
Binary files differ
diff --git a/Skins/Orange/[button]m.jpg b/Skins/Orange/[button]m.jpg
new file mode 100644
index 00000000..5d55e476
--- /dev/null
+++ b/Skins/Orange/[button]m.jpg
Binary files differ
diff --git a/Skins/Orange/[button]navi.jpg b/Skins/Orange/[button]navi.jpg
new file mode 100644
index 00000000..387635ac
--- /dev/null
+++ b/Skins/Orange/[button]navi.jpg
Binary files differ
diff --git a/Skins/Orange/[button]p.jpg b/Skins/Orange/[button]p.jpg
new file mode 100644
index 00000000..d6b4d0c7
--- /dev/null
+++ b/Skins/Orange/[button]p.jpg
Binary files differ
diff --git a/Skins/Orange/[effect]goldenNoteStar.jpg b/Skins/Orange/[effect]goldenNoteStar.jpg
new file mode 100644
index 00000000..1b31d267
--- /dev/null
+++ b/Skins/Orange/[effect]goldenNoteStar.jpg
Binary files differ
diff --git a/Skins/Orange/[effect]perfectNoteStar.jpg b/Skins/Orange/[effect]perfectNoteStar.jpg
new file mode 100644
index 00000000..189a22a3
--- /dev/null
+++ b/Skins/Orange/[effect]perfectNoteStar.jpg
Binary files differ
diff --git a/Skins/Orange/[helper]buttonFade.jpg b/Skins/Orange/[helper]buttonFade.jpg
new file mode 100644
index 00000000..6de293f7
--- /dev/null
+++ b/Skins/Orange/[helper]buttonFade.jpg
Binary files differ
diff --git a/Skins/Orange/[helper]rectangle.jpg b/Skins/Orange/[helper]rectangle.jpg
new file mode 100644
index 00000000..e03f98fc
--- /dev/null
+++ b/Skins/Orange/[helper]rectangle.jpg
Binary files differ
diff --git a/Skins/Orange/[icon]cd.jpg b/Skins/Orange/[icon]cd.jpg
new file mode 100644
index 00000000..d48dc4ff
--- /dev/null
+++ b/Skins/Orange/[icon]cd.jpg
Binary files differ
diff --git a/Skins/Orange/[icon]error.jpg b/Skins/Orange/[icon]error.jpg
new file mode 100644
index 00000000..a5140f0e
--- /dev/null
+++ b/Skins/Orange/[icon]error.jpg
Binary files differ
diff --git a/Skins/Orange/[icon]main.jpg b/Skins/Orange/[icon]main.jpg
new file mode 100644
index 00000000..5941256a
--- /dev/null
+++ b/Skins/Orange/[icon]main.jpg
Binary files differ
diff --git a/Skins/Orange/[icon]options.jpg b/Skins/Orange/[icon]options.jpg
new file mode 100644
index 00000000..278f0adc
--- /dev/null
+++ b/Skins/Orange/[icon]options.jpg
Binary files differ
diff --git a/Skins/Orange/[icon]party.jpg b/Skins/Orange/[icon]party.jpg
new file mode 100644
index 00000000..2bccd403
--- /dev/null
+++ b/Skins/Orange/[icon]party.jpg
Binary files differ
diff --git a/Skins/Orange/[icon]question.jpg b/Skins/Orange/[icon]question.jpg
new file mode 100644
index 00000000..029172de
--- /dev/null
+++ b/Skins/Orange/[icon]question.jpg
Binary files differ
diff --git a/Skins/Orange/[icon]score.jpg b/Skins/Orange/[icon]score.jpg
new file mode 100644
index 00000000..6402fa9a
--- /dev/null
+++ b/Skins/Orange/[icon]score.jpg
Binary files differ
diff --git a/Skins/Orange/[icon]search.jpg b/Skins/Orange/[icon]search.jpg
new file mode 100644
index 00000000..b5870592
--- /dev/null
+++ b/Skins/Orange/[icon]search.jpg
Binary files differ
diff --git a/Skins/Orange/[icon]songmenu.jpg b/Skins/Orange/[icon]songmenu.jpg
new file mode 100644
index 00000000..35f4b440
--- /dev/null
+++ b/Skins/Orange/[icon]songmenu.jpg
Binary files differ
diff --git a/Skins/Orange/[icon]stats.jpg b/Skins/Orange/[icon]stats.jpg
new file mode 100644
index 00000000..505a6709
--- /dev/null
+++ b/Skins/Orange/[icon]stats.jpg
Binary files differ
diff --git a/Skins/Orange/[icon]video.jpg b/Skins/Orange/[icon]video.jpg
new file mode 100644
index 00000000..12d71add
--- /dev/null
+++ b/Skins/Orange/[icon]video.jpg
Binary files differ
diff --git a/Skins/Orange/[main]button-m-1.jpg b/Skins/Orange/[main]button-m-1.jpg
new file mode 100644
index 00000000..90c0da80
--- /dev/null
+++ b/Skins/Orange/[main]button-m-1.jpg
Binary files differ
diff --git a/Skins/Orange/[main]button-m-2.jpg b/Skins/Orange/[main]button-m-2.jpg
new file mode 100644
index 00000000..78200047
--- /dev/null
+++ b/Skins/Orange/[main]button-m-2.jpg
Binary files differ
diff --git a/Skins/Orange/[main]button-m-3.jpg b/Skins/Orange/[main]button-m-3.jpg
new file mode 100644
index 00000000..48d182e8
--- /dev/null
+++ b/Skins/Orange/[main]button-m-3.jpg
Binary files differ
diff --git a/Skins/Orange/[main]button-m-4.jpg b/Skins/Orange/[main]button-m-4.jpg
new file mode 100644
index 00000000..eae0d41e
--- /dev/null
+++ b/Skins/Orange/[main]button-m-4.jpg
Binary files differ
diff --git a/Skins/Orange/[main]button.jpg b/Skins/Orange/[main]button.jpg
new file mode 100644
index 00000000..15a34c66
--- /dev/null
+++ b/Skins/Orange/[main]button.jpg
Binary files differ
diff --git a/Skins/Orange/[main]button2.jpg b/Skins/Orange/[main]button2.jpg
new file mode 100644
index 00000000..384b92fb
--- /dev/null
+++ b/Skins/Orange/[main]button2.jpg
Binary files differ
diff --git a/Skins/Orange/[main]button3.jpg b/Skins/Orange/[main]button3.jpg
new file mode 100644
index 00000000..dd6f9f72
--- /dev/null
+++ b/Skins/Orange/[main]button3.jpg
Binary files differ
diff --git a/Skins/Orange/[main]buttonf.jpg b/Skins/Orange/[main]buttonf.jpg
new file mode 100644
index 00000000..d844add5
--- /dev/null
+++ b/Skins/Orange/[main]buttonf.jpg
Binary files differ
diff --git a/Skins/Orange/[main]mainBar.jpg b/Skins/Orange/[main]mainBar.jpg
new file mode 100644
index 00000000..77c84430
--- /dev/null
+++ b/Skins/Orange/[main]mainBar.jpg
Binary files differ
diff --git a/Skins/Orange/[main]playerNumberBox.jpg b/Skins/Orange/[main]playerNumberBox.jpg
new file mode 100644
index 00000000..53e7964c
--- /dev/null
+++ b/Skins/Orange/[main]playerNumberBox.jpg
Binary files differ
diff --git a/Skins/Orange/[main]selectbg.jpg b/Skins/Orange/[main]selectbg.jpg
new file mode 100644
index 00000000..fef45648
--- /dev/null
+++ b/Skins/Orange/[main]selectbg.jpg
Binary files differ
diff --git a/Skins/Orange/[main]songCover.jpg b/Skins/Orange/[main]songCover.jpg
new file mode 100644
index 00000000..426bf22d
--- /dev/null
+++ b/Skins/Orange/[main]songCover.jpg
Binary files differ
diff --git a/Skins/Orange/[main]songSelection1.jpg b/Skins/Orange/[main]songSelection1.jpg
new file mode 100644
index 00000000..348737ed
--- /dev/null
+++ b/Skins/Orange/[main]songSelection1.jpg
Binary files differ
diff --git a/Skins/Orange/[main]songSelection2.jpg b/Skins/Orange/[main]songSelection2.jpg
new file mode 100644
index 00000000..cb3a3396
--- /dev/null
+++ b/Skins/Orange/[main]songSelection2.jpg
Binary files differ
diff --git a/Skins/Orange/[menu]PopUpBg.JPG b/Skins/Orange/[menu]PopUpBg.JPG
new file mode 100644
index 00000000..141d740a
--- /dev/null
+++ b/Skins/Orange/[menu]PopUpBg.JPG
Binary files differ
diff --git a/Skins/Orange/[menu]PopUpFg.JPG b/Skins/Orange/[menu]PopUpFg.JPG
new file mode 100644
index 00000000..9e9c6dea
--- /dev/null
+++ b/Skins/Orange/[menu]PopUpFg.JPG
Binary files differ
diff --git a/Skins/Orange/[menu]jumpToBg.jpg b/Skins/Orange/[menu]jumpToBg.jpg
new file mode 100644
index 00000000..a8b93e10
--- /dev/null
+++ b/Skins/Orange/[menu]jumpToBg.jpg
Binary files differ
diff --git a/Skins/Orange/[menu]songMenuBg.jpg b/Skins/Orange/[menu]songMenuBg.jpg
new file mode 100644
index 00000000..ef530ef5
--- /dev/null
+++ b/Skins/Orange/[menu]songMenuBg.jpg
Binary files differ
diff --git a/Skins/Orange/[menu]songMenuSelectBg.jpg b/Skins/Orange/[menu]songMenuSelectBg.jpg
new file mode 100644
index 00000000..79966f3b
--- /dev/null
+++ b/Skins/Orange/[menu]songMenuSelectBg.jpg
Binary files differ
diff --git a/Skins/Orange/[party]Joker.jpg b/Skins/Orange/[party]Joker.jpg
new file mode 100644
index 00000000..e2a18684
--- /dev/null
+++ b/Skins/Orange/[party]Joker.jpg
Binary files differ
diff --git a/Skins/Orange/[party]playerButton.jpg b/Skins/Orange/[party]playerButton.jpg
new file mode 100644
index 00000000..15a34c66
--- /dev/null
+++ b/Skins/Orange/[party]playerButton.jpg
Binary files differ
diff --git a/Skins/Orange/[party]playerTeamButton.jpg b/Skins/Orange/[party]playerTeamButton.jpg
new file mode 100644
index 00000000..2faf9c4b
--- /dev/null
+++ b/Skins/Orange/[party]playerTeamButton.jpg
Binary files differ
diff --git a/Skins/Orange/[party]pointer.bmp b/Skins/Orange/[party]pointer.bmp
new file mode 100644
index 00000000..88bbcc3d
--- /dev/null
+++ b/Skins/Orange/[party]pointer.bmp
Binary files differ
diff --git a/Skins/Orange/[party]roundBG1.jpg b/Skins/Orange/[party]roundBG1.jpg
new file mode 100644
index 00000000..464aabea
--- /dev/null
+++ b/Skins/Orange/[party]roundBG1.jpg
Binary files differ
diff --git a/Skins/Orange/[party]roundBG2.jpg b/Skins/Orange/[party]roundBG2.jpg
new file mode 100644
index 00000000..3413958f
--- /dev/null
+++ b/Skins/Orange/[party]roundBG2.jpg
Binary files differ
diff --git a/Skins/Orange/[party]roundBG3.jpg b/Skins/Orange/[party]roundBG3.jpg
new file mode 100644
index 00000000..c6b53caf
--- /dev/null
+++ b/Skins/Orange/[party]roundBG3.jpg
Binary files differ
diff --git a/Skins/Orange/[party]roundBG4.jpg b/Skins/Orange/[party]roundBG4.jpg
new file mode 100644
index 00000000..5e4da0ac
--- /dev/null
+++ b/Skins/Orange/[party]roundBG4.jpg
Binary files differ
diff --git a/Skins/Orange/[party]roundTeamButton.jpg b/Skins/Orange/[party]roundTeamButton.jpg
new file mode 100644
index 00000000..692db1bd
--- /dev/null
+++ b/Skins/Orange/[party]roundTeamButton.jpg
Binary files differ
diff --git a/Skins/Orange/[party]scoreBG1.jpg b/Skins/Orange/[party]scoreBG1.jpg
new file mode 100644
index 00000000..f558425d
--- /dev/null
+++ b/Skins/Orange/[party]scoreBG1.jpg
Binary files differ
diff --git a/Skins/Orange/[party]scoreBG2.jpg b/Skins/Orange/[party]scoreBG2.jpg
new file mode 100644
index 00000000..47239d85
--- /dev/null
+++ b/Skins/Orange/[party]scoreBG2.jpg
Binary files differ
diff --git a/Skins/Orange/[party]scoreDecoration.jpg b/Skins/Orange/[party]scoreDecoration.jpg
new file mode 100644
index 00000000..49204e19
--- /dev/null
+++ b/Skins/Orange/[party]scoreDecoration.jpg
Binary files differ
diff --git a/Skins/Orange/[party]teamPoints.jpg b/Skins/Orange/[party]teamPoints.jpg
new file mode 100644
index 00000000..96855bc9
--- /dev/null
+++ b/Skins/Orange/[party]teamPoints.jpg
Binary files differ
diff --git a/Skins/Orange/[party]winDecoration1.jpg b/Skins/Orange/[party]winDecoration1.jpg
new file mode 100644
index 00000000..0277f529
--- /dev/null
+++ b/Skins/Orange/[party]winDecoration1.jpg
Binary files differ
diff --git a/Skins/Orange/[party]winTeamButton1.jpg b/Skins/Orange/[party]winTeamButton1.jpg
new file mode 100644
index 00000000..10c8d80f
--- /dev/null
+++ b/Skins/Orange/[party]winTeamButton1.jpg
Binary files differ
diff --git a/Skins/Orange/[party]winTeamButton2.jpg b/Skins/Orange/[party]winTeamButton2.jpg
new file mode 100644
index 00000000..fbd85056
--- /dev/null
+++ b/Skins/Orange/[party]winTeamButton2.jpg
Binary files differ
diff --git a/Skins/Orange/[party]winTeamButton3.jpg b/Skins/Orange/[party]winTeamButton3.jpg
new file mode 100644
index 00000000..e8dd9566
--- /dev/null
+++ b/Skins/Orange/[party]winTeamButton3.jpg
Binary files differ
diff --git a/Skins/Orange/[score]Line.jpg b/Skins/Orange/[score]Line.jpg
new file mode 100644
index 00000000..61cf33f5
--- /dev/null
+++ b/Skins/Orange/[score]Line.jpg
Binary files differ
diff --git a/Skins/Orange/[score]box.jpg b/Skins/Orange/[score]box.jpg
new file mode 100644
index 00000000..b37f7e46
--- /dev/null
+++ b/Skins/Orange/[score]box.jpg
Binary files differ
diff --git a/Skins/Orange/[score]endcap.jpg b/Skins/Orange/[score]endcap.jpg
new file mode 100644
index 00000000..0cad98a5
--- /dev/null
+++ b/Skins/Orange/[score]endcap.jpg
Binary files differ
diff --git a/Skins/Orange/[score]level.jpg b/Skins/Orange/[score]level.jpg
new file mode 100644
index 00000000..9e9c4086
--- /dev/null
+++ b/Skins/Orange/[score]level.jpg
Binary files differ
diff --git a/Skins/Orange/[score]levelRound.jpg b/Skins/Orange/[score]levelRound.jpg
new file mode 100644
index 00000000..38cfddea
--- /dev/null
+++ b/Skins/Orange/[score]levelRound.jpg
Binary files differ
diff --git a/Skins/Orange/[sing]LyricsBall.bmp b/Skins/Orange/[sing]LyricsBall.bmp
new file mode 100644
index 00000000..5b7d7943
--- /dev/null
+++ b/Skins/Orange/[sing]LyricsBall.bmp
Binary files differ
diff --git a/Skins/Orange/[sing]lineBonusPopUp.jpg b/Skins/Orange/[sing]lineBonusPopUp.jpg
new file mode 100644
index 00000000..58d93130
--- /dev/null
+++ b/Skins/Orange/[sing]lineBonusPopUp.jpg
Binary files differ
diff --git a/Skins/Orange/[sing]lyricsHelpBar.bmp b/Skins/Orange/[sing]lyricsHelpBar.bmp
new file mode 100644
index 00000000..836d3537
--- /dev/null
+++ b/Skins/Orange/[sing]lyricsHelpBar.bmp
Binary files differ
diff --git a/Skins/Orange/[sing]notesBgLeft.bmp b/Skins/Orange/[sing]notesBgLeft.bmp
new file mode 100644
index 00000000..776e567c
--- /dev/null
+++ b/Skins/Orange/[sing]notesBgLeft.bmp
Binary files differ
diff --git a/Skins/Orange/[sing]notesBgMid.bmp b/Skins/Orange/[sing]notesBgMid.bmp
new file mode 100644
index 00000000..759ac8a3
--- /dev/null
+++ b/Skins/Orange/[sing]notesBgMid.bmp
Binary files differ
diff --git a/Skins/Orange/[sing]notesBgRight.bmp b/Skins/Orange/[sing]notesBgRight.bmp
new file mode 100644
index 00000000..9b1ffc18
--- /dev/null
+++ b/Skins/Orange/[sing]notesBgRight.bmp
Binary files differ
diff --git a/Skins/Orange/[sing]notesLeft.bmp b/Skins/Orange/[sing]notesLeft.bmp
new file mode 100644
index 00000000..3d22e5fc
--- /dev/null
+++ b/Skins/Orange/[sing]notesLeft.bmp
Binary files differ
diff --git a/Skins/Orange/[sing]notesMid.bmp b/Skins/Orange/[sing]notesMid.bmp
new file mode 100644
index 00000000..2daa66b8
--- /dev/null
+++ b/Skins/Orange/[sing]notesMid.bmp
Binary files differ
diff --git a/Skins/Orange/[sing]notesRight.bmp b/Skins/Orange/[sing]notesRight.bmp
new file mode 100644
index 00000000..cd936129
--- /dev/null
+++ b/Skins/Orange/[sing]notesRight.bmp
Binary files differ
diff --git a/Skins/Orange/[sing]p.jpg b/Skins/Orange/[sing]p.jpg
new file mode 100644
index 00000000..e490fbf4
--- /dev/null
+++ b/Skins/Orange/[sing]p.jpg
Binary files differ
diff --git a/Skins/Orange/[sing]scoreBg.jpg b/Skins/Orange/[sing]scoreBg.jpg
new file mode 100644
index 00000000..2bcbedaa
--- /dev/null
+++ b/Skins/Orange/[sing]scoreBg.jpg
Binary files differ
diff --git a/Skins/Orange/[sing]singBarBack.jpg b/Skins/Orange/[sing]singBarBack.jpg
new file mode 100644
index 00000000..d7dcd791
--- /dev/null
+++ b/Skins/Orange/[sing]singBarBack.jpg
Binary files differ
diff --git a/Skins/Orange/[sing]singBarBar.jpg b/Skins/Orange/[sing]singBarBar.jpg
new file mode 100644
index 00000000..4fd9bde9
--- /dev/null
+++ b/Skins/Orange/[sing]singBarBar.jpg
Binary files differ
diff --git a/Skins/Orange/[sing]singBarFront.jpg b/Skins/Orange/[sing]singBarFront.jpg
new file mode 100644
index 00000000..eec27b79
--- /dev/null
+++ b/Skins/Orange/[sing]singBarFront.jpg
Binary files differ
diff --git a/Skins/Orange/[sing]textBar.jpg b/Skins/Orange/[sing]textBar.jpg
new file mode 100644
index 00000000..596a668a
--- /dev/null
+++ b/Skins/Orange/[sing]textBar.jpg
Binary files differ
diff --git a/Skins/Orange/[sing]timeBar.jpg b/Skins/Orange/[sing]timeBar.jpg
new file mode 100644
index 00000000..6e1e42dd
--- /dev/null
+++ b/Skins/Orange/[sing]timeBar.jpg
Binary files differ
diff --git a/Skins/Orange/[sing]timeBarBG.jpg b/Skins/Orange/[sing]timeBarBG.jpg
new file mode 100644
index 00000000..5298a0c5
--- /dev/null
+++ b/Skins/Orange/[sing]timeBarBG.jpg
Binary files differ
diff --git a/Skins/Orange/[special]bar1.jpg b/Skins/Orange/[special]bar1.jpg
new file mode 100644
index 00000000..9f8d2e02
--- /dev/null
+++ b/Skins/Orange/[special]bar1.jpg
Binary files differ
diff --git a/Skins/Orange/[special]bar2.jpg b/Skins/Orange/[special]bar2.jpg
new file mode 100644
index 00000000..e634515b
--- /dev/null
+++ b/Skins/Orange/[special]bar2.jpg
Binary files differ
diff --git a/Skins/Orange/[stat]detailBG1.jpg b/Skins/Orange/[stat]detailBG1.jpg
new file mode 100644
index 00000000..120dc483
--- /dev/null
+++ b/Skins/Orange/[stat]detailBG1.jpg
Binary files differ
diff --git a/Skins/Orange/[stat]mainBG1.jpg b/Skins/Orange/[stat]mainBG1.jpg
new file mode 100644
index 00000000..a937b24a
--- /dev/null
+++ b/Skins/Orange/[stat]mainBG1.jpg
Binary files differ
diff --git a/Skins/Orange/[stat]mainBG2.jpg b/Skins/Orange/[stat]mainBG2.jpg
new file mode 100644
index 00000000..201d49b8
--- /dev/null
+++ b/Skins/Orange/[stat]mainBG2.jpg
Binary files differ
diff --git a/Skins/Orange/[stat]mainBG3.jpg b/Skins/Orange/[stat]mainBG3.jpg
new file mode 100644
index 00000000..4fb6bc06
--- /dev/null
+++ b/Skins/Orange/[stat]mainBG3.jpg
Binary files differ
diff --git a/Skins/Orange/bg-main.jpg b/Skins/Orange/bg-main.jpg
new file mode 100644
index 00000000..a70150bd
--- /dev/null
+++ b/Skins/Orange/bg-main.jpg
Binary files differ
diff --git a/Skins/Orange/bg-song.jpg b/Skins/Orange/bg-song.jpg
new file mode 100644
index 00000000..d07db7eb
--- /dev/null
+++ b/Skins/Orange/bg-song.jpg
Binary files differ
diff --git a/Skins/Streetlight/Streetlight lite.ini b/Skins/Streetlight/Streetlight lite.ini
new file mode 100644
index 00000000..0ffdfe07
--- /dev/null
+++ b/Skins/Streetlight/Streetlight lite.ini
@@ -0,0 +1,156 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=Streetlight lite
+Name=Streetlight lite
+Color=Blue
+Autor=Skar
+
+[Textures]
+
+
+# # # M A I N # # #
+Button = [main]button.jpg
+Button2 = [main]button2.jpg
+ButtonF = [main]buttonf.jpg
+MainBar = [main]mainBar.jpg
+SelectBG = [main]selectbg.jpg
+
+#Backgrounds
+LoadingBG = [bg-load].jpg
+MainBG = bg-main.jpg
+SongBG = bg-song.jpg
+ScoreScreenBG = bg-song.jpg
+Top5BG = bg-song.jpg
+OptionsBG = bg-song.jpg
+PartyBG = bg-song.jpg
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu = [icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon = [icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon = [icon]video.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+# # # S O N G S E L E C E T # # #
+SongSelection1 = [main]songSelection1.jpg
+SongSelection2 = [main]songSelection2.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =[party]winDecoration1.jpg
+PartyWinDeco2 =[party]winDecoration1.jpg
+PartyWinDeco3 =[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+Leiste1 = [special]bar1.jpg
+Leiste2 = [special]bar2.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg
+ButtonFade = [helper]buttonFade.jpg \ No newline at end of file
diff --git a/Skins/Streetlight/Streetlight.ini b/Skins/Streetlight/Streetlight.ini
new file mode 100644
index 00000000..deb200ce
--- /dev/null
+++ b/Skins/Streetlight/Streetlight.ini
@@ -0,0 +1,156 @@
+;0.5.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Skin]
+Theme=Streetlight
+Name=Streetlight
+Color=Blue
+Autor=Skar
+
+[Textures]
+
+
+# # # M A I N # # #
+Button = [main]button.jpg
+Button2 = [main]button2.jpg
+ButtonF = [main]buttonf.jpg
+MainBar = [main]mainBar.jpg
+SelectBG = [main]selectbg.jpg
+
+#Backgrounds
+LoadingBG = [bg-load].jpg
+MainBG = bg-main.jpg
+SongBG = bg-song.jpg
+ScoreScreenBG = bg-song.jpg
+Top5BG = bg-song.jpg
+OptionsBG = bg-song.jpg
+PartyBG = bg-song.jpg
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu = [icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon = [icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon = [icon]video.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+# # # S O N G S E L E C E T # # #
+SongSelection1 = [main]songSelection1.jpg
+SongSelection2 = [main]songSelection2.jpg
+SongCover = [main]songCover.jpg
+
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =[party]winDecoration1.jpg
+PartyWinDeco2 =[party]winDecoration1.jpg
+PartyWinDeco3 =[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+Leiste1 = [special]bar1.jpg
+Leiste2 = [special]bar2.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg
+ButtonFade = [helper]buttonFade.jpg \ No newline at end of file
diff --git a/Skins/Streetlight/Thumbs.db b/Skins/Streetlight/Thumbs.db
new file mode 100644
index 00000000..e6bc9001
--- /dev/null
+++ b/Skins/Streetlight/Thumbs.db
Binary files differ
diff --git a/Skins/Streetlight/[bg-load].jpg b/Skins/Streetlight/[bg-load].jpg
new file mode 100644
index 00000000..b316fb01
--- /dev/null
+++ b/Skins/Streetlight/[bg-load].jpg
Binary files differ
diff --git a/Skins/Streetlight/[button]13.jpg b/Skins/Streetlight/[button]13.jpg
new file mode 100644
index 00000000..dd3453b2
--- /dev/null
+++ b/Skins/Streetlight/[button]13.jpg
Binary files differ
diff --git a/Skins/Streetlight/[button]alt.jpg b/Skins/Streetlight/[button]alt.jpg
new file mode 100644
index 00000000..bb94afa0
--- /dev/null
+++ b/Skins/Streetlight/[button]alt.jpg
Binary files differ
diff --git a/Skins/Streetlight/[button]az.jpg b/Skins/Streetlight/[button]az.jpg
new file mode 100644
index 00000000..34e02271
--- /dev/null
+++ b/Skins/Streetlight/[button]az.jpg
Binary files differ
diff --git a/Skins/Streetlight/[button]enter.jpg b/Skins/Streetlight/[button]enter.jpg
new file mode 100644
index 00000000..70ded774
--- /dev/null
+++ b/Skins/Streetlight/[button]enter.jpg
Binary files differ
diff --git a/Skins/Streetlight/[button]esc.jpg b/Skins/Streetlight/[button]esc.jpg
new file mode 100644
index 00000000..42665788
--- /dev/null
+++ b/Skins/Streetlight/[button]esc.jpg
Binary files differ
diff --git a/Skins/Streetlight/[button]j.jpg b/Skins/Streetlight/[button]j.jpg
new file mode 100644
index 00000000..0c85dcc8
--- /dev/null
+++ b/Skins/Streetlight/[button]j.jpg
Binary files differ
diff --git a/Skins/Streetlight/[button]m.jpg b/Skins/Streetlight/[button]m.jpg
new file mode 100644
index 00000000..5d55e476
--- /dev/null
+++ b/Skins/Streetlight/[button]m.jpg
Binary files differ
diff --git a/Skins/Streetlight/[button]navi.jpg b/Skins/Streetlight/[button]navi.jpg
new file mode 100644
index 00000000..387635ac
--- /dev/null
+++ b/Skins/Streetlight/[button]navi.jpg
Binary files differ
diff --git a/Skins/Streetlight/[button]p.jpg b/Skins/Streetlight/[button]p.jpg
new file mode 100644
index 00000000..d6b4d0c7
--- /dev/null
+++ b/Skins/Streetlight/[button]p.jpg
Binary files differ
diff --git a/Skins/Streetlight/[effect]goldenNoteStar.jpg b/Skins/Streetlight/[effect]goldenNoteStar.jpg
new file mode 100644
index 00000000..1b31d267
--- /dev/null
+++ b/Skins/Streetlight/[effect]goldenNoteStar.jpg
Binary files differ
diff --git a/Skins/Streetlight/[effect]perfectNoteStar.jpg b/Skins/Streetlight/[effect]perfectNoteStar.jpg
new file mode 100644
index 00000000..189a22a3
--- /dev/null
+++ b/Skins/Streetlight/[effect]perfectNoteStar.jpg
Binary files differ
diff --git a/Skins/Streetlight/[helper]buttonFade.jpg b/Skins/Streetlight/[helper]buttonFade.jpg
new file mode 100644
index 00000000..6de293f7
--- /dev/null
+++ b/Skins/Streetlight/[helper]buttonFade.jpg
Binary files differ
diff --git a/Skins/Streetlight/[helper]rectangle.jpg b/Skins/Streetlight/[helper]rectangle.jpg
new file mode 100644
index 00000000..e03f98fc
--- /dev/null
+++ b/Skins/Streetlight/[helper]rectangle.jpg
Binary files differ
diff --git a/Skins/Streetlight/[icon]cd.jpg b/Skins/Streetlight/[icon]cd.jpg
new file mode 100644
index 00000000..d48dc4ff
--- /dev/null
+++ b/Skins/Streetlight/[icon]cd.jpg
Binary files differ
diff --git a/Skins/Streetlight/[icon]error.jpg b/Skins/Streetlight/[icon]error.jpg
new file mode 100644
index 00000000..a5140f0e
--- /dev/null
+++ b/Skins/Streetlight/[icon]error.jpg
Binary files differ
diff --git a/Skins/Streetlight/[icon]main.jpg b/Skins/Streetlight/[icon]main.jpg
new file mode 100644
index 00000000..5941256a
--- /dev/null
+++ b/Skins/Streetlight/[icon]main.jpg
Binary files differ
diff --git a/Skins/Streetlight/[icon]options.jpg b/Skins/Streetlight/[icon]options.jpg
new file mode 100644
index 00000000..278f0adc
--- /dev/null
+++ b/Skins/Streetlight/[icon]options.jpg
Binary files differ
diff --git a/Skins/Streetlight/[icon]party.jpg b/Skins/Streetlight/[icon]party.jpg
new file mode 100644
index 00000000..2bccd403
--- /dev/null
+++ b/Skins/Streetlight/[icon]party.jpg
Binary files differ
diff --git a/Skins/Streetlight/[icon]question.jpg b/Skins/Streetlight/[icon]question.jpg
new file mode 100644
index 00000000..029172de
--- /dev/null
+++ b/Skins/Streetlight/[icon]question.jpg
Binary files differ
diff --git a/Skins/Streetlight/[icon]score.jpg b/Skins/Streetlight/[icon]score.jpg
new file mode 100644
index 00000000..6402fa9a
--- /dev/null
+++ b/Skins/Streetlight/[icon]score.jpg
Binary files differ
diff --git a/Skins/Streetlight/[icon]search.jpg b/Skins/Streetlight/[icon]search.jpg
new file mode 100644
index 00000000..b5870592
--- /dev/null
+++ b/Skins/Streetlight/[icon]search.jpg
Binary files differ
diff --git a/Skins/Streetlight/[icon]songmenu.jpg b/Skins/Streetlight/[icon]songmenu.jpg
new file mode 100644
index 00000000..35f4b440
--- /dev/null
+++ b/Skins/Streetlight/[icon]songmenu.jpg
Binary files differ
diff --git a/Skins/Streetlight/[icon]stats.jpg b/Skins/Streetlight/[icon]stats.jpg
new file mode 100644
index 00000000..505a6709
--- /dev/null
+++ b/Skins/Streetlight/[icon]stats.jpg
Binary files differ
diff --git a/Skins/Streetlight/[icon]video.jpg b/Skins/Streetlight/[icon]video.jpg
new file mode 100644
index 00000000..12d71add
--- /dev/null
+++ b/Skins/Streetlight/[icon]video.jpg
Binary files differ
diff --git a/Skins/Streetlight/[main]button.jpg b/Skins/Streetlight/[main]button.jpg
new file mode 100644
index 00000000..15a34c66
--- /dev/null
+++ b/Skins/Streetlight/[main]button.jpg
Binary files differ
diff --git a/Skins/Streetlight/[main]button2.jpg b/Skins/Streetlight/[main]button2.jpg
new file mode 100644
index 00000000..de66ec1c
--- /dev/null
+++ b/Skins/Streetlight/[main]button2.jpg
Binary files differ
diff --git a/Skins/Streetlight/[main]buttonf.jpg b/Skins/Streetlight/[main]buttonf.jpg
new file mode 100644
index 00000000..d844add5
--- /dev/null
+++ b/Skins/Streetlight/[main]buttonf.jpg
Binary files differ
diff --git a/Skins/Streetlight/[main]mainBar.jpg b/Skins/Streetlight/[main]mainBar.jpg
new file mode 100644
index 00000000..77c84430
--- /dev/null
+++ b/Skins/Streetlight/[main]mainBar.jpg
Binary files differ
diff --git a/Skins/Streetlight/[main]playerNumberBox.jpg b/Skins/Streetlight/[main]playerNumberBox.jpg
new file mode 100644
index 00000000..53e7964c
--- /dev/null
+++ b/Skins/Streetlight/[main]playerNumberBox.jpg
Binary files differ
diff --git a/Skins/Streetlight/[main]selectbg.jpg b/Skins/Streetlight/[main]selectbg.jpg
new file mode 100644
index 00000000..fef45648
--- /dev/null
+++ b/Skins/Streetlight/[main]selectbg.jpg
Binary files differ
diff --git a/Skins/Streetlight/[main]songCover.jpg b/Skins/Streetlight/[main]songCover.jpg
new file mode 100644
index 00000000..426bf22d
--- /dev/null
+++ b/Skins/Streetlight/[main]songCover.jpg
Binary files differ
diff --git a/Skins/Streetlight/[main]songSelection1.jpg b/Skins/Streetlight/[main]songSelection1.jpg
new file mode 100644
index 00000000..348737ed
--- /dev/null
+++ b/Skins/Streetlight/[main]songSelection1.jpg
Binary files differ
diff --git a/Skins/Streetlight/[main]songSelection2.jpg b/Skins/Streetlight/[main]songSelection2.jpg
new file mode 100644
index 00000000..ffd3a6ba
--- /dev/null
+++ b/Skins/Streetlight/[main]songSelection2.jpg
Binary files differ
diff --git a/Skins/Streetlight/[menu]PopUpBg.JPG b/Skins/Streetlight/[menu]PopUpBg.JPG
new file mode 100644
index 00000000..141d740a
--- /dev/null
+++ b/Skins/Streetlight/[menu]PopUpBg.JPG
Binary files differ
diff --git a/Skins/Streetlight/[menu]PopUpFg.JPG b/Skins/Streetlight/[menu]PopUpFg.JPG
new file mode 100644
index 00000000..9e9c6dea
--- /dev/null
+++ b/Skins/Streetlight/[menu]PopUpFg.JPG
Binary files differ
diff --git a/Skins/Streetlight/[menu]jumpToBg.jpg b/Skins/Streetlight/[menu]jumpToBg.jpg
new file mode 100644
index 00000000..a8b93e10
--- /dev/null
+++ b/Skins/Streetlight/[menu]jumpToBg.jpg
Binary files differ
diff --git a/Skins/Streetlight/[menu]songMenuBg.jpg b/Skins/Streetlight/[menu]songMenuBg.jpg
new file mode 100644
index 00000000..ef530ef5
--- /dev/null
+++ b/Skins/Streetlight/[menu]songMenuBg.jpg
Binary files differ
diff --git a/Skins/Streetlight/[menu]songMenuSelectBg.jpg b/Skins/Streetlight/[menu]songMenuSelectBg.jpg
new file mode 100644
index 00000000..79966f3b
--- /dev/null
+++ b/Skins/Streetlight/[menu]songMenuSelectBg.jpg
Binary files differ
diff --git a/Skins/Streetlight/[party]Joker.jpg b/Skins/Streetlight/[party]Joker.jpg
new file mode 100644
index 00000000..e2a18684
--- /dev/null
+++ b/Skins/Streetlight/[party]Joker.jpg
Binary files differ
diff --git a/Skins/Streetlight/[party]playerButton.jpg b/Skins/Streetlight/[party]playerButton.jpg
new file mode 100644
index 00000000..15a34c66
--- /dev/null
+++ b/Skins/Streetlight/[party]playerButton.jpg
Binary files differ
diff --git a/Skins/Streetlight/[party]playerTeamButton.jpg b/Skins/Streetlight/[party]playerTeamButton.jpg
new file mode 100644
index 00000000..2faf9c4b
--- /dev/null
+++ b/Skins/Streetlight/[party]playerTeamButton.jpg
Binary files differ
diff --git a/Skins/Streetlight/[party]pointer.bmp b/Skins/Streetlight/[party]pointer.bmp
new file mode 100644
index 00000000..88bbcc3d
--- /dev/null
+++ b/Skins/Streetlight/[party]pointer.bmp
Binary files differ
diff --git a/Skins/Streetlight/[party]roundBG1.jpg b/Skins/Streetlight/[party]roundBG1.jpg
new file mode 100644
index 00000000..464aabea
--- /dev/null
+++ b/Skins/Streetlight/[party]roundBG1.jpg
Binary files differ
diff --git a/Skins/Streetlight/[party]roundBG2.jpg b/Skins/Streetlight/[party]roundBG2.jpg
new file mode 100644
index 00000000..3413958f
--- /dev/null
+++ b/Skins/Streetlight/[party]roundBG2.jpg
Binary files differ
diff --git a/Skins/Streetlight/[party]roundBG3.jpg b/Skins/Streetlight/[party]roundBG3.jpg
new file mode 100644
index 00000000..c6b53caf
--- /dev/null
+++ b/Skins/Streetlight/[party]roundBG3.jpg
Binary files differ
diff --git a/Skins/Streetlight/[party]roundBG4.jpg b/Skins/Streetlight/[party]roundBG4.jpg
new file mode 100644
index 00000000..5e4da0ac
--- /dev/null
+++ b/Skins/Streetlight/[party]roundBG4.jpg
Binary files differ
diff --git a/Skins/Streetlight/[party]roundTeamButton.jpg b/Skins/Streetlight/[party]roundTeamButton.jpg
new file mode 100644
index 00000000..692db1bd
--- /dev/null
+++ b/Skins/Streetlight/[party]roundTeamButton.jpg
Binary files differ
diff --git a/Skins/Streetlight/[party]scoreBG1.jpg b/Skins/Streetlight/[party]scoreBG1.jpg
new file mode 100644
index 00000000..f558425d
--- /dev/null
+++ b/Skins/Streetlight/[party]scoreBG1.jpg
Binary files differ
diff --git a/Skins/Streetlight/[party]scoreBG2.jpg b/Skins/Streetlight/[party]scoreBG2.jpg
new file mode 100644
index 00000000..47239d85
--- /dev/null
+++ b/Skins/Streetlight/[party]scoreBG2.jpg
Binary files differ
diff --git a/Skins/Streetlight/[party]scoreDecoration.jpg b/Skins/Streetlight/[party]scoreDecoration.jpg
new file mode 100644
index 00000000..49204e19
--- /dev/null
+++ b/Skins/Streetlight/[party]scoreDecoration.jpg
Binary files differ
diff --git a/Skins/Streetlight/[party]teamPoints.jpg b/Skins/Streetlight/[party]teamPoints.jpg
new file mode 100644
index 00000000..96855bc9
--- /dev/null
+++ b/Skins/Streetlight/[party]teamPoints.jpg
Binary files differ
diff --git a/Skins/Streetlight/[party]winDecoration1.jpg b/Skins/Streetlight/[party]winDecoration1.jpg
new file mode 100644
index 00000000..0277f529
--- /dev/null
+++ b/Skins/Streetlight/[party]winDecoration1.jpg
Binary files differ
diff --git a/Skins/Streetlight/[party]winTeamButton1.jpg b/Skins/Streetlight/[party]winTeamButton1.jpg
new file mode 100644
index 00000000..10c8d80f
--- /dev/null
+++ b/Skins/Streetlight/[party]winTeamButton1.jpg
Binary files differ
diff --git a/Skins/Streetlight/[party]winTeamButton2.jpg b/Skins/Streetlight/[party]winTeamButton2.jpg
new file mode 100644
index 00000000..fbd85056
--- /dev/null
+++ b/Skins/Streetlight/[party]winTeamButton2.jpg
Binary files differ
diff --git a/Skins/Streetlight/[party]winTeamButton3.jpg b/Skins/Streetlight/[party]winTeamButton3.jpg
new file mode 100644
index 00000000..e8dd9566
--- /dev/null
+++ b/Skins/Streetlight/[party]winTeamButton3.jpg
Binary files differ
diff --git a/Skins/Streetlight/[score]Line.jpg b/Skins/Streetlight/[score]Line.jpg
new file mode 100644
index 00000000..61cf33f5
--- /dev/null
+++ b/Skins/Streetlight/[score]Line.jpg
Binary files differ
diff --git a/Skins/Streetlight/[score]box.jpg b/Skins/Streetlight/[score]box.jpg
new file mode 100644
index 00000000..b37f7e46
--- /dev/null
+++ b/Skins/Streetlight/[score]box.jpg
Binary files differ
diff --git a/Skins/Streetlight/[score]endcap.jpg b/Skins/Streetlight/[score]endcap.jpg
new file mode 100644
index 00000000..0cad98a5
--- /dev/null
+++ b/Skins/Streetlight/[score]endcap.jpg
Binary files differ
diff --git a/Skins/Streetlight/[score]level.jpg b/Skins/Streetlight/[score]level.jpg
new file mode 100644
index 00000000..9e9c4086
--- /dev/null
+++ b/Skins/Streetlight/[score]level.jpg
Binary files differ
diff --git a/Skins/Streetlight/[score]levelRound.jpg b/Skins/Streetlight/[score]levelRound.jpg
new file mode 100644
index 00000000..38cfddea
--- /dev/null
+++ b/Skins/Streetlight/[score]levelRound.jpg
Binary files differ
diff --git a/Skins/Streetlight/[sing]LyricsBall.bmp b/Skins/Streetlight/[sing]LyricsBall.bmp
new file mode 100644
index 00000000..5b7d7943
--- /dev/null
+++ b/Skins/Streetlight/[sing]LyricsBall.bmp
Binary files differ
diff --git a/Skins/Streetlight/[sing]lineBonusPopUp.jpg b/Skins/Streetlight/[sing]lineBonusPopUp.jpg
new file mode 100644
index 00000000..58d93130
--- /dev/null
+++ b/Skins/Streetlight/[sing]lineBonusPopUp.jpg
Binary files differ
diff --git a/Skins/Streetlight/[sing]lyricsHelpBar.bmp b/Skins/Streetlight/[sing]lyricsHelpBar.bmp
new file mode 100644
index 00000000..836d3537
--- /dev/null
+++ b/Skins/Streetlight/[sing]lyricsHelpBar.bmp
Binary files differ
diff --git a/Skins/Streetlight/[sing]notesBgLeft.bmp b/Skins/Streetlight/[sing]notesBgLeft.bmp
new file mode 100644
index 00000000..776e567c
--- /dev/null
+++ b/Skins/Streetlight/[sing]notesBgLeft.bmp
Binary files differ
diff --git a/Skins/Streetlight/[sing]notesBgMid.bmp b/Skins/Streetlight/[sing]notesBgMid.bmp
new file mode 100644
index 00000000..759ac8a3
--- /dev/null
+++ b/Skins/Streetlight/[sing]notesBgMid.bmp
Binary files differ
diff --git a/Skins/Streetlight/[sing]notesBgRight.bmp b/Skins/Streetlight/[sing]notesBgRight.bmp
new file mode 100644
index 00000000..9b1ffc18
--- /dev/null
+++ b/Skins/Streetlight/[sing]notesBgRight.bmp
Binary files differ
diff --git a/Skins/Streetlight/[sing]notesLeft.bmp b/Skins/Streetlight/[sing]notesLeft.bmp
new file mode 100644
index 00000000..3d22e5fc
--- /dev/null
+++ b/Skins/Streetlight/[sing]notesLeft.bmp
Binary files differ
diff --git a/Skins/Streetlight/[sing]notesMid.bmp b/Skins/Streetlight/[sing]notesMid.bmp
new file mode 100644
index 00000000..2daa66b8
--- /dev/null
+++ b/Skins/Streetlight/[sing]notesMid.bmp
Binary files differ
diff --git a/Skins/Streetlight/[sing]notesRight.bmp b/Skins/Streetlight/[sing]notesRight.bmp
new file mode 100644
index 00000000..cd936129
--- /dev/null
+++ b/Skins/Streetlight/[sing]notesRight.bmp
Binary files differ
diff --git a/Skins/Streetlight/[sing]p.jpg b/Skins/Streetlight/[sing]p.jpg
new file mode 100644
index 00000000..e490fbf4
--- /dev/null
+++ b/Skins/Streetlight/[sing]p.jpg
Binary files differ
diff --git a/Skins/Streetlight/[sing]scoreBg.jpg b/Skins/Streetlight/[sing]scoreBg.jpg
new file mode 100644
index 00000000..2bcbedaa
--- /dev/null
+++ b/Skins/Streetlight/[sing]scoreBg.jpg
Binary files differ
diff --git a/Skins/Streetlight/[sing]singBarBack.jpg b/Skins/Streetlight/[sing]singBarBack.jpg
new file mode 100644
index 00000000..d7dcd791
--- /dev/null
+++ b/Skins/Streetlight/[sing]singBarBack.jpg
Binary files differ
diff --git a/Skins/Streetlight/[sing]singBarBar.jpg b/Skins/Streetlight/[sing]singBarBar.jpg
new file mode 100644
index 00000000..4fd9bde9
--- /dev/null
+++ b/Skins/Streetlight/[sing]singBarBar.jpg
Binary files differ
diff --git a/Skins/Streetlight/[sing]singBarFront.jpg b/Skins/Streetlight/[sing]singBarFront.jpg
new file mode 100644
index 00000000..eec27b79
--- /dev/null
+++ b/Skins/Streetlight/[sing]singBarFront.jpg
Binary files differ
diff --git a/Skins/Streetlight/[sing]textBar.jpg b/Skins/Streetlight/[sing]textBar.jpg
new file mode 100644
index 00000000..596a668a
--- /dev/null
+++ b/Skins/Streetlight/[sing]textBar.jpg
Binary files differ
diff --git a/Skins/Streetlight/[sing]timeBar.jpg b/Skins/Streetlight/[sing]timeBar.jpg
new file mode 100644
index 00000000..6e1e42dd
--- /dev/null
+++ b/Skins/Streetlight/[sing]timeBar.jpg
Binary files differ
diff --git a/Skins/Streetlight/[sing]timeBarBG.jpg b/Skins/Streetlight/[sing]timeBarBG.jpg
new file mode 100644
index 00000000..5298a0c5
--- /dev/null
+++ b/Skins/Streetlight/[sing]timeBarBG.jpg
Binary files differ
diff --git a/Skins/Streetlight/[special]bar1.jpg b/Skins/Streetlight/[special]bar1.jpg
new file mode 100644
index 00000000..487d12eb
--- /dev/null
+++ b/Skins/Streetlight/[special]bar1.jpg
Binary files differ
diff --git a/Skins/Streetlight/[special]bar2.jpg b/Skins/Streetlight/[special]bar2.jpg
new file mode 100644
index 00000000..1985fb38
--- /dev/null
+++ b/Skins/Streetlight/[special]bar2.jpg
Binary files differ
diff --git a/Skins/Streetlight/[stat]detailBG1.jpg b/Skins/Streetlight/[stat]detailBG1.jpg
new file mode 100644
index 00000000..120dc483
--- /dev/null
+++ b/Skins/Streetlight/[stat]detailBG1.jpg
Binary files differ
diff --git a/Skins/Streetlight/[stat]mainBG1.jpg b/Skins/Streetlight/[stat]mainBG1.jpg
new file mode 100644
index 00000000..a937b24a
--- /dev/null
+++ b/Skins/Streetlight/[stat]mainBG1.jpg
Binary files differ
diff --git a/Skins/Streetlight/[stat]mainBG2.jpg b/Skins/Streetlight/[stat]mainBG2.jpg
new file mode 100644
index 00000000..201d49b8
--- /dev/null
+++ b/Skins/Streetlight/[stat]mainBG2.jpg
Binary files differ
diff --git a/Skins/Streetlight/[stat]mainBG3.jpg b/Skins/Streetlight/[stat]mainBG3.jpg
new file mode 100644
index 00000000..4fb6bc06
--- /dev/null
+++ b/Skins/Streetlight/[stat]mainBG3.jpg
Binary files differ
diff --git a/Skins/Streetlight/bg-main.jpg b/Skins/Streetlight/bg-main.jpg
new file mode 100644
index 00000000..46bf3a02
--- /dev/null
+++ b/Skins/Streetlight/bg-main.jpg
Binary files differ
diff --git a/Skins/Streetlight/bg-song.jpg b/Skins/Streetlight/bg-song.jpg
new file mode 100644
index 00000000..fdbace75
--- /dev/null
+++ b/Skins/Streetlight/bg-song.jpg
Binary files differ
diff --git a/Skins/Vistar/Thumbs.db b/Skins/Vistar/Thumbs.db
new file mode 100644
index 00000000..aa31acd6
--- /dev/null
+++ b/Skins/Vistar/Thumbs.db
Binary files differ
diff --git a/Skins/Vistar/Vistar.ini b/Skins/Vistar/Vistar.ini
new file mode 100644
index 00000000..a5c5bd38
--- /dev/null
+++ b/Skins/Vistar/Vistar.ini
@@ -0,0 +1,150 @@
+[Skin]
+Theme=Vistar
+Name=Vistar
+Color=Blue
+
+[Textures]
+
+Button = [main]button.jpg
+ButtonF = [main]buttonf.jpg
+MainBar = [main]mainBar.jpg
+SelectBG = [main]selectbg.jpg
+ButtonSolo = [mainbutton]Solo.jpg
+ButtonMulti = [mainbutton]Multi.jpg
+ButtonStats = [mainbutton]Stats.jpg
+ButtonOptions = [mainbutton]Options.jpg
+ButtonExit = [mainbutton]Exit.jpg
+MainButtons = main-buttons.jpg
+
+
+#Backgrounds
+LoadingBG = bg-load.jpg
+MainBG = bg-main.jpg
+SongBG = bg-song.jpg
+ScoreScreenBG = bg-score.jpg
+Top5BG = bg-score.jpg
+OptionsBG = bg-main.jpg
+PartyBG = bg-lite.jpg
+Options2BG = bg-lite.jpg
+
+#Icons on screen
+SongCD = [icon]cd.jpg
+MainIcon = [icon]main.jpg
+MainSearch = [icon]search.jpg
+IconOption = [icon]options.jpg
+IconSongMenu = [icon]songmenu.jpg
+ScoreIcon = [icon]score.jpg
+PartyIcon = [icon]party.jpg
+StatIcon = [icon]stats.jpg
+VideoIcon = [icon]video.jpg
+
+IconError = [icon]error.jpg
+IconQuestion = [icon]question.jpg
+
+# # # S O N G S E L E C E T # # #
+SongSelection1 = [main]songSelection1.jpg
+SongSelection2 = [main]songSelection2.jpg
+SongCover = [main]songCover.jpg
+
+# # # S I N G # # #
+#the bar where the lyrics reside
+LyricBar = [sing]textBar.jpg
+
+#this one slides in, to tell you that singing starts immediately
+LyricHelpBar = [sing]lyricsHelpBar.bmp
+
+#the time progress bar
+TimeBar1 = [sing]timeBarBG.jpg
+
+#the bar behind the timestuff
+TimeBar2 = [sing]timeBar.jpg
+
+#linebonus, the thing that pop ups at the score
+LineBonusBack = [sing]lineBonusPopUp.jpg
+
+#Singbar (the thing beneath the scores)
+SingBarBack = [sing]singBarBack.jpg
+SingBarBar = [sing]singBarBar.jpg
+SingBarFront = [sing]singBarFront.jpg
+
+#Background for scores
+ScoreBG = [sing]scoreBg.jpg
+
+#Background for the P1, P2 and so on
+P = [sing]p.jpg
+
+#Pointer for lyrics
+Ball = [sing]LyricsBall.bmp
+
+
+# # # S C O R E / T O P 5 # # #
+ScoreBox = [score]box.jpg
+ScoreLevel = [score]level.jpg
+ScoreLevelRound = [score]levelRound.jpg
+ScoreEndCap = [score]endcap.jpg
+ScoreLine = [score]line.jpg
+PlayerNumberBox = [main]playerNumberBox.jpg
+
+
+# # # P A R T Y # # #
+Joker =[party]Joker.jpg
+PartyPlayerButton =[party]playerButton.jpg
+PartyTeamButton1 =[party]roundTeamButton.jpg
+PartyTeamButton2 =[party]playerTeamButton.jpg
+PartyTeamButton3 =[party]winTeamButton1.jpg
+PartyTeamButton4 =[party]winTeamButton2.jpg
+PartyTeamButton5 =[party]winTeamButton3.jpg
+PartyRoundBG1 =[party]roundBG1.jpg
+PartyRoundBG2 =[party]roundBG2.jpg
+PartyRoundBG3 =[party]roundBG3.jpg
+PartyRoundBG4 =[party]roundBG4.jpg
+HDL_Pointer =[party]pointer.bmp
+PartyTeamPoints =[party]teamPoints.jpg
+PartyScoreDeco =[party]scoreDecoration.jpg
+PartyScoreBG1 =[party]scoreBG1.jpg
+PartyScoreBG2 =[party]scoreBG2.jpg
+PartyWinDeco1 =[party]winDecoration1.jpg
+PartyWinDeco2 =[party]winDecoration1.jpg
+PartyWinDeco3 =[party]winDecoration1.jpg
+
+# # # S T A T S # # #
+StatMainBG1 = [stat]mainBG1.jpg
+StatMainBG2 = [stat]mainBG2.jpg
+StatMainBG3 = [stat]mainBG3.jpg
+StatDetailBG1 = [stat]detailBG1.jpg
+
+
+# # # N A V I # # #
+ButtonP = [button]p.jpg
+ButtonM = [button]m.jpg
+ButtonJ = [button]j.jpg
+ButtonAlt = [button]alt.jpg
+ButtonAZ = [button]az.jpg
+ButtonEnter = [button]enter.jpg
+ButtonNavi = [button]navi.jpg
+ButtonEsc = [button]esc.jpg
+Button13 = [button]13.jpg
+
+JumpToBG = [menu]jumpToBg.jpg
+SongMenuBG = [menu]songMenuBg.jpg
+SongMenuSelectBG = [menu]songMenuSelectBg.jpg
+PopUpBG = [menu]popUpBG.jpg
+PopUpFG = [menu]popUpFG.jpg
+
+
+# # # N O T E S # # #
+GrayLeft = [sing]notesLeft.bmp
+GrayMid = [sing]notesMid.bmp
+GrayRight = [sing]notesRight.bmp
+NoteBGLeft = [sing]notesBgLeft.bmp
+NoteBGMid = [sing]notesBgMid.bmp
+NoteBGRight = [sing]notesBgRight.bmp
+
+
+# # # E F F E C T S # # #
+NoteStar = [effect]goldenNoteStar.jpg
+NotePerfectStar = [effect]perfectNoteStar.jpg
+
+
+# # # dirty helpers # # #
+Rectangle = [helper]rectangle.jpg \ No newline at end of file
diff --git a/Skins/Vistar/[button]13.jpg b/Skins/Vistar/[button]13.jpg
new file mode 100644
index 00000000..dd3453b2
--- /dev/null
+++ b/Skins/Vistar/[button]13.jpg
Binary files differ
diff --git a/Skins/Vistar/[button]alt.jpg b/Skins/Vistar/[button]alt.jpg
new file mode 100644
index 00000000..bb94afa0
--- /dev/null
+++ b/Skins/Vistar/[button]alt.jpg
Binary files differ
diff --git a/Skins/Vistar/[button]az.jpg b/Skins/Vistar/[button]az.jpg
new file mode 100644
index 00000000..34e02271
--- /dev/null
+++ b/Skins/Vistar/[button]az.jpg
Binary files differ
diff --git a/Skins/Vistar/[button]enter.jpg b/Skins/Vistar/[button]enter.jpg
new file mode 100644
index 00000000..70ded774
--- /dev/null
+++ b/Skins/Vistar/[button]enter.jpg
Binary files differ
diff --git a/Skins/Vistar/[button]esc.jpg b/Skins/Vistar/[button]esc.jpg
new file mode 100644
index 00000000..42665788
--- /dev/null
+++ b/Skins/Vistar/[button]esc.jpg
Binary files differ
diff --git a/Skins/Vistar/[button]j.jpg b/Skins/Vistar/[button]j.jpg
new file mode 100644
index 00000000..0c85dcc8
--- /dev/null
+++ b/Skins/Vistar/[button]j.jpg
Binary files differ
diff --git a/Skins/Vistar/[button]m.jpg b/Skins/Vistar/[button]m.jpg
new file mode 100644
index 00000000..5d55e476
--- /dev/null
+++ b/Skins/Vistar/[button]m.jpg
Binary files differ
diff --git a/Skins/Vistar/[button]navi.jpg b/Skins/Vistar/[button]navi.jpg
new file mode 100644
index 00000000..387635ac
--- /dev/null
+++ b/Skins/Vistar/[button]navi.jpg
Binary files differ
diff --git a/Skins/Vistar/[button]p.jpg b/Skins/Vistar/[button]p.jpg
new file mode 100644
index 00000000..d6b4d0c7
--- /dev/null
+++ b/Skins/Vistar/[button]p.jpg
Binary files differ
diff --git a/Skins/Vistar/[effect]goldenNoteStar.jpg b/Skins/Vistar/[effect]goldenNoteStar.jpg
new file mode 100644
index 00000000..1b31d267
--- /dev/null
+++ b/Skins/Vistar/[effect]goldenNoteStar.jpg
Binary files differ
diff --git a/Skins/Vistar/[effect]perfectNoteStar.jpg b/Skins/Vistar/[effect]perfectNoteStar.jpg
new file mode 100644
index 00000000..189a22a3
--- /dev/null
+++ b/Skins/Vistar/[effect]perfectNoteStar.jpg
Binary files differ
diff --git a/Skins/Vistar/[helper]rectangle.jpg b/Skins/Vistar/[helper]rectangle.jpg
new file mode 100644
index 00000000..e03f98fc
--- /dev/null
+++ b/Skins/Vistar/[helper]rectangle.jpg
Binary files differ
diff --git a/Skins/Vistar/[icon]cd.jpg b/Skins/Vistar/[icon]cd.jpg
new file mode 100644
index 00000000..d48dc4ff
--- /dev/null
+++ b/Skins/Vistar/[icon]cd.jpg
Binary files differ
diff --git a/Skins/Vistar/[icon]error.jpg b/Skins/Vistar/[icon]error.jpg
new file mode 100644
index 00000000..a5140f0e
--- /dev/null
+++ b/Skins/Vistar/[icon]error.jpg
Binary files differ
diff --git a/Skins/Vistar/[icon]main.jpg b/Skins/Vistar/[icon]main.jpg
new file mode 100644
index 00000000..5941256a
--- /dev/null
+++ b/Skins/Vistar/[icon]main.jpg
Binary files differ
diff --git a/Skins/Vistar/[icon]options.jpg b/Skins/Vistar/[icon]options.jpg
new file mode 100644
index 00000000..278f0adc
--- /dev/null
+++ b/Skins/Vistar/[icon]options.jpg
Binary files differ
diff --git a/Skins/Vistar/[icon]party.jpg b/Skins/Vistar/[icon]party.jpg
new file mode 100644
index 00000000..2bccd403
--- /dev/null
+++ b/Skins/Vistar/[icon]party.jpg
Binary files differ
diff --git a/Skins/Vistar/[icon]question.jpg b/Skins/Vistar/[icon]question.jpg
new file mode 100644
index 00000000..029172de
--- /dev/null
+++ b/Skins/Vistar/[icon]question.jpg
Binary files differ
diff --git a/Skins/Vistar/[icon]score.jpg b/Skins/Vistar/[icon]score.jpg
new file mode 100644
index 00000000..6402fa9a
--- /dev/null
+++ b/Skins/Vistar/[icon]score.jpg
Binary files differ
diff --git a/Skins/Vistar/[icon]search.jpg b/Skins/Vistar/[icon]search.jpg
new file mode 100644
index 00000000..b5870592
--- /dev/null
+++ b/Skins/Vistar/[icon]search.jpg
Binary files differ
diff --git a/Skins/Vistar/[icon]songmenu.jpg b/Skins/Vistar/[icon]songmenu.jpg
new file mode 100644
index 00000000..35f4b440
--- /dev/null
+++ b/Skins/Vistar/[icon]songmenu.jpg
Binary files differ
diff --git a/Skins/Vistar/[icon]stats.jpg b/Skins/Vistar/[icon]stats.jpg
new file mode 100644
index 00000000..505a6709
--- /dev/null
+++ b/Skins/Vistar/[icon]stats.jpg
Binary files differ
diff --git a/Skins/Vistar/[icon]video.jpg b/Skins/Vistar/[icon]video.jpg
new file mode 100644
index 00000000..12d71add
--- /dev/null
+++ b/Skins/Vistar/[icon]video.jpg
Binary files differ
diff --git a/Skins/Vistar/[main]button.jpg b/Skins/Vistar/[main]button.jpg
new file mode 100644
index 00000000..a810d63c
--- /dev/null
+++ b/Skins/Vistar/[main]button.jpg
Binary files differ
diff --git a/Skins/Vistar/[main]buttonf.jpg b/Skins/Vistar/[main]buttonf.jpg
new file mode 100644
index 00000000..d844add5
--- /dev/null
+++ b/Skins/Vistar/[main]buttonf.jpg
Binary files differ
diff --git a/Skins/Vistar/[main]mainBar.jpg b/Skins/Vistar/[main]mainBar.jpg
new file mode 100644
index 00000000..ad25c801
--- /dev/null
+++ b/Skins/Vistar/[main]mainBar.jpg
Binary files differ
diff --git a/Skins/Vistar/[main]playerNumberBox.jpg b/Skins/Vistar/[main]playerNumberBox.jpg
new file mode 100644
index 00000000..53e7964c
--- /dev/null
+++ b/Skins/Vistar/[main]playerNumberBox.jpg
Binary files differ
diff --git a/Skins/Vistar/[main]selectbg.jpg b/Skins/Vistar/[main]selectbg.jpg
new file mode 100644
index 00000000..b42bf1ce
--- /dev/null
+++ b/Skins/Vistar/[main]selectbg.jpg
Binary files differ
diff --git a/Skins/Vistar/[main]songCover.jpg b/Skins/Vistar/[main]songCover.jpg
new file mode 100644
index 00000000..426bf22d
--- /dev/null
+++ b/Skins/Vistar/[main]songCover.jpg
Binary files differ
diff --git a/Skins/Vistar/[main]songSelection2.jpg b/Skins/Vistar/[main]songSelection2.jpg
new file mode 100644
index 00000000..cb3a3396
--- /dev/null
+++ b/Skins/Vistar/[main]songSelection2.jpg
Binary files differ
diff --git a/Skins/Vistar/[mainbutton]Exit.jpg b/Skins/Vistar/[mainbutton]Exit.jpg
new file mode 100644
index 00000000..55494e65
--- /dev/null
+++ b/Skins/Vistar/[mainbutton]Exit.jpg
Binary files differ
diff --git a/Skins/Vistar/[mainbutton]Multi.jpg b/Skins/Vistar/[mainbutton]Multi.jpg
new file mode 100644
index 00000000..ad5980d7
--- /dev/null
+++ b/Skins/Vistar/[mainbutton]Multi.jpg
Binary files differ
diff --git a/Skins/Vistar/[mainbutton]Options.jpg b/Skins/Vistar/[mainbutton]Options.jpg
new file mode 100644
index 00000000..5e1bff71
--- /dev/null
+++ b/Skins/Vistar/[mainbutton]Options.jpg
Binary files differ
diff --git a/Skins/Vistar/[mainbutton]Solo.jpg b/Skins/Vistar/[mainbutton]Solo.jpg
new file mode 100644
index 00000000..a7e3d82a
--- /dev/null
+++ b/Skins/Vistar/[mainbutton]Solo.jpg
Binary files differ
diff --git a/Skins/Vistar/[mainbutton]Stats.jpg b/Skins/Vistar/[mainbutton]Stats.jpg
new file mode 100644
index 00000000..71cc13ad
--- /dev/null
+++ b/Skins/Vistar/[mainbutton]Stats.jpg
Binary files differ
diff --git a/Skins/Vistar/[menu]PopUpBg.JPG b/Skins/Vistar/[menu]PopUpBg.JPG
new file mode 100644
index 00000000..141d740a
--- /dev/null
+++ b/Skins/Vistar/[menu]PopUpBg.JPG
Binary files differ
diff --git a/Skins/Vistar/[menu]PopUpFg.JPG b/Skins/Vistar/[menu]PopUpFg.JPG
new file mode 100644
index 00000000..9e9c6dea
--- /dev/null
+++ b/Skins/Vistar/[menu]PopUpFg.JPG
Binary files differ
diff --git a/Skins/Vistar/[menu]jumpToBg.jpg b/Skins/Vistar/[menu]jumpToBg.jpg
new file mode 100644
index 00000000..a8b93e10
--- /dev/null
+++ b/Skins/Vistar/[menu]jumpToBg.jpg
Binary files differ
diff --git a/Skins/Vistar/[menu]songMenuBg.jpg b/Skins/Vistar/[menu]songMenuBg.jpg
new file mode 100644
index 00000000..ef530ef5
--- /dev/null
+++ b/Skins/Vistar/[menu]songMenuBg.jpg
Binary files differ
diff --git a/Skins/Vistar/[menu]songMenuSelectBg.jpg b/Skins/Vistar/[menu]songMenuSelectBg.jpg
new file mode 100644
index 00000000..79966f3b
--- /dev/null
+++ b/Skins/Vistar/[menu]songMenuSelectBg.jpg
Binary files differ
diff --git a/Skins/Vistar/[party]Joker.jpg b/Skins/Vistar/[party]Joker.jpg
new file mode 100644
index 00000000..e2a18684
--- /dev/null
+++ b/Skins/Vistar/[party]Joker.jpg
Binary files differ
diff --git a/Skins/Vistar/[party]playerButton.jpg b/Skins/Vistar/[party]playerButton.jpg
new file mode 100644
index 00000000..15a34c66
--- /dev/null
+++ b/Skins/Vistar/[party]playerButton.jpg
Binary files differ
diff --git a/Skins/Vistar/[party]playerTeamButton.jpg b/Skins/Vistar/[party]playerTeamButton.jpg
new file mode 100644
index 00000000..2faf9c4b
--- /dev/null
+++ b/Skins/Vistar/[party]playerTeamButton.jpg
Binary files differ
diff --git a/Skins/Vistar/[party]pointer.bmp b/Skins/Vistar/[party]pointer.bmp
new file mode 100644
index 00000000..88bbcc3d
--- /dev/null
+++ b/Skins/Vistar/[party]pointer.bmp
Binary files differ
diff --git a/Skins/Vistar/[party]roundBG1.jpg b/Skins/Vistar/[party]roundBG1.jpg
new file mode 100644
index 00000000..464aabea
--- /dev/null
+++ b/Skins/Vistar/[party]roundBG1.jpg
Binary files differ
diff --git a/Skins/Vistar/[party]roundBG2.jpg b/Skins/Vistar/[party]roundBG2.jpg
new file mode 100644
index 00000000..3413958f
--- /dev/null
+++ b/Skins/Vistar/[party]roundBG2.jpg
Binary files differ
diff --git a/Skins/Vistar/[party]roundBG3.jpg b/Skins/Vistar/[party]roundBG3.jpg
new file mode 100644
index 00000000..c6b53caf
--- /dev/null
+++ b/Skins/Vistar/[party]roundBG3.jpg
Binary files differ
diff --git a/Skins/Vistar/[party]roundBG4.jpg b/Skins/Vistar/[party]roundBG4.jpg
new file mode 100644
index 00000000..5e4da0ac
--- /dev/null
+++ b/Skins/Vistar/[party]roundBG4.jpg
Binary files differ
diff --git a/Skins/Vistar/[party]roundTeamButton.jpg b/Skins/Vistar/[party]roundTeamButton.jpg
new file mode 100644
index 00000000..692db1bd
--- /dev/null
+++ b/Skins/Vistar/[party]roundTeamButton.jpg
Binary files differ
diff --git a/Skins/Vistar/[party]scoreBG1.jpg b/Skins/Vistar/[party]scoreBG1.jpg
new file mode 100644
index 00000000..f558425d
--- /dev/null
+++ b/Skins/Vistar/[party]scoreBG1.jpg
Binary files differ
diff --git a/Skins/Vistar/[party]scoreBG2.jpg b/Skins/Vistar/[party]scoreBG2.jpg
new file mode 100644
index 00000000..47239d85
--- /dev/null
+++ b/Skins/Vistar/[party]scoreBG2.jpg
Binary files differ
diff --git a/Skins/Vistar/[party]scoreDecoration.jpg b/Skins/Vistar/[party]scoreDecoration.jpg
new file mode 100644
index 00000000..49204e19
--- /dev/null
+++ b/Skins/Vistar/[party]scoreDecoration.jpg
Binary files differ
diff --git a/Skins/Vistar/[party]teamPoints.jpg b/Skins/Vistar/[party]teamPoints.jpg
new file mode 100644
index 00000000..96855bc9
--- /dev/null
+++ b/Skins/Vistar/[party]teamPoints.jpg
Binary files differ
diff --git a/Skins/Vistar/[party]winDecoration1.jpg b/Skins/Vistar/[party]winDecoration1.jpg
new file mode 100644
index 00000000..0277f529
--- /dev/null
+++ b/Skins/Vistar/[party]winDecoration1.jpg
Binary files differ
diff --git a/Skins/Vistar/[party]winTeamButton1.jpg b/Skins/Vistar/[party]winTeamButton1.jpg
new file mode 100644
index 00000000..10c8d80f
--- /dev/null
+++ b/Skins/Vistar/[party]winTeamButton1.jpg
Binary files differ
diff --git a/Skins/Vistar/[party]winTeamButton2.jpg b/Skins/Vistar/[party]winTeamButton2.jpg
new file mode 100644
index 00000000..fbd85056
--- /dev/null
+++ b/Skins/Vistar/[party]winTeamButton2.jpg
Binary files differ
diff --git a/Skins/Vistar/[party]winTeamButton3.jpg b/Skins/Vistar/[party]winTeamButton3.jpg
new file mode 100644
index 00000000..e8dd9566
--- /dev/null
+++ b/Skins/Vistar/[party]winTeamButton3.jpg
Binary files differ
diff --git a/Skins/Vistar/[score]Line.jpg b/Skins/Vistar/[score]Line.jpg
new file mode 100644
index 00000000..61cf33f5
--- /dev/null
+++ b/Skins/Vistar/[score]Line.jpg
Binary files differ
diff --git a/Skins/Vistar/[score]box.jpg b/Skins/Vistar/[score]box.jpg
new file mode 100644
index 00000000..b37f7e46
--- /dev/null
+++ b/Skins/Vistar/[score]box.jpg
Binary files differ
diff --git a/Skins/Vistar/[score]endcap.jpg b/Skins/Vistar/[score]endcap.jpg
new file mode 100644
index 00000000..0cad98a5
--- /dev/null
+++ b/Skins/Vistar/[score]endcap.jpg
Binary files differ
diff --git a/Skins/Vistar/[score]level.jpg b/Skins/Vistar/[score]level.jpg
new file mode 100644
index 00000000..9e9c4086
--- /dev/null
+++ b/Skins/Vistar/[score]level.jpg
Binary files differ
diff --git a/Skins/Vistar/[score]levelRound.jpg b/Skins/Vistar/[score]levelRound.jpg
new file mode 100644
index 00000000..38cfddea
--- /dev/null
+++ b/Skins/Vistar/[score]levelRound.jpg
Binary files differ
diff --git a/Skins/Vistar/[sing]LyricsBall.bmp b/Skins/Vistar/[sing]LyricsBall.bmp
new file mode 100644
index 00000000..5b7d7943
--- /dev/null
+++ b/Skins/Vistar/[sing]LyricsBall.bmp
Binary files differ
diff --git a/Skins/Vistar/[sing]lineBonusPopUp.jpg b/Skins/Vistar/[sing]lineBonusPopUp.jpg
new file mode 100644
index 00000000..58d93130
--- /dev/null
+++ b/Skins/Vistar/[sing]lineBonusPopUp.jpg
Binary files differ
diff --git a/Skins/Vistar/[sing]lyricsHelpBar.bmp b/Skins/Vistar/[sing]lyricsHelpBar.bmp
new file mode 100644
index 00000000..836d3537
--- /dev/null
+++ b/Skins/Vistar/[sing]lyricsHelpBar.bmp
Binary files differ
diff --git a/Skins/Vistar/[sing]notesBgLeft.bmp b/Skins/Vistar/[sing]notesBgLeft.bmp
new file mode 100644
index 00000000..776e567c
--- /dev/null
+++ b/Skins/Vistar/[sing]notesBgLeft.bmp
Binary files differ
diff --git a/Skins/Vistar/[sing]notesBgMid.bmp b/Skins/Vistar/[sing]notesBgMid.bmp
new file mode 100644
index 00000000..759ac8a3
--- /dev/null
+++ b/Skins/Vistar/[sing]notesBgMid.bmp
Binary files differ
diff --git a/Skins/Vistar/[sing]notesBgRight.bmp b/Skins/Vistar/[sing]notesBgRight.bmp
new file mode 100644
index 00000000..9b1ffc18
--- /dev/null
+++ b/Skins/Vistar/[sing]notesBgRight.bmp
Binary files differ
diff --git a/Skins/Vistar/[sing]notesLeft.bmp b/Skins/Vistar/[sing]notesLeft.bmp
new file mode 100644
index 00000000..3d22e5fc
--- /dev/null
+++ b/Skins/Vistar/[sing]notesLeft.bmp
Binary files differ
diff --git a/Skins/Vistar/[sing]notesMid.bmp b/Skins/Vistar/[sing]notesMid.bmp
new file mode 100644
index 00000000..2daa66b8
--- /dev/null
+++ b/Skins/Vistar/[sing]notesMid.bmp
Binary files differ
diff --git a/Skins/Vistar/[sing]notesRight.bmp b/Skins/Vistar/[sing]notesRight.bmp
new file mode 100644
index 00000000..cd936129
--- /dev/null
+++ b/Skins/Vistar/[sing]notesRight.bmp
Binary files differ
diff --git a/Skins/Vistar/[sing]p.jpg b/Skins/Vistar/[sing]p.jpg
new file mode 100644
index 00000000..e490fbf4
--- /dev/null
+++ b/Skins/Vistar/[sing]p.jpg
Binary files differ
diff --git a/Skins/Vistar/[sing]scoreBg.jpg b/Skins/Vistar/[sing]scoreBg.jpg
new file mode 100644
index 00000000..2bcbedaa
--- /dev/null
+++ b/Skins/Vistar/[sing]scoreBg.jpg
Binary files differ
diff --git a/Skins/Vistar/[sing]singBarBack.jpg b/Skins/Vistar/[sing]singBarBack.jpg
new file mode 100644
index 00000000..d7dcd791
--- /dev/null
+++ b/Skins/Vistar/[sing]singBarBack.jpg
Binary files differ
diff --git a/Skins/Vistar/[sing]singBarBar.jpg b/Skins/Vistar/[sing]singBarBar.jpg
new file mode 100644
index 00000000..4fd9bde9
--- /dev/null
+++ b/Skins/Vistar/[sing]singBarBar.jpg
Binary files differ
diff --git a/Skins/Vistar/[sing]singBarFront.jpg b/Skins/Vistar/[sing]singBarFront.jpg
new file mode 100644
index 00000000..eec27b79
--- /dev/null
+++ b/Skins/Vistar/[sing]singBarFront.jpg
Binary files differ
diff --git a/Skins/Vistar/[sing]textBar.jpg b/Skins/Vistar/[sing]textBar.jpg
new file mode 100644
index 00000000..596a668a
--- /dev/null
+++ b/Skins/Vistar/[sing]textBar.jpg
Binary files differ
diff --git a/Skins/Vistar/[sing]timeBar.jpg b/Skins/Vistar/[sing]timeBar.jpg
new file mode 100644
index 00000000..6e1e42dd
--- /dev/null
+++ b/Skins/Vistar/[sing]timeBar.jpg
Binary files differ
diff --git a/Skins/Vistar/[sing]timeBar1.jpg b/Skins/Vistar/[sing]timeBar1.jpg
new file mode 100644
index 00000000..924a2e9b
--- /dev/null
+++ b/Skins/Vistar/[sing]timeBar1.jpg
Binary files differ
diff --git a/Skins/Vistar/[sing]timeBarBG.jpg b/Skins/Vistar/[sing]timeBarBG.jpg
new file mode 100644
index 00000000..5298a0c5
--- /dev/null
+++ b/Skins/Vistar/[sing]timeBarBG.jpg
Binary files differ
diff --git a/Skins/Vistar/[stat]detailBG1.jpg b/Skins/Vistar/[stat]detailBG1.jpg
new file mode 100644
index 00000000..120dc483
--- /dev/null
+++ b/Skins/Vistar/[stat]detailBG1.jpg
Binary files differ
diff --git a/Skins/Vistar/[stat]mainBG1.jpg b/Skins/Vistar/[stat]mainBG1.jpg
new file mode 100644
index 00000000..a937b24a
--- /dev/null
+++ b/Skins/Vistar/[stat]mainBG1.jpg
Binary files differ
diff --git a/Skins/Vistar/[stat]mainBG2.jpg b/Skins/Vistar/[stat]mainBG2.jpg
new file mode 100644
index 00000000..201d49b8
--- /dev/null
+++ b/Skins/Vistar/[stat]mainBG2.jpg
Binary files differ
diff --git a/Skins/Vistar/[stat]mainBG3.jpg b/Skins/Vistar/[stat]mainBG3.jpg
new file mode 100644
index 00000000..4fb6bc06
--- /dev/null
+++ b/Skins/Vistar/[stat]mainBG3.jpg
Binary files differ
diff --git a/Skins/Vistar/bg-lite.jpg b/Skins/Vistar/bg-lite.jpg
new file mode 100644
index 00000000..c0369a3a
--- /dev/null
+++ b/Skins/Vistar/bg-lite.jpg
Binary files differ
diff --git a/Skins/Vistar/bg-load.jpg b/Skins/Vistar/bg-load.jpg
new file mode 100644
index 00000000..c9d60182
--- /dev/null
+++ b/Skins/Vistar/bg-load.jpg
Binary files differ
diff --git a/Skins/Vistar/bg-main.jpg b/Skins/Vistar/bg-main.jpg
new file mode 100644
index 00000000..fb1d41f8
--- /dev/null
+++ b/Skins/Vistar/bg-main.jpg
Binary files differ
diff --git a/Skins/Vistar/bg-score.jpg b/Skins/Vistar/bg-score.jpg
new file mode 100644
index 00000000..754d818f
--- /dev/null
+++ b/Skins/Vistar/bg-score.jpg
Binary files differ
diff --git a/Skins/Vistar/bg-song.jpg b/Skins/Vistar/bg-song.jpg
new file mode 100644
index 00000000..facd3a87
--- /dev/null
+++ b/Skins/Vistar/bg-song.jpg
Binary files differ
diff --git a/Skins/Vistar/main-buttons.jpg b/Skins/Vistar/main-buttons.jpg
new file mode 100644
index 00000000..d96bb4dc
--- /dev/null
+++ b/Skins/Vistar/main-buttons.jpg
Binary files differ
diff --git a/Sounds/Common back.mp3 b/Sounds/Common back.mp3
new file mode 100644
index 00000000..34354740
--- /dev/null
+++ b/Sounds/Common back.mp3
Binary files differ
diff --git a/Sounds/Common start.mp3 b/Sounds/Common start.mp3
new file mode 100644
index 00000000..34354740
--- /dev/null
+++ b/Sounds/Common start.mp3
Binary files differ
diff --git a/Sounds/credits-outro-tune.mp3 b/Sounds/credits-outro-tune.mp3
new file mode 100644
index 00000000..fc23561c
--- /dev/null
+++ b/Sounds/credits-outro-tune.mp3
Binary files differ
diff --git a/Sounds/dismissed.mp3 b/Sounds/dismissed.mp3
new file mode 100644
index 00000000..f478e7a3
--- /dev/null
+++ b/Sounds/dismissed.mp3
Binary files differ
diff --git a/Sounds/menu swoosh.mp3 b/Sounds/menu swoosh.mp3
new file mode 100644
index 00000000..1025a86f
--- /dev/null
+++ b/Sounds/menu swoosh.mp3
Binary files differ
diff --git a/Sounds/option change col.mp3 b/Sounds/option change col.mp3
new file mode 100644
index 00000000..c2fcb43b
--- /dev/null
+++ b/Sounds/option change col.mp3
Binary files differ
diff --git a/Sounds/rimshot022b.mp3 b/Sounds/rimshot022b.mp3
new file mode 100644
index 00000000..9f49bab4
--- /dev/null
+++ b/Sounds/rimshot022b.mp3
Binary files differ
diff --git a/Sounds/select music change music 50.mp3 b/Sounds/select music change music 50.mp3
new file mode 100644
index 00000000..ade19a70
--- /dev/null
+++ b/Sounds/select music change music 50.mp3
Binary files differ
diff --git a/Sounds/select music change music.mp3 b/Sounds/select music change music.mp3
new file mode 100644
index 00000000..86a7218d
--- /dev/null
+++ b/Sounds/select music change music.mp3
Binary files differ
diff --git a/Sounds/wome-credits-tune.mp3 b/Sounds/wome-credits-tune.mp3
new file mode 100644
index 00000000..564e8d6f
--- /dev/null
+++ b/Sounds/wome-credits-tune.mp3
Binary files differ
diff --git a/Themes/Classic.ini b/Themes/Classic.ini
new file mode 100644
index 00000000..a56b6f71
--- /dev/null
+++ b/Themes/Classic.ini
@@ -0,0 +1,7424 @@
+;0.5.1 Mod
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Theme]
+Name=Classic
+Creator=Ultrastar Deluxe Team
+US_Version=USD 100
+
+[Colors]
+White = 255 255 255
+GrayLightest = 223 223 223
+GrayLight = 191 191 191
+Gray = 127 127 127
+GrayDark = 63 63 63
+Black = 0 0 0
+Gold = 255 223 31
+Silver = 223 223 223
+Bronze = 205 127 50
+
+[Loading]
+Texts =2
+Fade = 1
+
+[LoadingBackground]
+Tex=LoadingBG
+
+[LoadingText1]
+X =400
+Y =290
+Color =GrayDark
+Font =1
+Align =1
+Size =14
+Text =SING_LOADING
+
+[LoadingText2]
+X =790
+Y =583
+Color=Grey
+Font =0
+Size =6
+Align=2
+Text=US_VERSION
+
+[Main]
+Texts =3
+Statics=2
+
+[MainBackground]
+Tex=MainBG
+
+[MainText1]
+X =30
+Y =170
+Color=GrayLight
+Font =1
+Size =22
+Text=SING_CHOOSE_MODE
+Align=0
+
+[MainText2]
+X =226
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_NAVIGATE
+Align=0
+
+[MainText3]
+X =380
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_SELECT
+Align=0
+
+[MainText4]
+X =540
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_EDITOR
+Align=0
+
+[MainTextDescription]
+X =63
+Y =233
+Color=GrayDark
+Font =1
+Size =10
+Align=0
+Text=
+
+[MainTextDescriptionLong]
+X =63
+Y =265
+Color=Black
+Font =0
+Size =10
+Align=0
+Text=
+
+[MainStatic1]
+Tex =Logo
+X =30
+Y =270
+W =740
+H =283
+Color =ColorDark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[MainStatic2]
+Tex =MainIcon
+X =30
+Y =235
+W =32
+H =32
+Color =ColorDark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[MainStatic3]
+Tex =ButtonNavi
+X =196
+Y =553
+W =22
+H =22
+Color =Black
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[MainStatic4]
+Tex =ButtonEnter
+X =350
+Y =553
+W =22
+H =22
+Color =Black
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[MainStatic5]
+Tex =ButtonE
+X =510
+Y =553
+W =22
+H =22
+Color =Black
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[MainButtonSolo]
+X =472
+Y =220
+W =58
+H =56
+Tex =ButtonSolo
+Color =ColorDark
+Int = 1
+DColor = GrayLightest
+DInt = 0.5
+Type=Font Black
+Texts=0
+
+[MainButtonMulti]
+X =532
+Y =220
+W =58
+H =56
+Tex =ButtonMulti
+Color =ColorDark
+Int = 1
+DColor = GrayLightest
+DInt = 0.5
+Type=Font Black
+Texts=0
+
+[MainButtonStats]
+X =592
+Y =220
+W =58
+H =56
+Tex =ButtonStats
+Color =ColorDark
+Int = 1
+DColor = GrayLightest
+DInt = 0.5
+Type=Font Black
+Texts=0
+
+[MainButtonEditor]
+X =592
+Y =220
+W =58
+H =56
+Tex =ButtonEditor
+Color =ColorDark
+Int = 1
+DColor = GrayLightest
+DInt = 0.5
+Type=Font Black
+Texts=0
+Visible=0
+
+[MainButtonOptions]
+X =652
+Y =220
+W =58
+H =56
+Tex =ButtonOptions
+Color =ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type=Font Black
+Texts=0
+
+[MainButtonExit]
+X =712
+Y =220
+W =58
+H =56
+Tex =ButtonExit
+Color =ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type=Font Black
+Texts=0
+
+[Song]
+Texts =3
+
+[SongBackground]
+Tex=SongBG
+
+[SongCover]
+X=300
+Y=140
+W=300
+H=200
+Style=4
+Reflections=0
+
+[SongEqualizer]
+Visible=1
+Direction=1
+Color =Black
+Alpha=1
+X=378
+Y=488
+Z=1
+PieceW=8
+PieceH=3
+Space=1
+Bands=5
+Length=7
+
+[SongVideoIcon]
+X =384
+Y =104
+W =32
+H =32
+Z=1
+Color=White
+Tex =VideoIcon
+Type=Font Black
+
+[SongStatic1]
+X =0
+Y =100
+W =800
+H =350
+Color=Black
+Tex =SongFade
+Type=Font Black
+TexX1=0.1
+TexY1=0.1
+TexX2=0.9
+TexY2=0.9
+
+[SongStatic2]
+X =20
+Y =500
+W =32
+H =32
+Color =ColorDark
+Tex =MainIcon
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStatic3]
+X =270
+Y =120
+W =260
+H =240
+Z =0.45
+Color =Gray
+Tex =SongSelection
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStatic4]
+X =378
+Y =463
+Z = 0.8
+W =44
+H =28
+Color =Black
+Tex =SongEqualizerBG
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongTextArtist]
+X =400
+Y =360
+Color=Black
+Font =0
+Size =9
+Align =1
+Text=
+
+[SongTextTitle]
+X =400
+Y =390
+Color=GrayDark
+Font =0
+Size =9
+Align =1
+Text=
+
+[SongTextNumber]
+X =400
+Y =425
+Color=Gray
+Font =1
+Size =7
+Align =1
+Text=
+
+[SongTextCat]
+X =67
+Y =524
+Color=Gray
+Font =1
+Size =7
+Align =0
+Text=
+
+#[SongStaticCat]
+#Tex =
+#X =12
+#Y =7
+#W =85
+#H =85
+#Color=White
+#Type=Plain
+#TexX1=0
+#TexY1=0
+#TexX2=1
+#TexY2=1
+
+#Variable statics and texts for song-screen in sing- and partymode
+# There can be an unlimited Number of Statics and Texts, As long
+# as the numbers are in order.
+# Statics that are shown in PartyMode Only are Named_
+# SongStaticParty[No]
+# Texts that are shown in PartyMode Only are Named_
+# SongTextParty[No]
+# Statics that are shown in Normal Mode Only are Named_
+# SongStaticNonParty[No]
+# Texts that are shown in Normal Mode Only are Named_
+# SongTextNonParty[No]
+#Here are the ones for singmode
+
+[SongStaticNonParty1]
+X =120
+Y =553
+W =22
+H =22
+Tex=ButtonAlt
+Color =White
+Type=Plain
+
+[SongStaticNonParty2]
+X =156
+Y =553
+W =22
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Plain
+
+[SongStaticNonParty3]
+X =298
+Y =553
+W =22
+H =22
+Tex=ButtonM
+Color =White
+Type=Plain
+
+[SongStaticNonParty4]
+X =414
+Y =553
+W =22
+H =22
+Tex=ButtonJ
+Color =White
+Type=Plain
+
+[SongStaticNonParty5]
+X =585
+Y =553
+W =22
+H =22
+Tex=ButtonP
+Color =White
+Type=Plain
+
+#Texts Non Party
+[SongTextNonParty1]
+X =30
+Y =455
+Color=GrayLight
+Font =1
+Size =15
+Text=SING_SONG_SELECTION
+Align=0
+
+[SongTextNonParty2]
+X =50
+Y =500
+Color=GrayDark
+Font =1
+Size =8
+Text=SING_SONG_SELECTION_DESC
+Align=0
+
+[SongTextNonParty3]
+X =144
+Y =556
+Color=Black
+Font =1
+Size =5
+Text=+
+
+[SongTextNonParty4]
+X =186
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_GOTO
+
+[SongTextNonParty5]
+X =328
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_MENU
+
+[SongTextNonParty6]
+X =444
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SONG_JUMPTO_DESC
+
+[SongTextNonParty7]
+X =615
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_PLAYLIST
+
+
+#and theese are the ones for partymode
+
+
+[SongStaticParty1]
+X =187
+Y =553
+W =22
+H =22
+Tex=Button13
+Color =White
+Type=Plain
+
+[SongStaticParty2]
+X =363
+Y =553
+W =22
+H =22
+Tex=ButtonM
+Color =White
+Type=Plain
+
+[SongStaticParty3]
+X =525
+Y =553
+W =22
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+#Texts for Party Mode
+
+[SongTextParty1]
+X =30
+Y =455
+Color=GrayLight
+Font =1
+Size =15
+Align=0
+Text=PARTY_MODE
+
+[SongTextParty2]
+X =50
+Y =500
+Color=GrayDark
+Font =1
+Size =8
+Align=0
+Text=PARTY_SONG_WHEREAMI
+
+[SongTextParty3]
+X =217
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SONG_MENU_NAME_PARTY_JOKER
+
+[SongTextParty4]
+X =393
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=PARTY_SONG_MENU
+
+[SongTextParty5]
+X =555
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=PARTY_SONG_LEGEND_CONTINUE
+
+#variable statics end
+
+# Jokers, 5 for each team, only shown in party Mode
+[SongStaticTeam1Joker1]
+Tex =Joker
+X =20
+Y =30
+W =50
+H =50
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker2]
+Tex =Joker
+X =70
+Y =30
+W =50
+H =50
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker3]
+Tex =Joker
+X =120
+Y =30
+W =50
+H =50
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker4]
+Tex =Joker
+X =170
+Y =30
+W =50
+H =50
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker5]
+Tex =Joker
+X =220
+Y =30
+W =50
+H =50
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker1]
+Tex =Joker
+X =280
+Y =30
+W =50
+H =50
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker2]
+Tex =Joker
+X =330
+Y =30
+W =50
+H =50
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker3]
+Tex =Joker
+X =380
+Y =30
+W =50
+H =50
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker4]
+Tex =Joker
+X =430
+Y =30
+W =50
+H =50
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker5]
+Tex =Joker
+X =480
+Y =30
+W =50
+H =50
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker1]
+Tex =Joker
+X =540
+Y =30
+W =50
+H =50
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker2]
+Tex =Joker
+X =590
+Y =30
+W =50
+H =50
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker3]
+Tex =Joker
+X =640
+Y =30
+W =50
+H =50
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker4]
+Tex =Joker
+X =690
+Y =30
+W =50
+H =50
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker5]
+Tex =Joker
+X =740
+Y =30
+W =50
+H =50
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+
+[Sing]
+Texts =1
+
+[SingText1]
+Text =SING_TIME
+X =43
+Y =17
+Font =1
+Size =6
+Color =Black
+Align=1
+
+[SingStatic1]
+;TextBG
+Tex =LyricBar
+X =10
+Y =490
+W =780
+H =105
+Color =GrayLightest
+Type=Font Black
+
+[SingStatic2]
+;Time BG
+Tex =LyricBar
+X =12
+Y =5
+W =328
+H =42
+Color =GrayLightest
+Type=Font Black
+
+[SingStatic3]
+Tex =Rectangle
+X =140
+Y =21
+W =190
+H =10
+Color=Gray
+
+[SingTimeProgress]
+X =140
+Y =21
+W =190
+H =10
+Color=GrayDark
+
+[SingTimeText]
+Text =SING_TIME
+X =100
+Y =14
+Font =1
+Size =8
+Color =White
+Align=1
+
+[SingStatic4]
+Tex =Bar
+X =20
+Y =10
+W =46
+H =30
+Color =Black
+Type=Font Black
+
+[SingP1Static]
+Tex =P
+X =16
+Y =55
+W =45
+H =50
+Color =P1Dark
+Type=Font Black
+
+[SingP1Static2]
+Tex =ScoreBG
+X =75
+Y =55
+W =100
+H =40
+Color =P1Dark
+Type=Transparent
+TexX1=0.02
+TexY1=0.05
+TexX2=0.98
+TexY2=0.98
+
+[SingP1Text]
+Text =P1
+X =27
+Y =65
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP1TextScore]
+Text =00000
+X =90
+Y =60
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1SingBar]
+X =75
+Y =95
+W =100
+H =8
+
+[SingP1TwoPSingBar]
+X =75
+Y =95
+W =100
+H =8
+
+[SingP1ThreePSingBar]
+X =75
+Y =95
+W =100
+H =8
+
+[SingP2RStatic]
+Tex =P
+X =739
+Y =55
+W =45
+H =50
+Color =P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SingP2RStatic2]
+Tex =ScoreBG
+X =620
+Y =55
+W =100
+H =40
+Color =P2Dark
+Type=Transparent
+TexX1=0.02
+TexY1=0.05
+TexX2=0.98
+TexY2=0.98
+
+[SingP2RText]
+Text =P2
+X =750
+Y =65
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP2RTextScore]
+Text =00000
+X =635
+Y =60
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2RSingBar]
+X =620
+Y =95
+W =100
+H =8
+
+[SingP2MStatic]
+Tex =P
+X =311
+Y =55
+W =45
+H =50
+Color =P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SingP2MStatic2]
+Tex =ScoreBG
+X =370
+Y =55
+W =100
+H =40
+Color =P2Dark
+Type=Transparent
+TexX1=0.02
+TexY1=0.05
+TexX2=0.98
+TexY2=0.98
+
+[SingP2MText]
+Text =P2
+X =321
+Y =65
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP2MTextScore]
+Text =00000
+X =385
+Y =60
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2MSingBar]
+X =370
+Y =95
+W =100
+H =8
+
+[SingP3RStatic]
+Tex =P
+X =611
+Y =55
+W =45
+H =50
+Color =P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SingP3RStatic2]
+Tex =ScoreBG
+X =670
+Y =55
+W =100
+H =40
+Color =P3Dark
+Type=Transparent
+TexX1=0.02
+TexY1=0.05
+TexX2=0.98
+TexY2=0.98
+
+[SingP3RText]
+Text =P3
+X =621
+Y =65
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP3RTextScore]
+Text =00000
+X =685
+Y =60
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP3SingBar]
+X =670
+Y =95
+W =100
+H =8
+
+[Score]
+Texts =1
+
+[ScoreBackground]
+Tex=ScoresBG
+
+[ScoreText1]
+X =90
+Y =500
+Color =GrayDark
+Font =1
+Size =17
+Text =SONG_SCORE_WHEREAMI
+Align=0
+
+[ScoreStatic1]
+Tex =ButtonEnter
+X =350
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreText2]
+X =380
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_CONTINUE
+Align=0
+
+[ScoreTextArtist]
+X =450
+Y =500
+Color=GrayDark
+Font =0
+Size =9
+Text =Artist
+Align=0
+
+[ScoreTextTitle]
+X =450
+Y =525
+Font =0
+Size =9
+Text =Title
+Align=0
+Color=Gray
+
+[ScoreTextName1]
+X =200
+Y =160
+Font =1
+Size =12
+Text =P1
+Color =P1Dark
+Align=0
+
+[ScoreTextName2]
+X =50
+Y =160
+Font =1
+Size =12
+Text =P1
+Color =P1Dark
+Align=0
+
+[ScoreTextName3]
+X =510
+Y =160
+Font =1
+Size =12
+Text =P2
+Color =P2Dark
+Align=0
+
+[ScoreTextScore1]
+X =250
+Y =110
+Color=GrayDark
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextScore2]
+X =100
+Y =110
+Color=GrayDark
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextScore3]
+X =560
+Y =110
+Color=GrayDark
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes1]
+X =235
+Y =220
+Color=GrayDark
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotes2]
+X =85
+Y =220
+Color=GrayDark
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotes3]
+X =545
+Y =220
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_NOTES
+Align=0
+
+[ScoreTextNotesScore1]
+X =440
+Y =220
+Color=GrayDark
+Font =1
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextNotesScore2]
+X =290
+Y =220
+Color=GrayDark
+Font =1
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextNotesScore3]
+X =750
+Y =220
+Color=GrayDark
+Font =1
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextLineBonus1]
+X =235
+Y =260
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonus2]
+X =85
+Y =260
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonus3]
+X =545
+Y =260
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore1]
+X =440
+Y =260
+Color=GrayDark
+Font =1
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextLineBonusScore2]
+X =290
+Y =260
+Color=GrayDark
+Font =1
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextLineBonusScore3]
+X =750
+Y =260
+Color=GrayDark
+Font =1
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextGoldenNotes1]
+X =235
+Y =300
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotes2]
+X =85
+Y =300
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotes3]
+X =545
+Y =300
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore1]
+X =440
+Y =300
+Color=GrayDark
+Font =1
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextGoldenNotesScore2]
+X =290
+Y =300
+Color=GrayDark
+Font =1
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextGoldenNotesScore3]
+X =750
+Y =300
+Color=GrayDark
+Font =1
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextTotal1]
+X =200
+Y =370
+Color=GrayDark
+Font =0
+Size =9
+Text=SING_TOTAL
+Align=0
+
+[ScoreTextTotal2]
+X =50
+Y =370
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_TOTAL
+Align=0
+
+[ScoreTextTotal3]
+X =510
+Y =370
+Color=GrayDark
+Font =0
+Size =9
+Text =SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore1]
+X =440
+Y =360
+Color=GrayDark
+Font =1
+Size =15
+Align =2
+Text =00000
+
+[ScoreTextTotalSCore2]
+X =290
+Y =360
+Color=GrayDark
+Font =1
+Size =15
+Align =2
+Text =00000
+
+[ScoreTextTotalScore3]
+X =750
+Y =360
+Color=GrayDark
+Font =1
+Size =15
+Align =2
+Text =00000
+
+[ScorePlayer1Static1]
+Tex =ScoreLine
+X =200
+Y =205
+W =240
+H =6
+Color =GrayDark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer1Static2]
+Tex =ScoreLine
+X =200
+Y =345
+W =240
+H =6
+Type =Font Black
+Color =GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer1Static3]
+Tex =ScoreLine
+X =200
+Y =410
+W =240
+H =6
+Type =Font Black
+Color =GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLightest1]
+Tex =ScoreBox
+X =200
+Y =220
+W =30
+H =30
+Color =P1Lightest
+Type=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLight1]
+Tex =ScoreBox
+X =200
+Y =260
+W =30
+H =30
+Color =P1Light
+Type=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxDark1]
+Tex =ScoreBox
+X =200
+Y =300
+W =30
+H =30
+Color =P1Dark
+Type=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer2Static1]
+Tex =ScoreLine
+X =50
+Y =205
+W =240
+H =6
+Type =Font Black
+Color =GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer2Static2]
+Tex =ScoreLine
+X =50
+Y =345
+W =240
+H =6
+Type =Font Black
+Color =GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer2Static3]
+Tex =ScoreLine
+X =50
+Y =410
+W =240
+H =6
+Type =Font Black
+Color =GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLightest2]
+Tex =ScoreBox
+X =50
+Y =220
+W =30
+H =30
+Color =P1Lightest
+Type=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLight2]
+Tex =ScoreBox
+X =50
+Y =260
+W =30
+H =30
+Color =P1Light
+Type=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxDark2]
+Tex =ScoreBox
+X =50
+Y =300
+W =30
+H =30
+Color =P1Dark
+Type=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer3Static1]
+Tex =ScoreLine
+X =510
+Y =205
+W =240
+H =6
+Type =Font Black
+Color =GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer3Static2]
+Tex =ScoreLine
+X =510
+Y =345
+W =240
+H =6
+Type =Font Black
+Color =GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer3Static3]
+Tex =ScoreLine
+X =510
+Y =410
+W =240
+H =6
+Type =Font Black
+Color =GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLightest3]
+Tex =ScoreBox
+X =510
+Y =220
+W =30
+H =30
+Color =P2Lightest
+Type=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLight3]
+Tex =ScoreBox
+X =510
+Y =260
+W =30
+H =30
+Color =P2Light
+Type=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxDark3]
+Tex =ScoreBox
+X =510
+Y =300
+W =30
+H =30
+Color =P2Dark
+Type=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevel1]
+Tex =ScoreLevel
+X =460
+Y =140
+W =120
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound1]
+Tex =ScoreLevelRound
+X =460
+Y =110
+W =120
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel1]
+Tex =ScoreLevel
+X =460
+Y =410
+W =120
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound1]
+Tex =ScoreLevelRound
+X =460
+Y =380
+W =120
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticBackLevel2]
+Tex =ScoreLevel
+X =290
+Y =140
+W =120
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound2]
+Tex =ScoreLevelRound
+X =290
+Y =110
+W =120
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel2]
+Tex =ScoreLevel
+X =290
+Y =410
+W =120
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound2]
+Tex =ScoreLevelRound
+X =290
+Y =380
+W =120
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticBackLevel3]
+Tex =ScoreLevel
+X =390
+Y =140
+W =120
+H =300
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound3]
+Tex =ScoreLevelRound
+X =390
+Y =110
+W =120
+H =30
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel3]
+Tex =ScoreLevel
+X =390
+Y =410
+W =120
+H =30
+Color =P2Light
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound3]
+Tex =ScoreLevelRound
+X =390
+Y =380
+W =120
+H =30
+Color =P2Light
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScorePlayer4Static1]
+X=20
+Y=205
+W=240
+H=6
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+[ScorePlayer4Static2]
+X=20
+Y=345
+W=240
+H=6
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+[ScorePlayer4Static3]
+X=20
+Y=410
+W=240
+H=6
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLightest4]
+X=20
+Y=220
+W=30
+H=30
+Tex=ScoreBox
+Type=
+Color=P1Lightest
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLight4]
+X=20
+Y=260
+W=30
+H=30
+Tex=ScoreBox
+Type=
+Color=P1Light
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxDark4]
+X=20
+Y=300
+W=30
+H=30
+Tex=ScoreBox
+Type=
+Color=P1Dark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreTextName4]
+X=20
+Y=160
+Font=1
+Size=12
+Align=0
+Text=P1
+Color=P1Dark
+
+[ScoreTextScore4]
+X=70
+Y=110
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=GrayDark
+
+[ScoreTextNotes4]
+X=55
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=GrayDark
+
+[ScoreTextNotesScore4]
+X=260
+Y=220
+Font=1
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextLineBonus4]
+X=55
+Y=260
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=GrayDark
+
+[ScoreTextLineBonusScore4]
+X=260
+Y=260
+Font=1
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextGoldenNotes4]
+X=55
+Y=300
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=GrayDark
+
+[ScoreTextGoldenNotesScore4]
+X=260
+Y=300
+Font=1
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextTotal4]
+X=20
+Y=370
+Font=0
+Size=9
+Align=0
+Text=SING_TOTAL
+Color=GrayDark
+
+[ScoreTextTotalScore4]
+X=260
+Y=360
+Font=1
+Size=15
+Align=2
+Text=00000
+Color=GrayDark
+
+[ScoreStaticBackLevel4]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevelRound4]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevel4]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevelRound4]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreTextName5]
+X=280
+Y=160
+Font=1
+Size=12
+Align=0
+Text=P2
+Color=P2Dark
+
+[ScoreTextScore5]
+X=330
+Y=110
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=GrayDark
+
+[ScoreTextNotes5]
+X=315
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=GrayDark
+
+[ScoreTextNotesScore5]
+X=520
+Y=220
+Font=1
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextLineBonus5]
+X=315
+Y=260
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=GrayDark
+
+[ScoreTextLineBonusScore5]
+X=520
+Y=260
+Font=1
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextGoldenNotes5]
+X=315
+Y=300
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=GrayDark
+
+[ScoreTextGoldenNotesScore5]
+X=520
+Y=300
+Font=1
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextTotal5]
+X=280
+Y=370
+Font=0
+Size=9
+Align=0
+Text=SING_TOTAL
+Color=GrayDark
+
+[ScoreTextTotalScore5]
+X=520
+Y=360
+Font=1
+Size=15
+Align=2
+Text=00000
+Color=GrayDark
+
+[ScoreStaticBackLevel5]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevelRound5]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevel5]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevelRound5]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreTextName6]
+X=540
+Y=160
+Font=1
+Size=12
+Align=0
+Text=P2
+Color=P3Dark
+
+[ScoreTextScore6]
+X=590
+Y=110
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=GrayDark
+
+[ScoreTextNotes6]
+X=575
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=GrayDark
+
+[ScoreTextNotesScore6]
+X=780
+Y=220
+Font=1
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextLineBonus6]
+X=575
+Y=260
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=GrayDark
+
+[ScoreTextLineBonusScore6]
+X=780
+Y=260
+Font=1
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextGoldenNotes6]
+X=575
+Y=300
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=GrayDark
+
+[ScoreTextGoldenNotesScore6]
+X=780
+Y=300
+Font=1
+Size=10
+Align=2
+Text=0000
+Color=GrayDark
+
+[ScoreTextTotal6]
+X=540
+Y=370
+Font=0
+Size=9
+Align=0
+Text=SING_TOTAL
+Color=GrayDark
+
+[ScoreTextTotalScore6]
+X=780
+Y=360
+Font=1
+Size=15
+Align=2
+Text=00000
+Color=GrayDark
+
+[ScoreStaticBackLevel6]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevelRound6]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevel6]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevelRound6]
+X=0
+Y=0
+W=0
+H=0
+Tex=
+Type=
+Color=
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer5Static1]
+X=280
+Y=205
+W=240
+H=6
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer5Static2]
+X=280
+Y=345
+W=240
+H=6
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer5Static3]
+X=280
+Y=410
+W=240
+H=6
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLightest5]
+X=280
+Y=220
+W=30
+H=30
+Tex=ScoreBox
+Type=
+Color=P2Lightest
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLight5]
+X=280
+Y=260
+W=30
+H=30
+Tex=ScoreBox
+Type=
+Color=P2Light
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxDark5]
+X=280
+Y=300
+W=30
+H=30
+Tex=ScoreBox
+Type=
+Color=P2Dark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer6Static1]
+X=540
+Y=205
+W=240
+H=6
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer6Static2]
+X=540
+Y=345
+W=240
+H=6
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer6Static3]
+X=540
+Y=410
+W=240
+H=6
+Tex=ScoreLine
+Type=Font Black
+Color=GrayDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLightest6]
+X=540
+Y=220
+W=30
+H=30
+Tex=ScoreBox
+Type=
+Color=P3Lightest
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxLight6]
+X=540
+Y=260
+W=30
+H=30
+Tex=ScoreBox
+Type=
+Color=P3Light
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBoxDark6]
+X=540
+Y=300
+W=30
+H=30
+Tex=ScoreBox
+Type=
+Color=P3Dark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[Options]
+Texts = 3
+
+[OptionsBackground]
+Tex=OptionsBG
+
+
+[OptionsText1]
+X = 50
+Y = 170
+Color=GrayLight
+Font = 1
+Size = 25
+Text = SING_OPTIONS
+
+[OptionsStatic1]
+Tex=MainIcon
+X=40
+Y=250
+W=32
+H=32
+Color=ColorDark
+Type=Font Black
+
+[OptionsStatic2]
+Tex =ButtonNavi
+X =196
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[OptionsStatic3]
+Tex =ButtonEnter
+X =350
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[OptionsStatic4]
+Tex =ButtonEsc
+X =510
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[OptionsText2]
+X =226
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_NAVIGATE
+Align=0
+
+[OptionsText3]
+X =380
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_SELECT
+Align=0
+
+[OptionsText4]
+X =540
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_ESC
+Align=0
+
+[OptionsTextDescription]
+X = 70
+Y = 248
+Color=GrayDark
+Font = 1
+Size = 10
+
+[OptionsButtonGame]
+X = 40
+Y = 310
+W = 180
+H = 70
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[OptionsButtonGameText1]
+X =16
+Y =15
+Font=0
+Size=13
+Align=0
+Text=SING_OPTIONS_GAME
+Color=White
+
+[OptionsButtonGraphics]
+X = 220
+Y = 310
+W = 180
+H = 70
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[OptionsButtonGraphicsText1]
+X =16
+Y =15
+Font=0
+Size=13
+Align=0
+Text=SING_OPTIONS_GRAPHICS
+Color=White
+
+[OptionsButtonSound]
+X = 400
+Y = 310
+W = 180
+H = 70
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[OptionsButtonSoundText1]
+X =16
+Y =15
+Font=0
+Size=13
+Align=0
+Text=SING_OPTIONS_SOUND
+Color=White
+
+[OptionsButtonLyrics]
+X = 580
+Y = 310
+W = 180
+H = 70
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[OptionsButtonLyricsText1]
+X =16
+Y =15
+Font=0
+Size=13
+Align=0
+Text=SING_OPTIONS_LYRICS
+Color=White
+
+[OptionsButtonThemes]
+X = 40
+Y = 380
+W = 180
+H = 70
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[OptionsButtonThemesText1]
+X =16
+Y =15
+Font=0
+Size=13
+Align=0
+Text=SING_OPTIONS_THEMES
+Color=White
+
+[OptionsButtonRecord]
+X = 220
+Y = 380
+W = 180
+H = 70
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[OptionsButtonRecordText1]
+X =16
+Y =15
+Font=0
+Size=13
+Align=0
+Text=SING_OPTIONS_RECORD
+Color=White
+Texts=1
+
+[OptionsButtonAdvanced]
+X = 400
+Y = 380
+W = 180
+H = 70
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[OptionsButtonAdvancedText1]
+X =16
+Y =15
+Font=0
+Size=13
+Align=0
+Text=SING_OPTIONS_ADVANCED
+Color=White
+Texts=1
+
+[OptionsButtonExit]
+X = 580
+Y = 380
+W = 180
+H = 70
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[OptionsButtonExitText1]
+X =16
+Y =15
+Font=0
+Size=13
+Align=0
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[OptionsGame]
+Texts = 3
+
+[OptionsGameBackground]
+Tex=OptionsBG
+
+[OptionsGameStatic1]
+X =275
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsGameStatic2]
+X =435
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsGameText2]
+X =305
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGameText3]
+X =465
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGameText1]
+X = 50
+Y = 10
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 25
+Text=SING_OPTIONS_GAME_WHEREAMI
+
+[OptionsGameSelectPlayers]
+Tex = MainBar
+TexSBG = MainBar
+Text =SING_OPTIONS_GAME_PLAYERS
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDifficulty]
+Tex = MainBar
+TexSBG = MainBar
+Text =SING_OPTIONS_GAME_DIFFICULTY
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+
+[OptionsGameSelectSlideLanguage]
+Tex = MainBar
+TexSBG = MainBar
+Text =SING_OPTIONS_GAME_LANGUAGE
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectTabs]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_GAME_TABS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectSlideSorting]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_GAME_SORTING
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDebug]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_GAME_DEBUG
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+
+[OptionsGraphics]
+Texts = 3
+
+[OptionsGraphicsBackground]
+Tex=OptionsBG
+
+[OptionsGraphicsStatic1]
+X =275
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsGraphicsStatic2]
+X =435
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsGraphicsText2]
+X =305
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGraphicsText3]
+X =465
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGraphicsText1]
+X = 50
+Y = 10
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 25
+Text=SING_OPTIONS_GRAPHICS_WHEREAMI
+
+[OptionsGraphicsSelectSlideResolution]
+Tex =MainBar
+TexSBG =MainBar
+Text=SING_OPTIONS_GRAPHICS_RESOLUTION
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectFullscreen]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_GRAPHICS_FULLSCREEN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectDepth]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_GRAPHICS_DEPTH
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectOscilloscope]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_GRAPHICS_OSCILLOSCOPE
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectMovieSize]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_GRAPHICS_MOVIE_SIZE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsButtonExit]
+X = 40
+Y = 360
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+
+[OptionsSound]
+Texts = 3
+
+[OptionsSoundBackground]
+Tex=OptionsBG
+
+[OptionsSoundStatic1]
+X =275
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsSoundStatic2]
+X =435
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsSoundText2]
+X =305
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsSoundText3]
+X =465
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsSoundText1]
+X = 50
+Y = 10
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 25
+Text =SING_OPTIONS_SOUND_WHEREAMI
+
+[OptionsSoundSelectMicBoost]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_SOUND_MIC_BOOST
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectClickAssist]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_SOUND_CLICK_ASSIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectBeatClick]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_SOUND_BEAT_CLICK
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectThreshold]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_SOUND_THRESHOLD
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectTwoPlayerMode]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_SOUND_TWO_PLAYERS_MODE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewVolume]
+Tex =MainBar
+TexSBG =MainBar
+Text=SING_OPTIONS_SOUND_PREVIEWVOLUME
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewFading]
+Tex =MainBar
+TexSBG =MainBar
+Text=SING_OPTIONS_SOUND_PREVIEWFADING
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+
+[OptionsLyrics]
+Texts = 3
+
+[OptionsLyricsBackground]
+Tex=OptionsBG
+
+[OptionsLyricsStatic1]
+X =275
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsLyricsStatic2]
+X =435
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsLyricsText2]
+X =305
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsLyricsText3]
+X =465
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsLyricsText1]
+X = 50
+Y = 10
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 25
+Text =SING_OPTIONS_LYRICS_WHEREAMI
+
+[OptionsLyricsSelectLyricsFont]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_LYRICS_FONT
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectLyricsEffect]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_LYRICS_EFFECT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectSolmization]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_LYRICS_SOLMIZATION
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+
+[OptionsThemes]
+Texts = 5
+
+[OptionsThemesBackground]
+Tex=OptionsBG
+
+[OptionsThemesStatic1]
+X =275
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsThemesStatic2]
+X =435
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsThemesText2]
+X =305
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsThemesText3]
+X =465
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsThemesText1]
+X = 50
+Y = 10
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 25
+Text =SING_OPTIONS_THEMES_WHEREAMI
+
+[OptionsThemesSelectTheme]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_THEMES_THEME
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectSkin]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_THEMES_SKIN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectColor]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_THEMES_COLOR
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+
+[OptionsRecord]
+Texts = 3
+
+[OptionsRecordBackground]
+Tex=OptionsBG
+
+[OptionsRecordStatic1]
+X =275
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsRecordStatic2]
+X =435
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsRecordText2]
+X =305
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsRecordText3]
+X =465
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsRecordText1]
+X = 50
+Y = 10
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 25
+Text=SING_OPTIONS_RECORD_WHEREAMI
+
+[OptionsRecordSelectSlideCard]
+Tex = MainBar
+TexSBG = MainBar
+Text =SING_OPTIONS_RECORD_CARD
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideInput]
+Tex = MainBar
+TexSBG = MainBar
+Text =SING_OPTIONS_RECORD_INPUT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelL]
+Tex = MainBar
+TexSBG = MainBar
+Text =SING_OPTIONS_RECORD_CHANNELL
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelR]
+Tex = MainBar
+TexSBG = MainBar
+Text =SING_OPTIONS_RECORD_CHANNELR
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordButtonExit]
+X = 40
+Y = 305
+W = 230
+H = 70
+Tex = MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+
+[OptionsAdvanced]
+Texts = 3
+
+[OptionsAdvancedBackground]
+Tex=OptionsBG
+
+[OptionsAdvancedStatic1]
+X =275
+Y =553
+W =22
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsAdvancedStatic2]
+X =435
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsAdvancedText2]
+X =305
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsAdvancedText3]
+X =465
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsAdvancedText1]
+X = 50
+Y = 10
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 25
+Text=SING_OPTIONS_ADVANCED_WHEREAMI
+
+[OptionsAdvancedSelectLoadAnimation]
+Tex =MainBar
+TexSBG =MainBar
+Text=SING_OPTIONS_ADVANCED_LOADANIMATION
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectScreenFade]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_ADVANCED_SCREENFADE
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectEffectSing]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_ADVANCED_EFFECTSING
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectLineBonus]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_GRAPHICS_LINEBONUS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectSlideOnSongClick]
+Tex =MainBar
+TexSBG =MainBar
+Text=SING_OPTIONS_ADVANCED_ONSONGCLICK
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectAskbeforeDel]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_ADVANCED_ASKBEFOREDEL
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectPartyPopup]
+Tex =MainBar
+TexSBG =MainBar
+Text =SING_OPTIONS_ADVANCED_PARTYPOPUP
+X = 40
+Y = 415
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedButtonExit]
+X = 40
+Y = 470
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[Top5]
+Texts=1
+
+[Top5Background]
+Tex=Top5BG
+
+[Top5Static2]
+Tex =ButtonEnter
+X =350
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[Top5Text2]
+X =380
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_CONTINUE
+Align=0
+
+[Top5Text1]
+X =100
+Y =50
+Color =Gray
+Font =1
+Size =20
+Align =0
+Text =SING_TOP_5_CHARTS
+
+[Top5Static1]
+Tex=Bar
+X=560
+Y=55
+W=140
+H=50
+Color=ColorLight
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[Top5TextLevel]
+X =630
+Y =65
+Color =White
+Font =1
+Size =10
+Align =1
+Text =easy
+
+
+[Top5TextArtistTitle]
+X =100
+Y =120
+Color =Black
+Font =0
+Size =10
+Align =0
+Text =artist - title
+
+[Top5TextName1]
+X =170
+Y =200
+Color =GrayDark
+Font =1
+Size =14
+Align =0
+Text =1. Player1
+
+[Top5TextName2]
+X =150
+Y =290
+Color =GrayDark
+Font =0
+Size =11
+Align =0
+Text =2. Player2
+
+[Top5TextName3]
+X =150
+Y =340
+Color =GrayDark
+Font =0
+Size =11
+Align =0
+Text =3. Player3
+
+[Top5TextName4]
+X =150
+Y =390
+Color =GrayDark
+Font =0
+Size =11
+Align =0
+Text =4. Player4
+
+[Top5TextName5]
+X =150
+Y =440
+Color =GrayDark
+Font =0
+Size =11
+Align =0
+Text =5. Player5
+
+
+[Top5TextScore1]
+X =680
+Y =195
+Color =GrayDark
+Font =1
+Size =17
+Align =2
+Text =00000
+
+[Top5TextScore2]
+X =680
+Y =290
+Color =GrayDark
+Font =1
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore3]
+X =680
+Y =340
+Color =GrayDark
+Font =1
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore4]
+X =680
+Y =390
+Color =GrayDark
+Font =1
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore5]
+X =680
+Y =440
+Color =GrayDark
+Font =1
+Size =14
+Align =2
+Text =00000
+
+[Top5TextNumber1]
+X =130
+Y =202
+Color =White
+Font =1
+Size =11
+Align =1
+Text =1
+
+[Top5TextNumber2]
+X =120
+Y =293
+Color =White
+Font =1
+Size =9
+Align =1
+Text =2
+
+[Top5TextNumber3]
+X =120
+Y =343
+Color =White
+Font =1
+Size =9
+Align =1
+Text =3
+
+[Top5TextNumber4]
+X =120
+Y =393
+Color =White
+Font =1
+Size =9
+Align =1
+Text =4
+
+[Top5TextNumber5]
+X =120
+Y =443
+Color =White
+Font =1
+Size =9
+Align =1
+Text =5
+
+[Top5StaticNumber1]
+Tex=Bar
+X=100
+Y=190
+W=60
+H=60
+Color=ColorLight
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[Top5StaticNumber2]
+Tex=Bar
+X=100
+Y=286
+W=40
+H=40
+Color=ColorLight
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[Top5StaticNumber3]
+Tex=Bar
+X=100
+Y=336
+W=40
+H=40
+Color=ColorLight
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[Top5StaticNumber4]
+Tex=Bar
+X=100
+Y=386
+W=40
+H=40
+Color=ColorLight
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[Top5StaticNumber5]
+Tex=Bar
+X=100
+Y=436
+W=40
+H=40
+Color=ColorLight
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[Level]
+Texts=2
+
+[LevelBackground]
+Tex=MainBG
+
+[LevelStatic2]
+Tex =ButtonNavi
+X =196
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[LevelStatic3]
+Tex =ButtonEnter
+X =350
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[LevelStatic4]
+Tex =ButtonEsc
+X =510
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[LevelText3]
+X =226
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_NAVIGATE
+Align=0
+
+[LevelText4]
+X =380
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_SELECT
+Align=0
+
+[LevelText5]
+X =540
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_ESC
+Align=0
+
+[LevelStatic1]
+X=20
+Y=250
+W=32
+H=32
+Tex=MainIcon
+Type=Font Black
+Color=ColorDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[LevelButtonEasy]
+Tex=Button
+X=25
+Y=310
+W=250
+H=70
+Type=Font Black
+Texts=1
+Color=ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+
+[LevelButtonMedium]
+Tex=Button
+X=275
+Y=310
+W=250
+H=70
+Type=Font Black
+Texts=1
+Color=ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+
+[LevelButtonHard]
+Tex=Button
+X=525
+Y=310
+W=250
+H=70
+Type=Font Black
+Texts=1
+Color=ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+
+[LevelText1]
+X=30
+Y=180
+Font=1
+Size=22
+Align=0
+Text=SING_DIFFICULTY_WHEREAMI
+Color=GrayLight
+
+[LevelText2]
+X=50
+Y=248
+Font=1
+Size=10
+Align=0
+Text=SING_DIFFICULTY_DESC
+Color=GrayDark
+
+[LevelButtonEasyText1]
+X=115
+Y=20
+Font=1
+Size=9
+Align=1
+Text=SING_EASY
+Color=White
+
+[LevelButtonMediumText1]
+X=115
+Y=20
+Font=1
+Size=9
+Align=1
+Text=SING_MEDIUM
+Color=White
+
+[LevelButtonHardText1]
+X=115
+Y=20
+Font=1
+Size=9
+Align=1
+Text=SING_HARD
+Color=White
+
+
+[Name]
+Texts=2
+
+[NameBackground]
+Tex=MainBG
+
+[NameStatic2]
+Tex =ButtonNavi
+X =176
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[NameStatic3]
+Tex =ButtonAZ
+X =330
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[NameStatic4]
+Tex =ButtonEnter
+X =532
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[NameText3]
+X =206
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_NAVIGATE
+Align=0
+
+[NameText4]
+X =360
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_PLAYER_ENTER_NAME
+Align=0
+
+[NameText5]
+X =562
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_CONTINUE
+Align=0
+
+[NameStatic1]
+X=20
+Y=250
+W=32
+H=32
+Tex=MainIcon
+Type=Font Black
+Color=ColorDark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[NameText1]
+X=30
+Y=180
+Font=1
+Size=22
+Align=0
+Text=SING_PLAYER_WHEREAMI
+Color=GrayLight
+
+[NameText2]
+X=50
+Y=248
+Font=1
+Size=10
+Align=0
+Text=SING_PLAYER_DESC
+Color=GrayDark
+
+[NameButtonPlayer1]
+Tex=Button
+X=25
+Y=310
+W=250
+H=70
+Type=Font Black
+Texts=1
+Color=P1Dark
+DColor=P1Lightest
+DInt=0.5
+
+[NameButtonPlayer1Text1]
+X=115
+Y=20
+Font=1
+Size=9
+Align=1
+Text=
+Color=White
+
+[NameButtonPlayer2]
+Tex=Button
+X=25
+Y=380
+W=250
+H=70
+Type=Font Black
+Texts=1
+Color=P2Dark
+DColor=P2Lightest
+DInt=0.5
+
+[NameButtonPlayer2Text1]
+X=115
+Y=20
+Font=1
+Size=9
+Align=1
+Text=
+Color=White
+
+[NameButtonPlayer3]
+Tex=Button
+X=25
+Y=450
+W=250
+H=70
+Type=Font Black
+Texts=1
+Color=P3Dark
+DColor=P3Lightest
+DInt=0.5
+
+[NameButtonPlayer3Text1]
+X=115
+Y=20
+Font=1
+Size=9
+Align=1
+Text=
+Color=White
+
+[NameButtonPlayer4]
+Tex=Button
+X=425
+Y=310
+W=250
+H=70
+Type=Font Black
+Texts=1
+Color=P4Dark
+DColor=P4Lightest
+DInt=0.5
+
+[NameButtonPlayer4Text1]
+X=115
+Y=20
+Font=1
+Size=9
+Align=1
+Text=
+Color=White
+
+[NameButtonPlayer5]
+Tex=Button
+X=425
+Y=380
+W=250
+H=70
+Type=Font Black
+Texts=1
+Color=P5Dark
+DColor=P5Lightest
+DInt=0.5
+
+[NameButtonPlayer5Text1]
+X=115
+Y=20
+Font=1
+Size=9
+Align=1
+Text=
+Color=White
+
+[NameButtonPlayer6]
+Tex=Button
+X=425
+Y=450
+W=250
+H=70
+Type=Font Black
+Texts=1
+Color=P6Dark
+DColor=P6Lightest
+DInt=0.5
+
+[NameButtonPlayer6Text1]
+X=115
+Y=20
+Font=1
+Size=9
+Align=1
+Text=
+Color=White
+
+[PartyNewRound]
+Texts =7
+
+[PartyNewRoundStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =Gray
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =Gray
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic3]
+X =37
+Y =72
+W =27
+H =27
+Color =ColorDark
+Tex =MainIcon
+Type=Font Black
+
+[PartyNewRoundText1]
+X =40
+Y =4
+Font = 1
+Size = 22
+Color =GrayLight
+Text=PARTY_MODE
+
+[PartyNewRoundText2]
+X =62
+Y =67
+Color=Black
+Font =1
+Size =9
+Align =0
+Text=PARTY_ROUND_DESC
+
+[PartyNewRoundText3]
+X =398
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=2
+Text=PARTY_ROUND_WHEREAMI
+
+[PartyNewRoundText4]
+X =450
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=PARTY_ROUND_LEGEND_CONTINUE
+
+[PartyNewRoundText5]
+X =460
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND
+Align=0
+
+[PartyNewRoundText6]
+X =600
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND_WINNER
+Align=0
+
+[PartyNewRoundText7]
+X =448
+Y =350
+Color =White
+Font =0
+Size =18
+Text =PARTY_ROUND
+Align=2
+
+[PartyNewRoundTextTeam1Players]
+X =30
+Y =137
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam2Players]
+X =30
+Y =218
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam3Players]
+X =30
+Y =299
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundStatic4]
+Tex =PartyRoundBG1
+X =450
+Y =103
+W = 330
+H = 24
+Int=1
+Color =Gray
+Type=Font Black
+
+[PartyNewRoundStatic5]
+X =420
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[PartyNewRoundStatic6]
+Tex =PartyRoundBG3
+X =250
+Y =350
+W = 300
+H = 50
+Int=1
+Color =Gray
+Type=Font Black
+
+[PartyNewRoundStatic7]
+Tex =PartyRoundBG4
+X =50
+Y =495
+W = 700
+H = 30
+Int=1
+Color =GrayLight
+Type=Font Black
+
+[PartyNewRoundStaticTeam1]
+Tex =PartyTeamButton1
+X =20
+Y =110
+W =400
+H =50
+Int=1
+Color =P1Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam2]
+Tex =PartyTeamButton1
+X =20
+Y =191
+W =400
+H =50
+Int=1
+Color =P2Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam3]
+Tex =PartyTeamButton1
+X =20
+Y =272
+W =400
+H =50
+Int=1
+Color =P3Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticNextPlayer1]
+Tex=PartyPlayerButton
+X=155
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P1Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer2]
+Tex=PartyPlayerButton
+X=325
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P2Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer3]
+Tex=PartyPlayerButton
+X=495
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P3Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundTextRound1]
+X =460
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Round 1
+Align=0
+
+[PartyNewRoundTextRound2]
+X =460
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Round 2
+Align=0
+
+[PartyNewRoundTextRound3]
+X =460
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Round 3
+Align=0
+
+[PartyNewRoundTextRound4]
+X =460
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Round 4
+Align=0
+
+[PartyNewRoundTextRound5]
+X =460
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Round 5
+Align=0
+
+[PartyNewRoundTextRound6]
+X =460
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Round 6
+Align=0
+
+[PartyNewRoundTextRound7]
+X =460
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Round 7
+Align=0
+
+[PartyNewRoundTextWinner1]
+X =600
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Winner 1
+Align=0
+
+[PartyNewRoundTextWinner2]
+X =600
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Winner 2
+Align=0
+
+[PartyNewRoundTextWinner3]
+X =600
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Winner 3
+Align=0
+
+[PartyNewRoundTextWinner4]
+X =600
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Winner 4
+Align=0
+
+[PartyNewRoundTextWinner5]
+X =600
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Winner 5
+Align=0
+
+[PartyNewRoundTextWinner6]
+X =600
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Winner 6
+Align=0
+
+[PartyNewRoundTextWinner7]
+X =600
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Winner 7
+Align=0
+
+[PartyNewRoundStaticRound1]
+Tex =PartyRoundBG2
+X =450
+Y =135
+W = 330
+H = 20
+Color =GrayLight
+Type =Font Black
+
+[PartyNewRoundStaticRound2]
+Tex =PartyRoundBG2
+X =450
+Y =164
+W = 330
+H = 20
+Color =GrayLight
+Type =Font Black
+
+[PartyNewRoundStaticRound3]
+Tex =PartyRoundBG2
+X =450
+Y =193
+W = 330
+H = 20
+Color =GrayLight
+Type =Font Black
+
+[PartyNewRoundStaticRound4]
+Tex =PartyRoundBG2
+X =450
+Y =222
+W = 330
+H = 20
+Color =GrayLight
+Type =Font Black
+
+[PartyNewRoundStaticRound5]
+Tex =PartyRoundBG2
+X =450
+Y =251
+W = 330
+H = 20
+Color =GrayLight
+Type =Font Black
+
+[PartyNewRoundStaticRound6]
+Tex =PartyRoundBG2
+X =450
+Y =280
+W = 330
+H = 20
+Color =GrayLight
+Type =Font Black
+
+[PartyNewRoundStaticRound7]
+Tex =PartyRoundBG2
+X =450
+Y =309
+W = 330
+H = 20
+Color =GrayLight
+Type =Font Black
+
+[PartyNewRoundTextNextRound]
+X =400
+Y =495
+Color =White
+Font =0
+Size =10
+Text =Next Round
+Align=1
+
+[PartyNewRoundTextNextRoundNo]
+X =457
+Y =350
+Color =White
+Font =0
+Size =18
+Text =99
+Align=0
+
+[PartyNewRoundTextScoreTeam1]
+X =390
+Y =110
+Color =White
+Font =0
+Size =17
+Text =3000
+Align=1
+
+[PartyNewRoundTextScoreTeam2]
+X =390
+Y =191
+Color =White
+Font =0
+Size =17
+Text =2000
+Align=1
+
+[PartyNewRoundTextScoreTeam3]
+X =390
+Y =272
+Color =White
+Font =0
+Size =17
+Text =1000
+Align=1
+
+[PartyNewRoundTextNameTeam1]
+X =30
+Y =108
+Color =White
+Font =0
+Size =12
+Text =Team 1
+Align=0
+
+[PartyNewRoundTextNameTeam2]
+X =30
+Y =189
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyNewRoundTextNameTeam3]
+X =30
+Y =270
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyNewRoundTextNextPlayer1]
+X =230
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 1
+Align=1
+
+[PartyNewRoundTextNextPlayer2]
+X =400
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 2
+Align=1
+
+[PartyNewRoundTextNextPlayer3]
+X =570
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 3
+Align=1
+
+[PartyScore]
+Texts=5
+
+[PartyScoreBackground]
+Tex=PartyBG
+
+[PartyScoreDecoTextures]
+ChangeTextures =1
+
+FirstTexture =PartyScoreDeco
+FirstTyp =Font Black
+FirstColor =Gold
+
+SecondTexture =PartyScoreDeco
+SecondTyp =Font Black
+SecondColor =Silver
+
+ThirdTexture =PartyScoreDeco
+ThirdTyp =Font Black
+ThirdColor =Bronze
+
+[PartyScoreStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic3]
+X =37
+Y =72
+W =27
+H =27
+Color =ColorDark
+Tex =MainIcon
+Type=Font Black
+
+[PartyScoreStatic4]
+X =410
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[PartyScoreText1]
+X =40
+Y =4
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 22
+Color =GrayLight
+Text=PARTY_MODE
+
+[PartyScoreText2]
+X =62
+Y =67
+Color=Black
+Font =1
+Size =9
+Align =0
+Text=PARTY_SCORE_DESC
+
+[PartyScoreText3]
+X =388
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=2
+Text=PARTY_SCORE_WHEREAMI
+
+[PartyScoreText4]
+X =440
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=PARTY_LEGEND_CONTINUE
+
+[PartyScoreStatic5]
+Tex =PartyScoreBG1
+X =50
+Y =100
+W = 700
+H = 80
+Int=1
+Color =Gray
+Type=Font Black
+
+[PartyScoreStatic6]
+Tex =PartyScoreBG2
+X =50
+Y =495
+W = 700
+H = 20
+Int=1
+Color =GrayLight
+Type=Font Black
+
+[PartyScoreText5]
+X =400
+Y =136
+Color =White
+Font =0
+Size =18
+Text =PARTY_SCORE_WINS2
+Align=1
+
+[PartyScoreTextWinner]
+X =400
+Y =98
+Color =White
+Font =0
+Size =18
+Text =The Winner is...
+Align=1
+
+[PartyScoreTextScoreTeam1]
+X =568
+Y =198
+Color =White
+Font =0
+Size =12
+Text =3000
+Align=2
+
+[PartyScoreTextScoreTeam2]
+X =568
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyScoreTextScoreTeam3]
+X =568
+Y =398
+Color =White
+Font =0
+Size =12
+Text =1000
+Align=2
+
+[PartyScoreTextNameTeam1]
+X =188
+Y =198
+Font=0
+Size=12
+Align=0
+Text=Team 1
+Color=White
+
+[PartyScoreTextNameTeam2]
+X =188
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyScoreTextNameTeam3]
+X =188
+Y =398
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyScoreStaticTeam1]
+X =188
+Y =230
+W =380
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam1BG]
+Tex=PartyTeamButton2
+X=178
+Y=200
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam1Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 191
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam2]
+X =188
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam2BG]
+Tex=PartyTeamButton2
+X=178
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam2Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam3]
+X =188
+Y =430
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam3BG]
+Tex=PartyTeamButton2
+X=178
+Y=400
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam3Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 391
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyWin]
+Texts=4
+
+[PartyWinBackground]
+Tex=PartyBG
+
+[PartyWinStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic3]
+X =37
+Y =72
+W =27
+H =27
+Color =ColorDark
+Tex =MainIcon
+Type=Font Black
+
+[PartyWinStatic4]
+X =380
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[PartyWinText1]
+X =40
+Y =4
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 22
+Color =GrayLight
+Text=PARTY_MODE
+
+[PartyWinText2]
+X =62
+Y =67
+Color=Black
+Font =1
+Size =9
+Align =0
+Text=PARTY_WIN_DESC
+
+[PartyWinText3]
+X =358
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=2
+Text=PARTY_WIN_WHEREAMI
+
+[PartyWinText4]
+X =410
+Y =552
+Color=Gray
+Font =1
+Size =7
+Align=0
+Text=PARTY_WIN_LEGEND_CONTINUE
+
+#[PartyWinTextWinner]
+#X =150
+#Y =120
+#Color =White
+#Font =1
+#Size =14
+#Text =The Winner is...
+#Align=0
+
+[PartyWinTextScoreTeam1]
+X =699
+Y =183
+Color =White
+Font =0
+Size =19
+Text =3000
+Align=2
+
+[PartyWinTextScoreTeam2]
+X =669
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyWinTextScoreTeam3]
+X =649
+Y =398
+Color =White
+Font =0
+Size =9
+Text =1000
+Align=2
+
+[PartyWinTextNameTeam1]
+X =169
+Y =183
+Font=0
+Size=19
+Align=0
+Text=Team 1
+Color=White
+
+[PartyWinTextNameTeam2]
+X =289
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyWinTextNameTeam3]
+X =369
+Y =398
+Color =White
+Font =0
+Size =9
+Text =Team 3
+Align=0
+
+[PartyWinStaticTeam1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BG]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank2]
+Tex=PartyTeamButton3
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank3]
+Tex=PartyTeamButton3
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyWinStaticTeam1Deco]
+Tex =PartyWinDeco1
+X = 91
+Y = 176
+W = 79
+H = 79
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BG]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamButton3
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank1]
+Tex=PartyTeamButton4
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank2]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank3]
+Tex=PartyTeamButton4
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Deco]
+Tex =PartyWinDeco2
+X = 226
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Silver
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BG]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank2]
+Tex=PartyTeamButton5
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank3]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Deco]
+Tex =PartyWinDeco3
+X = 316
+Y = 391
+W = 54
+H = 54
+Type =Font Black
+Color =Bronze
+Reflection=1
+ReflectionSpacing=3
+
+[PartyOptions]
+Texts = 3
+
+[PartyOptionsBackground]
+Tex=PartyBG
+
+[PartyOptionsStatic1]
+Tex =ButtonNavi
+X =196
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[PartyOptionsStatic2]
+Tex =ButtonEnter
+X =350
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[PartyOptionsStatic3]
+Tex =ButtonEsc
+X =510
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[PartyOptionsText2]
+X =226
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_NAVIGATE
+Align=0
+
+[PartyOptionsText3]
+X =380
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_CONTINUE
+Align=0
+
+[PartyOptionsText4]
+X =540
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_ESC
+Align=0
+
+[PartyOptionsText1]
+X = 50
+Y = 10
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 25
+Text=PARTY_OPTIONS_WHEREAMI
+
+[PartyOptionsSelectLevel]
+Tex = MainBar
+TexSBG = MainBar
+Text =PARTY_DIFFICULTY
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList]
+Tex = MainBar
+TexSBG = MainBar
+Text =PARTY_PLAYLIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList2]
+Tex = MainBar
+TexSBG = MainBar
+Text =PARTY_PLAYLIST
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectRounds]
+Tex = MainBar
+TexSBG = MainBar
+Text =PARTY_ROUNDS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectTeams]
+Tex = MainBar
+TexSBG = MainBar
+Text =PARTY_TEAMS
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers1]
+Tex = MainBar
+TexSBG = MainBar
+Text =PARTY_TEAMS_PLAYER1
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers2]
+Tex = MainBar
+TexSBG = MainBar
+Text =PARTY_TEAMS_PLAYER2
+X = 40
+Y = 415
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers3]
+Tex = MainBar
+TexSBG = MainBar
+Text =PARTY_TEAMS_PLAYER3
+X = 40
+Y = 470
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+
+[PartyPlayer]
+Texts=6
+
+[PartyPlayerBackground]
+Tex=PartyBG
+
+[PartyPlayerStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyPlayerText1]
+X = 50
+Y = 10
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 1
+Size = 25
+Text=PARTY_PLAYER_WHEREAMI
+
+[PartyPlayerStatic2]
+Tex =ButtonNavi
+X =176
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[PartyPlayerStatic3]
+Tex =ButtonAZ
+X =330
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[PartyPlayerStatic4]
+Tex =ButtonEnter
+X =532
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[PartyPlayerText2]
+X =206
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_NAVIGATE
+Align=0
+
+[PartyPlayerText3]
+X =360
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_PLAYER_ENTER_NAME
+Align=0
+
+[PartyPlayerText4]
+X =562
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_CONTINUE
+Align=0
+
+[PartyPlayerTeam1Name]
+Tex=PartyTeamButton2
+X=85
+Y=100
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Dark
+
+[PartyPlayerTeam1NameText1]
+X =155
+Y =8
+Font=1
+Size=11
+Align=1
+Text=Team 1
+Color=White
+
+[PartyPlayerPlayer1Name]
+Tex=Button
+X=81
+Y=160
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+
+[PartyPlayerPlayer1NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 1
+Color=White
+
+[PartyPlayerPlayer2Name]
+Tex=Button
+X=241
+Y=160
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+
+[PartyPlayerPlayer2NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 2
+Color=White
+
+[PartyPlayerPlayer3Name]
+Tex=Button
+X=401
+Y=160
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+
+[PartyPlayerPlayer3NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 3
+Color=White
+
+[PartyPlayerPlayer4Name]
+Tex=Button
+X=561
+Y=160
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+
+[PartyPlayerPlayer4NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 4
+Color=White
+
+[PartyPlayerTeam2Name]
+Tex=PartyTeamButton2
+X=85
+Y=240
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Dark
+
+[PartyPlayerTeam2NameText1]
+X =155
+Y =8
+Font=1
+Size=11
+Align=1
+Text=Team 2
+Color=White
+
+[PartyPlayerPlayer5Name]
+Tex=Button
+X=81
+Y=300
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+
+[PartyPlayerPlayer5NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 5
+Color=White
+
+[PartyPlayerPlayer6Name]
+Tex=Button
+X=241
+Y=300
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+
+[PartyPlayerPlayer6NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 6
+Color=White
+
+[PartyPlayerPlayer7Name]
+Tex=Button
+X=401
+Y=300
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+
+[PartyPlayerPlayer7NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 7
+Color=White
+
+[PartyPlayerPlayer8Name]
+Tex=Button
+X=561
+Y=300
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+
+[PartyPlayerPlayer8NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 8
+Color=White
+
+[PartyPlayerTeam3Name]
+Tex=Button
+Tex=PartyTeamButton2
+X=85
+Y=380
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Dark
+
+[PartyPlayerTeam3NameText1]
+X =155
+Y =8
+Font=1
+Size=11
+Align=1
+Text=Team 3
+Color=White
+
+[PartyPlayerPlayer9Name]
+Tex=Button
+X=81
+Y=440
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+
+[PartyPlayerPlayer9NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 9
+Color=White
+
+[PartyPlayerPlayer10Name]
+Tex=Button
+X=241
+Y=440
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+
+[PartyPlayerPlayer10NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 10
+Color=White
+
+[PartyPlayerPlayer11Name]
+Tex=Button
+X=401
+Y=440
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+
+[PartyPlayerPlayer11NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 11
+Color=White
+
+[PartyPlayerPlayer12Name]
+Tex=Button
+X=561
+Y=440
+W =158
+H =54
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+
+[PartyPlayerPlayer12NameText1]
+X =79
+Y =12
+Font=1
+Size=9
+Align=1
+Text=Player 12
+Color=White
+
+# # # # Song Extensions # # # #
+[SongMenu]
+Texts=0
+Statics=1
+
+[SongMenuButton1]
+X = 505
+Y = 195
+W = 220
+H = 25
+Tex = SongMenuButton
+Color =ColorDark
+DColor = Gray
+Type=Font Black
+Texts=1
+Z = 0.988
+
+[SongMenuButton1Text1]
+X =110
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=SONG_MENU_PLAY
+Align=1
+Z=0.99
+
+[SongMenuButton2]
+X = 505
+Y = 225
+W = 220
+H = 25
+Tex = SongMenuButton
+Color =ColorDark
+DColor = Gray
+Type=Font Black
+Texts=1
+Z = 0.988
+
+[SongMenuButton2Text1]
+X =110
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=SONG_MENU_EDIT
+Align=1
+Z=0.99
+
+[SongMenuButton3]
+X = 505
+Y = 255
+W = 220
+H = 25
+Tex = SongMenuButton
+Color =ColorDark
+DColor = Gray
+Type=Font Black
+Texts=1
+Z = 0.988
+
+[SongMenuButton3Text1]
+X =110
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=SONG_MENU_MODI
+Align=1
+Z=0.99
+
+[SongMenuButton4]
+X = 505
+Y = 285
+W = 220
+H = 25
+Tex = SongMenuButton
+Color =ColorDark
+DColor = Gray
+Type=Font Black
+Texts=1
+Z = 0.988
+
+[SongMenuButton4Text1]
+X =110
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=SONG_MENU_CANCEL
+Align=1
+Z=0.99
+
+[SongMenuSelectSlide3]
+Tex = Rectangle
+TexSBG = SongMenuSelectBG
+Text =
+X = 505
+Y = 255
+W = 0
+H = 25
+Z = 0.988
+SkipX = 0
+SBGW=220
+
+TextSize=8
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = Black
+STDColor = Black
+
+[SongMenuTextMenu]
+X =615
+Y =140
+Color=Black
+Font =0
+Size =13
+Text=MENU
+Align=1
+Z=0.99
+
+[SongMenuStatic1]
+X =400
+Y =100
+W =200
+H =262
+Z =0.45
+Color=White
+Tex =Rectangle
+Type=Font Black
+TexX1=0.1
+TexY1=0.1
+TexX2=0.9
+TexY2=0.9
+
+[SongMenuStatic2]
+X =400
+Y =100
+W =200
+H =262
+Z =0.45
+Color=Black
+Tex =SongFade
+Type=Font Black
+TexX1=0.5
+TexY1=0.1
+TexX2=0.7
+TexY2=0.7
+
+[SongMenuStatic3]
+Tex =SongMenuBG
+X =500
+Y =140
+W =230
+H =200
+Z =0.985
+Int=1
+Color =White
+Type=Font Black
+
+[SongMenuStatic4]
+X =705
+Y =120
+W =42
+H =240
+Z=0.985
+Color =Gray
+Tex =SongMenuBorder
+Type=Font Black
+Z=0.98
+
+# # # # Song Jump to Menu # # # #
+[SongJumpto]
+Texts=0
+Statics=1
+
+[SongJumptoText1]
+X =30
+Y =7
+Color=Black
+Font =1
+Size =10
+Text=SONG_JUMPTO_TYPE_DESC
+Align=0
+Z=0.99
+
+[SongJumptoSelectSlideType]
+Tex = button
+TexSBG = mainicon
+#Text = SONG_JUMPTO_TYPE_DESC
+Font=1
+X = 160
+Y = 10
+Z = 0.99
+W = 0
+H = 30
+SkipX = 0
+SBGW= 120
+Fields=2
+DColor = White
+TColor = Gray
+TDColor = Gray
+SBGTex = button
+SBGDColor = White
+STColor = Gray
+STDColor = White
+
+[SongJumptoButtonSearchText]
+X = 30
+Y = 40
+Z = 0.99
+W = 208
+H = 25
+Tex=JumpToBG
+Type=Font Black
+Color=Black
+Texts=1
+
+[SongJumptoButtonSearchTextText1]
+X = 2
+Y = -1
+Size=9
+Font=0
+Color=Black
+Align=0
+
+[SongJumptoTextFound]
+X =30
+Y =70
+Color=Black
+Font =0
+Size =8
+Text=SONG_JUMPTO_HELP
+Align=0
+Z=0.99
+
+
+# # # # Statistic Screens # # # #
+[StatMain]
+Texts=4
+Statics=6
+
+[StatMainBackground]
+Tex=MainBG
+
+[StatMainStatic5]
+Tex =ButtonNavi
+X =196
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[StatMainStatic6]
+Tex =ButtonEnter
+X =350
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[StatMainStatic7]
+Tex =ButtonEsc
+X =510
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[StatMainText3]
+X =226
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_NAVIGATE
+Align=0
+
+[StatMainText4]
+X =380
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_SELECT
+Align=0
+
+[StatMainText5]
+X =540
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_ESC
+Align=0
+
+[StatMainButtonScores]
+X =589
+Y =120
+W =190
+H =50
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[StatMainButtonScoresText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SCORES
+Color=White
+
+[StatMainButtonSingers]
+X =589
+Y =180
+W =190
+H =50
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[StatMainButtonSingersText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SINGERS
+Color=White
+
+[StatMainButtonSongs]
+X =589
+Y =240
+W =190
+H =50
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[StatMainButtonSongsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_SONGS
+Color=White
+
+[StatMainButtonBands]
+X =589
+Y =300
+W =190
+H =50
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[StatMainButtonBandsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_BANDS
+Color=White
+
+[StatMainButtonExit]
+X =589
+Y =360
+W =190
+H =50
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[StatMainButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatMainTextOverview]
+X =45
+Y =145
+W =510
+Color=Black
+Font =0
+Size =9
+Align=0
+Text=
+
+[StatMainStatic1]
+X =40
+Y =71
+W =32
+H =32
+Color =ColorDark
+Tex =MainIcon
+Type=Font Black
+
+
+[StatMainStatic2]
+X =40
+Y =120
+W =520
+H =20
+Tex=StatMainBG1
+Color =ColorLight
+Type=Font Black
+
+[StatMainStatic3]
+X =40
+Y =140
+W =520
+H =300
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatMainStatic4]
+X =40
+Y =440
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+[StatMainText1]
+X =40
+Y =6
+Color=GrayLight
+Font =1
+Size =22
+Text=STAT_MAIN
+Align=0
+
+[StatMainText2]
+X =73
+Y =69
+Color=GrayDark
+Font =1
+Size =10
+Align =0
+Text=STAT_MAIN_DESC
+
+
+[StatDetail]
+Texts=0
+Statics=0
+
+[StatDetailBackground]
+Tex=MainBG
+
+[StatDetailStatic5]
+Tex =ButtonNavi
+X =196
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[StatDetailStatic6]
+Tex =ButtonEnter
+X =350
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[StatDetailStatic7]
+Tex =ButtonEsc
+X =510
+Y =553
+W =22
+H =22
+Color =White
+Type=Plain
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[StatDetailText2]
+X =226
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_NAVIGATE
+Align=0
+
+[StatDetailText3]
+X =380
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_SELECT
+Align=0
+
+[StatDetailText4]
+X =540
+Y =553
+Color=Gray
+Font =1
+Size =7
+Text=SING_LEGEND_ESC
+Align=0
+
+[StatDetailButtonNext]
+X =589
+Y =120
+W =190
+H =50
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[StatDetailButtonNextText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_NEXT
+Color=White
+
+[StatDetailButtonPrev]
+X =589
+Y =180
+W =190
+H =50
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[StatDetailButtonPrevText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_PREV
+Color=White
+
+[StatDetailButtonReverse]
+X =589
+Y =240
+W =190
+H =50
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[StatDetailButtonReverseText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_REVERSE
+Color=White
+
+[StatDetailButtonExit]
+X =589
+Y =300
+W =190
+H =50
+Tex = Button
+Color = ColorDark
+Int = 1
+DColor = White
+DInt = 0.5
+Type = Font Black
+Texts=1
+
+[StatDetailButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatDetailTextDescription]
+X =73
+Y =69
+Color=GrayDark
+Font =1
+Size =10
+Align =0
+Text=
+
+[StatDetailTextPage]
+X = 546
+Y = 118
+Color= Black
+Font = 0
+Size = 5
+Align=2
+Text=
+
+[StatDetailTextList1]
+X = 45
+Y = 142
+Color=Black
+Font = 0
+Size = 8
+Text=Stat1
+
+[StatDetailTextList2]
+X = 45
+Y = 180
+Color=Black
+Font = 0
+Size = 8
+Text=Stat2
+
+[StatDetailTextList3]
+X = 45
+Y = 218
+Color=Black
+Font = 0
+Size = 8
+Text=
+
+[StatDetailTextList4]
+X = 45
+Y = 256
+Color=Black
+Font = 0
+Size = 8
+Text=
+
+[StatDetailTextList5]
+X = 45
+Y = 294
+Color=Black
+Font = 0
+Size = 8
+Text=
+
+[StatDetailTextList6]
+X = 45
+Y = 332
+Color=Black
+Font = 0
+Size = 8
+Text=
+
+[StatDetailTextList7]
+X = 45
+Y = 370
+Color=Black
+Font = 0
+Size = 8
+Text=
+
+[StatDetailTextList8]
+X = 45
+Y = 408
+Color=Black
+Font = 0
+Size = 8
+Text=
+
+[StatDetailTextList9]
+X = 45
+Y = 446
+Color=Black
+Font = 0
+Size = 8
+Text=
+
+[StatDetailTextList10]
+X = 45
+Y = 484
+Color=Black
+Font = 0
+Size = 8
+Text=
+
+[StatDetailStatic1]
+X =40
+Y =71
+W =32
+H =32
+Color =ColorDark
+Tex =MainIcon
+Type=Font Black
+
+[StatDetailStatic2]
+X =40
+Y =120
+W =520
+H =24
+Tex=StatDetailBG1
+Color =ColorLight
+Type=Font Black
+
+[StatDetailStatic3]
+X =40
+Y =144
+W =520
+H =379
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatDetailStatic4]
+X =40
+Y =523
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+
+[StatDetailText1]
+X =40
+Y =6
+Color=GrayLight
+Font =1
+Size =22
+Text=STAT_DETAIL
+Align=0
+
+
+# # # # OnScreen PopUp Error / Question Messages # # # #
+[CheckPopup]
+Texts=0
+Statics=3
+
+[CheckPopupButton1]
+X = 192
+Y = 327
+W = 128
+H = 50
+Tex =MainBar
+Color = ColorDark
+DColor = White
+Int=1
+DInt=0.5
+Type=Font Black
+Texts=1
+Z = 1
+
+[CheckPopupButton1Text1]
+X =64
+Y =13
+Color=White
+Font =0
+Size =8
+Text=Yes
+Align=1
+Z=1
+
+[CheckPopupButton2]
+X = 480
+Y = 327
+W = 128
+H = 50
+Tex =MainBar
+Color = ColorDark
+DColor = White
+Int=1
+DInt=0.5
+Type=Font Black
+Texts=1
+Z = 1
+
+[CheckPopupButton2Text1]
+X =64
+Y =13
+Color=White
+Font =0
+Size =8
+Text=No
+Align=1
+Z=1
+
+[CheckPopupText]
+X =400
+Y =226
+W =500
+Color=Black
+Font =0
+Size =14
+Text=
+Align=1
+Z=1
+
+[CheckPopupStatic1]
+Tex =PopUpBG
+X =99
+Y =224
+W =602
+H =152
+Z =1
+Int=1
+Color =White
+Type=Font Black
+
+[CheckPopupStatic2]
+Tex =PopUpFG
+X =99
+Y =224
+W =602
+H =152
+Z =1
+Int=1
+Color =Black
+Type=Font Black
+
+[CheckPopupStatic3]
+Tex =IconQuestion
+X =124
+Y =235
+W =44
+H =44
+Z =1
+Int=1
+Color =Black
+Type=Font Black
+
+[ErrorPopup]
+Texts=1
+Statics=1
+
+[ErrorPopupButton1]
+X = 366
+Y = 342
+W =22
+H =22
+Tex =ButtonEnter
+Color = White
+DColor = White
+Type=Plain
+Texts=1
+Z = 1
+
+[ErrorPopupButton1Text1]
+X =32
+Y =0
+Color=Black
+Font =0
+Size =10
+Text=OK
+Align=0
+Z=0
+
+[ErrorPopupText]
+X =400
+Y =226
+W =500
+Color=Black
+Font =0
+Size =14
+Text=
+Align=1
+Z=1
+
+[ErrorPopupStatic1]
+Tex =PopUpBG
+X =99
+Y =224
+W =602
+H =152
+Z =1
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopupStatic2]
+Tex =PopUpFG
+X =99
+Y =224
+W =602
+H =152
+Z =1
+Int=1
+Color =Black
+Type=Font Black
+
+[ErrorPopupStatic3]
+Tex =IconError
+X =124
+Y =235
+W =44
+H =44
+Z =1
+Int=1
+Color =Black
+Type=Font Black \ No newline at end of file
diff --git a/Themes/Deluxe.ini b/Themes/Deluxe.ini
new file mode 100644
index 00000000..4afeab8e
--- /dev/null
+++ b/Themes/Deluxe.ini
@@ -0,0 +1,7993 @@
+;1.0.1
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Theme]
+Name=Deluxe
+Creator=Ultrastar Deluxe Team
+
+[Colors]
+White = 255 255 255
+LightBlue = 119 187 210
+DarkBlue = 28 126 171
+LightRed = 170 146 146
+DarkRed = 155 113 113
+LightGreen = 136 168 136
+DarkGreen = 106 152 104
+LightPurple = 155 136 168
+DarkPurple = 145 104 152
+LightOrange = 168 155 136
+DarkOrange = 151 131 76
+LightYellow = 168 168 136
+DarkYellow = 150 151 76
+Turkis = 13 186 167
+GrayLightest = 223 223 223
+GrayLight = 191 191 191
+Gray = 127 127 127
+GrayDark = 63 63 63
+Black = 0 0 0
+GrayPopup = 51 51 51
+Gold = 255 223 31
+Silver = 223 223 223
+Bronze = 205 127 50
+
+[Loading]
+Texts =2
+Fade = 1
+
+[LoadingBackground]
+Tex=LoadingBG
+
+[LoadingText1]
+X =30
+Y =552
+Color =Black
+Font =0
+Align =0
+Size =7
+Text =SING_LOADING
+
+[LoadingText2]
+X =790
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=US_VERSION
+
+[Main]
+Texts =2
+Statics=4
+
+[MainBackground]
+Tex=MainBG
+
+[MainStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic3]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[MainText2]
+X =295
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[MainStatic4]
+X =388
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[MainText1]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_MENU
+
+[MainTextDescriptionLong]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=
+
+[MainButtonSolo]
+X =180
+Y =270
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=15
+DeSelectReflectionSpacing=280
+Fade=1
+FadeText=1
+SelectH=150
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[MainButtonSoloText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_SING
+Color=White
+
+[MainButtonMulti]
+X =335
+Y =270
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=15
+DeSelectReflectionSpacing=280
+Fade=1
+FadeText=1
+SelectH=150
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[MainButtonMultiText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_MULTI
+Color=White
+
+[MainButtonCollection1]
+X =490
+Y =270
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=15
+DeSelectReflectionSpacing=280
+Fade=1
+FadeText=0
+SelectH=150
+FadeTex=ButtonFade
+FadeTexPos=0
+FirstChild=3
+
+[MainButtonCollection1Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_TOOLS
+Color=White
+
+[MainButtonStats]
+X =495
+Y =310
+W =140
+H =30
+Tex =Rectangle
+Color =ColorLight
+DColor =ColorDark
+Type=Font Black
+Texts=1
+Reflection=0
+Parent=1
+
+[MainButtonStatsText1]
+X =70
+Y =3
+Font=0
+Size=8
+Align=1
+Text=SING_STATS
+Color=White
+
+[MainButtonEditor]
+X =495
+Y =345
+W =140
+H =30
+Tex =Rectangle
+Color =ColorLight
+DColor =ColorDark
+Type=Font Black
+Texts=1
+Reflection=0
+Parent=1
+
+[MainButtonEditorText1]
+X =70
+Y =3
+Font=0
+Size=8
+Align=1
+Text=SING_EDITOR
+Color=White
+
+[MainButtonOptions]
+X =495
+Y =380
+W =140
+H =30
+Tex =Rectangle
+Color =ColorLight
+DColor =ColorDark
+Type=Font Black
+Texts=1
+Reflection=0
+Parent=1
+
+[MainButtonOptionsText1]
+X =70
+Y =3
+Font=0
+Size=8
+Align=1
+Text=SING_OPTIONS
+Color=White
+
+[MainButtonExit]
+X =645
+Y =270
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =ColorLight
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=15
+DeSelectReflectionSpacing=280
+Fade=1
+FadeText=1
+SelectH=150
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[MainButtonExitText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_EXIT
+Color=White
+
+[Song]
+Texts =3
+
+[SongBackground]
+Tex=SongBG
+
+[SongCover]
+X=303
+Y=125
+W=320
+H=190
+Style=5
+Reflections=1
+
+[SongEqualizer]
+Visible=1
+Direction=1
+Color=White
+Alpha=1
+X=255
+Y=514
+Z=1
+PieceW=6
+PieceH=6
+Space=1
+Bands=6
+Length=18
+
+[SongVideoIcon]
+X =299
+Y =487
+W =32
+H =32
+Z=1
+Color=White
+Tex =VideoIcon
+Type=Font Black
+
+[SongStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[SongStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[SongStatic3]
+X =250
+Y =120
+W =300
+H =200
+Z =0.5
+Color =ColorDark
+Tex =SongSelection1
+Type=Font Black
+
+[SongStatic4]
+X =298
+Y =320
+W =200
+H =200
+Z=0.98
+Color =ColorDark
+Tex =SongSelection2
+Type=Font Black
+
+[SongTextCat]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_SONG_SELECTION_DESC
+
+[SongTextArtist]
+X =400
+Y =320
+W = 190
+Color=White
+Font =1
+Size =9
+Align =1
+Text=
+
+[SongTextTitle]
+X =400
+Y =395
+W = 190
+Color=White
+Font =0
+Size =9
+Align =1
+Text=
+
+[SongTextNumber]
+X =490
+Y =495
+Color=White
+Font =0
+Size =8
+Align =2
+Text=
+
+#Variable statics and texts for song-screen in sing- and partymode
+# There can be an unlimited Number of Statics and Texts, As long
+# as the numbers are in order.
+# Statics that are shown in PartyMode Only are Named_
+# SongStaticParty[No]
+# Texts that are shown in PartyMode Only are Named_
+# SongTextParty[No]
+# Statics that are shown in Normal Mode Only are Named_
+# SongStaticNonParty[No]
+# Texts that are shown in Normal Mode Only are Named_
+# SongTextNonParty[No]
+#Here are the ones for singmode
+
+[SongStaticNonParty1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =SongCD
+Type=Font Black
+
+[SongStaticNonParty2]
+X =260
+Y =553
+W =26
+H =22
+Tex=ButtonAlt
+Color =White
+Type=Plain
+
+[SongStaticNonParty3]
+X =300
+Y =553
+W =26
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Plain
+
+[SongStaticNonParty4]
+X =425
+Y =553
+W =22
+H =22
+Tex=ButtonM
+Color =White
+Type=Plain
+
+[SongStaticNonParty5]
+X =515
+Y =553
+W =22
+H =22
+Tex=ButtonJ
+Color =White
+Type=Plain
+
+[SongStaticNonParty6]
+X =679
+Y =553
+W =22
+H =22
+Tex=ButtonP
+Color =White
+Type=Plain
+
+#Texts Non Party
+[SongTextNonParty1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_SONG_SELECTION
+Align=0
+
+[SongTextNonParty2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_SONG_SELECTION_WHEREAMI
+
+[SongTextNonParty3]
+X =288
+Y =556
+Color=Black
+Font =1
+Size =5
+Align=0
+Text=+
+
+[SongTextNonParty4]
+X =330
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_GOTO
+
+[SongTextNonParty5]
+X =450
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_MENU
+
+[SongTextNonParty6]
+X =540
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SONG_JUMPTO_DESC
+
+[SongTextNonParty7]
+X =705
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_PLAYLIST
+
+
+#and theese are the ones for partymode
+
+[SongStaticParty1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[SongStaticParty2]
+X =260
+Y =553
+W =26
+H =22
+Tex=Button13
+Color =White
+Type=Plain
+
+[SongStaticParty3]
+X =400
+Y =553
+W =22
+H =22
+Tex=ButtonM
+Color =White
+Type=Plain
+
+[SongStaticParty4]
+X =540
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+#Texts for Party Mode
+
+[SongTextParty1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[SongTextParty2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_SONG_WHEREAMI
+
+[SongTextParty3]
+X =288
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SONG_MENU_NAME_PARTY_JOKER
+
+[SongTextParty4]
+X =426
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_MENU
+
+[SongTextParty5]
+X =570
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_LEGEND_CONTINUE
+
+#variable statics end
+
+
+# Jokers, 5 for each team, only shown in party Mode
+[SongStaticTeam1Joker1]
+Tex =Joker
+X =530
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker2]
+Tex =Joker
+X =580
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker3]
+Tex =Joker
+X =630
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker4]
+Tex =Joker
+X =680
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker5]
+Tex =Joker
+X =730
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker1]
+Tex =Joker
+X =530
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker2]
+Tex =Joker
+X =580
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker3]
+Tex =Joker
+X =630
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker4]
+Tex =Joker
+X =680
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker5]
+Tex =Joker
+X =730
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker1]
+Tex =Joker
+X =530
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker2]
+Tex =Joker
+X =580
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker3]
+Tex =Joker
+X =630
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker4]
+Tex =Joker
+X =680
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker5]
+Tex =Joker
+X =730
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+
+[Sing]
+Texts =1
+
+;not used for this skin
+;[SingText1]
+;Text =SING_TIME
+;X =90
+;Y =200
+;Font =1
+;Size =6
+;Color =White
+;Align=1
+
+[SingStatic1]
+;TextBG
+Tex =LyricBar
+X =10
+Y =490
+W =780
+H =85
+Color =GrayLightest
+Type=Font Black
+
+[SingStatic2]
+;TimeBar
+Tex =TimeBar1
+X =10
+Y =577
+W =780
+H =16
+Color =Black
+Type=Font Black
+
+[SingTimeProgress]
+X =20
+Y =581
+W =700
+H =7
+Color=White
+
+[SingStatic3]
+;the thing behind the time progress
+Tex =TimeBar2
+X =20
+Y =581
+W =700
+H =7
+Color=GrayLightest
+Type=Font Black
+
+[SingTimeText]
+Text =SING_TIME
+X =750
+Y =576
+Font =1
+Size =6
+Color =White
+Align=1
+
+# O N E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#PlayerOne
+[SingP1Static]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1Text]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1Static2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1SingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T W O P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1TwoPStatic]
+Tex =P
+X =20
+Y =117
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPText]
+Text =P1
+X =26
+Y =122
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1TwoPStatic2]
+Tex =ScoreBG
+X =680
+Y =102
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPTextScore]
+Text =00000
+X =690
+Y =104
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1TwoPSingBar]
+X =680
+Y =136
+W =100
+H =8
+
+#Player Two
+[SingP2RStatic]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P2Dark
+Type=Transparent
+
+[SingP2RText]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP2RStatic2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2RTextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2RSingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T H R E E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1ThreePStatic]
+Tex =P
+X =16
+Y =59
+W =50
+H =54
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePText]
+Text =P1
+X =27
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP1ThreePStatic2]
+Tex =ScoreBG
+X =75
+Y =61
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePTextScore]
+Text =00000
+X =85
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1ThreePSingBar]
+X =75
+Y =95
+W =100
+H =8
+
+#Player Two
+[SingP2MStatic]
+Tex =P
+X =311
+Y =59
+W =50
+H =54
+Color =P2Dark
+Type=Transparent
+
+[SingP2MText]
+Text =P2
+X =321
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP2MStatic2]
+Tex =ScoreBG
+X =370
+Y =61
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2MTextScore]
+Text =00000
+X =380
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2MSingBar]
+X =370
+Y =95
+W =100
+H =8
+
+#Player Three
+[SingP3RStatic]
+Tex =P
+X =611
+Y =59
+W =50
+H =54
+Color =P3Dark
+Type=Transparent
+
+[SingP3RText]
+Text =P3
+X =621
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP3RStatic2]
+Tex =ScoreBG
+X =670
+Y =61
+W =100
+H =34
+Color =P3Dark
+Type=Transparent
+
+[SingP3RTextScore]
+Text =00000
+X =680
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP3SingBar]
+X =670
+Y =95
+W =100
+H =8
+
+[Score]
+Texts =1
+
+[ScoreBackground]
+Tex=ScoreScreenBG
+
+[ScoreText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SONG_SCORE
+Align=0
+
+[ScoreTextArtistTitle]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=ArtistTitle
+
+[ScoreStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[ScoreStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SONG_SCORE_WHEREAMI
+
+[ScoreStatic4]
+X =260
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[ScoreText3]
+X =290
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+#end of main stuff
+
+# # # # # # # # # # # # # # # # # # One Player Score # # # # # # # # # # # #
+[ScoreTextName1]
+X =175
+Y =260
+Font =0
+Size =14
+Text =P1
+Color =White
+Align=0
+
+[ScoreTextScore1]
+X =175
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes1]
+X =175
+Y =340
+Color=White
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore1]
+X =465
+Y =340
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextLineBonus1]
+X =175
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore1]
+X =465
+Y =370
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextGoldenNotes1]
+X =175
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore1]
+X =465
+Y =400
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextTotal1]
+X =205
+Y =460
+Color=White
+Font =0
+Size =14
+Text=SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore1]
+X =465
+Y =460
+Color=White
+Font =0
+Size =14
+Align =2
+Text =0
+
+#Lines
+[ScorePlayer1Static1]
+Tex =ScoreLine
+X =173
+Y =338
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static2]
+Tex =ScoreLine
+X =173
+Y =368
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static3]
+Tex =ScoreLine
+X =173
+Y =398
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static4]
+Tex =ScoreLine
+X =173
+Y =428
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static5]
+Tex =ScoreLine
+X =173
+Y =458
+W =295
+H =4
+Type =Font Black
+Color =White
+
+[ScoreStaticBoxDark1]
+Tex =PlayerNumberBox
+X =175
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Text1]
+X =179
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel1]
+Tex =ScoreLevel
+X =475
+Y =160
+W =150
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =130
+W =150
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel1]
+Tex =ScoreLevel
+X =475
+Y =410
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =380
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer1Static6]
+Tex =ScoreEndCap
+X =494
+Y =460
+W =112
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Static7]
+Tex =ScoreLine
+X =493
+Y =460
+W =114
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+
+# # # # # # # # # # # # # # # # # # Two Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName2]
+X =20
+Y =260
+Font =0
+Size =14
+Text =P1
+Color =White
+Align=0
+
+[ScoreTextScore2]
+X =20
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes2]
+X =20
+Y =340
+Color=White
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore2]
+X =300
+Y =340
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextLineBonus2]
+X =20
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore2]
+X =300
+Y =370
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextGoldenNotes2]
+X =20
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore2]
+X =300
+Y =400
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextTotal2]
+X =50
+Y =460
+Color=White
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore2]
+X =300
+Y =460
+Color=White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+# Lines
+[ScorePlayer2Static1]
+Tex =ScoreLine
+X =20
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static2]
+Tex =ScoreLine
+X =20
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static3]
+Tex =ScoreLine
+X =20
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static4]
+Tex =ScoreLine
+X =20
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static5]
+Tex =ScoreLine
+X =20
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =White
+
+[ScoreStaticBoxDark2]
+Tex =PlayerNumberBox
+X =20
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Text1]
+X =24
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel2]
+Tex =ScoreLevel
+X =293
+Y =160
+W =120
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =130
+W =120
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScoreStaticLevel2]
+Tex =ScoreLevel
+X =293
+Y =410
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =380
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScorePlayer2Static6]
+Tex =ScoreEndCap
+X =308
+Y =460
+W =90
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Static7]
+Tex =ScoreLine
+X =307
+Y =460
+W =92
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# P L A Y E R T W O
+[ScoreTextName3]
+X =780
+Y =260
+Font =0
+Size =14
+Text =P2
+Color =White
+Align=2
+
+[ScoreTextScore3]
+X =780
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=2
+
+[ScoreTextNotes3]
+X =780
+Y =340
+Color=White
+Font =0
+Size =9
+Text =SING_NOTES
+Align=2
+
+[ScoreTextNotesScore3]
+X =500
+Y =340
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextLineBonus3]
+X =780
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=2
+
+[ScoreTextLineBonusScore3]
+X =500
+Y =370
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextGoldenNotes3]
+X =780
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=2
+
+[ScoreTextGoldenNotesScore3]
+X =500
+Y =400
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextTotal3]
+X =750
+Y =460
+Color=White
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=2
+Reflection=1
+ReflectionSpacing=4
+
+[ScoreTextTotalScore3]
+X =500
+Y =460
+Color=White
+Font =0
+Size =14
+Align =0
+Text =00000
+Reflection=1
+ReflectionSpacing=4
+
+#Lines
+[ScorePlayer3Static1]
+Tex =ScoreLine
+X =500
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static2]
+Tex =ScoreLine
+X =500
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static3]
+Tex =ScoreLine
+X =500
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static4]
+Tex =ScoreLine
+X =500
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static5]
+Tex =ScoreLine
+X =500
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =White
+
+[ScoreStaticBoxDark3]
+Tex =PlayerNumberBox
+X =755
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Text1]
+X =759
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+#ScoreBar
+[ScoreStaticBackLevel3]
+Tex =ScoreLevel
+X =387
+Y =160
+W =120
+H =300
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =130
+W =120
+H =30
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel3]
+Tex =ScoreLevel
+X =387
+Y =410
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =380
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScorePlayer3Static6]
+Tex =ScoreEndCap
+X =402
+Y =460
+W =90
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Static7]
+Tex =ScoreLine
+X =401
+Y =460
+W =92
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# # # # # # # # # # # # # # # # # # Three Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName4]
+X=20
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P1
+Color=P1Dark
+
+[ScoreTextNotes4]
+X=20
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore4]
+X=260
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus4]
+X=20
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore4]
+X=260
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes4]
+X=20
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore4]
+X=260
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore4]
+X=20
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal4]
+X=47
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore4]
+X=260
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark4]
+Tex =PlayerNumberBox
+X =20
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer4Text1]
+X =24
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#lines
+[ScorePlayer4Static1]
+X=20
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static2]
+X=20
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static3]
+X=20
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static4]
+X=20
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static5]
+X=20
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+# P L A Y E R T W O
+[ScoreTextName5]
+X=280
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P2
+Color=P2Dark
+
+[ScoreTextNotes5]
+X=280
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore5]
+X=520
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus5]
+X=280
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore5]
+X=520
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes5]
+X=280
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore5]
+X=520
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore5]
+X=280
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal5]
+X=307
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore5]
+X=520
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark5]
+Tex =PlayerNumberBox
+X =280
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer5Text1]
+X =284
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+[ScorePlayer5Static1]
+X=280
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static2]
+X=280
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static3]
+X=280
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static4]
+X=280
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static5]
+X=280
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+# P L A Y E R T H R E E
+[ScoreTextName6]
+X=540
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P3
+Color=P3Dark
+
+[ScoreTextNotes6]
+X=540
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore6]
+X=780
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus6]
+X=540
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore6]
+X=780
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes6]
+X=540
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore6]
+X=780
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore6]
+X=540
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal6]
+X=567
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore6]
+X=780
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark6]
+Tex =PlayerNumberBox
+X =540
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P3Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer6Text1]
+X =544
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P3
+
+#lines
+[ScorePlayer6Static1]
+X=540
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static2]
+X=540
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static3]
+X=540
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static4]
+X=540
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static5]
+X=540
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[Options]
+Texts = 6
+Fade = 2
+
+[OptionsBackground]
+Tex=OptionsBG
+
+[OptionsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsStatic5]
+X =388
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[OptionsStatic6]
+X =512
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_WHEREAMI
+
+[OptionsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_DESC
+
+[OptionsText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_SELECT
+
+[OptionsText6]
+X =538
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsButtonGame]
+X =100
+Y =215
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonGameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_GAME
+Color=White
+
+[OptionsButtonGraphics]
+X =255
+Y =215
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonGraphicsText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_GRAPHICS
+Color=White
+
+[OptionsButtonSound]
+X =410
+Y =215
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonSoundText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_SOUND
+Color=White
+
+[OptionsButtonLyrics]
+X =565
+Y =215
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonLyricsText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_LYRICS
+Color=White
+
+[OptionsButtonThemes]
+X =100
+Y =335
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonThemesText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_THEMES
+Color=White
+
+[OptionsButtonRecord]
+X =255
+Y =335
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonRecordText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_RECORD
+Color=White
+Texts=1
+
+[OptionsButtonAdvanced]
+X =410
+Y =335
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonAdvancedText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_ADVANCED
+Color=White
+Texts=1
+
+[OptionsButtonExit]
+X =565
+Y =335
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonExitText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[OptionsGame]
+Texts = 5
+
+[OptionsGameBackground]
+Tex=OptionsBG
+
+[OptionsGameStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGameStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGameStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGameStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsGameStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsGameText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGameText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GAME_WHEREAMI
+
+[OptionsGameText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GAME_DESC
+
+[OptionsGameText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGameText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGameSelectPlayers]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_PLAYERS
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDifficulty]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DIFFICULTY
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+
+[OptionsGameSelectSlideLanguage]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_LANGUAGE
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectTabs]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_TABS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectSlideSorting]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_SORTING
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDebug]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DEBUG
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsGraphics]
+Texts = 5
+
+[OptionsGraphicsBackground]
+Tex=OptionsBG
+
+[OptionsGraphicsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGraphicsStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsGraphicsStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsGraphicsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGraphicsText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GRAPHICS_WHEREAMI
+
+[OptionsGraphicsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GRAPHICS_DESC
+
+[OptionsGraphicsText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGraphicsText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGraphicsSelectSlideResolution]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_GRAPHICS_RESOLUTION
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectFullscreen]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_FULLSCREEN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectDepth]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_DEPTH
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectOscilloscope]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_OSCILLOSCOPE
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectMovieSize]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_MOVIE_SIZE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsButtonExit]
+X = 40
+Y = 360
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsSound]
+Texts = 5
+
+[OptionsSoundBackground]
+Tex=OptionsBG
+
+[OptionsSoundStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsSoundStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsSoundStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsSoundText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsSoundText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_SOUND_WHEREAMI
+
+[OptionsSoundText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_SOUND_DESC
+
+[OptionsSoundText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsSoundText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsSoundSelectMicBoost]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_MIC_BOOST
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectClickAssist]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_CLICK_ASSIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectBeatClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_BEAT_CLICK
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectThreshold]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_THRESHOLD
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectTwoPlayerMode]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_TWO_PLAYERS_MODE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewVolume]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWVOLUME
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewFADING]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWFADING
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsLyrics]
+Texts = 1
+
+[OptionsLyricsBackground]
+Tex=OptionsBG
+
+[OptionsLyricsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsLyricsStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsLyricsStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsLyricsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsLyricsText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_LYRICS_WHEREAMI
+
+[OptionsLyricsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_LYRICS_DESC
+
+[OptionsLyricsText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsLyricsText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsLyricsSelectLyricsFont]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_FONT
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectLyricsEffect]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_EFFECT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectSolmization]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_SOLMIZATION
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsThemes]
+Texts = 5
+
+[OptionsThemesBackground]
+Tex=OptionsBG
+
+[OptionsThemesStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsThemesStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsThemesStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsThemesText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsThemesText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_THEMES_WHEREAMI
+
+[OptionsThemesText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_THEMES_DESC
+
+[OptionsThemesText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsThemesText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsThemesSelectTheme]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_THEME
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectSkin]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_SKIN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectColor]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_COLOR
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsRecord]
+Texts = 5
+
+[OptionsRecordBackground]
+Tex=OptionsBG
+
+[OptionsRecordStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsRecordStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsRecordStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsRecordText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsRecordText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_RECORD_WHEREAMI
+
+[OptionsRecordText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_RECORD_DESC
+
+[OptionsRecordText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsRecordText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsRecordSelectSlideCard]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CARD
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideInput]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_INPUT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelL]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELL
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelR]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELR
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordButtonExit]
+X = 40
+Y = 305
+W = 230
+H = 70
+Tex = MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsAdvanced]
+Texts = 5
+
+[OptionsAdvancedBackground]
+Tex=OptionsBG
+
+[OptionsAdvancedStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsAdvancedStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[OptionsAdvancedStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[OptionsAdvancedText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsAdvancedText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_ADVANCED_WHEREAMI
+
+[OptionsAdvancedText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_ADVANCED_DESC
+
+[OptionsAdvancedText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsAdvancedText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+
+#########unused at the moment#########
+#[OptionsAdvancedSelectLoadAnimation]
+#Tex =MainBar
+#TexSBG =SelectBG
+#Text=SING_OPTIONS_ADVANCED_LOADANIMATION
+#X = 40
+#Y = 85
+#W = 230
+#H = 70
+#SkipX = 50
+
+#Color = ColorDark
+#DColor = Gray
+#TColor = White
+#TDColor = White
+#SBGTex =MainBar
+#SBGColor = ColorDark
+#SBGDColor = Gray
+#STColor = White
+#STDColor = GrayDark
+
+[OptionsAdvancedSelectScreenFade]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_SCREENFADE
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectEffectSing]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_EFFECTSING
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectLineBonus]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_LINEBONUS
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectSlideOnSongClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_ADVANCED_ONSONGCLICK
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectAskbeforeDel]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_ASKBEFOREDEL
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectPartyPopup]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_PARTYPOPUP
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[Top5]
+Texts=1
+
+[Top5Background]
+Tex=Top5BG
+
+[Top5Text1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Align=0
+Text =SING_TOP_5_CHARTS
+
+[Top5TextArtistTitle]
+X =70
+Y =53
+Color =White
+Font =0
+Size =10
+Align =0
+Text =artist - title
+
+[Top5Text4]
+X =70
+Y =73
+Color=White
+Font =0
+Size =10
+Align=0
+Text =SING_OPTIONS_GAME_DIFFICULTY
+
+[Top5TextLevel]
+X =270
+Y =73
+Color =White
+Font =0
+Size =10
+Align =1
+Text =easy
+
+[Top5Static1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[Top5Static2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[Top5Static3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[Top5Text2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_TOP_5_CHARTS_WHEREAMI
+
+[Top5Static4]
+X =260
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[Top5Text3]
+X =290
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_TOP_5_CHARTS_CONTINUE
+
+[Top5TextName1]
+X =150
+Y =190
+Color =White
+Font =0
+Size =14
+Align =0
+Text =1. Player1
+
+[Top5TextName2]
+X =150
+Y =240
+Color =White
+Font =0
+Size =14
+Align =0
+Text =2. Player2
+
+[Top5TextName3]
+X =150
+Y =290
+Color =White
+Font =0
+Size =14
+Align =0
+Text =3. Player3
+
+[Top5TextName4]
+X =150
+Y =340
+Color =White
+Font =0
+Size =14
+Align =0
+Text =4. Player4
+
+[Top5TextName5]
+X =150
+Y =390
+Color =White
+Font =0
+Size =14
+Align =0
+Text =5. Player5
+
+[Top5TextScore1]
+X =680
+Y =190
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore2]
+X =680
+Y =240
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore3]
+X =680
+Y =290
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore4]
+X =680
+Y =340
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore5]
+X =680
+Y =390
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextNumber1]
+X =120
+Y =193
+Color =White
+Font =1
+Size =9
+Align =1
+Text =1
+
+[Top5TextNumber2]
+X =120
+Y =243
+Color =White
+Font =1
+Size =9
+Align =1
+Text =2
+
+[Top5TextNumber3]
+X =120
+Y =293
+Color =White
+Font =1
+Size =9
+Align =1
+Text =3
+
+[Top5TextNumber4]
+X =120
+Y =343
+Color =White
+Font =1
+Size =9
+Align =1
+Text =4
+
+[Top5TextNumber5]
+X =120
+Y =393
+Color =White
+Font =1
+Size =9
+Align =1
+Text =5
+
+[Top5StaticNumber1]
+Tex=PlayerNumberBox
+X=100
+Y=186
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber2]
+Tex=PlayerNumberBox
+X=100
+Y=236
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber3]
+Tex=PlayerNumberBox
+X=100
+Y=286
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber4]
+Tex=PlayerNumberBox
+X=100
+Y=336
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber5]
+Tex=PlayerNumberBox
+X=100
+Y=386
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Level]
+Texts=5
+
+[LevelBackground]
+Tex=MainBG
+
+[LevelStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[LevelStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[LevelStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =MainIcon
+Type=Font Black
+
+[LevelStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[LevelStatic5]
+X =388
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[LevelText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=SING_MODE
+
+[LevelText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_DIFFICULTY_DESC
+
+[LevelText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_DIFFICULTY_WHEREAMI
+
+[LevelText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[LevelText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_DIFFICULTY_CONTINUE
+
+[LevelButtonEasy]
+X =180
+Y =270
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[LevelButtonMedium]
+X =335
+Y =270
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[LevelButtonHard]
+X =490
+Y =270
+W =150
+H =50
+Tex =Button
+Color =ColorDark
+DColor =ColorLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[LevelButtonEasyText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=SING_EASY
+
+[LevelButtonMediumText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=SING_MEDIUM
+
+[LevelButtonHardText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=SING_HARD
+
+[Name]
+Texts=2
+
+[NameBackground]
+Tex=MainBG
+
+[NameStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[NameStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[NameStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =MainIcon
+Type=Font Black
+
+[NameText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=SING_MODE
+
+[NameText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_PLAYER_DESC
+
+[NameText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_PLAYER_WHEREAMI
+
+[NameStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[NameText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[NameStatic5]
+X =388
+Y =553
+W =26
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Plain
+Style=5
+
+[NameText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_PLAYER_ENTER_NAME
+
+[NameStatic6]
+X =556
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[NameText6]
+X =586
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[NameButtonPlayer1]
+X =180
+Y =270
+W =150
+H =50
+Tex =Button
+Color =P1Dark
+DColor = P1Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer1Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer2]
+X =335
+Y =270
+W =150
+H =50
+Tex =Button
+Color =P2Dark
+DColor = P2Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer2Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer3]
+X =490
+Y =270
+W =150
+H =50
+Tex =Button
+Color =P3Dark
+DColor = P3Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer3Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer4]
+X =180
+Y =400
+W =150
+H =50
+Tex =Button
+Color =P4Dark
+DColor = P4Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer4Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer5]
+X =335
+Y =400
+W =150
+H =50
+Tex =Button
+Color =P5Dark
+DColor = P5Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer5Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[NameButtonPlayer6]
+X =490
+Y =400
+W =150
+H =50
+Tex =Button
+Color =P6Dark
+DColor = P6Light
+Type=Font Black
+Texts=1
+Reflection=1
+ReflectionSpacing=2
+
+[NameButtonPlayer6Text1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Color=White
+Text=
+
+[PartyNewRound]
+Texts =7
+
+[PartyNewRoundBackground]
+Tex=MainBG
+
+[PartyNewRoundStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyNewRoundText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyNewRoundText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_ROUND_DESC
+
+[PartyNewRoundText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_ROUND_WHEREAMI
+
+[PartyNewRoundText4]
+X =290
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_ROUND_LEGEND_CONTINUE
+
+[PartyNewRoundText5]
+X =460
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND
+Align=0
+
+[PartyNewRoundText6]
+X =600
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND_WINNER
+Align=0
+
+[PartyNewRoundText7]
+X =448
+Y =350
+Color =White
+Font =0
+Size =18
+Text =PARTY_ROUND
+Align=2
+
+[PartyNewRoundTextTeam1Players]
+X =30
+Y =137
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam2Players]
+X =30
+Y =218
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam3Players]
+X =30
+Y =299
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundStatic4]
+Tex =PartyRoundBG1
+X =450
+Y =103
+W = 330
+H = 24
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[PartyNewRoundStatic5]
+X =260
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[PartyNewRoundStatic6]
+Tex =PartyRoundBG3
+X =250
+Y =350
+W = 300
+H = 50
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[PartyNewRoundStatic7]
+Tex =PartyRoundBG4
+X =50
+Y =495
+W = 700
+H = 30
+Int=1
+Color =ColorLight
+Type=Font Black
+
+[PartyNewRoundStaticTeam1]
+Tex =PartyTeamButton1
+X =20
+Y =110
+W =400
+H =50
+Int=1
+Color =P1Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam2]
+Tex =PartyTeamButton1
+X =20
+Y =191
+W =400
+H =50
+Int=1
+Color =P2Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam3]
+Tex =PartyTeamButton1
+X =20
+Y =272
+W =400
+H =50
+Int=1
+Color =P3Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticNextPlayer1]
+Tex=PartyPlayerButton
+X=155
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P1Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer2]
+Tex=PartyPlayerButton
+X=325
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P2Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer3]
+Tex=PartyPlayerButton
+X=495
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P3Light
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyNewRoundTextRound1]
+X =460
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Round 1
+Align=0
+
+[PartyNewRoundTextRound2]
+X =460
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Round 2
+Align=0
+
+[PartyNewRoundTextRound3]
+X =460
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Round 3
+Align=0
+
+[PartyNewRoundTextRound4]
+X =460
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Round 4
+Align=0
+
+[PartyNewRoundTextRound5]
+X =460
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Round 5
+Align=0
+
+[PartyNewRoundTextRound6]
+X =460
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Round 6
+Align=0
+
+[PartyNewRoundTextRound7]
+X =460
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Round 7
+Align=0
+
+[PartyNewRoundTextWinner1]
+X =600
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Winner 1
+Align=0
+
+[PartyNewRoundTextWinner2]
+X =600
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Winner 2
+Align=0
+
+[PartyNewRoundTextWinner3]
+X =600
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Winner 3
+Align=0
+
+[PartyNewRoundTextWinner4]
+X =600
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Winner 4
+Align=0
+
+[PartyNewRoundTextWinner5]
+X =600
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Winner 5
+Align=0
+
+[PartyNewRoundTextWinner6]
+X =600
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Winner 6
+Align=0
+
+[PartyNewRoundTextWinner7]
+X =600
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Winner 7
+Align=0
+
+[PartyNewRoundStaticRound1]
+Tex =PartyRoundBG2
+X =450
+Y =135
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound2]
+Tex =PartyRoundBG2
+X =450
+Y =164
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound3]
+Tex =PartyRoundBG2
+X =450
+Y =193
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound4]
+Tex =PartyRoundBG2
+X =450
+Y =222
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound5]
+Tex =PartyRoundBG2
+X =450
+Y =251
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound6]
+Tex =PartyRoundBG2
+X =450
+Y =280
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundStaticRound7]
+Tex =PartyRoundBG2
+X =450
+Y =309
+W = 330
+H = 20
+Color =ColorLight
+Type =Font Black
+
+[PartyNewRoundTextNextRound]
+X =400
+Y =495
+Color =White
+Font =0
+Size =10
+Text =Next Round
+Align=1
+
+[PartyNewRoundTextNextRoundNo]
+X =457
+Y =350
+Color =White
+Font =0
+Size =18
+Text =99
+Align=0
+
+[PartyNewRoundTextScoreTeam1]
+X =390
+Y =110
+Color =White
+Font =0
+Size =17
+Text =3000
+Align=1
+
+[PartyNewRoundTextScoreTeam2]
+X =390
+Y =191
+Color =White
+Font =0
+Size =17
+Text =2000
+Align=1
+
+[PartyNewRoundTextScoreTeam3]
+X =390
+Y =272
+Color =White
+Font =0
+Size =17
+Text =1000
+Align=1
+
+[PartyNewRoundTextNameTeam1]
+X =30
+Y =108
+Color =White
+Font =0
+Size =12
+Text =Team 1
+Align=0
+
+[PartyNewRoundTextNameTeam2]
+X =30
+Y =189
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyNewRoundTextNameTeam3]
+X =30
+Y =270
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyNewRoundTextNextPlayer1]
+X =230
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 1
+Align=1
+
+[PartyNewRoundTextNextPlayer2]
+X =400
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 2
+Align=1
+
+[PartyNewRoundTextNextPlayer3]
+X =570
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 3
+Align=1
+
+
+[PartyScore]
+Texts=5
+
+[PartyScoreBackground]
+Tex=PartyBG
+
+[PartyScoreDecoTextures]
+ChangeTextures =1
+
+FirstTexture =PartyScoreDeco
+FirstTyp =Font Black
+FirstColor =Gold
+
+SecondTexture =PartyScoreDeco
+SecondTyp =Font Black
+SecondColor =Silver
+
+ThirdTexture =PartyScoreDeco
+ThirdTyp =Font Black
+ThirdColor =Bronze
+
+[PartyScoreStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyScoreStatic4]
+X =260
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[PartyScoreText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyScoreText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_SCORE_DESC
+
+[PartyScoreText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_SCORE_WHEREAMI
+
+[PartyScoreText4]
+X =290
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_LEGEND_CONTINUE
+
+[PartyScoreStatic5]
+Tex =PartyScoreBG1
+X =50
+Y =100
+W = 700
+H = 80
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[PartyScoreStatic6]
+Tex =PartyScoreBG2
+X =50
+Y =495
+W = 700
+H = 20
+Int=1
+Color =ColorLight
+Type=Font Black
+
+[PartyScoreText5]
+X =400
+Y =136
+Color =White
+Font =0
+Size =15
+Text =PARTY_SCORE_WINS2
+Align=1
+
+[PartyScoreTextWinner]
+X =400
+Y =98
+Color =White
+Font =0
+Size =18
+Text =The Winner is...
+Align=1
+
+[PartyScoreTextScoreTeam1]
+X =568
+Y =198
+Color =White
+Font =0
+Size =12
+Text =3000
+Align=2
+
+[PartyScoreTextScoreTeam2]
+X =568
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyScoreTextScoreTeam3]
+X =568
+Y =398
+Color =White
+Font =0
+Size =12
+Text =1000
+Align=2
+
+[PartyScoreTextNameTeam1]
+X =188
+Y =198
+Font=0
+Size=12
+Align=0
+Text=Team 1
+Color=White
+
+[PartyScoreTextNameTeam2]
+X =188
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyScoreTextNameTeam3]
+X =188
+Y =398
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyScoreStaticTeam1]
+X =188
+Y =230
+W =380
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam1BG]
+Tex=PartyTeamButton2
+X=178
+Y=200
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam1Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 191
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam2]
+X =188
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam2BG]
+Tex=PartyTeamButton2
+X=178
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam2Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam3]
+X =188
+Y =430
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam3BG]
+Tex=PartyTeamButton2
+X=178
+Y=400
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam3Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 391
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyWin]
+Texts=4
+
+[PartyWinBackground]
+Tex=PartyBG
+
+[PartyWinStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyWinStatic4]
+X =260
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+
+[PartyWinText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyWinText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_WIN_DESC
+
+[PartyWinText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_WIN_WHEREAMI
+
+[PartyWinText4]
+X =290
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_WIN_LEGEND_CONTINUE
+
+#[PartyWinTextWinner]
+#X =150
+#Y =120
+#Color =White
+#Font =1
+#Size =14
+#Text =The Winner is...
+#Align=0
+
+[PartyWinTextScoreTeam1]
+X =699
+Y =183
+Color =White
+Font =0
+Size =19
+Text =3000
+Align=2
+
+[PartyWinTextScoreTeam2]
+X =669
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyWinTextScoreTeam3]
+X =649
+Y =398
+Color =White
+Font =0
+Size =9
+Text =1000
+Align=2
+
+[PartyWinTextNameTeam1]
+X =169
+Y =183
+Font=0
+Size=19
+Align=0
+Text=Team 1
+Color=White
+
+[PartyWinTextNameTeam2]
+X =289
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyWinTextNameTeam3]
+X =369
+Y =398
+Color =White
+Font =0
+Size =9
+Text =Team 3
+Align=0
+
+[PartyWinStaticTeam1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BG]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank2]
+Tex=PartyTeamButton3
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank3]
+Tex=PartyTeamButton3
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyWinStaticTeam1Deco]
+Tex =PartyWinDeco1
+X = 91
+Y = 176
+W = 79
+H = 79
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BG]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamButton3
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank1]
+Tex=PartyTeamButton4
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank2]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank3]
+Tex=PartyTeamButton4
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Deco]
+Tex =PartyWinDeco2
+X = 226
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Silver
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BG]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank2]
+Tex=PartyTeamButton5
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank3]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Deco]
+Tex =PartyWinDeco3
+X = 316
+Y = 391
+W = 54
+H = 54
+Type =Font Black
+Color =Bronze
+Reflection=1
+ReflectionSpacing=3
+
+[PartyOptions]
+Texts = 5
+
+[PartyOptionsBackground]
+Tex=PartyBG
+
+[PartyOptionsStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyOptionsStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[PartyOptionsStatic5]
+X =388
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[PartyOptionsText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyOptionsText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_OPTIONS_DESC
+
+[PartyOptionsText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_OPTIONS_WHEREAMI
+
+[PartyOptionsText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyOptionsText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[PartyOptionsSelectLevel]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_DIFFICULTY
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectRounds]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_ROUNDS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectTeams]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers1]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER1
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER2
+X = 40
+Y = 415
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers3]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER3
+X = 40
+Y = 470
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+
+
+[PartyPlayer]
+Texts=6
+
+[PartyPlayerBackground]
+Tex=PartyBG
+
+[PartyPlayerStatic1]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerStatic2]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerStatic3]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyPlayerStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[PartyPlayerStatic5]
+X =388
+Y =553
+W =26
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Plain
+Style=5
+
+[PartyPlayerStatic6]
+X =556
+Y =553
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Plain
+Style=5
+
+[PartyPlayerText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyPlayerText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_PLAYER_DESC
+
+[PartyPlayerText3]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_PLAYER_WHEREAMI
+
+[PartyPlayerText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyPlayerText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_ENTER_NAME
+
+[PartyPlayerText6]
+X =586
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_LEGEND_CONTINUE
+
+[PartyPlayerTeam1Name]
+Tex=PartyTeamButton2
+X=85
+Y=100
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Dark
+
+[PartyPlayerTeam1NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 1
+Color=White
+
+[PartyPlayerPlayer1Name]
+Tex=Button
+X=85
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer1NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 1
+Color=White
+
+[PartyPlayerPlayer2Name]
+Tex=Button
+X=245
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer2NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 2
+Color=White
+
+[PartyPlayerPlayer3Name]
+Tex=Button
+X=405
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer3NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 3
+Color=White
+
+[PartyPlayerPlayer4Name]
+Tex=Button
+X=565
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer4NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 4
+Color=White
+
+[PartyPlayerTeam2Name]
+Tex=PartyTeamButton2
+X=85
+Y=240
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Dark
+
+[PartyPlayerTeam2NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 2
+Color=White
+
+[PartyPlayerPlayer5Name]
+Tex=Button
+X=85
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer5NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 5
+Color=White
+
+[PartyPlayerPlayer6Name]
+Tex=Button
+X=245
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer6NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 6
+Color=White
+
+[PartyPlayerPlayer7Name]
+Tex=Button
+X=405
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer7NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 7
+Color=White
+
+[PartyPlayerPlayer8Name]
+Tex=Button
+X=565
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer8NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 8
+Color=White
+
+[PartyPlayerTeam3Name]
+Tex=Button
+Tex=PartyTeamButton2
+X=85
+Y=380
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Dark
+
+[PartyPlayerTeam3NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 3
+Color=White
+
+[PartyPlayerPlayer9Name]
+Tex=Button
+X=85
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer9NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 9
+Color=White
+
+[PartyPlayerPlayer10Name]
+Tex=Button
+X=245
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer10NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 10
+Color=White
+
+[PartyPlayerPlayer11Name]
+Tex=Button
+X=405
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer11NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 11
+Color=White
+
+[PartyPlayerPlayer12Name]
+Tex=Button
+X=565
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer12NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 12
+Color=White
+
+
+[SongMenu]
+Texts=0
+Statics=1
+
+[SongMenuButton1]
+X = 510
+Y = 165
+W = 270
+H = 25
+Tex =Rectangle
+Color =ColorLight
+DColor = ColorDark
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton1Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_PLAY
+Align=0
+Z=0.99
+
+[SongMenuButton2]
+X = 510
+Y = 195
+W = 270
+H = 25
+Tex =Rectangle
+Color =ColorLight
+DColor = ColorDark
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton2Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_EDIT
+Align=0
+Z=0.99
+
+[SongMenuButton3]
+X = 510
+Y = 225
+W = 270
+H = 25
+Tex =Rectangle
+Color =ColorLight
+DColor = ColorDark
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton3Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_MODI
+Align=0
+Z=0.99
+
+[SongMenuButton4]
+X = 510
+Y = 255
+W = 270
+H = 25
+Tex = Rectangle
+Color =ColorLight
+DColor = ColorDark
+Type=Font Black
+Texts=1
+Z = 0.98
+
+[SongMenuButton4Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_CANCEL
+Align=0
+Z=0.99
+
+[SongMenuSelectSlide3]
+Tex = Rectangle
+TexSBG = SongMenuSelectBG
+Text =
+X = 510
+Y = 225
+W = 0
+H = 25
+Z = 0.98
+SkipX = 0
+SBGW=270
+
+TextSize=8
+
+Color =ColorLight
+DColor = ColorDark
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorLight
+SBGDColor = ColorDark
+STColor = White
+STDColor = GrayDark
+
+[SongMenuTextMenu]
+X =539
+Y =125
+Color=White
+Font =0
+Size =14
+Text=MENU
+Align=0
+Z=0.99
+
+[SongMenuStatic2]
+X =513
+Y =135
+W =21
+H =21
+Color =White
+Tex =IconSongMenu
+Type=Font Black
+Z=0.98
+
+[SongMenuStatic1]
+Tex =SongMenuBG
+X =498
+Y =120
+W =300
+H =200
+Z =0.94
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[SongJumpto]
+Texts=0
+Statics=1
+
+[SongJumptoStatic1]
+Tex =JumpToBG
+X =221
+Y =175
+W =355
+H =175
+Z =0.98
+Int=1
+Color =ColorDark
+Type=Font Black
+
+[SongJumptoStatic2]
+X =234
+Y =185
+W =21
+H =21
+Color =White
+Tex =MainSearch
+Type=Font Black
+Z=0.99
+
+[SongJumptoText1]
+X =310
+Y =175
+Color=White
+Font =0
+Size =14
+Text=SONG_JUMPTO_TYPE_DESC
+Align=0
+Z=0.99
+
+[SongJumptoSelectSlideType]
+Tex = button
+TexSBG = mainicon
+#Text = SONG_JUMPTO_TYPE_DESC
+Font=1
+X = 242
+Y = 205
+Z = 0.99
+W = 0
+H = 30
+SkipX = 4
+SBGW= 300
+Fields=2
+DColor = ColorLight
+TColor = White
+TDColor = White
+SBGTex = button
+SBGDColor = ColorLightest
+STColor = White
+STDColor = ColorLightest
+
+[SongJumptoButtonSearchText]
+X = 250
+Y = 215
+Z = 0.99
+W = 160
+H = 50
+Size=14
+Font=1
+Align=0
+
+[SongJumptoTextFound]
+X =234
+Y =295
+Color=White
+Font =0
+Size =8
+Text=SONG_JUMPTO_HELP
+Align=0
+Z=0.99
+
+[StatMain]
+Texts=0
+Statics=0
+
+[StatMainBackground]
+Tex=MainBG
+
+[StatMainButtonScores]
+X =589
+Y =100
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonScoresText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SCORES
+Color=White
+
+[StatMainButtonSingers]
+X =589
+Y =160
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSingersText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SINGERS
+Color=White
+
+[StatMainButtonSongs]
+X =589
+Y =220
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSongsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_SONGS
+Color=White
+
+[StatMainButtonBands]
+X =589
+Y =280
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonBandsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_BANDS
+Color=White
+
+[StatMainButtonExit]
+X =589
+Y =340
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatMainTextOverview]
+X =45
+Y =125
+W =510
+Color=White
+Font =0
+Size =9
+Align=0
+Text=
+
+[StatMainStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =StatIcon
+Type=Font Black
+
+[StatMainStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatMainStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatMainStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[StatMainStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[StatMainStatic6]
+X =40
+Y =100
+W =520
+H =20
+Tex=StatMainBG1
+Color =ColorLight
+Type=Font Black
+
+[StatMainStatic7]
+X =40
+Y =120
+W =520
+H =300
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatMainStatic8]
+X =40
+Y =420
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+[StatMainText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=STAT_MAIN
+Align=0
+
+[StatMainText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=STAT_MAIN_WHEREAMI
+
+[StatMainText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=STAT_MAIN_DESC
+
+[StatMainText4]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatMainText5]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[StatDetail]
+Texts=0
+Statics=0
+
+[StatDetailBackground]
+Tex=MainBG
+
+[StatDetailButtonNext]
+X =589
+Y =100
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonNextText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_NEXT
+Color=White
+
+[StatDetailButtonPrev]
+X =589
+Y =160
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonPrevText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_PREV
+Color=White
+
+[StatDetailButtonReverse]
+X =589
+Y =220
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonReverseText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_REVERSE
+Color=White
+
+[StatDetailButtonExit]
+X =589
+Y =280
+W =190
+H =50
+Tex =Button
+Color =ColorDark
+DColor = ColorLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatDetailTextDescription]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=
+
+[StatDetailTextPage]
+X = 546
+Y = 98
+Color= Black
+Font = 0
+Size = 5
+Align=2
+Text=
+
+[StatDetailTextList1]
+X = 45
+Y = 122
+Color=White
+Font = 0
+Size = 7
+Text=Stat1
+
+[StatDetailTextList2]
+X = 45
+Y = 160
+Color=White
+Font = 0
+Size = 7
+Text=Stat2
+
+[StatDetailTextList3]
+X = 45
+Y = 198
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList4]
+X = 45
+Y = 236
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList5]
+X = 45
+Y = 274
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList6]
+X = 45
+Y = 312
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList7]
+X = 45
+Y = 350
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList8]
+X = 45
+Y = 388
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList9]
+X = 45
+Y = 426
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList10]
+X = 45
+Y = 464
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =StatIcon
+Type=Font Black
+
+[StatDetailStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatDetailStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatDetailStatic4]
+X =260
+Y =553
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Plain
+Style=5
+
+[StatDetailStatic5]
+X =388
+Y =553
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Plain
+
+[StatDetailStatic6]
+X =40
+Y =100
+W =520
+H =24
+Tex=StatDetailBG1
+Color =ColorLight
+Type=Font Black
+
+[StatDetailStatic7]
+X =40
+Y =124
+W =520
+H =376
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatDetailStatic8]
+X =40
+Y =500
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+
+[StatDetailText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=STAT_DETAIL
+Align=0
+
+[StatDetailText2]
+X =238
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=STAT_DETAIL_WHEREAMI
+
+[StatDetailText3]
+X =294
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatDetailText4]
+X =418
+Y =552
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[CheckPopup]
+Texts=1
+Statics=1
+
+[CheckPopupButton1]
+X = 285
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=JA
+Align=1
+Z=1
+
+[CheckPopupButton2]
+X = 415
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton2Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=NEIN
+Align=1
+Z=1
+
+[CheckPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[CheckPopupText1]
+X =282
+Y =147
+Color=White
+Font =0
+Size =10
+Text=MSG_QUESTION_TITLE
+Align=0
+Z=1
+
+[CheckPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =GrayPopup
+Type=Font Black
+
+[CheckPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[CheckPopupStatic3]
+Tex =IconQuestion
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopup]
+Texts=1
+Statics=1
+
+[ErrorPopupButton1]
+X = 350
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[ErrorPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=OK
+Align=1
+Z=1
+
+[ErrorPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[ErrorPopupText1]
+X =282
+Y =148
+Color=White
+Font =0
+Size =10
+Text=MSG_ERROR_TITLE
+Align=0
+Z=1
+
+[ErrorPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =GrayPopup
+Type=Font Black
+
+[ErrorPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopupStatic3]
+Tex =IconError
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black \ No newline at end of file
diff --git a/Themes/Orange.ini b/Themes/Orange.ini
new file mode 100644
index 00000000..838b3cbc
--- /dev/null
+++ b/Themes/Orange.ini
@@ -0,0 +1,8088 @@
+;0.5.1 Mod
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Theme]
+Name=Orange
+Creator=!Skar!™
+
+[Colors]
+White = 255 255 255
+LightBlue = 119 187 210
+DarkBlue = 28 126 171
+LightRed = 170 146 146
+DarkRed = 155 113 113
+LightGreen = 136 168 136
+DarkGreen = 106 152 104
+LightPurple = 155 136 168
+DarkPurple = 145 104 152
+LightOrange = 168 155 136
+DarkOrange = 151 131 76
+LightYellow = 168 168 136
+DarkYellow = 150 151 76
+Turkis = 13 186 167
+GrayLightest = 223 223 223
+GrayLight = 191 191 191
+Gray = 127 127 127
+GrayDark = 63 63 63
+Black = 0 0 0
+GrayPopup = 51 51 51
+Gold = 255 223 31
+Silver = 223 223 223
+Bronze = 205 127 50
+LightOrange = 254 181 69
+DarkOrange = 254 154 69
+
+[Loading]
+Fade = 1
+
+[LoadingBackground]
+Tex=LoadingBG
+
+[Main]
+Texts =2
+Statics=4
+
+[MainBackground]
+Tex=MainBG
+
+[MainStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic2]
+X =254
+Y =0
+W =546
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic3]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[MainText1]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_MENU
+
+[MainText2]
+X =295
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[MainStatic4]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+Style=5
+
+[MainTextDescriptionLong]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=
+
+[MainButtonSolo]
+X =0
+Y =80
+W = -150
+H = 30
+Tex = Button-m-1
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[MainButtonSoloText1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_SING
+Color=Black
+
+[MainButtonMulti]
+X = 0
+Y = 110
+W = -150
+H = 30
+Tex = Button-m-2
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[MainButtonMultiText1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_MULTI
+Color=Black
+
+[MainButtonCollection1]
+X = 0
+Y = 140
+W = -150
+H = 30
+Tex = Button-m-3
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+FirstChild=3
+
+[MainButtonCollection1Text1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_TOOLS
+Color=Black
+
+[MainButtonStats]
+X =150
+Y =140
+W =120
+H =22
+Tex =ButtonCollection
+Color = LightOrange
+DColor = DarkOrange
+Type=Font Black
+Texts=1
+Reflection=0
+Parent=1
+
+[MainButtonStatsText1]
+X =60
+Y =-1
+Font=0
+Size=8
+Align=1
+Text=SING_STATS
+Color=GrayDark
+
+[MainButtonEditor]
+X =150
+Y =162
+W =120
+H =22
+Tex =ButtonCollection
+Color = LightOrange
+DColor = DarkOrange
+Type=Font Black
+Texts=1
+Reflection=0
+Parent=1
+
+[MainButtonEditorText1]
+X =60
+Y =-1
+Font=0
+Size=8
+Align=1
+Text=SING_EDITOR
+Color=GrayDark
+
+[MainButtonOptions]
+X =150
+Y =184
+W =120
+H =22
+Tex =ButtonCollection
+Color = LightOrange
+DColor = DarkOrange
+Type=Font Black
+Texts=1
+Reflection=0
+Parent=1
+
+[MainButtonOptionsText1]
+X =60
+Y =-1
+Font=0
+Size=8
+Align=1
+Text=SING_OPTIONS
+Color=GrayDark
+
+[MainButtonExit]
+X =0
+Y =170
+W = -150
+H = 30
+Tex = Button-m-4
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[MainButtonExitText1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_EXIT
+Color=Black
+
+
+##############Songscreen##################
+
+
+[Song]
+Texts =4
+
+[SongBackground]
+Tex=SongBG
+
+[SongCover]
+X=303
+Y=125
+W=320
+H=190
+Style=5
+Reflections=1
+
+[SongEqualizer]
+Visible=1
+Direction=1
+Color=DarkOrange
+Alpha=1
+X=2
+Y=584
+Z=0
+PieceW=14
+PieceH=14
+Space=2
+Bands=50
+Length=12
+
+[SongVideoIcon]
+X =299
+Y =487
+W =32
+H =32
+Z=1
+Color=DarkOrange
+Tex =VideoIcon
+Type=Font Black
+
+[SongStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[SongStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[SongStatic3]
+X =250
+Y =120
+W =300
+H =200
+Z =0.5
+Color =LightOrange
+Tex =SongSelection1
+Type=Font Black
+
+[SongStatic4]
+X =298
+Y =320
+W =200
+H =200
+Z=0.98
+Color =LightOrange
+Tex =SongSelection2
+Type=Font Black
+
+[SongTextCat]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_SONG_SELECTION_DESC
+
+[SongTextArtist]
+X =400
+Y =320
+W = 190
+Color=White
+Font =1
+Size =9
+Align =1
+Text=
+
+[SongTextTitle]
+X =400
+Y =380
+W = 190
+Color=White
+Font =0
+Size =9
+Align =1
+Text=
+
+[SongTextNumber]
+X =490
+Y =495
+Color=Black
+Font =0
+Size =8
+Align =2
+Text=
+
+#Variable statics and texts for song-screen in sing- and partymode
+# There can be an unlimited Number of Statics and Texts, As long
+# as the numbers are in order.
+# Statics that are shown in PartyMode Only are Named_
+# SongStaticParty[No]
+# Texts that are shown in PartyMode Only are Named_
+# SongTextParty[No]
+# Statics that are shown in Normal Mode Only are Named_
+# SongStaticNonParty[No]
+# Texts that are shown in Normal Mode Only are Named_
+# SongTextNonParty[No]
+#Here are the ones for singmode
+
+[SongStaticNonParty1]
+X =47
+Y =466
+W =27
+H =27
+Color =GrayLight
+Tex =SongCD
+Type=Font Black
+
+[SongStaticNonParty2]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonAlt
+Color =Gray
+Type=Font Black
+
+[SongStaticNonParty3]
+X =300
+Y =5
+W =26
+H =22
+Tex=ButtonAZ
+Color =Gray
+Type=Font Black
+
+[SongStaticNonParty4]
+X =425
+Y =5
+W =22
+H =22
+Tex=ButtonM
+Color =Gray
+Type=Font Black
+
+[SongStaticNonParty5]
+X =515
+Y =5
+W =22
+H =22
+Tex=ButtonJ
+Color =Gray
+Type=Font Black
+
+[SongStaticNonParty6]
+X =679
+Y =5
+W =22
+H =22
+Tex=ButtonP
+Color =Gray
+Type=Font Black
+
+#Texts Non Party
+[SongTextNonParty1]
+X =83
+Y =450
+Color=GrayLight
+Font =0
+Size =20
+Text=song
+Align=0
+
+[SongTextNonParty2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_SONG_SELECTION_WHEREAMI
+
+[SongTextNonParty3]
+X =288
+Y =8
+Color=Black
+Font =1
+Size =5
+Align=0
+Text=+
+
+[SongTextNonParty4]
+X =330
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_GOTO
+
+[SongTextNonParty5]
+X =450
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_MENU
+
+[SongTextNonParty6]
+X =540
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SONG_JUMPTO_DESC
+
+[SongTextNonParty7]
+X =705
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_PLAYLIST
+
+[SongTextNonParty8]
+X =83
+Y =478
+Color=GrayLight
+Font =0
+Size =20
+Text=selection
+Align=0
+
+
+#and theese are the ones for partymode
+
+[SongStaticParty1]
+X =47
+Y =466
+W =27
+H =27
+Color =GrayLight
+Tex =PartyIcon
+Type=Font Black
+
+[SongStaticParty2]
+X =260
+Y =5
+W =26
+H =22
+Tex=Button13
+Color =Gray
+Type=Font Black
+
+[SongStaticParty3]
+X =400
+Y =5
+W =22
+H =22
+Tex=ButtonM
+Color =Gray
+Type=Font Black
+
+[SongStaticParty4]
+X =540
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+
+#Texts for Party Mode
+
+[SongTextParty1]
+X =83
+Y =446
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =GrayLight
+Text=party
+
+[SongTextParty2]
+X =83
+Y =478
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =GrayLight
+Text=mode
+
+[SongTextParty3]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_SONG_WHEREAMI
+
+[SongTextParty4]
+X =288
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SONG_MENU_NAME_PARTY_JOKER
+
+[SongTextParty5]
+X =426
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_MENU
+
+[SongTextParty6]
+X =570
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_LEGEND_CONTINUE
+
+
+
+#variable statics end
+
+
+# Jokers, 5 for each team, only shown in party Mode
+[SongStaticTeam1Joker1]
+Tex =Joker
+X =530
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker2]
+Tex =Joker
+X =580
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker3]
+Tex =Joker
+X =630
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker4]
+Tex =Joker
+X =680
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker5]
+Tex =Joker
+X =730
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker1]
+Tex =Joker
+X =530
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker2]
+Tex =Joker
+X =580
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker3]
+Tex =Joker
+X =630
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker4]
+Tex =Joker
+X =680
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker5]
+Tex =Joker
+X =730
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker1]
+Tex =Joker
+X =530
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker2]
+Tex =Joker
+X =580
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker3]
+Tex =Joker
+X =630
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker4]
+Tex =Joker
+X =680
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker5]
+Tex =Joker
+X =730
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+
+##################### Sing Screen ###################
+
+
+[Sing]
+Texts =1
+
+
+[SingText1]
+Text =SING_TIME
+X =21
+Y =574
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingStatic1]
+;TextBG
+Tex =LyricBar
+X =10
+Y =490
+W =780
+H =85
+Color =White
+Type=Font Black
+
+[SingStatic2]
+;TimeBar
+Tex =TimeBar1
+X =10
+Y =575
+W =780
+H =16
+Color =Black
+Type=Font Black
+
+[SingTimeProgress]
+X =70
+Y =580
+W =652
+H =7
+Color=White
+
+[SingStatic3]
+;the thing behind the time progress
+Tex =TimeBar2
+X =70
+Y =580
+W =652
+H =7
+Color=GrayDark
+Type=Font Black
+
+[SingTimeText]
+Text =SING_TIME
+X =754
+Y =574
+Font =1
+Size =6
+Color =White
+Align=1
+
+# O N E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#PlayerOne
+[SingP1Static]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1Text]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1Static2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1SingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T W O P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1TwoPStatic]
+Tex =P
+X =20
+Y =117
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPText]
+Text =P1
+X =26
+Y =122
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1TwoPStatic2]
+Tex =ScoreBG
+X =680
+Y =102
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPTextScore]
+Text =00000
+X =690
+Y =104
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1TwoPSingBar]
+X =680
+Y =136
+W =100
+H =8
+
+#Player Two
+[SingP2RStatic]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P2Dark
+Type=Transparent
+
+[SingP2RText]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP2RStatic2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2RTextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2RSingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T H R E E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1ThreePStatic]
+Tex =P
+X =16
+Y =59
+W =50
+H =54
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePText]
+Text =P1
+X =27
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP1ThreePStatic2]
+Tex =ScoreBG
+X =75
+Y =61
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePTextScore]
+Text =00000
+X =85
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1ThreePSingBar]
+X =75
+Y =95
+W =100
+H =8
+
+#Player Two
+[SingP2MStatic]
+Tex =P
+X =311
+Y =59
+W =50
+H =54
+Color =P2Dark
+Type=Transparent
+
+[SingP2MText]
+Text =P2
+X =321
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP2MStatic2]
+Tex =ScoreBG
+X =370
+Y =61
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2MTextScore]
+Text =00000
+X =380
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2MSingBar]
+X =370
+Y =95
+W =100
+H =8
+
+#Player Three
+[SingP3RStatic]
+Tex =P
+X =611
+Y =59
+W =50
+H =54
+Color =P3Dark
+Type=Transparent
+
+[SingP3RText]
+Text =P3
+X =621
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP3RStatic2]
+Tex =ScoreBG
+X =670
+Y =61
+W =100
+H =34
+Color =P3Dark
+Type=Transparent
+
+[SingP3RTextScore]
+Text =00000
+X =680
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP3SingBar]
+X =670
+Y =95
+W =100
+H =8
+
+
+
+############### Score #####################
+
+
+
+[Score]
+Texts =1
+
+[ScoreBackground]
+Tex=ScoreScreenBG
+
+[ScoreText1]
+X =68
+Y =30
+Color=GrayLight
+Font =0
+Size =20
+Text=SONG_SCORE
+Align=0
+
+[ScoreTextArtistTitle]
+X =70
+Y =77
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=ArtistTitle
+
+[ScoreStatic1]
+X =32
+Y =46
+W =27
+H =27
+Color =GrayLight
+Tex =ScoreIcon
+Type=Font Black
+
+[ScoreStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreText2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SONG_SCORE_WHEREAMI
+
+[ScoreStatic4]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+
+[ScoreText3]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+#end of main stuff
+
+# # # # # # # # # # # # # # # # # # One Player Score # # # # # # # # # # # #
+[ScoreTextName1]
+X =175
+Y =260
+Font =0
+Size =14
+Text =P1
+Color =Black
+Align=0
+
+[ScoreTextScore1]
+X =175
+Y =430
+Color =Black
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes1]
+X =175
+Y =340
+Color =Black
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore1]
+X =465
+Y =340
+Color =Black
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextLineBonus1]
+X =175
+Y =370
+Color =Black
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore1]
+X =465
+Y =370
+Color =Black
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextGoldenNotes1]
+X =175
+Y =400
+Color =Black
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore1]
+X =465
+Y =400
+Color =Black
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextTotal1]
+X =205
+Y =460
+Color =Black
+Font =0
+Size =14
+Text=SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore1]
+X =465
+Y =460
+Color =Black
+Font =0
+Size =14
+Align =2
+Text =0
+
+#Lines
+[ScorePlayer1Static1]
+Tex =ScoreLine
+X =173
+Y =338
+W =295
+H =2
+Color =GrayLight
+Type =Font Black
+
+[ScorePlayer1Static2]
+Tex =ScoreLine
+X =173
+Y =368
+W =295
+H =2
+Color =GrayLight
+Type =Font Black
+
+[ScorePlayer1Static3]
+Tex =ScoreLine
+X =173
+Y =398
+W =295
+H =2
+Color =GrayLight
+Type =Font Black
+
+[ScorePlayer1Static4]
+Tex =ScoreLine
+X =173
+Y =428
+W =295
+H =2
+Color =GrayLight
+Type =Font Black
+
+[ScorePlayer1Static5]
+Tex =ScoreLine
+X =173
+Y =458
+W =295
+H =4
+Type =Font Black
+Color =GrayLight
+
+[ScoreStaticBoxDark1]
+Tex =PlayerNumberBox
+X =175
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Text1]
+X =179
+Y =472
+W =30
+H =30
+Z=1
+Color=Black
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel1]
+Tex =ScoreLevel
+X =475
+Y =160
+W =150
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =130
+W =150
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel1]
+Tex =ScoreLevel
+X =475
+Y =410
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =380
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer1Static6]
+Tex =ScoreEndCap
+X =494
+Y =460
+W =112
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Static7]
+Tex =ScoreLine
+X =493
+Y =460
+W =114
+H =2
+Color =GrayLight
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+
+# # # # # # # # # # # # # # # # # # Two Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName2]
+X =20
+Y =260
+Font =0
+Size =14
+Text =P1
+Color =Black
+Align=0
+
+[ScoreTextScore2]
+X =20
+Y =430
+Color =Black
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes2]
+X =20
+Y =340
+Color =Black
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore2]
+X =300
+Y =340
+Color =Black
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextLineBonus2]
+X =20
+Y =370
+Color =Black
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore2]
+X =300
+Y =370
+Color =Black
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextGoldenNotes2]
+X =20
+Y =400
+Color =Black
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore2]
+X =300
+Y =400
+Color =Black
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextTotal2]
+X =50
+Y =460
+Color =Black
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore2]
+X =300
+Y =460
+Color =Black
+Font =0
+Size =14
+Align =2
+Text =00000
+
+# Lines
+[ScorePlayer2Static1]
+Tex =ScoreLine
+X =20
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer2Static2]
+Tex =ScoreLine
+X =20
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer2Static3]
+Tex =ScoreLine
+X =20
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer2Static4]
+Tex =ScoreLine
+X =20
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer2Static5]
+Tex =ScoreLine
+X =20
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =GrayLight
+
+[ScoreStaticBoxDark2]
+Tex =PlayerNumberBox
+X =20
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Text1]
+X =24
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel2]
+Tex =ScoreLevel
+X =293
+Y =160
+W =120
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =130
+W =120
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScoreStaticLevel2]
+Tex =ScoreLevel
+X =293
+Y =410
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =380
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScorePlayer2Static6]
+Tex =ScoreEndCap
+X =308
+Y =460
+W =90
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Static7]
+Tex =ScoreLine
+X =307
+Y =460
+W =92
+H =2
+Color =GrayLight
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# P L A Y E R T W O
+[ScoreTextName3]
+X =780
+Y =260
+Font =0
+Size =14
+Text =P2
+Color =Black
+Align=2
+
+[ScoreTextScore3]
+X =780
+Y =430
+Color =Black
+Font =1
+Size =9
+Text =Tone Deaf
+Align=2
+
+[ScoreTextNotes3]
+X =780
+Y =340
+Color =Black
+Font =0
+Size =9
+Text =SING_NOTES
+Align=2
+
+[ScoreTextNotesScore3]
+X =500
+Y =340
+Color =Black
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextLineBonus3]
+X =780
+Y =370
+Color =Black
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=2
+
+[ScoreTextLineBonusScore3]
+X =500
+Y =370
+Color =Black
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextGoldenNotes3]
+X =780
+Y =400
+Color =Black
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=2
+
+[ScoreTextGoldenNotesScore3]
+X =500
+Y =400
+Color =Black
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextTotal3]
+X =750
+Y =460
+Color =Black
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=2
+Reflection=1
+ReflectionSpacing=4
+
+[ScoreTextTotalScore3]
+X =500
+Y =460
+Color =Black
+Font =0
+Size =14
+Align =0
+Text =00000
+Reflection=1
+ReflectionSpacing=4
+
+#Lines
+[ScorePlayer3Static1]
+Tex =ScoreLine
+X =500
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer3Static2]
+Tex =ScoreLine
+X =500
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer3Static3]
+Tex =ScoreLine
+X =500
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer3Static4]
+Tex =ScoreLine
+X =500
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer3Static5]
+Tex =ScoreLine
+X =500
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =GrayLight
+
+[ScoreStaticBoxDark3]
+Tex =PlayerNumberBox
+X =755
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Text1]
+X =759
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+#ScoreBar
+[ScoreStaticBackLevel3]
+Tex =ScoreLevel
+X =387
+Y =160
+W =120
+H =300
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =130
+W =120
+H =30
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel3]
+Tex =ScoreLevel
+X =387
+Y =410
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =380
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScorePlayer3Static6]
+Tex =ScoreEndCap
+X =402
+Y =460
+W =90
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Static7]
+Tex =ScoreLine
+X =401
+Y =460
+W =92
+H =2
+Color =GrayLight
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# # # # # # # # # # # # # # # # # # Three Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName4]
+X=20
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P1
+Color=P1Dark
+
+[ScoreTextNotes4]
+X=20
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=Black
+
+[ScoreTextNotesScore4]
+X=260
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Black
+
+[ScoreTextLineBonus4]
+X=20
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=Black
+
+[ScoreTextLineBonusScore4]
+X=260
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Black
+
+[ScoreTextGoldenNotes4]
+X=20
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=Black
+
+[ScoreTextGoldenNotesScore4]
+X=260
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Black
+
+[ScoreTextScore4]
+X=20
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=Black
+
+[ScoreTextTotal4]
+X=47
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=Black
+
+[ScoreTextTotalScore4]
+X=260
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=Black
+
+[ScoreStaticBoxDark4]
+Tex =PlayerNumberBox
+X =20
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer4Text1]
+X =24
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#lines
+[ScorePlayer4Static1]
+X=20
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer4Static2]
+X=20
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer4Static3]
+X=20
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer4Static4]
+X=20
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer4Static5]
+X=20
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+# P L A Y E R T W O
+[ScoreTextName5]
+X=280
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P2
+Color=P2Dark
+
+[ScoreTextNotes5]
+X=280
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=Black
+
+[ScoreTextNotesScore5]
+X=520
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Black
+
+[ScoreTextLineBonus5]
+X=280
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=Black
+
+[ScoreTextLineBonusScore5]
+X=520
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Black
+
+[ScoreTextGoldenNotes5]
+X=280
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=Black
+
+[ScoreTextGoldenNotesScore5]
+X=520
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Black
+
+[ScoreTextScore5]
+X=280
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=Black
+
+[ScoreTextTotal5]
+X=307
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=Black
+
+[ScoreTextTotalScore5]
+X=520
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=Black
+
+[ScoreStaticBoxDark5]
+Tex =PlayerNumberBox
+X =280
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer5Text1]
+X =284
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+[ScorePlayer5Static1]
+X=280
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer5Static2]
+X=280
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer5Static3]
+X=280
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer5Static4]
+X=280
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer5Static5]
+X=280
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+# P L A Y E R T H R E E
+[ScoreTextName6]
+X=540
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P3
+Color=P3Dark
+
+[ScoreTextNotes6]
+X=540
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=Black
+
+[ScoreTextNotesScore6]
+X=780
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Black
+
+[ScoreTextLineBonus6]
+X=540
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=Black
+
+[ScoreTextLineBonusScore6]
+X=780
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Black
+
+[ScoreTextGoldenNotes6]
+X=540
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=Black
+
+[ScoreTextGoldenNotesScore6]
+X=780
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=Black
+
+[ScoreTextScore6]
+X=540
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=Black
+
+[ScoreTextTotal6]
+X=567
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=Black
+
+[ScoreTextTotalScore6]
+X=780
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=Black
+
+[ScoreStaticBoxDark6]
+Tex =PlayerNumberBox
+X =540
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P3Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer6Text1]
+X =544
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P3
+
+#lines
+[ScorePlayer6Static1]
+X=540
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer6Static2]
+X=540
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer6Static3]
+X=540
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer6Static4]
+X=540
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+[ScorePlayer6Static5]
+X=540
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=GrayLight
+
+
+
+############### Options #######################
+
+
+[Options]
+Texts = 6
+Fade = 2
+
+[OptionsBackground]
+Tex=OptionsBG
+
+[OptionsStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =GrayLight
+Tex =IconOption
+Type=Font Black
+
+[OptionsStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[OptionsStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+Style=5
+
+[OptionsStatic6]
+X =512
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =Gray
+Type=Font Black
+
+[OptionsText1]
+X =70
+Y =30
+Color=GrayLight
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsText2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_WHEREAMI
+
+[OptionsText3]
+X =72
+Y =72
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_DESC
+
+[OptionsText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_SELECT
+
+[OptionsText6]
+X =538
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsButtonGame]
+X =100
+Y =215
+W =150
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonGameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_GAME
+Color=White
+
+[OptionsButtonGraphics]
+X =255
+Y =215
+W =150
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonGraphicsText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_GRAPHICS
+Color=White
+
+[OptionsButtonSound]
+X =410
+Y =215
+W =150
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonSoundText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_SOUND
+Color=White
+
+[OptionsButtonLyrics]
+X =565
+Y =215
+W =150
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonLyricsText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_LYRICS
+Color=White
+
+[OptionsButtonThemes]
+X =100
+Y =335
+W =150
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonThemesText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_THEMES
+Color=White
+
+[OptionsButtonRecord]
+X =255
+Y =335
+W =150
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonRecordText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_RECORD
+Color=White
+Texts=1
+
+[OptionsButtonAdvanced]
+X =410
+Y =335
+W =150
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonAdvancedText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_ADVANCED
+Color=White
+Texts=1
+
+[OptionsButtonExit]
+X =565
+Y =335
+W =150
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonExitText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[OptionsGame]
+Texts = 5
+
+[OptionsGameBackground]
+Tex=OptionsBG
+
+[OptionsGameStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGameStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGameStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGameStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[OptionsGameStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =Gray
+Type=Font Black
+
+[OptionsGameText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGameText2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GAME_WHEREAMI
+
+[OptionsGameText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GAME_DESC
+
+[OptionsGameText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGameText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGameSelectPlayers]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_PLAYERS
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDifficulty]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DIFFICULTY
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+
+[OptionsGameSelectSlideLanguage]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_LANGUAGE
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectTabs]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_TABS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectSlideSorting]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_SORTING
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDebug]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DEBUG
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsGraphics]
+Texts = 5
+
+[OptionsGraphicsBackground]
+Tex=OptionsBG
+
+[OptionsGraphicsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGraphicsStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=FontBlack
+Style=5
+
+[OptionsGraphicsStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =Gray
+Type=FontBlack
+
+[OptionsGraphicsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGraphicsText2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GRAPHICS_WHEREAMI
+
+[OptionsGraphicsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GRAPHICS_DESC
+
+[OptionsGraphicsText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGraphicsText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGraphicsSelectSlideResolution]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_GRAPHICS_RESOLUTION
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectFullscreen]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_FULLSCREEN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectDepth]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_DEPTH
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectOscilloscope]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_OSCILLOSCOPE
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectMovieSize]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_MOVIE_SIZE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsButtonExit]
+X = 40
+Y = 360
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsSound]
+Texts = 5
+
+[OptionsSoundBackground]
+Tex=OptionsBG
+
+[OptionsSoundStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsSoundStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=FontBlack
+Style=5
+
+[OptionsSoundStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =Gray
+Type=Font Black
+
+[OptionsSoundText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsSoundText2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_SOUND_WHEREAMI
+
+[OptionsSoundText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_SOUND_DESC
+
+[OptionsSoundText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsSoundText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsSoundSelectMicBoost]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_MIC_BOOST
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectClickAssist]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_CLICK_ASSIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectBeatClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_BEAT_CLICK
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectThreshold]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_THRESHOLD
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectTwoPlayerMode]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_TWO_PLAYERS_MODE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewVolume]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWVOLUME
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewFADING]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWFADING
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsLyrics]
+Texts = 1
+
+[OptionsLyricsBackground]
+Tex=OptionsBG
+
+[OptionsLyricsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsLyricsStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[OptionsLyricsStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =Gray
+Type=Font Black
+
+[OptionsLyricsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsLyricsText2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_LYRICS_WHEREAMI
+
+[OptionsLyricsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_LYRICS_DESC
+
+[OptionsLyricsText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsLyricsText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsLyricsSelectLyricsFont]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_FONT
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectLyricsEffect]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_EFFECT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectSolmization]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_SOLMIZATION
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsThemes]
+Texts = 5
+
+[OptionsThemesBackground]
+Tex=OptionsBG
+
+[OptionsThemesStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsThemesStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[OptionsThemesStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =Gray
+Type=Font Black
+
+[OptionsThemesText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsThemesText2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_THEMES_WHEREAMI
+
+[OptionsThemesText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_THEMES_DESC
+
+[OptionsThemesText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsThemesText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsThemesSelectTheme]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_THEME
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectSkin]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_SKIN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectColor]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_COLOR
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsRecord]
+Texts = 5
+
+[OptionsRecordBackground]
+Tex=OptionsBG
+
+[OptionsRecordStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsRecordStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[OptionsRecordStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =Gray
+Type=Font Black
+
+[OptionsRecordText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsRecordText2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_RECORD_WHEREAMI
+
+[OptionsRecordText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_RECORD_DESC
+
+[OptionsRecordText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsRecordText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsRecordSelectSlideCard]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CARD
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideInput]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_INPUT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelL]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELL
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelR]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELR
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordButtonExit]
+X = 40
+Y = 305
+W = 230
+H = 70
+Tex = MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+[OptionsAdvanced]
+Texts = 5
+
+[OptionsAdvancedBackground]
+Tex=OptionsBG
+
+[OptionsAdvancedStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsAdvancedStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[OptionsAdvancedStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =Gray
+Type=Font Black
+
+[OptionsAdvancedText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsAdvancedText2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_ADVANCED_WHEREAMI
+
+[OptionsAdvancedText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_ADVANCED_DESC
+
+[OptionsAdvancedText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsAdvancedText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+
+#########unused at the moment#########
+#[OptionsAdvancedSelectLoadAnimation]
+#Tex =MainBar
+#TexSBG =SelectBG
+#Text=SING_OPTIONS_ADVANCED_LOADANIMATION
+#X = 40
+#Y = 85
+#W = 230
+#H = 70
+#SkipX = 50
+
+#Color = ColorDark
+#DColor = Gray
+#TColor = White
+#TDColor = White
+#SBGTex =MainBar
+#SBGColor = ColorDark
+#SBGDColor = Gray
+#STColor = White
+#STDColor = GrayDark
+
+[OptionsAdvancedSelectScreenFade]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_SCREENFADE
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectEffectSing]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_EFFECTSING
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectLineBonus]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_LINEBONUS
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectSlideOnSongClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_ADVANCED_ONSONGCLICK
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectAskbeforeDel]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_ASKBEFOREDEL
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectPartyPopup]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_PARTYPOPUP
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex =MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = ColorDark
+DColor = Gray
+Type = Font Black
+
+
+##################### Top 5 ########################
+
+
+
+[Top5]
+Texts=1
+
+[Top5Background]
+Tex=Top5BG
+
+[Top5Text1]
+X =85
+Y =452
+Color=GrayLight
+Font =0
+Size =20
+Align=0
+Text =SING_TOP_5_CHARTS
+
+[Top5TextArtistTitle]
+X =87
+Y =499
+Color =Gray
+Font =0
+Size =10
+Align =0
+Text =artist - title
+
+[Top5Text4]
+X =87
+Y =520
+Color=GrayDark
+Font =0
+Size =10
+Align=0
+Text =SING_OPTIONS_GAME_DIFFICULTY
+
+[Top5TextLevel]
+X =1200
+Y =520
+Color =GrayDark
+Font =0
+Size =10
+Align =0
+Text =easy
+
+[Top5Static1]
+X =49
+Y =468
+W =27
+H =27
+Color =GrayLight
+Tex =ScoreIcon
+Type=Font Black
+
+[Top5Static2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[Top5Static3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[Top5Text2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_TOP_5_CHARTS_WHEREAMI
+
+[Top5Static4]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+
+[Top5Text3]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_TOP_5_CHARTS_CONTINUE
+
+[Top5TextName1]
+X =150
+Y =190
+Color =GrayDark
+Font =0
+Size =14
+Align =0
+Text =1. Player1
+
+[Top5TextName2]
+X =150
+Y =240
+Color =GrayDark
+Font =0
+Size =14
+Align =0
+Text =2. Player2
+
+[Top5TextName3]
+X =150
+Y =290
+Color =GrayDark
+Font =0
+Size =14
+Align =0
+Text =3. Player3
+
+[Top5TextName4]
+X =150
+Y =340
+Color =GrayDark
+Font =0
+Size =14
+Align =0
+Text =4. Player4
+
+[Top5TextName5]
+X =150
+Y =390
+Color =GrayDark
+Font =0
+Size =14
+Align =0
+Text =5. Player5
+
+[Top5TextScore1]
+X =680
+Y =190
+Color =GrayDark
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore2]
+X =680
+Y =240
+Color =GrayDark
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore3]
+X =680
+Y =290
+Color =GrayDark
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore4]
+X =680
+Y =340
+Color =GrayDark
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore5]
+X =680
+Y =390
+Color =GrayDark
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextNumber1]
+X =120
+Y =193
+Color =GrayDark
+Font =1
+Size =9
+Align =1
+Text =1
+
+[Top5TextNumber2]
+X =120
+Y =243
+Color =GrayDark
+Font =1
+Size =9
+Align =1
+Text =2
+
+[Top5TextNumber3]
+X =120
+Y =293
+Color =GrayDark
+Font =1
+Size =9
+Align =1
+Text =3
+
+[Top5TextNumber4]
+X =120
+Y =343
+Color =GrayDark
+Font =1
+Size =9
+Align =1
+Text =4
+
+[Top5TextNumber5]
+X =120
+Y =393
+Color =GrayDark
+Font =1
+Size =9
+Align =1
+Text =5
+
+[Top5StaticNumber1]
+Tex=PlayerNumberBox
+X=100
+Y=186
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber2]
+Tex=PlayerNumberBox
+X=100
+Y=236
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber3]
+Tex=PlayerNumberBox
+X=100
+Y=286
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber4]
+Tex=PlayerNumberBox
+X=100
+Y=336
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber5]
+Tex=PlayerNumberBox
+X=100
+Y=386
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+
+###################### Schwierigkeitsgrad ####################
+
+
+[Level]
+Texts=5
+
+[LevelBackground]
+Tex=MainBG
+
+[LevelStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[LevelStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[LevelStatic3]
+X =47
+Y =466
+W =27
+H =27
+Color =GrayLight
+Tex =MainIcon
+Type=Font Black
+
+[LevelStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[LevelStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+Style=5
+
+[LevelText1]
+X =83
+Y =450
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =GrayLight
+Text=SING_MODE
+
+[LevelText2]
+X =85
+Y =497
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=SING_DIFFICULTY_DESC
+
+[LevelText3]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_DIFFICULTY_WHEREAMI
+
+[LevelText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[LevelText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_DIFFICULTY_CONTINUE
+
+[LevelButtonEasy]
+X =0
+Y =80
+W = -150
+H = 30
+Tex = ButtonMirror
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[LevelButtonMedium]
+X =0
+Y =110
+W = -150
+H = 30
+Tex = ButtonMirror
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[LevelButtonHard]
+X =0
+Y =140
+W = -150
+H = 30
+Tex = ButtonMirror
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[LevelButtonEasyText1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_EASY
+Color=Black
+
+[LevelButtonMediumText1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_MEDIUM
+Color=Black
+
+[LevelButtonHardText1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Color=Black
+Text=SING_HARD
+
+
+########################## Name Screen ###############
+
+
+
+
+[Name]
+Texts=2
+
+[NameBackground]
+Tex=MainBG
+
+[NameStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[NameStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[NameStatic3]
+X =47
+Y =466
+W =27
+H =27
+Color =GrayLight
+Tex =MainIcon
+Type=Font Black
+
+[NameText1]
+X =83
+Y =450
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =GrayLight
+Text=SING_MODE
+
+[NameText2]
+X =85
+Y =497
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=SING_PLAYER_DESC
+
+[NameText3]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_PLAYER_WHEREAMI
+
+[NameStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[NameText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[NameStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonAZ
+Color =Gray
+Type=Font Black
+Style=5
+
+[NameText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_PLAYER_ENTER_NAME
+
+[NameStatic6]
+X =556
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+Style=5
+
+[NameText6]
+X =586
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[NameButtonPlayer1]
+X =0
+Y =80
+W = -150
+H = 30
+Tex = ButtonMirror
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[NameButtonPlayer1Text1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Color=Black
+Text=
+
+[NameButtonPlayer2]
+X =0
+Y =110
+W = -150
+H = 30
+Tex = ButtonMirror
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[NameButtonPlayer2Text1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Color=Black
+Text=
+
+[NameButtonPlayer3]
+X =0
+Y =140
+W = -150
+H = 30
+Tex = ButtonMirror
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[NameButtonPlayer3Text1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Color=Black
+Text=
+
+[NameButtonPlayer4]
+X =0
+Y =170
+W = -150
+H = 30
+Tex = ButtonMirror
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[NameButtonPlayer4Text1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Color=Black
+Text=
+
+[NameButtonPlayer5]
+X =0
+Y =200
+W = -150
+H = 30
+Tex = ButtonMirror
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[NameButtonPlayer5Text1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Color=Black
+Text=
+
+[NameButtonPlayer6]
+X =0
+Y =230
+W = -150
+H = 30
+Tex = ButtonMirror
+Color=White
+Type = Plain
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 500
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 1
+
+[NameButtonPlayer6Text1]
+X =60
+Y =-1
+Font=0
+Size=10
+Align=0
+Color=Black
+Text=
+
+
+
+###################### Party Modus ####################
+
+
+
+
+[PartyNewRound]
+Texts =7
+
+[PartyNewRoundBackground]
+Tex=SongBG
+
+[PartyNewRoundStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =GrayLight
+Tex =PartyIcon
+Type=Font Black
+
+[PartyNewRoundText1]
+X =70
+Y =27
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =GrayLight
+Text=PARTY_MODE
+
+[PartyNewRoundText2]
+X =70
+Y =72
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=PARTY_ROUND_DESC
+
+[PartyNewRoundText3]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_ROUND_WHEREAMI
+
+[PartyNewRoundText4]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_ROUND_LEGEND_CONTINUE
+
+[PartyNewRoundText5]
+X =460
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND
+Align=0
+
+[PartyNewRoundText6]
+X =600
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND_WINNER
+Align=0
+
+[PartyNewRoundText7]
+X =448
+Y =350
+Color =White
+Font =0
+Size =18
+Text =PARTY_ROUND
+Align=2
+
+[PartyNewRoundTextTeam1Players]
+X =30
+Y =137
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam2Players]
+X =30
+Y =218
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam3Players]
+X =30
+Y =299
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundStatic4]
+Tex =PartyRoundBG1
+X =450
+Y =103
+W = 330
+H = 24
+Int=1
+Color =DarkOrange
+Type=Font Black
+
+[PartyNewRoundStatic5]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+
+[PartyNewRoundStatic6]
+Tex =PartyRoundBG3
+X =250
+Y =350
+W = 300
+H = 50
+Int=1
+Color =DarkOrange
+Type=Font Black
+
+[PartyNewRoundStatic7]
+Tex =PartyRoundBG4
+X =50
+Y =495
+W = 700
+H = 30
+Int=1
+Color =LightOrange
+Type=Font Black
+
+[PartyNewRoundStaticTeam1]
+Tex =PartyTeamButton1
+X =20
+Y =110
+W =400
+H =50
+Int=1
+Color =P1Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam2]
+Tex =PartyTeamButton1
+X =20
+Y =191
+W =400
+H =50
+Int=1
+Color =P2Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam3]
+Tex =PartyTeamButton1
+X =20
+Y =272
+W =400
+H =50
+Int=1
+Color =P3Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticNextPlayer1]
+Tex=PartyPlayerButton
+X=155
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P1Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer2]
+Tex=PartyPlayerButton
+X=325
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P2Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer3]
+Tex=PartyPlayerButton
+X=495
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P3Light
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyNewRoundTextRound1]
+X =460
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Round 1
+Align=0
+
+[PartyNewRoundTextRound2]
+X =460
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Round 2
+Align=0
+
+[PartyNewRoundTextRound3]
+X =460
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Round 3
+Align=0
+
+[PartyNewRoundTextRound4]
+X =460
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Round 4
+Align=0
+
+[PartyNewRoundTextRound5]
+X =460
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Round 5
+Align=0
+
+[PartyNewRoundTextRound6]
+X =460
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Round 6
+Align=0
+
+[PartyNewRoundTextRound7]
+X =460
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Round 7
+Align=0
+
+[PartyNewRoundTextWinner1]
+X =600
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Winner 1
+Align=0
+
+[PartyNewRoundTextWinner2]
+X =600
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Winner 2
+Align=0
+
+[PartyNewRoundTextWinner3]
+X =600
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Winner 3
+Align=0
+
+[PartyNewRoundTextWinner4]
+X =600
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Winner 4
+Align=0
+
+[PartyNewRoundTextWinner5]
+X =600
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Winner 5
+Align=0
+
+[PartyNewRoundTextWinner6]
+X =600
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Winner 6
+Align=0
+
+[PartyNewRoundTextWinner7]
+X =600
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Winner 7
+Align=0
+
+[PartyNewRoundStaticRound1]
+Tex =PartyRoundBG2
+X =450
+Y =135
+W = 330
+H = 20
+Color =LightOrange
+Type =Font Black
+
+[PartyNewRoundStaticRound2]
+Tex =PartyRoundBG2
+X =450
+Y =164
+W = 330
+H = 20
+Color =LightOrange
+Type =Font Black
+
+[PartyNewRoundStaticRound3]
+Tex =PartyRoundBG2
+X =450
+Y =193
+W = 330
+H = 20
+Color =LightOrange
+Type =Font Black
+
+[PartyNewRoundStaticRound4]
+Tex =PartyRoundBG2
+X =450
+Y =222
+W = 330
+H = 20
+Color =LightOrange
+Type =Font Black
+
+[PartyNewRoundStaticRound5]
+Tex =PartyRoundBG2
+X =450
+Y =251
+W = 330
+H = 20
+Color =LightOrange
+Type =Font Black
+
+[PartyNewRoundStaticRound6]
+Tex =PartyRoundBG2
+X =450
+Y =280
+W = 330
+H = 20
+Color =LightOrange
+Type =Font Black
+
+[PartyNewRoundStaticRound7]
+Tex =PartyRoundBG2
+X =450
+Y =309
+W = 330
+H = 20
+Color =LightOrange
+Type =Font Black
+
+[PartyNewRoundTextNextRound]
+X =400
+Y =495
+Color =White
+Font =0
+Size =10
+Text =Next Round
+Align=1
+
+[PartyNewRoundTextNextRoundNo]
+X =457
+Y =350
+Color =White
+Font =0
+Size =18
+Text =99
+Align=0
+
+[PartyNewRoundTextScoreTeam1]
+X =390
+Y =110
+Color =White
+Font =0
+Size =17
+Text =3000
+Align=1
+
+[PartyNewRoundTextScoreTeam2]
+X =390
+Y =191
+Color =White
+Font =0
+Size =17
+Text =2000
+Align=1
+
+[PartyNewRoundTextScoreTeam3]
+X =390
+Y =272
+Color =White
+Font =0
+Size =17
+Text =1000
+Align=1
+
+[PartyNewRoundTextNameTeam1]
+X =30
+Y =108
+Color =White
+Font =0
+Size =12
+Text =Team 1
+Align=0
+
+[PartyNewRoundTextNameTeam2]
+X =30
+Y =189
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyNewRoundTextNameTeam3]
+X =30
+Y =270
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyNewRoundTextNextPlayer1]
+X =230
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 1
+Align=1
+
+[PartyNewRoundTextNextPlayer2]
+X =400
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 2
+Align=1
+
+[PartyNewRoundTextNextPlayer3]
+X =570
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 3
+Align=1
+
+
+[PartyScore]
+Texts=5
+
+[PartyScoreBackground]
+Tex=PartyBG
+
+[PartyScoreDecoTextures]
+ChangeTextures =1
+
+FirstTexture =PartyScoreDeco
+FirstTyp =Font Black
+FirstColor =Gold
+
+SecondTexture =PartyScoreDeco
+SecondTyp =Font Black
+SecondColor =Silver
+
+ThirdTexture =PartyScoreDeco
+ThirdTyp =Font Black
+ThirdColor =Bronze
+
+[PartyScoreStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =GrayLight
+Tex =PartyIcon
+Type=Font Black
+
+[PartyScoreStatic4]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+
+[PartyScoreText1]
+X =70
+Y =27
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =GrayLight
+Text=PARTY_MODE
+
+[PartyScoreText2]
+X =72
+Y =72
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=PARTY_SCORE_DESC
+
+[PartyScoreText3]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_SCORE_WHEREAMI
+
+[PartyScoreText4]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_LEGEND_CONTINUE
+
+[PartyScoreStatic5]
+Tex =PartyScoreBG1
+X =50
+Y =100
+W = 700
+H = 80
+Int=1
+Color =DarkOrange
+Type=Font Black
+
+[PartyScoreStatic6]
+Tex =PartyScoreBG2
+X =50
+Y =495
+W = 700
+H = 20
+Int=1
+Color =LightOrange
+Type=Font Black
+
+[PartyScoreText5]
+X =400
+Y =136
+Color =White
+Font =0
+Size =15
+Text =PARTY_SCORE_WINS2
+Align=1
+
+[PartyScoreTextWinner]
+X =400
+Y =98
+Color =White
+Font =0
+Size =18
+Text =The Winner is...
+Align=1
+
+[PartyScoreTextScoreTeam1]
+X =568
+Y =198
+Color =White
+Font =0
+Size =12
+Text =3000
+Align=2
+
+[PartyScoreTextScoreTeam2]
+X =568
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyScoreTextScoreTeam3]
+X =568
+Y =398
+Color =White
+Font =0
+Size =12
+Text =1000
+Align=2
+
+[PartyScoreTextNameTeam1]
+X =188
+Y =198
+Font=0
+Size=12
+Align=0
+Text=Team 1
+Color=White
+
+[PartyScoreTextNameTeam2]
+X =188
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyScoreTextNameTeam3]
+X =188
+Y =398
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyScoreStaticTeam1]
+X =188
+Y =230
+W =380
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam1BG]
+Tex=PartyTeamButton2
+X=178
+Y=200
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam1Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 191
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam2]
+X =188
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam2BG]
+Tex=PartyTeamButton2
+X=178
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam2Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam3]
+X =188
+Y =430
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam3BG]
+Tex=PartyTeamButton2
+X=178
+Y=400
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam3Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 391
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyWin]
+Texts=4
+
+[PartyWinBackground]
+Tex=PartyBG
+
+[PartyWinStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =GrayLight
+Tex =PartyIcon
+Type=Font Black
+
+[PartyWinStatic4]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+
+[PartyWinText1]
+X =70
+Y =27
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =GrayLight
+Text=PARTY_MODE
+
+[PartyWinText2]
+X =72
+Y =72
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=PARTY_WIN_DESC
+
+[PartyWinText3]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_WIN_WHEREAMI
+
+[PartyWinText4]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_WIN_LEGEND_CONTINUE
+
+#[PartyWinTextWinner]
+#X =150
+#Y =120
+#Color =White
+#Font =1
+#Size =14
+#Text =The Winner is...
+#Align=0
+
+[PartyWinTextScoreTeam1]
+X =699
+Y =183
+Color =White
+Font =0
+Size =19
+Text =3000
+Align=2
+
+[PartyWinTextScoreTeam2]
+X =669
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyWinTextScoreTeam3]
+X =649
+Y =398
+Color =White
+Font =0
+Size =9
+Text =1000
+Align=2
+
+[PartyWinTextNameTeam1]
+X =169
+Y =183
+Font=0
+Size=19
+Align=0
+Text=Team 1
+Color=White
+
+[PartyWinTextNameTeam2]
+X =289
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyWinTextNameTeam3]
+X =369
+Y =398
+Color =White
+Font =0
+Size =9
+Text =Team 3
+Align=0
+
+[PartyWinStaticTeam1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BG]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank2]
+Tex=PartyTeamButton3
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank3]
+Tex=PartyTeamButton3
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyWinStaticTeam1Deco]
+Tex =PartyWinDeco1
+X = 91
+Y = 176
+W = 79
+H = 79
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BG]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamButton3
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank1]
+Tex=PartyTeamButton4
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank2]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank3]
+Tex=PartyTeamButton4
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Deco]
+Tex =PartyWinDeco2
+X = 226
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Silver
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BG]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank2]
+Tex=PartyTeamButton5
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank3]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Deco]
+Tex =PartyWinDeco3
+X = 316
+Y = 391
+W = 54
+H = 54
+Type =Font Black
+Color =Bronze
+Reflection=1
+ReflectionSpacing=3
+
+[PartyOptions]
+Texts = 5
+
+[PartyOptionsBackground]
+Tex=PartyBG
+
+[PartyOptionsStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =GrayLight
+Tex =PartyIcon
+Type=Font Black
+
+[PartyOptionsStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[PartyOptionsStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+Style=5
+
+[PartyOptionsText1]
+X =70
+Y =27
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =GrayLight
+Text=PARTY_MODE
+
+[PartyOptionsText2]
+X =72
+Y =72
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=PARTY_OPTIONS_DESC
+
+[PartyOptionsText3]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_OPTIONS_WHEREAMI
+
+[PartyOptionsText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyOptionsText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[PartyOptionsSelectLevel]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_DIFFICULTY
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectRounds]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_ROUNDS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectTeams]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers1]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER1
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER2
+X = 40
+Y = 415
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers3]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER3
+X = 40
+Y = 470
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = ColorDark
+DColor = Gray
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = ColorDark
+SBGDColor = Gray
+STColor = White
+STDColor = GrayDark
+
+
+
+[PartyPlayer]
+Texts=6
+
+[PartyPlayerBackground]
+Tex=PartyBG
+
+[PartyPlayerStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =GrayLight
+Tex =PartyIcon
+Type=Font Black
+
+[PartyPlayerStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[PartyPlayerStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonAZ
+Color =Gray
+Type=Font Black
+Style=5
+
+[PartyPlayerStatic6]
+X =556
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =Gray
+Type=Font Black
+Style=5
+
+[PartyPlayerText1]
+X =70
+Y =27
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =GrayLight
+Text=PARTY_MODE
+
+[PartyPlayerText2]
+X =72
+Y =72
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=PARTY_PLAYER_DESC
+
+[PartyPlayerText3]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=PARTY_PLAYER_WHEREAMI
+
+[PartyPlayerText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyPlayerText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_ENTER_NAME
+
+[PartyPlayerText6]
+X =586
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_LEGEND_CONTINUE
+
+[PartyPlayerTeam1Name]
+Tex=PartyTeamButton2
+X=85
+Y=100
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Dark
+
+[PartyPlayerTeam1NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 1
+Color=White
+
+[PartyPlayerPlayer1Name]
+Tex=Button
+X=85
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer1NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 1
+Color=White
+
+[PartyPlayerPlayer2Name]
+Tex=Button
+X=245
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer2NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 2
+Color=White
+
+[PartyPlayerPlayer3Name]
+Tex=Button
+X=405
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer3NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 3
+Color=White
+
+[PartyPlayerPlayer4Name]
+Tex=Button
+X=565
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer4NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 4
+Color=White
+
+[PartyPlayerTeam2Name]
+Tex=PartyTeamButton2
+X=85
+Y=240
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Dark
+
+[PartyPlayerTeam2NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 2
+Color=White
+
+[PartyPlayerPlayer5Name]
+Tex=Button
+X=85
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer5NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 5
+Color=White
+
+[PartyPlayerPlayer6Name]
+Tex=Button
+X=245
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer6NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 6
+Color=White
+
+[PartyPlayerPlayer7Name]
+Tex=Button
+X=405
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer7NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 7
+Color=White
+
+[PartyPlayerPlayer8Name]
+Tex=Button
+X=565
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer8NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 8
+Color=White
+
+[PartyPlayerTeam3Name]
+Tex=Button
+Tex=PartyTeamButton2
+X=85
+Y=380
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Dark
+
+[PartyPlayerTeam3NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 3
+Color=White
+
+[PartyPlayerPlayer9Name]
+Tex=Button
+X=85
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer9NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 9
+Color=White
+
+[PartyPlayerPlayer10Name]
+Tex=Button
+X=245
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer10NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 10
+Color=White
+
+[PartyPlayerPlayer11Name]
+Tex=Button
+X=405
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer11NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 11
+Color=White
+
+[PartyPlayerPlayer12Name]
+Tex=Button
+X=565
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer12NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 12
+Color=White
+
+
+#################### Song Menu ######################
+
+
+
+[SongMenu]
+Texts=0
+Statics=1
+
+[SongMenuButton1]
+X = 510
+Y = 165
+W = 270
+H = 25
+Tex =Rectangle
+Color =LightOrange
+DColor = DarkOrange
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton1Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_PLAY
+Align=0
+Z=0.99
+
+[SongMenuButton2]
+X = 510
+Y = 195
+W = 270
+H = 25
+Tex =Rectangle
+Color =LightOrange
+DColor = DarkOrange
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton2Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_EDIT
+Align=0
+Z=0.99
+
+[SongMenuButton3]
+X = 510
+Y = 225
+W = 270
+H = 25
+Tex =Rectangle
+Color =LightOrange
+DColor = DarkOrange
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton3Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_MODI
+Align=0
+Z=0.99
+
+[SongMenuButton4]
+X = 510
+Y = 255
+W = 270
+H = 25
+Tex = Rectangle
+Color =LightOrange
+DColor = DarkOrange
+Type=Font Black
+Texts=1
+Z = 0.98
+
+[SongMenuButton4Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_CANCEL
+Align=0
+Z=0.99
+
+[SongMenuSelectSlide3]
+Tex = Rectangle
+TexSBG = SongMenuSelectBG
+Text =
+X = 510
+Y = 225
+W = 0
+H = 25
+Z = 0.98
+SkipX = 0
+SBGW=270
+
+TextSize=8
+
+Color = LightOrange
+DColor = DarkOrange
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = LightOrange
+SBGDColor = DarkOrange
+STColor = White
+STDColor = GrayDark
+
+[SongMenuTextMenu]
+X =539
+Y =125
+Color=White
+Font =0
+Size =14
+Text=MENU
+Align=0
+Z=0.99
+
+[SongMenuStatic2]
+X =513
+Y =135
+W =21
+H =21
+Color =White
+Tex =IconSongMenu
+Type=Font Black
+Z=0.98
+
+[SongMenuStatic1]
+Tex =SongMenuBG
+X =498
+Y =120
+W =300
+H =200
+Z =0.94
+Int=1
+Color =DarkOrange
+Type=Font Black
+
+[SongJumpto]
+Texts=0
+Statics=1
+
+[SongJumptoStatic1]
+Tex =JumpToBG
+X =221
+Y =175
+W =355
+H =175
+Z =0.98
+Int=1
+Color =DarkOrange
+Type=Font Black
+
+[SongJumptoStatic2]
+X =234
+Y =185
+W =21
+H =21
+Color =White
+Tex =MainSearch
+Type=Font Black
+Z=0.99
+
+[SongJumptoText1]
+X =310
+Y =175
+Color=White
+Font =0
+Size =14
+Text=SONG_JUMPTO_TYPE_DESC
+Align=0
+Z=0.99
+
+[SongJumptoSelectSlideType]
+Tex = button
+TexSBG = mainicon
+#Text = SONG_JUMPTO_TYPE_DESC
+Font=1
+X = 242
+Y = 205
+Z = 0.99
+W = 0
+H = 30
+SkipX = 4
+SBGW= 300
+Fields=2
+DColor = LightOrange
+TColor = White
+TDColor = White
+SBGTex = button
+SBGDColor = LightOrange
+STColor = White
+STDColor = LightOrange
+
+[SongJumptoButtonSearchText]
+X = 250
+Y = 215
+Z = 0.99
+W = 160
+H = 50
+Size=14
+Font=1
+Align=0
+
+[SongJumptoTextFound]
+X =234
+Y =295
+Color=White
+Font =0
+Size =8
+Text=SONG_JUMPTO_HELP
+Align=0
+Z=0.99
+
+
+######################## Main Statistik ##############
+
+
+
+[StatMain]
+Texts=0
+Statics=0
+
+[StatMainBackground]
+Tex=OptionsBG
+
+[StatMainButtonScores]
+X =589
+Y =100
+W =190
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonScoresText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SCORES
+Color=Black
+
+[StatMainButtonSingers]
+X =589
+Y =160
+W =190
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSingersText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SINGERS
+Color=Black
+
+[StatMainButtonSongs]
+X =589
+Y =220
+W =190
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSongsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_SONGS
+Color=Black
+
+[StatMainButtonBands]
+X =589
+Y =280
+W =190
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonBandsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_BANDS
+Color=Black
+
+[StatMainButtonExit]
+X =589
+Y =340
+W =190
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=Black
+
+[StatMainTextOverview]
+X =45
+Y =125
+W =510
+Color=Black
+Font =0
+Size =9
+Align=0
+Text=
+
+[StatMainStatic1]
+X =47
+Y =466
+W =27
+H =27
+Color=GrayLight
+Tex =StatIcon
+Type=Font Black
+
+[StatMainStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color=White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatMainStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color=White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatMainStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[StatMainStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =Gray
+Type=Font Black
+
+[StatMainStatic6]
+X =40
+Y =100
+W =520
+H =20
+Tex=StatMainBG1
+Color =ColorLight
+Type=Font Black
+
+[StatMainStatic7]
+X =40
+Y =120
+W =520
+H =300
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatMainStatic8]
+X =40
+Y =420
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+[StatMainText1]
+X =83
+Y =450
+Color=Black
+Font =0
+Size =20
+Text=STAT_MAIN
+Align=0
+
+[StatMainText2]
+X =85
+Y =497
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=STAT_MAIN_WHEREAMI
+
+[StatMainText3]
+X =170
+Y =502
+Color=Black
+Font =0
+Size =10
+Align =0
+Text=STAT_MAIN_DESC
+
+[StatMainText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatMainText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+
+#######################Detail Statistiken##############
+
+
+
+[StatDetail]
+Texts=0
+Statics=0
+
+[StatDetailBackground]
+Tex=OptionsBG
+
+[StatDetailButtonNext]
+X =589
+Y =100
+W =190
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonNextText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_NEXT
+Color=White
+
+[StatDetailButtonPrev]
+X =589
+Y =160
+W =190
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonPrevText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_PREV
+Color=White
+
+[StatDetailButtonReverse]
+X =589
+Y =220
+W =190
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonReverseText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_REVERSE
+Color=White
+
+[StatDetailButtonExit]
+X =589
+Y =280
+W =190
+H =50
+Tex =Button
+Color =DarkOrange
+DColor = LightOrange
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatDetailTextDescription]
+X =70
+Y =70
+Color=Gray
+Font =0
+Size =10
+Align =0
+Text=
+
+[StatDetailTextPage]
+X = 546
+Y = 98
+Color= Black
+Font = 0
+Size = 5
+Align=2
+Text=
+
+[StatDetailTextList1]
+X = 45
+Y = 122
+Color=Black
+Font = 0
+Size = 7
+Text=Stat1
+
+[StatDetailTextList2]
+X = 45
+Y = 160
+Color=Black
+Font = 0
+Size = 7
+Text=Stat2
+
+[StatDetailTextList3]
+X = 45
+Y = 198
+Color=Black
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList4]
+X = 45
+Y = 236
+Color=Black
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList5]
+X = 45
+Y = 274
+Color=Black
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList6]
+X = 45
+Y = 312
+Color=Black
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList7]
+X = 45
+Y = 350
+Color=Black
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList8]
+X = 45
+Y = 388
+Color=Black
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList9]
+X = 45
+Y = 426
+Color=Black
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList10]
+X = 45
+Y = 464
+Color=Black
+Font = 0
+Size = 7
+Text=
+
+[StatDetailStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color=GrayLight
+Tex =StatIcon
+Type=Font Black
+
+[StatDetailStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatDetailStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatDetailStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =Gray
+Type=Font Black
+Style=5
+
+[StatDetailStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =Gray
+Type=Font Black
+
+[StatDetailStatic6]
+X =40
+Y =100
+W =520
+H =24
+Tex=StatDetailBG1
+Color =ColorLight
+Type=Font Black
+
+[StatDetailStatic7]
+X =40
+Y =124
+W =520
+H =376
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatDetailStatic8]
+X =40
+Y =500
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+
+[StatDetailText1]
+X =70
+Y =30
+Color=GrayLight
+Font =0
+Size =20
+Text=STAT_DETAIL
+Align=0
+
+[StatDetailText2]
+X =238
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=STAT_DETAIL_WHEREAMI
+
+[StatDetailText3]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatDetailText4]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+
+#######################################################
+
+
+[CheckPopup]
+Texts=1
+Statics=1
+
+[CheckPopupButton1]
+X = 285
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=JA
+Align=1
+Z=1
+
+[CheckPopupButton2]
+X = 415
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton2Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=NEIN
+Align=1
+Z=1
+
+[CheckPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[CheckPopupText1]
+X =282
+Y =147
+Color=White
+Font =0
+Size =10
+Text=MSG_QUESTION_TITLE
+Align=0
+Z=1
+
+[CheckPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =GrayPopup
+Type=Font Black
+
+[CheckPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[CheckPopupStatic3]
+Tex =IconQuestion
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopup]
+Texts=1
+Statics=1
+
+[ErrorPopupButton1]
+X = 350
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[ErrorPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=OK
+Align=1
+Z=1
+
+[ErrorPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[ErrorPopupText1]
+X =282
+Y =148
+Color=White
+Font =0
+Size =10
+Text=MSG_ERROR_TITLE
+Align=0
+Z=1
+
+[ErrorPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =GrayPopup
+Type=Font Black
+
+[ErrorPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopupStatic3]
+Tex =IconError
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black \ No newline at end of file
diff --git a/Themes/Streetlight lite.ini b/Themes/Streetlight lite.ini
new file mode 100644
index 00000000..9221ccdd
--- /dev/null
+++ b/Themes/Streetlight lite.ini
@@ -0,0 +1,8009 @@
+;0.5.1 Mod
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Theme]
+Name=Streetlight lite
+Creator=!Skar!™
+
+[Colors]
+White = 255 255 255
+LightBlue = 119 187 210
+DarkBlue = 28 126 171
+LightRed = 170 146 146
+DarkRed = 155 113 113
+LightGreen = 136 168 136
+DarkGreen = 106 152 104
+LightPurple = 155 136 168
+DarkPurple = 145 104 152
+LightOrange = 168 155 136
+DarkOrange = 151 131 76
+LightYellow = 168 168 136
+DarkYellow = 150 151 76
+Turkis = 13 186 167
+GrayLightest = 235 235 235
+GrayLight = 191 191 191
+Gray = 127 127 127
+GrayDark = 63 63 63
+Black = 0 0 0
+GrayPopup = 51 51 51
+Gold = 255 223 31
+Silver = 223 223 223
+Bronze = 205 127 50
+
+[Loading]
+Fade = 1
+
+[LoadingBackground]
+Tex=LoadingBG
+
+[Main]
+Texts =8
+Statics=4
+
+[MainBackground]
+Tex=MainBG
+
+[MainStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic2]
+X =254
+Y =0
+W =546
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic3]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[MainText1]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_MENU
+
+[MainText2]
+X =295
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[MainStatic4]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[MainTextDescriptionLong]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=
+
+[MainButtonSolo]
+X =54
+Y =28
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[MainButtonSoloText1]
+X =100
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_SING
+Color=White
+
+[MainButtonMulti]
+X =54
+Y =58
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[MainButtonMultiText1]
+X =100
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_MULTI
+Color=White
+
+[MainButtonCollection1]
+X =54
+Y =88
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 3
+FirstChild=3
+
+
+[MainButtonCollection1Text1]
+X =100
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_TOOLS
+Color=White
+
+[MainButtonStats]
+X = 254
+Y = 88
+W = 125
+H = 20
+Tex = Button2
+Color = GrayDark
+DColor = Black
+Type = Font Black
+Texts = 1
+Parent = 1
+
+[MainButtonStatsText1]
+X = 10
+Y = -3
+Font = 0
+Size = 8
+Align = 0
+Text = SING_STATS
+Color = White
+
+[MainButtonEditor]
+X =254
+Y =108
+W =125
+H =20
+Tex =Button2
+Color = GrayDark
+DColor = Black
+Type=Font Black
+Texts=1
+Parent=1
+
+[MainButtonEditorText1]
+X =10
+Y =-3
+Font=0
+Size=8
+Align=0
+Text=SING_EDITOR
+Color=White
+
+[MainButtonOptions]
+X =254
+Y =128
+W =125
+H =20
+Tex =Button2
+Color = GrayDark
+DColor = Black
+Type=Font Black
+Texts=1
+Parent=1
+
+[MainButtonOptionsText1]
+X =10
+Y =-3
+Font=0
+Size=8
+Align=0
+Text=SING_OPTIONS
+Color=White
+
+[MainButtonExit]
+X =54
+Y =118
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[MainButtonExitText1]
+X =100
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_EXIT
+Color=White
+
+
+
+
+########################## Name Screen ###############
+
+
+
+
+[Name]
+Texts=2
+
+[NameBackground]
+Tex=MainBG
+
+[NameStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[NameStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[NameStatic3]
+X =47
+Y =466
+W =27
+H =27
+Color =White
+Tex =MainIcon
+Type=Font Black
+
+[NameText1]
+X =83
+Y =450
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=SING_MODE
+
+[NameText2]
+X =85
+Y =497
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_PLAYER_DESC
+
+[NameText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_PLAYER_WHEREAMI
+
+[NameStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[NameText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[NameStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonAZ
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[NameText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_PLAYER_ENTER_NAME
+
+[NameStatic6]
+X =556
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[NameText6]
+X =586
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[NameButtonPlayer1]
+X =54
+Y =28
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[NameButtonPlayer1Text1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=
+
+[NameButtonPlayer2]
+X =54
+Y =58
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[NameButtonPlayer2Text1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=
+
+[NameButtonPlayer3]
+X =54
+Y =88
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[NameButtonPlayer3Text1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=
+
+[NameButtonPlayer4]
+X =54
+Y =118
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[NameButtonPlayer4Text1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=
+
+[NameButtonPlayer5]
+X =54
+Y =148
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[NameButtonPlayer5Text1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=
+
+[NameButtonPlayer6]
+X =54
+Y =178
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[NameButtonPlayer6Text1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=
+
+
+
+###################### Schwierigkeitsgrad ####################
+
+
+[Level]
+Texts=5
+
+[LevelBackground]
+Tex=MainBG
+
+[LevelStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[LevelStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[LevelStatic3]
+X =47
+Y =466
+W =27
+H =27
+Color =White
+Tex =MainIcon
+Type=Font Black
+
+[LevelStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[LevelStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[LevelText1]
+X =83
+Y =450
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=SING_MODE
+
+[LevelText2]
+X =85
+Y =497
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_DIFFICULTY_DESC
+
+[LevelText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_DIFFICULTY_WHEREAMI
+
+[LevelText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[LevelText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_DIFFICULTY_CONTINUE
+
+[LevelButtonEasy]
+X =54
+Y =28
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[LevelButtonMedium]
+X =54
+Y =58
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[LevelButtonHard]
+X =54
+Y =88
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[LevelButtonEasyText1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=SING_EASY
+
+[LevelButtonMediumText1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=SING_MEDIUM
+
+[LevelButtonHardText1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=SING_HARD
+
+
+##############Songscreen##################
+
+
+[Song]
+Texts =4
+
+[SongBackground]
+Tex=SongBG
+
+[SongCover]
+X=303
+Y=125
+W=320
+H=190
+Style=5
+Reflections=1
+
+[SongEqualizer]
+Visible=1
+Direction=1
+Color=GrayLightest
+Alpha=1
+X=240
+Y=512
+Z=1
+PieceW=6
+PieceH=6
+Space=1
+Bands=8
+Length=24
+
+[SongVideoIcon]
+X =299
+Y =487
+W =32
+H =32
+Z=1
+Color=GrayDark
+Tex =VideoIcon
+Type=Font Black
+
+[SongStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[SongStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[SongStatic3]
+X =250
+Y =120
+W =300
+H =200
+Z =0.5
+Color =GrayDark
+Tex =SongSelection1
+Type=Font Black
+
+[SongStatic4]
+X =298
+Y =320
+W =200
+H =200
+Z=0.98
+Color =Black
+Tex =SongSelection2
+Type=Font Black
+
+[SongTextCat]
+X =85
+Y =550
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_SONG_SELECTION_DESC
+
+[SongTextArtist]
+X =400
+Y =330
+W = 190
+Color=White
+Font =1
+Size =9
+Align =1
+Text=
+
+[SongTextTitle]
+X =400
+Y =390
+W = 190
+Color=White
+Font =0
+Size =9
+Align =1
+Text=
+
+[SongTextNumber]
+X =490
+Y =495
+Color=GrayDark
+Font =0
+Size =8
+Align =2
+Text=
+
+#Variable statics and texts for song-screen in sing- and partymode
+# There can be an unlimited Number of Statics and Texts, As long
+# as the numbers are in order.
+# Statics that are shown in PartyMode Only are Named_
+# SongStaticParty[No]
+# Texts that are shown in PartyMode Only are Named_
+# SongTextParty[No]
+# Statics that are shown in Normal Mode Only are Named_
+# SongStaticNonParty[No]
+# Texts that are shown in Normal Mode Only are Named_
+# SongTextNonParty[No]
+#Here are the ones for singmode
+
+[SongStaticNonParty1]
+X =47
+Y =500
+W =27
+H =27
+Color =White
+Tex =SongCD
+Type=Font Black
+
+[SongStaticNonParty2]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonAlt
+Color =GrayLight
+Type=Font Black
+
+[SongStaticNonParty3]
+X =300
+Y =5
+W =26
+H =22
+Tex=ButtonAZ
+Color =GrayLight
+Type=Font Black
+
+[SongStaticNonParty4]
+X =425
+Y =5
+W =22
+H =22
+Tex=ButtonM
+Color =GrayLight
+Type=Font Black
+
+[SongStaticNonParty5]
+X =515
+Y =5
+W =22
+H =22
+Tex=ButtonJ
+Color =GrayLight
+Type=Font Black
+
+[SongStaticNonParty6]
+X =679
+Y =5
+W =22
+H =22
+Tex=ButtonP
+Color =GrayLight
+Type=Font Black
+
+#Texts Non Party
+[SongTextNonParty1]
+X =83
+Y =482
+Color=White
+Font =0
+Size =20
+Text=song
+Align=0
+
+[SongTextNonParty2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_SONG_SELECTION_WHEREAMI
+
+[SongTextNonParty3]
+X =288
+Y =8
+Color=Black
+Font =1
+Size =5
+Align=0
+Text=+
+
+[SongTextNonParty4]
+X =330
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_GOTO
+
+[SongTextNonParty5]
+X =450
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_MENU
+
+[SongTextNonParty6]
+X =540
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SONG_JUMPTO_DESC
+
+[SongTextNonParty7]
+X =705
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_PLAYLIST
+
+[SongTextNonParty8]
+X =83
+Y =510
+Color=White
+Font =0
+Size =20
+Text=selection
+Align=0
+
+
+#and theese are the ones for partymode
+
+[SongStaticParty1]
+X =47
+Y =466
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[SongStaticParty2]
+X =260
+Y =5
+W =26
+H =22
+Tex=Button13
+Color =GrayLight
+Type=Font Black
+
+[SongStaticParty3]
+X =400
+Y =5
+W =22
+H =22
+Tex=ButtonM
+Color =GrayLight
+Type=Font Black
+
+[SongStaticParty4]
+X =540
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+
+#Texts for Party Mode
+
+[SongTextParty1]
+X =83
+Y =446
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=party
+
+[SongTextParty2]
+X =83
+Y =478
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=mode
+
+[SongTextParty3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_SONG_WHEREAMI
+
+[SongTextParty4]
+X =288
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SONG_MENU_NAME_PARTY_JOKER
+
+[SongTextParty5]
+X =426
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_MENU
+
+[SongTextParty6]
+X =570
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_LEGEND_CONTINUE
+
+
+
+#variable statics end
+
+
+# Jokers, 5 for each team, only shown in party Mode
+[SongStaticTeam1Joker1]
+Tex =Joker
+X =530
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker2]
+Tex =Joker
+X =580
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker3]
+Tex =Joker
+X =630
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker4]
+Tex =Joker
+X =680
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker5]
+Tex =Joker
+X =730
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker1]
+Tex =Joker
+X =530
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker2]
+Tex =Joker
+X =580
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker3]
+Tex =Joker
+X =630
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker4]
+Tex =Joker
+X =680
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker5]
+Tex =Joker
+X =730
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker1]
+Tex =Joker
+X =530
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker2]
+Tex =Joker
+X =580
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker3]
+Tex =Joker
+X =630
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker4]
+Tex =Joker
+X =680
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker5]
+Tex =Joker
+X =730
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+
+##################### Sing Screen ###################
+
+
+[Sing]
+Texts =1
+
+
+[SingText1]
+Text =SING_TIME
+X =21
+Y =574
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingStatic1]
+;TextBG
+Tex =LyricBar
+X =10
+Y =490
+W =780
+H =85
+Color =White
+Type=Font Black
+
+[SingStatic2]
+;TimeBar
+Tex =TimeBar1
+X =10
+Y =575
+W =780
+H =16
+Color=Black
+Type=Font Black
+
+[SingTimeProgress]
+X =70
+Y =580
+W =652
+H =7
+Color=White
+
+[SingStatic3]
+;the thing behind the time progress
+Tex =TimeBar2
+X =70
+Y =580
+W =652
+H =7
+Color=GrayDark
+Type=Font Black
+
+[SingTimeText]
+Text =SING_TIME
+X =754
+Y =574
+Font =1
+Size =6
+Color =White
+Align=1
+
+# O N E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#PlayerOne
+[SingP1Static]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1Text]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1Static2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1SingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T W O P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1TwoPStatic]
+Tex =P
+X =20
+Y =117
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPText]
+Text =P1
+X =26
+Y =122
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1TwoPStatic2]
+Tex =ScoreBG
+X =680
+Y =102
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPTextScore]
+Text =00000
+X =690
+Y =104
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1TwoPSingBar]
+X =680
+Y =136
+W =100
+H =8
+
+#Player Two
+[SingP2RStatic]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P2Dark
+Type=Transparent
+
+[SingP2RText]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP2RStatic2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2RTextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2RSingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T H R E E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1ThreePStatic]
+Tex =P
+X =16
+Y =59
+W =50
+H =54
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePText]
+Text =P1
+X =27
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP1ThreePStatic2]
+Tex =ScoreBG
+X =75
+Y =61
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePTextScore]
+Text =00000
+X =85
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1ThreePSingBar]
+X =75
+Y =95
+W =100
+H =8
+
+#Player Two
+[SingP2MStatic]
+Tex =P
+X =311
+Y =59
+W =50
+H =54
+Color =P2Dark
+Type=Transparent
+
+[SingP2MText]
+Text =P2
+X =321
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP2MStatic2]
+Tex =ScoreBG
+X =370
+Y =61
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2MTextScore]
+Text =00000
+X =380
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2MSingBar]
+X =370
+Y =95
+W =100
+H =8
+
+#Player Three
+[SingP3RStatic]
+Tex =P
+X =611
+Y =59
+W =50
+H =54
+Color =P3Dark
+Type=Transparent
+
+[SingP3RText]
+Text =P3
+X =621
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP3RStatic2]
+Tex =ScoreBG
+X =670
+Y =61
+W =100
+H =34
+Color =P3Dark
+Type=Transparent
+
+[SingP3RTextScore]
+Text =00000
+X =680
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP3SingBar]
+X =670
+Y =95
+W =100
+H =8
+
+
+
+############### Score #####################
+
+
+
+[Score]
+Texts =1
+
+[ScoreBackground]
+Tex=ScoreScreenBG
+
+[ScoreText1]
+X =68
+Y =30
+Color=White
+Font =0
+Size =20
+Text=SONG_SCORE
+Align=0
+
+[ScoreTextArtistTitle]
+X =70
+Y =77
+Color=White
+Font =0
+Size =10
+Align =0
+Text=ArtistTitle
+
+[ScoreStatic1]
+X =32
+Y =46
+W =27
+H =27
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[ScoreStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SONG_SCORE_WHEREAMI
+
+[ScoreStatic4]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+
+[ScoreText3]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+#end of main stuff
+
+# # # # # # # # # # # # # # # # # # One Player Score # # # # # # # # # # # #
+[ScoreTextName1]
+X =175
+Y =260
+Font =0
+Size =14
+Text =P1
+Color=White
+Align=0
+
+[ScoreTextScore1]
+X =175
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes1]
+X =175
+Y =340
+Color=White
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore1]
+X =465
+Y =340
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextLineBonus1]
+X =175
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore1]
+X =465
+Y =370
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextGoldenNotes1]
+X =175
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore1]
+X =465
+Y =400
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextTotal1]
+X =205
+Y =460
+Color=White
+Font =0
+Size =14
+Text=SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore1]
+X =465
+Y =460
+Color=White
+Font =0
+Size =14
+Align =2
+Text =0
+
+#Lines
+[ScorePlayer1Static1]
+Tex =ScoreLine
+X =173
+Y =338
+W =295
+H =2
+Color =GrayLight
+Type =Font Black
+
+[ScorePlayer1Static2]
+Tex =ScoreLine
+X =173
+Y =368
+W =295
+H =2
+Color =GrayLight
+Type =Font Black
+
+[ScorePlayer1Static3]
+Tex =ScoreLine
+X =173
+Y =398
+W =295
+H =2
+Color =GrayLight
+Type =Font Black
+
+[ScorePlayer1Static4]
+Tex =ScoreLine
+X =173
+Y =428
+W =295
+H =2
+Color =GrayLight
+Type =Font Black
+
+[ScorePlayer1Static5]
+Tex =ScoreLine
+X =173
+Y =458
+W =295
+H =4
+Type =Font Black
+Color =GrayLight
+
+[ScoreStaticBoxDark1]
+Tex =PlayerNumberBox
+X =175
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Text1]
+X =179
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel1]
+Tex =ScoreLevel
+X =475
+Y =160
+W =150
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =130
+W =150
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel1]
+Tex =ScoreLevel
+X =475
+Y =410
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =380
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer1Static6]
+Tex =ScoreEndCap
+X =494
+Y =460
+W =112
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Static7]
+Tex =ScoreLine
+X =493
+Y =460
+W =114
+H =2
+Color =GrayLight
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+
+# # # # # # # # # # # # # # # # # # Two Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName2]
+X =20
+Y =260
+Font =0
+Size =14
+Text =P1
+Color=White
+Align=0
+
+[ScoreTextScore2]
+X =20
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes2]
+X =20
+Y =340
+Color=White
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore2]
+X =300
+Y =340
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextLineBonus2]
+X =20
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore2]
+X =300
+Y =370
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextGoldenNotes2]
+X =20
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore2]
+X =300
+Y =400
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextTotal2]
+X =50
+Y =460
+Color=White
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore2]
+X =300
+Y =460
+Color=White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+# Lines
+[ScorePlayer2Static1]
+Tex =ScoreLine
+X =20
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer2Static2]
+Tex =ScoreLine
+X =20
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer2Static3]
+Tex =ScoreLine
+X =20
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer2Static4]
+Tex =ScoreLine
+X =20
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer2Static5]
+Tex =ScoreLine
+X =20
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =GrayLight
+
+[ScoreStaticBoxDark2]
+Tex =PlayerNumberBox
+X =20
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Text1]
+X =24
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel2]
+Tex =ScoreLevel
+X =293
+Y =160
+W =120
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =130
+W =120
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScoreStaticLevel2]
+Tex =ScoreLevel
+X =293
+Y =410
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =380
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScorePlayer2Static6]
+Tex =ScoreEndCap
+X =308
+Y =460
+W =90
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Static7]
+Tex =ScoreLine
+X =307
+Y =460
+W =92
+H =2
+Color =WhiteLight
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# P L A Y E R T W O
+[ScoreTextName3]
+X =780
+Y =260
+Font =0
+Size =14
+Text =P2
+Color=White
+Align=2
+
+[ScoreTextScore3]
+X =780
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=2
+
+[ScoreTextNotes3]
+X =780
+Y =340
+Color=White
+Font =0
+Size =9
+Text =SING_NOTES
+Align=2
+
+[ScoreTextNotesScore3]
+X =500
+Y =340
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextLineBonus3]
+X =780
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=2
+
+[ScoreTextLineBonusScore3]
+X =500
+Y =370
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextGoldenNotes3]
+X =780
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=2
+
+[ScoreTextGoldenNotesScore3]
+X =500
+Y =400
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextTotal3]
+X =750
+Y =460
+Color=White
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=2
+Reflection=1
+ReflectionSpacing=4
+
+[ScoreTextTotalScore3]
+X =500
+Y =460
+Color=White
+Font =0
+Size =14
+Align =0
+Text =00000
+Reflection=1
+ReflectionSpacing=4
+
+#Lines
+[ScorePlayer3Static1]
+Tex =ScoreLine
+X =500
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer3Static2]
+Tex =ScoreLine
+X =500
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer3Static3]
+Tex =ScoreLine
+X =500
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer3Static4]
+Tex =ScoreLine
+X =500
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer3Static5]
+Tex =ScoreLine
+X =500
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =GrayLight
+
+[ScoreStaticBoxDark3]
+Tex =PlayerNumberBox
+X =755
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Text1]
+X =759
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+#ScoreBar
+[ScoreStaticBackLevel3]
+Tex =ScoreLevel
+X =387
+Y =160
+W =120
+H =300
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =130
+W =120
+H =30
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel3]
+Tex =ScoreLevel
+X =387
+Y =410
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =380
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScorePlayer3Static6]
+Tex =ScoreEndCap
+X =402
+Y =460
+W =90
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Static7]
+Tex =ScoreLine
+X =401
+Y =460
+W =92
+H =2
+Color =WhiteLight
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# # # # # # # # # # # # # # # # # # Three Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName4]
+X=20
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P1
+Color=P1Dark
+
+[ScoreTextNotes4]
+X=20
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore4]
+X=260
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus4]
+X=20
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore4]
+X=260
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes4]
+X=20
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore4]
+X=260
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore4]
+X=20
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal4]
+X=47
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore4]
+X=260
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark4]
+Tex =PlayerNumberBox
+X =20
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer4Text1]
+X =24
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#lines
+[ScorePlayer4Static1]
+X=20
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer4Static2]
+X=20
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer4Static3]
+X=20
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer4Static4]
+X=20
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer4Static5]
+X=20
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+# P L A Y E R T W O
+[ScoreTextName5]
+X=280
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P2
+Color=P2Dark
+
+[ScoreTextNotes5]
+X=280
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore5]
+X=520
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus5]
+X=280
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore5]
+X=520
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes5]
+X=280
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore5]
+X=520
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore5]
+X=280
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal5]
+X=307
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore5]
+X=520
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark5]
+Tex =PlayerNumberBox
+X =280
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer5Text1]
+X =284
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+[ScorePlayer5Static1]
+X=280
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer5Static2]
+X=280
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer5Static3]
+X=280
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer5Static4]
+X=280
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer5Static5]
+X=280
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+# P L A Y E R T H R E E
+[ScoreTextName6]
+X=540
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P3
+Color=P3Dark
+
+[ScoreTextNotes6]
+X=540
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore6]
+X=780
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus6]
+X=540
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore6]
+X=780
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes6]
+X=540
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore6]
+X=780
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore6]
+X=540
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal6]
+X=567
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore6]
+X=780
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark6]
+Tex =PlayerNumberBox
+X =540
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P3Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer6Text1]
+X =544
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P3
+
+#lines
+[ScorePlayer6Static1]
+X=540
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer6Static2]
+X=540
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer6Static3]
+X=540
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer6Static4]
+X=540
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer6Static5]
+X=540
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+
+
+############### Options #######################
+
+
+[Options]
+Texts = 6
+Fade = 2
+
+[OptionsBackground]
+Tex=OptionsBG
+
+[OptionsStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color=White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color=White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsStatic6]
+X =512
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsText1]
+X =70
+Y =30
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_WHEREAMI
+
+
+[OptionsText3]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsText4]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_SELECT
+
+[OptionsText5]
+X =538
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsButtonGame]
+X =100
+Y =215
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonGameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_GAME
+Color=Black
+
+[OptionsButtonGraphics]
+X =255
+Y =215
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonGraphicsText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_GRAPHICS
+Color=Black
+
+[OptionsButtonSound]
+X =410
+Y =215
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonSoundText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_SOUND
+Color=Black
+
+[OptionsButtonLyrics]
+X =565
+Y =215
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonLyricsText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_LYRICS
+Color=Black
+
+[OptionsButtonThemes]
+X =100
+Y =335
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonThemesText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_THEMES
+Color=Black
+
+[OptionsButtonRecord]
+X =255
+Y =335
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonRecordText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_RECORD
+Color=Black
+Texts=1
+
+[OptionsButtonAdvanced]
+X =410
+Y =335
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonAdvancedText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_ADVANCED
+Color=Black
+Texts=1
+
+[OptionsButtonExit]
+X =565
+Y =335
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonExitText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=Black
+
+[OptionsGame]
+Texts = 5
+
+[OptionsGameBackground]
+Tex=OptionsBG
+
+[OptionsGameStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGameStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGameStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGameStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsGameStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsGameText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGameText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GAME_WHEREAMI
+
+[OptionsGameText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GAME_DESC
+
+[OptionsGameText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGameText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGameSelectPlayers]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_PLAYERS
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGameSelectDifficulty]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DIFFICULTY
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+
+[OptionsGameSelectSlideLanguage]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_LANGUAGE
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGameSelectTabs]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_TABS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGameSelectSlideSorting]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_SORTING
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGameSelectDebug]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DEBUG
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGameButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color =GrayLightest
+DColor = GrayLight
+Type = Font Black
+TColor = Black
+
+[OptionsGraphics]
+Texts = 5
+
+[OptionsGraphicsBackground]
+Tex=OptionsBG
+
+[OptionsGraphicsStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGraphicsStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsGraphicsStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsGraphicsText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGraphicsText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GRAPHICS_WHEREAMI
+
+[OptionsGraphicsText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GRAPHICS_DESC
+
+[OptionsGraphicsText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGraphicsText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGraphicsSelectSlideResolution]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_GRAPHICS_RESOLUTION
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGraphicsSelectFullscreen]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_FULLSCREEN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGraphicsSelectDepth]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_DEPTH
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGraphicsSelectOscilloscope]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_OSCILLOSCOPE
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGraphicsSelectMovieSize]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_MOVIE_SIZE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGraphicsButtonExit]
+X = 40
+Y = 360
+W = 230
+H = 70
+Tex =MainBar
+Color = GrayLightest
+DColor = GrayLight
+Type = Font Black
+
+[OptionsSound]
+Texts = 5
+
+[OptionsSoundBackground]
+Tex=OptionsBG
+
+[OptionsSoundStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsSoundStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex = ButtonNavi
+Color = GrayLight
+Type = Font Black
+
+[OptionsSoundStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsSoundText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsSoundText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_SOUND_WHEREAMI
+
+[OptionsSoundText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_SOUND_DESC
+
+[OptionsSoundText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsSoundText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsSoundSelectMicBoost]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_MIC_BOOST
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundSelectClickAssist]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_CLICK_ASSIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundSelectBeatClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_BEAT_CLICK
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundSelectThreshold]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_THRESHOLD
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundSelectTwoPlayerMode]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_TWO_PLAYERS_MODE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundSelectSlidePreviewVolume]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWVOLUME
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundSelectSlidePreviewFADING]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWFADING
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = GrayLightest
+DColor = GrayLight
+Type = Font Black
+
+[OptionsLyrics]
+Texts = 1
+
+[OptionsLyricsBackground]
+Tex=OptionsBG
+
+[OptionsLyricsStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsLyricsStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsLyricsStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsLyricsText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsLyricsText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_LYRICS_WHEREAMI
+
+[OptionsLyricsText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_LYRICS_DESC
+
+[OptionsLyricsText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsLyricsText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsLyricsSelectLyricsFont]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_FONT
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsLyricsSelectLyricsEffect]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_EFFECT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsLyricsSelectSolmization]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_SOLMIZATION
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsLyricsButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color =GrayLightest
+DColor = GrayLight
+Type = Font Black
+
+[OptionsThemes]
+Texts = 5
+
+[OptionsThemesBackground]
+Tex=OptionsBG
+
+[OptionsThemesStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsThemesStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsThemesStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsThemesText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsThemesText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_THEMES_WHEREAMI
+
+[OptionsThemesText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_THEMES_DESC
+
+[OptionsThemesText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsThemesText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsThemesSelectTheme]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_THEME
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsThemesSelectSkin]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_SKIN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsThemesSelectColor]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_COLOR
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsThemesButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = GrayLightest
+DColor = Light
+Type = Font Black
+
+
+
+[OptionsRecord]
+Texts = 5
+
+[OptionsRecordBackground]
+Tex=OptionsBG
+
+[OptionsRecordStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsRecordStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsRecordStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsRecordText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsRecordText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_RECORD_WHEREAMI
+
+[OptionsRecordText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_RECORD_DESC
+
+[OptionsRecordText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsRecordText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsRecordSelectSlideCard]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CARD
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsRecordSelectSlideInput]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_INPUT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsRecordSelectSlideChannelL]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELL
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsRecordSelectSlideChannelR]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELR
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsRecordButtonExit]
+X = 40
+Y = 305
+W = 230
+H = 70
+Tex = MainBar
+Color =GrayLightest
+DColor = GrayLight
+Type = Font Black
+
+[OptionsAdvanced]
+Texts = 5
+
+[OptionsAdvancedBackground]
+Tex=OptionsBG
+
+[OptionsAdvancedStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsAdvancedStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color=White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsAdvancedStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsAdvancedText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsAdvancedText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_ADVANCED_WHEREAMI
+
+[OptionsAdvancedText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_ADVANCED_DESC
+
+[OptionsAdvancedText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsAdvancedText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsAdvancedSelectScreenFade]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_SCREENFADE
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsAdvancedSelectEffectSing]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_EFFECTSING
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsAdvancedSelectLineBonus]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_LINEBONUS
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsAdvancedSelectSlideOnSongClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_ADVANCED_ONSONGCLICK
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsAdvancedSelectAskbeforeDel]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_ASKBEFOREDEL
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsAdvancedSelectPartyPopup]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_PARTYPOPUP
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsAdvancedButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color =GrayLightest
+DColor = GrayLight
+Type = Font Black
+
+
+
+##################### Top 5 ########################
+
+
+
+[Top5]
+Texts=1
+
+[Top5Background]
+Tex=Top5BG
+
+[Top5Text1]
+X =85
+Y =452
+Color=White
+Font =0
+Size =20
+Align=0
+Text =SING_TOP_5_CHARTS
+
+[Top5TextArtistTitle]
+X =87
+Y =499
+Color =White
+Font =0
+Size =10
+Align =0
+Text =artist - title
+
+[Top5Text4]
+X =87
+Y =520
+Color=White
+Font =0
+Size =10
+Align=0
+Text =SING_OPTIONS_GAME_DIFFICULTY
+
+[Top5TextLevel]
+X =1200
+Y =520
+Color =White
+Font =0
+Size =10
+Align =0
+Text =easy
+
+[Top5Static1]
+X =49
+Y =468
+W =27
+H =27
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[Top5Static2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[Top5Static3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[Top5Text2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_TOP_5_CHARTS_WHEREAMI
+
+[Top5Static4]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+
+[Top5Text3]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_TOP_5_CHARTS_CONTINUE
+
+[Top5TextName1]
+X =150
+Y =190
+Color =White
+Font =0
+Size =14
+Align =0
+Text =1. Player1
+
+[Top5TextName2]
+X =150
+Y =240
+Color =White
+Font =0
+Size =14
+Align =0
+Text =2. Player2
+
+[Top5TextName3]
+X =150
+Y =290
+Color =White
+Font =0
+Size =14
+Align =0
+Text =3. Player3
+
+[Top5TextName4]
+X =150
+Y =340
+Color =White
+Font =0
+Size =14
+Align =0
+Text =4. Player4
+
+[Top5TextName5]
+X =150
+Y =390
+Color =White
+Font =0
+Size =14
+Align =0
+Text =5. Player5
+
+[Top5TextScore1]
+X =680
+Y =190
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore2]
+X =680
+Y =240
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore3]
+X =680
+Y =290
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore4]
+X =680
+Y =340
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore5]
+X =680
+Y =390
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextNumber1]
+X =120
+Y =193
+Color =White
+Font =1
+Size =9
+Align =1
+Text =1
+
+[Top5TextNumber2]
+X =120
+Y =243
+Color =White
+Font =1
+Size =9
+Align =1
+Text =2
+
+[Top5TextNumber3]
+X =120
+Y =293
+Color =White
+Font =1
+Size =9
+Align =1
+Text =3
+
+[Top5TextNumber4]
+X =120
+Y =343
+Color =White
+Font =1
+Size =9
+Align =1
+Text =4
+
+[Top5TextNumber5]
+X =120
+Y =393
+Color =White
+Font =1
+Size =9
+Align =1
+Text =5
+
+[Top5StaticNumber1]
+Tex=PlayerNumberBox
+X=100
+Y=186
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber2]
+Tex=PlayerNumberBox
+X=100
+Y=236
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber3]
+Tex=PlayerNumberBox
+X=100
+Y=286
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber4]
+Tex=PlayerNumberBox
+X=100
+Y=336
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber5]
+Tex=PlayerNumberBox
+X=100
+Y=386
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+
+
+
+
+###################### Party Modus ####################
+
+
+
+
+[PartyNewRound]
+Texts =7
+
+[PartyNewRoundBackground]
+Tex=SongBG
+
+[PartyNewRoundStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyNewRoundText1]
+X =70
+Y =27
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyNewRoundText2]
+X =70
+Y =72
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_ROUND_DESC
+
+[PartyNewRoundText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_ROUND_WHEREAMI
+
+[PartyNewRoundText4]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_ROUND_LEGEND_CONTINUE
+
+[PartyNewRoundText5]
+X =460
+Y =100
+Color =Black
+Font =0
+Size =10
+Text =PARTY_ROUND
+Align=0
+
+[PartyNewRoundText6]
+X =600
+Y =100
+Color =Black
+Font =0
+Size =10
+Text =PARTY_ROUND_WINNER
+Align=0
+
+[PartyNewRoundText7]
+X =448
+Y =350
+Color =Black
+Font =0
+Size =18
+Text =PARTY_ROUND
+Align=2
+
+[PartyNewRoundTextTeam1Players]
+X =30
+Y =137
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam2Players]
+X =30
+Y =218
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam3Players]
+X =30
+Y =299
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundStatic4]
+Tex =PartyRoundBG1
+X =450
+Y =103
+W = 330
+H = 24
+Int=1
+Color =GrayLight
+Type=Font Black
+
+[PartyNewRoundStatic5]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[PartyNewRoundStatic6]
+Tex =PartyRoundBG3
+X =250
+Y =350
+W = 300
+H = 50
+Int=1
+Color =GrayLight
+Type=Font Black
+
+[PartyNewRoundStatic7]
+Tex =PartyRoundBG4
+X =50
+Y =495
+W = 700
+H = 30
+Int=1
+Color = GrayLight
+Type=Font Black
+
+[PartyNewRoundStaticTeam1]
+Tex =PartyTeamButton1
+X =20
+Y =110
+W =400
+H =50
+Int=1
+Color =P1Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam2]
+Tex =PartyTeamButton1
+X =20
+Y =191
+W =400
+H =50
+Int=1
+Color =P2Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam3]
+Tex =PartyTeamButton1
+X =20
+Y =272
+W =400
+H =50
+Int=1
+Color =P3Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticNextPlayer1]
+Tex=PartyPlayerButton
+X=155
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P1Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer2]
+Tex=PartyPlayerButton
+X=325
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P2Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer3]
+Tex=PartyPlayerButton
+X=495
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P3Light
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyNewRoundTextRound1]
+X =460
+Y =133
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 1
+Align=0
+
+[PartyNewRoundTextRound2]
+X =460
+Y =162
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 2
+Align=0
+
+[PartyNewRoundTextRound3]
+X =460
+Y =191
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 3
+Align=0
+
+[PartyNewRoundTextRound4]
+X =460
+Y =220
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 4
+Align=0
+
+[PartyNewRoundTextRound5]
+X =460
+Y =249
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 5
+Align=0
+
+[PartyNewRoundTextRound6]
+X =460
+Y =278
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 6
+Align=0
+
+[PartyNewRoundTextRound7]
+X =460
+Y =307
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 7
+Align=0
+
+[PartyNewRoundTextWinner1]
+X =600
+Y =133
+Color =Black
+Font =0
+Size =8
+Text =Winner 1
+Align=0
+
+[PartyNewRoundTextWinner2]
+X =600
+Y =162
+Color =Black
+Font =0
+Size =8
+Text =Winner 2
+Align=0
+
+[PartyNewRoundTextWinner3]
+X =600
+Y =191
+Color =Black
+Font =0
+Size =8
+Text =Winner 3
+Align=0
+
+[PartyNewRoundTextWinner4]
+X =600
+Y =220
+Color =Black
+Font =0
+Size =8
+Text =Winner 4
+Align=0
+
+[PartyNewRoundTextWinner5]
+X =600
+Y =249
+Color =Black
+Font =0
+Size =8
+Text =Winner 5
+Align=0
+
+[PartyNewRoundTextWinner6]
+X =600
+Y =278
+Color =Black
+Font =0
+Size =8
+Text =Winner 6
+Align=0
+
+[PartyNewRoundTextWinner7]
+X =600
+Y =307
+Color =Black
+Font =0
+Size =8
+Text =Winner 7
+Align=0
+
+[PartyNewRoundStaticRound1]
+Tex =PartyRoundBG2
+X =450
+Y =135
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundStaticRound2]
+Tex =PartyRoundBG2
+X =450
+Y =164
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundStaticRound3]
+Tex =PartyRoundBG2
+X =450
+Y =193
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundStaticRound4]
+Tex =PartyRoundBG2
+X =450
+Y =222
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundStaticRound5]
+Tex =PartyRoundBG2
+X =450
+Y =251
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundStaticRound6]
+Tex =PartyRoundBG2
+X =450
+Y =280
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundStaticRound7]
+Tex =PartyRoundBG2
+X =450
+Y =309
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundTextNextRound]
+X =400
+Y =495
+Color =Black
+Font =0
+Size =10
+Text =Next Round
+Align=1
+
+[PartyNewRoundTextNextRoundNo]
+X =457
+Y =350
+Color =Black
+Font =0
+Size =18
+Text =99
+Align=0
+
+[PartyNewRoundTextScoreTeam1]
+X =390
+Y =110
+Color =White
+Font =0
+Size =17
+Text =3000
+Align=1
+
+[PartyNewRoundTextScoreTeam2]
+X =390
+Y =191
+Color =White
+Font =0
+Size =17
+Text =2000
+Align=1
+
+[PartyNewRoundTextScoreTeam3]
+X =390
+Y =272
+Color =White
+Font =0
+Size =17
+Text =1000
+Align=1
+
+[PartyNewRoundTextNameTeam1]
+X =30
+Y =108
+Color =White
+Font =0
+Size =12
+Text =Team 1
+Align=0
+
+[PartyNewRoundTextNameTeam2]
+X =30
+Y =189
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyNewRoundTextNameTeam3]
+X =30
+Y =270
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyNewRoundTextNextPlayer1]
+X =230
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 1
+Align=1
+
+[PartyNewRoundTextNextPlayer2]
+X =400
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 2
+Align=1
+
+[PartyNewRoundTextNextPlayer3]
+X =570
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 3
+Align=1
+
+
+[PartyScore]
+Texts=5
+
+[PartyScoreBackground]
+Tex=PartyBG
+
+[PartyScoreDecoTextures]
+ChangeTextures =1
+
+FirstTexture =PartyScoreDeco
+FirstTyp =Font Black
+FirstColor =Gold
+
+SecondTexture =PartyScoreDeco
+SecondTyp =Font Black
+SecondColor =Silver
+
+ThirdTexture =PartyScoreDeco
+ThirdTyp =Font Black
+ThirdColor =Bronze
+
+[PartyScoreStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyScoreStatic4]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+
+[PartyScoreText1]
+X =70
+Y =29
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyScoreText2]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_SCORE_DESC
+
+[PartyScoreText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_SCORE_WHEREAMI
+
+[PartyScoreText4]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_LEGEND_CONTINUE
+
+[PartyScoreStatic5]
+Tex =PartyScoreBG1
+X =50
+Y =100
+W = 700
+H = 80
+Int=1
+Color =GrayLight
+Type=Font Black
+
+[PartyScoreStatic6]
+Tex =PartyScoreBG2
+X =50
+Y =495
+W = 700
+H = 20
+Int=1
+Color =GrayLightest
+Type=Font Black
+
+[PartyScoreText5]
+X =400
+Y =136
+Color =Black
+Font =0
+Size =15
+Text =PARTY_SCORE_WINS2
+Align=1
+
+[PartyScoreTextWinner]
+X =400
+Y =98
+Color =Black
+Font =0
+Size =18
+Text =The Winner is...
+Align=1
+
+[PartyScoreTextScoreTeam1]
+X =568
+Y =198
+Color =White
+Font =0
+Size =12
+Text =3000
+Align=2
+
+[PartyScoreTextScoreTeam2]
+X =568
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyScoreTextScoreTeam3]
+X =568
+Y =398
+Color =White
+Font =0
+Size =12
+Text =1000
+Align=2
+
+[PartyScoreTextNameTeam1]
+X =188
+Y =198
+Font=0
+Size=12
+Align=0
+Text=Team 1
+Color=White
+
+[PartyScoreTextNameTeam2]
+X =188
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyScoreTextNameTeam3]
+X =188
+Y =398
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyScoreStaticTeam1]
+X =188
+Y =230
+W =380
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam1BG]
+Tex=PartyTeamButton2
+X=178
+Y=200
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam1Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 191
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam2]
+X =188
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam2BG]
+Tex=PartyTeamButton2
+X=178
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam2Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam3]
+X =188
+Y =430
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam3BG]
+Tex=PartyTeamButton2
+X=178
+Y=400
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam3Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 391
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyWin]
+Texts=4
+
+[PartyWinBackground]
+Tex=PartyBG
+
+[PartyWinStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyWinStatic4]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+
+[PartyWinText1]
+X =70
+Y =29
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyWinText2]
+X =72
+Y =72
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_WIN_DESC
+
+[PartyWinText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_WIN_WHEREAMI
+
+[PartyWinText4]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_WIN_LEGEND_CONTINUE
+
+[PartyWinTextScoreTeam1]
+X =699
+Y =183
+Color =White
+Font =0
+Size =19
+Text =3000
+Align=2
+
+[PartyWinTextScoreTeam2]
+X =669
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyWinTextScoreTeam3]
+X =649
+Y =398
+Color =White
+Font =0
+Size =9
+Text =1000
+Align=2
+
+[PartyWinTextNameTeam1]
+X =169
+Y =183
+Font=0
+Size=19
+Align=0
+Text=Team 1
+Color=White
+
+[PartyWinTextNameTeam2]
+X =289
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyWinTextNameTeam3]
+X =369
+Y =398
+Color =White
+Font =0
+Size =9
+Text =Team 3
+Align=0
+
+[PartyWinStaticTeam1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BG]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank2]
+Tex=PartyTeamButton3
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank3]
+Tex=PartyTeamButton3
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyWinStaticTeam1Deco]
+Tex =PartyWinDeco1
+X = 91
+Y = 176
+W = 79
+H = 79
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BG]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamButton3
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank1]
+Tex=PartyTeamButton4
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank2]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank3]
+Tex=PartyTeamButton4
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Deco]
+Tex =PartyWinDeco2
+X = 226
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Silver
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BG]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank2]
+Tex=PartyTeamButton5
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank3]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Deco]
+Tex =PartyWinDeco3
+X = 316
+Y = 391
+W = 54
+H = 54
+Type =Font Black
+Color =Bronze
+Reflection=1
+ReflectionSpacing=3
+
+
+
+
+[PartyOptions]
+Texts = 5
+
+[PartyOptionsBackground]
+Tex=PartyBG
+
+[PartyOptionsStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyOptionsStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[PartyOptionsStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[PartyOptionsText1]
+X =70
+Y =29
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyOptionsText2]
+X =72
+Y =72
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_OPTIONS_DESC
+
+[PartyOptionsText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_OPTIONS_WHEREAMI
+
+[PartyOptionsText4]
+X =294
+Y =3
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyOptionsText5]
+X =418
+Y =3
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[PartyOptionsSelectLevel]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_DIFFICULTY
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectPlayList]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectPlayList2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectRounds]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_ROUNDS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectTeams]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectPlayers1]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER1
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectPlayers2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER2
+X = 40
+Y = 415
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectPlayers3]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER3
+X = 40
+Y = 470
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+
+
+[PartyPlayer]
+Texts=6
+
+[PartyPlayerBackground]
+Tex=PartyBG
+
+[PartyPlayerStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =WhiteLight
+Tex =PartyIcon
+Type=Font Black
+
+[PartyPlayerStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerStatic6]
+X =556
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerText1]
+X =70
+Y =27
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyPlayerText2]
+X =72
+Y =72
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_PLAYER_DESC
+
+[PartyPlayerText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_PLAYER_WHEREAMI
+
+[PartyPlayerText4]
+X =294
+Y =3
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyPlayerText5]
+X =418
+Y =3
+Color=White
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_ENTER_NAME
+
+[PartyPlayerText6]
+X =586
+Y =3
+Color=White
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_LEGEND_CONTINUE
+
+[PartyPlayerTeam1Name]
+Tex=PartyTeamButton2
+X=85
+Y=100
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Dark
+
+[PartyPlayerTeam1NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 1
+Color=White
+
+[PartyPlayerPlayer1Name]
+Tex=Button
+X=85
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer1NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 1
+Color=White
+
+[PartyPlayerPlayer2Name]
+Tex=Button
+X=245
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer2NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 2
+Color=White
+
+[PartyPlayerPlayer3Name]
+Tex=Button
+X=405
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer3NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 3
+Color=White
+
+[PartyPlayerPlayer4Name]
+Tex=Button
+X=565
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer4NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 4
+Color=White
+
+[PartyPlayerTeam2Name]
+Tex=PartyTeamButton2
+X=85
+Y=240
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Dark
+
+[PartyPlayerTeam2NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 2
+Color=White
+
+[PartyPlayerPlayer5Name]
+Tex=Button
+X=85
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer5NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 5
+Color=White
+
+[PartyPlayerPlayer6Name]
+Tex=Button
+X=245
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer6NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 6
+Color=White
+
+[PartyPlayerPlayer7Name]
+Tex=Button
+X=405
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer7NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 7
+Color=White
+
+[PartyPlayerPlayer8Name]
+Tex=Button
+X=565
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer8NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 8
+Color=White
+
+[PartyPlayerTeam3Name]
+Tex=Button
+Tex=PartyTeamButton2
+X=85
+Y=380
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Dark
+
+[PartyPlayerTeam3NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 3
+Color=White
+
+[PartyPlayerPlayer9Name]
+Tex=Button
+X=85
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer9NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 9
+Color=White
+
+[PartyPlayerPlayer10Name]
+Tex=Button
+X=245
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer10NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 10
+Color=White
+
+[PartyPlayerPlayer11Name]
+Tex=Button
+X=405
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer11NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 11
+Color=White
+
+[PartyPlayerPlayer12Name]
+Tex=Button
+X=565
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer12NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 12
+Color=White
+
+
+#################### Song Menu ######################
+
+
+
+[SongMenu]
+Texts=0
+Statics=1
+
+[SongMenuButton1]
+X = 510
+Y = 165
+W = 270
+H = 25
+Tex =Rectangle
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton1Text1]
+X =30
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=SONG_MENU_PLAY
+Align=0
+Z=0.99
+
+[SongMenuButton2]
+X = 510
+Y = 195
+W = 270
+H = 25
+Tex =Rectangle
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton2Text1]
+X =30
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=SONG_MENU_EDIT
+Align=0
+Z=0.99
+
+[SongMenuButton3]
+X = 510
+Y = 225
+W = 270
+H = 25
+Tex =Rectangle
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton3Text1]
+X =30
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=SONG_MENU_MODI
+Align=0
+Z=0.99
+
+[SongMenuButton4]
+X = 510
+Y = 255
+W = 270
+H = 25
+Tex = Rectangle
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Z = 0.98
+
+[SongMenuButton4Text1]
+X =30
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=SONG_MENU_CANCEL
+Align=0
+Z=0.99
+
+[SongMenuSelectSlide3]
+Tex = Rectangle
+TexSBG = SongMenuSelectBG
+Text =
+X = 510
+Y = 225
+W = 0
+H = 25
+Z = 0.98
+SkipX = 0
+SBGW=270
+
+TextSize=8
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = Black
+STDColor = White
+
+[SongMenuTextMenu]
+X =539
+Y =125
+Color=White
+Font =0
+Size =14
+Text=MENU
+Align=0
+Z=0.99
+
+[SongMenuStatic2]
+X =513
+Y =135
+W =21
+H =21
+Color =White
+Tex =IconSongMenu
+Type=Font Black
+Z=0.98
+
+[SongMenuStatic1]
+Tex =SongMenuBG
+X =498
+Y =120
+W =300
+H =200
+Z =0.94
+Int=1
+Color =GrayLight
+Type=Font Black
+
+[SongJumpto]
+Texts=0
+Statics=1
+
+[SongJumptoStatic1]
+Tex =JumpToBG
+X =221
+Y =175
+W =355
+H =175
+Z =0.98
+Int=1
+Color =DarkOrange
+Type=Font Black
+
+[SongJumptoStatic2]
+X =234
+Y =185
+W =21
+H =21
+Color =White
+Tex =MainSearch
+Type=Font Black
+Z=0.99
+
+[SongJumptoText1]
+X =310
+Y =175
+Color=White
+Font =0
+Size =14
+Text=SONG_JUMPTO_TYPE_DESC
+Align=0
+Z=0.99
+
+[SongJumptoSelectSlideType]
+Tex = button
+TexSBG = mainicon
+#Text = SONG_JUMPTO_TYPE_DESC
+Font=1
+X = 242
+Y = 205
+Z = 0.99
+W = 0
+H = 30
+SkipX = 4
+SBGW= 300
+Fields=2
+DColor = LightOrange
+TColor = White
+TDColor = White
+SBGTex = button
+SBGDColor = LightOrange
+STColor = White
+STDColor = LightOrange
+
+[SongJumptoButtonSearchText]
+X = 250
+Y = 215
+Z = 0.99
+W = 160
+H = 50
+Size=14
+Font=1
+Align=0
+
+[SongJumptoTextFound]
+X =234
+Y =295
+Color=White
+Font =0
+Size =8
+Text=SONG_JUMPTO_HELP
+Align=0
+Z=0.99
+
+
+######################## Main Statistik ##############
+
+
+
+[StatMain]
+Texts=0
+Statics=0
+
+[StatMainBackground]
+Tex=OptionsBG
+
+[StatMainButtonScores]
+X =589
+Y =100
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonScoresText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SCORES
+Color=Black
+
+[StatMainButtonSingers]
+X =589
+Y =160
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSingersText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SINGERS
+Color=Black
+
+[StatMainButtonSongs]
+X =589
+Y =220
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSongsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_SONGS
+Color=Black
+
+[StatMainButtonBands]
+X =589
+Y =280
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonBandsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_BANDS
+Color=Black
+
+[StatMainButtonExit]
+X =589
+Y =340
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=Black
+
+[StatMainTextOverview]
+X =45
+Y =125
+W =510
+Color=White
+Font =0
+Size =9
+Align=0
+Text=
+
+[StatMainStatic1]
+X =47
+Y =466
+W =27
+H =27
+Color=White
+Tex =StatIcon
+Type=Font Black
+
+[StatMainStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color=White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatMainStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color=White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatMainStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[StatMainStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[StatMainStatic6]
+X =40
+Y =100
+W =520
+H =20
+Tex=StatMainBG1
+Color =Gray
+Type=Font Black
+
+[StatMainStatic7]
+X =40
+Y =120
+W =520
+H =300
+Tex=StatMainBG2
+Color =GrayLight
+Type=Font Black
+
+[StatMainStatic8]
+X =40
+Y =420
+W =520
+H =20
+Tex=StatMainBG3
+Color =Gray
+Type=Font Black
+
+[StatMainText1]
+X =83
+Y =452
+Color=White
+Font =0
+Size =20
+Text=STAT_MAIN
+Align=0
+
+[StatMainText2]
+X =238
+Y =5
+Color=White
+Font =0
+Size =7
+Align=2
+Text=STAT_MAIN_WHEREAMI
+
+[StatMainText3]
+X =180
+Y =490
+Color=White
+Font =0
+Size =10
+Align =0
+Text=STAT_MAIN_DESC
+
+[StatMainText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatMainText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+
+#######################Detail Statistiken##############
+
+
+
+[StatDetail]
+Texts=0
+Statics=0
+
+[StatDetailBackground]
+Tex=OptionsBG
+
+[StatDetailButtonNext]
+X =589
+Y =100
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonNextText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_NEXT
+Color=Black
+
+[StatDetailButtonPrev]
+X =589
+Y =160
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonPrevText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_PREV
+Color=Black
+
+[StatDetailButtonReverse]
+X =589
+Y =220
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonReverseText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_REVERSE
+Color=Black
+
+[StatDetailButtonExit]
+X =589
+Y =280
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=Black
+
+[StatDetailTextDescription]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=
+
+[StatDetailTextPage]
+X = 546
+Y = 98
+Color= White
+Font = 0
+Size = 5
+Align=2
+Text=
+
+[StatDetailTextList1]
+X = 45
+Y = 122
+Color=White
+Font = 0
+Size = 7
+Text=Stat1
+
+[StatDetailTextList2]
+X = 45
+Y = 160
+Color=White
+Font = 0
+Size = 7
+Text=Stat2
+
+[StatDetailTextList3]
+X = 45
+Y = 198
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList4]
+X = 45
+Y = 236
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList5]
+X = 45
+Y = 274
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList6]
+X = 45
+Y = 312
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList7]
+X = 45
+Y = 350
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList8]
+X = 45
+Y = 388
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList9]
+X = 45
+Y = 426
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList10]
+X = 45
+Y = 464
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color=White
+Tex =StatIcon
+Type=Font Black
+
+[StatDetailStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatDetailStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatDetailStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[StatDetailStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[StatDetailStatic6]
+X =40
+Y =100
+W =520
+H =24
+Tex=StatDetailBG1
+Color =Gray
+Type=Font Black
+
+[StatDetailStatic7]
+X =40
+Y =124
+W =520
+H =376
+Tex=StatMainBG2
+Color =GrayLight
+Type=Font Black
+
+[StatDetailStatic8]
+X =40
+Y =500
+W =520
+H =20
+Tex=StatMainBG3
+Color =Gray
+Type=Font Black
+
+
+[StatDetailText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=STAT_DETAIL
+Align=0
+
+[StatDetailText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=STAT_DETAIL_WHEREAMI
+
+[StatDetailText3]
+X =294
+Y =3
+ColorBlack
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatDetailText4]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+
+#######################################################
+
+
+[CheckPopup]
+Texts=1
+Statics=1
+
+[CheckPopupButton1]
+X = 285
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = White
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton1Text1]
+X =50
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=JA
+Align=1
+Z=1
+
+[CheckPopupButton2]
+X = 415
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = White
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton2Text1]
+X =50
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=NEIN
+Align=1
+Z=1
+
+[CheckPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[CheckPopupText1]
+X =282
+Y =147
+Color=White
+Font =0
+Size =10
+Text=MSG_QUESTION_TITLE
+Align=0
+Z=1
+
+[CheckPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =WhitePopup
+Type=Font Black
+
+[CheckPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[CheckPopupStatic3]
+Tex =IconQuestion
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopup]
+Texts=1
+Statics=1
+
+[ErrorPopupButton1]
+X = 350
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = White
+DColor = WhitePopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[ErrorPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=OK
+Align=1
+Z=1
+
+[ErrorPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[ErrorPopupText1]
+X =282
+Y =148
+Color=White
+Font =0
+Size =10
+Text=MSG_ERROR_TITLE
+Align=0
+Z=1
+
+[ErrorPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =WhitePopup
+Type=Font Black
+
+[ErrorPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopupStatic3]
+Tex =IconError
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black \ No newline at end of file
diff --git a/Themes/Streetlight.ini b/Themes/Streetlight.ini
new file mode 100644
index 00000000..1172623b
--- /dev/null
+++ b/Themes/Streetlight.ini
@@ -0,0 +1,8009 @@
+;0.5.1 Mod
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Theme]
+Name=Streetlight
+Creator=!Skar!™
+
+[Colors]
+White = 255 255 255
+LightBlue = 119 187 210
+DarkBlue = 28 126 171
+LightRed = 170 146 146
+DarkRed = 155 113 113
+LightGreen = 136 168 136
+DarkGreen = 106 152 104
+LightPurple = 155 136 168
+DarkPurple = 145 104 152
+LightOrange = 168 155 136
+DarkOrange = 151 131 76
+LightYellow = 168 168 136
+DarkYellow = 150 151 76
+Turkis = 13 186 167
+GrayLightest = 235 235 235
+GrayLight = 191 191 191
+Gray = 127 127 127
+GrayDark = 63 63 63
+Black = 0 0 0
+GrayPopup = 51 51 51
+Gold = 255 223 31
+Silver = 223 223 223
+Bronze = 205 127 50
+
+[Loading]
+Fade = 1
+
+[LoadingBackground]
+Tex=LoadingBG
+
+[Main]
+Texts =8
+Statics=4
+
+[MainBackground]
+Tex=MainBG
+
+[MainStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic2]
+X =254
+Y =0
+W =546
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[MainStatic3]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[MainText1]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_MENU
+
+[MainText2]
+X =295
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[MainStatic4]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[MainTextDescriptionLong]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=
+
+[MainButtonSolo]
+X =54
+Y =28
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[MainButtonSoloText1]
+X =100
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_SING
+Color=White
+
+[MainButtonMulti]
+X =54
+Y =58
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[MainButtonMultiText1]
+X =100
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_MULTI
+Color=White
+
+[MainButtonCollection1]
+X =54
+Y =88
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+Fade = 1
+FadeText = 0
+SelectW = 0
+FadeTex = HelperButton
+FadeTexPos = 3
+FirstChild=3
+
+
+[MainButtonCollection1Text1]
+X =100
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_TOOLS
+Color=White
+
+[MainButtonStats]
+X = 254
+Y = 88
+W = 125
+H = 20
+Tex = Button2
+Color = GrayDark
+DColor = Black
+Type = Font Black
+Texts = 1
+Parent = 1
+
+[MainButtonStatsText1]
+X = 10
+Y = -3
+Font = 0
+Size = 8
+Align = 0
+Text = SING_STATS
+Color = White
+
+[MainButtonEditor]
+X =254
+Y =108
+W =125
+H =20
+Tex =Button2
+Color = GrayDark
+DColor = Black
+Type=Font Black
+Texts=1
+Parent=1
+
+[MainButtonEditorText1]
+X =10
+Y =-3
+Font=0
+Size=8
+Align=0
+Text=SING_EDITOR
+Color=White
+
+[MainButtonOptions]
+X =254
+Y =128
+W =125
+H =20
+Tex =Button2
+Color = GrayDark
+DColor = Black
+Type=Font Black
+Texts=1
+Parent=1
+
+[MainButtonOptionsText1]
+X =10
+Y =-3
+Font=0
+Size=8
+Align=0
+Text=SING_OPTIONS
+Color=White
+
+[MainButtonExit]
+X =54
+Y =118
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[MainButtonExitText1]
+X =100
+Y =-1
+Font=0
+Size=10
+Align=0
+Text=SING_EXIT
+Color=White
+
+
+
+
+########################## Name Screen ###############
+
+
+
+
+[Name]
+Texts=2
+
+[NameBackground]
+Tex=MainBG
+
+[NameStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[NameStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[NameStatic3]
+X =47
+Y =466
+W =27
+H =27
+Color =White
+Tex =MainIcon
+Type=Font Black
+
+[NameText1]
+X =83
+Y =450
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=SING_MODE
+
+[NameText2]
+X =85
+Y =497
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_PLAYER_DESC
+
+[NameText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_PLAYER_WHEREAMI
+
+[NameStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[NameText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[NameStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonAZ
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[NameText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_PLAYER_ENTER_NAME
+
+[NameStatic6]
+X =556
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[NameText6]
+X =586
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[NameButtonPlayer1]
+X =54
+Y =28
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[NameButtonPlayer1Text1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=
+
+[NameButtonPlayer2]
+X =54
+Y =58
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[NameButtonPlayer2Text1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=
+
+[NameButtonPlayer3]
+X =54
+Y =88
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[NameButtonPlayer3Text1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=
+
+[NameButtonPlayer4]
+X =54
+Y =118
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[NameButtonPlayer4Text1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=
+
+[NameButtonPlayer5]
+X =54
+Y =148
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[NameButtonPlayer5Text1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=
+
+[NameButtonPlayer6]
+X =54
+Y =178
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[NameButtonPlayer6Text1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=
+
+
+
+###################### Schwierigkeitsgrad ####################
+
+
+[Level]
+Texts=5
+
+[LevelBackground]
+Tex=MainBG
+
+[LevelStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[LevelStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[LevelStatic3]
+X =47
+Y =466
+W =27
+H =27
+Color =White
+Tex =MainIcon
+Type=Font Black
+
+[LevelStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[LevelStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[LevelText1]
+X =83
+Y =450
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=SING_MODE
+
+[LevelText2]
+X =85
+Y =497
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_DIFFICULTY_DESC
+
+[LevelText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_DIFFICULTY_WHEREAMI
+
+[LevelText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[LevelText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_DIFFICULTY_CONTINUE
+
+[LevelButtonEasy]
+X =54
+Y =28
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[LevelButtonMedium]
+X =54
+Y =58
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[LevelButtonHard]
+X =54
+Y =88
+W = 200
+H = 30
+Tex = Button2
+Color=GrayDark
+DColor=Black
+Type = Font Black
+Texts = 1
+Reflection = 1
+ReflectionSpacing = 1
+DeSelectReflectionSpacing = 600
+
+[LevelButtonEasyText1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=SING_EASY
+
+[LevelButtonMediumText1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=SING_MEDIUM
+
+[LevelButtonHardText1]
+X =184
+Y =-1
+Font=0
+Size=10
+Align=2
+Color=White
+Text=SING_HARD
+
+
+##############Songscreen##################
+
+
+[Song]
+Texts =4
+
+[SongBackground]
+Tex=SongBG
+
+[SongCover]
+X=303
+Y=125
+W=320
+H=190
+Style=5
+Reflections=1
+
+[SongEqualizer]
+Visible=1
+Direction=1
+Color=GrayLightest
+Alpha=1
+X=2
+Y=584
+Z=0
+PieceW=8
+PieceH=8
+Space=6
+Bands=57
+Length=15
+
+[SongVideoIcon]
+X =299
+Y =487
+W =32
+H =32
+Z=1
+Color=GrayDark
+Tex =VideoIcon
+Type=Font Black
+
+[SongStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[SongStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[SongStatic3]
+X =250
+Y =120
+W =300
+H =200
+Z =0.5
+Color =GrayDark
+Tex =SongSelection1
+Type=Font Black
+
+[SongStatic4]
+X =298
+Y =320
+W =200
+H =200
+Z=0.98
+Color =Black
+Tex =SongSelection2
+Type=Font Black
+
+[SongTextCat]
+X =85
+Y =520
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_SONG_SELECTION_DESC
+
+[SongTextArtist]
+X =400
+Y =330
+W = 190
+Color=White
+Font =1
+Size =9
+Align =1
+Text=
+
+[SongTextTitle]
+X =400
+Y =390
+W = 190
+Color=White
+Font =0
+Size =9
+Align =1
+Text=
+
+[SongTextNumber]
+X =490
+Y =495
+Color=GrayDark
+Font =0
+Size =8
+Align =2
+Text=
+
+#Variable statics and texts for song-screen in sing- and partymode
+# There can be an unlimited Number of Statics and Texts, As long
+# as the numbers are in order.
+# Statics that are shown in PartyMode Only are Named_
+# SongStaticParty[No]
+# Texts that are shown in PartyMode Only are Named_
+# SongTextParty[No]
+# Statics that are shown in Normal Mode Only are Named_
+# SongStaticNonParty[No]
+# Texts that are shown in Normal Mode Only are Named_
+# SongTextNonParty[No]
+#Here are the ones for singmode
+
+[SongStaticNonParty1]
+X =47
+Y =466
+W =27
+H =27
+Color =White
+Tex =SongCD
+Type=Font Black
+
+[SongStaticNonParty2]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonAlt
+Color =GrayLight
+Type=Font Black
+
+[SongStaticNonParty3]
+X =300
+Y =5
+W =26
+H =22
+Tex=ButtonAZ
+Color =GrayLight
+Type=Font Black
+
+[SongStaticNonParty4]
+X =425
+Y =5
+W =22
+H =22
+Tex=ButtonM
+Color =GrayLight
+Type=Font Black
+
+[SongStaticNonParty5]
+X =515
+Y =5
+W =22
+H =22
+Tex=ButtonJ
+Color =GrayLight
+Type=Font Black
+
+[SongStaticNonParty6]
+X =679
+Y =5
+W =22
+H =22
+Tex=ButtonP
+Color =GrayLight
+Type=Font Black
+
+#Texts Non Party
+[SongTextNonParty1]
+X =83
+Y =450
+Color=White
+Font =0
+Size =20
+Text=song
+Align=0
+
+[SongTextNonParty2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_SONG_SELECTION_WHEREAMI
+
+[SongTextNonParty3]
+X =288
+Y =8
+Color=Black
+Font =1
+Size =5
+Align=0
+Text=+
+
+[SongTextNonParty4]
+X =330
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_GOTO
+
+[SongTextNonParty5]
+X =450
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_MENU
+
+[SongTextNonParty6]
+X =540
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SONG_JUMPTO_DESC
+
+[SongTextNonParty7]
+X =705
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_PLAYLIST
+
+[SongTextNonParty8]
+X =83
+Y =478
+Color=White
+Font =0
+Size =20
+Text=selection
+Align=0
+
+
+#and theese are the ones for partymode
+
+[SongStaticParty1]
+X =47
+Y =466
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[SongStaticParty2]
+X =260
+Y =5
+W =26
+H =22
+Tex=Button13
+Color =GrayLight
+Type=Font Black
+
+[SongStaticParty3]
+X =400
+Y =5
+W =22
+H =22
+Tex=ButtonM
+Color =GrayLight
+Type=Font Black
+
+[SongStaticParty4]
+X =540
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+
+#Texts for Party Mode
+
+[SongTextParty1]
+X =83
+Y =446
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=party
+
+[SongTextParty2]
+X =83
+Y =478
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=mode
+
+[SongTextParty3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_SONG_WHEREAMI
+
+[SongTextParty4]
+X =288
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SONG_MENU_NAME_PARTY_JOKER
+
+[SongTextParty5]
+X =426
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_MENU
+
+[SongTextParty6]
+X =570
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_LEGEND_CONTINUE
+
+
+
+#variable statics end
+
+
+# Jokers, 5 for each team, only shown in party Mode
+[SongStaticTeam1Joker1]
+Tex =Joker
+X =530
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker2]
+Tex =Joker
+X =580
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker3]
+Tex =Joker
+X =630
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker4]
+Tex =Joker
+X =680
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker5]
+Tex =Joker
+X =730
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker1]
+Tex =Joker
+X =530
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker2]
+Tex =Joker
+X =580
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker3]
+Tex =Joker
+X =630
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker4]
+Tex =Joker
+X =680
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker5]
+Tex =Joker
+X =730
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker1]
+Tex =Joker
+X =530
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker2]
+Tex =Joker
+X =580
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker3]
+Tex =Joker
+X =630
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker4]
+Tex =Joker
+X =680
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker5]
+Tex =Joker
+X =730
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+
+##################### Sing Screen ###################
+
+
+[Sing]
+Texts =1
+
+
+[SingText1]
+Text =SING_TIME
+X =21
+Y =574
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingStatic1]
+;TextBG
+Tex =LyricBar
+X =10
+Y =490
+W =780
+H =85
+Color =White
+Type=Font Black
+
+[SingStatic2]
+;TimeBar
+Tex =TimeBar1
+X =10
+Y =575
+W =780
+H =16
+Color=Black
+Type=Font Black
+
+[SingTimeProgress]
+X =70
+Y =580
+W =652
+H =7
+Color=White
+
+[SingStatic3]
+;the thing behind the time progress
+Tex =TimeBar2
+X =70
+Y =580
+W =652
+H =7
+Color=GrayDark
+Type=Font Black
+
+[SingTimeText]
+Text =SING_TIME
+X =754
+Y =574
+Font =1
+Size =6
+Color =White
+Align=1
+
+# O N E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#PlayerOne
+[SingP1Static]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1Text]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1Static2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1SingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T W O P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1TwoPStatic]
+Tex =P
+X =20
+Y =117
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPText]
+Text =P1
+X =26
+Y =122
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1TwoPStatic2]
+Tex =ScoreBG
+X =680
+Y =102
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPTextScore]
+Text =00000
+X =690
+Y =104
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1TwoPSingBar]
+X =680
+Y =136
+W =100
+H =8
+
+#Player Two
+[SingP2RStatic]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P2Dark
+Type=Transparent
+
+[SingP2RText]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP2RStatic2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2RTextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2RSingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T H R E E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1ThreePStatic]
+Tex =P
+X =16
+Y =59
+W =50
+H =54
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePText]
+Text =P1
+X =27
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP1ThreePStatic2]
+Tex =ScoreBG
+X =75
+Y =61
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePTextScore]
+Text =00000
+X =85
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1ThreePSingBar]
+X =75
+Y =95
+W =100
+H =8
+
+#Player Two
+[SingP2MStatic]
+Tex =P
+X =311
+Y =59
+W =50
+H =54
+Color =P2Dark
+Type=Transparent
+
+[SingP2MText]
+Text =P2
+X =321
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP2MStatic2]
+Tex =ScoreBG
+X =370
+Y =61
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2MTextScore]
+Text =00000
+X =380
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2MSingBar]
+X =370
+Y =95
+W =100
+H =8
+
+#Player Three
+[SingP3RStatic]
+Tex =P
+X =611
+Y =59
+W =50
+H =54
+Color =P3Dark
+Type=Transparent
+
+[SingP3RText]
+Text =P3
+X =621
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP3RStatic2]
+Tex =ScoreBG
+X =670
+Y =61
+W =100
+H =34
+Color =P3Dark
+Type=Transparent
+
+[SingP3RTextScore]
+Text =00000
+X =680
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP3SingBar]
+X =670
+Y =95
+W =100
+H =8
+
+
+
+############### Score #####################
+
+
+
+[Score]
+Texts =1
+
+[ScoreBackground]
+Tex=ScoreScreenBG
+
+[ScoreText1]
+X =68
+Y =30
+Color=White
+Font =0
+Size =20
+Text=SONG_SCORE
+Align=0
+
+[ScoreTextArtistTitle]
+X =70
+Y =77
+Color=White
+Font =0
+Size =10
+Align =0
+Text=ArtistTitle
+
+[ScoreStatic1]
+X =32
+Y =46
+W =27
+H =27
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[ScoreStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[ScoreText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SONG_SCORE_WHEREAMI
+
+[ScoreStatic4]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+
+[ScoreText3]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+#end of main stuff
+
+# # # # # # # # # # # # # # # # # # One Player Score # # # # # # # # # # # #
+[ScoreTextName1]
+X =175
+Y =260
+Font =0
+Size =14
+Text =P1
+Color=White
+Align=0
+
+[ScoreTextScore1]
+X =175
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes1]
+X =175
+Y =340
+Color=White
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore1]
+X =465
+Y =340
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextLineBonus1]
+X =175
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore1]
+X =465
+Y =370
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextGoldenNotes1]
+X =175
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore1]
+X =465
+Y =400
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextTotal1]
+X =205
+Y =460
+Color=White
+Font =0
+Size =14
+Text=SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore1]
+X =465
+Y =460
+Color=White
+Font =0
+Size =14
+Align =2
+Text =0
+
+#Lines
+[ScorePlayer1Static1]
+Tex =ScoreLine
+X =173
+Y =338
+W =295
+H =2
+Color =GrayLight
+Type =Font Black
+
+[ScorePlayer1Static2]
+Tex =ScoreLine
+X =173
+Y =368
+W =295
+H =2
+Color =GrayLight
+Type =Font Black
+
+[ScorePlayer1Static3]
+Tex =ScoreLine
+X =173
+Y =398
+W =295
+H =2
+Color =GrayLight
+Type =Font Black
+
+[ScorePlayer1Static4]
+Tex =ScoreLine
+X =173
+Y =428
+W =295
+H =2
+Color =GrayLight
+Type =Font Black
+
+[ScorePlayer1Static5]
+Tex =ScoreLine
+X =173
+Y =458
+W =295
+H =4
+Type =Font Black
+Color =GrayLight
+
+[ScoreStaticBoxDark1]
+Tex =PlayerNumberBox
+X =175
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Text1]
+X =179
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel1]
+Tex =ScoreLevel
+X =475
+Y =160
+W =150
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =130
+W =150
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel1]
+Tex =ScoreLevel
+X =475
+Y =410
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =380
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer1Static6]
+Tex =ScoreEndCap
+X =494
+Y =460
+W =112
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Static7]
+Tex =ScoreLine
+X =493
+Y =460
+W =114
+H =2
+Color =GrayLight
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+
+# # # # # # # # # # # # # # # # # # Two Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName2]
+X =20
+Y =260
+Font =0
+Size =14
+Text =P1
+Color=White
+Align=0
+
+[ScoreTextScore2]
+X =20
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes2]
+X =20
+Y =340
+Color=White
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore2]
+X =300
+Y =340
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextLineBonus2]
+X =20
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore2]
+X =300
+Y =370
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextGoldenNotes2]
+X =20
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore2]
+X =300
+Y =400
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextTotal2]
+X =50
+Y =460
+Color=White
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore2]
+X =300
+Y =460
+Color=White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+# Lines
+[ScorePlayer2Static1]
+Tex =ScoreLine
+X =20
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer2Static2]
+Tex =ScoreLine
+X =20
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer2Static3]
+Tex =ScoreLine
+X =20
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer2Static4]
+Tex =ScoreLine
+X =20
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer2Static5]
+Tex =ScoreLine
+X =20
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =GrayLight
+
+[ScoreStaticBoxDark2]
+Tex =PlayerNumberBox
+X =20
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Text1]
+X =24
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel2]
+Tex =ScoreLevel
+X =293
+Y =160
+W =120
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =130
+W =120
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScoreStaticLevel2]
+Tex =ScoreLevel
+X =293
+Y =410
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =380
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScorePlayer2Static6]
+Tex =ScoreEndCap
+X =308
+Y =460
+W =90
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Static7]
+Tex =ScoreLine
+X =307
+Y =460
+W =92
+H =2
+Color =WhiteLight
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# P L A Y E R T W O
+[ScoreTextName3]
+X =780
+Y =260
+Font =0
+Size =14
+Text =P2
+Color=White
+Align=2
+
+[ScoreTextScore3]
+X =780
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=2
+
+[ScoreTextNotes3]
+X =780
+Y =340
+Color=White
+Font =0
+Size =9
+Text =SING_NOTES
+Align=2
+
+[ScoreTextNotesScore3]
+X =500
+Y =340
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextLineBonus3]
+X =780
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=2
+
+[ScoreTextLineBonusScore3]
+X =500
+Y =370
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextGoldenNotes3]
+X =780
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=2
+
+[ScoreTextGoldenNotesScore3]
+X =500
+Y =400
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextTotal3]
+X =750
+Y =460
+Color=White
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=2
+Reflection=1
+ReflectionSpacing=4
+
+[ScoreTextTotalScore3]
+X =500
+Y =460
+Color=White
+Font =0
+Size =14
+Align =0
+Text =00000
+Reflection=1
+ReflectionSpacing=4
+
+#Lines
+[ScorePlayer3Static1]
+Tex =ScoreLine
+X =500
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer3Static2]
+Tex =ScoreLine
+X =500
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer3Static3]
+Tex =ScoreLine
+X =500
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer3Static4]
+Tex =ScoreLine
+X =500
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =GrayLight
+
+[ScorePlayer3Static5]
+Tex =ScoreLine
+X =500
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =GrayLight
+
+[ScoreStaticBoxDark3]
+Tex =PlayerNumberBox
+X =755
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Text1]
+X =759
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+#ScoreBar
+[ScoreStaticBackLevel3]
+Tex =ScoreLevel
+X =387
+Y =160
+W =120
+H =300
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =130
+W =120
+H =30
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel3]
+Tex =ScoreLevel
+X =387
+Y =410
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =380
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScorePlayer3Static6]
+Tex =ScoreEndCap
+X =402
+Y =460
+W =90
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Static7]
+Tex =ScoreLine
+X =401
+Y =460
+W =92
+H =2
+Color =WhiteLight
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# # # # # # # # # # # # # # # # # # Three Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName4]
+X=20
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P1
+Color=P1Dark
+
+[ScoreTextNotes4]
+X=20
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore4]
+X=260
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus4]
+X=20
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore4]
+X=260
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes4]
+X=20
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore4]
+X=260
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore4]
+X=20
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal4]
+X=47
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore4]
+X=260
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark4]
+Tex =PlayerNumberBox
+X =20
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer4Text1]
+X =24
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#lines
+[ScorePlayer4Static1]
+X=20
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer4Static2]
+X=20
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer4Static3]
+X=20
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer4Static4]
+X=20
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer4Static5]
+X=20
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+# P L A Y E R T W O
+[ScoreTextName5]
+X=280
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P2
+Color=P2Dark
+
+[ScoreTextNotes5]
+X=280
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore5]
+X=520
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus5]
+X=280
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore5]
+X=520
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes5]
+X=280
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore5]
+X=520
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore5]
+X=280
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal5]
+X=307
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore5]
+X=520
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark5]
+Tex =PlayerNumberBox
+X =280
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer5Text1]
+X =284
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+[ScorePlayer5Static1]
+X=280
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer5Static2]
+X=280
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer5Static3]
+X=280
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer5Static4]
+X=280
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer5Static5]
+X=280
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+# P L A Y E R T H R E E
+[ScoreTextName6]
+X=540
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P3
+Color=P3Dark
+
+[ScoreTextNotes6]
+X=540
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore6]
+X=780
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus6]
+X=540
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore6]
+X=780
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes6]
+X=540
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore6]
+X=780
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore6]
+X=540
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal6]
+X=567
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore6]
+X=780
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark6]
+Tex =PlayerNumberBox
+X =540
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P3Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer6Text1]
+X =544
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P3
+
+#lines
+[ScorePlayer6Static1]
+X=540
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer6Static2]
+X=540
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer6Static3]
+X=540
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer6Static4]
+X=540
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+[ScorePlayer6Static5]
+X=540
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color =GrayLight
+
+
+
+############### Options #######################
+
+
+[Options]
+Texts = 6
+Fade = 2
+
+[OptionsBackground]
+Tex=OptionsBG
+
+[OptionsStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color=White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color=White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsStatic6]
+X =512
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsText1]
+X =70
+Y =30
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_WHEREAMI
+
+
+[OptionsText3]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsText4]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_SELECT
+
+[OptionsText5]
+X =538
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsButtonGame]
+X =100
+Y =215
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonGameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_GAME
+Color=Black
+
+[OptionsButtonGraphics]
+X =255
+Y =215
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonGraphicsText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_GRAPHICS
+Color=Black
+
+[OptionsButtonSound]
+X =410
+Y =215
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonSoundText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_SOUND
+Color=Black
+
+[OptionsButtonLyrics]
+X =565
+Y =215
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonLyricsText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_LYRICS
+Color=Black
+
+[OptionsButtonThemes]
+X =100
+Y =335
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonThemesText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_THEMES
+Color=Black
+
+[OptionsButtonRecord]
+X =255
+Y =335
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonRecordText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_RECORD
+Color=Black
+Texts=1
+
+[OptionsButtonAdvanced]
+X =410
+Y =335
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonAdvancedText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_ADVANCED
+Color=Black
+Texts=1
+
+[OptionsButtonExit]
+X =565
+Y =335
+W =150
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Align=0
+Texts=1
+Fade=1
+FadeText=1
+SelectH=100
+FadeTex=ButtonFade
+FadeTexPos=0
+
+[OptionsButtonExitText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=Black
+
+[OptionsGame]
+Texts = 5
+
+[OptionsGameBackground]
+Tex=OptionsBG
+
+[OptionsGameStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGameStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGameStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGameStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsGameStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsGameText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGameText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GAME_WHEREAMI
+
+[OptionsGameText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GAME_DESC
+
+[OptionsGameText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGameText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGameSelectPlayers]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_PLAYERS
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGameSelectDifficulty]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DIFFICULTY
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+
+[OptionsGameSelectSlideLanguage]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_LANGUAGE
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGameSelectTabs]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_TABS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGameSelectSlideSorting]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_SORTING
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGameSelectDebug]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DEBUG
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGameButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color =GrayLightest
+DColor = GrayLight
+Type = Font Black
+TColor = Black
+
+[OptionsGraphics]
+Texts = 5
+
+[OptionsGraphicsBackground]
+Tex=OptionsBG
+
+[OptionsGraphicsStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGraphicsStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsGraphicsStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsGraphicsText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGraphicsText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GRAPHICS_WHEREAMI
+
+[OptionsGraphicsText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GRAPHICS_DESC
+
+[OptionsGraphicsText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGraphicsText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGraphicsSelectSlideResolution]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_GRAPHICS_RESOLUTION
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGraphicsSelectFullscreen]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_FULLSCREEN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGraphicsSelectDepth]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_DEPTH
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGraphicsSelectOscilloscope]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_OSCILLOSCOPE
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGraphicsSelectMovieSize]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_MOVIE_SIZE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsGraphicsButtonExit]
+X = 40
+Y = 360
+W = 230
+H = 70
+Tex =MainBar
+Color = GrayLightest
+DColor = GrayLight
+Type = Font Black
+
+[OptionsSound]
+Texts = 5
+
+[OptionsSoundBackground]
+Tex=OptionsBG
+
+[OptionsSoundStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsSoundStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex = ButtonNavi
+Color = GrayLight
+Type = Font Black
+
+[OptionsSoundStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsSoundText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsSoundText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_SOUND_WHEREAMI
+
+[OptionsSoundText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_SOUND_DESC
+
+[OptionsSoundText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsSoundText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsSoundSelectMicBoost]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_MIC_BOOST
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundSelectClickAssist]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_CLICK_ASSIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundSelectBeatClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_BEAT_CLICK
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundSelectThreshold]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_THRESHOLD
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundSelectTwoPlayerMode]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_TWO_PLAYERS_MODE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundSelectSlidePreviewVolume]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWVOLUME
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundSelectSlidePreviewFADING]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWFADING
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsSoundButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = GrayLightest
+DColor = GrayLight
+Type = Font Black
+
+[OptionsLyrics]
+Texts = 1
+
+[OptionsLyricsBackground]
+Tex=OptionsBG
+
+[OptionsLyricsStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsLyricsStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsLyricsStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsLyricsText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsLyricsText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_LYRICS_WHEREAMI
+
+[OptionsLyricsText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_LYRICS_DESC
+
+[OptionsLyricsText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsLyricsText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsLyricsSelectLyricsFont]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_FONT
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsLyricsSelectLyricsEffect]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_EFFECT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsLyricsSelectSolmization]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_SOLMIZATION
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsLyricsButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color =GrayLightest
+DColor = GrayLight
+Type = Font Black
+
+[OptionsThemes]
+Texts = 5
+
+[OptionsThemesBackground]
+Tex=OptionsBG
+
+[OptionsThemesStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsThemesStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsThemesStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsThemesText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsThemesText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_THEMES_WHEREAMI
+
+[OptionsThemesText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_THEMES_DESC
+
+[OptionsThemesText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsThemesText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsThemesSelectTheme]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_THEME
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsThemesSelectSkin]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_SKIN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsThemesSelectColor]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_COLOR
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsThemesButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = GrayLightest
+DColor = Light
+Type = Font Black
+
+
+
+[OptionsRecord]
+Texts = 5
+
+[OptionsRecordBackground]
+Tex=OptionsBG
+
+[OptionsRecordStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsRecordStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsRecordStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsRecordText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsRecordText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_RECORD_WHEREAMI
+
+[OptionsRecordText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_RECORD_DESC
+
+[OptionsRecordText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsRecordText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsRecordSelectSlideCard]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CARD
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsRecordSelectSlideInput]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_INPUT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsRecordSelectSlideChannelL]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELL
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsRecordSelectSlideChannelR]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELR
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsRecordButtonExit]
+X = 40
+Y = 305
+W = 230
+H = 70
+Tex = MainBar
+Color =GrayLightest
+DColor = GrayLight
+Type = Font Black
+
+[OptionsAdvanced]
+Texts = 5
+
+[OptionsAdvancedBackground]
+Tex=OptionsBG
+
+[OptionsAdvancedStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsAdvancedStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color=White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[OptionsAdvancedStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[OptionsAdvancedText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsAdvancedText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_ADVANCED_WHEREAMI
+
+[OptionsAdvancedText3]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_ADVANCED_DESC
+
+[OptionsAdvancedText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsAdvancedText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsAdvancedSelectScreenFade]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_SCREENFADE
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsAdvancedSelectEffectSing]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_EFFECTSING
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsAdvancedSelectLineBonus]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_LINEBONUS
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsAdvancedSelectSlideOnSongClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_ADVANCED_ONSONGCLICK
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsAdvancedSelectAskbeforeDel]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_ASKBEFOREDEL
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsAdvancedSelectPartyPopup]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_PARTYPOPUP
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[OptionsAdvancedButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color =GrayLightest
+DColor = GrayLight
+Type = Font Black
+
+
+
+##################### Top 5 ########################
+
+
+
+[Top5]
+Texts=1
+
+[Top5Background]
+Tex=Top5BG
+
+[Top5Text1]
+X =85
+Y =452
+Color=White
+Font =0
+Size =20
+Align=0
+Text =SING_TOP_5_CHARTS
+
+[Top5TextArtistTitle]
+X =87
+Y =499
+Color =White
+Font =0
+Size =10
+Align =0
+Text =artist - title
+
+[Top5Text4]
+X =87
+Y =520
+Color=White
+Font =0
+Size =10
+Align=0
+Text =SING_OPTIONS_GAME_DIFFICULTY
+
+[Top5TextLevel]
+X =1200
+Y =520
+Color =White
+Font =0
+Size =10
+Align =0
+Text =easy
+
+[Top5Static1]
+X =49
+Y =468
+W =27
+H =27
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[Top5Static2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[Top5Static3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[Top5Text2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=SING_TOP_5_CHARTS_WHEREAMI
+
+[Top5Static4]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+
+[Top5Text3]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_TOP_5_CHARTS_CONTINUE
+
+[Top5TextName1]
+X =150
+Y =190
+Color =White
+Font =0
+Size =14
+Align =0
+Text =1. Player1
+
+[Top5TextName2]
+X =150
+Y =240
+Color =White
+Font =0
+Size =14
+Align =0
+Text =2. Player2
+
+[Top5TextName3]
+X =150
+Y =290
+Color =White
+Font =0
+Size =14
+Align =0
+Text =3. Player3
+
+[Top5TextName4]
+X =150
+Y =340
+Color =White
+Font =0
+Size =14
+Align =0
+Text =4. Player4
+
+[Top5TextName5]
+X =150
+Y =390
+Color =White
+Font =0
+Size =14
+Align =0
+Text =5. Player5
+
+[Top5TextScore1]
+X =680
+Y =190
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore2]
+X =680
+Y =240
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore3]
+X =680
+Y =290
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore4]
+X =680
+Y =340
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore5]
+X =680
+Y =390
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextNumber1]
+X =120
+Y =193
+Color =White
+Font =1
+Size =9
+Align =1
+Text =1
+
+[Top5TextNumber2]
+X =120
+Y =243
+Color =White
+Font =1
+Size =9
+Align =1
+Text =2
+
+[Top5TextNumber3]
+X =120
+Y =293
+Color =White
+Font =1
+Size =9
+Align =1
+Text =3
+
+[Top5TextNumber4]
+X =120
+Y =343
+Color =White
+Font =1
+Size =9
+Align =1
+Text =4
+
+[Top5TextNumber5]
+X =120
+Y =393
+Color =White
+Font =1
+Size =9
+Align =1
+Text =5
+
+[Top5StaticNumber1]
+Tex=PlayerNumberBox
+X=100
+Y=186
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber2]
+Tex=PlayerNumberBox
+X=100
+Y=236
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber3]
+Tex=PlayerNumberBox
+X=100
+Y=286
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber4]
+Tex=PlayerNumberBox
+X=100
+Y=336
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber5]
+Tex=PlayerNumberBox
+X=100
+Y=386
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+
+
+
+
+###################### Party Modus ####################
+
+
+
+
+[PartyNewRound]
+Texts =7
+
+[PartyNewRoundBackground]
+Tex=SongBG
+
+[PartyNewRoundStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyNewRoundStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyNewRoundText1]
+X =70
+Y =27
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyNewRoundText2]
+X =70
+Y =72
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_ROUND_DESC
+
+[PartyNewRoundText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_ROUND_WHEREAMI
+
+[PartyNewRoundText4]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_ROUND_LEGEND_CONTINUE
+
+[PartyNewRoundText5]
+X =460
+Y =100
+Color =Black
+Font =0
+Size =10
+Text =PARTY_ROUND
+Align=0
+
+[PartyNewRoundText6]
+X =600
+Y =100
+Color =Black
+Font =0
+Size =10
+Text =PARTY_ROUND_WINNER
+Align=0
+
+[PartyNewRoundText7]
+X =448
+Y =350
+Color =Black
+Font =0
+Size =18
+Text =PARTY_ROUND
+Align=2
+
+[PartyNewRoundTextTeam1Players]
+X =30
+Y =137
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam2Players]
+X =30
+Y =218
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam3Players]
+X =30
+Y =299
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundStatic4]
+Tex =PartyRoundBG1
+X =450
+Y =103
+W = 330
+H = 24
+Int=1
+Color =GrayLight
+Type=Font Black
+
+[PartyNewRoundStatic5]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[PartyNewRoundStatic6]
+Tex =PartyRoundBG3
+X =250
+Y =350
+W = 300
+H = 50
+Int=1
+Color =GrayLight
+Type=Font Black
+
+[PartyNewRoundStatic7]
+Tex =PartyRoundBG4
+X =50
+Y =495
+W = 700
+H = 30
+Int=1
+Color = GrayLight
+Type=Font Black
+
+[PartyNewRoundStaticTeam1]
+Tex =PartyTeamButton1
+X =20
+Y =110
+W =400
+H =50
+Int=1
+Color =P1Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam2]
+Tex =PartyTeamButton1
+X =20
+Y =191
+W =400
+H =50
+Int=1
+Color =P2Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam3]
+Tex =PartyTeamButton1
+X =20
+Y =272
+W =400
+H =50
+Int=1
+Color =P3Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticNextPlayer1]
+Tex=PartyPlayerButton
+X=155
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P1Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer2]
+Tex=PartyPlayerButton
+X=325
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P2Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer3]
+Tex=PartyPlayerButton
+X=495
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P3Light
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyNewRoundTextRound1]
+X =460
+Y =133
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 1
+Align=0
+
+[PartyNewRoundTextRound2]
+X =460
+Y =162
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 2
+Align=0
+
+[PartyNewRoundTextRound3]
+X =460
+Y =191
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 3
+Align=0
+
+[PartyNewRoundTextRound4]
+X =460
+Y =220
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 4
+Align=0
+
+[PartyNewRoundTextRound5]
+X =460
+Y =249
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 5
+Align=0
+
+[PartyNewRoundTextRound6]
+X =460
+Y =278
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 6
+Align=0
+
+[PartyNewRoundTextRound7]
+X =460
+Y =307
+Color = GrayDark
+Font =0
+Size =8
+Text =Round 7
+Align=0
+
+[PartyNewRoundTextWinner1]
+X =600
+Y =133
+Color =Black
+Font =0
+Size =8
+Text =Winner 1
+Align=0
+
+[PartyNewRoundTextWinner2]
+X =600
+Y =162
+Color =Black
+Font =0
+Size =8
+Text =Winner 2
+Align=0
+
+[PartyNewRoundTextWinner3]
+X =600
+Y =191
+Color =Black
+Font =0
+Size =8
+Text =Winner 3
+Align=0
+
+[PartyNewRoundTextWinner4]
+X =600
+Y =220
+Color =Black
+Font =0
+Size =8
+Text =Winner 4
+Align=0
+
+[PartyNewRoundTextWinner5]
+X =600
+Y =249
+Color =Black
+Font =0
+Size =8
+Text =Winner 5
+Align=0
+
+[PartyNewRoundTextWinner6]
+X =600
+Y =278
+Color =Black
+Font =0
+Size =8
+Text =Winner 6
+Align=0
+
+[PartyNewRoundTextWinner7]
+X =600
+Y =307
+Color =Black
+Font =0
+Size =8
+Text =Winner 7
+Align=0
+
+[PartyNewRoundStaticRound1]
+Tex =PartyRoundBG2
+X =450
+Y =135
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundStaticRound2]
+Tex =PartyRoundBG2
+X =450
+Y =164
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundStaticRound3]
+Tex =PartyRoundBG2
+X =450
+Y =193
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundStaticRound4]
+Tex =PartyRoundBG2
+X =450
+Y =222
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundStaticRound5]
+Tex =PartyRoundBG2
+X =450
+Y =251
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundStaticRound6]
+Tex =PartyRoundBG2
+X =450
+Y =280
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundStaticRound7]
+Tex =PartyRoundBG2
+X =450
+Y =309
+W = 330
+H = 20
+Color = GrayLightest
+Type =Font Black
+
+[PartyNewRoundTextNextRound]
+X =400
+Y =495
+Color =Black
+Font =0
+Size =10
+Text =Next Round
+Align=1
+
+[PartyNewRoundTextNextRoundNo]
+X =457
+Y =350
+Color =Black
+Font =0
+Size =18
+Text =99
+Align=0
+
+[PartyNewRoundTextScoreTeam1]
+X =390
+Y =110
+Color =White
+Font =0
+Size =17
+Text =3000
+Align=1
+
+[PartyNewRoundTextScoreTeam2]
+X =390
+Y =191
+Color =White
+Font =0
+Size =17
+Text =2000
+Align=1
+
+[PartyNewRoundTextScoreTeam3]
+X =390
+Y =272
+Color =White
+Font =0
+Size =17
+Text =1000
+Align=1
+
+[PartyNewRoundTextNameTeam1]
+X =30
+Y =108
+Color =White
+Font =0
+Size =12
+Text =Team 1
+Align=0
+
+[PartyNewRoundTextNameTeam2]
+X =30
+Y =189
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyNewRoundTextNameTeam3]
+X =30
+Y =270
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyNewRoundTextNextPlayer1]
+X =230
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 1
+Align=1
+
+[PartyNewRoundTextNextPlayer2]
+X =400
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 2
+Align=1
+
+[PartyNewRoundTextNextPlayer3]
+X =570
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 3
+Align=1
+
+
+[PartyScore]
+Texts=5
+
+[PartyScoreBackground]
+Tex=PartyBG
+
+[PartyScoreDecoTextures]
+ChangeTextures =1
+
+FirstTexture =PartyScoreDeco
+FirstTyp =Font Black
+FirstColor =Gold
+
+SecondTexture =PartyScoreDeco
+SecondTyp =Font Black
+SecondColor =Silver
+
+ThirdTexture =PartyScoreDeco
+ThirdTyp =Font Black
+ThirdColor =Bronze
+
+[PartyScoreStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyScoreStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyScoreStatic4]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+
+[PartyScoreText1]
+X =70
+Y =29
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyScoreText2]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_SCORE_DESC
+
+[PartyScoreText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_SCORE_WHEREAMI
+
+[PartyScoreText4]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_LEGEND_CONTINUE
+
+[PartyScoreStatic5]
+Tex =PartyScoreBG1
+X =50
+Y =100
+W = 700
+H = 80
+Int=1
+Color =GrayLight
+Type=Font Black
+
+[PartyScoreStatic6]
+Tex =PartyScoreBG2
+X =50
+Y =495
+W = 700
+H = 20
+Int=1
+Color =GrayLightest
+Type=Font Black
+
+[PartyScoreText5]
+X =400
+Y =136
+Color =Black
+Font =0
+Size =15
+Text =PARTY_SCORE_WINS2
+Align=1
+
+[PartyScoreTextWinner]
+X =400
+Y =98
+Color =Black
+Font =0
+Size =18
+Text =The Winner is...
+Align=1
+
+[PartyScoreTextScoreTeam1]
+X =568
+Y =198
+Color =White
+Font =0
+Size =12
+Text =3000
+Align=2
+
+[PartyScoreTextScoreTeam2]
+X =568
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyScoreTextScoreTeam3]
+X =568
+Y =398
+Color =White
+Font =0
+Size =12
+Text =1000
+Align=2
+
+[PartyScoreTextNameTeam1]
+X =188
+Y =198
+Font=0
+Size=12
+Align=0
+Text=Team 1
+Color=White
+
+[PartyScoreTextNameTeam2]
+X =188
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyScoreTextNameTeam3]
+X =188
+Y =398
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyScoreStaticTeam1]
+X =188
+Y =230
+W =380
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam1BG]
+Tex=PartyTeamButton2
+X=178
+Y=200
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam1Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 191
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam2]
+X =188
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam2BG]
+Tex=PartyTeamButton2
+X=178
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam2Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam3]
+X =188
+Y =430
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam3BG]
+Tex=PartyTeamButton2
+X=178
+Y=400
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam3Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 391
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyWin]
+Texts=4
+
+[PartyWinBackground]
+Tex=PartyBG
+
+[PartyWinStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyWinStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyWinStatic4]
+X =260
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =GrayLight
+Type=Font Black
+
+[PartyWinText1]
+X =70
+Y =29
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyWinText2]
+X =72
+Y =72
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_WIN_DESC
+
+[PartyWinText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_WIN_WHEREAMI
+
+[PartyWinText4]
+X =290
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=PARTY_WIN_LEGEND_CONTINUE
+
+[PartyWinTextScoreTeam1]
+X =699
+Y =183
+Color =White
+Font =0
+Size =19
+Text =3000
+Align=2
+
+[PartyWinTextScoreTeam2]
+X =669
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyWinTextScoreTeam3]
+X =649
+Y =398
+Color =White
+Font =0
+Size =9
+Text =1000
+Align=2
+
+[PartyWinTextNameTeam1]
+X =169
+Y =183
+Font=0
+Size=19
+Align=0
+Text=Team 1
+Color=White
+
+[PartyWinTextNameTeam2]
+X =289
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyWinTextNameTeam3]
+X =369
+Y =398
+Color =White
+Font =0
+Size =9
+Text =Team 3
+Align=0
+
+[PartyWinStaticTeam1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BG]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank2]
+Tex=PartyTeamButton3
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank3]
+Tex=PartyTeamButton3
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyWinStaticTeam1Deco]
+Tex =PartyWinDeco1
+X = 91
+Y = 176
+W = 79
+H = 79
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BG]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamButton3
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank1]
+Tex=PartyTeamButton4
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank2]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank3]
+Tex=PartyTeamButton4
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Deco]
+Tex =PartyWinDeco2
+X = 226
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Silver
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BG]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank2]
+Tex=PartyTeamButton5
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank3]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Deco]
+Tex =PartyWinDeco3
+X = 316
+Y = 391
+W = 54
+H = 54
+Type =Font Black
+Color =Bronze
+Reflection=1
+ReflectionSpacing=3
+
+
+
+
+[PartyOptions]
+Texts = 5
+
+[PartyOptionsBackground]
+Tex=PartyBG
+
+[PartyOptionsStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyOptionsStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyOptionsStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[PartyOptionsStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[PartyOptionsText1]
+X =70
+Y =29
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyOptionsText2]
+X =72
+Y =72
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_OPTIONS_DESC
+
+[PartyOptionsText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_OPTIONS_WHEREAMI
+
+[PartyOptionsText4]
+X =294
+Y =3
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyOptionsText5]
+X =418
+Y =3
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[PartyOptionsSelectLevel]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_DIFFICULTY
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectPlayList]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectPlayList2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectRounds]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_ROUNDS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectTeams]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectPlayers1]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER1
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectPlayers2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER2
+X = 40
+Y = 415
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+[PartyOptionsSelectPlayers3]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER3
+X = 40
+Y = 470
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = GrayLightest
+DColor = GrayLight
+TColor = Black
+TDColor = Black
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = White
+STDColor = Black
+
+
+
+[PartyPlayer]
+Texts=6
+
+[PartyPlayerBackground]
+Tex=PartyBG
+
+[PartyPlayerStatic1]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerStatic2]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerStatic3]
+X =40
+Y =45
+W =27
+H =27
+Color =WhiteLight
+Tex =PartyIcon
+Type=Font Black
+
+[PartyPlayerStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerStatic5]
+X =388
+Y =5
+W =26
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerStatic6]
+X =556
+Y =5
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerText1]
+X =70
+Y =27
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyPlayerText2]
+X =72
+Y =72
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_PLAYER_DESC
+
+[PartyPlayerText3]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=PARTY_PLAYER_WHEREAMI
+
+[PartyPlayerText4]
+X =294
+Y =3
+Color=White
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyPlayerText5]
+X =418
+Y =3
+Color=White
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_ENTER_NAME
+
+[PartyPlayerText6]
+X =586
+Y =3
+Color=White
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_LEGEND_CONTINUE
+
+[PartyPlayerTeam1Name]
+Tex=PartyTeamButton2
+X=85
+Y=100
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Dark
+
+[PartyPlayerTeam1NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 1
+Color=White
+
+[PartyPlayerPlayer1Name]
+Tex=Button
+X=85
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer1NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 1
+Color=White
+
+[PartyPlayerPlayer2Name]
+Tex=Button
+X=245
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer2NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 2
+Color=White
+
+[PartyPlayerPlayer3Name]
+Tex=Button
+X=405
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer3NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 3
+Color=White
+
+[PartyPlayerPlayer4Name]
+Tex=Button
+X=565
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer4NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 4
+Color=White
+
+[PartyPlayerTeam2Name]
+Tex=PartyTeamButton2
+X=85
+Y=240
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Dark
+
+[PartyPlayerTeam2NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 2
+Color=White
+
+[PartyPlayerPlayer5Name]
+Tex=Button
+X=85
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer5NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 5
+Color=White
+
+[PartyPlayerPlayer6Name]
+Tex=Button
+X=245
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer6NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 6
+Color=White
+
+[PartyPlayerPlayer7Name]
+Tex=Button
+X=405
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer7NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 7
+Color=White
+
+[PartyPlayerPlayer8Name]
+Tex=Button
+X=565
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer8NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 8
+Color=White
+
+[PartyPlayerTeam3Name]
+Tex=Button
+Tex=PartyTeamButton2
+X=85
+Y=380
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Dark
+
+[PartyPlayerTeam3NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 3
+Color=White
+
+[PartyPlayerPlayer9Name]
+Tex=Button
+X=85
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer9NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 9
+Color=White
+
+[PartyPlayerPlayer10Name]
+Tex=Button
+X=245
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer10NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 10
+Color=White
+
+[PartyPlayerPlayer11Name]
+Tex=Button
+X=405
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer11NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 11
+Color=White
+
+[PartyPlayerPlayer12Name]
+Tex=Button
+X=565
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer12NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 12
+Color=White
+
+
+#################### Song Menu ######################
+
+
+
+[SongMenu]
+Texts=0
+Statics=1
+
+[SongMenuButton1]
+X = 510
+Y = 165
+W = 270
+H = 25
+Tex =Rectangle
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton1Text1]
+X =30
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=SONG_MENU_PLAY
+Align=0
+Z=0.99
+
+[SongMenuButton2]
+X = 510
+Y = 195
+W = 270
+H = 25
+Tex =Rectangle
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton2Text1]
+X =30
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=SONG_MENU_EDIT
+Align=0
+Z=0.99
+
+[SongMenuButton3]
+X = 510
+Y = 225
+W = 270
+H = 25
+Tex =Rectangle
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton3Text1]
+X =30
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=SONG_MENU_MODI
+Align=0
+Z=0.99
+
+[SongMenuButton4]
+X = 510
+Y = 255
+W = 270
+H = 25
+Tex = Rectangle
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Z = 0.98
+
+[SongMenuButton4Text1]
+X =30
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=SONG_MENU_CANCEL
+Align=0
+Z=0.99
+
+[SongMenuSelectSlide3]
+Tex = Rectangle
+TexSBG = SongMenuSelectBG
+Text =
+X = 510
+Y = 225
+W = 0
+H = 25
+Z = 0.98
+SkipX = 0
+SBGW=270
+
+TextSize=8
+
+Color =GrayLightest
+DColor = GrayLight
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = GrayLightest
+SBGDColor = GrayLight
+STColor = Black
+STDColor = White
+
+[SongMenuTextMenu]
+X =539
+Y =125
+Color=White
+Font =0
+Size =14
+Text=MENU
+Align=0
+Z=0.99
+
+[SongMenuStatic2]
+X =513
+Y =135
+W =21
+H =21
+Color =White
+Tex =IconSongMenu
+Type=Font Black
+Z=0.98
+
+[SongMenuStatic1]
+Tex =SongMenuBG
+X =498
+Y =120
+W =300
+H =200
+Z =0.94
+Int=1
+Color =GrayLight
+Type=Font Black
+
+[SongJumpto]
+Texts=0
+Statics=1
+
+[SongJumptoStatic1]
+Tex =JumpToBG
+X =221
+Y =175
+W =355
+H =175
+Z =0.98
+Int=1
+Color =DarkOrange
+Type=Font Black
+
+[SongJumptoStatic2]
+X =234
+Y =185
+W =21
+H =21
+Color =White
+Tex =MainSearch
+Type=Font Black
+Z=0.99
+
+[SongJumptoText1]
+X =310
+Y =175
+Color=White
+Font =0
+Size =14
+Text=SONG_JUMPTO_TYPE_DESC
+Align=0
+Z=0.99
+
+[SongJumptoSelectSlideType]
+Tex = button
+TexSBG = mainicon
+#Text = SONG_JUMPTO_TYPE_DESC
+Font=1
+X = 242
+Y = 205
+Z = 0.99
+W = 0
+H = 30
+SkipX = 4
+SBGW= 300
+Fields=2
+DColor = LightOrange
+TColor = White
+TDColor = White
+SBGTex = button
+SBGDColor = LightOrange
+STColor = White
+STDColor = LightOrange
+
+[SongJumptoButtonSearchText]
+X = 250
+Y = 215
+Z = 0.99
+W = 160
+H = 50
+Size=14
+Font=1
+Align=0
+
+[SongJumptoTextFound]
+X =234
+Y =295
+Color=White
+Font =0
+Size =8
+Text=SONG_JUMPTO_HELP
+Align=0
+Z=0.99
+
+
+######################## Main Statistik ##############
+
+
+
+[StatMain]
+Texts=0
+Statics=0
+
+[StatMainBackground]
+Tex=OptionsBG
+
+[StatMainButtonScores]
+X =589
+Y =100
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonScoresText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SCORES
+Color=Black
+
+[StatMainButtonSingers]
+X =589
+Y =160
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSingersText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SINGERS
+Color=Black
+
+[StatMainButtonSongs]
+X =589
+Y =220
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSongsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_SONGS
+Color=Black
+
+[StatMainButtonBands]
+X =589
+Y =280
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonBandsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_BANDS
+Color=Black
+
+[StatMainButtonExit]
+X =589
+Y =340
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=Black
+
+[StatMainTextOverview]
+X =45
+Y =125
+W =510
+Color=White
+Font =0
+Size =9
+Align=0
+Text=
+
+[StatMainStatic1]
+X =47
+Y =466
+W =27
+H =27
+Color=White
+Tex =StatIcon
+Type=Font Black
+
+[StatMainStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color=White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatMainStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color=White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatMainStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[StatMainStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[StatMainStatic6]
+X =40
+Y =100
+W =520
+H =20
+Tex=StatMainBG1
+Color =Gray
+Type=Font Black
+
+[StatMainStatic7]
+X =40
+Y =120
+W =520
+H =300
+Tex=StatMainBG2
+Color =GrayLight
+Type=Font Black
+
+[StatMainStatic8]
+X =40
+Y =420
+W =520
+H =20
+Tex=StatMainBG3
+Color =Gray
+Type=Font Black
+
+[StatMainText1]
+X =83
+Y =452
+Color=White
+Font =0
+Size =20
+Text=STAT_MAIN
+Align=0
+
+[StatMainText2]
+X =238
+Y =5
+Color=White
+Font =0
+Size =7
+Align=2
+Text=STAT_MAIN_WHEREAMI
+
+[StatMainText3]
+X =180
+Y =490
+Color=White
+Font =0
+Size =10
+Align =0
+Text=STAT_MAIN_DESC
+
+[StatMainText4]
+X =294
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatMainText5]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+
+#######################Detail Statistiken##############
+
+
+
+[StatDetail]
+Texts=0
+Statics=0
+
+[StatDetailBackground]
+Tex=OptionsBG
+
+[StatDetailButtonNext]
+X =589
+Y =100
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonNextText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_NEXT
+Color=Black
+
+[StatDetailButtonPrev]
+X =589
+Y =160
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonPrevText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_PREV
+Color=Black
+
+[StatDetailButtonReverse]
+X =589
+Y =220
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonReverseText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_REVERSE
+Color=Black
+
+[StatDetailButtonExit]
+X =589
+Y =280
+W =190
+H =50
+Tex =Button
+Color =GrayLightest
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=Black
+
+[StatDetailTextDescription]
+X =70
+Y =70
+Color=White
+Font =0
+Size =10
+Align =0
+Text=
+
+[StatDetailTextPage]
+X = 546
+Y = 98
+Color= White
+Font = 0
+Size = 5
+Align=2
+Text=
+
+[StatDetailTextList1]
+X = 45
+Y = 122
+Color=White
+Font = 0
+Size = 7
+Text=Stat1
+
+[StatDetailTextList2]
+X = 45
+Y = 160
+Color=White
+Font = 0
+Size = 7
+Text=Stat2
+
+[StatDetailTextList3]
+X = 45
+Y = 198
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList4]
+X = 45
+Y = 236
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList5]
+X = 45
+Y = 274
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList6]
+X = 45
+Y = 312
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList7]
+X = 45
+Y = 350
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList8]
+X = 45
+Y = 388
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList9]
+X = 45
+Y = 426
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList10]
+X = 45
+Y = 464
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailStatic1]
+X =40
+Y =45
+W =27
+H =27
+Color=White
+Tex =StatIcon
+Type=Font Black
+
+[StatDetailStatic2]
+X =0
+Y =0
+W =254
+H =28
+Tex=Leiste1
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatDetailStatic3]
+X =254
+Y =0
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Plain
+Reflection=1
+ReflectionSpacing=1
+
+[StatDetailStatic4]
+X =260
+Y =3
+W =30
+H =22
+Tex=ButtonNavi
+Color =GrayLight
+Type=Font Black
+Style=5
+
+[StatDetailStatic5]
+X =388
+Y =5
+W =22
+H =22
+Tex=ButtonEsc
+Color =GrayLight
+Type=Font Black
+
+[StatDetailStatic6]
+X =40
+Y =100
+W =520
+H =24
+Tex=StatDetailBG1
+Color =Gray
+Type=Font Black
+
+[StatDetailStatic7]
+X =40
+Y =124
+W =520
+H =376
+Tex=StatMainBG2
+Color =GrayLight
+Type=Font Black
+
+[StatDetailStatic8]
+X =40
+Y =500
+W =520
+H =20
+Tex=StatMainBG3
+Color =Gray
+Type=Font Black
+
+
+[StatDetailText1]
+X =70
+Y =29
+Color=White
+Font =0
+Size =20
+Text=STAT_DETAIL
+Align=0
+
+[StatDetailText2]
+X =238
+Y =3
+Color=White
+Font =0
+Size =7
+Align=2
+Text=STAT_DETAIL_WHEREAMI
+
+[StatDetailText3]
+X =294
+Y =3
+ColorBlack
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatDetailText4]
+X =418
+Y =3
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+
+#######################################################
+
+
+[CheckPopup]
+Texts=1
+Statics=1
+
+[CheckPopupButton1]
+X = 285
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = White
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton1Text1]
+X =50
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=JA
+Align=1
+Z=1
+
+[CheckPopupButton2]
+X = 415
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = White
+DColor = GrayLight
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton2Text1]
+X =50
+Y =0
+Color=Black
+Font =0
+Size =8
+Text=NEIN
+Align=1
+Z=1
+
+[CheckPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[CheckPopupText1]
+X =282
+Y =147
+Color=White
+Font =0
+Size =10
+Text=MSG_QUESTION_TITLE
+Align=0
+Z=1
+
+[CheckPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =WhitePopup
+Type=Font Black
+
+[CheckPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[CheckPopupStatic3]
+Tex =IconQuestion
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopup]
+Texts=1
+Statics=1
+
+[ErrorPopupButton1]
+X = 350
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = White
+DColor = WhitePopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[ErrorPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=OK
+Align=1
+Z=1
+
+[ErrorPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[ErrorPopupText1]
+X =282
+Y =148
+Color=White
+Font =0
+Size =10
+Text=MSG_ERROR_TITLE
+Align=0
+Z=1
+
+[ErrorPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =WhitePopup
+Type=Font Black
+
+[ErrorPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopupStatic3]
+Tex =IconError
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black \ No newline at end of file
diff --git a/Themes/Vistar.ini b/Themes/Vistar.ini
new file mode 100644
index 00000000..3456dcb2
--- /dev/null
+++ b/Themes/Vistar.ini
@@ -0,0 +1,7634 @@
+;0.5.1 Mod
+;experimental version
+;if you are using this as a sample for your theme
+;don't be suprised it doesn't work good with newer releases
+
+[Theme]
+Name=Vistar
+Creator=!Skar!™
+
+[Colors]
+White = 255 255 255
+LightBlue = 130 200 250
+DarkBlue = 20 130 230
+LightRed = 170 146 146
+DarkRed = 155 113 113
+LightGreen = 136 168 136
+DarkGreen = 106 152 104
+LightPurple = 155 136 168
+DarkPurple = 145 104 152
+LightOrange = 168 155 136
+DarkOrange = 151 131 76
+LightYellow = 168 168 136
+DarkYellow = 150 151 76
+Turkis = 13 186 167
+GrayLightest = 223 223 223
+GrayLight = 191 191 191
+Gray = 127 127 127
+GrayDark = 63 63 63
+Black = 0 0 0
+GrayPopup = 51 51 51
+Gold = 255 223 31
+Silver = 223 223 223
+Bronze = 205 127 50
+Blue = 0 174 255
+
+[Loading]
+Texts =2
+Fade = 1
+
+[LoadingBackground]
+Tex=LoadingBG
+
+[LoadingText1]
+X =30
+Y =550
+Color =White
+Font =0
+Align =0
+Size =10
+Text =SING_LOADING
+
+[LoadingText2]
+X =790
+Y =556
+Color=White
+Font =0
+Size =6
+Align=2
+Text=US_VERSION
+
+
+
+
+
+[MainBackground]
+Tex=MainBG
+
+[MainStatic1]
+X =12
+Y =282
+W =27
+H =27
+Color =GrayLight
+Tex =MainIcon
+Type=Font Black
+
+[MainText1]
+X =45
+Y =287
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_MENU
+
+[MainText2]
+X = 214
+Y = 302
+W = 100
+Color=White
+Font =0
+Size =6
+Align=0
+Text=US_VERSION
+
+[MainTextDescriptionLong]
+X =10
+Y =552
+Color=Gray
+Font =0
+Size =6
+Align=0
+Text=
+
+[MainButtonSolo]
+X =7
+Y =320
+W =193
+H =30
+Tex =Button
+Color =ColorDark
+DColor = White
+Type=Font Black
+Texts=1
+
+[MainButtonSoloText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_SING
+Color=Black
+
+[MainButtonMulti]
+X =7
+Y =350
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[MainButtonMultiText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_MULTI
+Color=Black
+
+[MainButtonStats]
+X =7
+Y =380
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[MainButtonStatsText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_STATS
+Color=Black
+
+[MainButtonOptions]
+X =7
+Y =410
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[MainButtonOptionsText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_OPTIONS
+Color=Black
+
+[MainButtonExit]
+X =7
+Y =440
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[MainButtonExitText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_EXIT
+Color=Black
+
+[MainStatic2]
+X =12
+Y =324
+W =22
+H =150
+Color =GrayLight
+Tex =MainButtons
+Type=Font Black
+
+
+
+
+
+
+
+################### Name Screen ##############
+
+
+
+[Name]
+Texts=2
+
+[NameBackground]
+Tex=MainBG
+
+[NameStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =MainIcon
+Type=Font Black
+
+[NameStatic2]
+X =12
+Y =282
+W =27
+H =27
+Color =GrayLight
+Tex =MainIcon
+Type=Font Black
+
+[NameText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=SING_MODE
+
+[NameText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_PLAYER_DESC
+
+[NameText3]
+X =45
+Y =287
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_PLAYER_WHEREAMI
+
+[NameButtonPlayer1]
+X =7
+Y =320
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[NameButtonPlayer1Text1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Color=Black
+Text=
+
+[NameButtonPlayer2]
+X =7
+Y =350
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[NameButtonPlayer2Text1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Color=Black
+Text=
+
+[NameButtonPlayer3]
+X =7
+Y =380
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[NameButtonPlayer3Text1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Color=Black
+Text=
+
+[NameButtonPlayer4]
+X =7
+Y =410
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[NameButtonPlayer4Text1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Color=Black
+Text=
+
+[NameButtonPlayer5]
+X =7
+Y =440
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[NameButtonPlayer5Text1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Color=Black
+Text=
+
+[NameButtonPlayer6]
+X =7
+Y =470
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[NameButtonPlayer6Text1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Color=Black
+Text=
+
+[NameStatic3]
+X =12
+Y =324
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonMulti
+Type=Font Black
+
+[NameStatic4]
+X =12
+Y =354
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonMulti
+Type=Font Black
+
+[NameStatic5]
+X =12
+Y =384
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonMulti
+Type=Font Black
+
+[NameStatic6]
+X =12
+Y =414
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonMulti
+Type=Font Black
+
+[NameStatic7]
+X =12
+Y =444
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonMulti
+Type=Font Black
+
+[NameStatic8]
+X =12
+Y =474
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonMulti
+Type=Font Black
+
+
+
+
+
+##################### Level #######################
+
+
+
+
+[Level]
+Texts=5
+
+[LevelBackground]
+Tex=MainBG
+
+[LevelStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =MainIcon
+Type=Font Black
+
+[LevelStatic2]
+X =12
+Y =282
+W =27
+H =27
+Color =GrayLight
+Tex =MainIcon
+Type=Font Black
+
+[LevelText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=SING_MODE
+
+[LevelText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_DIFFICULTY_DESC
+
+[LevelText3]
+X =45
+Y =287
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_DIFFICULTY_WHEREAMI
+
+[LevelButtonEasy]
+X =7
+Y =320
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[LevelButtonMedium]
+X =7
+Y =350
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[LevelButtonHard]
+X =7
+Y =380
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[LevelButtonEasyText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Color=Black
+Text=SING_EASY
+
+[LevelButtonMediumText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Color=Black
+Text=SING_MEDIUM
+
+[LevelButtonHardText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Color=Black
+Text=SING_HARD
+
+[LevelStatic3]
+X =12
+Y =324
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonMulti
+Type=Font Black
+
+[LevelStatic4]
+X =12
+Y =354
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonMulti
+Type=Font Black
+
+[LevelStatic5]
+X =12
+Y =384
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonMulti
+Type=Font Black
+
+
+
+
+################### Song Selection ##############
+
+
+
+[Song]
+Texts =3
+
+[SongBackground]
+Tex=SongBG
+
+[SongCover]
+X=303
+Y=125
+W=320
+H=190
+Style=5
+Reflections=1
+
+[SongEqualizer]
+Visible=1
+Direction=1
+Color=Blue
+Alpha=1
+X=255
+Y=513
+Z=1
+PieceW=6
+PieceH=6
+Space=1
+Bands=4
+Length=18
+
+[SongVideoIcon]
+X =299
+Y =487
+W =32
+H =32
+Z=1
+Color=White
+Tex =VideoIcon
+Type=Font Black
+
+[SongTextCat]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_SONG_SELECTION_DESC
+
+[SongTextArtist]
+X =400
+Y =330
+W = 190
+Color=White
+Font =1
+Size =9
+Align =1
+Text=
+
+[SongTextTitle]
+X =400
+Y =400
+W = 190
+Color=White
+Font =0
+Size =9
+Align =1
+Text=
+
+[SongTextNumber]
+X =490
+Y =495
+Color=White
+Font =0
+Size =8
+Align =2
+Text=
+
+#Variable statics and texts for song-screen in sing- and partymode
+# There can be an unlimited Number of Statics and Texts, As long
+# as the numbers are in order.
+# Statics that are shown in PartyMode Only are Named_
+# SongStaticParty[No]
+# Texts that are shown in PartyMode Only are Named_
+# SongTextParty[No]
+# Statics that are shown in Normal Mode Only are Named_
+# SongStaticNonParty[No]
+# Texts that are shown in Normal Mode Only are Named_
+# SongTextNonParty[No]
+#Here are the ones for singmode
+
+[SongStaticNonParty1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =SongCD
+Type=Font Black
+
+[SongStaticNonParty2]
+X =160
+Y =580
+W =26
+H =22
+Tex=ButtonAlt
+Color =White
+Type=Font Black
+
+[SongStaticNonParty3]
+X =200
+Y =580
+W =26
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Font Black
+
+[SongStaticNonParty4]
+X =325
+Y =580
+W =22
+H =22
+Tex=ButtonM
+Color =White
+Type=Font Black
+
+[SongStaticNonParty5]
+X =415
+Y =580
+W =22
+H =22
+Tex=ButtonJ
+Color =White
+Type=Font Black
+
+[SongStaticNonParty6]
+X =579
+Y =580
+W =22
+H =22
+Tex=ButtonP
+Color =White
+Type=Font Black
+
+#Texts Non Party
+[SongTextNonParty1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_SONG_SELECTION
+Align=0
+
+[SongTextNonParty2]
+X =298
+Y =102
+Color=Black
+Font =0
+Size =6
+Align=0
+Text=SING_SONG_SELECTION_WHEREAMI
+
+[SongTextNonParty3]
+X =188
+Y =583
+Color=GrayLight
+Font =1
+Size =5
+Align=0
+Text=+
+
+[SongTextNonParty4]
+X =230
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_GOTO
+
+[SongTextNonParty5]
+X =350
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_MENU
+
+[SongTextNonParty6]
+X =440
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SONG_JUMPTO_DESC
+
+[SongTextNonParty7]
+X =605
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_SONG_SELECTION_PLAYLIST
+
+
+#and theese are the ones for partymode
+
+[SongStaticParty1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[SongStaticParty2]
+X =160
+Y =580
+W =26
+H =22
+Tex=Button13
+Color =White
+Type=Font Black
+
+[SongStaticParty3]
+X =300
+Y =580
+W =22
+H =22
+Tex=ButtonM
+Color =White
+Type=Font Black
+
+[SongStaticParty4]
+X =440
+Y =580
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+#Texts for Party Mode
+
+[SongTextParty1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[SongTextParty2]
+X =188
+Y =580
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SONG_MENU_NAME_PARTY_JOKER
+
+[SongTextParty3]
+X =326
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_MENU
+
+[SongTextParty4]
+X =470
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=PARTY_SONG_LEGEND_CONTINUE
+
+#variable statics end
+
+
+# Jokers, 5 for each team, only shown in party Mode
+[SongStaticTeam1Joker1]
+Tex =Joker
+X =530
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker2]
+Tex =Joker
+X =580
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker3]
+Tex =Joker
+X =630
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker4]
+Tex =Joker
+X =680
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam1Joker5]
+Tex =Joker
+X =730
+Y =400
+W =40
+H =40
+Z =0.98
+Color=P1Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker1]
+Tex =Joker
+X =530
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker2]
+Tex =Joker
+X =580
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker3]
+Tex =Joker
+X =630
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker4]
+Tex =Joker
+X =680
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam2Joker5]
+Tex =Joker
+X =730
+Y =450
+W =40
+H =40
+Z =0.98
+Color=P2Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker1]
+Tex =Joker
+X =530
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker2]
+Tex =Joker
+X =580
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker3]
+Tex =Joker
+X =630
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker4]
+Tex =Joker
+X =680
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[SongStaticTeam3Joker5]
+Tex =Joker
+X =730
+Y =500
+W =40
+H =40
+Z =0.98
+Color=P3Dark
+Type=Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+
+
+##################### Sing ####################
+
+
+
+[SingText1]
+Text =SING_TIME
+X =21
+Y =574
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingStatic1]
+;TextBG
+Tex =LyricBar
+X =10
+Y =490
+W =780
+H =85
+Color =White
+Type=Font Black
+
+[SingStatic2]
+;TimeBar
+Tex =TimeBar1
+X =10
+Y =575
+W =780
+H =16
+Color=Black
+Type=Font Black
+
+[SingTimeProgress]
+X =70
+Y =580
+W =652
+H =7
+Color=White
+
+[SingStatic3]
+;the thing behind the time progress
+Tex =TimeBar2
+X =70
+Y =580
+W =652
+H =7
+Color=GrayDark
+Type=Font Black
+
+[SingTimeText]
+Text =SING_TIME
+X =754
+Y =574
+Font =1
+Size =6
+Color =White
+Align=1
+
+# O N E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#PlayerOne
+[SingP1Static]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1Text]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1Static2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1SingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T W O P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1TwoPStatic]
+Tex =P
+X =20
+Y =117
+W =33
+H =38
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPText]
+Text =P1
+X =26
+Y =122
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP1TwoPStatic2]
+Tex =ScoreBG
+X =680
+Y =102
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1TwoPTextScore]
+Text =00000
+X =690
+Y =104
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1TwoPSingBar]
+X =680
+Y =136
+W =100
+H =8
+
+#Player Two
+[SingP2RStatic]
+Tex =P
+X =20
+Y =297
+W =33
+H =38
+Color =P2Dark
+Type=Transparent
+
+[SingP2RText]
+Text =P2
+X =26
+Y =302
+Font =1
+Size =6
+Color =White
+Align=0
+
+[SingP2RStatic2]
+Tex =ScoreBG
+X =680
+Y =282
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2RTextScore]
+Text =00000
+X =690
+Y =284
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2RSingBar]
+X =680
+Y =316
+W =100
+H =8
+
+# T H R E E P L A Y E R M O D E # # # # # # # # # # # # # # # # # # # #
+#Player One
+[SingP1ThreePStatic]
+Tex =P
+X =16
+Y =59
+W =50
+H =54
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePText]
+Text =P1
+X =27
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP1ThreePStatic2]
+Tex =ScoreBG
+X =75
+Y =61
+W =100
+H =34
+Color =P1Dark
+Type=Transparent
+
+[SingP1ThreePTextScore]
+Text =00000
+X =85
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP1ThreePSingBar]
+X =75
+Y =95
+W =100
+H =8
+
+#Player Two
+[SingP2MStatic]
+Tex =P
+X =311
+Y =59
+W =50
+H =54
+Color =P2Dark
+Type=Transparent
+
+[SingP2MText]
+Text =P2
+X =321
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP2MStatic2]
+Tex =ScoreBG
+X =370
+Y =61
+W =100
+H =34
+Color =P2Dark
+Type=Transparent
+
+[SingP2MTextScore]
+Text =00000
+X =380
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP2MSingBar]
+X =370
+Y =95
+W =100
+H =8
+
+#Player Three
+[SingP3RStatic]
+Tex =P
+X =611
+Y =59
+W =50
+H =54
+Color =P3Dark
+Type=Transparent
+
+[SingP3RText]
+Text =P3
+X =621
+Y =66
+Font =1
+Size =8
+Color =White
+Align=0
+
+[SingP3RStatic2]
+Tex =ScoreBG
+X =670
+Y =61
+W =100
+H =34
+Color =P3Dark
+Type=Transparent
+
+[SingP3RTextScore]
+Text =00000
+X =680
+Y =63
+Font =0
+Size =10
+Color =White
+Align=0
+
+[SingP3SingBar]
+X =670
+Y =95
+W =100
+H =8
+
+
+
+################## Score ####################
+
+
+
+
+[Score]
+Texts =1
+
+[ScoreBackground]
+Tex=ScoreScreenBG
+
+[ScoreText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SONG_SCORE
+Align=0
+
+[ScoreTextArtistTitle]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=ArtistTitle
+
+[ScoreStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[ScoreText2]
+X =238
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=2
+Text=SONG_SCORE_WHEREAMI
+
+[ScoreStatic2]
+X =260
+Y =580
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[ScoreText3]
+X =290
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+#end of main stuff
+
+# # # # # # # # # # # # # # # # # # One Player Score # # # # # # # # # # # #
+[ScoreTextName1]
+X =175
+Y =260
+Font =0
+Size =14
+Text =P1
+Color =White
+Align=0
+
+[ScoreTextScore1]
+X =175
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes1]
+X =175
+Y =340
+Color=White
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore1]
+X =465
+Y =340
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextLineBonus1]
+X =175
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore1]
+X =465
+Y =370
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextGoldenNotes1]
+X =175
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore1]
+X =465
+Y =400
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0
+
+[ScoreTextTotal1]
+X =205
+Y =460
+Color=White
+Font =0
+Size =14
+Text=SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore1]
+X =465
+Y =460
+Color=P1Dark
+Font =0
+Size =14
+Align =2
+Text =0
+
+#Lines
+[ScorePlayer1Static1]
+Tex =ScoreLine
+X =173
+Y =338
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static2]
+Tex =ScoreLine
+X =173
+Y =368
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static3]
+Tex =ScoreLine
+X =173
+Y =398
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static4]
+Tex =ScoreLine
+X =173
+Y =428
+W =295
+H =2
+Color =White
+Type =Font Black
+
+[ScorePlayer1Static5]
+Tex =ScoreLine
+X =173
+Y =458
+W =295
+H =4
+Type =Font Black
+Color =White
+
+[ScoreStaticBoxDark1]
+Tex =PlayerNumberBox
+X =175
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Text1]
+X =179
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel1]
+Tex =ScoreLevel
+X =475
+Y =160
+W =150
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =130
+W =150
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel1]
+Tex =ScoreLevel
+X =475
+Y =410
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound1]
+Tex =ScoreLevelRound
+X =475
+Y =380
+W =150
+H =30
+Color =P1Light
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScorePlayer1Static6]
+Tex =ScoreEndCap
+X =494
+Y =460
+W =112
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer1Static7]
+Tex =ScoreLine
+X =493
+Y =460
+W =114
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+
+# # # # # # # # # # # # # # # # # # Two Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName2]
+X =20
+Y =260
+Font =0
+Size =14
+Text =P1
+Color =White
+Align=0
+
+[ScoreTextScore2]
+X =20
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=0
+
+[ScoreTextNotes2]
+X =20
+Y =340
+Color=White
+Font =0
+Size =9
+Text=SING_NOTES
+Align=0
+
+[ScoreTextNotesScore2]
+X =300
+Y =340
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextLineBonus2]
+X =20
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=0
+
+[ScoreTextLineBonusScore2]
+X =300
+Y =370
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextGoldenNotes2]
+X =20
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=0
+
+[ScoreTextGoldenNotesScore2]
+X =300
+Y =400
+Color=White
+Font =0
+Size =10
+Align =2
+Text =0000
+
+[ScoreTextTotal2]
+X =50
+Y =460
+Color=White
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=0
+
+[ScoreTextTotalSCore2]
+X =300
+Y =460
+Color=P1Dark
+Font =0
+Size =14
+Align =2
+Text =00000
+
+# Lines
+[ScorePlayer2Static1]
+Tex =ScoreLine
+X =20
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static2]
+Tex =ScoreLine
+X =20
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static3]
+Tex =ScoreLine
+X =20
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static4]
+Tex =ScoreLine
+X =20
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer2Static5]
+Tex =ScoreLine
+X =20
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =White
+
+[ScoreStaticBoxDark2]
+Tex =PlayerNumberBox
+X =20
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Text1]
+X =24
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#ScoreBar
+[ScoreStaticBackLevel2]
+Tex =ScoreLevel
+X =293
+Y =160
+W =120
+H =300
+Color =P1Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticBackLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =130
+W =120
+H =30
+Color =P1Lightest
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScoreStaticLevel2]
+Tex =ScoreLevel
+X =293
+Y =410
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+
+[ScoreStaticLevelRound2]
+Tex =ScoreLevelRound
+X =293
+Y =380
+W =120
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=0.5
+
+[ScorePlayer2Static6]
+Tex =ScoreEndCap
+X =308
+Y =460
+W =90
+H =30
+Color =P1Dark
+Type =Font Black
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer2Static7]
+Tex =ScoreLine
+X =307
+Y =460
+W =92
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# P L A Y E R T W O
+[ScoreTextName3]
+X =780
+Y =260
+Font =0
+Size =14
+Text =P2
+Color =White
+Align=2
+
+[ScoreTextScore3]
+X =780
+Y =430
+Color=White
+Font =1
+Size =9
+Text =Tone Deaf
+Align=2
+
+[ScoreTextNotes3]
+X =780
+Y =340
+Color=White
+Font =0
+Size =9
+Text =SING_NOTES
+Align=2
+
+[ScoreTextNotesScore3]
+X =500
+Y =340
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextLineBonus3]
+X =780
+Y =370
+Color=White
+Font =0
+Size =9
+Text =SING_PHRASE_BONUS
+Align=2
+
+[ScoreTextLineBonusScore3]
+X =500
+Y =370
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextGoldenNotes3]
+X =780
+Y =400
+Color=White
+Font =0
+Size =9
+Text =SING_GOLDEN_NOTES
+Align=2
+
+[ScoreTextGoldenNotesScore3]
+X =500
+Y =400
+Color=White
+Font =0
+Size =10
+Align =0
+Text =0000
+
+[ScoreTextTotal3]
+X =750
+Y =460
+Color=White
+Font =0
+Size =14
+Text =SING_TOTAL
+Align=2
+Reflection=1
+ReflectionSpacing=4
+
+[ScoreTextTotalScore3]
+X =500
+Y =460
+Color=P2Dark
+Font =0
+Size =14
+Align =0
+Text =00000
+Reflection=1
+ReflectionSpacing=4
+
+#Lines
+[ScorePlayer3Static1]
+Tex =ScoreLine
+X =500
+Y =338
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static2]
+Tex =ScoreLine
+X =500
+Y =368
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static3]
+Tex =ScoreLine
+X =500
+Y =398
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static4]
+Tex =ScoreLine
+X =500
+Y =428
+W =280
+H =2
+Type =Font Black
+Color =White
+
+[ScorePlayer3Static5]
+Tex =ScoreLine
+X =500
+Y =458
+W =280
+H =4
+Type =Font Black
+Color =White
+
+[ScoreStaticBoxDark3]
+Tex =PlayerNumberBox
+X =755
+Y =467
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+TexX1=1
+TexY1=0
+TexX2=0
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Text1]
+X =759
+Y =472
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+#ScoreBar
+[ScoreStaticBackLevel3]
+Tex =ScoreLevel
+X =387
+Y =160
+W =120
+H =300
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticBackLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =130
+W =120
+H =30
+Color =P2Lightest
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScoreStaticLevel3]
+Tex =ScoreLevel
+X =387
+Y =410
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+
+[ScoreStaticLevelRound3]
+Tex =ScoreLevelRound
+X =387
+Y =380
+W =120
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=0.5
+
+[ScorePlayer3Static6]
+Tex =ScoreEndCap
+X =402
+Y =460
+W =90
+H =30
+Color =P2Dark
+Type =Font Black
+TexX1=0
+TexY1=0
+TexX2=1
+TexY2=1
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer3Static7]
+Tex =ScoreLine
+X =401
+Y =460
+W =92
+H =2
+Color =White
+Type =Font Black
+TexX1=0
+TexY1=0.1
+TexX2=1
+TexY2=0.9
+Z=1
+
+# # # # # # # # # # # # # # # # # # Three Player Score # # # # # # # # # # # #
+# P L A Y E R O N E
+[ScoreTextName4]
+X=20
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P1
+Color=P1Dark
+
+[ScoreTextNotes4]
+X=20
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore4]
+X=260
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus4]
+X=20
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore4]
+X=260
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes4]
+X=20
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore4]
+X=260
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore4]
+X=20
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal4]
+X=47
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore4]
+X=260
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark4]
+Tex =PlayerNumberBox
+X =20
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P1Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer4Text1]
+X =24
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P1
+
+#lines
+[ScorePlayer4Static1]
+X=20
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static2]
+X=20
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static3]
+X=20
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static4]
+X=20
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer4Static5]
+X=20
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+# P L A Y E R T W O
+[ScoreTextName5]
+X=280
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P2
+Color=P2Dark
+
+[ScoreTextNotes5]
+X=280
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore5]
+X=520
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus5]
+X=280
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore5]
+X=520
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes5]
+X=280
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore5]
+X=520
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore5]
+X=280
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal5]
+X=307
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore5]
+X=520
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark5]
+Tex =PlayerNumberBox
+X =280
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P2Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer5Text1]
+X =284
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P2
+
+[ScorePlayer5Static1]
+X=280
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static2]
+X=280
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static3]
+X=280
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static4]
+X=280
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer5Static5]
+X=280
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+# P L A Y E R T H R E E
+[ScoreTextName6]
+X=540
+Y=160
+Font=0
+Size=14
+Align=0
+Text=P3
+Color=P3Dark
+
+[ScoreTextNotes6]
+X=540
+Y=220
+Font=0
+Size=9
+Align=0
+Text=SING_NOTES
+Color=White
+
+[ScoreTextNotesScore6]
+X=780
+Y=220
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextLineBonus6]
+X=540
+Y=250
+Font=0
+Size=9
+Align=0
+Text=SING_PHRASE_BONUS
+Color=White
+
+[ScoreTextLineBonusScore6]
+X=780
+Y=250
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextGoldenNotes6]
+X=540
+Y=280
+Font=0
+Size=9
+Align=0
+Text=SING_GOLDEN_NOTES
+Color=White
+
+[ScoreTextGoldenNotesScore6]
+X=780
+Y=280
+Font=0
+Size=10
+Align=2
+Text=0000
+Color=White
+
+[ScoreTextScore6]
+X=540
+Y=310
+Font=1
+Size=9
+Align=0
+Text=Tone Deaf
+Color=White
+
+[ScoreTextTotal6]
+X=567
+Y=373
+Font=0
+Size=10
+Align=0
+Text=SING_TOTAL
+Color=White
+
+[ScoreTextTotalScore6]
+X=780
+Y=364
+Font=0
+Size=14
+Align=2
+Text=00000
+Color=White
+
+[ScoreStaticBoxDark6]
+Tex =PlayerNumberBox
+X =540
+Y =370
+W =25
+H =25
+Type =Font Black
+Color =P3Dark
+Z=0.9
+Reflection=1
+ReflectionSpacing=4
+
+[ScorePlayer6Text1]
+X =544
+Y =376
+W =30
+H =30
+Z=1
+Color=White
+Font =1
+Size =5
+Align=0
+Text=P3
+
+#lines
+[ScorePlayer6Static1]
+X=540
+Y=218
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static2]
+X=540
+Y=248
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static3]
+X=540
+Y=278
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static4]
+X=540
+Y=308
+W=240
+H=2
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+[ScorePlayer6Static5]
+X=540
+Y=338
+W=240
+H=4
+Tex=ScoreLine
+Type=Font Black
+Color=White
+
+
+
+############## Options ##############
+
+
+
+
+[Options]
+Texts = 6
+Fade = 2
+
+[OptionsBackground]
+Tex=OptionsBG
+
+[OptionsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsStatic2]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsStatic3]
+X =388
+Y =580
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsStatic4]
+X =512
+Y =580
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsText2]
+X =45
+Y =287
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_OPTIONS_WHEREAMI
+
+[OptionsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_DESC
+
+[OptionsText4]
+X =294
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsText5]
+X =418
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_SELECT
+
+[OptionsText6]
+X =538
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsButtonGame]
+X =7
+Y =320
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[OptionsButtonGameText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_OPTIONS_GAME
+Color=Black
+
+[OptionsButtonGraphics]
+X =7
+Y =350
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[OptionsButtonGraphicsText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_OPTIONS_GRAPHICS
+Color=Black
+
+[OptionsButtonSound]
+X =7
+Y =380
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[OptionsButtonSoundText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_OPTIONS_SOUND
+Color=Black
+
+[OptionsButtonLyrics]
+X =7
+Y =410
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[OptionsButtonLyricsText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_OPTIONS_LYRICS
+Color=Black
+
+[OptionsButtonThemes]
+X =7
+Y =440
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[OptionsButtonThemesText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_OPTIONS_THEMES
+Color=Black
+
+[OptionsButtonRecord]
+X =7
+Y =470
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[OptionsButtonRecordText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_OPTIONS_RECORD
+Color=Black
+
+[OptionsButtonAdvanced]
+X =7
+Y =500
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[OptionsButtonAdvancedText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_OPTIONS_ADVANCED
+Color=Black
+
+[OptionsButtonExit]
+X =7
+Y =530
+W =193
+H =30
+Tex =Button
+Color =Blue
+DColor = White
+Type=Font Black
+Texts=1
+
+[OptionsButtonExitText1]
+X =30
+Y =5
+Font=0
+Size=6
+Align=0
+Text=SING_OPTIONS_EXIT
+Color=Black
+
+[OptionsStatic5]
+X =12
+Y =324
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonOptions
+Type=Font Black
+
+[OptionsStatic6]
+X =12
+Y =354
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonOptions
+Type=Font Black
+
+[OptionsStatic7]
+X =12
+Y =384
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonOptions
+Type=Font Black
+
+[OptionsStatic8]
+X =12
+Y =414
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonOptions
+Type=Font Black
+
+[OptionsStatic9]
+X =12
+Y =444
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonOptions
+Type=Font Black
+
+[OptionsStatic10]
+X =12
+Y =474
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonOptions
+Type=Font Black
+
+[OptionsStatic11]
+X =12
+Y =504
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonOptions
+Type=Font Black
+
+[OptionsStatic12]
+X =12
+Y =534
+W =22
+H =22
+Color =GrayLight
+Tex =ButtonExit
+Type=Font Black
+
+[OptionsStatic13]
+X =12
+Y =282
+W =27
+H =27
+Color =GrayLight
+Tex =ButtonOptions
+Type=Font Black
+
+
+
+
+
+[OptionsGame]
+Texts = 5
+
+[OptionsGameBackground]
+Tex=Options2BG
+
+[OptionsGameStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGameStatic2]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsGameStatic3]
+X =388
+Y =580
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsGameText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGameText2]
+X =238
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GAME_WHEREAMI
+
+[OptionsGameText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GAME_DESC
+
+[OptionsGameText4]
+X =294
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGameText5]
+X =418
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGameSelectPlayers]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_PLAYERS
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDifficulty]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DIFFICULTY
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+
+[OptionsGameSelectSlideLanguage]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_LANGUAGE
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectTabs]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_TABS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectSlideSorting]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_SORTING
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameSelectDebug]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GAME_DEBUG
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsGameButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = DarkBlue
+DColor = LightBlue
+Type = Font Black
+
+[OptionsGraphics]
+Texts = 5
+
+[OptionsGraphicsBackground]
+Tex=Options2BG
+
+[OptionsGraphicsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsGraphicsStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsGraphicsStatic4]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsGraphicsStatic5]
+X =388
+Y =580
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsGraphicsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsGraphicsText2]
+X =238
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_GRAPHICS_WHEREAMI
+
+[OptionsGraphicsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_GRAPHICS_DESC
+
+[OptionsGraphicsText4]
+X =294
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsGraphicsText5]
+X =418
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsGraphicsSelectSlideResolution]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_GRAPHICS_RESOLUTION
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectFullscreen]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_FULLSCREEN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectDepth]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_DEPTH
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectOscilloscope]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_OSCILLOSCOPE
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsSelectMovieSize]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_MOVIE_SIZE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsGraphicsButtonExit]
+X = 40
+Y = 360
+W = 230
+H = 70
+Tex =MainBar
+Color = DarkBlue
+DColor = LightBlue
+Type = Font Black
+
+[OptionsSound]
+Texts = 5
+
+[OptionsSoundBackground]
+Tex=Options2BG
+
+[OptionsSoundStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsSoundStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsSoundStatic4]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsSoundStatic5]
+X =388
+Y =580
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsSoundText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsSoundText2]
+X =238
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_SOUND_WHEREAMI
+
+[OptionsSoundText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_SOUND_DESC
+
+[OptionsSoundText4]
+X =294
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsSoundText5]
+X =418
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsSoundSelectMicBoost]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_MIC_BOOST
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectClickAssist]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_CLICK_ASSIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectBeatClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_BEAT_CLICK
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectThreshold]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_THRESHOLD
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectTwoPlayerMode]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_SOUND_TWO_PLAYERS_MODE
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewVolume]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWVOLUME
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundSelectSlidePreviewFADING]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_SOUND_PREVIEWFADING
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsSoundButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = DarkBlue
+DColor = LightBlue
+Type = Font Black
+
+[OptionsLyrics]
+Texts = 1
+
+[OptionsLyricsBackground]
+Tex=Options2BG
+
+[OptionsLyricsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsLyricsStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsLyricsStatic4]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsLyricsStatic5]
+X =388
+Y =580
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsLyricsText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsLyricsText2]
+X =238
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_LYRICS_WHEREAMI
+
+[OptionsLyricsText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_LYRICS_DESC
+
+[OptionsLyricsText4]
+X =294
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsLyricsText5]
+X =418
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsLyricsSelectLyricsFont]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_FONT
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectLyricsEffect]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_EFFECT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsSelectSolmization]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_LYRICS_SOLMIZATION
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsLyricsButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = DarkBlue
+DColor = LightBlue
+Type = Font Black
+
+[OptionsThemes]
+Texts = 5
+
+[OptionsThemesBackground]
+Tex=Options2BG
+
+[OptionsThemesStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsThemesStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsThemesStatic4]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsThemesStatic5]
+X =388
+Y =580
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsThemesText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsThemesText2]
+X =238
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_THEMES_WHEREAMI
+
+[OptionsThemesText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_THEMES_DESC
+
+[OptionsThemesText4]
+X =294
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsThemesText5]
+X =418
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsThemesSelectTheme]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_THEME
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectSkin]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_SKIN
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesSelectColor]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_THEMES_COLOR
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsThemesButtonExit]
+X = 40
+Y = 250
+W = 230
+H = 70
+Tex =MainBar
+Color = DarkBlue
+DColor = LightBlue
+Type = Font Black
+
+[OptionsRecord]
+Texts = 5
+
+[OptionsRecordBackground]
+Tex=Options2BG
+
+[OptionsRecordStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsRecordStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsRecordStatic4]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsRecordStatic5]
+X =388
+Y =580
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsRecordText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsRecordText2]
+X =238
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_RECORD_WHEREAMI
+
+[OptionsRecordText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_RECORD_DESC
+
+[OptionsRecordText4]
+X =294
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsRecordText5]
+X =418
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[OptionsRecordSelectSlideCard]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CARD
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideInput]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_INPUT
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelL]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELL
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordSelectSlideChannelR]
+Tex = MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_RECORD_CHANNELR
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsRecordButtonExit]
+X = 40
+Y = 305
+W = 230
+H = 70
+Tex = MainBar
+Color = DarkBlue
+DColor = LightBlue
+Type = Font Black
+
+[OptionsAdvanced]
+Texts = 5
+
+[OptionsAdvancedBackground]
+Tex=Options2BG
+
+[OptionsAdvancedStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =IconOption
+Type=Font Black
+
+[OptionsAdvancedStatic2]
+X =0
+Y =549
+W =252
+H =28
+Tex=Leiste1
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic3]
+X =254
+Y =549
+W =548
+H =28
+Tex=Leiste2
+Color =White
+Type=Font Black
+Reflection=1
+ReflectionSpacing=1
+
+[OptionsAdvancedStatic4]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[OptionsAdvancedStatic5]
+X =388
+Y =580
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[OptionsAdvancedText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=SING_OPTIONS
+Align=0
+
+[OptionsAdvancedText2]
+X =238
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=2
+Text=SING_OPTIONS_ADVANCED_WHEREAMI
+
+[OptionsAdvancedText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=SING_OPTIONS_ADVANCED_DESC
+
+[OptionsAdvancedText4]
+X =294
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[OptionsAdvancedText5]
+X =418
+Y =579
+Color=Black
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+
+#########unused at the moment#########
+#[OptionsAdvancedSelectLoadAnimation]
+#Tex =MainBar
+#TexSBG =SelectBG
+#Text=SING_OPTIONS_ADVANCED_LOADANIMATION
+#X = 40
+#Y = 85
+#W = 230
+#H = 70
+#SkipX = 50
+
+#Color = ColorDark
+#DColor = Gray
+#TColor = White
+#TDColor = White
+#SBGTex =MainBar
+#SBGColor = ColorDark
+#SBGDColor = Gray
+#STColor = White
+#STDColor = GrayDark
+
+[OptionsAdvancedSelectScreenFade]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_SCREENFADE
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectEffectSing]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_EFFECTSING
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectLineBonus]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_GRAPHICS_LINEBONUS
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectSlideOnSongClick]
+Tex =MainBar
+TexSBG =SelectBG
+Text=SING_OPTIONS_ADVANCED_ONSONGCLICK
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectAskbeforeDel]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_ASKBEFOREDEL
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedSelectPartyPopup]
+Tex =MainBar
+TexSBG =SelectBG
+Text =SING_OPTIONS_ADVANCED_PARTYPOPUP
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[OptionsAdvancedButtonExit]
+X = 40
+Y = 415
+W = 230
+H = 70
+Tex =MainBar
+Color = DarkBlue
+DColor = LightBlue
+Type = Font Black
+
+
+
+
+
+
+############## Top 5 ####################
+
+
+
+
+
+
+
+[Top5]
+Texts=1
+
+[Top5Background]
+Tex=Top5BG
+
+[Top5Text1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Align=0
+Text =SING_TOP_5_CHARTS
+
+[Top5TextArtistTitle]
+X =70
+Y =53
+Color =White
+Font =0
+Size =10
+Align =0
+Text =artist - title
+
+[Top5Text4]
+X =70
+Y =73
+Color=White
+Font =0
+Size =10
+Align=0
+Text =SING_OPTIONS_GAME_DIFFICULTY
+
+[Top5TextLevel]
+X =270
+Y =73
+Color =White
+Font =0
+Size =10
+Align =1
+Text =easy
+
+[Top5Static1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =ScoreIcon
+Type=Font Black
+
+[Top5Text2]
+X =238
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=2
+Text=SING_TOP_5_CHARTS_WHEREAMI
+
+[Top5Static2]
+X =260
+Y =580
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[Top5Text3]
+X =290
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_TOP_5_CHARTS_CONTINUE
+
+[Top5TextName1]
+X =150
+Y =190
+Color =White
+Font =0
+Size =14
+Align =0
+Text =1. Player1
+
+[Top5TextName2]
+X =150
+Y =240
+Color =White
+Font =0
+Size =14
+Align =0
+Text =2. Player2
+
+[Top5TextName3]
+X =150
+Y =290
+Color =White
+Font =0
+Size =14
+Align =0
+Text =3. Player3
+
+[Top5TextName4]
+X =150
+Y =340
+Color =White
+Font =0
+Size =14
+Align =0
+Text =4. Player4
+
+[Top5TextName5]
+X =150
+Y =390
+Color =White
+Font =0
+Size =14
+Align =0
+Text =5. Player5
+
+[Top5TextScore1]
+X =680
+Y =190
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore2]
+X =680
+Y =240
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore3]
+X =680
+Y =290
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore4]
+X =680
+Y =340
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextScore5]
+X =680
+Y =390
+Color =White
+Font =0
+Size =14
+Align =2
+Text =00000
+
+[Top5TextNumber1]
+X =120
+Y =193
+Color =White
+Font =1
+Size =9
+Align =1
+Text =1
+
+[Top5TextNumber2]
+X =120
+Y =243
+Color =White
+Font =1
+Size =9
+Align =1
+Text =2
+
+[Top5TextNumber3]
+X =120
+Y =293
+Color =White
+Font =1
+Size =9
+Align =1
+Text =3
+
+[Top5TextNumber4]
+X =120
+Y =343
+Color =White
+Font =1
+Size =9
+Align =1
+Text =4
+
+[Top5TextNumber5]
+X =120
+Y =393
+Color =White
+Font =1
+Size =9
+Align =1
+Text =5
+
+[Top5StaticNumber1]
+Tex=PlayerNumberBox
+X=100
+Y=186
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber2]
+Tex=PlayerNumberBox
+X=100
+Y=236
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber3]
+Tex=PlayerNumberBox
+X=100
+Y=286
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber4]
+Tex=PlayerNumberBox
+X=100
+Y=336
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+[Top5StaticNumber5]
+Tex=PlayerNumberBox
+X=100
+Y=386
+W=40
+H=40
+Color=P1Dark
+Type=Font Black
+
+
+################## Party ################
+
+
+
+[PartyNewRound]
+Texts =7
+
+[PartyNewRoundBackground]
+Tex=PartyBG
+
+[PartyNewRoundStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyNewRoundText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyNewRoundText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_ROUND_DESC
+
+[PartyNewRoundText3]
+X =238
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=2
+Text=PARTY_ROUND_WHEREAMI
+
+[PartyNewRoundText4]
+X =290
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=PARTY_ROUND_LEGEND_CONTINUE
+
+[PartyNewRoundText5]
+X =460
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND
+Align=0
+
+[PartyNewRoundText6]
+X =600
+Y =100
+Color =White
+Font =0
+Size =10
+Text =PARTY_ROUND_WINNER
+Align=0
+
+[PartyNewRoundText7]
+X =448
+Y =350
+Color =White
+Font =0
+Size =18
+Text =PARTY_ROUND
+Align=2
+
+[PartyNewRoundTextTeam1Players]
+X =30
+Y =137
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam2Players]
+X =30
+Y =218
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundTextTeam3Players]
+X =30
+Y =299
+Color=White
+Font =0
+Size =7
+Align=0
+Text=Dummytext, Player2, Player3, Player4
+
+[PartyNewRoundStatic2]
+Tex =PartyRoundBG1
+X =450
+Y =103
+W = 330
+H = 24
+Int=1
+Color =DarkBlue
+Type=Font Black
+
+[PartyNewRoundStatic3]
+X =260
+Y =580
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[PartyNewRoundStatic4]
+Tex =PartyRoundBG3
+X =250
+Y =350
+W = 300
+H = 50
+Int=1
+Color =DarkBlue
+Type=Font Black
+
+[PartyNewRoundStatic5]
+Tex =PartyRoundBG4
+X =50
+Y =495
+W = 700
+H = 30
+Int=1
+Color =LightBlue
+Type=Font Black
+
+[PartyNewRoundStaticTeam1]
+Tex =PartyTeamButton1
+X =20
+Y =110
+W =400
+H =50
+Int=1
+Color =P1Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam2]
+Tex =PartyTeamButton1
+X =20
+Y =191
+W =400
+H =50
+Int=1
+Color =P2Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticTeam3]
+Tex =PartyTeamButton1
+X =20
+Y =272
+W =400
+H =50
+Int=1
+Color =P3Dark
+Type=Font Black
+Reflection=0
+
+[PartyNewRoundStaticNextPlayer1]
+Tex=PartyPlayerButton
+X=155
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P1Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer2]
+Tex=PartyPlayerButton
+X=325
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P2Light
+Reflection=1
+ReflectionSpacing=2
+
+[PartyNewRoundStaticNextPlayer3]
+Tex=PartyPlayerButton
+X=495
+Y=415
+W=150
+H=50
+Type=Font Black
+Texts=1
+Color =P3Light
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyNewRoundTextRound1]
+X =460
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Round 1
+Align=0
+
+[PartyNewRoundTextRound2]
+X =460
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Round 2
+Align=0
+
+[PartyNewRoundTextRound3]
+X =460
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Round 3
+Align=0
+
+[PartyNewRoundTextRound4]
+X =460
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Round 4
+Align=0
+
+[PartyNewRoundTextRound5]
+X =460
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Round 5
+Align=0
+
+[PartyNewRoundTextRound6]
+X =460
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Round 6
+Align=0
+
+[PartyNewRoundTextRound7]
+X =460
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Round 7
+Align=0
+
+[PartyNewRoundTextWinner1]
+X =600
+Y =133
+Color =White
+Font =0
+Size =8
+Text =Winner 1
+Align=0
+
+[PartyNewRoundTextWinner2]
+X =600
+Y =162
+Color =White
+Font =0
+Size =8
+Text =Winner 2
+Align=0
+
+[PartyNewRoundTextWinner3]
+X =600
+Y =191
+Color =White
+Font =0
+Size =8
+Text =Winner 3
+Align=0
+
+[PartyNewRoundTextWinner4]
+X =600
+Y =220
+Color =White
+Font =0
+Size =8
+Text =Winner 4
+Align=0
+
+[PartyNewRoundTextWinner5]
+X =600
+Y =249
+Color =White
+Font =0
+Size =8
+Text =Winner 5
+Align=0
+
+[PartyNewRoundTextWinner6]
+X =600
+Y =278
+Color =White
+Font =0
+Size =8
+Text =Winner 6
+Align=0
+
+[PartyNewRoundTextWinner7]
+X =600
+Y =307
+Color =White
+Font =0
+Size =8
+Text =Winner 7
+Align=0
+
+[PartyNewRoundStaticRound1]
+Tex =PartyRoundBG2
+X =450
+Y =135
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundStaticRound2]
+Tex =PartyRoundBG2
+X =450
+Y =164
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundStaticRound3]
+Tex =PartyRoundBG2
+X =450
+Y =193
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundStaticRound4]
+Tex =PartyRoundBG2
+X =450
+Y =222
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundStaticRound5]
+Tex =PartyRoundBG2
+X =450
+Y =251
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundStaticRound6]
+Tex =PartyRoundBG2
+X =450
+Y =280
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundStaticRound7]
+Tex =PartyRoundBG2
+X =450
+Y =309
+W = 330
+H = 20
+Color =LightBlue
+Type =Font Black
+
+[PartyNewRoundTextNextRound]
+X =400
+Y =495
+Color =White
+Font =0
+Size =10
+Text =Next Round
+Align=1
+
+[PartyNewRoundTextNextRoundNo]
+X =457
+Y =350
+Color =White
+Font =0
+Size =18
+Text =99
+Align=0
+
+[PartyNewRoundTextScoreTeam1]
+X =390
+Y =110
+Color =White
+Font =0
+Size =17
+Text =3000
+Align=1
+
+[PartyNewRoundTextScoreTeam2]
+X =390
+Y =191
+Color =White
+Font =0
+Size =17
+Text =2000
+Align=1
+
+[PartyNewRoundTextScoreTeam3]
+X =390
+Y =272
+Color =White
+Font =0
+Size =17
+Text =1000
+Align=1
+
+[PartyNewRoundTextNameTeam1]
+X =30
+Y =108
+Color =White
+Font =0
+Size =12
+Text =Team 1
+Align=0
+
+[PartyNewRoundTextNameTeam2]
+X =30
+Y =189
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyNewRoundTextNameTeam3]
+X =30
+Y =270
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyNewRoundTextNextPlayer1]
+X =230
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 1
+Align=1
+
+[PartyNewRoundTextNextPlayer2]
+X =400
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 2
+Align=1
+
+[PartyNewRoundTextNextPlayer3]
+X =570
+Y =425
+Color =White
+Font =0
+Size =10
+Text =Player 3
+Align=1
+
+
+[PartyScore]
+Texts=5
+
+[PartyScoreBackground]
+Tex=PartyBG
+
+[PartyScoreDecoTextures]
+ChangeTextures =1
+
+FirstTexture =PartyScoreDeco
+FirstTyp =Font Black
+FirstColor =Gold
+
+SecondTexture =PartyScoreDeco
+SecondTyp =Font Black
+SecondColor =Silver
+
+ThirdTexture =PartyScoreDeco
+ThirdTyp =Font Black
+ThirdColor =Bronze
+
+[PartyScoreStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyScoreStatic2]
+X =260
+Y =580
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[PartyScoreText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyScoreText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_SCORE_DESC
+
+[PartyScoreText3]
+X =238
+Y =579
+Color=Gray Light
+Font =0
+Size =7
+Align=2
+Text=PARTY_SCORE_WHEREAMI
+
+[PartyScoreText4]
+X =290
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=PARTY_LEGEND_CONTINUE
+
+[PartyScoreStatic3]
+Tex =PartyScoreBG1
+X =50
+Y =100
+W = 700
+H = 80
+Int=1
+Color =DarkBlue
+Type=Font Black
+
+[PartyScoreStatic4]
+Tex =PartyScoreBG2
+X =50
+Y =495
+W = 700
+H = 20
+Int=1
+Color =LightBlue
+Type=Font Black
+
+[PartyScoreText5]
+X =400
+Y =136
+Color =White
+Font =0
+Size =15
+Text =PARTY_SCORE_WINS2
+Align=1
+
+[PartyScoreTextWinner]
+X =400
+Y =98
+Color =White
+Font =0
+Size =18
+Text =The Winner is...
+Align=1
+
+[PartyScoreTextScoreTeam1]
+X =568
+Y =198
+Color =White
+Font =0
+Size =12
+Text =3000
+Align=2
+
+[PartyScoreTextScoreTeam2]
+X =568
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyScoreTextScoreTeam3]
+X =568
+Y =398
+Color =White
+Font =0
+Size =12
+Text =1000
+Align=2
+
+[PartyScoreTextNameTeam1]
+X =188
+Y =198
+Font=0
+Size=12
+Align=0
+Text=Team 1
+Color=White
+
+[PartyScoreTextNameTeam2]
+X =188
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyScoreTextNameTeam3]
+X =188
+Y =398
+Color =White
+Font =0
+Size =12
+Text =Team 3
+Align=0
+
+[PartyScoreStaticTeam1]
+X =188
+Y =230
+W =380
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam1BG]
+Tex=PartyTeamButton2
+X=178
+Y=200
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam1Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 191
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam2]
+X =188
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam2BG]
+Tex=PartyTeamButton2
+X=178
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam2Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyScoreStaticTeam3]
+X =188
+Y =430
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyScoreStaticTeam3BG]
+Tex=PartyTeamButton2
+X=178
+Y=400
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyScoreStaticTeam3Deco]
+Tex =PartyScoreDeco
+X = 563
+Y = 391
+W = 64
+H = 64
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=-5
+
+[PartyWin]
+Texts=4
+
+[PartyWinBackground]
+Tex=PartyBG
+
+[PartyWinStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyWinStatic2]
+X =260
+Y =580
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+
+[PartyWinText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyWinText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_WIN_DESC
+
+[PartyWinText3]
+X =238
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=2
+Text=PARTY_WIN_WHEREAMI
+
+[PartyWinText4]
+X =290
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=PARTY_WIN_LEGEND_CONTINUE
+
+#[PartyWinTextWinner]
+#X =150
+#Y =120
+#Color =White
+#Font =1
+#Size =14
+#Text =The Winner is...
+#Align=0
+
+[PartyWinTextScoreTeam1]
+X =699
+Y =183
+Color =White
+Font =0
+Size =19
+Text =3000
+Align=2
+
+[PartyWinTextScoreTeam2]
+X =669
+Y =298
+Color =White
+Font =0
+Size =12
+Text =2000
+Align=2
+
+[PartyWinTextScoreTeam3]
+X =649
+Y =398
+Color =White
+Font =0
+Size =9
+Text =1000
+Align=2
+
+[PartyWinTextNameTeam1]
+X =169
+Y =183
+Font=0
+Size=19
+Align=0
+Text=Team 1
+Color=White
+
+[PartyWinTextNameTeam2]
+X =289
+Y =298
+Color =White
+Font =0
+Size =12
+Text =Team 2
+Align=0
+
+[PartyWinTextNameTeam3]
+X =369
+Y =398
+Color =White
+Font =0
+Size =9
+Text =Team 3
+Align=0
+
+[PartyWinStaticTeam1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BG]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank2]
+Tex=PartyTeamButton3
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam1Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P1Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam1BGRank3]
+Tex=PartyTeamButton3
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P1Dark
+Reflection=1
+ReflectionSpacing=2
+
+
+[PartyWinStaticTeam1Deco]
+Tex =PartyWinDeco1
+X = 91
+Y = 176
+W = 79
+H = 79
+Type =Font Black
+Color =Gold
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BG]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamButton3
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank1]
+Tex=PartyTeamButton4
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P2Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank2]
+Tex=PartyTeamButton4
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P2Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam2BGRank3]
+Tex=PartyTeamButton4
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam2Deco]
+Tex =PartyWinDeco2
+X = 226
+Y = 291
+W = 64
+H = 64
+Type =Font Black
+Color =Silver
+Reflection=1
+ReflectionSpacing=3
+
+[PartyWinStaticTeam3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =TeamColor
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BG]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =TeamColor
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank1]
+X =169
+Y =230
+W =530
+H =16
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank1]
+Tex=PartyTeamButton3
+X=159
+Y=185
+W=550
+H=65
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank2]
+X =289
+Y =330
+W =380
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank2]
+Tex=PartyTeamButton5
+X=279
+Y=300
+W=400
+H=50
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Rank3]
+X =369
+Y =420
+W =280
+H =15
+Z =1
+Tex=PartyTeamPoints
+Color =P3Dark
+Int = 1
+Type=Font Black
+Reflection=1
+ReflectionSpacing=12
+
+[PartyWinStaticTeam3BGRank3]
+Tex=PartyTeamButton5
+X=359
+Y=400
+W=300
+H=40
+Type=Font Black
+Color =P3Dark
+Reflection=1
+ReflectionSpacing=2
+
+[PartyWinStaticTeam3Deco]
+Tex =PartyWinDeco3
+X = 316
+Y = 391
+W = 54
+H = 54
+Type =Font Black
+Color =Bronze
+Reflection=1
+ReflectionSpacing=3
+
+[PartyOptions]
+Texts = 5
+
+[PartyOptionsBackground]
+Tex=PartyBG
+
+[PartyOptionsStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyOptionsStatic2]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[PartyOptionsStatic3]
+X =388
+Y =580
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[PartyOptionsText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyOptionsText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_OPTIONS_DESC
+
+[PartyOptionsText3]
+X =238
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=2
+Text=PARTY_OPTIONS_WHEREAMI
+
+[PartyOptionsText4]
+X =294
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyOptionsText5]
+X =418
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_CONTINUE
+
+[PartyOptionsSelectLevel]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_DIFFICULTY
+X = 40
+Y = 85
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 140
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayList2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_PLAYLIST
+X = 40
+Y = 195
+W = 230
+H = 70
+SkipX = 50
+Fields=1
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectRounds]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_ROUNDS
+X = 40
+Y = 250
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectTeams]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS
+X = 40
+Y = 305
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers1]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER1
+X = 40
+Y = 360
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers2]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER2
+X = 40
+Y = 415
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+[PartyOptionsSelectPlayers3]
+Tex = MainBar
+TexSBG =SelectBG
+Text =PARTY_TEAMS_PLAYER3
+X = 40
+Y = 470
+W = 230
+H = 70
+SkipX = 50
+Fields=7
+
+Color = DarkBlue
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = DarkBlue
+SBGDColor = LightBlue
+STColor = White
+STDColor = GrayDark
+
+
+
+[PartyPlayer]
+Texts=6
+
+[PartyPlayerBackground]
+Tex=PartyBG
+
+[PartyPlayerStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =PartyIcon
+Type=Font Black
+
+[PartyPlayerStatic2]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerStatic3]
+X =388
+Y =580
+W =26
+H =22
+Tex=ButtonAZ
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerStatic4]
+X =556
+Y =580
+W =26
+H =22
+Tex=ButtonEnter
+Color =White
+Type=Font Black
+Style=5
+
+[PartyPlayerText1]
+X =70
+Y =6
+ColR = 0.7
+ColG = 0.7
+ColB = 0.7
+Font = 0
+Size = 20
+Color =White
+Text=PARTY_MODE
+
+[PartyPlayerText2]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=PARTY_PLAYER_DESC
+
+[PartyPlayerText3]
+X =238
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=2
+Text=PARTY_PLAYER_WHEREAMI
+
+[PartyPlayerText4]
+X =294
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[PartyPlayerText5]
+X =418
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_ENTER_NAME
+
+[PartyPlayerText6]
+X =586
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=PARTY_PLAYER_LEGEND_CONTINUE
+
+[PartyPlayerTeam1Name]
+Tex=PartyTeamButton2
+X=85
+Y=100
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Dark
+
+[PartyPlayerTeam1NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 1
+Color=White
+
+[PartyPlayerPlayer1Name]
+Tex=MainBar
+X=85
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer1NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 1
+Color=White
+
+[PartyPlayerPlayer2Name]
+Tex=MainBar
+X=245
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer2NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 2
+Color=White
+
+[PartyPlayerPlayer3Name]
+Tex=MainBar
+X=405
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer3NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 3
+Color=White
+
+[PartyPlayerPlayer4Name]
+Tex=MainBar
+X=565
+Y=160
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P1Lightest
+DColor =P1Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer4NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 4
+Color=White
+
+[PartyPlayerTeam2Name]
+Tex=PartyTeamButton2
+X=85
+Y=240
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Dark
+
+[PartyPlayerTeam2NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 2
+Color=White
+
+[PartyPlayerPlayer5Name]
+Tex=MainBar
+X=85
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer5NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 5
+Color=White
+
+[PartyPlayerPlayer6Name]
+Tex=MainBar
+X=245
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer6NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 6
+Color=White
+
+[PartyPlayerPlayer7Name]
+Tex=MainBar
+X=405
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer7NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 7
+Color=White
+
+[PartyPlayerPlayer8Name]
+Tex=MainBar
+X=565
+Y=300
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P2Lightest
+DColor =P2Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer8NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 8
+Color=White
+
+[PartyPlayerTeam3Name]
+Tex=MainBar
+Tex=PartyTeamButton2
+X=85
+Y=380
+W=310
+H=50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Dark
+
+[PartyPlayerTeam3NameText1]
+X =155
+Y =8
+Font=0
+Size=12
+Align=1
+Text=Team 3
+Color=White
+
+[PartyPlayerPlayer9Name]
+Tex=MainBar
+X=85
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer9NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 9
+Color=White
+
+[PartyPlayerPlayer10Name]
+Tex=MainBar
+X=245
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer10NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 10
+Color=White
+
+[PartyPlayerPlayer11Name]
+Tex=MainBar
+X=405
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer11NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 11
+Color=White
+
+[PartyPlayerPlayer12Name]
+Tex=MainBar
+X=565
+Y=440
+W =150
+H =50
+Type=Font Black
+Texts=1
+Color =P3Lightest
+DColor =P3Light
+Reflection=1
+ReflectionSpacing=1
+
+[PartyPlayerPlayer12NameText1]
+X =75
+Y =10
+Font=0
+Size=10
+Align=1
+Text=Player 12
+Color=White
+
+
+[SongMenu]
+Texts=0
+Statics=1
+
+[SongMenuButton1]
+X = 510
+Y = 165
+W = 270
+H = 25
+Tex =Rectangle
+Color =LightBlue
+DColor = DarkBlue
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton1Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_PLAY
+Align=0
+Z=0.99
+
+[SongMenuButton2]
+X = 510
+Y = 195
+W = 270
+H = 25
+Tex =Rectangle
+Color =LightBlue
+DColor = DarkBlue
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton2Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_EDIT
+Align=0
+Z=0.99
+
+[SongMenuButton3]
+X = 510
+Y = 225
+W = 270
+H = 25
+Tex =Rectangle
+Color =LightBlue
+DColor = DarkBlue
+Type=Font Black
+Texts=1
+Z = 0.98
+Texts=1
+
+[SongMenuButton3Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_MODI
+Align=0
+Z=0.99
+
+[SongMenuButton4]
+X = 510
+Y = 255
+W = 270
+H = 25
+Tex = Rectangle
+Color =LightBlue
+DColor = DarkBlue
+Type=Font Black
+Texts=1
+Z = 0.98
+
+[SongMenuButton4Text1]
+X =30
+Y =0
+Color=White
+Font =0
+Size =8
+Text=SONG_MENU_CANCEL
+Align=0
+Z=0.99
+
+[SongMenuSelectSlide3]
+Tex = Rectangle
+TexSBG = SongMenuSelectBG
+Text =
+X = 510
+Y = 225
+W = 0
+H = 25
+Z = 0.98
+SkipX = 0
+SBGW=270
+
+TextSize=8
+
+Color = LightBlue
+DColor = DarkBlue
+TColor = White
+TDColor = White
+SBGTex = MainBar
+SBGColor = LightBlue
+SBGDColor = DarkBlue
+STColor = White
+STDColor = GrayDark
+
+[SongMenuTextMenu]
+X =539
+Y =125
+Color=White
+Font =0
+Size =14
+Text=MENU
+Align=0
+Z=0.99
+
+[SongMenuStatic2]
+X =513
+Y =135
+W =21
+H =21
+Color =White
+Tex =IconSongMenu
+Type=Font Black
+Z=0.98
+
+[SongMenuStatic1]
+Tex =SongMenuBG
+X =498
+Y =120
+W =300
+H =200
+Z =0.94
+Int=1
+Color =DarkBlue
+Type=Font Black
+
+[SongJumpto]
+Texts=0
+Statics=1
+
+[SongJumptoStatic1]
+Tex =JumpToBG
+X =221
+Y =175
+W =355
+H =175
+Z =0.98
+Int=1
+Color =DarkBlue
+Type=Font Black
+
+[SongJumptoStatic2]
+X =234
+Y =185
+W =21
+H =21
+Color =White
+Tex =MainSearch
+Type=Font Black
+Z=0.99
+
+[SongJumptoText1]
+X =310
+Y =175
+Color=White
+Font =0
+Size =14
+Text=SONG_JUMPTO_TYPE_DESC
+Align=0
+Z=0.99
+
+[SongJumptoSelectSlideType]
+Tex = button
+TexSBG = mainicon
+#Text = SONG_JUMPTO_TYPE_DESC
+Font=1
+X = 242
+Y = 205
+Z = 0.99
+W = 0
+H = 30
+SkipX = 4
+SBGW= 300
+Fields=2
+DColor = LightBlue
+TColor = White
+TDColor = White
+SBGTex = button
+SBGDColor = LightBlue
+STColor = White
+STDColor = LightBlue
+
+[SongJumptoButtonSearchText]
+X = 250
+Y = 215
+Z = 0.99
+W = 160
+H = 50
+Size=14
+Font=1
+Align=0
+
+[SongJumptoTextFound]
+X =234
+Y =295
+Color=White
+Font =0
+Size =8
+Text=SONG_JUMPTO_HELP
+Align=0
+Z=0.99
+
+
+
+################ Statistiken ######################
+
+
+[StatMain]
+Texts=0
+Statics=0
+
+[StatMainBackground]
+Tex=ScoreScreenBG
+
+[StatMainButtonScores]
+X =589
+Y =100
+W =190
+H =50
+Tex =MainBar
+Color =DarkBlue
+DColor = LightBlue
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonScoresText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SCORES
+Color=White
+
+[StatMainButtonSingers]
+X =589
+Y =160
+W =190
+H =50
+Tex =MainBar
+Color =DarkBlue
+DColor = LightBlue
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSingersText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_DESC_SINGERS
+Color=White
+
+[StatMainButtonSongs]
+X =589
+Y =220
+W =190
+H =50
+Tex =MainBar
+Color =DarkBlue
+DColor = LightBlue
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonSongsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_SONGS
+Color=White
+
+[StatMainButtonBands]
+X =589
+Y =280
+W =190
+H =50
+Tex =MainBar
+Color =DarkBlue
+DColor = LightBlue
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonBandsText1]
+X =95
+Y =13
+Font=0
+Size=8
+Align=1
+Text=STAT_DESC_BANDS
+Color=White
+
+[StatMainButtonExit]
+X =589
+Y =340
+W =190
+H =50
+Tex =MainBar
+Color =DarkBlue
+DColor = LightBlue
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatMainButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatMainTextOverview]
+X =45
+Y =125
+W =510
+Color=White
+Font =0
+Size =9
+Align=0
+Text=
+
+[StatMainStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =StatIcon
+Type=Font Black
+
+[StatMainStatic2]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[StatMainStatic3]
+X =388
+Y =580
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[StatMainStatic4]
+X =40
+Y =100
+W =520
+H =20
+Tex=StatMainBG1
+Color =ColorLight
+Type=Font Black
+
+[StatMainStatic5]
+X =40
+Y =120
+W =520
+H =300
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatMainStatic6]
+X =40
+Y =420
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+[StatMainText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=STAT_MAIN
+Align=0
+
+[StatMainText2]
+X =238
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=2
+Text=STAT_MAIN_WHEREAMI
+
+[StatMainText3]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=STAT_MAIN_DESC
+
+[StatMainText4]
+X =294
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatMainText5]
+X =418
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[StatDetail]
+Texts=0
+Statics=0
+
+[StatDetailBackground]
+Tex=ScoreScreenBG
+
+[StatDetailButtonNext]
+X =589
+Y =100
+W =190
+H =50
+Tex =MainBar
+Color =DarkBlue
+DColor = LightBlue
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonNextText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_NEXT
+Color=White
+
+[StatDetailButtonPrev]
+X =589
+Y =160
+W =190
+H =50
+Tex =MainBar
+Color =DarkBlue
+DColor = LightBlue
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonPrevText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_PREV
+Color=White
+
+[StatDetailButtonReverse]
+X =589
+Y =220
+W =190
+H =50
+Tex =MainBar
+Color =DarkBlue
+DColor = LightBlue
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonReverseText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=STAT_REVERSE
+Color=White
+
+[StatDetailButtonExit]
+X =589
+Y =280
+W =190
+H =50
+Tex =MainBar
+Color =DarkBlue
+DColor = LightBlue
+Type=Font Black
+Texts=1
+Reflection=0
+
+[StatDetailButtonExitText1]
+X =95
+Y =10
+Font=0
+Size=10
+Align=1
+Text=SING_OPTIONS_EXIT
+Color=White
+
+[StatDetailTextDescription]
+X =70
+Y =53
+Color=White
+Font =0
+Size =10
+Align =0
+Text=
+
+[StatDetailTextPage]
+X = 546
+Y = 98
+Color= Black
+Font = 0
+Size = 5
+Align=2
+Text=
+
+[StatDetailTextList1]
+X = 45
+Y = 122
+Color=White
+Font = 0
+Size = 7
+Text=Stat1
+
+[StatDetailTextList2]
+X = 45
+Y = 160
+Color=White
+Font = 0
+Size = 7
+Text=Stat2
+
+[StatDetailTextList3]
+X = 45
+Y = 198
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList4]
+X = 45
+Y = 236
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList5]
+X = 45
+Y = 274
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList6]
+X = 45
+Y = 312
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList7]
+X = 45
+Y = 350
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList8]
+X = 45
+Y = 388
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList9]
+X = 45
+Y = 426
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailTextList10]
+X = 45
+Y = 464
+Color=White
+Font = 0
+Size = 7
+Text=
+
+[StatDetailStatic1]
+X =40
+Y =22
+W =27
+H =27
+Color =White
+Tex =StatIcon
+Type=Font Black
+
+[StatDetailStatic2]
+X =260
+Y =580
+W =30
+H =22
+Tex=ButtonNavi
+Color =White
+Type=Font Black
+Style=5
+
+[StatDetailStatic3]
+X =388
+Y =580
+W =22
+H =22
+Tex=ButtonEsc
+Color =White
+Type=Font Black
+
+[StatDetailStatic4]
+X =40
+Y =100
+W =520
+H =24
+Tex=StatDetailBG1
+Color =ColorLight
+Type=Font Black
+
+[StatDetailStatic5]
+X =40
+Y =124
+W =520
+H =376
+Tex=StatMainBG2
+Color =ColorDark
+Type=Font Black
+
+[StatDetailStatic6]
+X =40
+Y =500
+W =520
+H =20
+Tex=StatMainBG3
+Color =ColorLight
+Type=Font Black
+
+
+[StatDetailText1]
+X =70
+Y =6
+Color=White
+Font =0
+Size =20
+Text=STAT_DETAIL
+Align=0
+
+[StatDetailText2]
+X =238
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=2
+Text=STAT_DETAIL_WHEREAMI
+
+[StatDetailText3]
+X =294
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_NAVIGATE
+
+[StatDetailText4]
+X =418
+Y =579
+Color=GrayLight
+Font =0
+Size =7
+Align=0
+Text=SING_LEGEND_ESC
+
+[CheckPopup]
+Texts=1
+Statics=1
+
+[CheckPopupButton1]
+X = 285
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=JA
+Align=1
+Z=1
+
+[CheckPopupButton2]
+X = 415
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[CheckPopupButton2Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=NEIN
+Align=1
+Z=1
+
+[CheckPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[CheckPopupText1]
+X =282
+Y =147
+Color=White
+Font =0
+Size =10
+Text=MSG_QUESTION_TITLE
+Align=0
+Z=1
+
+[CheckPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =GrayPopup
+Type=Font Black
+
+[CheckPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[CheckPopupStatic3]
+Tex =IconQuestion
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopup]
+Texts=1
+Statics=1
+
+[ErrorPopupButton1]
+X = 350
+Y = 310
+W = 100
+H = 25
+Tex =Rectangle
+Color = Gray
+DColor = GrayPopup
+Type=Font Black
+Texts=1
+Z = 1
+Texts=1
+
+[ErrorPopupButton1Text1]
+X =50
+Y =0
+Color=White
+Font =0
+Size =8
+Text=OK
+Align=1
+Z=1
+
+[ErrorPopupText]
+X =400
+Y =180
+W =280
+Color=White
+Font =0
+Size =12
+Text=error text
+Align=1
+Z=1
+
+[ErrorPopupText1]
+X =282
+Y =148
+Color=White
+Font =0
+Size =10
+Text=MSG_ERROR_TITLE
+Align=0
+Z=1
+
+[ErrorPopupStatic1]
+Tex =PopUpBG
+X =250
+Y =150
+W =300
+H =200
+Z =0.98
+Int=1
+Color =GrayPopup
+Type=Font Black
+
+[ErrorPopupStatic2]
+Tex =PopUpFG
+X =250
+Y =150
+W =300
+H =200
+Z =0.99
+Int=1
+Color =White
+Type=Font Black
+
+[ErrorPopupStatic3]
+Tex =IconError
+X =255
+Y =151
+W =23
+H =23
+Z =0.99
+Int=1
+Color =White
+Type=Font Black \ No newline at end of file