Drachenbauer wrote:is there anything, i can do to make it create the list in this order here?
Full Script: (With Modifications for Background Color Sorting)
Code: Select all
; Script Information ===========================================================
; Name: Bulldozer
; Description: Bulldozer is an Autohotkey recreation the original Bulldozer 1,
; Bulldozer 2, and Bulldozer 3 games originally developed by John
; Hattan (The Code Zone).
; AHK Version: 1.1.23.00+
; OS Version: Windows 7+
; Language: English (United States)
; Author: Weston Campbell <westoncampbell@gmail.com>
; Website: https://autohotkey.com/boards/viewtopic.php?f=6&t=50139
; ==============================================================================
; Revision History =============================================================
; Revision 18 (2019-05-09)
; * Added menubar "View" & "Layered Tiles" items to documentation index
; * Drag & drop custom theme image to game window to apply it
; ------------------------------------------------------------------------------
; Revision 17 (2019-04-29)
; * Restored Backspace hotkey as optional undo key
; * Fixed broken link in documentation for the custom themes external page
; * Hold Ctrl while clicking the "Documentation..." menu item to force load
; external Github documentation webpage
; * Added text notice to right-click for more options on Level Select
; * Block screenshot hotkey when Level Select or About screen is displayed
; * Added level number to screenshot filename
; * Display notification when taking screenshot
; ------------------------------------------------------------------------------
; Revision 16 (2019-03-28)
; * Added option to toggle tile layering for custom themes using transparency
; * Added hotkey F12 to save screenshot as PNG
; * Added documentation for game
; * INI Validation to ignore invalid settings
; ------------------------------------------------------------------------------
; Revision 15 (2019-03-01)
; * Fixed background color chooser not saving custom color selections
; * Fixed bugs with MidiSound() function
; * Added sound effects for "Undo Last Move"
; * Fixed tile layering issue for custom themes
; * Added menu icons
; * Changed "Level Select" layout
; * Added "Taskbar Progress" option to enable taskbar progressbar updates
; * Added "Titlebar Progress" option to toggle completion status text in title
; * Added option to teleport with a single click if "Mouse Movement" enabled
; * Mark levels 'Solved' or 'Unsolved' by right clicking in "Level Select"
; * Minor UI Changes
; ------------------------------------------------------------------------------
; Revision 14 (2018-08-31)
; * Changed hotkey prevention to use window handle instead of title
; * Fixed levels 64 & 127 not applying "missing target" hotfix after restart
; * Changed Titlebar progress to only check for update when moving an object
; * Added MIDI sound effects
; ------------------------------------------------------------------------------
; Revision 13 (2018-08-28)
; * Added 'Boss Key' hotkey to quickly minimize game window using "Spacebar"
; * Added alternate 'Undo Last Move' hotkey using "Backspace"
; * Added "Page Up" & "Page Down" hotkeys to change levels
; * On-screen level number now indicates level completion status using colors
; * Minor changes to 'Level Select' screen layout
; * Automatically load last played level
; * Show levels from same collection as current level on opening 'Level Select'
; * Added 'Mouse Movement' to control the bulldozer movement with the mouse
; * Fixed level 179 to prevent bulldozer from moving outside of viewable area
; * Improved prevention of unintended tab switching of tab control
; * Fixed tab display issues when toggling menu items while not on game screen
; * Fixed 'Level Select' color status drawing issue
; * Added current level progress in the Titlebar
; ------------------------------------------------------------------------------
; Revision 12 (2018-08-14)
; * Fixed 'Undo Last Move' not working for map strings containing only digits
; ------------------------------------------------------------------------------
; Revision 11 (2018-08-07)
; * Fix memory leak from Level Select status coloring function
; ------------------------------------------------------------------------------
; Revision 10 (2018-08-06)
; * Fixed levels 64 & 127 not showing a target due to bulldozer start location
; * Added level status to the Level Select screen
; ------------------------------------------------------------------------------
; Revision 9 (2018-07-31)
; * Removed password system
; * Improved methods to prevent accidental tab switching
; * Level Select modified to choose any level without password
; * Changed how on-screen level number is displayed
; * Removed save/load
; ------------------------------------------------------------------------------
; Revision 8 (2018-07-26)
; * Fixed inadvertently switching tabs using arrow keys
; * Added additional options to the menus
; ------------------------------------------------------------------------------
; Revision 7 (2018-07-23)
; * Code optimization
; * Background color selection
; * New Fontmap for increased readability of level/password display text
; * Debug Mode
; * Save/Read settings with INI file
; ------------------------------------------------------------------------------
; Revision 6 (2018-06-18)
; * Added 'Undo Last Move' menu option -- Used only after pushing object
; ------------------------------------------------------------------------------
; Revision 5 (2018-06-12)
; * Fixed boundary tile being overwritten when pushing boulder into it
; * Added DPI scaling support
; ------------------------------------------------------------------------------
; Revision 4 (2018-06-11)
; * Added levels from Bulldozer 2 and Bulldozer 3
; * Resized level area for compatibility with maps from Bulldozer 2/Bulldozer 3
; * Optimized level drawing to update changed tiles only.
; * Redesigned 'Level Select' and 'About' menu item contents
; ------------------------------------------------------------------------------
; Revision 3 (2018-06-07)
; * Changed background image update process to prevent flickering
; ------------------------------------------------------------------------------
; Revision 2 (2018-06-06)
; * Fixed font map displaying incorrect character for numbers 8 and 9
; ------------------------------------------------------------------------------
; Revision 1 (2018-06-05)
; * Initial release
; ==============================================================================
; Auto-Execute =================================================================
#SingleInstance, Force ; Allow only one running instance of script
#Persistent ; Keep the script permanently running until terminated
#NoEnv ; Avoid checking empty variables for environment variables
#NoTrayIcon ; Disable the tray icon of the script
#KeyHistory, 0 ; Disable history of keystrokes & mouse clicks
DetectHiddenWindows, On ; Allow hidden windows to be visible by script
SetWorkingDir, % A_ScriptDir ; Set the working directory of the script
SetBatchLines, -1 ; Run script at maximum speed
SetControlDelay, -1 ; Disable delay to occur after modifying a control
SendMode, Input ; The method for sending keystrokes and mouse clicks
ListLines, Off ; Disable history of executed script lines
CoordMode, Mouse, Client ; Mouse coordinates relative to active window client
OnExit("OnUnload") ; Run function when exiting the script
SetTimer, MenuItemCheck, 250 ; Toggle menu items
SetTimer, EmptyMem, 180000 ; 3 minutes
EmptyMem() ; Empty memory
return ; End automatic execution
; ==============================================================================
; Functions ====================================================================
OnLoad() {
Global ; Assume-global mode
Static Init := OnLoad() ; Call function
App_Name := "Bulldozer"
App_Version := "18"
App_Date := "2019-05-09"
GuiWidth := 640 ; Gui Width
GuiHeight := 512 ; Gui Height
GuiBGCol := "FFFFFF" ; Gui Background Color
DPI := (A_ScreenDPI / 96) ; Calculate DPI scaling
; Read values from INI file
IniRead, TitlebarProgress, Bulldozer.ini, Options, TitlebarProgress, 0
IniRead, TaskbarProgress, Bulldozer.ini, Options, TaskbarProgress, 0
IniRead, BackgroundColor, Bulldozer.ini, Options, BackgroundColor, 808000 ; Olive
IniRead, Theme, Bulldozer.ini, Options, Theme, Color
IniRead, UnlimitedUndo, Bulldozer.ini, Options, UnlimitedUndo, 0
IniRead, Sound, Bulldozer.ini, Options, Sound, 0
IniRead, LevelNumber, Bulldozer.ini, Options, LevelNumber, 0 ; On-screen level number display
IniRead, MouseMovement, Bulldozer.ini, Options, MouseMovement, 0
IniRead, Solved, Bulldozer.ini, Options, Solved, U180 ; Solved level data
IniRead, LastLevel, Bulldozer.ini, Options, LastLevel, 1 ; Last played level
IniRead, LayeredTiles, Bulldozer.ini, Options, LayeredTiles, 0 ; Layered tiles
; INI validation
TitlebarProgress := (RegExMatch(TitlebarProgress, "(0|1)") ? TitlebarProgress : 0)
TaskbarProgress := (RegExMatch(TaskbarProgress, "(0|1)") ? TaskbarProgress : 0)
BackgroundColor := (RegExMatch(BackgroundColor, "(^[A-Fa-f0-9]{6}$)") ? BackgroundColor : 808000)
UnlimitedUndo := (RegExMatch(UnlimitedUndo, "(0|1)") ? UnlimitedUndo : 0)
Sound := (RegExMatch(Sound, "(0|1)") ? Sound : 0)
LevelNumber := (RegExMatch(LevelNumber, "(0|1)") ? LevelNumber : 0)
MouseMovement := (RegExMatch(MouseMovement, "(0|1)") ? MouseMovement : 0)
Solved := (RegExMatch(Solved, "[^(S|U|0-9)]") ? U180 : Solved)
LastLevel := (RegExMatch(LastLevel, "[0-9]") && (LastLevel >= 1 && LastLevel <= 180) ? LastLevel : 1)
LayeredTiles := (RegExMatch(LayeredTiles, "(0|1)") ? LayeredTiles : 0)
UserColors := [] ; Initialize variable
Loop, 16 {
IniRead, UserColor%A_Index%, Bulldozer.ini, Options, UserColor%A_Index%, 000000
UserColors.Push("0x" UserColor%A_Index%)
}
Solved := StrSplit(RLE_Decode(Solved)) ; Expand run-length encoded string
; Overwrite solved level data if corrupted string
If (Solved.Length() <> 180) {
IniWrite, U180, Bulldozer.ini, Options, Solved ; Overwrite INI value
Solved := StrSplit(RLE_Decode("U180")) ; Expand run-length encoded string
}
; Level map data
Maps := [] ; Create array
Maps[1] := "8888888888888888888888888888888888888888AAAAAAAAAAAAAAAAAAAAA8A8A8888888888A8A8AA8A8A8889998888A8A8AA8A8A8889198888A8A8AA8A8A8889099998A8A8AA8A8A8999202198A8A8AA8A8A8910259998A8A8AA8A8A8999929888A8A8AA8A8A8888919888A8A8AA8A8A8888999888A8A8AA8A8A8888888888A8A8AAAAAAAAAAAAAAAAAAAAA8888888888888888888888888888888888888888"
Maps[2] := "88888888888888888888888888888888888888888888888888888888888881900000000000000008819000000000000009088090000000000020090880900200000000000008809000000500000009088090000000000000090880900000000000200908809002000000000009088000000000000000091880000000000000000918888888888888888888888888888888888888888888888888888888888888"
Maps[3] := "8888888888888888888888888888888888888888888888888888888888888D0000000000000000D8880000000009000000888D0009999999000000D8880003000009020000888D0009001059020000D8880009900009020000888D0000900009000000D8880000900009000990888D0000999299000901D888000000000000001188888888888888888888888888888888888888888888888888888888888888"
Maps[4] := "888888888888888888888888888888888888888888888888888888888888888B88999999998888B88B88889000000988B888888B8990CCCC298888B88B88890000C00988B888888B89020020598888B88B88890200C11988B888888B890000C1198888B88B88890000999988B888888B89000098888888B88B88899999988888B888888888888888888888888888888888888888888888888888888888888888"
Maps[5] := "8888888888888888888888888888888888888888A888888888888888888A8A8888999998888888A888A88895009888888A88888A889022989998A88888888890209891988888888888999099919888888888888990000198888888888889000900988888888A888900099998A88888A88889999988888A888A8888888888888888A8A888888888888888888A8888888888888888888888888888888888888888"
Maps[6] := "8888888888888888888888888888888888888888AAAAAAAAAAAAAAAAAAAAA88AAAAAAAAAAAAAA88AA88AAA9999999AAAA88AAAAAAA900000999AAAAAAAAAA9929990009AAAAAAAAAA9500200209AAAAAAAAAA9011902099AAAAAAAAAA991190009AAAAAAAAAAAA99999999AAAAAAA88AAAAAAAAAAAAAA88AA88AAAAAAAAAAAAAA88AAAAAAAAAAAAAAAAAAAAA8888888888888888888888888888888888888888"
Maps[7] := "8888888888888888888888888888888888888888FAFAF8888888888FAFAFAFAFA8888888888AFAFAFAFAF8899998888FAFAFAFAFA8890599988AFAFAFAFAF8890200988FAFAFAFAFA8999090998AFAFAFAFAF8919090098FAFAFAFAFA8912009098AFAFAFAFAF8910002098FAFAFAFAFA8999999998AFAFAFAFAF8888888888FAFAFAFAFA8888888888AFAFA8888888888888888888888888888888888888888"
Maps[8] := "8888888888888888888888888888888888888888888888888888888888888C88888888888888C888888C88888888888888C88C88899999999998C888888C99050900009988C88C88902011112009C888888C90029999020988C88C88900098890099C888888C99999889999888C88C88888888888888C888888C88888888888888C8888888888888888888888888888888888888888888888888888888888888"
Maps[9] := "8888888888888888888888888888888888888888888888888888888888888888A8888888888A8888888AF8889999888FA88888AFA8899009888AFA888AFAF8895209888FAFA88FAFA8899209988AFAF88AFAF8899020988FAFA888AFA8891200988AFA88888AF8891131988FA8888888A8899999988A888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
Maps[10] := "88888888888888888888888888888888888888888888888888888888888888E8888889999888E888888888888900988888888E8E88889920988E8E8888888899911098888888E8E8E890211098E8E8E8888888902905988888888E8E88902000988E8E888888889000999888888888E8889999988888E88888888888888888888888888888888888888888888888888888888888888888888888888888888888"
Maps[11] := "8888888888888888888888888888888888888888E888888888888888888EE888889999999888888EE889999000009888888EE889000199909888888EE889090900009988888EE889090202910988888EE889090030090988888EE889019202090988888EE889900009090999888EE888909991050009888EE888900000990009888EE888999999999999888E8888888888888888888888888888888888888888"
Maps[12] := "8888888888888888888888888888888888888888F888888888888888888F800999999000999000188009000092000200111880290500000999991118800900999200900999C88029909E902090201C888000909E92000001C8888202909E9020901C888880000099920001C888888129000000009C888888801900000000C8888888F888888888888888888F8888888888888888888888888888888888888888"
Maps[13] := "8888888888888888888888888888888888888888888888888888888888888888999998F8F8F8F8F88C889000988F8F8F8F88888892009888F8F8F8888899900299888F8F888888900202098888F888889990C0CC0988899999989000C0CC09999900119890200200000000001198999990CCC0959900119888889000009999999998888899999998888888888888888888888888888888888888888888888888"
Maps[14] := "8888888888888888888888888888888888888888E888888888888888888EE899888888888888998EE899888899999998998EE899888990090598998EE899888900090098998EE899888920202098998EE899888902990098998EE899899902090998998EE899891111100988998EE899899999999988998EE899888888888888998EE888888888888888888E8888888888888888888888888888888888888888"
Maps[15] := "88888888888888888888888888888888888888888888888888888888888888AAA8888999999998888A888A888900000598888A888A8889029209988888AAA888890200298888888888888992020988888999999999020909998889111100990200200988899111000020020009888911110099999999998889999999988888888888888888888888888888888888888888888888888888888888888888888888"
Maps[16] := "8888888888888888888888888888888888888888888899999988999888888E8891100989959988E888E89110099900098E888888911000002209888888889110090C0209888888889119990C0209888888889999020C2009888888888889002C020988888888888902002009888888E88889009900098E888E8888899999999988E8888888888888888888888888888888888888888888888888888888888888"
Maps[17] := "8888888888888888888888888888888888888888888888888899999888888B889999999000998B88888990905990220988888B890000200000098B88888900200999000988888B899909999929998B88888902009990119888888B890202020111988B88888900009991119888888B890220989111988B8888890099989999988888888999988888888888888888888888888888888888888888888888888888"
Maps[18] := "88888888888888888888888888888888888888888888888888888888888888888888888888888888888A89999999988F888888AF89000050988AF8888AFA89021100998FAF888FAF899911C0098AFA888AFA88899222098FAF8888AF88889000098AF888888A88889999998F88888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
Maps[19] := "88888888888888888888888888888888888888888888899999999998888888F899190000009999F8888991190200209009888889111909902090098888F911111009220009F8888991111200009209888889999099999990098888F900020000000099F8888900209002902099888889029990209022098888F900059009900009F8888999999999999999888888888888888888888888888888888888888888"
Maps[20] := "88888888888888888888888888888888888888888888888888888888888888E888888888888E88888888E899998888888E8888E888900999888E88888888E895000999888E8888E88890C200198E88888888E890202119888E8888E888902019998E88888888E890099988888E8888E888999988888E88888888E888888888888E88888888888888888888888888888888888888888888888888888888888888"
Maps[21] := "8888888888888888888888888888888888888888F888888888888888888F8999999999999999999889C1C1C1C1C1C1C1C1988912020202020200009889C0C0C0C0C0C0C0C0988912000002000000029889C0C0C0C0C0C0C0C0988910000000020002009889C0C0C0C0C0C0C0C0988910000000000200059889999999999999999998F888888888888888888F8888888888888888888888888888888888888888"
Maps[22] := "8888888888888888888888888888888888888888888899999999988888888EE890000000988A8A888EE8900200029888E888888899990000988A8A88888888890200998888888888999900020988888888889110209909999888888891100299000098888AA891100002000098888AA8919992999095988888889198900000999888888899989999999888888888888888888888888888888888888888888888"
Maps[23] := "8888888888888888888888888888888888888888888888888888888888888B8889999999888888B88888890005098888888888B889020C0999988B88888889C02C21119888888B8B890002011198B8B88888890CC0209998888888B88900002098888B88888889990000988888888B8888899999988888B888888888888888888888888888888888888888888888888888888888888888888888888888888888"
Maps[24] := "88888888888888888888888888888888888888889999999999999999998890000000000000000998902C00020CC002000098900002CCC0000C02209891CCC000002020CC00999111C00C00C0000C2009911CC22CCCC0200C00099111C00000020CC009999111200CCC00C00009099911002C00CC000CC50989919000000000000009889999999999999999998888888888888888888888888888888888888888"
Maps[25] := "88888888888888888888888888888888888888889999999999988899999990000090009889900009990200900099990020099999022000911900900990020020099119999099902000999111100022099009290001111909020990900902011999290009909000209119000990099000290099990009029990900900005900000098999999999999999999988888888888888888888888888888888888888888"
Maps[26] := "88888888888888888888888888888888888888889999999999999999999990009000090009000959902000000200020009099909991199099900000990009111192900299909902091111900200202099000911119090902020990009911990009290009992990000990090092999000200200000900900990009000090009000009999999999999999999998888888888888888888888888888888888888888"
Maps[27] := "88888888888888888888888888888888888888888888888888888888888888899999999999988D88888911009000009998888889110090200200988888891100929999009888888911000050990098888889110090900209988888899999909920209888888889020020202098888D8889000090000098888DD88999999999999888888888888888888888888888888888888888888888888888888888888888"
Maps[28] := "88888888888888888888888888888888888888889999999999999999999990090099000090005999990000200009029990099929020992902020000990002900002000000999909900020999009111199090290909090911119990000202090091111998992099900209111199889009020000000099988E900000090900009888E899999999999999988E8E8888888888888888888888888888888888888888"
Maps[29] := "8888888888888888888888888888888888888888999999999999999999999500000999000900900990909009002002000009999990000090202929099191190000992020000991111100002000900099911111000099929929999191190000200009000999999000009009200209DDDD9009002000020209DDDD9009009009009009DDDD99999999999999998888888888888888888888888888888888888888"
Maps[30] := "88888888888888888888888888888888888888889999999999999999999999111000990900009009911110000000002099099111190909299920000991119000090000000909991900920900000299099009009020209990020990000020020900909909990909909229029009099009000202090000009990000900000900900059999999999999999999998888888888888888888888888888888888888888"
Maps[31] := "8888888888888888888888888888888888888888C99999999999999C99999000900959099009999990C090020000200C999990C0000CCCCCC0200C9C9000C00C1111C0022009992CC2CC1111C00000099000000C1111CC2CC2999002200C1111C000000990200200C00C00CCC009C999C002000200002009999990900009009000C99999C9999999999999998888888888888888888888888888888888888888"
Maps[32] := "88888888888888888888888888888888888888889999999A9999A99C99999000009A9119A9000009902200999119990025099009099111111900200C900000911111190020099999009991199C99C20990002220911900009009C029000200200220920990090099020099009009902000020CC020000209900900990000990090099999C9999999999999998888888888888888888888888888888888888888"
Maps[33] := "8888888888888888888888888888888888888888999999999999999999999000090090900900C00990590C09902000200099999909000090090200099000090990C20C909C0990000002000200020009911C9922C9029C20990991191900902000209009911119022000C9209C999111190099999000000991119990000000000009999999999999999999998888888888888888888888888888888888888888"
Maps[34] := "88888888888888888888888888888888888888889C9999C9999999C99C99C1111C0000000C00C0099111190C020020000009911110C90029090292099111C000200029002009911C99900C020002200C90000009C9C099C909C9900000000C000C000009909C000900020902020990C900002099020020099000005C00000C000C0C999999C99999C999C9C98888888888888888888888888888888888888888"
Maps[35] := "888888888888888888888888888888888888888899999999999999999999911119E9000000000009911119E9990900929099911119E9000920020009911119E9000020092299990099E902900920200999009EE9002002009009950099992999299020099900000000900900200999000999009002009999999999E9009009000009999999999999999999998888888888888888888888888888888888888888"
Maps[36] := "8888888888888888888888888888888888888888AFFFFFAFFFFFFAFFFFFAF00000F000005F111AFFF00000F000000AA111AFF0A0A0AA2AA0AA01111FF00020F000222001111FAFA2AFA02200AFA0AA1FF00000200A0000F0FFFAF00200A00AFA00A0A00FAA0A2AA000020022000FF00020AA000A00A0A00FF00000F0000F00F0000FAFFFFFAFFFFAFFAFFFFA8888888888888888888888888888888888888888"
Maps[37] := "8888888888888888888888888888888888888888C99999C99C99C999999C9000009009111C50000990900000001111C000099002009000C1111C000990992999909C1111C009902000200900C11190099022090009000C022009C9900222900022002009902009009000090290099000290090000000200990090000900009009009C99C9999C9999C99C99C8888888888888888888888888888888888888888"
Maps[38] := "8888888888888888888888888888888888888888999999C999C999999999C500000C000C000000099C09C909C009C99090C990000C0900220000000C9009090C0209020990C990000020C009220C000C9009C900C0000009C0C991191C020C002090000C9119190020C09902200991111C90002200200909911111C900000000C00999999999999999999C998888888888888888888888888888888888888888"
Maps[39] := "8888888888888888888888888888888888888888B888999899999999999B88889599919911199009888992001191119000098899000011111190020989900209111119909099890022909999900202098902902000099002200989009009000090200209890002209990929900098902900000020200209989900009000090000998B899999999999999998B8888888888888888888888888888888888888888"
Maps[40] := "88888888888888888888888888888888888888889999999999999999999990090000009000900099902902020991112002099002009099111190200990990209911119000209902000091111990200099029900911190000000990002229929900999099909090090009009000099020900200990000000990000900009500000009999999999999999999998888888888888888888888888888888888888888"
Maps[41] := "88888888888888888888888888888888888888889999999999999999999990090090900009009009900020000002020000099909009299929900990990002000002009002009909992992900090200099090002020099999902990200220200959191119909000009009091911199099999999990911111990000000000009111119999999999999999999998888888888888888888888888888888888888888"
Maps[42] := "88888888888888888888888888888888888888889999999999999999999890090000090099000099902900020900000990099020020091190000020990202009111190009099902900911111199902099000900911119009200990200999911900090009990200099090902002998990200002952029000988990009000000090009888999999999999999998888888888888888888888888888888888888888"
Maps[43] := "888888888888888888888888888888888888888899999999999999999AAA90020001111900009999900000011110000000099090999999999900000990920009000000999119900200092299900091199020999020000000911990209000202090099119900900220902099000999599029002002000009A9900000009900000099AA99999999999999999AA8888888888888888888888888888888888888888"
Maps[44] := "8888888888888888888888888888888888888888CCCCCCCCCCCCCCCCCCCCC000000009000950900CC022009229090900990CC009020209220900000CC909009009090900900CC000990000000900000CC000902090009000900CC020920900090020911CC920900999900009111CC002000000000091111CC000900900000911111CCCCCCCCCCCCCCCCCCCCC8888888888888888888888888888888888888888"
Maps[45] := "88888888888888888888888888888888888888889999999999988899999990000090009889900009990200900099990020099999022000911900900990020020099119999099902000999111100022099009290001111909020990900902011999290009909000209119000990099000290099990009029990900900005900000098999999999999999999988888888888888888888888888888888888888888"
Maps[46] := "88888888888888888888888888888888888888889999999999999999999990009000900009000959900020020000090209099929029990900002290990090091999009202009900929111190090999099020091111199000090999200919111192202009900999999119909009099002000000000209990990009000900000000909999999999999999999998888888888888888888888888888888888888888"
Maps[47] := "8888888888888888888888888888888888888888DDDDDDDDDDDDDDDDDDDDD090909000959900090DD000000000000020000DD009929099999020909DD900009911111900900DD929929111119992920DD000909911111900909DD002000099119900900DD020900020002002220DD902002909009002000DD000990009009000000DDDDDDDDDDDDDDDDDDDDD8888888888888888888888888888888888888888"
Maps[48] := "888888888888888888888888888888888888888888888889999999999988888888890000000009888888888900002020098899999989020CCCCC098890000999990200CC29889000000020200000098890000000000990CC098890000995999990CC098890000999988890CC09989111198888889020009891111988888890000098999999888888999999988888888888888888888888888888888888888888"
Maps[49] := "88888888888888888888888888888888888888889999999999999888888890000000000098888888909990220000988888889000902002009888888890029999299999988888902099000000009999989002202000000001119899909902290000011198889099000900000111988890000009000001119888999599999999999998888999988888888888888888888888888888888888888888888888888888"
Maps[50] := "88888888888888888888888888888888888888888899999998888888888888900000999999999888889000009000090099888890200090002020098888900200900209900988889022009920200009888899090099099999998888990900990000111988889009200000001119888890002200000011198888900000995900111988889999999999999999888888888888888888888888888888888888888888"
Maps[51] := "88888888888888888888888888888888888888889999999999999999999990900000900000000009900000002009909990999999900990002002000999119900909020909009911110020000099290999111100299999000929999119090090009002009F9919090020002009059F9002002090009009999F9000000099999999FFFF999999999FFFFFFFFFF8888888888888888888888888888888888888888"
Maps[52] := "88888888888888888888888888888888888888888888888888888888888888A88A88A88A88A88A888888888999998888888888A88999005988888A888888890021099888888888A88900121098888A888888899903209888888888A88889000998888A888888888999998888888888A88A88A88A88A88A8888888888888888888888888888888888888888888888888888888888888888888888888888888888"
Maps[53] := "8888888888888888888888888888888888888888888888888889999888888BBBB99999990598EEE88BBB8900000200988EE88BB889000299029888E88B88899291119098888888888890211100988888888888909101909988888E8888900090920988B88EE88892002000098BB88EEE889009999999BBB88EEEE899998888888888888888888888888888888888888888888888888888888888888888888888"
Maps[54] := "88888888888888888888888888888888888888889999999999999999999999990090099999999999999900900911199999999990029009111009999999902092201110099999999002900911101999999990009029999999999999992000000020209999999900900220900099999999999990099225999999999999900000099999999999999999999999998888888888888888888888888888888888888888"
Maps[55] := "8888888888888888888888888888888888888888DDDD8888888888888888DEED8889999999988888DEED8889000910988888DDDD8899002111988888888888900209319888888888899099290998888888888900020020988888888889000900009888888888899999995098DDDD8888888888899998DEED8888888888888888DEED8888888888888888DDDD8888888888888888888888888888888888888888"
Maps[56] := "888888888888888888888888888888888888888888888888888888888888888E88888888888E8888888E88999999988E8888888E88900C00988E8888888E88902020988E8888888E88901310988E8888888E899C111C988E8888888E89002220988E8888888E89000500988E8888888E89999999988E8888888E88888888888E8888888888888888888888888888888888888888888888888888888888888888"
Maps[57] := "8888888888888888888888888888888888888888888888888899998888888899999999900998888889900200000020999998890009909900099111988909220202292991119889090005000900011198890029099922000111988902002200209911119889992000000099999998888900999999988888888B899998888888BBBBB8888888888888888888888888888888888888888888888888888888888888"
Maps[58] := "88888888888888888888888888888888888888889999999999999999999E9000059900000090009E9000099000020000209E900999111190909009999000911119090902000999909111900900000009E9009919000002000209E9002020999009090999E9020000000909020009E9990200290909090209EEE90000000009090099EEE9999999999999999E8888888888888888888888888888888888888888"
Maps[59] := "8888888888888888888888888888888888888888888888888888888888888C88888888888888C888888C88888888888888C88C88888899999988C888888C88999000098888C88C88899102990998C888888C89112020059888C88C88891102020998C888888C89999990098888C88C88888888999988C888888C88888888888888C8888888888888888888888888888888888888888888888888888888888888"
Maps[60] := "88888888888888888888888888888888888888889999AAAAAAAA999999999009999999999000005990290000900000999999900000099990009009AA999990000000009009AA900020000000009009999002999900900090000990C09009119299900C0990C092091190020022099000000911900900090990009009119009000909999999999999999999998888888888888888888888888888888888888888"
Maps[61] := "888888888888888888888888888888888888888888888BBBB8888888888888888888889998B8888888888999999198B8888888888910020098B8888888888990CCC29888888888888892CCC0998888888888B8906020198888888888B8919999998888888888B8999888888888888888888888BBBB88888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
Maps[62] := "88888888888888888888800000000000000000088000000000000000000882C09999999999990C0880C09999999999990C0881C09999999999990C0880C09991020999990C0880C09999990999990C0880C09999994099990C0880C09999999099990C0880C09999999099990C1880C09999999099990C0880C09999999299990C28800000000200010000088000000000010000000888888888888888888888"
Maps[63] := "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA888888888888888888888888888888888888888888899999999999999888888900000000000098888889009999999900988888890090000009009888888900900040090098888889099000000900988888890090000009909888888910200000020198888889999999999999988888888888888888888888BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
Maps[64] := "8888888888888888888888DDDDDDDDDDDDDDDD8888DEEEEEEEEEEEEEED8888DECCCCCCCCCCCCED8888DEC9999999999CED8888DEC9120000219CED8888DEC9090920909CED8888DEC9090910909CED8888DEC9090490909CED8888DEC9090290909CED8888DEC9120000219CED8888DEC9999999999CED8888DECCCCCCCCCCCCED8888DEEEEEEEEEEEEEED8888DDDDDDDDDDDDDDDD8888888888888888888888"
Maps[65] := "B888888888888888888BB888888888888888888BB899999999999999998BB890000099790011198BB890002200000011198BB890092000000011198BB899090099000011198BB899090099099999998BB890220099202000098BB890020090020990098BB890200090002020098BB890000090000900998BB890000099999999988BB899999998888888888BB888888888888888888BB888888888888888888B"
Maps[66] := "AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBB888888888888888888888899999988888888888888900009899998888888889099099900999999988890911100000200009888909919909099000098889001119090200229988890911190922200098888909090909020022988889000000090790009888899999999999999998888888888888888888888AAAAAAAAAAAAAAAAAAAABBBBBBBBBBBBBBBBBBBB"
Maps[67] := "FFFFFFFFFFFFFFFFFFFFF888888999999999998FF888888900000000098FF888888900002020098F99999989020CCCCC098F90000999990200CC298F9000000020200000098F9000000000000000098F90000000000990CC098F90000997999990CC098F90000999988890CC099F9111198888889020009F9111198888889000009F9999998888889999999FF888888888888888888FFFFFFFFFFFFFFFFFFFFF"
Maps[68] := "D88888888A888888888D8D8888888A88888888D888D89998999999988D88888D91989000009998888888919992CCC0959888888891100002000098888888911002CC000098888888911020CC09999888AAAA9999000209AAAAAA8888888902009988888888889999000098D88888888890020002988D8888888D900000009888D88888D89999999998888D888D8888888A88888888D8D88888888A888888888D"
Maps[69] := "CCCCCCCCCCCCCCCCCCCCC888888888888888888CC888888888899998888CC889999999990099988CC889002020000011988CC889000209900011988CC889000209900011988CC889000029900011988CC889000009900011988CC889990999999999988CC888902999599900988CC888900200000020988CC888902099990020988CC88890009AA90000988CC88899999AA99999988CCCCCCCCCCCCCCCCCCCCC"
Maps[70] := "EEEEEEEEEEEEEEEEEEEE88888888888BD888EEEE99999999999B8D888EEE90000900009B88D888EE90020900009B888D888E90200900009BB888D88E90020900209BBB888D8E99000200209BBBB888DEE9099900209BBBBBBBBB99020999299999999999902209000000000011199020090000000000111990000900000000001119999499000000000011198899999999999999999988888888888888888888"
Maps[71] := "DD8888888888888888DDDD8888888888888888DDDD8888888888999888DD999999999999949998DD911100000900000098DD9111000009000CC098DD9111000009220CC0999D9111000000002022009D9999900000000CC0209DDD889999992CCCC2009DDD888890020020C0009DDD888890000220CCC09DDD88889000000000009DDD88889999999999999DDD8888888888888888DDDD8888888888888888DD"
Maps[72] := "99999EEEEE999999999990009EEEEE900000000990C09999999020C0C00990C1100000000CC0020990C1CCCCCCCC00C0020990C1C020000002CCC209900000CCCCC020C000099991CCCC0CC002720009E90111C000C022290099E911110000C00209999EE91CCCC00CCCC00009EEE91100C00000CCCC09EE999900CCCCC0000009EE902002000C00099999EE90000009000099EEEEEE9999999999999EEEEEEE"
Maps[73] := "CCCCCCCCCCCCCCCCCCCCC11C0000C0000000000CC1200200C22002CC02CCC12C00CCC00CC0CC000CC00C020C00220002000CC0CCC00C0C00C200CCCCC00CC0C02000C40C000CC020000200CC1CC0020CC00C02C02C0200000CCCC00C00C00C000CCC000CC00CCCCCCCC0C000000CC00000000000C00C1C1CCC2CCCCCCCC2C000111CC00001300C0000CC1C1CC013111300020011111CCCCCCCCCCCCCCCCCCCCC"
Maps[74] := "88888888888888888888888888888888888CCCC8999998888888888CBBC8900099999999998CBBC8900090000000098CBBC8902200002020098CBBC8902099099999098CBBC8902099290002298CCCC89002990909990988888890000202099909999998900099000000001111989999990000000011119888888900000000111198888889959999999999988888889998888888888888888888888888888888"
Maps[75] := "888888888888888888888888888888888888888888BBBBBBB9999999998888BFFFFFB9009000098888BBBBBBB900220009888899999999002009998888911100990990995998889111009920020000988891110000220220009888911100990200020098889999999909999099988888888889000002098888888888890990000988888888888900009999888888888889999998888888888888888888888888"
Maps[76] := "89999999999999888888891111111199998888888911199990900999998889111900999000020988891112200000202009888900190020290200998889111909290002009888891909020002000098888910092999299992988889900900020200009888889009002520090098888890090999902002988888900900009990009888889009022098999998888890090000988888888888999999999888888888"
Maps[77] := "88888888888888888888889999999998999999988890099000989000009888900020009890999098889000200099902090988890299000000220009888900990009999000098889909999999999995988890299EE9000011999888900099990000119888889002200000001198888890209999000011988888900098890000119888889999988999999998888888888888888888888888888888888888888888"
Maps[78] := "BC8888888888888888CBBC9999999999999999CBBC9000000000911119CBBC9000020000011119CBBC9999909900911119CBBC9000020909990009CBBC9009900009000009CBBC9909002909099999CBBC8909020209090009CBBC8909002009000009CBBC8909299999999099CBBC8902520200002009CBBC8900200009990009CBBC8999900099899999CBBC8888999998888888CBBC8888888888888888CB"
Maps[79] := "EEEEEEEEEEEEEEEEEEEEEEEEEEEE99999999999EEEEEEEEE90009000009EE99999EE90000020209EE90009999902990C099EE902099000C09902009EE902006220C09922209EE990CCC000C09900009EE890C000CCC09999929EE990C00000200911119EE900CCC0990209111199E9020002090009112109E9009902090099111109E9999900099999911199EEEEE99999EEEE99999EEEEEEEEEEEEEEEEEEEEE"
Maps[80] := "FFFFFFFFFFFFFFFFFFFF8888888888888888888899999999999999999999900000900000091119E99000009005000991119990909099299099011119900020900022200111199992999022009990991990000020090000909999900200900999009090099909299000020022000990002099000900909009900000900009009000099999999999999999999988888888888888888888FFFFFFFFFFFFFFFFFFFF"
Maps[81] := "DDD9999999999DDDDDDDD889000000009999888DD889099999909009988DD889090202020020988DD889000000092000988DD889992002290099988DD888890099090299888DD888899290002079888DD888889002020999888DD888889090002009888DD888889099000909888DD888899009999909888DD888890000000009888DD888891111111999888DD888891111111988888DDDDDD999999999DDDDDD"
Maps[82] := "99999999EEE999999999999990099999009999999888900025200098888999999202020202999999988990202020209988899999020202020209999998890000000000098889999999999099999999999888888900098888888999999999000999999999988889313131398888899999991313131999999998888931313139888889999999131313199999999888893139313988888999999999999999999999"
Maps[83] := "8888888888888888888888888888888888888888999999999999999999999090000090000000000990000000200C9099C09999999009C000200200099911990090C020C090099111100200000992C0999111100299C990009299991190C009000C002009E991C090020002009079E9002002090009009999E9000000099999999DDDE999999999DDDDDDDDDD8888888888888888888888888888888888888888"
Maps[84] := "CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC00000CCC11CCC00000CC02200CCC11CCC00260CC00C0CC111111C00200CC00000C111111C00200CCCCC00CCC11CCCCCC20CC0002220C11C0000C00CC02C000200200220C20CC00C00CC0200CC00C00CC02000020CC02000020CC00C00CC0000CC00C00CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCC"
Maps[85] := "889999998999999BBBBB889000098900009BBBBB899099099902009BBBBB890220000022009BBBBB8900209909909099999B8909020200009090009B89020020090990900099890090920009909000098999909009999090990988900202990090000009889020200000909099998990990999009001111989000909990009011119890002290004001111198900090000909991111989999999999998999999"
Maps[86] := "DDDDDDDDDDDDDDDDDDDD8888888888888888888899999999999999999999900900009000090090099000290090000000200990200900900009029009999002229000220020099022090009000902200990200020090091119009909929999099111190099002009000911119000990900000001111900509900000900911190000099999999999999999999988888888888888888888DDDDDDDDDDDDDDDDDDDD"
Maps[87] := "888888888888888888888888888888888888888899999999999999999999900090091190090009099000000911900900090990909209119002002209909090091192999009099002999900900090000990002000000000900999999990000000009009EE900000099990009009EE9029000090000099999990099999999990000079999988888888999999998888888888888888888888888888888888888888"
Maps[88] := "88999988888888888888899009988888888888888902009999999999999989000090111111111119899202901CCCCCCC0C19899000990CCCCCCC0C19897222000000000000198900009909999999900989999902200098889999888902000020988888888889020022099888888888890022009988ABAB8888890000099888BABA8888899000998888ABAB8888889999988888BABA8888888888888888888888"
Maps[89] := "89898989898989898989989898989898989898989999999999999989999990099000000009991119900000099999009111199999029900022091111990090200020900919119909902992099229991199000200020002000000990990990290990900009900020900900009099999900020002099090970990090090090900900009999999999999999999998989898989898989898998989898989898989898"
Maps[90] := "DDDDDDDDDDDDDDDDDDDD88888888888888888888CCCCCCCCCCCCCCCCCCCCC000000009000900960CC022009229090900990CC009020209220900000CC909009009090900900CC000990000000900000CC000902090009000900CC020920900090020911CC920900999900009111CC002000000000091111CC000900900000911111CCCCCCCCCCCCCCCCCCCCC88888888888888888888DDDDDDDDDDDDDDDDDDDD"
Maps[91] := "888888888888888888888DDDD8899998DDDDDDD88DDD88990098DDDDDDD88DD889900098DDDDDDD88D889902209888DDDDD88D899020029998888DD88D8900020000999988888D8900999990900999888D8902111190900009888D8909111102000909888D890911319090200988888909990999900999888899299002709999888888900000209998888DD888900099009888DDDDD888999999999888888888"
Maps[92] := "888888888888888888888888888888888888888888889999999999999998888890900009009000999999900200020000200990200200C00C00CCC0099002200C1111C00000099000000C1111CC2CC299992CC2CC1111C00000099000C00C1111C002200990C0000CCCCCC020099990C0900200002009998890009009094990098888999999999999999988888888888888888888888888888888888888888888"
Maps[93] := "88888888888888888888BBBBBBBBBBBBBBBBBBBB9999999999999999999B9090090000790000009B900029009999000902999090002091190009900990900902011999290009900929000111190902099020009991111000220990020020099119999099999902200091190090099902009000999900200990000090009BB990000999999999999BBB999999BBBBBBBBBBBBBBBBBBBB88888888888888888888"
Maps[94] := "99998888888888888888900999999999999998A8900900011911111198A8900909099999011198A899290000111111119888900099299999900999989020900000999999409899209020009999990098900209222990000000989000000C0000C2C299989099990C2222200009889090000200000C00098890900099000000009998909999992999999020989000000009EEEE9000989999999999EEEE999998"
Maps[95] := "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB9999999999999999999B9009000090990001119990990200000000011119900002999290909111199090000000900009111990992000009029009199902009990202090090099099090090200200000990900920922909909099990000009020200090099700090090000090000999999999999999999999BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
Maps[96] := "AAAAAAAAAAAAAAAAAAAA8888888888888888888899999999999999999999911119000000090090099111190C020020000009911110CC00290902C2099111900020002900200991199990090200022009900000099990999909999000000009000900000990CC000900020902020990CC000020CC02002009900000790000090009099999999999999999999988888888888888888888AAAAAAAAAAAAAAAAAAAA"
Maps[97] := "888888888888888888888888888888888888888888999999999999999999899190000000000000099911002C00CC000CC6099111200CCC00C00009099111C00000020CC00999911CC22CCCC0200C00099111C00C00C0000C200991CCC000002020CC0099900002CCC0000C022098902C00020CC00200009890000000000000000998999999999999999999888888888888888888888888888888888888888888"
Maps[98] := "8888888888888888888888888888888888888888999999999999999999999490009000900009000990900020002000000209900000CCC0CC11CCC09990CCC200C2C1111C00099020200200C1111C020990202090C0C1111C00099000C29000CC11CC0009992C00900CC0000CC299900C009000002002000990000090009000090009999999999999999999998888888888888888888888888888888888888888"
Maps[99] := "88888888888888888888DDDDDDDDDDDDDDDDDDDD9999999999999999999B9000009900000090009B9050099000020000209B900999111190909009999000911119090902000999909111900900000009A9009919000002000209A9002020999009090999A9020000000909020009A9990200290909090209AAA90000000009090099AAA9999999999999999EFFFFFFFFFFFFFFFFFFFF88888888888888888888"
Maps[100] := "BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB999999999999999999999400000900090000000999099909900999909099900009090022000000099009090902090209909990000020900922090009900999009000000990999119190209002090000991191900209099022009911119900022002009099111119900000000900999999999999999999999BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB"
Maps[101] := "EEEEEEEEEEEEEEEEEEEE8888888888888888888899999999999999999998900900000090009000999029020209911120020990020090991111902009909902099111190002099020000911119902000990299009111900000009900022299299009990999090900900090090000990209002009900000009900009000096000000099999999999999999999988888888888888888888EEEEEEEEEEEEEEEEEEEE"
Maps[102] := "888888888888AAAAAAAA888888888888A8888888999999999999999999999609009090000900900990002000000202000009990C00929C929900C90990002000002009002009909C929C29000902000990C00020200999999029902002202009A9191119999000009009A9191119889999999999A9111119888888888888A9111119AAAAAAAAAAAAA99999998888888888888888888888888888888888888888"
Maps[103] := "9999999999999998888891111111111001999988911111111112219009889999999999920C00099890000002002001002098900C2CC000C0020C00989000000C000CC00C09989002C00C0CC00CCC09989020C2CCC0000C8C09989990020C00C00CCC0998999000020CC0C00C0998890200C002002020009889002002C22200900098890090020000009999988905990090090098888889999999999999988888"
Maps[104] := "EEEEEEEEEEEEEEEEEEEE888888888888888888888CCCCCCCCCCCCCCCCC88CC0000000CC000C00CC8C5CC02C00200200000C8C00C00220C020CC000CCC020C0002020C00CC11CC020CCC020002000C11CC002000C22CCC000C11CC0C2000C000000CCC11CC0C0CCCCCCCCCC00000CC000000111100000000CC0000001111C0000CCCCCCCCCCCCCCCCCCCCC88888888888888888888888EEEEEEEEEEEEEEEEEEEE"
Maps[105] := "888888899998888888888FFFF8890099999888888FFFF889200000998888888889990CC0020998888888890020C0202698888888892000CC099998888888890202C1111988888888992000C1111988888888990220011119888888889000209011198888888890020299999988888888999000988888888888888999029888888888888888890098888FFFF8888888899998888FFFF888888888888888888888"
Maps[106] := "8888999999999888888888889111100099888888888891C1C00209988888888991111C0C07998888888901111C00C0099888888900000C20CC209888888990CCC002000098888888920020202C009888888890C002020CC098888888900CCC00CC009888888890000CC0CC099888888890020C002009888888889992020009998888888888900999998888888888889999888888888888888888888888888888"
Maps[107] := "8888888888888888888888888899999999888888899999900000099998888970002020C90000988889920202C29C0C9098888990220091111110999889000900C111111000988900200291111110C09889020C22011111129098899020029C909C900098889020020020020099988890200200200200988888999999000999999888888888899999888888888BBBBB88888888BBBBB888888888888888888888"
Maps[108] := "8888888888888888888889999988AAAAAAAAAAA889000998888888888888890200999999999888888990C0900000009999998990C0002C29400900098900C0000002090002098900CCC09999999990998900CC0113111110909E8990CC031311313090998902CC099999990992098900200020020000200989009000900090009009899999999999999999998888888888888888888888888888888888888888"
Maps[109] := "99999999999999999999C9C9C9C9C9C9C9C9C9C9CCCCCCCCCCCCCCCCCCCCC000C000C0000C000C0CC000200200000C020C0CCC2C02CCC0C000022C0CC00C00C1CCC00C20200CC00C2C1111C00C0CCC0CC0200C11111CC0000C0CCC200C1C1111C220200CC00CCCCCC11CC0C00C0CC00200000000020CCC0CC000C000C00000000C5CCCCCCCCCCCCCCCCCCCCC9C9C9C9C9C9C9C9C9C9C99999999999999999999"
Maps[110] := "EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE9999999999999999EEEE9499919911199009EEE99200119111900009EE990000111111900209E9900209111119909099E9002290999990020209E9029020000990022009E9009009000090200209E9000220999092990009E9029000000202002099E990000900009000099EEE9999999999999999EEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEEE"
Maps[111] := "888888888888888888888CCCCCCCCCCCC89999988C8888888888889000988C8888889999999090988C8899999952000000988C8890009990299020988888902000020999909889999029009099A990988900000029909999009989099099090020092009890911190900000000098900111009990099999989091119098999988888890909990988888888C889000000098CCCCCCCC889999999998888888888"
Maps[112] := "888888888889999988888DDDDDD88889111988A88DDDDDD88899111988A88DD888899991111988A88DD899991111119999888DD890000011119009888DD89029990099900998888890090092902020988999909920020000209889002220009090090098890000020290992009988900902020900200298889999000026209200988888890000900990099888888999999999900988888888888888889999888"
Maps[113] := "8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D999999999999999999999000000900900099000990002009009092002099902220020002000902099009009911990000200999090091111199090009902929991111192992999009009111119900009999090209999909299009900002000000000000099090009949000909090999999999999999999999D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8D8"
Maps[114] := "E8888888888888888888E89998888888888CCCC8E89099888899998888C8E8900999999009998888E8900090202202099988E8900207020000200988E8902090920020000988E8900990909990999988E8909900009002009888E89991110990202098C8E89911119900020098C8E89111199020029998C8E89111999002009888C8E891119F9009999888C8E899999F99998888CCC8E8888888888888888888"
Maps[115] := "AA999998888888888888AA900099999988999998AA902020200999900098A9900CC0CC0990002098A9020020000020200098990000099099002099989022999990999990988890000099709E999299889900209992999002098889990099900090020988888902200090202209888889009900090000098888899991011999999988888891111111119888888888911111111198888888889999999999988888"
Maps[116] := "899999999999DFDFDFDF891111110009999999998911111100090099000989119990200002000009891110202090009900098911192999990000900989990000900092009209888900220202002990098889002000929209920988899909909000099009888890020209909999998888900002002009888888889900090900098888888889999959999988888888888889998888888888888888888888888888"
Maps[117] := "99999999999999999999999999999900099999999999999902200900009999999999000209222099999009992020290200999990000000900020009999909999909009992099900100099020020009999991CC099909999909999111100900209902009991110C090220990200999111100920220000009991111997020099220099911119900000990009999111199999999999999999999999999999999999"
Maps[118] := "CD8989999999999998F88FE8B9000000000099ADB8A98900C002202009E9888F892002C00C0079CB9CB8990C00C020C09988A88F9000200200C098EC89ED9000C02000C09DA8D8C8900202000000989FCBA8900000CC00209CB8888890000CC022C098E8F9999992200090009888E91111900999999998FDC91C1110998B88D898898911110009F88E8C8B8AA9111100098C8B8888AE89999999998D88F8E88D"
Maps[119] := "88888888888888888888888888888888888888889999999999999E9999999000000000009E9111199909290090999E9111199000200290009E9111199922900200009E9111199002029009209EE900999009002002009EE9009990020992999299990069900200900900000000999999002009009990009E9000009009009E99999E9999999999999EEEEEEE8888888888888888888888888888888888888888"
Maps[120] := "888888888888888888888FFFFFFFFFFFFFFFFFF88FFFF88888888FFFFFF88FFF88999999888888888888899060099999998899999902CC200002098890020020000022020988902CC00C0CCC0CC009889000020C000020009988992CC02CC2900000988890020200209999999998900C0900C0091111119890000900200911111198902C090CC200111119989900090000900011198889999999999999999988"
Maps[121] := "88888888888888888888888888888888888888888888899999999998888888888888888888988888888889999999989888888888891000009898888888888999020098988888888888890000989888888888898907009888888888888989002099988888888889890000019888888888898999999998888888888988888888888888888889999999999888888888888888888888888888888888888888888888"
Maps[122] := "88888888888888888888888AAA8888888AAAA888888A88888888888AA888888A89999999998AA888888889100000098888888888899990CC0998888888888900000020988888888889000040009888888888890200000098888888888990CC099998888888888890000010988888888AA89999999998A888888AA88888888888A888888AAAA8888888AAA8888888888888888888888888888888888888888888"
Maps[123] := "8888888888888888888888888888888888888888888888888888888888888888899999999999888888888910900000098888888889009000C009888888888930900000298888888889000070000988888888892000009039888888888900C00090098888888889000000901988888888899999999999888888888888888888888888888888888888888888888888888888888888888888888888888888888888"
Maps[124] := "8888888DDD88888888888888888DDD88888888888888888DDD8888888888888888888888888888888AAAA8899999888888888AAAA8896009888888888AAAA8890229998888888AAAA8891210198BBBB8888888899900098BBBB8888888888900098BBBB8888888888999998BBBB88888888888888888888888888888888FFF88888888888888888FFF88888888888888888FFF88888888888888888888888888"
Maps[125] := "88888888888888888888888888888888888888888888889999999998888888888890000000988888888888900CCC009888888888889001010098888888888890001000988888888888999000999888888888888890C0988888888888888892229888888888888888907098888888888B888899999888B888888B888888888888B888888B888888888888B88888BBB8888888888BBB8888888888888888888888"
Maps[126] := "888888888888888888888888BBB88B88888888B888B888BBBB88BBBB888888B888888888888888888888899999999888888888888900000099888B8888BB8901909109888B88888B8900901009888B88888B8902220009888B88888B8900040099888BB8888B8999999998888BB8888B8888888888888888888BBB888888888B88888888B88888BBBBBB88888B88888888B88888888888888888888888888888"
Maps[127] := "88888888888888888888888888888888888888888AAA899999999998AAA88AAA890243101098AAA88AAA890299209098AAA88AAA890000000098AAA88AAA899902909998AAA88AAA888910909888AAA8888888890000988888888FFF888900009888FFF88FFF888999999888FFF88FFF888888888888FFF88FFF888AAAAAA888FFF88FFF888AAAAAA888FFF88FFF888AAAAAA888FFF888888888888888888888"
Maps[128] := "FAFAFAFAFAFAFAFAFAFAAFAFAFAFAFAFAFAFAFAFFAFAFAFAFAFAFAFAFAFAAFAFA999999999AFAFAFFAFAF900901209FAFAFAAFAFA900009909AFAFAFFAFAF900000249FAFAFAAFAFA990902099AFAFAFFAFAFA9190909AFAFAFAAFAFAF9100009FAFAFAFFAFAFA9000999AFAFAFAAFAFAF99999FAFAFAFAFFAFAFAFAFAFAFAFAFAFAAFAFAFAFAFAFAFAFAFAFFAFAFAFAFAFAFAFAFAFAAFAFAFAFAFAFAFAFAFAF"
Maps[129] := "8889999999999999998888888888888888888888898889999999999988898988888888888888888989898999999999998989898989000000000989898989890022522009898989898901111111098989898989000000000989898989890C2C2C2C098989898989000000000989898989899999999999898989888888888888888889898889999999999988898888888888888888888888899999999999999988"
Maps[130] := "88988888898888889888888888888888888888888888888888889888888888889888888888888988888888999888889888888988899099998888888888888900100999888888888889009002098888888988890190990988889888888990220109888888888888900400098888888888889999999988888888888888888888888988889888888888888888888888888988889888888888888888888888888888"
Maps[131] := "8888888888888888888888988E8888B8888D888888888888888888888898888F888C8888888A88888D88899999999988888888888901000109888E888888890900990988888888888902200909888C8888B889420001098888888888899999000988888888A88888899999888B88888888888888888888888888888F8888888888888E88C888888888D888F88888888889888888A88888888888888888888888"
Maps[132] := "AAAAA8888888888AAAAAAA8888888888888888AAA888888888888888888AA888899999999999888AA888890000004009888A8888890001C22209888888888900000002098888888889000999010988888888890C09390C0988888888890109990009888888888900000000098888A888890000C10009888AA888890000000009888AA888899999999999888AAA8888888888888888AAAAAAA8888888888AAAAA"
Maps[133] := "888888888888888888888888888888888888888888F8AAAAAAAAAAAA8F8888F8A8888888888A8F8888F8A8999999998A8F8888F8A8910990098A8F8888F8A8900992098A8F8888F8A8900901098A8F8888F8A890000C098A8F8888F8A892CC02098A8F8888F8A8942113098A8F8888F8A8999999998A8F8888F8A8888888888A8F8888F8AAAAAAAAAAAA8F888888888888888888888888888888888888888888"
Maps[134] := "8888888888888888888888888888888EEEEEEEE88888889999888888888888888990099999999988899999000000000009988911099000CC0CC0009889110992C2202422C09889110000C0000000C0988911000000CCC2C0209889110099220000000098899999990000000099988888888999999900988888888888888889999888888888888888888888888EEEEEEE88888888888888888888888888888888"
Maps[135] := "8888888888888888888889988888888888888888899888888888888899888888899888888888998888888998999998888888888888889007988888888888889992C098888888888888900120988899888888889000199888998889988890200988888888899888910099888888888888889999988998888888888888888889988888888998888888888888888889988888888888888888888888888888888888"
Maps[136] := "88888888888888888888888E88999999888E8888888E88900009888E8888888E88902009888E8888888E88999009888E8888888E88889099988E8888888E88899000988E8888888E88890020988E8888888E88890000988E8888888E88899229988E8888888E88894200988E8888888E88892110988E8888888E88891111988E8888888E88899999988E88888888888888888888888888888888888888888888"
Maps[137] := "8888888888888888888889999989998999989998899888888888888899888988AA899999999899988998AA890210009888988898AA890CC2019889988998888900C0C19899988998899900C0C0988888899899000000009899988998900092CC20989988888890099411209898888998999999999998999889988888888888889998899999999889899889888899988999998999999888888888888888888888"
Maps[138] := "888888888888888888888BB88888888888888BB88BB88888888888888BB888888999999999988888888889000110009888888888890C0000C2988888888889000CC2C09888888888890C0CC0009888888888891C0200C1988888888889120990009888888888892099990098888888888949988990988888888889998888999888888BB88888888888888BB88BB88888888888888BB888888888888888888888"
Maps[139] := "888888888888888888888888888888888888888888EEEEEE8999998EE88888EEEEEE8940098EE88888EE88888922298EE88888EE8899990C098EE88888EE8990000C098EE88888EE8902C001098EE88888888930CC0C098EE888888889100C0C098EE888888889900001198EE888888888999999998EE888888888888888888EE88888EEEEEEEEEEEEEEE88888EEEEEEEEEEEEEEE88888888888888888888888"
Maps[140] := "8888888888888888888888889999999999998888888890000000009888888888909203900988A888888890002430988A888888889000120988A8A8888888901000988A8A8888888890910988A8A8888888889000988A8A88A8888888900988A8A88A8888888890988A8A88A8888888889988A8A88A88A8888888988A8A88A88A8888888888A8A88A88A8A8888888888888888888888888888888888888888888"
Maps[141] := "888888888888888888888AAAAAAA8888888888888A8888888888888888888A8888888888888888888A8888899999999888888A8889990000009888888A8889012013209888888A8889070CC000988888888889001102209888A8888889000000999888A8888889999999988888A8888888888888888888A8888888888888888888A8888888888888888888A8888888888888AAAAAAA888888888888888888888"
Maps[142] := "99999999999999999999999899888899989998899898998998898898998998988889988988988989989999999999989889999999990011009998899999989900991098998899998889029030989998999999890200249898889999998990000998988899998889999999999999999889998989998999999998999989898889988899988889898889889899999998998999999888898999999999999999999999"
Maps[143] := "8888888888888888888888AA88888AA88888AA8888AA88888AA88888AA8888888888888888888888888888999999998888888888889000000988888888888890C2000988888888AA8890205C1988AA8888AA88992C100988AA888888888900001988888888888889999999888888888888888888888888888888888888888888888888AA88888AA88888AA8888AA88888AA88888AA8888888888888888888888"
Maps[144] := "8C8C8C8C8C8C8C8C8C8CC8C8C8C8C8C8C8C8C8C88C8C8C8C8C8C8C8C8C8CC8C8C8C8C8C8C8C8C8C88C8C8C899999999C8C8CC8C8C99943110098C8C88C8C89090090919C8C8CC8C8C90022009098C8C88C8C89000020009C8C8CC8C8C99999090098C8C88C8C8C8C8999999C8C8CC8C8C8C8C8C8C8C8C8C88C8C8C8C8C8C8C8C8C8CC8C8C8C8C8C8C8C8C8C88C8C8C8C8C8C8C8C8C8CC8C8C8C8C8C8C8C8C8C8"
Maps[145] := "888888888E888888888888888888E8888888B8888D88888E8888888B888888D88888888888B88888888D8899999888888888888888900099888888888888889000099888888888888890C0249988D8888888889002C209888D8888C888990101098888D8888C88890091998888888888C889999998888888888888888888888F88888888A888888888F88888888A888888888F88888888A88888888888888888"
Maps[146] := "88888888B888888888888D88888A8888C8888A88888C888888E888889888F8888888888888888888888889999999999888888888890000900098888888B8890CC31CC0988D88888889010C0030988888898889003423209888888888890000000098F88888E8899999999998888888888888888888888888888888888888F8988B8888D888A88888888888888888888888C8888E888888888888888888888888"
Maps[147] := "8888888888888888888888999889999988899988889898891209888989888899988900098889998888888889909988888888889999990009999999888890099011160090198888920000C0C0C00029888891099020202090098888999999990099999988888888889909988888888899988899099889998888989888900098898988889998889021988999888888888899999888888888888888888888888888"
Maps[148] := "8888888888888888888888888888888888888888888888888888888888888AAAA8999999988AAAA88A88A8907000988A88A88A88A8902910988A88A88A88A8900020988A88A88A88A8900909988A88A88A88A8900919888A88A88A88A8900029888A88A88A88A8900109888A88A88AAAA8999999888AAAA888888888888888888888888888888888888888888888888888888888888888888888888888888888"
Maps[149] := "88888888888888888888888888B888888888888888888BB88888888888888888BBB8888BBBB88888888BBBB9999999B8888888888899000409B8888888888890203209B888888888889020900988888888888B9009900988888888888B9011109988888888888B9999999BBBB88888888BBBB8888BBB88888888888888888BB888888888888888888B8888888888888888888888888888888888888888888888"
Maps[150] := "88888888888888888888888888AAAA8888888888888888A88A8888AA88888A88A888888888A888888AAAA899999988A8888888888891019998AA88888888889190209888888888888890000098888888888888902920988888888AA88899007998888AA888A888899999888888A888A888888888888888A88AA88888888A88A88AA88888AAAA888AAAA888888888A88A88888888888888888888888888888888"
Maps[151] := "9999999999999999999990000002190000000009909999999909999999099098999999099998890990989000000000988909909890C2CCC020988909909890C1112204988909909890C111C0209889099098902111C200988909909899992CC020988909909888890000009889099098BA8999999998890990988888888888888909909999999999999999099000000000000000000999999999999999999999"
Maps[152] := "88888A8A88888AA888888AA88A8A8888A8888888888A88A888888AA888888AA8888888888888888888888899999988888AA88888899001099888A88888A88902290098888AA88A8A89102001988888888A8A890090909888888888888990127998888888888888999999888888888A8A8888888888888A888A8A8888AA888888A8A888A8888888A88888A8A888888888AA888888888888888888888888888888"
Maps[153] := "888888888888B88888888888888BB888BBB8888888BB8888B88888B8888888B88888BB88888888888BB8888999998888888888888899000998888BB888888890002098888B888888889100039888BB888888889192909888888888888890040098888888888888999999988888888888B88888888888888888BBB8B88888BB8BB88888B888BBB888B888B88888888888B88BB888BB8888888888888888888888"
Maps[154] := "88888888888889999999899999988888890000098999999899999910CC198999999890000002003989999998900999029009899999989009890090098888888890098999999988899999900988888888999910400009888888889001200900099999999990C0099900000000000990202019999990002C0999990009888891C002098889999989989001C2998988888889989100009088888888888899999990"
Maps[155] := "8888888888888888888888888EE8FFF8BB88888888888EE8FFF8BB8888888888888888888888888888BB89999999998EE88888BB89011002498EE8888888890092990988888888FF89900099998FF88888FF89039031098FF8888888890020000988888888EE89009000998BB88888EE89999999988BB8888888888888888888888888888BB8FFF8EE88888888888BB8FFF8EE88888888888888888888888888"
Maps[156] := "88888888888888888888888E888888888888E888888888888888888888888E8E8E88999999E8E8E888888888900009888888888E888890120988E88888888899999209888888888888900002198888888888889002C0198888888888889990CC19888888888E8890124C0988E888888888900000098888888E8E8E99999999E8E8E888888888888888888888888E888888888888E88888888888888888888888"
Maps[157] := "88888888888888888888888999999999999998888889999999999999988888888888888888888888888999999999999998888889999999999999988888899900142010099888888999029020200998888889990191039909988888899901000002099888888999999999999998888889999999999999988888888888888888888888888999999999999998888889999999999999988888888888888888888888"
Maps[158] := "888888888888888888888EE888888889988888888EE888CC888998888888888888CC88888888FF888888888888999988FF8888888888999009888888888888999002098888888888889060000988888888888890C12299888888888888910010988888888888889999999888888888888888888888BB8888888DD888888888BB8888888DD8888AA888888888888888888AA88888888888888888888888888888"
Maps[159] := "8888888888888B8888888C888D8888E8888C88D8888888888888888888888B88899999999988F888888889000000098888A888E889000000098888888888899990CC098888888888999000C009888E888F889002C000099888888888902022911198888888889000259101988888888899900999999888A8888888999988888888888C888888888888D8888888888888F888B8888888888A8888888888888888"
Maps[160] := "88888888888888888888888AAA888888888BBB88888AAA888888888BBB88888AAA888888888BBB88888888999988888888888888889069888888888888DDD89129888888888888DDD89009988888888888DDD890219999888888888888902000098888888999889901000988EEE88999888999999988EEE88999888888888888EEE8888888888FFF88888888888888888FFF88888888888888888FFF88888888"
Maps[161] := "888888888888888888888AA89999999998888FF88AA89111111199998FF88AA89111199990098FF88AA89991119002098FF88AA88892009090098FF88AA89990020002098FF88AA89020200202098FF88AA89090990220098FF88AA89092992002098FF88AA89090000999998FF88AA89000299988888FF88AA89990098888888FF88AA88940098FFFFFFFF88AA88999998FFFFFFFF888888888888888888888"
Maps[162] := "8888888888888888888888888CC899999998888888888888911111988CC88C8889999111119888888C8889409211999888888888890290009888888888CC890099299998888888888902200000988C8888888990CC0C20988C8888888900C00C00988888CC88890220CC009888888888890002CC20988888888C8902200009988888888C8900090009888CC8888889999999998C8888888888888888888C8888"
Maps[163] := "888D889999999998888888D8899888888899888888889988999998899888888998899000998898888899889900213998988888988991001210989888889899002321209898888898900036300098988888989021232009989888889890121001998898888898993120099889988888988990009988998888889988999998899888888889988888889988D888888899999999988D888888888888888888888888"
Maps[164] := "8888888888888888888888999999999999999998889888888888888888988898999999999999989888989000000000009898888890CCCC0CCCC098888899900000C0000099988890011332C2331100988890C00000000000C09888900C2CCCCCCC2C0098889900102060201009988899999999999999999888888888888888888888889999999999999999988888888888888888888888888888888888888888"
Maps[165] := "888888888B88888888888B88888888888888888888888B8888888888888888888889999998B888B88888888904009888888888888899229098B888888888889030919888888888B8889000919888888888888890000198888B88888888999921988888888888888890209888888888888888900098888888B88888889999988888888888B888888888B88888888888888888888888B8888888888B8888888888"
Maps[166] := "88888888888888A8888888A888A88888888888888888888889999988888888888888890009888888888889999900498888A888A889000000398888888888891900091988888888888900000909888888888889020099098A888888888999029009888888888888892090098888A88A888889001009888888888888899999998A8888888A88888888888888888888888A8888888888A8888888888888A8888888"
Maps[167] := "88888888888888888888888888888888888AAAA88888BBBBBBBBBB88AAA88888B888888888B88AA88888B8999999888B88A88888B8911109998B88888888B8904C20098B88888888B8902020098B88888888B8900090098B88888888B8999999998B88888888B8888888888B88888A88BBBBBBBBBBBB88888AA888888888888888888AAA88888888888888888AAAA88888888888888888888888888888888888"
Maps[168] := "88888888DDDD8888888888888888888888B8888888888B88888888B88888888BBBBB88888BBB888888888B88999988B88888D8888899900999B8888DD888889001010988888DD8888890C12C0988888DD888889420020988888DD8888B9990099988888D88888B88999988B888888888BBB88888BBBBB88888888B88888888B8888888888B888888888888888888888888888888888888888888DDDD88888888"
Maps[169] := "99999999999999999999999899888899989998899898998998898898998998988889988988988989989999999999989889999999990Y11009998899999989900991098998899998889029030989998999999890200249898889999998990000998988899998889999999999999999889998989998999999998999989898889988899988889898889889899999998998999999888898999999999999999999999"
Maps[170] := "89999899999998999988898898910101989889888988989101019898898889889890191098988988899998910001989999888888889111119888888888899999292999998888888900202020200988888889020202020209888888890020202020098888888900000400000988888889999909099999888888888890202098888888899998921212989999888988989101019898898889999899999998999988"
Maps[171] := "8888888888888888888888DDDDDD888DDDDDD88888D88888DDD88888D88888D8DDDD888DDDD8D88888D8D888888888D8D88888D8D899999988D8D88888D8D894300998D8D888888D88922200988D8888888D88910090988D888888D8D890001198D8D88888D8D899999998D8D88888D8D888888888D8D88888D8DDDD888DDDD8D88888D88888DDD88888D88888DDDDDD888DDDDDD88888888888888888888888"
Maps[172] := "AA8AA8FF8888FF8AA8AAAA8AA8FFFFFFFF8AA8AA88888888888888888888FF8FF8999999998FF8FFFF8FF8900090098FF8FFF888F8902091198F888FF8A8F8900221198F8A8FF8A8F89420C1198F8A8FF8A8F8900221198F8A8FF8A8F8902090098F8A8FF888F8900299998F888FFF8FF8900098888FF8FFFF8FF8999998888FF8FF88888888888888888888AA8AA8FFFFFFFF8AA8AAAA8AA8FF8888FF8AA8AA"
Maps[173] := "888888888888888888888A8A8A8888888888988888A8A8888888888888888A8A888889999888989888A888899900988888888A88889901029988988888888890091009888888888888902009098888888888889909100988888888888889620099888888888988890099988888A888888889999888888A888989888888888888A8A8888888888888888A8A8888898888888888A8A8A888888888888888888888"
Maps[174] := "8888888888888888888888B888888888888888888B8B88888888888888888B8888999999998888888B8B899000011988888888B88902090009888888888889002999198888888888894300000988888888888999900209888888888888889200998888888888888890199888888888888888999988AAAA888888888888888888A888888888888888888A888888888888888888AAAA8888888888888888888888"
Maps[175] := "88888888888888888888888888888888888888888888888888888888898888888899999988889988888888942119998999888888889022300989998888888899902C0989998888888889900109899988888888890200998999888888888900C198899988888888890010988999888888888999999889998888888888888888899988888888999999999999888888899999999999998888888888888888888888"
Maps[176] := "88889998888888888888899899999999999899988999988888888888999889998899999999989988899988999999999898888888889900001998998889998999110209989998888989902299999899988899899000999998899889998990C49988888998899889900099888888888999899999998888998888898999999989999988899988888888899998888899889999999989988888888888888888888888"
Maps[177] := "8888888888888888888888B888888888889999988B8B889999999999009888B88891190020000098888888911900020200988888889111122C2C0998888999911110000209888889021CCC3999999988899902CC001988888888890020200C1999888888890020002C100988888889904022201C0988888888902000291009888B888899999009999988B8B888888999998888888B8888888888888888888888"
Maps[178] := "888999999999999999888889AAA9EEEEE9AAA9888889A99999999999A9888889A9B9009009B9A988888999990000099999888889E90032C03009E9888889E90003132009E9888889E990C171C099E9888889E90023130009E9888889E90030C23009E988888999990000099999888889A9B9009009B9A9888889A99999999999A9888889AAA9EEEEE9AAA9888889999999999999998888888888888888888888"
Maps[179] := "A888888889999888888A888888899900998888888888889902020998888888888990200120998888888899021C1012099888888990212101012099888899021012121212098888902121212121C6299888900010100010120098889920C1212121212098888902121212101009988889902101012120998888889902101C120998888888899021002099888888888899020209988888A888888990099988888A"
Maps[180] := "88888888888888888888888888888888888888888999999999999999999889888888888888888898898999999999999998988989420021103120989889890200031213009898898990202110312098888888900203121300998988989020211031200989889890020312130009898898999999999999998988988888888888888889889999999999999999998888888888888888888888888888888888888888"
; Theme data
Themes := [] ; Create array
Themes["Color"] := "iVBORw0KGgoAAAANSUhEUgAAAeAAAAAgCAMAAAD9lVunAAAAHlBMVEVHcEz////AwMCAgIAAAAD/AAD//wCAgACAAAAAgIBYQi54AAAAAXRSTlMAQObYZgAACJRJREFUeAHEmAGa6yYMhCNpFrz3v3AfCGsEIXbS7fbNfqkDg4DyVyLuQ26lpcip9k2ly5/2Trxexf9lPSbhFLtu/J8LF6L9Iup+etFJltoirR0iJsrsl+M/9cU+9OczU6gL7L72f4DvHFFeCs22JkxTsft2kQBcVWvtB2KtwQO9kpmleO0d9q/jpYwctxx/s7/Zb1PqS183Pkk0dqIY6JkcV/69YDCoQqcPDIPZJZ4pVVFDYDdws4j4wc0HYupd0gG5T9F3QN03r7j9r6cJ4/Um/vSJnevTn4HtfQ+efdr0jX6AcN93BQWT9M7/AWAU5JFqiIeLqQrUEqrA6PYp/hfAHU18LAPWm3h1ka+tgC72N/Ptcy6+1gs/ShwBAqat2a17/7cBu8wyYDO43gGca9bmzpM5hybfYCPeRIzdTZ/Fd6tI9WgNuW9NsCH4N6GvNfjN8ff+yE4D0v6kf5Czt/tHl7rCp9z/DDBcK2B2q3pMI/v1R+2p6t1vAXZdAXb5HehPkpQtx4YjGyIN35DnqjHetQXgPuFSIqfP8KrrBLf+ebsqbOzMBztUZ+T+H3RfXY1x+FT2PwFsTf2pZvAHuyfAPv+HgG3W0g7AtoAPwHkUxy3x8iQzxs9LXe4HaTB9RsM4w86378V/+MmOqquDsShUPEmb3xynN3TEAYdmn4Bfa85g1KSc2C5V5yvSCKvmEn25iLwjDYlmjYMmX1JuKC7ekCwAT1K1uZOjF21eobUqMM87aa48Qw/0tvemQoK2aY0Mcr7S1QlC3T+1+g8KfUvYtFBw/SOKGWxWyhGAzXIGXy6iTfX1C6eINF+eclhY7LzgTnLCES86jagagNP6IkWjc9rPZn7JA+pJBTgnpk2fov9AA9v/0KCN+1fhNrrvfCXUCJ6+69l/AjwUrROwqwGkzNY7GCjHESkMzIA5rSsDrgHUT3tt82Tou6yJh7f6BkS855da/v084rkeS/S6H1Zaqoi6z//EAIgGYbez7+gq19cG0gu/zoKJAqpwP/j5wwkDAXjnB99ay5Nq7TAK8h1LKa8Akhx3fAecujvP/RpogOM1J+DUqhJtlrbZD0xqIjvfXY93dksdPkcUoRx16ETksChWliZh/rbmt9Vz6poHs6nJh51lyD99n+c3KLrfEnhwGyQ9hUHAz37wLV3u5Tcds7cAdxFwU0Hq7jsk37xOxX8BWH4E2LvLCri0rsgrwxXgMTsA76mcO/vuqX5z7x8C/hraA6a/ATwcIq6dH0mtgNcSvQJmd/9WiXcoANvLEt1FfLOfCq3I3jcE/gG4c2ujCJgJW9YM9jGElcV9Wc5flzGH6VO8JZyRbiqEqMeg+eS7Eh6A934CPND0MfsMNuN7Ln9EvQWYGTyv44BfvwDP/6ZVF3/N4EX1dPUEHNj4I2sf3y0SegG4jKjMN41nFOvzjNF92No/MljaU9B9AhQhwO4TMP0VcKAREl7vYCCXV+AC8HFs7mDnO63jgPcvnGyzFG50DklnZNnFGR8l2vERga/ABUwpe0s+KfN3M/28q2mUQdX/obOiRDf/IDlyPFii934CnJL7BIzmZVL5PZfdvGyD39F8doMX/byOLyL30qS6ApbtOxLdqUSXFTBH2JL/dG8U8/WYNavTO3Tymzl8GDQJ/NI3hu7vATb/TcDp5FfAGWAGvNzBDvjwBJ4zmICndRzwm/+r8iVCSBuy528wtQmw/FO8Gei2DcNANOIRVff/PzyA9skXljHTad04YIV3oe3sVTKpkwE4gTB/MD+bGpgwLP8mxXpg4zzVVBfpg7M22DflG6QeI3Q9haNqYJukI7iagkN/c4qW//nPcop+aJ+rI1in8M8ImcLzFJ2uo4BnMsinAqZejDECLvQ5M2AAyCP4/GeRbFzHGDI+RwVYziVV9Tz4qS54py3dDe65SHcHp+jQXxVZ/naRJZGKrKbPfS7CmA9URVa+DgHPeX11nMfq56puhdkwhui4dGDlfyj8DLhci54CeHpdRbObkzEMnZ9PfR76L30IL90j+/izAqvY8tDrNin0N9ukxFfapKZKbtoobZPSdX4csBeARwH4zmyg31vXVrxfJax8qQdhRXfqAdgbwF4udGTA/UKH4NUR3C1kdAshOoLTdQhYv3s9RYteT9GodAdMp+ihMlDbhaA0kx88UmABhp4u8VVdQvSHn094xGi1FB56vVRptr1U2Y/gBnC/VPlWkQUrg4AGUGoL8GqF5qgA935wui1ek7rM0ld9ZVlnqE670FahpV+ddmFtNoS+bzbwhqTPlSKqMSNas6H1g8uVLAhgACg6JYdD/WCk8Fd+MCT0/KkGzn7wSRjiKn3V+awR/RwifjVQkELLH6eObAdS37ULtYhin6tFVGMn9nbhN/vgutMFsJ69c/GV/MwXlR/MLTuVH7w+Ip8uHebV/954yqoHQcc54+AgjUX5QcL+bOjD/rLhbyZ9rhRRzYaA3vBvlyrzTlNVYb5II5GH5steqvWX5Nd24RUIntyAz5+mARKU/ugd/YRwSFjrpMKPvwG6JYf67pYddZOkQFI3qdnS023ZyX7w4e+uY21wVFc/WIgOHEwBr/K5H5L5rR/MOVWGq4QtnZ8H+cVxp8f5SdAcLLLAmtplGIZyAFB9e9OdAmafq4CbTXkt4GQXwuJ4WGkXqk5EK/8I/ry1Gy3nEzA7YLk+08Ccm2MAwS/pM+sm5yeGAxlcBrErJo9JM+td9IC7bbHNttp/DthvAXOTxQvAqAFPS/dnr/SzGsn6fNZtKuAjPAMmv17fBNwUUduAs/8rx4DUv446NB9H/Gl+wI2Q/Lv7sy864N7ren9a6sYzBvEBHTy9vvHqSvdqSvNqS//qSltkgVFz+on8jWP4N/WLBKfp4Uqv13dePmtfLutfTmsu0vjBwqUBtZ//f44LFg0r1fejfz3U7/C18Rta4pqH7xv2iAAAAABJRU5ErkJggg=="
Themes["Monochrome"] := "iVBORw0KGgoAAAANSUhEUgAAAeAAAAAgAgMAAAC3JUMGAAAACVBMVEVHcEz///8AAADmzmMiAAAAAXRSTlMAQObYZgAABMxJREFUeAF9lwmOq8wOha1oTPZBpJf92AI0vX+gpK5V9CaMutB0J1DKq/ztAgMNSo7EPamezv1qsAvARbLoPH4vALjJE8D9qJsU/XiIjXY/ERYxFrWn8Vldv3OAy4QE4O4Sk+Zcsej/FV1EPrmGhxRBk1KyZwmK+hmxOYznn/GHx50D/A8Zf4C7K/VE1HzdNM70+ZCrxsvzx71j5j6sxAuFhKBxpMSpSBQMaQp7Yd45ACOGGtwPwXeAa139H6CiEbHl+suDncSDGgU05D4UFeL2OzHFZnN4MFJP4P4q+CGokufXS+JOcZH2xBS/EXfN0G8OrCRIoB6zuWY8d8EPsWB5VoTtiO+IWUdDTn2HqlDghmT/iEo9cQjj5he2H+QfF44iY/+j7OMfW3BFFXHNtQbHbMEviXE2ZlTljTiKimxpU8ph9Ss1FlxfMYpkrhXYNrPvaiWuEGt5PgSltan2XY2LnBhxtkJMU7QFH9gOlohknHde3LxCkxKhMIkFm+vhwv9DRXD3TaXE0hox6M9c8RPSIidOZBYTz1MuyTZRUg3Jt9fQ+Gf1Cok1mCrKiJEJLuafGhxlpB9331QVTdIPGnzjVrIGh2BJ22bqmpIy9V1QTTEEJZ6MbrJZ1ydECpN5COpcZoZ6jiNxO/VwM/+hUKZ2qsjciO8yfXE9jGj6/4mYZ89KjKjEikMfiB8rMSfBlM1V2QtN4JZjpjHAzfwHVLaXEIMHP+Qu8iXPhGjfqd8QW+GYogLZ0Z5WYgqCIZqrYtgFi5Rgcw0mESsp21RbMNcJ0b5TvyVuV2LKK3EzZG4GdRurYxGlSCKcCR7mT6ha6UcN9vO7C7bvvCWmqMQ+duJOP6hNXSiaeAnmSDmWYHMNjsK5rPEYc+vBZY3tO2+Jm0GJfezEnEQpU+ZkUu+WqY7t2I45wMO8BMsH/t8KiLS1rXElUus5vqJ9pz6f45lwdGIfY2vEiDGggefo/yGlteOU5mDaB2cNfogF2xpbMNdzcK5Plcun0Il9HGJSUWgTN6wHrE2mwaa60eiwTHXYTbXMU32XXqfYp1wRSvCxVjtxVuIoRiySkz6aZX0h6epqTFSfC43tINTd10vZXGG3ucQ2l59f32QJ0b7zllhEiYNkiiIrcWOTm8RcJX6caDlOdDxOvqn8WPlxekMcxIhbg90TR2ua2VyV07gEj3MBoWMB8cLhhcQLyJmYzOLktdq700o8JFti85TUq47YgqtSMkc6lkwn9mAvmed+jGZD8lrt/XgltiMck3kwnwOwvs5Noj42CWsOMmxT7U3iRLyWQhbVRuytsLE6LWH1ayH5qK+lLX6c2yKhiJJ6e/S2+LofB1Ht+nGDi2IIefNLh8hKfMHSr88XAbFgefqFwC8C534shpcTD6La9WNGSy/LMCisO2Rvc3ZK1A9XH7/y+BXIrz6nWh2iTeHkU7/147A+U5w2h3s5UZ/w0ADzw2XPz69f+jz4TFxIt82mT5T0TVl2Dlekcsu8DpO5y4N9U/k19zVxudXRnljkO3GUncPFgmtwPwb7pjoFO8Ygs8qn83ivIe8cgLGhH+B+CL75q4u/yvw4EsuiV+P9M+3c3plIJ9L9+NLmL2v+8gbHXe1B5/F76RyL5bkf5a+n/roKi/4DXnx6iqqx+9YAAAAASUVORK5CYII="
; Fontmap data
Fontmaps := [] ; Create array
Fontmaps["Pink"] := "iVBORw0KGgoAAAANSUhEUgAAAPAAAAAYAgMAAAC5LJjuAAAACVBMVEUAAAAnIyP/ANyc0SNYAAAAAXRSTlMAQObYZgAAAJVJREFUOMvNlMEJxTAMQ/WH6D4d4V/Uw9/rj9BDM2UVKpqYklxKSYMRsuAdbIgxUe+LDwl7q4sMOtfJSDiltAn+/WFvVdlXus5VMhTeyBNm9laXGqvyRbD8kXdh6bOwXITRgAH0YK9h8UqiGi7Je+A8m2e+LK/M7Pw+TEZ4ug9D7YNw82MY7m57INw+Qxm2L0k8QwPhHXhD8je17UVJAAAAAElFTkSuQmCC"
Fontmaps["Green"] := "iVBORw0KGgoAAAANSUhEUgAAAPAAAAAYAgMAAAC5LJjuAAAACVBMVEVHcEwnIyNr22/DZy3FAAAAAXRSTlMAQObYZgAAAJZJREFUeAHN1IURg1AQRdFNEfRDB9Eb6ysdxKvM8m0ecTdYmzk4WAXQsw5YqlNMC6Cx1skv8X6/3zmeLyzVKfoSa42rWiY/xTsoGLxOMS1AjjB27HWcX8XwYexVG9sFbGZXcbwMY7lIEiPWyb/geG562ZAz1HMGXsfQxtXr2Lz9ML7wYkR87Wr/FF/4DAUca5lALZMf4gN4Q/I35hKgZAAAAABJRU5ErkJggg=="
; Icon data
Icons := [] ; Create array
Icons["Bulldozer16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAG1BMVEVHcEzAwMAAAAD//wCAgID/AACAgACAAAD///9wWJvwAAAAAXRSTlMAQObYZgAAAF9JREFUeNptjgEKwDAIA9Wkc/9/8TQiY7ADaXoE1AIfwqJxahoTTo2QvcTkcA9CsLOEj/ARZDcyq9HZZJHnJDqvOMUKcoXy27jV2LX1P7uW9aIM4J3/DzPT5cpz/6D8AFCgAnWwfBuRAAAAAElFTkSuQmCC"
Icons["Bulldozer32"] :="iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAG1BMVEVHcEzAwMAAAAD//wD/AACAgACAgICAAAD///+ovIncAAAAAXRSTlMAQObYZgAAALdJREFUeAGVk2GOhjAIRHFE9P4nXiETYqF1P9+fJsxLaUBFBC+Ig30JJMCxAEIQmG1mPNhgBHeCPBKQKmQdWwAZWzzqZHwq+g3AsScH0G4w2x+Y1Rvu4ylEwflFIE0oLfiG84ZvqC2AyGkATRBErqpu9EFRUMeF2agjp5H1KpBvAnGB8aWrNzC/pi3AFp5rmwMneUZ+KSfZd5EXcBd93Rq8rZs5hW9f1L/f5PAHTv8L1mhPRl0A+QMfTwmTv+zr5gAAAABJRU5ErkJggg=="
Icons["TickGreen16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAV1BMVEUAAAAAAABBhQBEhgBGiQCayQDT8l+bxgDL8E+b0ACazQCbwQCavQCbuABIiQDu+JHk9IPD7z296Ty56y2w6R2r6Qup5wud2ACd0wCasgDl9YHb83Lc9G+zrzKuAAAAAnRSTlMAM8lDrC4AAABtSURBVHjafcvHEoAgDARQjAFFmr3//3ea6FhycQ9L3s6gfoMoDSmBcL0sK34dQtjx+Qmb995ARpcxwO2cO41lUZQA1PSQVWy01m1L1eRsleWdrSi2Y19LP1s79+x7GadpZL/LMLA/S4xksQjLHAo2A8ymlo23AAAAAElFTkSuQmCC"
Icons["CrossPink16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAQlBMVEUAAAAAAADEMLv0TebrOdvnMNT3VOr8bPH2uvD6cfD4du71sO31p+33e+z5Wez0nuvwRuLuQd/1l+72iO72gu31j+wka9E1AAAAAnRSTlMAM8lDrC4AAABoSURBVBjTbY1LEoAgDENtpPj/Ave/qjUyiDO+RV6TTRsDsKjd9/h4Up1QbMesqjOybBBszrmNAWm4nI6c7FzSYSR2grAbAaXHlkTkvlhZGGAfvfcjsu5hWNcBIo/5o+sgxVxq83r9wwU3SwPDoxOsTwAAAABJRU5ErkJggg=="
Icons["Joystick16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAz1BMVEUAAAAAAABZW10AAABTVFZZWlxUVVZAQUMAAABvcXNYWVvaIhzUHBZzdnlTVVdZWl10dnadoKJ1dXVeX2FTVVmsra5XWFqNl5hTX2JQXF9ZXF5VWl3DxMWYpqqZo6acnZ6KjZB1hId5gYZsfIJ4e31naGpdY2ZSU1dNTU2qNSfOVCXMGxayAADO0dLDxcW8wMG6u7yxtbeVpKiVoqWZn6CGlJaMjY+GiYv/jYf9i4V+gYN0fn/if3rffHdXZGdMTEz/SEpJSkn/REfuLQDqKADKN7+jAAAAD3RSTlMAM6wRwKd5eSP39+josrKgQWYEAAAAoElEQVQY01WKVw6DMBAFHQIJ6RiD6b2Fkt57vf+ZYhTJFvOzerMD/gzLcgAYI+12Ol71MRXS4nLX0zSjonNW4SE2u1S0e8keoX4bsCRT0YMELFFUNCUBoxagIRLzRQdn6oY2X8aGYXH1Fqwor4LZKnjmkSWQvxIWn0rz/d37W4QKB7ANXceBnrfdrF1oY4ChLEmSTKgPxICfNOCB2Gog/gC2Hg+ySSMz8wAAAABJRU5ErkJggg=="
Icons["ColorAqua16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUA//9kZGS1lhCsAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC"
Icons["ColorBlack16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAABkZGSh99HRAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC"
Icons["ColorBlue16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAP9kZGR/8tcgAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC"
Icons["ColorFuchsia16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEX/AP9kZGSbNnzsAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC"
Icons["ColorGray16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEWAgIBkZGTj+MOgAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC"
Icons["ColorGreen16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAgABkZGQQEWFDAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC"
Icons["ColorLime16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUA/wBkZGRrkxZdAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC"
Icons["ColorMaroon16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEWAAABkZGS/R8UJAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC"
Icons["ColorNavy16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAAIBkZGRMrmfqAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC"
Icons["ColorOlive16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEWAgABkZGQOoXWbAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC"
Icons["ColorPurple16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEWAAIBkZGRSHnMyAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC"
Icons["ColorRed16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEX/AABkZGRFM3odAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC"
Icons["ColorSilver16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEXAwMBkZGQvR8m4AAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC"
Icons["ColorTeal16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEUAgIBkZGT9SNd4AAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC"
Icons["ColorWhite16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEX///9kZGRRUrtgAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC"
Icons["ColorYellow16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQAQMAAAAlPW0iAAAABlBMVEX//wBkZGSPV72RAAAAEklEQVQI12P4/5+hgZFIBFQMAAyoCwtCKbyxAAAAAElFTkSuQmCC"
Icons["ColorCustom16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABU1BMVEUAAAAAAAAchboYgLMchboXear///+az+0VgbcmlNROp+MKe7UHfbcKfbUHfLcIfrQXgrgPfrZSmP8mf/6u2PJKpuIiktQv/80A/78Of7f/6p7/zF2Q/wr/qgKOt/90pv/ji//RV/+WVP9uFf+9Ev9qB/+xA/+jxv6pkf2av/vA4Pi/4PjRU/JhnOl1deVLp+P/vOB2/992rdqW/9kNZ9hX/9VpmtWx/85PisNV/8E0Xr3/97yF/7s9c7coZrNz/64aWqnXH6n/uKT9k6Na/6IA/58CRJv5sJJJ/4//+Y62/4ww/4kAKIj/54T2nX7/iH6H/30g/3v+0ns//3j/5HH6inEJ/2v/72vzh2T/cl7yilz/41v/+loA/1f/V1Wt/0z/4kD/RUD/2j/1aTz/vzn/2jP1aTL/tDD/Ny75RyP/+B7/2Bv/Gxr/+BD/1AD/tQD/AAD/J8/SAAAABnRSTlMzJ+/hxcCUfIvEAAAAt0lEQVQY02NgEeBAAgJMDALsKECAgUNEjBMOxEQ4GAS1RLlgQF9UW5CBmw0FcAMFYsMCg2VksnITUrPz2PiAAq7eHi4B8THhIdFJ+WABCXFLexsvTylf6XRZqICpobG5tVSQdApEQFhIXk5T3cDJ3S8iGSqga2akoeDsHxqVxsbDwMtmYmdroaekqBMZl5gJFvBxc7BSVVZRc8zIKQAKCKI6TJKBVZAXCPhBgIeHR5KZgZEBBTACABywHdtSgj4lAAAAAElFTkSuQmCC"
Icons["ThemeColor16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABmFBMVEUAAAAAAACMjIyGhoaMjIx/f3+IiIiEhIT8/v/V1daGhobQ0dLS0tNRmP9sDv8lfv3GNvv09vXr7Ozk5OXd3t7Y2dnU1NVGfMQZWan/6p4g/3vyiF//zFz1aTX/2jH/NS+Q/wr/rgHWZ/+FOv+9Ev+xA/+cZ/6kuf2ok/3kjf1vo/qFsPWRuvNwSO+B2+5hnOqX3+ll0un4sOeq4uVEyeMTb+N1huEVvt13rdvfZ9hqm9Z1/9OS/9JW/9Ar/8//2c00dssx/8pXj8hV/8EA/7+y/74A/700Xr2F/7wHTbf/97EuaLFz/7AA/6nXH6lh/6X+r6P9lKP/z6Eu/59M/54CRJuG/5BO/5D/+I+1/476po0AKIg4/4b7wYb+5oMA/4H+iX7+1n3uUHz2mHv/7no//3j/5Hf5inH6s2wJ/2v/+Wr/eWiv/2D9Z13/41z/3FwA/1f5o06K/0v/30r6W0j/8kX/SkX/+UH/4kD/zTr/vDah/zP/tDD3USf6iyD/+B7/2Bv/Gxr7KhT/+BD/1AD/wQD/pgD/AAASyZo1AAAABnRSTlMzJ+rewr3tYEIdAAAA2ElEQVQY02NgYUMBTAxs3DyccMDDzcbAxlOQKZWqoFDfXCHX0MIDFOCOl4oJL6ouL80rlmvlBgn4Bof4h+VkpaTlVyqCBVzsnH08IiMk42Rq2sBmuDnaWtu4ekkmylQpgswQMzcx1DMwtg+KzSisE2Nj4BLl59XS1lE3CohKlpYV5WLgEuHn1bey0NAMTEiXlhUBCgibOog7makpWWbnltQKczGwC3lKeIvrKgsIJJXJNwmxM7ALRodKuPPxqaj6yTe2C7IzcHGgAC4GVi52JMDFzMDIgAIYAfg7KGjYZYDzAAAAAElFTkSuQmCC"
Icons["ThemeMonochrome16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAOVBMVEUAAAAAAACMjIyGhoaMjIx/f3////8AAACIiIiFhYXV1dbR0tLT09SJiYn09vXr7Ozk5OXd3t7Y2dmeS4wlAAAABnRSTlMzJ+rewr3tYEIdAAAAVElEQVQYV43KSRKAMBBCUeIQwe7E4f6Hdadk52dF1cPSaLUJLXJ/y2hg1u1bEgz7NQiGi/gl0kUSvF3cBC8XF6HTxSnocHEI6i66oDokrBqaUTBUHjGqB1O+DAIbAAAAAElFTkSuQmCC"
Icons["ThemeCustom16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABTVBMVEUAAAAAAADTmUQAAAB0VCXSmEJTh7bQmEXRl0FJfa3emzt6WSlhQxgAAACsfDYAAADSmEMAAAAAAAD////PkjpJg7XRlD36///q//89gcH61mn/99nQkj3//d3/+ds7fsBMhLdIgrb/22rRlkHakzH/+9lCg8E5fLw4e7z/87r33I//9I7/4Xv72nP/33H92nH/427erFPSmUPdmTfMizTblDL1mivxPgrxNwTsAQD0///w/////9X/99X/9sr/88D967T/9rL/+6tljKmHpKX/7aL/85v2moP/5oH5jYD/7H3+33f/5Hb0lXL2dXLqxHHmvGz0e2z40GH50WD3XV7zhV3yc1z0k1LyflH1UlDwYEnqrkfYoETwYkDyRT3ygzfNjjXyeTX0ky7Wji3tQC3yUiv4pinwLifxdyXwPx/wXRv0dRjzZhLuJBDuDQwvNJYpAAAAE3RSTlMAMzMLW+3y8eTArV9OMC8vKyMJrq99IwAAANpJREFUGNMty9V2wkAUQNFbGuqeZKY0E2kT3B3q7u64u/z/I5eQ/XjWOmAngkCWtmwmQESWJKUqmIgdg3Dy9XkuYVQUp0xsGE73TAdIJhsA7CwcDIZDkYJhGMl4fAWY9ykQeL5WVceU6wrYRTSRaKhHu6ZDDXRfUXYeu/nsuFPOffMi6G/v3lDEQ7PN/O/H6zREfTf3jx46Kv283D1QEWLk8tbvd9Pe/1+ln8GwGNMZS6q0VaunumlcNlc5jltz8Olhqj3IYIB5tOPiLRrMLGviPhK1BStsz1nWJ5D5JE7hn39tAAAAAElFTkSuQmCC"
Icons["About16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAn1BMVEUAAAATWq4AAAAUXK8QPnMVXbAAAAAAAAATUZoUU5v///8TWq5antewz+tsreBWm9VSmNRNldI6hsotfsYZX7Fgo9tdoNlFjs9Bi81mqN1jpdtKlNNIkM89ic0necOuzOmoyuh7t+Y1g8gQWK2gw+SWvuSdwOKQu+FyseF4r95pp9pvqNlpotd7ptVPk89gk8xIico+gsUsbLcVW68bccC1Cb/ZAAAACnRSTlMA+TKVa0YeDqqpx9dwywAAAMVJREFUGBktwQWSwkAABMBZYrBucU9wl/v/245U0Y1FQOZ5JgF+Iv/YCyH2Dx9hEb23h3v3190P23eEL99fXTfQzrlr7wEEt8tkp4E6a6fLLQDIri0K65wtiqLdEYCd8qZpKbV50+QnBrCzMSYfaFsbY84M+HCldd3TXGut+AcgKuNcC1orzjNFgM2rTDMlaM3TtHxtgJhlshSU0rSUGYsBhL46yiqt5LHyIb6SkD3lOI7yycIEi2S1Jowxsl4l+IlXixiLfxDzENkdXU/bAAAAAElFTkSuQmCC"
Icons["Website16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABuVBMVEUAAAAAAAAAAAAbhb4ag8MYg7kdHR4AAABYWVsvRE9NTlAuLzFramtbXV84ODp4enyEgoMYfLEZgLQZgMMXgcYVgMEQdadAY3USVXYAAAAAAAB7e31SUlT////m5el9fX9oaWqi2v0VgcgRfsWtrrBnZ2id6AAro/UnousQmOnI7egYisTAwcIdiMAYg7+5s7OmqatVu553jJ6MjpCBgYN9f4GHf3+IfHl2dnhtbnC07ymB1BCg7QCO2wDY8v/W8P+95v+s4P+R1v+O0P9vyf8jnf92yf1jw/hwxvTy8fKZ2O+s4O7q6uzq6Okgoec0q+bh4uRHq9/Y2dvU1de25tImoNGt5M8wpM9Wvs1Is8kMg8Ych71Mtrw0jrp3yrgWgbYkjLQdibOvsLKtqrImi6/1/6oepJ+d451miJt21JbZ+ZTI85KC3Ip2cIZxaoV+d4F6eXtwc3V+dnN0jHF3cW9jY2NfYGJwz2BaWlt9iVNrf0/M+UmR5kaI2UUqO0WBz0Sx6kHD9EA8PD6a4Ds1NjhrwjdkuzXN/Sm48iGL2iGj5xyT3w+n6wyK2gN80wOo+QCi8wCs8gCU4gC8ZIRDAAAAG3RSTlMAMiszlZVJBv3t7Ord3dvUzcm/vru7qJtRHQoDbBl9AAAA90lEQVQY02MAAmZRZWVlJRFmBihgTayvbrdSa01hgfK1vVO1FJ3jJlkngEWYoxXts0K8GpoNe211QbqEAu20shuturpjXK3bhIEC8R4OjmEdPbWdkeqhtkpAAV13Raf0iTZqaoYamn0gAb1MN5ec/gk25ep+mmlRIIGaCKP83LxKf40MczMzAQYGwXAjfVk5ueSqYn1ZTzkVfgYJbXNZ+dICaXl5aWlVmSB5BimxIl/pWFVZnwAdaXGZJFMGBskSORMFGRMLC8sKBRkDS6CxPCrBOsZNdZwypioGxhxAASZehUJVbjZGvhaFMi42BpAIIyMjEzuUAgC3gzKL3h9uqwAAAABJRU5ErkJggg=="
Icons["CrossRed16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAQlBMVEUAAAAAAADEQDD0Y03tVj7nSzD3aVTqUTf2w7r1u7D1s6f0q573jHv4h3b6gnH8fmz5blnwXUb1o5f1nY/2loj2kYIsdw5nAAAAAnRSTlMAM8lDrC4AAABoSURBVBjTbY1LEoAgDENttOD/C/e/qiUyiDNmkdeXTRsLYFWz7/HhoDqg0I5RVUdk2CCYvPcTC9JwOTvmpHO5kl90BuGwBBSPLRORfTaZWaAvzrkFGWlY932FyEP+2DZIIZeavF7+5AYehgPJ4JlOTAAAAABJRU5ErkJggg=="
Icons["Reset16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABBVBMVEUAAAAAAQIDBwk5b5tdl8ZGhrtCgrdGhrppocw/eKhBgrgAAABEhboAAABDg7U/e6tBgrg9daM9dKE8cp85b5tChLlCgrhBgrdChLkmSmYfPFMkRF9EhbkOGyUAAABCg7hDg7hBgrdDhLlBgrhFhbq01epJjMGAxfFtuOpos+Zlrd9WntBIibxGhrp7xvWbze6rz+d1uOOUwuKAtdpvrNdZpNdQn9RKmc5Dk8lhmsZPjL1+yfmd0/is2fWMzPWfz/B9wO1yvOx5u+aHwOWdx+SDu+JnseJzs99fq99hq92VvdteqNuOudmCsteGs9Z3q9RhptRoptFLksc5i8RFjcJUkMBRj8CQtmn4AAAAIHRSTlMAMx0D/fv59/G6qiMhBtrJu6qlpZmVj46BXE89MzIKCdU0QhUAAADISURBVBgZBcEFQgMxFEDBl926UNzlJ1mXuiMFirvf/yjMAACAl60eAlA01loPjP/0WwNQla7vWzDpwJ9tAcw/vwcW8p9p2p03YPftY3pjYH89nwxfalDqT4IVD5rOxte4b0Fux8FRGcAJRksNcv8srgJcdNITkIfezAUonxSuYwF5vHvfATCF1zgpQTWNO3/bDdDni2i0CQd5dNkZCugwjDIHmmvBVXimQU7bFxUAp5olbQFPtDZFgPpeSzxQSimlADiuKwUA8A8x1RjoBFZiQQAAAABJRU5ErkJggg=="
Icons["Undo16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAA0lBMVEUAAAAAAAAAAABIiQBEgABIhQBMjQBKjABCfABJigBKiwA5agA0YQBHhwBIigArTwAAAAAAAABMjQBGiADJ3mKg2QBZlABHigBDhwCq2hHH5lxFiACa0ABhnwBJigBChQCj2ACd1QCj0gCgzwCaygCQyQChxgBLjQDZ5qTQ45vI4Ia923TQ4maz12W81mDD41+w2VTC4VKqykCr0TqRujqLvS+v2Cl4qimt3iCr1R2w3xSp1BBWkg6myA2c1wCexgCTxQCEwwCPwgCawQB0sQB2qABjDDvWAAAAE3RSTlMAMyH5vc3AsKmolYV0aGcpJxAIsLU9/AAAAJ1JREFUGBlVwYcWwTAABdCXqr1Fm5AOSu299/b/vyQNTrkXiJsfXCQRYIPy10JAcnaVt/12OqcAdIcq3Pbrm2UK0MhHpu0bVgShYto2ahQ/8qZXY5CcGJSs3fAYAN4RkEq5w6x1jwC8e765nHN3PTq2ngmwXrM5riqrxoVpYH3LqhvK6cEIQPjQuLo0wHQCiYgJJW8aFNKO4h8pIPQC9d8ROIeF6scAAAAASUVORK5CYII="
Icons["LevelSelect16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQBAMAAADt3eJSAAAAFVBMVEUAAAB4i5z///9OerXxz8/joqLHQ0OomdN0AAAAAXRSTlMAQObYZgAAACVJREFUCNdjgANBCBBgEFICAhEXIMPY2NhINBUqIuQkQH01GAAArVQMUlOJoMoAAAAASUVORK5CYII="
Icons["Mouse16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAq1BMVEUAAAAAAAAAAACXoq6AjJh5g5BzfYp1fomap7GWoqwaHR9HTVQeICMAAACQnaiOm6fX2Nrh4eL////c3d7DxMb7+vv49/fs6uuYpbD6+fnLzM2Vo66MmKTw7+7n5uezu8SnrbSIlKF/jJlyfoz8/Pzf3t/U1dbS09bO0dTNzc/Gx8i9wcauuL+stLylqbCOmqaIkp6GkZ57hpR5g5F0gY+grLWQn6qPnamEj5r7gqE9AAAAEHRSTlMABjPn59rKp4JuPTk0JuXTpzPyugAAAKFJREFUeNo9y1cSgjAUQNHQm2gMBKX3XhXb/lcmmSfezzNzEUu9slS0J8SUBITGAoK0gRKSE0IHDeDUOMVzjAu3OQLMlkOzMHOdaAYIIsfNq3yDAMB/pC/f99/Z4wdpGV5YYZkC3PAZwjcAsccWC/cigJK0mNWOCoCxeF5d1Z63GACclHS2bXeJxCHocJ82mO4HtKfL62eVdfSPM3meN2H4AuxFD/FyAkagAAAAAElFTkSuQmCC"
Icons["Progress16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAflBMVEUAAAAAAACTk5IAAACKiIeGhob////09PWMjIyako2OjY2Sj4zR8v+PyPHq6utNndiXko6SjoyKiop4v/KCw+/h4uNWpd1BmdtTodr7+/z39fWo1fWRzvWGxO7t//+u2/my2/h6xPj/+vaHyvX07+tssubi4uPp5eI8mNyVkIwc8xB7AAAABnRSTlMAM+8jwMBsrnnuAAAAbklEQVQY063LSRaCMBAA0RYUsTsxiRllcGS8/wVp2LHnL+u9giNkZIiMIYMlwwzoJeqPEPW7urICgUQKTRPCfxy8988SZqmkTEm67s446N61SrVO/ap14fC1MVobp2KDcNa3jcYHwwvkp50cDrAAIogHTnbEUkkAAAAASUVORK5CYII="
Icons["Sound16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABF1BMVEUAAABNUVsIZa8AAAAAAAAHCAkCK0wIbsBNWWgJbsACcMgCHzZIT1tMTVQAAAAAAAAKbr8AAADmnjpLV2cJbsAKargJZbBQXGwKbr/qoTkKbr5KWGkJYKcKbr89SVcnW4kpYZOKXyKOYB8qMTlOWmoNDxI7O0AEKUcAAAAAAABPW2sAAACks8MKbr9NVmSUo7OLm6t6jJxNWWnpnTWWprdMV2b//9aouMiWq8altcUEb8WdrLx3hJRugZBrf4//+Y5nfItleotndIRhbn5VYnL/42PsnzXpnDL4oy7/+sWerb2aqbn/+LiInLiRoLJ+kq7/+KqImKqHmKf/9Zx4hZV1g5VfeJRadJBdano7Tmo6TWn8zUT3wzXjEK8pAAAALHRSTlMAN70zLQwF9+SsY0E9LyMaFBTx7NjJxMS2sK6ln56XgHdgXVlYOzkzJyIfCjZim1kAAADKSURBVBgZBcEDYgRBAADBntVZsS/mYHm2Yzv/f0eqAAAAAAAALtPhOgAAwPEkrocCAAC2R+2vZpKHlTJszhY/we1o3EwE7CiIarXGQ+etI7XIpkrWBvPrv8dn3/elLlSszJlifje9N8YYqfdbReUpoqffz+FgMJS62kKhiF6nH71utyf1qZ2xyoqo32/EQRBIXcimLrbWWJotvt9v/BepRSW3q4o4B4f23rgdy0TgreYA16V0NDH1MA/nHgBwdbIcpl0AAAAc2wGAf5HyHXcI5SIBAAAAAElFTkSuQmCC"
Icons["Number16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAk1BMVEUAAAAAAACQkJBoe5BWbYhddpOSkpIAAAD///+KioqMjIxXcY9ac5CNjY1Tb41OaYno8/rz9PXk4+Svxtn//vzD2+tJZ4dGZIRCX4E1VXcpSWolRmgSNlj//fnJ3++DlKhleo+SkI5SbIsvTWwAIETs9v309PXY6fTW5/Py7+7w7ezg4OKrw9drfZE/W30NLk8HKktDXdXsAAAACHRSTlMAMvLwwLCwI23EwUkAAACLSURBVBjThcxHFsIwDARQ0SexnRicYgyk0+v9T4fMC4us8mc3Txoat1Shp+pZxMSCFNbeCRk8QSHuGw85tNOIuLjZa2lLZNq276PgF7c9cBCbhzFG8kWyAydpYtZICpDswfmPcoEOVVfx6Mt9EHHRy/WlPWs/2ouLNE0LSVMV/NRPIaSUc5oMrWjUF6CZC77GdOaMAAAAAElFTkSuQmCC"
Icons["2Undo16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAtFBMVEUAAAAAAAAAAAAAVokAUYAAUoMAVYkAVYUAWo0AWIwAWIsARGoAPmEAM08AAAAAAAAAWo0AVIgAt9kAVYpi1d4AaJQAUYcRvtpc1eYAstYAr9AAtMYAcZ8AT4UkwdsAuNIAtc89uc4ArsoApMkApcQAWY2k4Oab1+Nf0ONm3OJS0OGG0eAUxN90x9tUvdllvtdgyNYdvdUQvdQNucgAl8MArcEvmb06nroAhrEphaoAh6gOY5L+oCM8AAAAEXRSTlMAMyH5valnzcCwlYV0KScQCCm4P6kAAACXSURBVBgZVcEHFoIwEAXAHwR726xGaQrYe+/3v5cx4ENngEo3o8jBBy86XzeCxute6nhYxgTAZjJUMHIH1ypgiUx9MpJeAblWLZCS8KPRHUqGxmUYxSAaMgA1JWjt4iv2LwVAzfxxqJQKH/uT/3TAqySZ941BNGYLvPE8VxrunQUg1E6eQ/pgW0ATtCWRsmCISQn/RBO5N4/nDqZEsrcEAAAAAElFTkSuQmCC"
Icons["Color16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAYAAAAf8/9hAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAvRJREFUeNpkk09sFAUUxn8zuzOz2y3b7cKudFtKMZCgaUIRCKjBmGhqGo16knCVm9ZEYwIHT3DCIwkNnEwIJwgHCAIS/BMjGo2EcLG7aZtIS7pbut0u7D92Znbn+bq1cSMv+Q4z89733vvmewb/i+NZplzh4xZEDrUMDvhCG5qGyTcv7+XT7lwR6XrKHhnnr6NyY2VKpN2S7giCQIr5MzJ9JSTZa+Hx5wly748buaOSdZdlWdryp3wll2VCHrQOirgfKuEpRVXc6pzkvk1I7qY1vkFgdgiC1u3fR07i2j4TnOEOeRyi9LAbjB6keh/mj2A7LiOHfyAIzNsbU5hkL0x9ljyB5UR0wYuksZnhLXoZUZJtmrIdo7YTQkkoHMeJ2CT7PiF7mql1AvGPvdP/EudpEeMVBomT0t7L7CEaSoM3BFZKMQDLYXhwjv5tbxPAsXUCSxzHNrXrEy3LKF5VgmEqvNjpTpBRkhjyWAXzLP0fM9gxByOkA2qEe38borHJJlxIs8WxSDo2fU6GzZpbbldIVe/RrkVVB12h2tSXLuYLHt5iuqNBOH53kNrOHrbmNhHp0Ul7oWI8pWx77PG3Qj2KKT6uaROUY1Abwsg38Oa3rBO0Q21vrvzMjid6KS4VKC0+Ip6Isk/XcNVNBXmTgdUfiZS1KN4kGIzTePw3gRF4HYLg2crVX+/z0Uh/i9lcgf6k7msKfUt9PI10OhB195EoXcLO1mFslIXaHxT91tU1AkMxzOiX84ffGCORGtCPDSZWD7KjmWY4ChlftXNhv/8uJJOUihVWvvue3V5juxppYc1IC1RnJn+5N8PswkMyQZzMXJonS6rZI3DzilX1EZ+z+nCa4t2fuOU3Jzt1ayt0lJi/fhErTG62eXa0MMZiqE4oZlG3hJpvqPg+05UDvNbIc6denfxC1HH/htF1TnHFrvf4+YRF6gMs7B1Kv0vH9wO8EuVrJ3n9a82ZVVQ2bsHg+RhWbO6Y7L9Q41HaGLv7Gv8RYAA5OVH0igpFJAAAAABJRU5ErkJggg=="
Icons["Theme16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAABFFBMVEUAAAAAAABNfqkAAABUiLdMeaNUibhVibgmPVJMeaIAAAD////8//9KgrVIgrZPhbVNg7NNhLZLgrbr///3///5///z//9SsfZEfcFMgrNGf7BDfbCArQCEy/5yv/cuoPE5nedGf71CfLtFgLZCfbRNgK/1eG/1lynxPwrtAQCKzv5ywf3p8PZmufZetfRCqPE2ofEcl/ENj+0CiuwAfelVi71yn6b2moP5jYC903X0lXSwymuvyWP3XV7zhV3yc1ylwVn0k1Lyf1H1UlCqyE2duknwYEnwYkDyRT3ygzfyeTWTtjT0mjKgwC3tQC3yUiv4pinwLifxdyXwPx/wXRv0dRiLrxTzZhLuJBDuDQvwMwjyOwCMDCnvAAAAC3RSTlMAMsAj8DjnsE8/C407QQIAAADMSURBVHgBLczVQsNAEEbhSVsE/tnd7hIpCXXH3d3dnfd/D5ppvstzcahgisKM0pBhBjjwA2Wdc2aMilhfrS5Fi2ixH4a+GYS15WihUkHj8+7iGIqmsRLNlWfLqD+c7+9JqG604zhJmvXS5o6EWtufEmFpBo4UajH6Py/XZweQYDCfcP/x8qjT4UYacsZo/r463N3aDlqApbw3rvnt9OTm/ZebzuaIaETj6bZ7/9qD9rx8GhR6X93njz8oEhMWGUtismCVHlDpQHgZGfwDGk0YoyDaTbsAAAAASUVORK5CYII="
Icons["TitleProgress16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAeFBMVEUAAAAAAACQkJAAAABdd5Ndd5P///9WcI6Mi4v39PT09PTr6+zk5ebe3+BGY4SNjY37+/z8/P3R/9JU22bh4+GN8Zry9fPp6+mo9bKR9Z2E85JmepGSkI1LaIj06/Py/+3q6uvp4uiy+Luu+beS8KBZ3WtV3WZN2GBsIj57AAAABnRSTlMAM/IwxbD9z278AAAAdUlEQVQYGWXBVw7CMBBAwUcC600obumFXu5/Q/4sS5lh62Aye8DcwvAMYXhVddcZARNiHMfPd3o0TWMcmPevbWNsp+u9742Deb0k6yywSJXIImD9OfEWUHdKnALqjolXQH2diAIqGQWsZCxQWE1sAZS7TMnGHwoHCZXGVGT/AAAAAElFTkSuQmCC"
Icons["LayeredTiles16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAxlBMVEUAAAAAAACEttl1uOvv+f11t+jp9/zf8fpurNmx1e4AAAAAAAC/3/f3+/2w1vL6+/v0+Pvg8frM6/rA5Pi64vjm7/ij1/Oj1vPY6fbL4POy1u3B2/G42PCqzeCEttn///9wtup0uOputelyt+pnsehksehhruf8//+QyfDl+/+azfB0vO1rtOn4/v/U8P+Yy/B8we31///X9//o9f+Bw+1jr+ju+f/Q9P/g8//J8//a8P/E6vqk3faD0faCw+2Mwu1vuuxpuezL931aAAAAH3RSTlMAM6Cv9vPx7MCxMCP9+PXx7Ozr6OPh2NjXzcfDu62h/DHlHQAAALNJREFUGNM1zlcSgzAMRVHSE9J7j4xtwPSeXve/qchmOJ9X82akKQ1CS6RRBgIlG4i6G8w3FRFQGdg4g5J5pnLvc15YyAWeEdwPA3BxboNl8ysGOnk1hXPDZAG/y7D0mpFzAUgwhHKyEfMfQJpCkfgqbMXiC+A4Ng9IyDDs4/bA86JI+B+PdfGLQ9zurFfTzowe41ofQ2+Uv103fz6I0dWQ0auf6tKO4R21jEpLU/RaRdfQHxTJGl613Fd3AAAAAElFTkSuQmCC"
Icons["HelpDocument16"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAllBMVEUAAAAAAAA8eKpBgrgAAABUqOT///9FhLdSqOM+gLc7frVVq+hXq+RCgrbS7ftpuORfsuRUq+LZ8//N7PvC5vqh1fWWzvOKyPF9we9suOxktetFhLhBgrhBf7M9fbI4erI0eLHT7vy33/au2vV0vO1csexvu+ZlteVZreNXrONPqOBNqOBGhbm34vqs3Ph0vu9dtO5GhbgnJpdXAAAABXRSTlMAM8GyJFpohWIAAACbSURBVBjTTcvXEoIwFEXRSJEERRN67x1s//9z5l7ijPtxzTmE6HnObBXTCSHMrdzmhjUuA/Bqb7xjo2cD+LU/nbHJR3jULT+At3h5Vh0X67atgncATlAF87GYA4A8LMNFUJlYQgcWURldVRFCXMbUxGgMYL2KnqJQ2iMkRfJbJBZAWqSmKgX4vJ3hohoyCdq+Z5Yq0yQYp78M8gX1jQ3DX3MnXgAAAABJRU5ErkJggg=="
; Asset data
Assets := [] ; Create array
Assets["bulldozer-push-rock"] := "iVBORw0KGgoAAAANSUhEUgAAAEQAAAAgCAMAAACcqC7MAAAAG1BMVEUAAADAwMAAAAD//wCAgID/////AACAgACAAABa2PhcAAAAAXRSTlMAQObYZgAAAXVJREFUeNqVloGagyAMg7dcq77/E19Klyt86A6iYyjwr6SIe+FZr3vdtOMdB8/hgzjuCdGUwiIEGBHR7ElxfmMFgp8BosGUWQ77H4Kzg4AqCGCt7x6ENy0p5KjgjHYgOR7mHrF4slrntO5JPQRmDMTS0uREGFFVMBZORX28SogcJUalgoGzMkIkXQ0QDm4HQMLHDy0Y5O/NOk8jjhAxDOSMgvk7oCjG1VQUowQxqjKSpqiGghzXdRw95oxBe5BDEmWMhD2bJb3kjaZTjKLIk3J+BHhCnKcgnQTpsoN8VqZQNB1B3L9BglBCVZzqIaKM06lI/lwBS1eKR2NFuTfWchH2AmxK8WdGY4oLohVbEJPBgiSGelhs+AJZWvYKBW0gMOcIKw8ghYxkWnLmvrgVUOhT68Eqc7GwKYmCiCO9QXoi0sYeqxw31uDIKkQdTcbKo2CsQmRu+tUFg92XF2YI9l+j6YqTldlaeo1OgqbkQMff/Wtx2/YLpzkQdPoemB0AAAAASUVORK5CYII="
Assets["fig1"] := "iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAQMAAACQp+OdAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAANhJREFUKM+lkrENgzAQRX8CCl3YACNGYAGwRM8IMEJKOkceI9PQZYc0QcoClBZBJkd8QoIUkZJfPX1/3T/JB9LuDCevZQg6hrBnEIYhGxmUXcI/wKeyaXKjY8BfO0gKrEElhauXUmvn5Ht2Wo8dgB1gdvYOchzcU40jpNdqnBBBXh8aDTIjy1SLEcqoMrXCYjKyumgxveE2gyIYtLAUVtVgKRxhdtDMA+9PGkgVMuw1aipVYW+pFJBB5xaj0mXD7c6xz44wq8w3/fUXym4/V5jtAXCYj2Q5mxcCtmLG/B12YwAAAABJRU5ErkJggg=="
Assets["fig2"] := "iVBORw0KGgoAAAANSUhEUgAAAGAAAAAgAQMAAADXDu8XAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAANtJREFUGNNF0DFOw0AQRuE36xi7Qi4onAKwb+KCgiNQRjkI2pgUFLR0FCsQ4hIuLE6CIuUO0GTJP4qUlb7iNbM7C8UB5+faXJVzhlWcZX///Aqx7ORTUcVlIx71TCMe7cCLePQdo3xp2gCjpDHUDC0b+Xg61GyxpUywIEIpicdwDssjCcwVf99EMJmq3x1bKOW9ymuSsZFj7IjBSpkUb1yYpCKfB/joAUz80rsWE39OB0H8oT2sxVe4Igbx5S5hIb52+UAtHsFoxMOMTjyI/Sx7j9WNnD7+9sfp/ANrkWbk+690aQAAAABJRU5ErkJggg=="
Assets["fig3"] := "iVBORw0KGgoAAAANSUhEUgAAAEAAAABAAQMAAACQp+OdAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAAKZJREFUKM/NkbENwjAURE2ClCyQJTIJC2QBBqEIDQvQW6AIKTO4yihI2QEaPr5nYaoU6XKNz8/y3ZftsrooTDu242ry1xiVjpquWUUqM2MzHy5XkgcZdQ3L5GFmEN8XNeR+/tTkBOf2JHt3KujyO+sTKd8TJFSvJ+RW2RESTSJBRvKlTSRznS4Co1QBUSlEY0AYLM8syZAsQ1cm84/wCMsvtqX/0voFLXGdEKyME0wAAAAASUVORK5CYII="
Assets["fig4"] := "iVBORw0KGgoAAAANSUhEUgAAAGAAAABAAQMAAADf+uBNAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAAQxJREFUKM/dkjFOw0AUROdvMHaFUhDJKQCnzSlcUHCBSJRRDoIWk4KClo5iBUJIPkMKi5MgpNwBmiz/D7GjKOnS5XWjZ49nbWOLidKFcT2uDzd7qZXNZYPJ4HDTWyGNMYJcCJY3j8/ggqlv3i1wm08KCzSpH/Y7kzVgoMlLPH1oG82oQBUql9GUQPX2sMpglDnuF8AJF8whw4A7x20eSILEioah9/tJEwBZpD/frZHXNM5o5kCi4d8E0WoLhneiBVELlBecCqt1Gwvsoe02sTk01znEhtIUgOMReB5gZoejOddyHts405stcEFyi8wCtzlBvzMiKJatgR819uJpML0Eobn62v1yR/O/rfkDRPiwwvGSWaAAAAAASUVORK5CYII="
Assets["fig5"] := "iVBORw0KGgoAAAANSUhEUgAAAIAAAACAAQMAAAD58POIAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAAXhJREFUSMfMlD1OAlEUhc99gjOVUEgChTK0VCzAxCks3ACJJWEV2phxoLCwtbOYaIjJrIFiwkoMCQug04bxPkLOm4clmviVN9979547P/jBUEGVft7Pf81oFHvGYACfOMSWXIFlUtsdaQ1bUKSx8A3pLn3DXK59w1ys94zbO2ewQLwjCi9lFq+twsFocHQaDEeD8WlwQR6clDDLXxrkaIOgLEs36Zlgdf347LKMkmJmCzSSejSrGkHSaXpGWKDpGe0YT+/VLr0IaZaa0L0aQPo22YScNG7jYQ7UmGUK6WS4NzQSoJ5JmdLYFo6+FjQyQObB57JqyGtQjmlM9YgW1NiRibbVAidNjOil5YJZXnAsrq1iL7WD0YgBcaMrV22IDUcjAoyN7/YBjLkgyykSwxXmyglQswVmqd8g9AwjaHqGCKJV1UDSK+zDpoHROSzO6H6AHPr/ONz4h9/L90bDA094oAGgX1AhbVRghgcaAPoFFdJExWh4oAIA4FKpBUu15lgAAAAASUVORK5CYII="
Assets["fig6"] := "iVBORw0KGgoAAAANSUhEUgAAAIAAAACAAQMAAAD58POIAAAABlBMVEUAAAAAAAClZ7nPAAAAAXRSTlMAQObYZgAAAXJJREFUSMftlLFKw1AUhv+bWpOhSAYL7WBN1z6DQ0BBX6DgWPogco0dHIRObiJBKUKeoUPtk0ihe8cK0niuw5+cFlxqwaFftsPXe///lAQbdAU16GSd7E+MymLNqNWgCT2QTED0DtKtd+s4X1htXC6tNoZfsTaGZ7E2nlva4IConwg8lF3UtQKD0VDRBZajIfWVwQUpVFJBddmtQSor+HmeF0lPDOZX949Fl56djGRQGLYajcqGb5uhMoIJQmU0Yjy8lW9pR0jSxAsYIwaS17tVwKRxA7dj4IBdBjDNFDceDQtUU5MnNH4Glc8pjRQwY385Kxvmxc/7NAZAVQYz5kiNXCsDJrWekUPzKbs84dAU1wruUBeMRiyDIrpw0YBx5WhEgOfqF/sA+lyQ4xjW4woz4UgOdAN2qV4jUIZnECrDGETzsgHbnrg/mwZ6LTgK4/QDZJvvx/bGP31f9vv4bR8a6aKf3RgbZGtIF/3sxNjvQ/MNxxKtPa+R9iYAAAAASUVORK5CYII="
Assets["icon-ahk"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAsVBMVEXu7+/JycnOzs7MzMyxsrKzs7PDw8PGx8fP0NDX2Njt7e20tLS/v7/q6uvDw8Pg4ODGxsbGxsa0tLT29vb09PTv8PHw8fLo6eru7/Ds7e7r7O3X19fDw8Pq6+zS09Tm5ufBwcJjZGTj5OWysrOlpqecnZ1ra2tOTk4+Pj7Jysq+v8CMjY14eHlFRUVBQUE7Ozvy8/Tf4OHc3Nza2tvNzs7FxcaQkZGBgoJyc3NxcnJqamouMmu+AAAAFXRSTlPJz87OhYXR0M7KxYN1Hv3HtLKFTEuE1YDJAAAAqElEQVQYGQXBUUrDQBQAwHlvN2msFqMVEcQP738tLVRQsEWxaZp1pmzjDID1bdz2zzsZopmjrT9ysmsZfTcsUVtsWzbQ3V2B/ZQTxOUwXwOpoG6GPoB0wdPxa10KREYhv4v3DJALZRzy9cUGVHR5qJ9W5wUq+XDJn4vV+ubAksSxNZzuC2SfbRzO8Fa10tcW3X5i4O80PP62GMcZlRkOJTatnSA2R/qIfy2gON7vwGkyAAAAAElFTkSuQmCC"
Assets["icon-github"] := "iVBORw0KGgoAAAANSUhEUgAAABAAAAAQCAMAAAAoLQ9TAAAAflBMVEUAAAAUExMTEhITExMMDAwREBAUEREPDw8AAAAUEhIUExMTExMQDQ0PDw8BAQEBAQEBAQEUFBQUFBQUERETEhISEhIMDAwQEBARDQ0PDw8RDw8UExMNDQ0UEREUEREUFBQTEREAAAATEREAAAATExMODg4AAAAAAAAWFRUPDg8wS7OhAAAAKHRSTlMA99mXN8GiIAvy7sYtEf747OHepJpNQD46NPvn3LGvj4WBdnRpXBkYmAC6rwAAAI1JREFUGBkFwYVhw0AABDC9OYYwllLuZf8FK4FLXa1WVX0B6JIkSTpgSpIkSSY4pG0+XqqqfDVtDjRJbRgYqJNGl9wAzklnn9ID9CV7JTsAdilKRgBWKarkBHBKKsesn67A9Tk5mh+b7XrTcN4myUyd+aftuT2S3KEd+wVDSd6AOuMvf8k7wOe0sLx+wz9dWQ2lRTOprwAAAABJRU5ErkJggg=="
Assets["icon-up"] := "iVBORw0KGgoAAAANSUhEUgAAABgAAAAYBAMAAAASWSDLAAAAIVBMVEUAAADMzMzMzMzMzMzMzMzMzMzMzMzLy8vNzc3Nzc3MzMxj4gTNAAAACnRSTlMAv6R/dMKunn9Wo6rAyAAAAENJREFUGNNjIAWwOCBxrBYjSaxahZDqUg1aAWMzL2IU0DKA6VBgFGCC6mJZxsAowJAF0cVZAOKwT4CqA3GAgP4cEgAA5U8Js3ndDrcAAAAASUVORK5CYII="
Assets["custom-theme"] := "iVBORw0KGgoAAAANSUhEUgAAAeAAAAAgCAMAAAD9lVunAAAAHlBMVEVHcEz////AwMCAgIAAAAD/AAD//wCAgACAAAAAgIBYQi54AAAAAXRSTlMAQObYZgAACJRJREFUeAHEmAGa6yYMhCNpFrz3v3AfCGsEIXbS7fbNfqkDg4DyVyLuQ26lpcip9k2ly5/2Trxexf9lPSbhFLtu/J8LF6L9Iup+etFJltoirR0iJsrsl+M/9cU+9OczU6gL7L72f4DvHFFeCs22JkxTsft2kQBcVWvtB2KtwQO9kpmleO0d9q/jpYwctxx/s7/Zb1PqS183Pkk0dqIY6JkcV/69YDCoQqcPDIPZJZ4pVVFDYDdws4j4wc0HYupd0gG5T9F3QN03r7j9r6cJ4/Um/vSJnevTn4HtfQ+efdr0jX6AcN93BQWT9M7/AWAU5JFqiIeLqQrUEqrA6PYp/hfAHU18LAPWm3h1ka+tgC72N/Ptcy6+1gs/ShwBAqat2a17/7cBu8wyYDO43gGca9bmzpM5hybfYCPeRIzdTZ/Fd6tI9WgNuW9NsCH4N6GvNfjN8ff+yE4D0v6kf5Czt/tHl7rCp9z/DDBcK2B2q3pMI/v1R+2p6t1vAXZdAXb5HehPkpQtx4YjGyIN35DnqjHetQXgPuFSIqfP8KrrBLf+ebsqbOzMBztUZ+T+H3RfXY1x+FT2PwFsTf2pZvAHuyfAPv+HgG3W0g7AtoAPwHkUxy3x8iQzxs9LXe4HaTB9RsM4w86378V/+MmOqquDsShUPEmb3xynN3TEAYdmn4Bfa85g1KSc2C5V5yvSCKvmEn25iLwjDYlmjYMmX1JuKC7ekCwAT1K1uZOjF21eobUqMM87aa48Qw/0tvemQoK2aY0Mcr7S1QlC3T+1+g8KfUvYtFBw/SOKGWxWyhGAzXIGXy6iTfX1C6eINF+eclhY7LzgTnLCES86jagagNP6IkWjc9rPZn7JA+pJBTgnpk2fov9AA9v/0KCN+1fhNrrvfCXUCJ6+69l/AjwUrROwqwGkzNY7GCjHESkMzIA5rSsDrgHUT3tt82Tou6yJh7f6BkS855da/v084rkeS/S6H1Zaqoi6z//EAIgGYbez7+gq19cG0gu/zoKJAqpwP/j5wwkDAXjnB99ay5Nq7TAK8h1LKa8Akhx3fAecujvP/RpogOM1J+DUqhJtlrbZD0xqIjvfXY93dksdPkcUoRx16ETksChWliZh/rbmt9Vz6poHs6nJh51lyD99n+c3KLrfEnhwGyQ9hUHAz37wLV3u5Tcds7cAdxFwU0Hq7jsk37xOxX8BWH4E2LvLCri0rsgrwxXgMTsA76mcO/vuqX5z7x8C/hraA6a/ATwcIq6dH0mtgNcSvQJmd/9WiXcoANvLEt1FfLOfCq3I3jcE/gG4c2ujCJgJW9YM9jGElcV9Wc5flzGH6VO8JZyRbiqEqMeg+eS7Eh6A934CPND0MfsMNuN7Ln9EvQWYGTyv44BfvwDP/6ZVF3/N4EX1dPUEHNj4I2sf3y0SegG4jKjMN41nFOvzjNF92No/MljaU9B9AhQhwO4TMP0VcKAREl7vYCCXV+AC8HFs7mDnO63jgPcvnGyzFG50DklnZNnFGR8l2vERga/ABUwpe0s+KfN3M/28q2mUQdX/obOiRDf/IDlyPFii934CnJL7BIzmZVL5PZfdvGyD39F8doMX/byOLyL30qS6ApbtOxLdqUSXFTBH2JL/dG8U8/WYNavTO3Tymzl8GDQJ/NI3hu7vATb/TcDp5FfAGWAGvNzBDvjwBJ4zmICndRzwm/+r8iVCSBuy528wtQmw/FO8Gei2DcNANOIRVff/PzyA9skXljHTad04YIV3oe3sVTKpkwE4gTB/MD+bGpgwLP8mxXpg4zzVVBfpg7M22DflG6QeI3Q9haNqYJukI7iagkN/c4qW//nPcop+aJ+rI1in8M8ImcLzFJ2uo4BnMsinAqZejDECLvQ5M2AAyCP4/GeRbFzHGDI+RwVYziVV9Tz4qS54py3dDe65SHcHp+jQXxVZ/naRJZGKrKbPfS7CmA9URVa+DgHPeX11nMfq56puhdkwhui4dGDlfyj8DLhci54CeHpdRbObkzEMnZ9PfR76L30IL90j+/izAqvY8tDrNin0N9ukxFfapKZKbtoobZPSdX4csBeARwH4zmyg31vXVrxfJax8qQdhRXfqAdgbwF4udGTA/UKH4NUR3C1kdAshOoLTdQhYv3s9RYteT9GodAdMp+ihMlDbhaA0kx88UmABhp4u8VVdQvSHn094xGi1FB56vVRptr1U2Y/gBnC/VPlWkQUrg4AGUGoL8GqF5qgA935wui1ek7rM0ld9ZVlnqE670FahpV+ddmFtNoS+bzbwhqTPlSKqMSNas6H1g8uVLAhgACg6JYdD/WCk8Fd+MCT0/KkGzn7wSRjiKn3V+awR/RwifjVQkELLH6eObAdS37ULtYhin6tFVGMn9nbhN/vgutMFsJ69c/GV/MwXlR/MLTuVH7w+Ip8uHebV/954yqoHQcc54+AgjUX5QcL+bOjD/rLhbyZ9rhRRzYaA3vBvlyrzTlNVYb5II5GH5steqvWX5Nd24RUIntyAz5+mARKU/ugd/YRwSFjrpMKPvwG6JYf67pYddZOkQFI3qdnS023ZyX7w4e+uY21wVFc/WIgOHEwBr/K5H5L5rR/MOVWGq4QtnZ8H+cVxp8f5SdAcLLLAmtplGIZyAFB9e9OdAmafq4CbTXkt4GQXwuJ4WGkXqk5EK/8I/ry1Gy3nEzA7YLk+08Ccm2MAwS/pM+sm5yeGAxlcBrErJo9JM+td9IC7bbHNttp/DthvAXOTxQvAqAFPS/dnr/SzGsn6fNZtKuAjPAMmv17fBNwUUduAs/8rx4DUv446NB9H/Gl+wI2Q/Lv7sy864N7ren9a6sYzBvEBHTy9vvHqSvdqSvNqS//qSltkgVFz+on8jWP4N/WLBKfp4Uqv13dePmtfLutfTmsu0vjBwqUBtZ//f44LFg0r1fejfz3U7/C18Rta4pqH7xv2iAAAAABJRU5ErkJggg=="
; Background colors data
BackgroundColors := {}
BackgroundColors[1] := {"Red": "FF0000"} ; (255,0,0)
BackgroundColors[2] := {"Orange": "FF7F00"} ; (255,127,0)
BackgroundColors[3] := {"Yellow": "FFFF00"} ; (255,255,0)
BackgroundColors[4] := {"Green": "00FF00"} ; (0,255,0)
BackgroundColors[5] := {"Cyan": "00FFFF"} ; (0,255,255)
BackgroundColors[6] := {"Blue": "0000FF"} ; (0,0,255)
BackgroundColors[7] := {"Purple": "CF00FF"} ; (159,0,255)
BackgroundColors[8] := {"Magenta": "FF00FF"} ; (255,0,255)
BackgroundColors[9] := {"Pink": "FFADB7"} ; (225,173,183)
BackgroundColors[10] := {"SkyBlue": "7FBFfF"} ; (127,191,255)
BackgroundColors[11] := {"DarkRed": "7F0000"} ; (127,0,0)
BackgroundColors[12] := {"DarkYellow": "7F7F00"} ; (127,127,0) [Default]
BackgroundColors[13] := {"DarkGreen": "007F00"} ; (0,127,0)
BackgroundColors[14] := {"DarkCyan": "007F7F"} ; (0,127,127)
BackgroundColors[15] := {"DarkBlue": "00007F"} ; (0,0,127)
BackgroundColors[16] := {"DarkMagenta": "7F007F"} ; (127,0,127)
BackgroundColors[17] := {"Black": "000000"} ; (0,0,0)
BackgroundColors[18] := {"Gray": "7F7F7F"} ; (127,127,127)
BackgroundColors[19] := {"Silver": "BFBFBF"} ; (191,191,191)
BackgroundColors[20] := {"White": "FFFFFF"} ; (255,255,255)
; GDI+ Startup
hGdip := DllCall("Kernel32.dll\LoadLibrary", "Str", "Gdiplus.dll") ; Load module
VarSetCapacity(GdiplusStartupInput, (A_PtrSize = 8 ? 24 : 16), 0) ; GdiplusStartupInput structure
NumPut(1, GdiplusStartupInput, 0, "UInt") ; GdiplusVersion
DllCall("Gdiplus.dll\GdiplusStartup", "PtrP", pToken, "Ptr", &GdiplusStartupInput, "Ptr", 0) ; Initialize GDI+
; Midi Startup
hMidi := DllCall("Kernel32.dll\LoadLibrary", "Str", "Winmm.dll")
VarSetCapacity(strh_MIDIOut, (A_PtrSize = 8 ? 24 : 16), 0)
DllCall("Winmm.dll\midiOutOpen", "UInt", &strh_MIDIOut, "UInt", 0, "UInt", 0, "UInt", 0, "UInt", 0, "UInt")
h_MIDIOut := NumGet(strh_MIDIOut)
MidiVolume := (100 / 100) * 0xFFFF
DllCall("Winmm.dll\midiOutSetVolume", "UInt", h_MIDIOut, "UInt", MidiVolume | MidiVolume << 16)
; Create HICON from Base64 encoded data strings
pIcon16 := GdipCreateFromBase64(Icons["Bulldozer16"], 1) ; 16x16
pIcon32 := GdipCreateFromBase64(Icons["Bulldozer32"], 1) ; 32x32
pTickGreen16 := GdipCreateFromBase64(Icons["TickGreen16"], 1) ; 16x16
pCrossPink16 := GdipCreateFromBase64(Icons["CrossPink16"], 1) ; 16x16
pJoystick16 := GdipCreateFromBase64(Icons["Joystick16"], 1) ; 16x16
pColorAqua16 := GdipCreateFromBase64(Icons["ColorAqua16"], 1) ; 16x16
pColorBlack16 := GdipCreateFromBase64(Icons["ColorBlack16"], 1) ; 16x16
pColorBlue16 := GdipCreateFromBase64(Icons["ColorBlue16"], 1) ; 16x16
pColorFuchsia16 := GdipCreateFromBase64(Icons["ColorFuchsia16"], 1) ; 16x16
pColorGray16 := GdipCreateFromBase64(Icons["ColorGray16"], 1) ; 16x16
pColorGreen16 := GdipCreateFromBase64(Icons["ColorGreen16"], 1) ; 16x16
pColorLime16 := GdipCreateFromBase64(Icons["ColorLime16"], 1) ; 16x16
pColorMaroon16 := GdipCreateFromBase64(Icons["ColorMaroon16"], 1) ; 16x16
pColorNavy16 := GdipCreateFromBase64(Icons["ColorNavy16"], 1) ; 16x16
pColorOlive16 := GdipCreateFromBase64(Icons["ColorOlive16"], 1) ; 16x16
pColorPurple16 := GdipCreateFromBase64(Icons["ColorPurple16"], 1) ; 16x16
pColorRed16 := GdipCreateFromBase64(Icons["ColorRed16"], 1) ; 16x16
pColorSilver16 := GdipCreateFromBase64(Icons["ColorSilver16"], 1) ; 16x16
pColorTeal16 := GdipCreateFromBase64(Icons["ColorTeal16"], 1) ; 16x16
pColorWhite16 := GdipCreateFromBase64(Icons["ColorWhite16"], 1) ; 16x16
pColorYellow16 := GdipCreateFromBase64(Icons["ColorYellow16"], 1) ; 16x16
pColorCustom16 := GdipCreateFromBase64(Icons["ColorCustom16"], 1) ; 16x16
pThemeColor16 := GdipCreateFromBase64(Icons["ThemeColor16"], 1) ; 16x16
pThemeMonochrome16 := GdipCreateFromBase64(Icons["ThemeMonochrome16"], 1) ; 16x16
pThemeCustom16 := GdipCreateFromBase64(Icons["ThemeCustom16"], 1) ; 16x16
pAbout16 := GdipCreateFromBase64(Icons["About16"], 1) ; 16x16
pWebsite16 := GdipCreateFromBase64(Icons["Website16"], 1) ; 16x16
pCrossRed16 := GdipCreateFromBase64(Icons["CrossRed16"], 1) ; 16x16
pReset16 := GdipCreateFromBase64(Icons["Reset16"], 1) ; 16x16
pUndo16 := GdipCreateFromBase64(Icons["Undo16"], 1) ; 16x16
pLevelSelect16 := GdipCreateFromBase64(Icons["LevelSelect16"], 1) ; 16x16
pMouse16 := GdipCreateFromBase64(Icons["Mouse16"], 1) ; 16x16
pProgress16 := GdipCreateFromBase64(Icons["Progress16"], 1) ; 16x16
pSound16 := GdipCreateFromBase64(Icons["Sound16"], 1) ; 16x16
pNumber16 := GdipCreateFromBase64(Icons["Number16"], 1) ; 16x16
p2Undo16 := GdipCreateFromBase64(Icons["2Undo16"], 1) ; 16x16
pColor16 := GdipCreateFromBase64(Icons["Color16"], 1) ; 16x16
pTheme16 := GdipCreateFromBase64(Icons["Theme16"], 1) ; 16x16
pTitleProgress16 := GdipCreateFromBase64(Icons["TitleProgress16"], 1) ; 16x16
pLayeredTiles16 := GdipCreateFromBase64(Icons["LayeredTiles16"], 1) ; 16x16
pHelpDocument16 := GdipCreateFromBase64(Icons["HelpDocument16"], 1) ; 16x16
; Create BITMAP from Base64 encoded data strings
pFontmapPink := GdipCreateFromBase64(Fontmaps["Pink"]) ; 240x24
pFontmapGreen := GdipCreateFromBase64(Fontmaps["Green"]) ; 240x24
pDocsbulldozerpushrock := GdipCreateFromBase64(Assets["bulldozer-push-rock"]) ; 68x32
pDocsfig1 := GdipCreateFromBase64(Assets["fig1"]) ; 64x64
pDocsfig2 := GdipCreateFromBase64(Assets["fig2"]) ; 96x32
pDocsfig3 := GdipCreateFromBase64(Assets["fig3"]) ; 64x64
pDocsfig4 := GdipCreateFromBase64(Assets["fig4"]) ; 96x64
pDocsfig5 := GdipCreateFromBase64(Assets["fig5"]) ; 128x128
pDocsfig6 := GdipCreateFromBase64(Assets["fig6"]) ; 128x128
pDocsiconahk := GdipCreateFromBase64(Assets["icon-ahk"]) ; 16x16
pDocsicongithub := GdipCreateFromBase64(Assets["icon-github"]) ; 16x16
pDocsiconup := GdipCreateFromBase64(Assets["icon-up"]) ; 24x24
pDocscustomtheme := GdipCreateFromBase64(Assets["custom-theme"]) ; 480x32
; Create HBITMAP from Base64 encoded data strings
pIcon16BMP := GdipCreateFromBase64(Icons["Bulldozer16"], 2) ; 16x16
pIcon32BMP := GdipCreateFromBase64(Icons["Bulldozer32"], 2) ; 32x32
; Create a Bitmap object
DllCall("Gdiplus.dll\GdipCreateBitmapFromScan0", "Int", (GuiWidth * DPI), "Int", (GuiHeight * DPI), "Int", 0, "Int", 0x26200A, "Ptr", 0, "PtrP", pBackgroundImage)
; Create a Graphics object associated with pBackgroundImage
DllCall("Gdiplus.dll\GdipGetImageGraphicsContext", "Ptr", pBackgroundImage, "PtrP", pBackgroundGraphics)
; Set the rendering quality of the pBackgroundGraphics Graphics object
DllCall("Gdiplus.dll\GdipSetSmoothingMode", "Ptr", pBackgroundGraphics, "Int", 3) ; None
; Set the interpolation mode of the pBackgroundGraphics Graphics object
DllCall("Gdiplus.dll\GdipSetInterpolationMode", "Ptr", pBackgroundGraphics, "Int", 5) ; NearestNeighbor
; Create a SolidBrush object for the background color of the game
DllCall("Gdiplus.dll\GdipCreateSolidFill", "UInt", "0xFF" BackgroundColor, "PtrP", pBackgroundBrush)
; HTML contents of the documentation file
DocHTML := "<!DOCTYPE html><html><head><meta charset=""utf-8""><meta name=""viewport"" content=""width=device-width,initial-scale=1""><title>Bulldozer Documentation</title><style>html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}h1{font-size:2em;margin: .67em 0}a{background-color:transparent;-webkit-text-decoration-skip:objects}strong{font-weight:inherit;font-weight:bolder}kbd{font-family:monospace,monospace;font-size:1em}img{border-style:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}body,html{color:rgba(0,0,0,.75);font-size:16px;font-family:Arial,Helvetica,sans-serif;font-variant-ligatures:common-ligatures;line-height:1.67;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}blockquote,p,ul{margin:1.2em 0}h1,h2,h3,h4{margin:1.8em 0;line-height:1.33}h1:after,h2:after{content:"""";display:block;position:relative;top: .33em;border-bottom:1px solid hsla(0, 0%, 50%, .33)}ul ul{margin:0}a{color:#0c93e4;text-decoration:underline;text-decoration-skip:ink}a:focus,a:hover{text-decoration:none}blockquote{color:rgba(0, 0, 0, .5);padding-left:1.5em;border-left:5px solid rgba(0,0,0,.1)}table{background-color:transparent;border-collapse:collapse;border-spacing:0}td,th{border-right:1px solid #dcdcdc;padding:8px 12px}td:last-child,th:last-child{border-right:0}td{border-top:1px solid #dcdcdc}kbd{font-family:Arial,Helvetica,sans-serif;background-color:#fff;border:1px solid rgba(63, 63, 63, .25);border-radius:3px;box-shadow:0 1px 0 rgba(63, 63, 63, .25);color:#333;display:inline-block;font-size: .8em;margin:0 .1em;padding: .1em .6em;white-space:nowrap}img{max-width:100%}.docs_html{margin-bottom:180px;margin-left:auto;margin-right:auto;padding-left:30px;padding-right:30px;max-width:750px}</style></head><body class=""stackedit""><div class=""docs_html""><h1 id=""bulldozer"">Bulldozer</h1><h2 id=""index"">Index</h2><ul><li><a href=""#introduction"">Introduction</a></li><li><a href=""#game-objective"">Game Objective</a></li><li><a href=""#movement"">Movement</a></li><li><a href=""#completing-a-level"">Completing a Level</a></li><li><a href=""#hints"">Hints</a></li><li><a href=""#menubar"">Menubar</a><ul><li><a href=""#game"">Game</a><ul><li><a href=""#restart-level"">Restart Level</a></li><li><a href=""#level-select"">Level Select</a></li><li><a href=""#undo-last-move"">Undo Last Move</a></li><li><a href=""#exit"">Exit</a></li></ul></li><li><a href=""#view"">View</a><ul><li><a href=""#layered-tiles"">Layered Tiles</a></li></ul></li><li><a href=""#options"">Options</a><ul><li><a href=""#background-color"">Background Color</a></li><li><a href=""#theme"">Theme</a></li><li><a href=""#sound-effects"">Sound Effects</a></li><li><a href=""#level-number"">Level Number</a></li><li><a href=""#unlimited-undo"">Unlimited Undo</a></li><li><a href=""#mouse-movement"">Mouse Movement</a></li><li><a href=""#titlebar-progress"">Titlebar Progress</a></li><li><a href=""#taskbar-progress"">Taskbar Progress</a></li></ul></li><li><a href=""#help"">Help</a><ul><li><a href=""#website..."">Website...</a></li><li><a href=""#documentation..."">Documentation...</a></li><li><a href=""#about-bulldozer"">About Bulldozer</a></li></ul></li></ul></li><li><a href=""#custom-themes"">Custom Themes</a></li><li><a href=""#hotkeys"">Hotkeys</a></li></ul> <br><p> <a href=""#bulldozer""><img src=""images/icon-up.png"" alt=""arrow-up""></a></p><h2 id=""introduction"">Introduction</h2><p>Bulldozer, developed for <a href=""http://www.autohotkey.com/"">AutoHotkey</a> by <a href=""mailto:westoncampbell@gmail.com?Subject=BulldozerAHK"">Weston Campbell</a>, is a recreation of the original Bulldozer game series created by John 'FlyMan' Hattan (<a href=""https://www.thecodezone.com/"">The Code Zone</a>).</p> <br><p>Bulldozer 1 first appeared in 1994 on the CD-ROM game compilation ""<a href=""https://archive.org/details/24GamesForWindows95"">24 Games for Windows 95</a>"" developed by <a href=""https://www.thecodezone.com/"">The Code Zone</a> for Expert Software, Inc. Bulldozer 2 became available in 2000 on ""Arcade Magic"", also developed for Expert Software, Inc. Bulldozer 1 & Bulldozer 2 were re-released in 2003 on ""Blazing Games"", a compilation of fifty games developed for Cosmi Europe, Ltd. Bulldozer 3 was completed in 2002, but remained unavailable until the 2008 release of <a href=""https://www.thecodezone.com/game/bulldozer.html"">Bulldozer</a> which included all 180 levels from the Bulldozer trilogy. The 2008 version was created using Adobe Flash and is available on a variety of desktop and mobile platforms. Bulldozer is a variation of the popular <a href=""https://en.wikipedia.org/wiki/Sokoban"">Sokoban</a> puzzle game.</p> <br><p>All credit goes to John Hattan for the original idea of the Bulldozer game series. This project was an exercise in GDI+ and string manipulation, and is intended to pay tribute to the game I played in my youth.</p> <br><p><img src=""images/bulldozer-push-rock.png"" alt=""Bulldozer""> <br> <br></p><p><strong>Website Links:</strong></p><p><img src=""images/icon-github.png"" alt=""Github""> Github: <a href=""https://github.com/westoncampbell/BulldozerAHK"">https://github.com/westoncampbell/BulldozerAHK</a></p><p><img src=""images/icon-ahk.png"" alt=""AutoHotkey""> AutoHotkey: <a href=""https://www.autohotkey.com/boards/viewtopic.php?f=6&t=50139"">https://www.autohotkey.com/boards/viewtopic.php?f=6&t=50139</a></p> <br><p> <a href=""#bulldozer""><img src=""images/icon-up.png"" alt=""arrow-up""></a></p><h2 id=""game-objective"">Game Objective</h2><p>The object of Bulldozer is to push each rock on to a target.</p> <br><p> <a href=""#bulldozer""><img src=""images/icon-up.png"" alt=""arrow-up""></a></p><h2 id=""movement"">Movement</h2><p>Move the bulldozer using the arrow keys, or WASD keys, on your keyboard. The bulldozer can move horizontally and vertically.</p><p><img src=""images/Fig1.png"" alt=""Fig 1""></p><p>The bulldozer will not move if one of the following three conditions are true:</p><p><strong>(1) You are trying to push multiple rocks...</strong></p><p><img src=""images/Fig2.png"" alt=""Fig 2""></p><blockquote><p>You can only push one rock at a time!</p></blockquote> <br><p><strong>(2) You are pushing against a wall. . .</strong></p><p><img src=""images/Fig3.png"" alt=""Fig 3""></p><blockquote><p>The bulldozer can't move through walls.</p></blockquote> <br><p><strong>(3) You are pushing a rock against a wall. . .</strong></p><p><img src=""images/Fig4.png"" alt=""Fig 4""></p><blockquote><p>Be careful about pushing rocks against walls. The rock might become stuck, and you'll be forced to restart the level.</p></blockquote><p><img src=""images/Fig5.png"" alt=""Fig 5""></p><blockquote><p>However, it may still be possible to reach the target depending on its position.</p></blockquote><p><img src=""images/Fig6.png"" alt=""Fig 6""></p> <br><p> <a href=""#bulldozer""><img src=""images/icon-up.png"" alt=""arrow-up""></a></p><h2 id=""completing-a-level"">Completing a Level</h2><p>Progress to the next level by moving all of the rocks on to the targets. Each level will have the same number of rocks as targets.</p> <br><p> <a href=""#bulldozer""><img src=""images/icon-up.png"" alt=""arrow-up""></a></p><h2 id=""hints"">Hints</h2><p>Carefully plan your moves. It's easy to get stuck which may force you to restart the level.</p><p>A rock is not locked into position once it is placed on a target.</p> <br><p> <a href=""#bulldozer""><img src=""images/icon-up.png"" alt=""arrow-up""></a></p><h2 id=""menubar"">Menubar</h2><h3 id=""game"">Game</h3><h4 id=""restart-level"">Restart Level</h4><blockquote><p>Reset the level, moving all of the objects to their original starting positions.</p></blockquote><h4 id=""level-select"">Level Select</h4><blockquote><p>Show the level selection screen, allowing navigation to any of the included 180 levels.</p></blockquote><h4 id=""undo-last-move"">Undo Last Move</h4><blockquote><p>Reset all objects from your recent move to their previous positions.</p></blockquote><h4 id=""exit"">Exit</h4><blockquote><p>Completely close the game.</p></blockquote> <br><h3 id=""view"">View</h3><h4 id=""layered-tiles"">Layered Tiles</h4><blockquote><p>Toggle drawing of objects on top of the background elements for custom themes using transparency.</p><p>Depending on the custom theme, ""Layered Tiles"" may improve the appearance of the tiles.</p></blockquote> <br><h3 id=""options"">Options</h3><h4 id=""background-color"">Background Color</h4><blockquote><p>Set the color of the background behind the game objects by choosing from one of the 16 presets or using the custom color picker.</p></blockquote><h4 id=""theme"">Theme</h4><blockquote><p>Change the appearance of the game objects by choosing the ""Color"" or ""Monochrome"" options, or using a <a href=""#custom-themes"">custom theme</a> by selecting an external PNG image file.</p></blockquote><h4 id=""sound-effects"">Sound Effects</h4><blockquote><p>Toggle sound effects.</p></blockquote><h4 id=""level-number"">Level Number</h4><blockquote><p>Toggle the display of the current level number overlayed on the top-right of the game screen.</p></blockquote><h4 id=""unlimited-undo"">Unlimited Undo</h4><blockquote><p>Toggle the allowance of multiple consecutive undo actions.</p></blockquote><h4 id=""mouse-movement"">Mouse Movement</h4><blockquote><p>Toggle the movement of the bulldozer using mouse controls.</p></blockquote><h4 id=""titlebar-progress"">Titlebar Progress</h4><blockquote><p>Toggle the display [Text] of the current level progress in the titlebar of the game window.</p></blockquote><h4 id=""taskbar-progress"">Taskbar Progress</h4><blockquote><p>Toggle the display [ProgressBar] of the current level progress in the game taskbar item.</p></blockquote> <br><h3 id=""help"">Help</h3><h4 id=""website..."">Website...</h4><blockquote><p>Open the game website in the default web browser.</p></blockquote><h4 id=""documentation..."">Documentation...</h4><blockquote><p>Open the game documentation file.</p></blockquote><h4 id=""about-bulldozer"">About Bulldozer</h4><blockquote><p>Open the 'About' screen, displaying information related to the current version of the game.</p></blockquote> <br><p> <a href=""#bulldozer""><img src=""images/icon-up.png"" alt=""arrow-up""></a></p><h2 id=""custom-themes"">Custom Themes</h2><p>Bulldozer supports loading custom themes from an external 480x32 PNG image file.</p><p>Each 32x32 region represents one of the 15 tiles in the game.</p><p> <a href=""images/custom-theme.png""><img src=""images/custom-theme.png"" alt=""Tilemap""></a></p><p>Use an image editor to create a new theme, or choose from any of the available themes from the <a href=""https://github.com/westoncampbell/BulldozerAHK#custom-themes"">Bulldozer website</a>.</p> <br><p> <a href=""#bulldozer""><img src=""images/icon-up.png"" alt=""arrow-up""></a></p><h2 id=""hotkeys"">Hotkeys</h2><p>Several actions in the game can be triggered using a hotkey. See below for a complete list of active hotkeys:</p><table><thead><tr><th><strong>Description</strong></th><th><strong>Area</strong></th><th><strong>Hotkey</strong></th></tr></thead><tbody><tr><td><strong>Restart Level</strong></td><td>Game</td><td><kbd>F2</kbd></td></tr><tr><td><strong>Show 'Level Select'</strong></td><td>Game, About</td><td><kbd>F3</kbd></td></tr><tr><td><strong>Save Screenshot</strong></td><td>Game</td><td><kbd>F12</kbd></td></tr><tr><td><strong>Load Previous Level</strong></td><td>Game</td><td><kbd>PgUp</kbd></td></tr><tr><td><strong>Load Next Level</strong></td><td>Game</td><td><kbd>PgDn</kbd></td></tr><tr><td><strong>Hide Screen</strong></td><td>Game</td><td><kbd>Esc</kbd></td></tr><tr><td><strong>Move Up</strong></td><td>Game</td><td><kbd>↑</kbd>, <kbd>W</kbd>, <kbd>Left Mouse</kbd></td></tr><tr><td><strong>Move Left</strong></td><td>Game</td><td><kbd>←</kbd>, <kbd>A</kbd>, <kbd>Left Mouse</kbd></td></tr><tr><td><strong>Move Down</strong></td><td>Game</td><td><kbd>↓</kbd>, <kbd>S</kbd>, <kbd>Left Mouse</kbd></td></tr><tr><td><strong>Move Right</strong></td><td>Game</td><td><kbd>→</kbd>, <kbd>D</kbd>, <kbd>Left Mouse</kbd></td></tr><tr><td><strong>Exit Game</strong></td><td>Game, Level Select, About Bulldozer</td><td><kbd>Alt</kbd>+<kbd>F4</kbd></td></tr><tr><td><strong>Minimize Game</strong></td><td>Game, Level Select, About Bulldozer</td><td><kbd>Space</kbd></td></tr><tr><td><strong>Default Action</strong></td><td>About Bulldozer, Level Select</td><td><kbd>Enter</kbd></td></tr><tr><td><strong>Show 'About Bulldozer'</strong></td><td>Game, Level Select</td><td><kbd>F1</kbd></td></tr><tr><td><strong>Select Previous Level</strong></td><td>Level Select</td><td><kbd>↑</kbd>, <kbd>←</kbd></td></tr><tr><td><strong>Select Next Level</strong></td><td>Level Select</td><td><kbd>↓</kbd>, <kbd>→</kbd></td></tr><tr><td><strong>Select Previous Level (x5)</strong></td><td>Level Select</td><td><kbd>PgUp</kbd></td></tr><tr><td><strong>Select Next Level (x5)</strong></td><td>Level Select</td><td><kbd>PgDn</kbd></td></tr><tr><td><strong>Select First Level</strong></td><td>Level Select</td><td><kbd>Home</kbd></td></tr><tr><td><strong>Select Last Level</strong></td><td>Level Select</td><td><kbd>End</kbd></td></tr><tr><td><strong>Load Selected Level</strong></td><td>Level Select</td><td><kbd>Enter</kbd></td></tr></tbody></table> <br><p> <a href=""#bulldozer""><img src=""images/icon-up.png"" alt=""arrow-up""></a></p></div></body></html>"
; Set tray icon options
Menu, Tray, Icon, % "HICON:*" pIcon16 ; Tray icon
Menu, Tray, Tip, Bulldozer ; TrayTip Text
Menu, Tray, NoStandard ; Remove non-custom menu items
Menu, Tray, Add, &Hide Icon, DisableTrayIcon ; Exit script
;Menu, Tray, Add, E&xit, MenuHandler ; Exit script
}
OnUnload(ExitReason, ExitCode) {
Global ; Assume-global mode
; Release resources used by the Image objects
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pTheme)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pFontmapPink)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pFontmapGreen)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pBackgroundImage)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pIcon32BMP)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocsbulldozerpushrock)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocsfig1)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocsfig2)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocsfig3)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocsfig4)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocsfig5)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocsfig6)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocsiconahk)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocsicongithub)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocsiconup)
DllCall("Gdiplus.dll\GdipDisposeImage", "Ptr", pDocscustomtheme)
; Delete Graphics objects
DllCall("Gdiplus.dll\GdipDeleteGraphics", "Ptr", pBackgroundGraphics)
DllCall("Gdiplus.dll\GdipDeleteGraphics", "Ptr", pControlGraphics)
; Delete Brush objects
DllCall("Gdiplus.dll\GdipDeleteBrush", "Ptr", pBackgroundBrush)
; Clean up resources used by GDI+
DllCall("Gdiplus.dll\GdiplusShutdown", "Ptr", pToken)
; Free module from memory
DllCall("Kernel32.dll\FreeLibrary", "Ptr", hGdip)
; Destroy icons and free memory
DllCall("User32.dll\DestroyIcon", "Ptr", pIcon16)
DllCall("User32.dll\DestroyIcon", "Ptr", pIcon32)
DllCall("User32.dll\DestroyIcon", "Ptr", pTickGreen16)
DllCall("User32.dll\DestroyIcon", "Ptr", pCrossPink16)
DllCall("User32.dll\DestroyIcon", "Ptr", pJoystick16)
DllCall("User32.dll\DestroyIcon", "Ptr", pColorAqua16)
DllCall("User32.dll\DestroyIcon", "Ptr", pColorBlack16)
DllCall("User32.dll\DestroyIcon", "Ptr", pColorBlue16)
DllCall("User32.dll\DestroyIcon", "Ptr", pColorFuchsia16)
DllCall("User32.dll\DestroyIcon", "Ptr", pColorGray16)
DllCall("User32.dll\DestroyIcon", "Ptr", pColorGreen16)
DllCall("User32.dll\DestroyIcon", "Ptr", pColorLime16)
DllCall("User32.dll\DestroyIcon", "Ptr", pColorMaroon16)
DllCall("User32.dll\DestroyIcon", "Ptr", pColorNavy16)
DllCall("User32.dll\DestroyIcon", "Ptr", pColorOlive16)
DllCall("User32.dll\DestroyIcon", "Ptr", pColorPurple16)
DllCall("User32.dll\DestroyIcon", "Ptr", pColorRed16)
DllCall("User32.dll\DestroyIcon", "Ptr", pColorSilver16)
DllCall("User32.dll\DestroyIcon", "Ptr", pColorTeal16)
DllCall("User32.dll\DestroyIcon", "Ptr", pColorWhite16)
DllCall("User32.dll\DestroyIcon", "Ptr", pColorYellow16)
DllCall("User32.dll\DestroyIcon", "Ptr", pColorCustom16)
DllCall("User32.dll\DestroyIcon", "Ptr", pThemeMonochrome16)
DllCall("User32.dll\DestroyIcon", "Ptr", pThemeCustom16)
DllCall("User32.dll\DestroyIcon", "Ptr", pAbout16)
DllCall("User32.dll\DestroyIcon", "Ptr", pWebsite16)
DllCall("User32.dll\DestroyIcon", "Ptr", pCrossRed16)
DllCall("User32.dll\DestroyIcon", "Ptr", pReset16)
DllCall("User32.dll\DestroyIcon", "Ptr", pUndo16)
DllCall("User32.dll\DestroyIcon", "Ptr", pLevelSelect16)
DllCall("User32.dll\DestroyIcon", "Ptr", pMouse16)
DllCall("User32.dll\DestroyIcon", "Ptr", pProgress16)
DllCall("User32.dll\DestroyIcon", "Ptr", pSound16)
DllCall("User32.dll\DestroyIcon", "Ptr", pNumber16)
DllCall("User32.dll\DestroyIcon", "Ptr", p2Undo16)
DllCall("User32.dll\DestroyIcon", "Ptr", pColor16)
DllCall("User32.dll\DestroyIcon", "Ptr", pTheme16)
DllCall("User32.dll\DestroyIcon", "Ptr", pTitleProgress16)
DllCall("User32.dll\DestroyIcon", "Ptr", pLayeredTiles16)
DllCall("User32.dll\DestroyIcon", "Ptr", pHelpDocument16)
; Free module from memory
DllCall("Kernel32.dll\FreeLibrary", "UInt", hMidi)
; Midi Shutdown
DllCall("Winmm.dll\midiOutClose", "UInt", h_MIDIOut)
; Write values to INI file
IniWrite, % TitlebarProgress, Bulldozer.ini, Options, TitlebarProgress
IniWrite, % TaskbarProgress, Bulldozer.ini, Options, TaskbarProgress
IniWrite, % BackgroundColor, Bulldozer.ini, Options, BackgroundColor
IniWrite, % Theme, Bulldozer.ini, Options, Theme
IniWrite, % UnlimitedUndo, Bulldozer.ini, Options, UnlimitedUndo
IniWrite, % Sound, Bulldozer.ini, Options, Sound
IniWrite, % LevelNumber, Bulldozer.ini, Options, LevelNumber
IniWrite, % MouseMovement, Bulldozer.ini, Options, MouseMovement
IniWrite, % LevelNum, Bulldozer.ini, Options, LastLevel
IniWrite, % LayeredTiles, Bulldozer.ini, Options, LayeredTiles
For Index, Color In UserColors {
IniWrite, % Format("{:06X}", Color), Bulldozer.ini, Options, % "UserColor" A_Index
}
StringSolved := ST_Glue(Solved, "") ; Run-length encoded solved level data
IniWrite, % RLE_Encode(StringSolved), Bulldozer.ini, Options, Solved
}
ThemeSet(Tileset, Update := 0) {
Global ; Assume-global mode
ThemeMatch := "" ; Initialize variable
For ThemeName, ThemeString In Themes {
If (ThemeName = (Theme := Tileset)) {
Menu, ThemesMenu, Check, % (ThemeMatch := ThemeName)
} Else {
If (!FileExist(Tileset)) {
Menu, ThemesMenu, Check, Color
}
Menu, ThemesMenu, Uncheck, % ThemeName
}
}
pTheme := (FileExist(Tileset) ? GdipCreateFromPNG(Tileset) : GdipCreateFromBase64(Themes[(ThemeMatch ? ThemeMatch : (Theme := "Color"))]))
Menu, ThemesMenu, % (!ThemeMatch && FileExist(Tileset) ? "Check" : "Uncheck"), &Custom...
If (Update) {
BackgroundLoad(TempMap)
}
}
BackgroundColorSet(ColorHex) {
Global ; Assume-global mode
ColorMatch := "" ; Initialize variable
; Set brush color
DllCall("Gdiplus.dll\GdipCreateSolidFill", "UInt", "0xFF" (BackgroundColor := ColorHex), "PtrP", pBackgroundBrush)
BackgroundLoad(TempMap) ; Generate background with new color
For K, V In BackgroundColors {
For ColorName, ColorCode In BackgroundColors[K] {
If (ColorCode = BackgroundColor) {
Menu, ColorsMenu, Check, % (ColorMatch := ColorName)
} Else {
Menu, ColorsMenu, Uncheck, % ColorName
}
}
}
Menu, ColorsMenu, % (!ColorMatch ? "Check" : "Uncheck"), &Custom...
}
GuiCreate() {
Global ; Assume-global mode
Static Init := GuiCreate() ; Call function
; Menubar > Game -----------------------------------------------------------
Menu, GameMenu, Add, &Restart Level`tF2, MenuHandler
Menu, GameMenu, Add, &Level Select`tF3, MenuHandler
Menu, GameMenu, Add ; Separator
Menu, GameMenu, Add, &Undo Last Move`tCtrl+Z, MenuHandler
Menu, GameMenu, Add ; Separator
Menu, GameMenu, Add, E&xit`tAlt+F4, MenuHandler
Menu, GameMenu, Disable, &Undo Last Move`tCtrl+Z
Menu, GameMenu, Icon, &Restart Level`tF2, % "HICON:*" pReset16
Menu, GameMenu, Icon, &Level Select`tF3, % "HICON:*" pLevelSelect16
Menu, GameMenu, Icon, &Undo Last Move`tCtrl+Z, % "HICON:*" pUndo16
Menu, GameMenu, Icon, E&xit`tAlt+F4, % "HICON:*" pCrossRed16
; Menubar > View -----------------------------------------------------------
Menu, ViewMenu, Add, &Layered Tiles, MenuHandler
Menu, ViewMenu, % (!LayeredTiles ? "Uncheck" : "Check"), &Layered Tiles
Menu, ViewMenu, Icon, &Layered Tiles, % "HICON:*" pLayeredTiles16
; Menubar > Options > Background Color -------------------------------------
ColorMatch := "" ; Initialize variable
For K, V In BackgroundColors {
For ColorName, ColorCode In BackgroundColors[K] {
Menu, ColorsMenu, Add, % ColorName, MenuHandler
;Menu, ColorsMenu, Icon, % ColorName, % "HICON:*" pColor%ColorName%16
If (ColorCode = BackgroundColor) {
Menu, ColorsMenu, Check, % (ColorMatch := ColorName)
}
}
}
Menu, ColorsMenu, Add ; Separator
Menu, ColorsMenu, Add, &Custom..., MenuHandler
Menu, ColorsMenu, % (ColorMatch ? "Uncheck" : "Check"), &Custom...
Menu, ColorsMenu, Icon, &Custom..., % "HICON:*" pColorCustom16
; Menubar > Options > Theme ------------------------------------------------
ThemeMatch := "" ; Initialize variable
For ThemeName, ThemeString In Themes {
Menu, ThemesMenu, Add, % ThemeName, MenuHandler
Menu, ThemesMenu, Icon, % ThemeName, % "HICON:*" pTheme%ThemeName%16
If (ThemeName = Theme) {
Menu, ThemesMenu, Check, % (ThemeMatch := ThemeName)
}
}
Menu, ThemesMenu, Add ; Separator
Menu, ThemesMenu, Add, &Custom..., MenuHandler
Menu, ThemesMenu, % (ThemeMatch ? "Uncheck" : "Check"), &Custom...
Menu, ThemesMenu, Icon, &Custom..., % "HICON:*" pThemeCustom16
; Menubar > Options --------------------------------------------------------
Menu, OptionsMenu, Add, &Background Color, :ColorsMenu
Menu, OptionsMenu, Add, &Theme, :ThemesMenu
Menu, OptionsMenu, Add ; Separator
Menu, OptionsMenu, Add, Sound Effects, MenuHandler
Menu, OptionsMenu, Add, Level Number, MenuHandler
Menu, OptionsMenu, Add, Unlimited Undo, MenuHandler
Menu, OptionsMenu, Add, Mouse Movement, MenuHandler
Menu, OptionsMenu, Add, Titlebar Progress, MenuHandler
Menu, OptionsMenu, Add, Taskbar Progress, MenuHandler
Menu, OptionsMenu, % (Sound ? "Check" : "Uncheck"), Sound Effects
Menu, OptionsMenu, % (LevelNumber ? "Check" : "Uncheck"), Level Number
Menu, OptionsMenu, % (UnlimitedUndo ? "Check" : "Uncheck"), Unlimited Undo
Menu, OptionsMenu, % (MouseMovement ? "Check" : "Uncheck"), Mouse Movement
Menu, OptionsMenu, % (TitlebarProgress ? "Check" : "Uncheck"), Titlebar Progress
Menu, OptionsMenu, % (TaskbarProgress ? "Check" : "Uncheck"), Taskbar Progress
Menu, OptionsMenu, Icon, &Background Color, % "HICON:*" pColor16
Menu, OptionsMenu, Icon, &Theme, % "HICON:*" pTheme16
Menu, OptionsMenu, Icon, Sound Effects, % "HICON:*" pSound16
Menu, OptionsMenu, Icon, Level Number, % "HICON:*" pNumber16
Menu, OptionsMenu, Icon, Unlimited Undo, % "HICON:*" p2Undo16
Menu, OptionsMenu, Icon, Mouse Movement, % "HICON:*" pMouse16
Menu, OptionsMenu, Icon, Titlebar Progress, % "HICON:*" pTitleProgress16
Menu, OptionsMenu, Icon, Taskbar Progress, % "HICON:*" pProgress16
; Menubar > Help -----------------------------------------------------------
Menu, HelpMenu, Add, &Website..., MenuHandler
Menu, HelpMenu, Add, &Documentation..., MenuHandler
Menu, HelpMenu, Add ; Separator
Menu, HelpMenu, Add, &About Bulldozer`tF1, MenuHandler
Menu, HelpMenu, Icon, &Website..., % "HICON:*" pWebsite16
Menu, HelpMenu, Icon, &Documentation..., % "HICON:*" pHelpDocument16
Menu, HelpMenu, Icon, &About Bulldozer`tF1, % "HICON:*" pAbout16
; Menubar ------------------------------------------------------------------
Menu, Menubar, Add, &Game, :GameMenu
Menu, Menubar, Add, &View, :ViewMenu
Menu, Menubar, Add, &Options, :OptionsMenu
Menu, Menubar, Add, &Help, :HelpMenu
; Parent -------------------------------------------------------------------
Gui, Parent: Menu, Menubar
Gui, Parent: +LastFound +OwnDialogs -Resize +HwndhBulldozer
Gui, Parent: Margin, 0, 0
Gui, Parent: Color, % GuiBGCol
Gui, Parent: Add, Edit, x0 y0 w0 h0 0x800 vCatch ; Catch keypresses to avoid dinging
; About --------------------------------------------------------------------
AboutText := "Bulldozer is a clone of the original Bulldozer game series created by John 'FlyMan' Hattan (The Code Zone).`n`nThe object of Bulldozer is to push all of the rocks to the targets. Move the bulldozer using the keyboard's WASD or arrow keys. The bulldozer can only push one rock at a time, and it cannot pull rocks. You will advance to the next level when each rock has been placed on a target.`n`nDeveloped for AutoHotkey by:`nWeston Campbell <westoncampbell@gmail.com>"
Gui, About: +ParentParent +HWNDhAbout -Caption -Border
Gui, About: Margin, 0, 0
Gui, About: Color, % GuiBGCol
Gui, About: Add, Picture, x20 y20 w32 h32, % "HBITMAP:*" pIcon32BMP
Gui, About: Font, c404040 S18 Bold, Arial
Gui, About: Add, Text, % "x72 yp w" GuiWidth - 144 " h32 0x201", % App_Name
Gui, About: Font, c404040 S11 Norm, Arial
Gui, About: Add, Text, % "x72 y+0 w" GuiWidth - 144 " h32 0x201", % "Revision " App_Version " (" App_Date ")"
Gui, About: Add, Edit, % "x20 y+10 w" GuiWidth - 40 " h" GuiHeight - 178 " 0x800 +Multi -TabStop", % AboutText
Gui, About: Font ; Reset font options
Gui, About: Add, Text, % "x-20 y" GuiHeight - 64 " w" GuiWidth + 40 " h1 0x10" ; Divider
Gui, About: Add, Button, % "x" GuiWidth - 100 " y" GuiHeight - 44 " w80 h24 vAboutOK gControlHandler +Default", OK
; Level Select -------------------------------------------------------------
Menu, LevelSelectMenu, Add, &Play, MenuHandler
Menu, LevelSelectMenu, Add ; Separator
Menu, LevelSelectMenu, Add, &Solved, MenuHandler
Menu, LevelSelectMenu, Add, &Unsolved, MenuHandler
Menu, LevelSelectMenu, Icon, &Play, % "HICON:*" pJoystick16
Menu, LevelSelectMenu, Icon, &Solved, % "HICON:*" pTickGreen16
Menu, LevelSelectMenu, Icon, &Unsolved, % "HICON:*" pCrossPink16
Gui, LevelSelect: +ParentParent +HWNDhLevelSelect -Caption -Border
Gui, LevelSelect: Margin, 0, 0
Gui, LevelSelect: Color, % GuiBGCol
Gui, LevelSelect: Add, Listview, % "x10 y10 w" GuiWidth - 20 " h" GuiHeight - 84 " hwndHLV vVLV List -Multi LV0x10000 LV0x400 gControlHandler AltSubmit", Col1
Gui, LevelSelect: Default
HIML := IL_Create(2)
IL_Add(HIML, "HICON:*" pTickGreen16)
IL_Add(HIML, "HICON:*" pCrossPink16)
LV_SetImageList(HIML)
Loop, 180 {
LV_Add(Solved[A_Index] = "S" ? "Icon1" : "Icon2", "Level " A_Index)
}
Gui, LevelSelect: Font ; Reset font options
Gui, LevelSelect: Add, Text, % "x-20 y" GuiHeight - 64 " w" GuiWidth + 40 " h1 0x10" ; Divider
Gui, LevelSelect: Font, cA9A9A9 Italic, Arial
Gui, LevelSelect: Add, Text, % "x" 20 " y" GuiHeight - 44 " w260 h24 0x200", Right-click level for more options!
Gui, LevelSelect: Font
Gui, LevelSelect: Add, Button, % "x" GuiWidth - 100 " y" GuiHeight - 44 " w80 h24 vLevelSelectCancel gControlHandler +Default", Cancel
; Game ---------------------------------------------------------------------
Gui, Game: +ParentParent +HWNDhGame -Caption -Border
Gui, Game: Margin, 0, 0
Gui, Game: Color, % GuiBGCol
Gui, Game: Add, Picture, % "x" 0 " y" 0 " w" (GuiWidth * DPI) " h" (GuiHeight * DPI) " vGameImage HwndhBackground 0xE" ; Background image
; Get pointer to control graphics image
DllCall("Gdiplus.dll\GdipCreateFromHWND", "Ptr", hBackground, "PtrP", pControlGraphics)
SubclassControl(hBackground, "BgSubclassProc") ; Subclass static image
ThemeSet(Theme)
MapSet(LastLevel)
Gui, LevelSelect: Show, Hide x0 y0 w%GuiWidth% h%GuiHeight%
Gui, About: Show, Hide x0 y0 w%GuiWidth% h%GuiHeight%
Gui, Game: Show, x0 y0 w%GuiWidth% h%GuiHeight%
Gui, Parent: Show, Center w%GuiWidth% h%GuiHeight%, % "Bulldozer - Level " LevelNum (TitlebarProgress ? " (" PercentText "%) [" RemainderText "]" : "")
; WM_SETICON - Set icons (TitleBar, Taskbar, ...)
SendMessage, 0x80, 0, pIcon16,, ahk_id %hBulldozer% ; ICON_SMALL (16x16)
SendMessage, 0x80, 1, pIcon32,, ahk_id %hBulldozer% ; ICON_BIG (32x32)
}
MenuItemCheck() {
Global ; Assume-global mode
; Enable/Disable 'Undo Last Move' menu item
Menu, GameMenu, % (UndoArray.MaxIndex() ? "Enable" : "Disable"), &Undo Last Move`tCtrl+Z
UndoState := (UndoArray.MaxIndex() ? 1 : 0)
}
LevelSelectGuiContextMenu(GuiHwnd, CtrlHwnd, EventInfo, IsRightClick, X, Y) {
If (A_GuiControl = "VLV") {
If (LV_GetNext() <> "0") {
Menu, LevelSelectMenu, Show
}
}
}
UpdateLV() {
Global ; Assume-global mode
Gui, LevelSelect: Default
Loop, 180 {
LV_Modify(A_Index, (Solved[A_Index] = "S" ? "Icon1" : "Icon2"))
}
LV_Modify(LevelNum, "Select Vis")
}
ParentGuiClose(GuiHwnd) {
Global ; Assume-global mode
If (GuiHwnd = hBulldozer) {
ExitApp ; Terminate the script unconditionally
}
}
MenuHandler(ItemName, ItemPos, MenuName) {
Global ; Assume-global mode
If (MenuName = "GameMenu") {
If (InStr(ItemName, "&Restart Level")) {
LevelClearCheck(500)
; HOTFIX: Levels where bulldozer begins on target tile
If (LevelNum = "64" || LevelNum = "127") {
Maps[LevelNum] := MapBackup ; Replace level data
}
MapSet(LevelNum)
ShowHideWindow()
} Else If (InStr(ItemName, "&Level Select")) {
UpdateLV()
ShowHideWindow("LevelSelect", True)
} Else If (InStr(ItemName, "&Undo Last Move")) {
UndoMove()
} Else If (InStr(ItemName, "E&xit")) {
ExitApp ; Terminate the script unconditionally
}
} Else If (MenuName = "ViewMenu") {
If (InStr(ItemName, "&Layered Tiles")) {
LayeredTiles := !LayeredTiles
Menu, ViewMenu, % (LayeredTiles ? "Check" : "Uncheck"), &Layered Tiles
BackgroundLoad(TempMap)
}
} Else If (MenuName = "ColorsMenu") {
If (InStr(ItemName, "&Custom...")) {
BackgroundColorSet(ChooseColor("0x" BackgroundColor, hBulldozer, UserColors*))
} Else {
For K, V In BackgroundColors {
For ColorName, ColorCode In BackgroundColors[K] {
If (ColorName = ItemName) {
BackgroundColorSet(ColorCode)
Break
}
}
}
}
} Else If (MenuName = "ThemesMenu") {
If (InStr(ItemName, "&Custom...")) {
;Gui, Parent: +OwnDialogs
FileSelectFile, CustomTheme, 3,, Select image..., PNG (*.png)
If (ErrorLevel) {
return
}
ThemeSet(CustomTheme, true)
} Else {
ThemeSet(ItemName, true)
}
} Else If (MenuName = "OptionsMenu") {
If (InStr(ItemName, "Level Number")) {
LevelNumber := !LevelNumber
Menu, OptionsMenu, % (LevelNumber ? "Check" : "Uncheck"), Level Number
BackgroundLoad(TempMap)
} Else If (InStr(ItemName, "Sound Effects")) {
Sound := !Sound
Menu, OptionsMenu, % (Sound ? "Check" : "Uncheck"), Sound Effects
} Else If (InStr(ItemName, "Unlimited Undo")) {
UnlimitedUndo := !UnlimitedUndo
LastUndo := UndoArray.Pop()
UndoArray := []
UndoArray.Push(LastUndo)
Menu, OptionsMenu, % (UnlimitedUndo ? "Check" : "Uncheck"), Unlimited Undo
} Else If (InStr(ItemName, "Mouse Movement")) {
MouseMovement := !MouseMovement
Menu, OptionsMenu, % (MouseMovement ? "Check" : "Uncheck"), Mouse Movement
} Else If (InStr(ItemName, "Taskbar Progress")) {
TaskbarProgress := !TaskbarProgress
Menu, OptionsMenu, % (TaskbarProgress ? "Check" : "Uncheck"), Taskbar Progress
LevelClearCheck(500)
} Else If (InStr(ItemName, "Titlebar Progress")) {
TitlebarProgress := !TitlebarProgress
Menu, OptionsMenu, % (TitlebarProgress ? "Check" : "Uncheck"), Titlebar Progress
LevelClearCheck(500)
}
} Else If (MenuName = "HelpMenu") {
If (InStr(ItemName, "&About Bulldozer")) {
ShowHideWindow("About", True)
} Else If (InStr(ItemName, "&Website...")) {
Run, https://autohotkey.com/boards/viewtopic.php?f=6&t=50139
} Else If (InStr(ItemName, "&Documentation...")) {
If (GetKeyState("Ctrl", "P")) {
Try {
Run, https://github.com/westoncampbell/BulldozerAHK/blob/master/README.md
}
return
}
If (!InStr(FileExist("BulldozerDocs"), "D")) {
BuildDocs()
} Else {
CheckDocs()
}
Try {
Run, BulldozerDocs\index.html
} Catch {
Run, https://github.com/westoncampbell/BulldozerAHK/blob/master/README.md
}
}
} Else If (MenuName = "Tray") {
If (InStr(ItemName, "E&xit")) {
ExitApp ; Terminate the script unconditionally
}
} Else If (MenuName = "LevelSelectMenu") {
Gui, LevelSelect: Default
LVSel := LV_GetNext()
If (InStr(ItemName, "&Solved")) {
If (Solved[LVSel] = "S") {
return
}
Solved[LVSel] := "S"
} Else If (InStr(ItemName, "&Unsolved")) {
If (Solved[LVSel] = "U") {
return
}
Solved[LVSel] := "U"
} Else If (InStr(ItemName, "&Play")) {
MapSet(LV_GetNext())
ShowHideWindow()
return
}
UpdateLV()
LV_Modify(LVSel, "Select Vis")
BackgroundLoad(TempMap)
}
}
ControlHandler() {
Global ; Assume-global mode
If (A_GuiControl = "LevelSelectCancel") {
ShowHideWindow()
} Else If (A_GuiControl = "AboutOK") {
ShowHideWindow()
} Else If (A_GuiControl = "VLV") {
If (A_GuiEvent = "Normal" && LV_GetNext() <> "0") {
MapSet(LV_GetNext())
ShowHideWindow()
}
}
}
WM_CTLCOLORBTN(wParam, lParam, Msg, Hwnd) {
Global ; Assume-global mode
Static Init := OnMessage(0x0135, "WM_CTLCOLORBTN")
; Paint button border color to match Gui background color
return DllCall("Gdi32.dll\CreateSolidBrush", "UInt", "0x" GuiBGCol, "UPtr")
}
WM_KEYDOWN(wParam, lParam, Msg, Hwnd) {
Global ; Assume-global mode
Static Init := OnMessage(0x0100, "WM_KEYDOWN") ; Call function
KF_REPEAT := (lParam & 0x40000000)
IsAbout := DllCall("IsWindowVisible", "UInt", WinExist("ahk_id " hAbout))
IsLevelSelect := DllCall("IsWindowVisible", "UInt", WinExist("ahk_id " hLevelSelect))
IsGame := DllCall("IsWindowVisible", "UInt", WinExist("ahk_id " hGame))
VK := Format("{:x}", wParam) ; Get virtual-key code
; Minimize Window (Boss Key)
If (VK = "20") { ; SPACE
WinMinimize, ahk_id %hBulldozer%
}
If (IsLevelSelect) {
If (A_DefaultGui <> "LevelSelect") {
Gui, LevelSelect: Default
}
If (VK = "1B") { ; ESC
ShowHideWindow()
} Else If (VK = "d") { ; ENTER
MapSet(LV_GetNext())
ShowHideWindow()
} Else If (VK = "26" || VK = "25") { ; UP ARROW/LEFT ARROW
LV_Modify((LV_GetNext() = 1 ? "180" : LV_GetNext() - 1), "Select Vis")
} Else If (VK = "28" || VK = "27") { ; DOWN ARROW/RIGHT ARROW
LV_Modify((LV_GetNext() = 180 ? "1" : LV_GetNext() + 1), "Select Vis")
} Else If (VK = "24") { ; HOME
LV_Modify("1", "Select Vis")
} Else If (VK = "23") { ; END
LV_Modify("180", "Select Vis")
} Else If (VK = "21") { ; PAGE UP
LV_Modify(LV_GetNext() = 1 ? 180 + (LV_GetNext() - 6) : (LV_GetNext() - 5) < 1 ? 180 + (LV_GetNext() - 5) : LV_GetNext() - 5, "Select Vis")
} Else If (VK = "22") { ; PAGE DOWN
LV_Modify(LV_GetNext() = 1 ? LV_GetNext() + 4 : (LV_GetNext() + 5) > 180 ? (LV_GetNext() + 5) - 180 : LV_GetNext() + 5, "Select Vis")
}
return
} Else If (IsAbout) {
If (A_DefaultGui <> "About") {
Gui, About: Default
}
If (VK = "1B") { ; ESC
ShowHideWindow()
} Else If (VK = "d") { ; ENTER
ShowHideWindow()
}
return
} Else If (IsGame) {
If (A_DefaultGui <> "Game") {
Gui, Game: Default
}
GuiControl, Parent: Focus, Catch
If (VK = "26" || VK = "57") { ; UP ARROW/W
Move(0, -1)
} Else If (VK = "25" || VK = "41") { ; LEFT ARROW/A
Move(-1, 0)
} Else If (VK = "28" || VK = "53") { ; DOWN ARROW/S
Move(0, 1)
} Else If (VK = "27" || VK = "44") { ; RIGHT ARROW/D
Move(1, 0)
} Else If (VK = "21") { ; PAGE UP
MapSet(LevelNum = "1" ? "180" : LevelNum - 1)
} Else If (VK = "22") { ; PAGE DOWN
MapSet(LevelNum = "180" ? "1" : LevelNum + 1)
} Else If (VK = "1B") { ; ESC
ExitApp ; Terminate the script unconditionally
} Else If (VK = "8") { ; Backspace
UndoMove()
} Else If (VK = "7b") { ; F12
Menu, Tray, Icon
SSFilename := "Bulldozer_Lv" LevelNum "_" A_Now ".png"
GdipSaveToPNG(pBackgroundImage, SSFilename)
TrayTip, Bulldozer, % "Screenshot Saved!`n" A_ScriptDir "\" SSFilename
SetTimer, DisableTrayIcon, -10000 ; 10 seconds
}
return
}
}
DisableTrayIcon() {
Global ; Assume-global mode
If (!A_IconHidden) {
Menu, Tray, NoIcon
}
}
UndoMove() {
Global ; Assume-global mode
IsAbout := DllCall("IsWindowVisible", "UInt", WinExist("ahk_id " hAbout))
IsLevelSelect := DllCall("IsWindowVisible", "UInt", WinExist("ahk_id " hLevelSelect))
If (IsAbout || IsLevelSelect) {
return
}
MidiSound(MidiHistory.Pop())
If (Undo := UndoArray.Pop()) {
TempMap := Undo[Undo.MaxIndex(), "M"]
BackgroundUpdate(Undo)
LevelClearCheck(500)
}
}
Move(X, Y) {
Global ; Assume-global mode
; Get position of bulldozer
PosNum := RegExMatch(TempMap, "(4|5|6|7)")
; Get positions of next characters
PosNumX1 := (PosNum + (Y ? Y * 20 : X))
PosNumX2 := (PosNum + (Y ? (Y + Y) * 20 : (X + X)))
; Get character string value of next positions
PosChrX1 := SubStr(TempMap, (PosNum + (Y ? Y * 20 : X)), 1)
PosChrX2 := SubStr(TempMap, (PosNum + (Y ? (Y + Y) * 20 : (X + X))), 1)
; Replace character with value from original map
Char := SubStr(LevelNum = "64" || LevelNum = "127" ? Maps%LevelNum% : Maps[LevelNum], PosNum, 1)
ReplaceChar := (RegExMatch(Char, "(2|4|5|6|7)") ? "0" : RegExMatch(Char, "(1|3)") ? "1" : Char)
; Face bulldozer in direction of requested movement
Bulldozer := (PosNumX1 = PosNum - 1 ? "6" : PosNumX1 = PosNum + 1 ? "7" : PosNumX1 = PosNum - 20 ? "4" : "5")
If (PosChrX1 = "") { ; Outside playing area
MidiSound("69")
MapUpdate(Bulldozer "|" PosNum)
return
}
If (RegExMatch(PosChrX1, "(8|9|A|B|C|D|E|F)")) { ; Boundaries
MidiSound("86")
MapUpdate(Bulldozer "|" PosNum)
return
}
If (PosChrX1 = "3") { ; Target+Boulder
If (RegExMatch(PosChrX2, "(2|3|8|9|A|B|C|D|E|F)")) { ; Boundaries
MidiSound("86")
MapUpdate(Bulldozer "|" PosNum)
return
}
; Target / Everything else
MidiSound(PosChrX2 = "1" ? "81" : "70")
MapUpdate((PosChrX2 = "1" ? "3" : "2") "|" PosNumX2, Bulldozer "|" PosNumX1, ReplaceChar "|" PosNum)
return
}
If (PosChrX1 = "2") { ; Boulder
If (RegExMatch(PosChrX2, "(2|3|8|9|A|B|C|D|E|F)")) { ; Boundaries
MidiSound("86")
MapUpdate(Bulldozer "|" PosNum)
return
}
; Target / Everything else
MidiSound(PosChrX2 = "1" ? "81" : "70")
MapUpdate((PosChrX2 = "1" ? "3" : "2") "|" PosNumX2, Bulldozer "|" PosNumX1, ReplaceChar "|" PosNum)
return
}
; Everything else
MidiSound("69") ; Empty space
MapUpdate(Bulldozer "|" PosNumX1, ReplaceChar "|" PosNum)
}
ProgressCheck() {
Global ; Assume-global mode
Static PrevLevel := ""
If (PosChrX1 = "2" || PosChrX1 = "3" || PrevLevel <> LevelNum) {
StrReplace(TempMap, "3", "3", BoulderTargetCount)
PercentText := Round((BoulderTargetCount / (InitTargetCount + InitBoulderTargetCount) * 100), 0)
RemainderText := (BoulderTargetCount "/" (InitTargetCount + InitBoulderTargetCount))
}
PrevLevel := LevelNum
If (TaskbarProgress) {
SetTaskbarProgress("N", PercentText, hBulldozer)
} Else {
SetTaskbarProgress()
}
}
LevelClearCheck(Wait := 0) {
Global ; Assume-global mode
ProgressCheck()
; Update window title
DllCall("User32.dll\SetWindowText", "UInt", hBulldozer, "Str", "Bulldozer - Level " LevelNum (TitlebarProgress ? " (" PercentText "%) [" RemainderText "]" : ""))
If (!InStr(TempMap, "2")) { ; If all boulders moved to targets
Solved[LevelNum] := "S" ; Add flag
LevelNum++ ; Increment level number + 1
Sleep, % Wait ; Delay before changing level
MapSet(LevelNum) ; Load next level
}
}
MapSet(LevelNo) {
Global ; Assume-global mode
MapBackup := "" ; Initialize variable
UndoArray := [] ; Initialize array to store 'Undo' data
MidiHistory := [] ; Initialize array to store used sound effects
; Level number validation
LevelNum := (LevelNo > Maps.MaxIndex() ? "180" : LevelNo < Maps.MinIndex() ? "1" : LevelNo)
; HOTFIX: Levels where bulldozer begins on target tile
If (LevelNum = "64" || LevelNum = "127") {
MapBackup := Maps[LevelNum] ; Backup map
}
TempMap := Maps[LevelNum] ; Define TempMap data
BackgroundLoad(TempMap) ; Generate background image
; HOTFIX: Levels where bulldozer begins on target tile
If (LevelNum = "64" || LevelNum = "127") {
Maps%LevelNum% := StrReplace(TempMap, "4", "1") ; Replace level data
}
StrReplace(LevelNum = "64" || LevelNum = "127" ? Maps%LevelNum% : Maps[LevelNum], "1", "1", InitTargetCount)
StrReplace(LevelNum = "64" || LevelNum = "127" ? Maps%LevelNum% : Maps[LevelNum], "3", "3", InitBoulderTargetCount)
ProgressCheck()
; Update window title
DllCall("User32.dll\SetWindowText", "UInt", hBulldozer, "Str", "Bulldozer - Level " LevelNum (TitlebarProgress ? " (" PercentText "%) [" RemainderText "]" : ""))
}
MapUpdate(PosReplace*) {
Global ; Assume-global mode
Update := [] ; Initialize the update array
Undo := [] ; Initialize the undo array
UndoMap := TempMap ; Backup previous TempMap value to UndoMap
For K, V In PosReplace {
Replacement := SubStr(V, 1, InStr(V, "|") - 1)
Position := SubStr(V, InStr(V, "|") + 1)
Current := SubStr(TempMap, Position, 1)
Before := SubStr(TempMap, 1, Position - 1)
After := SubStr(TempMap, Position + 1, StrLen(TempMap) - Position)
TempMap := Before . Replacement . After
Undo.Push({I: Position, C: Current, M: UndoMap})
Update.Push({I: Position, C: Replacement})
}
If (TempMap "" <> UndoMap "") { ; TempMap changed
UndoArray.Push(Undo)
MidiHistory.Push(PlayedNote)
}
If (!UnlimitedUndo) { ; If option enabled
If (UndoArray.MaxIndex() > 1) { ; Number of times to allow 'Undo'
UndoArray.RemoveAt(1)
}
}
BackgroundUpdate(Update) ; Generate background image
LevelClearCheck(500) ; Check for remaining boulders
}
BackgroundLoad(MapData) {
Global ; Assume-global mode
; Clear graphic to specific color
DllCall("Gdiplus.dll\GdipGraphicsClear", "Ptr", pBackgroundGraphics, "UInt", "0xFF" BackgroundColor)
; Generate image using tileset coordinates from map data
Loop, % StrLen(MapData) {
MapChar := SubStr(MapData, A_Index, 1)
NMapChar := SubStr(Maps[LevelNum], A_Index, 1)
If (LayeredTiles) {
If (InStr("89BCDEFA1)", MapChar, 1)) { ; Background Tiles
DrawTile(MapChar, A_Index)
}
If (MapChar = "3") { ; Target/Boulder
DrawTile("1", A_Index) ; Target
}
; HOTFIX: Levels where bulldozer begins on target tile
If (LevelNum = "64" || LevelNum = "127") {
If (RegExMatch(MapChar, "(4|5|6|7)")) { ; Draw target under Bulldozer
DrawTile("1", A_Index) ; Target
}
}
If (RegExMatch(MapChar, "(4|5|6|7)")) { ; Draw target under Bulldozer
If (NMapChar = "1") { ; Target on Original map
DrawTile("1", A_Index) ; Target on current temp map
}
}
}
DrawTile(MapChar, A_Index)
}
; Write text to image
If (LevelNumber) { ; If option enabled
Fontmap := (Solved[LevelNum] = "S" ? pFontmapGreen : pFontmapPink)
Loop, Parse, % Format("{:3}", LevelNum)
{
If (FontCol := InStr("0123456789", A_LoopField, 1)) {
DllCall("Gdiplus.dll\GdipDrawImageRectRect", "Ptr", pBackgroundGraphics, "Ptr", Fontmap, "Float", ((((24 * A_Index) - 24) + 564) * DPI), "Float", (4 * DPI), "Float", (24 * DPI), "Float", (24 * DPI), "Float", ((FontCol - 1) * 24), "Float", 0, "Float", 24, "Float", 24, "Int", 2, "Ptr", 0, "Ptr", 0, "Ptr", 0)
}
}
}
; Redraw background image
GuiControl, Game: +Redraw, % hBackground
}
BackgroundUpdate(arrUpdate) {
Global ; Assume-global mode
For K, V In arrUpdate {
DllCall("Gdiplus.dll\GdipFillRectangle", "Ptr", pBackgroundGraphics, "Ptr", pBackgroundBrush, "Float", ((32 * ((!(M := Mod(V.I, 20)) ? 20 : M) - 1)) * DPI), "Float", ((32 * (Ceil(V.I / 20) - 1)) * DPI), "Float", (32 * DPI), "Float", (32 * DPI))
MapChar := SubStr(LevelNum = "64" || LevelNum = "127" ? Maps%LevelNum% : Maps[LevelNum], V.I, 1)
If (LayeredTiles) {
If (InStr("89BCDEFA1", MapChar, 1)) {
DrawTile(MapChar, V.I) ; Background Tiles
}
If (MapChar = "3") { ; Target/Boulder
DrawTile("1", V.I) ; Target
}
}
DrawTile(V.C, V.I)
}
; Redraw background image
GuiControl, Game: +Redraw, % hBackground
}
DrawTile(TileChar, TilePos) {
Global ; Assume-global mode
If (TileCol := InStr("89BCDEFA2317456", TileChar, 1)) {
DllCall("Gdiplus.dll\GdipDrawImageRectRect", "Ptr", pBackgroundGraphics, "Ptr", pTheme, "Float", ((32 * ((!(M := Mod(TilePos, 20)) ? 20 : M) - 1)) * DPI), "Float", ((32 * (Ceil(TilePos / 20) - 1)) * DPI), "Float", 32 * DPI, "Float", 32 * DPI, "Float", (TileCol - 1) * 32, "Float", 0, "Float", 32, "Float", 32, "Int", 2, "Ptr", 0, "Ptr", 0, "Ptr", 0)
}
}
GdipCreateFromBase64(B64, RetType := 0) {
VarSetCapacity(B64Len, 0)
DllCall("Crypt32.dll\CryptStringToBinary", "Ptr", &B64, "UInt", StrLen(B64), "UInt", 0x01, "Ptr", 0, "UIntP", B64Len, "Ptr", 0, "Ptr", 0)
VarSetCapacity(B64Dec, B64Len, 0) ; pbBinary size
DllCall("Crypt32.dll\CryptStringToBinary", "Ptr", &B64, "UInt", StrLen(B64), "UInt", 0x01, "Ptr", &B64Dec, "UIntP", B64Len, "Ptr", 0, "Ptr", 0)
pStream := DllCall("Shlwapi.dll\SHCreateMemStream", "Ptr", &B64Dec, "UInt", B64Len, "UPtr")
VarSetCapacity(pBitmap, 0)
DllCall("Gdiplus.dll\GdipCreateBitmapFromStreamICM", "Ptr", pStream, "PtrP", pBitmap)
If (RetType = 2) {
VarSetCapacity(hBitmap, 0)
DllCall("Gdiplus.dll\GdipCreateHBITMAPFromBitmap", "UInt", pBitmap, "UInt*", hBitmap, "Int", 0XFFFFFFFF)
}
If (RetType = 1) {
DllCall("Gdiplus.dll\GdipCreateHICONFromBitmap", "Ptr", pBitmap, "PtrP", hIcon, "UInt", 0)
}
ObjRelease(pStream)
return (RetType = 1 ? hIcon : RetType = 2 ? hBitmap : pBitmap)
}
GdipCreateFromPNG(File) {
If (!A_IsUnicode) {
VarSetCapacity(wFile, 1024)
DllCall("Kernel32.dll\MultiByteToWideChar", "UInt", 0, "UInt", 0, "Ptr", &File, "Int", -1, "Ptr", &wFile, "Int", 512)
DllCall("Gdiplus.dll\GdipCreateBitmapFromFile", "Ptr", &wFile, "PtrP", pBitmap)
} Else {
DllCall("Gdiplus.dll\GdipCreateBitmapFromFile", "Ptr", &File, "PtrP", pBitmap)
}
return pBitmap
}
ChooseColor(StartColor, hOwner := 0, Palette*) {
Global UserColors
Static CustomColors
rgbResult := BGR2RGB(StartColor)
VarSetCapacity(CustomColors, 64, 0)
NumPut(VarSetCapacity(CHOOSECOLOR, (A_PtrSize * 9), 0), CHOOSECOLOR, 0)
NumPut(hOwner, CHOOSECOLOR, A_PtrSize)
NumPut(rgbResult, CHOOSECOLOR, (A_PtrSize * 3), "UInt")
NumPut(&CustomColors, CHOOSECOLOR, (A_PtrSize * 4), "UPtr")
NumPut(0x103, CHOOSECOLOR, (A_PtrSize * 5), "UInt")
For Index, Value in Palette {
NumPut(BGR2RGB(Value), CustomColors, ((Index - 1) * 4), "UInt")
}
RetVal := DllCall("Comdlg32.dll\ChooseColor", "Ptr", &CHOOSECOLOR)
If (ErrorLevel <> 0 || RetVal == 0) {
return Format("{:06X}", StartColor)
}
Loop, 16 {
UserColors[A_Index] := BGR2RGB(NumGet(CustomColors, (A_Index - 1) * 4, "UInt"))
}
rgbResult := NumGet(CHOOSECOLOR, (A_PtrSize * 3))
return Format("{:06X}", BGR2RGB(rgbResult))
}
BGR2RGB(Color) {
return ((Color & 0xFF) << 16) + (Color & 0xFF00) + ((Color >> 16) & 0xFF)
}
IsWindowVisible(Hwnd) {
return DllCall("IsWindowVisible", "UInt", WinExist("ahk_id " Hwnd))
}
ShowHideWindow(Name := "", Show := 1) {
Windows := ["About", "LevelSelect"]
For K, V In Windows {
If (V <> Name) {
Gui, %V%: Hide
}
}
If (Name <> "") {
Gui, % Name ":" (Show ? "Show" : "Hide")
}
GuiControl, Parent: Focus, Catch
}
RLE_Encode(Message) {
Previous := SubStr(Message, 1, 1)
Last := SubStr(Message, 0, 1)
Message .= Asc(Chr(Last) + 1)
Count := 0
Loop, Parse, Message
{
If (Previous == A_LoopField) {
Count += 1
} Else {
output .= Previous . Count
Previous := A_LoopField
Count := 1
}
}
return output
}
RLE_Decode(Message) {
Pos := 1
While(Item := RegExMatch(Message, "\D", Char, Pos)) {
DigPos := RegExMatch(Message, "\d+", Dig, Item)
Loop, % Dig {
Output .= Char
}
Pos := DigPos
}
return Output
}
ST_Glue(Array, Delim := "`n") {
For K, V In Array {
New .= V . Delim
}
return Trim(New, Delim)
}
SubclassControl(HCTL, FuncName, Data := 0) {
Static ControlCB := []
If (Controls.HasKey(HCTL)) {
DllCall("Comctl32.dll\RemoveWindowSubclass", "Ptr", HCTL, "Ptr", ControlCB[HCTL], "Ptr", HCTL)
DllCall("Kernel32.dll\GlobalFree", "Ptr", Controls[HCTL], "Ptr")
Controls.Delete(HCTL)
If (FuncName = "") {
return true
}
}
If (!DllCall("User32.dll\IsWindow", "Ptr", HCTL, "UInt"))
|| (!IsFunc(FuncName) || (Func(FuncName).MaxParams <> 6))
|| (!CB := RegisterCallback(FuncName,, 6)) {
return false
}
If (!DllCall("Comctl32.dll\SetWindowSubclass", "Ptr", HCTL, "Ptr", CB, "Ptr", HCTL, "Ptr", Data)) {
return (DllCall("Kernel32.dll\GlobalFree", "Ptr", CB, "Ptr") & 0)
}
return (ControlCB[HCTL] := CB)
}
BgSubclassProc(hWnd, uMsg, wParam, lParam, uIdSubclass, dwRefData) {
Global pControlGraphics, pBackgroundImage
If (uMsg = 0x0014) { ; WM_ERASEBKGND
return 1 ; Do nothing
}
If (uMsg = 0x000F) { ; WM_PAINT
; Draw the background image
VarSetCapacity(PAINTSTRUCT, 60 + A_PtrSize, 0)
DllCall("User32.dll\BeginPaint", "Ptr", hWnd, "Ptr", &PAINTSTRUCT, "UPtr")
DllCall("Gdiplus.dll\GdipDrawImage", "Ptr", pControlGraphics, "Ptr", pBackgroundImage, "Float", 0, "Float", 0)
DllCall("User32.dll\EndPaint", "Ptr", hWnd, "Ptr", &PAINTSTRUCT, "UPtr")
return 0
}
If (uMsg = 0x0002) { ; WM_DESTROY
SubclassControl(hWnd, "") ; Remove the Subclass
}
; Pass all other messages to DefSubclassProc
return DllCall("Comctl32.dll\DefSubclassProc", "Ptr", hWnd, "UInt", uMsg, "Ptr", wParam, "Ptr", lParam, "Ptr")
}
EmptyMem(PID := "") {
PID := (PID = "" ? DllCall("Kernel32.dll\GetCurrentProcessId") : PID)
h := DllCall("Kernel32.dll\OpenProcess", "UInt", 0x001F0FFF, "Int", 0, "Int", PID)
DllCall("Kernel32.dll\SetProcessWorkingSetSize", "UInt", h, "Int", -1, "Int", -1)
DllCall("Kernel32.dll\CloseHandle", "Int", h)
}
SetTaskbarProgress(State := "", Value := "", Hwnd := "") {
Static TBL := ""
If (TBL = "") {
TBL := ComObjCreate("{56FDF344-FD6D-11D0-958A-006097C9A090}", "{EA1AFB91-9E28-4B86-90E9-9E9F8A5EEFAF}")
}
State := (State = "I" ? 1 : State = "N" ? 2 : State = "E" ? 4 : State = "P" ? 8 : 0)
Hwnd := (Hwnd = "" ? WinExist() : Hwnd)
DllCall(NumGet(NumGet(TBL + 0) + 10 * A_PtrSize), "Ptr", TBL, "Ptr", Hwnd, "UInt", State)
If (Value <> "") {
DllCall(NumGet(NumGet(TBL + 0) + 9 * A_PtrSize), "Ptr", TBL, "Ptr", Hwnd, "Int64", Value, "Int64", 100)
}
return (TBL ? 0 : 1)
}
MidiSound(Note) { ; Notes: 27-87
Global ; Assume-global mode
Static Channel := 9, Velocity := 127
Static PrevBDPos := "", IdentCount := 0, PrevRepeat := 0, PrevDragMode := 0, DragCount := 0
If (!Sound) {
return
}
BDPos := RegExMatch(TempMap, "(4|5|6|7)")
If (BDPos = PrevBDPos && DragMode) {
DragCount++
If (DragCount > 1) {
return
}
} Else {
DragCount := 0
PrevDragMode := 0
}
If (DragMode && (PrevDragMode >= 1) && DragCount) {
return
}
PrevDragMode++
If (BDPos = PrevBDPos && KF_REPEAT) {
IdentCount++
If (IdentCount >= 1) {
return
}
} Else {
IdentCount := 0
}
If (KF_REPEAT && !PrevRepeat && IdentCount) {
return
}
PrevBDPos := BDPos
PrevRepeat := KF_REPEAT
PlayedNote := Note ; Used for "Undo" sound effects
DllCall("Winmm.dll\midiOutShortMsg", "UInt", h_MIDIOut, "UInt", 0x90 | Channel | (Note << 8) | (Velocity << 16), "UInt")
}
WM_LBUTTONDOWN(wParam, lParam, Msg, Hwnd) {
Global ; Assume-global mode
Static Init := OnMessage(0x0201, "WM_LBUTTONDOWN")
If (Hwnd <> hGame) {
return
}
If (MouseMovement) {
KeyWait, LButton, T0.4
If (!ErrorLevel) {
MoveClick()
}
DragMode := (ErrorLevel ? 1 : 0)
SetTimer, MouseDrag, % (ErrorLevel ? 180 : "Off")
}
}
WM_LBUTTONUP(wParam, lParam, Msg, Hwnd) {
Global ; Assume-global mode
Static Init := OnMessage(0x0202, "WM_LBUTTONUP")
DragMode := 0
SetTimer, MouseDrag, Off
}
WM_MOUSEMOVE(wParam, lParam, Msg, Hwnd) {
Global ; Assume-global mode
Static Init := OnMessage(0x0200, "WM_MOUSEMOVE")
VarSetCapacity(TME, 16, 0)
NumPut(16, TME, 0)
NumPut(2, TME, 4) ; TME_LEAVE
NumPut(hGame, TME, 8)
DllCall("User32.dll\TrackMouseEvent", "UInt", &TME)
}
WM_MOUSELEAVE(wParam, lParam, Msg, Hwnd) {
Global ; Assume-global mode
Static Init := OnMessage(0x02A3, "WM_MOUSELEAVE")
DragMode := 0
SetTimer, MouseDrag, Off
}
MouseDrag() {
Global ; Assume-global mode
If (!DragMode) {
return
}
MouseGetPos, MouseX, MouseY
ColClick := Ceil(MouseX / (32 * DPI))
RowClick := Ceil(MouseY / (32 * DPI))
BDPos := RegExMatch(TempMap, "(4|5|6|7)")
BDCol := Mod(BDPos, 20)
BDRow := Floor(BDPos / 20) + 1
If (ColClick < BDCol) { ; Left
Move(-1, 0)
} Else If (ColClick > BDCol) { ; Right
Move(1, 0)
} Else If (RowClick < BDRow) { ; Up
Move(0, -1)
} Else If (RowClick > BDRow) { ; Down
Move(0, 1)
}
}
MoveClick() {
Global ; Assume-global mode
MouseGetPos, MouseX, MouseY
ColClick := Ceil(MouseX / (32 * DPI))
RowClick := Ceil(MouseY / (32 * DPI))
ClickPos := (ColClick + (RowClick * 20)) - 20
BDPos := RegExMatch(TempMap, "(4|5|6|7)")
BDCol := Mod(BDPos, 20)
BDRow := Floor(BDPos / 20) + 1
ClickChar := SubStr(TempMap, ClickPos, 1)
If (ClickChar <> "0") ; <NOT> Open Area
&& (ClickChar <> "1") { ; <NOT> Target
return
}
PathMapMid := SubStr(TempMap, ClickPos, 1)
PathMapPrev := SubStr(TempMap, 1, ClickPos - 1)
PathMapNext := SubStr(TempMap, ClickPos + 1, StrLen(TempMap) - ClickPos)
PathMapTemp := PathMapPrev "Z" PathMapNext
PathMap := ""
Loop, 16 {
PathMap .= SubStr(PathMapTemp, A_Index = 1 ? 1 : (A_Index * 20) - 19, 20) "`n"
}
PathMap := RegExReplace(RegExReplace(RegExReplace(PathMap, "(4|5|6|7)", "S"), "(0|1)", " "), "(8|9|D|2|3|B|C|E|F|A)", "*")
Closed := {}
For Y, Line In StrSplit(PathMap, "`n") {
For X, Val In StrSplit(Line) {
If (Val = "*") {
Closed[X,Y] := true
} Else If (Val = "S") {
X1 := X, Y1 := Y
} Else If (Val = "Z") {
X2 := X, Y2 := Y
}
}
}
Path := Astar_Grid(X1, Y1, X2, Y2, Closed)
IsPath := 0
For Y, Line In StrSplit(PathMap, "`n") {
For X, Val In StrSplit(Line "`n") {
For Index, Cell In Path {
If (Cell.X = X && Cell.Y = Y && Index >= 1 && Index < Path.MaxIndex()) {
IsPath++
Continue 2
}
}
}
}
If (!IsPath) {
return
}
BDChar := SubStr(TempMap, BDPos, 1)
OriginalChar := SubStr(LevelNum = "64" || LevelNum = "127" ? Maps%LevelNum% : RegExReplace(Maps[LevelNum], "(4|5|6|7)", "0"), BDPos, 1)
OriginalChar := (OriginalChar = "2" ? SubStr(RegExReplace(TempMap, "(4|5|6|7)", "0"), BDPos, 1) : OriginalChar = "3" ? "1" : OriginalChar)
MapUpdate(OriginalChar "|" BDPos, BDChar "|" ClickPos)
}
Astar_Grid(X1, Y1, X2, Y2, Closed := "") {
If (!IsObject(Closed)) {
Closed := {}
}
Open := {}, From := {}, G := {}, F := {}
Open[X1, Y1] := true, G[X1, Y1] := 0
F[X1, Y1] := Astar_Estimate_F(X1, Y1, X2, Y2)
While (Open.MaxIndex()) {
Astar_Lowest_F_Set(X, Y, F, Open)
If (X = X2 and Y = Y2) {
return Astar_From_Path(From, X, Y)
}
Open[X].Delete(Y)
If (!Open[X].MaxIndex()) {
Open.Delete(X)
}
Closed[X, Y] := True
For Index, Near In [{"X": X, "Y": Y-1},{"X": X-1, "Y": Y},{"X": X+1, "Y": Y},{"X": X, "Y": Y+1}] {
If (Closed[Near.X, Near.Y] = True) {
Continue
}
Open[Near.X, Near.Y] := True, tG := G[X, Y] + 1
If (IsObject(G[Near.X, Near.Y]) and tG >= G[Near.X, Near.Y]) {
Continue
}
From[Near.X, Near.Y] := {"X": X, "Y": Y}
G[Near.X, Near.Y] := tG
F[Near.X, Near.Y] := G[Near.X, Near.Y] + Astar_Estimate_F(Near.X, Near.Y, X2, Y2)
}
}
}
Astar_Estimate_F(X1, Y1, X2, Y2) {
return Abs(X1-X2) + Abs(Y1-Y2)
}
Astar_Lowest_F_Set(ByRef X, ByRef Y, ByRef F, ByRef Set) {
l := 0x7FFFFFFF
For tX, Element In Set {
For tY, Val In Element {
If (F[tX, tY] < l) {
l := F[tX, tY], X := tX, Y := tY
}
}
}
return l
}
Astar_From_Path(From, X, Y) {
Path := {}, XY := {"X": X, "Y": Y}
Path.InsertAt(1, XY)
While (IsObject(From[XY.X, XY.Y])) {
Path.InsertAt(1, XY:= From[XY.X, XY.Y])
}
return Path
}
GdipSaveToPNG(pBitmap, sOutput) {
Ptr := (A_PtrSize ? "UPtr" : "UInt")
DllCall("Gdiplus.dll\GdipGetImageEncodersSize", "UInt*", nCount, "UInt*", nSize)
VarSetCapacity(ci, nSize)
DllCall("Gdiplus.dll\GdipGetImageEncoders", "UInt", nCount, "UInt", nSize, Ptr, &ci)
If (!(nCount && nSize)) {
return -2
}
If (A_IsUnicode) {
Loop, % nCount {
sString := StrGet(NumGet(ci, (idx := (48 + (7 * A_PtrSize)) * (A_Index - 1)) + 32 + (3 * A_PtrSize)), "UTF-16")
If (!InStr(sString, "*.PNG")) {
Continue
}
pCodec := &ci+idx
Break
}
} Else {
Loop, % nCount {
Location := NumGet(ci, 76 * (A_Index - 1) + 44)
nSize := DllCall("WideCharToMultiByte", "UInt", 0, "UInt", 0, "UInt", Location, "Int", -1, "UInt", 0, "Int", 0, "UInt", 0, "UInt", 0)
VarSetCapacity(sString, nSize)
DllCall("WideCharToMultiByte", "UInt", 0, "UInt", 0, "UInt", Location, "Int", -1, "Str", sString, "Int", nSize, "UInt", 0, "UInt", 0)
If (!InStr(sString, "*.PNG")) {
Continue
}
pCodec := &ci + 76 * (A_Index - 1)
Break
}
}
If (!pCodec) {
return -3
}
If (!A_IsUnicode) {
nSize := DllCall("MultiByteToWideChar", "UInt", 0, "UInt", 0, Ptr, &sOutput, "Int", -1, Ptr, 0, "Int", 0)
VarSetCapacity(wOutput, nSize*2)
DllCall("MultiByteToWideChar", "UInt", 0, "UInt", 0, Ptr, &sOutput, "Int", -1, Ptr, &wOutput, "Int", nSize)
VarSetCapacity(wOutput, -1)
If (!VarSetCapacity(wOutput)) {
return -4
}
E := DllCall("Gdiplus.dll\GdipSaveImageToFile", Ptr, pBitmap, Ptr, &wOutput, Ptr, pCodec, "UInt", p ? p : 0)
} Else {
E := DllCall("Gdiplus.dll\GdipSaveImageToFile", Ptr, pBitmap, Ptr, &sOutput, Ptr, pCodec, "UInt", p ? p : 0)
}
return E ? -5 : 0
}
BuildDocs() {
Global ; Assume-global mode
If (!InStr(FileExist("BulldozerDocs"), "D")) {
FileCreateDir, BulldozerDocs
FileCreateDir, BulldozerDocs\images
GdipSaveToPNG(pDocsbulldozerpushrock, "BulldozerDocs\images\bulldozer-push-rock.png")
GdipSaveToPNG(pDocsfig1, "BulldozerDocs\images\Fig1.png")
GdipSaveToPNG(pDocsfig2, "BulldozerDocs\images\Fig2.png")
GdipSaveToPNG(pDocsfig3, "BulldozerDocs\images\Fig3.png")
GdipSaveToPNG(pDocsfig4, "BulldozerDocs\images\Fig4.png")
GdipSaveToPNG(pDocsfig5, "BulldozerDocs\images\Fig5.png")
GdipSaveToPNG(pDocsfig6, "BulldozerDocs\images\Fig6.png")
GdipSaveToPNG(pDocsiconahk, "BulldozerDocs\images\icon-ahk.png")
GdipSaveToPNG(pDocsicongithub, "BulldozerDocs\images\icon-github.png")
GdipSaveToPNG(pDocsiconup, "BulldozerDocs\images\icon-up.png")
GdipSaveToPNG(pDocscustomtheme, "BulldozerDocs\images\custom-theme.png")
Doc := FileOpen("BulldozerDocs\index.html", "w")
Doc.Write(DocHTML)
Doc.Close()
}
}
CheckDocs() {
Global ; Assume-global mode
If (!FileExist("BulldozerDocs\images\bulldozer-push-rock.png"))
|| (!FileExist("BulldozerDocs\images\Fig1.png"))
|| (!FileExist("BulldozerDocs\images\Fig2.png"))
|| (!FileExist("BulldozerDocs\images\Fig3.png"))
|| (!FileExist("BulldozerDocs\images\Fig4.png"))
|| (!FileExist("BulldozerDocs\images\Fig5.png"))
|| (!FileExist("BulldozerDocs\images\Fig6.png"))
|| (!FileExist("BulldozerDocs\images\icon-ahk.png"))
|| (!FileExist("BulldozerDocs\images\icon-github.png"))
|| (!FileExist("BulldozerDocs\images\icon-up.png"))
|| (!FileExist("BulldozerDocs\images\custom-theme.png"))
|| (!FileExist("BulldozerDocs\index.html")) {
FileRemoveDir, BulldozerDocs, 1
BuildDocs()
}
}
GameGuiDropFiles(GuiHwnd, FileArray, CtrlHwnd, X, Y) {
Global ; Assume-global mode
If (GuiHwnd <> hGame) {
return
}
DWidth := 0, DHeight := 0
If (FileArray.MaxIndex() > 1) { ; Single file only
return
}
SplitPath, % FileArray[1],,, DExt
If (DExt <> "png") { ; PNG image file only
return
}
DFile := GdipCreateFromPNG(FileArray[1])
DllCall("Gdiplus.dll\GdipGetImageWidth", "UInt", DFile, "UInt*", DWidth)
DllCall("Gdiplus.dll\GdipGetImageHeight", "UInt", DFile, "UInt*", DHeight)
DllCall("Gdiplus.dll\GdipDisposeImage", "UInt", DFile)
If (DWidth = 480 && DHeight = 32) { ; Only properly sized image
ThemeSet(FileArray[1], true)
return
}
}
; ==============================================================================
Individual Changes:
Background Colors Array:
Code: Select all
; Background colors data
BackgroundColors := {}
BackgroundColors[1] := {"Red": "FF0000"} ; (255,0,0)
BackgroundColors[2] := {"Orange": "FF7F00"} ; (255,127,0)
BackgroundColors[3] := {"Yellow": "FFFF00"} ; (255,255,0)
BackgroundColors[4] := {"Green": "00FF00"} ; (0,255,0)
BackgroundColors[5] := {"Cyan": "00FFFF"} ; (0,255,255)
BackgroundColors[6] := {"Blue": "0000FF"} ; (0,0,255)
BackgroundColors[7] := {"Purple": "CF00FF"} ; (159,0,255)
BackgroundColors[8] := {"Magenta": "FF00FF"} ; (255,0,255)
BackgroundColors[9] := {"Pink": "FFADB7"} ; (225,173,183)
BackgroundColors[10] := {"SkyBlue": "7FBFfF"} ; (127,191,255)
BackgroundColors[11] := {"DarkRed": "7F0000"} ; (127,0,0)
BackgroundColors[12] := {"DarkYellow": "7F7F00"} ; (127,127,0) [Default]
BackgroundColors[13] := {"DarkGreen": "007F00"} ; (0,127,0)
BackgroundColors[14] := {"DarkCyan": "007F7F"} ; (0,127,127)
BackgroundColors[15] := {"DarkBlue": "00007F"} ; (0,0,127)
BackgroundColors[16] := {"DarkMagenta": "7F007F"} ; (127,0,127)
BackgroundColors[17] := {"Black": "000000"} ; (0,0,0)
BackgroundColors[18] := {"Gray": "7F7F7F"} ; (127,127,127)
BackgroundColors[19] := {"Silver": "BFBFBF"} ; (191,191,191)
BackgroundColors[20] := {"White": "FFFFFF"} ; (255,255,255)
BackgroundColorSet() Function:
Code: Select all
BackgroundColorSet(ColorHex) {
Global ; Assume-global mode
ColorMatch := "" ; Initialize variable
; Set brush color
DllCall("Gdiplus.dll\GdipCreateSolidFill", "UInt", "0xFF" (BackgroundColor := ColorHex), "PtrP", pBackgroundBrush)
BackgroundLoad(TempMap) ; Generate background with new color
For K, V In BackgroundColors {
For ColorName, ColorCode In BackgroundColors[K] {
If (ColorCode = BackgroundColor) {
Menu, ColorsMenu, Check, % (ColorMatch := ColorName)
} Else {
Menu, ColorsMenu, Uncheck, % ColorName
}
}
}
Menu, ColorsMenu, % (!ColorMatch ? "Check" : "Uncheck"), &Custom...
}
GUI Menubar:
Code: Select all
; Menubar > Options > Background Color -------------------------------------
ColorMatch := "" ; Initialize variable
For K, V In BackgroundColors {
For ColorName, ColorCode In BackgroundColors[K] {
Menu, ColorsMenu, Add, % ColorName, MenuHandler
;Menu, ColorsMenu, Icon, % ColorName, % "HICON:*" pColor%ColorName%16
If (ColorCode = BackgroundColor) {
Menu, ColorsMenu, Check, % (ColorMatch := ColorName)
}
}
}
Menu, ColorsMenu, Add ; Separator
Menu, ColorsMenu, Add, &Custom..., MenuHandler
Menu, ColorsMenu, % (ColorMatch ? "Uncheck" : "Check"), &Custom...
Menu, ColorsMenu, Icon, &Custom..., % "HICON:*" pColorCustom16
MenuHandler() Function: Specifically Else If (MenuName = "ColorsMenu") {
Code: Select all
MenuHandler(ItemName, ItemPos, MenuName) {
Global ; Assume-global mode
If (MenuName = "GameMenu") {
If (InStr(ItemName, "&Restart Level")) {
LevelClearCheck(500)
; HOTFIX: Levels where bulldozer begins on target tile
If (LevelNum = "64" || LevelNum = "127") {
Maps[LevelNum] := MapBackup ; Replace level data
}
MapSet(LevelNum)
ShowHideWindow()
} Else If (InStr(ItemName, "&Level Select")) {
UpdateLV()
ShowHideWindow("LevelSelect", True)
} Else If (InStr(ItemName, "&Undo Last Move")) {
UndoMove()
} Else If (InStr(ItemName, "E&xit")) {
ExitApp ; Terminate the script unconditionally
}
} Else If (MenuName = "ViewMenu") {
If (InStr(ItemName, "&Layered Tiles")) {
LayeredTiles := !LayeredTiles
Menu, ViewMenu, % (LayeredTiles ? "Check" : "Uncheck"), &Layered Tiles
BackgroundLoad(TempMap)
}
} Else If (MenuName = "ColorsMenu") {
If (InStr(ItemName, "&Custom...")) {
BackgroundColorSet(ChooseColor("0x" BackgroundColor, hBulldozer, UserColors*))
} Else {
For K, V In BackgroundColors {
For ColorName, ColorCode In BackgroundColors[K] {
If (ColorName = ItemName) {
BackgroundColorSet(ColorCode)
Break
}
}
}
}
} Else If (MenuName = "ThemesMenu") {
If (InStr(ItemName, "&Custom...")) {
;Gui, Parent: +OwnDialogs
FileSelectFile, CustomTheme, 3,, Select image..., PNG (*.png)
If (ErrorLevel) {
return
}
ThemeSet(CustomTheme, true)
} Else {
ThemeSet(ItemName, true)
}
} Else If (MenuName = "OptionsMenu") {
If (InStr(ItemName, "Level Number")) {
LevelNumber := !LevelNumber
Menu, OptionsMenu, % (LevelNumber ? "Check" : "Uncheck"), Level Number
BackgroundLoad(TempMap)
} Else If (InStr(ItemName, "Sound Effects")) {
Sound := !Sound
Menu, OptionsMenu, % (Sound ? "Check" : "Uncheck"), Sound Effects
} Else If (InStr(ItemName, "Unlimited Undo")) {
UnlimitedUndo := !UnlimitedUndo
LastUndo := UndoArray.Pop()
UndoArray := []
UndoArray.Push(LastUndo)
Menu, OptionsMenu, % (UnlimitedUndo ? "Check" : "Uncheck"), Unlimited Undo
} Else If (InStr(ItemName, "Mouse Movement")) {
MouseMovement := !MouseMovement
Menu, OptionsMenu, % (MouseMovement ? "Check" : "Uncheck"), Mouse Movement
} Else If (InStr(ItemName, "Taskbar Progress")) {
TaskbarProgress := !TaskbarProgress
Menu, OptionsMenu, % (TaskbarProgress ? "Check" : "Uncheck"), Taskbar Progress
LevelClearCheck(500)
} Else If (InStr(ItemName, "Titlebar Progress")) {
TitlebarProgress := !TitlebarProgress
Menu, OptionsMenu, % (TitlebarProgress ? "Check" : "Uncheck"), Titlebar Progress
LevelClearCheck(500)
}
} Else If (MenuName = "HelpMenu") {
If (InStr(ItemName, "&About Bulldozer")) {
ShowHideWindow("About", True)
} Else If (InStr(ItemName, "&Website...")) {
Run, https://autohotkey.com/boards/viewtopic.php?f=6&t=50139
} Else If (InStr(ItemName, "&Documentation...")) {
If (GetKeyState("Ctrl", "P")) {
Try {
Run, https://github.com/westoncampbell/BulldozerAHK/blob/master/README.md
}
return
}
If (!InStr(FileExist("BulldozerDocs"), "D")) {
BuildDocs()
} Else {
CheckDocs()
}
Try {
Run, BulldozerDocs\index.html
} Catch {
Run, https://github.com/westoncampbell/BulldozerAHK/blob/master/README.md
}
}
} Else If (MenuName = "Tray") {
If (InStr(ItemName, "E&xit")) {
ExitApp ; Terminate the script unconditionally
}
} Else If (MenuName = "LevelSelectMenu") {
Gui, LevelSelect: Default
LVSel := LV_GetNext()
If (InStr(ItemName, "&Solved")) {
If (Solved[LVSel] = "S") {
return
}
Solved[LVSel] := "S"
} Else If (InStr(ItemName, "&Unsolved")) {
If (Solved[LVSel] = "U") {
return
}
Solved[LVSel] := "U"
} Else If (InStr(ItemName, "&Play")) {
MapSet(LV_GetNext())
ShowHideWindow()
return
}
UpdateLV()
LV_Modify(LVSel, "Select Vis")
BackgroundLoad(TempMap)
}
}