Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #=============================================================================
- # *** Aleworks Library(ALibrary)
- #=============================================================================
- # Created by Aleworks
- # Version: 1.01
- # Last Modification: 11/09/2007 (day/month/year)
- #=============================================================================
- #==== Description ====
- # This script is a library, of tools and methods specialy designed for others
- # Aleworks scripts, however you are free to use it, as long as you give credit.
- #=============================================================================
- #==== Credits ====
- # * Ruby 1.8
- # - For the Win32::Registry class, that was the base for Aleworks::Registry
- # * Cybersam
- # - For some APIs functions for getting mouse position
- # * Nishikawa, Yasuhiro
- # - For some APIs for the Aleworks::Clipboard
- #=============================================================================
- #==== Version History ====
- # * Version 1.01
- # - Lots of fixes
- # - New methods:
- # - Aleworks: check_hang_up; translate_string; get_window_rect
- # - API: get_client_rect
- # - String: trans_undrawable_chr; insert
- # - Nil: clone
- # - Array: insert
- # - Bitmap: initialize; bmp_dump
- # - New constants:
- # - Aleworks: ASCII_TABLE; TRANSLATE_TABLE
- #=============================================================================
- #==== Classes & Methods ====
- # ** Module Aleworks
- # * Constants:
- # - Active_Window
- # Id of the Game window.
- # - Current_Process_Id
- # Id of the Game process.
- # - Keyboard_Layout
- # Id of the used keyboard layout.
- # - ASCII_TABLE
- # Hash containing the characters corresponding to each of the 255 ascii
- # codification.
- # - TRANSLATE_TABLE
- # Hash containing the characters corresponding to the back references.
- # * Methods:
- # - Aleworks.get_keyboard_layout_name
- # Returns an array containing the name of the keyboard layout, and its
- # abbreviation.
- # - Aleworks.get_current_desktop_path
- # Returns the path of the user desktop folder.
- # - Aleworks.get_current_userdocuments_path
- # Returns the path of the user personal documents folder.
- # - Aleworks.get_common_desktop_path
- # Returns the path of the common desktop folder.
- # - Aleworks.get_common_usersdocuments_path
- # Returns the path of the common personal documents folder.
- # - Aleworks.get_fonts_folder_path
- # Returns the path of the common users personal documents folder.
- # - Aleworks.get_fonts_names
- # Returns all usable fonts names.
- # - Aleworks.get_mouse_swap_buttons_flag
- # Returns 1 if the mouse button are inverted, 0 instead.
- # - Aleworks.get_mouse_position
- # Returns an array with the coordinates of the mouse cursor.
- # - Aleworks.get_mouse_window_position([hwnd])
- # Returns an array with the coordinates of the mouse cursor, in the given
- # hwnd. If hwnd is not given, it will be used the rgss player.
- # - Aleworks.check_hang_up(time)
- # Updates the module Graphics for prevention of a System Stack Error.
- # - Aleworks.translate_string(string)
- # Returns the translation of back reference characters to normal
- # characters.
- # - Aleworks.get_window_rect([hwnd])
- # Returns an array containing the rect of the given window. If hwnd is not
- # given, it will be the game window.
- # Note: The rect includes the borders and title bar of the window.
- # ** Module Aleworks::API
- # * Methods:
- # - API.get_rtp_path([rtp])
- # Returns the folder path of the RTP number 'rtp'-1. If 'rtp' is not used,
- # it will be number 0.
- # - API.get_keyboard_state
- # Returns a 256 byte string containing the virtual keys states.
- # - API.get_keyboard_layout_name
- # Returns a 9 byte string containing an id name of the keyboard layout.
- # - API.vk_to_ascii(vk)
- # Translates the given virtual key to an ASCII character.
- # - API.get_pps(tag, id, file)
- # Returns the value of the given id, of the given tag, of the given ini
- # file.
- # - API.get_window_placement([hwnd])
- # Returns an array with the placement of the given window. If hwnd is not
- # given, it will be used the rgss player.
- # - API.get_cursor_pos
- # Returns an unpacked mouse coordinates.
- # - API.get_client_rect([hwnd])
- # Returns an array containing the rect of the given window. If hwnd is not
- # given, it will be the game window.
- # ** Module Aleworks::Ini
- # * Methods:
- # - get_string(id[, tag[, file]])
- # Returns the value of the given id, of the given tag, of the given ini
- # file. If the tag is not given, it will be used 'Game', and if the file
- # is not given, it will be used '.\\Game.ini'.
- # - set_string(string, id[, tag[, file]])
- # Writes the value to the given id, of the given tag, of the given ini
- # file. If the tag is not given, it will be used 'Game', and if the file
- # is not given, it will be used '.\\Game.ini'.
- # ** Module Aleworks::Clipboard
- # * Methods:
- # - read
- # Returns the data contained in the Windows Clipboard.
- # - write(data)
- # Writes 'data' to the Windows Clipboard.
- # - empty
- # Clears the data of the Windows Clipboard.
- # ** Module Aleworks::Registry
- # * Constants:
- # - HKEYS
- # Used internaly, for translate the strings HKEYS to numeric.
- # * Methods:
- # - read_entry(key, entry)
- # Returns the value of the given entry, of the given key.
- # - enum_keys(key)
- # Returns an Array value containing all subkeys of the given key.
- # - enum_entries(key)
- # Returns an Array value containing all entries of the given key.
- # ** Class Array
- # * Methods:
- # - clone_all
- # Creates a copy of the object, and all it's sub values.
- # - to_hash
- # Creates a hash using the index of the values as the keys.
- # - rindexes(*values)
- # Returns the indices of all values contained in 'values'.
- # - deep([deep])
- # Returns the max count of the continuated sub contained arrays/hashs.
- # 'deep' is the starting count + 1. If it is not given, will be used -1.
- # Examples:
- # - p [1, 2, 3].deep => 0
- # - p [1, 2, [3]].deep => 1
- # - p [[1], 2, [3]].deep => 1
- # - p [[[1], 2, 3]].deep => 2
- # - p [[[[[[1]]]]]].deep => 5
- # - all_flatten; all_flatten!
- # Similar to flatten, but it will affect the Hash, too. Used with ! will
- # modify self.
- # ** Class Hash
- # * Methods:
- # - clone_all
- # Creates a copy of the object, and all it's sub values and keys.
- # - deep([deep])
- # See Array.deep.
- # - fusion
- # Returns an Array, where will be combined using '+' each key and value.
- # If at least one key can't be combined with its value, will raise an
- # Errno::EINVAL error.
- # ** Class String
- # * Methods:
- # - pixel_width([size[, name]])
- # Returns the width in pixel of the string.
- # - pixel_height([size[, name]])
- # Returns the height in pixel of the string.
- # - width_slice(width[, size[, name]])
- # Returns an Array containing Strings with theirs pixel_width, equal or
- # less than width.
- # - font_size_width(width[, name]])
- # Returns the max font size, that will not cut the String when displayed
- # with the given width. Returns nil, if no size is available.
- # - font_size_height(height[, name]])
- # Returns the max font size, that will not cut the String when displayed
- # with the given height. Returns nil, if no size is available.
- # - font_size(width, height[, name]])
- # Returns the max font size, that will not cut the String when displayed
- # with the given width and height. Returns nil, if no size is available.
- # - trans_undrawable_chr([font[, chr]])
- # Returns a string with all the undrawable characters for the given "font"
- # replaced with "chr". If "font" is not given will be used the default font
- # options. If "chr is not given, it will be "?".
- # ** Class Bitmap
- # * Alias method:
- # - draw_text; Alias Name: alibrary_aleworks_bitmap_drawtext
- # Allows to draw text using arrays, hashs, or other classes.
- # - initialize
- # If a block is given the Bitmap class will be returned and after the
- # block ends the Bitmap will be disposed.
- # - bmp_dump([filename[, background_color])
- # Creates a ".bmp" file with the filename given from the Bitmap class. If
- # filename is not given it will automatically maked. If background_color is
- # given(as Color class) all the pixels from the Bitmap that have
- # transparencies will be mixed with the given color.
- # ** Module Graphics
- # * Constants
- # - Update
- # Used for calling automaticaly methods when Graphics module is updated.
- # For adding an auto-update, add an Array to the UPDATE array containg
- # as first value the class/module as a Constant and as second value the
- # method of the class/module to be updated as a symbol.
- # * Alias method:
- # - update; alibrary_aleworks_graphics_update
- # Allows to update multiple frames using Graphics.update(frames), where
- # frames are the count to be updated.
- # ** Class Nil
- # * Replaced method:
- # - clone
- # Removes the 'Nil can't be cloned error'.
- #=============================================================================
- #=============================================================================
- # ** Module Aleworks
- #=============================================================================
- module Aleworks
- module_function
- #===========================================================================
- # ** Module Aleworks::API
- #===========================================================================
- module API
- module_function
- #-------------------------------------------------------------------------
- # APIs Definitions
- #-------------------------------------------------------------------------
- BlockInput = Win32API.new('user32', 'BlockInput', 'L', 'L')
- ClientToScreen = Win32API.new('user32', 'ClientToScreen', 'LP', 'L')
- CloseClipboard = Win32API.new('user32', 'CloseClipboard', '', 'L')
- EmptyClipboard = Win32API.new('user32', 'EmptyClipboard', '', 'L')
- GetActiveWindow = Win32API.new('user32', 'GetActiveWindow', '', 'L')
- GetAsyncKeyState = Win32API.new('user32', 'GetAsyncKeyState', 'L', 'L')
- GetClientRect = Win32API.new('user32', 'GetClientRect', 'LP', 'L')
- GetClipboardData = Win32API.new('user32', 'GetClipboardData', 'L', 'L')
- GetCursorPos = Win32API.new('user32', 'GetCursorPos', 'P', 'L')
- GetDoubleClickTime = Win32API.new('user32', 'GetDoubleClickTime', '', 'L')
- GetKeyboardLayout = Win32API.new('user32', 'GetKeyboardLayout','L', 'L')
- GetKeyboardLayoutName =Win32API.new('user32','GetKeyboardLayoutName','P','L')
- GetKeyboardState = Win32API.new('user32', 'GetKeyboardState', 'P', 'L')
- GetKeyState = Win32API.new('user32', 'GetKeyState', 'L', 'L')
- GetSystemMetrics = Win32API.new('user32', 'GetSystemMetrics', 'L', 'L')
- GetWindowPlacement = Win32API.new('user32', 'GetWindowPlacement', 'LP', 'L')
- Keybd_Event = Win32API.new('user32', 'keybd_event', 'LLLL', '')
- OpenClipboard = Win32API.new('user32', 'OpenClipboard', 'L', 'L')
- ScreenToClient = Win32API.new('user32', 'ScreenToClient', 'LP', 'L')
- SetClipboardData = Win32API.new('user32', 'SetClipboardData', 'LL', 'L')
- ShowCursor = Win32API.new('user32', 'ShowCursor', 'L', 'L')
- ToAsciiEx = Win32API.new('user32', 'ToAsciiEx', 'LLPPLL', 'L')
- GetCurrentProcessId = Win32API.new('kernel32','GetCurrentProcessId', '','L')
- GPPSA = Win32API.new('kernel32', 'GetPrivateProfileStringA', 'PPPPLP', 'L')
- WPPSA = Win32API.new('kernel32', 'WritePrivateProfileStringA', 'PPPP', 'L')
- GlobalAlloc = Win32API.new('kernel32', 'GlobalAlloc', 'LL', 'L')
- GlobalLock = Win32API.new('kernel32', 'GlobalLock', 'L', 'L')
- GlobalSize = Win32API.new('kernel32', 'GlobalSize', 'L', 'L')
- GlobalUnlock = Win32API.new('kernel32', 'GlobalUnlock', 'L', '')
- RegCloseKey = Win32API.new('advapi32', 'RegCloseKey', 'L', 'L')
- RegEnumKeyExA = Win32API.new('advapi32', 'RegEnumKeyExA', 'LLPPLLLP', 'L')
- RegEnumValueA = Win32API.new('advapi32', 'RegEnumValueA', 'LLPPPPPP', 'L')
- RegOpenKeyExA = Win32API.new('advapi32', 'RegOpenKeyExA', 'LPLLP', 'L')
- RegQueryValueExA = Win32API.new('advapi32', 'RegQueryValueExA','LPLPPP', 'L')
- begin
- Memcpy = Win32API.new('ntdll', 'memcpy', 'PPL', 'L')
- rescue
- Memcpy = Win32API.new('crtdll', 'memcpy', 'PPL', 'L')
- end
- ['3', '2', '1', '0'].each do |n|
- _break = false
- ['E', 'J'].each do |l|
- dll = 'RGSS10' + n + l
- begin
- RGSSGetRTPPath = Win32API.new(dll, 'RGSSGetRTPPath', 'L', 'L')
- RGSSGetPathWithRTP = Win32API.new(dll, 'RGSSGetPathWithRTP', 'L', 'P')
- _break = true
- rescue
- end
- break if _break
- end
- break if _break
- end
- #-------------------------------------------------------------------------
- # * Get RTP Path
- #-------------------------------------------------------------------------
- def get_rtp_path(rtp = 0)
- RGSSGetPathWithRTP.call(RGSSGetRTPPath.cal(rtp))
- end
- #-------------------------------------------------------------------------
- # * Get Keyboard Input State
- #-------------------------------------------------------------------------
- def get_keyboard_state
- buffer = ' ' * 256
- GetKeyboardState.call(buffer)
- buffer
- end
- #-------------------------------------------------------------------------
- # * Get Keyboard Layout Name
- #-------------------------------------------------------------------------
- def get_keyboard_layout_name
- buffer = ' ' * 9
- GetKeyboardLayoutName.call(buffer)
- buffer.chop
- end
- #-------------------------------------------------------------------------
- # * Virtual Key to String
- #-------------------------------------------------------------------------
- def vk_to_ascii(vk, alt_gr = false)
- buffer = ' ' * 2
- state = API.get_keyboard_state
- if alt_gr
- state[17, 1] = "\201"
- state[18, 1] = "\201"
- end
- result = API::ToAsciiEx.call(vk, 0, state, buffer, 0,
- API.get_keyboard_layout)
- case result
- when 1..2
- buffer[0, 1]
- else
- ''
- end
- end
- #-------------------------------------------------------------------------
- # * Get Private Profile String
- #-------------------------------------------------------------------------
- def get_pps(tag, id, file)
- buffer = "\0" * 255
- GPPSA.call(tag, id, '', buffer, 255, file)
- buffer.delete!("\0")
- end
- #-------------------------------------------------------------------------
- # * Get Window Placement
- #-------------------------------------------------------------------------
- def get_window_placement(hwnd = Aleworks::Active_Window)
- buffer = [48].pack('L') + ' ' * 44
- GetWindowPlacement.call(hwnd, buffer)
- buffer.unpack('L11')
- end
- #-------------------------------------------------------------------------
- # * Get Cursor Pos
- #-------------------------------------------------------------------------
- def get_cursor_pos
- buffer = ' ' * 8
- result = GetCursorPos.call(buffer)
- if result != 0
- buffer
- else
- nil
- end
- end
- #-------------------------------------------------------------------------
- # * Get Keyboard Layout
- #-------------------------------------------------------------------------
- def get_keyboard_layout
- GetKeyboardLayout.call(0)
- end
- #-------------------------------------------------------------------------
- # * Get Client Rect
- #-------------------------------------------------------------------------
- def get_client_rect(hwnd = Aleworks::Active_Window)
- buffer = ' ' * 16
- GetClientRect.call(hwnd, buffer)
- buffer.unpack('L4')
- end
- end
- #===========================================================================
- # ** Module Aleworks::Ini
- #===========================================================================
- module Ini
- module_function
- #-------------------------------------------------------------------------
- # * Get String from Ini File
- #-------------------------------------------------------------------------
- def get_string(id, tag = 'Game', file = '.\\Game.ini')
- get_pps(tag, id, file)
- end
- #-------------------------------------------------------------------------
- # * Write String to Ini File
- #-------------------------------------------------------------------------
- def set_string(string, id, tag = 'Game', file = '.\\Game.ini')
- API::WPPSA.call(tag, id, string, file)
- end
- end
- #===========================================================================
- # ** Module Aleworks::Clipboard
- #===========================================================================
- module Clipboard
- module_function
- #-------------------------------------------------------------------------
- # * Read Clipboard Data
- #-------------------------------------------------------------------------
- def read
- API::OpenClipboard.call(0)
- data = API::GetClipboardData.call(7)
- API::CloseClipboard.call
- return '' if data == 0
- lp = API::GlobalLock.call(data)
- len = API::GlobalSize.call(data)
- data2 = ' ' * (len - 1)
- API::Memcpy.call(data2, lp, len)
- API::GlobalUnlock.call(data)
- data2
- end
- #-------------------------------------------------------------------------
- # * Write Data to Clipboard
- #-------------------------------------------------------------------------
- def write(data)
- API::OpenClipboard.call(0)
- API::EmptyClipboard.call
- set_data = API::GlobalAlloc.call(66, data.length + 1)
- len = [data.size + 1, API::GlobalSize.call(set_data)].min
- lp = API::GlobalLock.call(set_data)
- API::Memcpy.call(lp, "#{data}", len)
- API::GlobalUnlock.call(set_data)
- API::SetClipboardData.call(7, set_data)
- API::CloseClipboard.call
- end
- #-------------------------------------------------------------------------
- # * Clear Clipboard Data
- #-------------------------------------------------------------------------
- def empty
- API::EmptyClipboard.call
- end
- end
- #===========================================================================
- # ** Module Aleworks::Registry
- #===========================================================================
- module Registry
- module_function
- HKEYS = {'HKEY_CLASSES_ROOT' => 0x80000000,'HKEY_CURRENT_USER' => 0x80000001,
- 'HKEY_LOCAL_MACHINE' => 0x80000002, 'HKEY_USERS' => 0x80000003,
- 'HKEY_CURRENT_CONFIG' => 0x80000005}
- #-------------------------------------------------------------------------
- # * Read an Entry
- #-------------------------------------------------------------------------
- def read_entry(key, entry)
- key.sub!(/(.*?)\\/, '')
- if HKEYS[$1] != nil
- hkey = HKEYS[$1]
- else
- return nil
- end
- opened, type, size = [0].pack('V'), [0].pack('V'), [0].pack('V')
- API::RegOpenKeyExA.call(hkey, key, 0, 131097, opened)
- opened = (opened + [0].pack('V')).unpack('V')[0]
- API::RegQueryValueExA.call(opened, entry, 0, type, 0, size)
- data = ' ' * (size + [0].pack('V')).unpack('V')[0]
- API::RegQueryValueExA.call(opened, entry, 0, type, data, size)
- API::RegCloseKey.call(opened)
- data = data[0, (size + [0].pack('V')).unpack('V')[0]]
- type = (type += [0].pack('V')).unpack('V')[0]
- case type
- when 1
- data.chop
- when 2
- data.chop.gsub(/%([^%]+)%/) { ENV[$1] || $& }
- when 3
- data
- when 4
- (data += [0].pack('V')).unpack('V')[0]
- when 5
- data.unpack('N')[0]
- when 7
- data.split(/\0/)
- when 11
- (data.unpack('VV')[1] << 32) | data[0]
- else
- nil
- end
- end
- #-------------------------------------------------------------------------
- # * Enum Keys
- #-------------------------------------------------------------------------
- def enum_keys(key)
- key.sub!(/(.*?)\\/, '')
- if HKEYS[$1] != nil
- hkey = HKEYS[$1]
- else
- return nil
- end
- index, keys, opened = 0, [], [0].pack('V')
- API::RegOpenKeyExA.call(hkey, key, 0, 131097, opened)
- opened = (opened + [0].pack('V')).unpack('V')[0]
- loop do
- name = ' ' * 514
- size = [514].pack('V')
- result = API::RegEnumKeyExA.call(opened, index, name, size, 0, 0, 0, 0)
- if result == 0
- keys.push(name[0, (size += [0].pack('V')).unpack('V')[0]])
- index += 1
- else
- break
- end
- end
- API::RegCloseKey.call(opened)
- keys
- end
- #-------------------------------------------------------------------------
- # * Enum Entries
- #-------------------------------------------------------------------------
- def enum_entries(key)
- key.sub!(/(.*?)\\/, '')
- if HKEYS[$1] != nil
- hkey = HKEYS[$1]
- else
- return nil
- end
- index, entries, opened = 0, [], [0].pack('V')
- API::RegOpenKeyExA.call(hkey, key, 0, 131097, opened)
- opened = (opened + [0].pack('V')).unpack('V')[0]
- loop do
- name = ' ' * 514
- size = [514].pack('V')
- result = API::RegEnumValueA.call(opened, index, name, size, 0, 0, 0, 0)
- if result == 0
- entries.push(name[0, (size += [0].pack('V')).unpack('V')[0]])
- index += 1
- else
- break
- end
- end
- API::RegCloseKey.call(opened)
- entries
- end
- end
- #---------------------------------------------------------------------------
- # Variables Declaration
- #---------------------------------------------------------------------------
- Active_Window = API::GetActiveWindow.call
- Current_Process_Id = API::GetCurrentProcessId.call
- ASCII_TABLE = {1=>'?',2=>'?',3=>'?',4=>'?',5=>'?',6=>'?',7=>'•',8=>'?',9=>'?',
- 10=>'?',11=>'?',12=>'?',13=>'?',14=>'?',15=>'¤',16=>'?',17=>'?',18=>'?',
- 19=>'?',20=>'¶',21=>'§',22=>'?',23=>'?',24=>'?',25=>'?',26=>'?',27=>'?',
- 28=>'?',29=>'?',30=>'?',31=>'?',32=>' ',33=>'!',34=>'"',35=>'#',36=>'$',
- 37=>'%',38=>'&',39=>"'",40=>'(',41=>')',42=>'*',43=>'+',44=>',',45=>'-',
- 46=>'.',47=>'/',48=>'0',49=>'1',50=>'2',51=>'3',52=>'4',53=>'5',54=>'6',
- 55=>'7',56=>'8',57=>'9',58=>':',59=>';',60=>'<',61=>'=',62=>'>',63=>'?',
- 64=>'@',65=>'A',66=>'B',67=>'C',68=>'D',69=>'E',70=>'F',71=>'G',72=>'H',
- 73=>'I',74=>'J',75=>'K',76=>'L',77=>'M',78=>'N',79=>'O',80=>'P',81=>'Q',
- 82=>'R',83=>'S',84=>'T',85=>'U',86=>'V',87=>'W',88=>'X',89=>'Y',90=>'Z',
- 91=>'[',92=>'\\',93=>']',94=>'^',95=>'_',96=>'`',97=>'a',98=>'b',99=>'c',
- 100=>'d',101=>'e',102=>'f',103=>'g',104=>'h',105=>'i',106=>'j',107=>'k',
- 108=>'l',109=>'m',110=>'n',111=>'o',112=>'p',113=>'q',114=>'r',115=>'s',
- 116=>'t',117=>'u',118=>'v',119=>'w',120=>'x',121=>'y',122=>'z',123=>'{',
- 124=>'|',125=>'}',126=>'~',127=>'¦',128=>'Ç',129=>'ü',130=>'é',131=>'â',
- 132=>'ä',133=>'ŕ',134=>'ĺ',135=>'ç',136=>'ę',137=>'ë',138=>'č',139=>'ď',
- 140=>'î',141=>'ě',142=>'Ä',143=>'Ĺ',144=>'É',145=>'ć',146=>'Ć',147=>'ô',
- 148=>'ö',149=>'ň',150=>'ű',151=>'ů',152=>'˙',153=>'Ö',154=>'Ü',155=>'ř',
- 156=>'Ł',157=>'Ř',158=>'×',159=>'',160=>'á',161=>'í',162=>'ó',163=>'ú',
- 164=>'ń',165=>'Ń',166=>'Ş',167=>'ş',168=>'ż',169=>'®',170=>'¬',171=>'˝',
- 172=>'Ľ',173=>'ˇ',174=>'«',175=>'»',176=>'¦',177=>'¦',178=>'¦',179=>'¦',
- 180=>'¦',181=>'Á',182=>'Â',183=>'Ŕ',184=>'©',185=>'¦',186=>'¦',187=>'+',
- 188=>'+',189=>'˘',190=>'Ą',191=>'+',192=>'+',193=>'-',194=>'-',195=>'+',
- 196=>'-',197=>'+',198=>'ă',199=>'Ă',200=>'+',201=>'+',202=>'-',203=>'-',
- 204=>'¦',205=>'-',206=>'+',207=>'¤',208=>'đ',209=>'Đ',210=>'Ę',211=>'Ë',
- 212=>'Č',213=>'i',214=>'Í',215=>'Î',216=>'Ď',217=>'+',218=>'+',219=>'¦',
- 220=>'_',221=>'¦',222=>'Ě',223=>'Ż',224=>'Ó',225=>'ß',226=>'Ô',227=>'Ň',
- 228=>'ő',229=>'Ő',230=>'µ',231=>'ţ',232=>'Ţ',233=>'Ú',234=>'Ű',235=>'Ů',
- 236=>'ý',237=>'Ý',238=>'Ż',239=>'´',240=>'',241=>'±',242=>'=',243=>'ľ',
- 244=>'¶',245=>'§',246=>'÷',247=>'¸',248=>'°',249=>'¨',250=>'·',251=>'ą',
- 252=>'ł',253=>'˛',254=>'¦',255=>' '}
- TRANSLATE_TABLE = {"\225"=>'•',"\244"=>'¤',"\266"=>'¶',"\247"=>'§',"\307"=>'Ç',
- "\374"=>'ü',"\351"=>'é',"\342"=>'â',"\344"=>'ä',"\340"=>'ŕ',"\345"=>'ĺ',
- "\347"=>'ç',"\352"=>'ę',"\353"=>'ë',"\350"=>'č',"\357"=>'ď',"\356"=>'î',
- "\354"=>'ě',"\304"=>'Ä',"\305"=>'Ĺ',"\311"=>'É',"\346"=>'ć',"\306"=>'Ć',
- "\364"=>'ô',"\366"=>'ö',"\362"=>'ň',"\373"=>'ű',"\371"=>'ů',"\377"=>'˙',
- "\326"=>'Ö',"\334"=>'Ü',"\370"=>'ř',"\243"=>'Ł',"\330"=>'Ř',"\327"=>'×',
- "\203"=>'',"\341"=>'á',"\355"=>'í',"\363"=>'ó',"\372"=>'ú',"\361"=>'ń',
- "\321"=>'Ń',"\252"=>'Ş',"\272"=>'ş',"\277"=>'ż',"\256"=>'®',"\254"=>'¬',
- "\275"=>'˝',"\274"=>'Ľ',"\241"=>'ˇ',"\253"=>'«',"\273"=>'»',"\301"=>'Á',
- "\302"=>'Â',"\300"=>'Ŕ',"\251"=>'©',"\242"=>'˘',"\245"=>'Ą',"\343"=>'ă',
- "\303"=>'Ă',"\244"=>'¤',"\360"=>'đ',"\320"=>'Đ',"\312"=>'Ę',"\313"=>'Ë',
- "\310"=>'Č',"\315"=>'Í',"\316"=>'Î',"\317"=>'Ď',"\314"=>'Ě',"\257"=>'Ż',
- "\323"=>'Ó',"\337"=>'ß',"\324"=>'Ô',"\322"=>'Ň',"\365"=>'ő',"\325"=>'Ő',
- "\265"=>'µ',"\376"=>'ţ',"\336"=>'Ţ',"\332"=>'Ú',"\333"=>'Ű',"\331"=>'Ů',
- "\375"=>'ý',"\335"=>'Ý',"\257"=>'Ż',"\264"=>'´',"\255"=>'',"\261"=>'±',
- "\276"=>'ľ',"\266"=>'¶',"\247"=>'§',"\367"=>'÷',"\270"=>'¸',"\260"=>'°',
- "\250"=>'¨',"\267"=>'·',"\271"=>'ą',"\263"=>'ł',"\262"=>'˛',"\240"=>' ',
- "\t"=>' ',"\200"=>'€'}
- #---------------------------------------------------------------------------
- # * Get Current User Deskot Path
- #---------------------------------------------------------------------------
- def get_current_desktop_path
- key = 'HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\'
- Registry.read_entry(key + 'Explorer\\Shell Folders', 'Desktop')
- end
- #---------------------------------------------------------------------------
- # * Get Current User Personal Folder Path
- #---------------------------------------------------------------------------
- def get_current_userdocuments_path
- key = 'HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\'
- Registry.read_entry(key + 'Explorer\\Shell Folders', 'Personal')
- end
- #---------------------------------------------------------------------------
- # * Get Common Deskot Path
- #---------------------------------------------------------------------------
- def get_common_desktop_path
- key = 'HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\Windows\\CurrentVersion\\'
- Registry.read_entry(key + 'Explorer\\Shell Folders', 'Common Desktop')
- end
- #---------------------------------------------------------------------------
- # * Get Common Users Personal Folder Path
- #---------------------------------------------------------------------------
- def get_common_usersdocuments_path
- key = 'HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\'
- Registry.read_entry(key + 'Explorer\\Shell Folders', 'Common Documents')
- end
- #---------------------------------------------------------------------------
- # * Get Fonts Folder Path
- #---------------------------------------------------------------------------
- def get_fonts_folder_path
- key = 'HKEY_CURRENT_USER\\Software\\Microsoft\\Windows\\CurrentVersion\\'
- Registry.read_entry(key + 'Explorer\\Shell Folders', 'Fonts')
- end
- #---------------------------------------------------------------------------
- # * Get Fonts Names
- #---------------------------------------------------------------------------
- def get_fonts_names
- key = "HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\#{ENV['OS'].sub(/_/,' ')}\\"
- fonts = Registry.enum_entries(key + 'CurrentVersion\\Fonts')
- fonts.each_index {|f|
- fonts[f].sub!(' (TrueType)', '')
- fonts[f] = nil if !Font.exist?(fonts[f])
- }.delete(nil)
- fonts
- end
- #---------------------------------------------------------------------------
- # * Get Mouse Swap Buttons Flag
- #---------------------------------------------------------------------------
- def get_mouse_swap_buttons_flag
- key = 'HKEY_CURRENT_USER\\Control Panel\\Mouse'
- Registry.read_entry(key, 'SwapMouseButtons').to_i
- end
- #---------------------------------------------------------------------------
- # * Get Mouse Position
- #---------------------------------------------------------------------------
- def get_mouse_position
- pos = API.get_cursor_pos
- if pos.nil?
- nil
- else
- pos.unpack('L2')
- end
- end
- #---------------------------------------------------------------------------
- # * Get Mouse Window Position
- #---------------------------------------------------------------------------
- def get_mouse_window_position(hwnd = Active_Window)
- pos = API.get_cursor_pos
- if pos.nil?
- nil
- else
- result = API::ScreenToClient.call(hwnd, pos)
- if result != 0
- pos = pos.unpack('L2')
- max_x, max_y = API.get_client_rect[2] - 1, API.get_client_rect[3] - 1
- if pos[0] >= 0 and pos[1] >= 0 and pos[0] <= max_x and pos[1] <= max_y
- pos
- else
- nil
- end
- else
- nil
- end
- end
- end
- #---------------------------------------------------------------------------
- # * Get Window Rect
- #---------------------------------------------------------------------------
- def get_window_rect(hwnd = Active_Window)
- placement = API.get_window_placement(hwnd)[7..10]
- width = placement[2] - placement[0]
- height = placement[3] - placement[1]
- [placement[0], placement[1], width, height]
- end
- #---------------------------------------------------------------------------
- # * Get Keyboard Layout Name
- #---------------------------------------------------------------------------
- def get_keyboard_layout_name
- id = API.get_keyboard_layout_name
- key='HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Keyboard Layout'
- name = Registry.read_entry(key + 's\\' + id, 'Layout Text')
- initials = Registry.read_entry(key + '\\DosKeybCodes', id)
- name = name.nil? ? '' : name
- initials = initials.nil? ? '' :initials
- [translate_string(name), translate_string(initials)]
- end
- #---------------------------------------------------------------------------
- # * Get Keyboard Layout Name
- #---------------------------------------------------------------------------
- def translate_string(string, arrayed = false)
- translation = []
- string.each_chr do |c|
- if TRANSLATE_TABLE.has_key?(c)
- translation << TRANSLATE_TABLE[c]
- else
- translation << c
- end
- end
- if arrayed
- translation
- else
- translation.join
- end
- end
- #---------------------------------------------------------------------------
- # * check_hang_up
- #---------------------------------------------------------------------------
- def check_hang_up(time)
- if time.sec <= Time.now.sec - 6 or time.min != Time.now.min
- Graphics.update
- Time.now
- else
- time
- end
- end
- end
- #=============================================================================
- # ** Class Array
- #=============================================================================
- class Array
- #---------------------------------------------------------------------------
- # * Clone All
- #---------------------------------------------------------------------------
- def clone_all
- cloned = self.clone
- cloned.each_index do |i|
- cloned[i] = cloned[i].clone_all rescue cloned[i].clone rescue cloned[i]
- end
- cloned
- end
- #---------------------------------------------------------------------------
- # * To Hash
- #---------------------------------------------------------------------------
- def to_hash
- hash = Hash.new
- self.each_index {|i| hash[i] = self[i]}
- hash
- end
- #---------------------------------------------------------------------------
- # * Reverse Indexes
- #---------------------------------------------------------------------------
- def rindexes(*values)
- array = Array.new
- self.each_index {|i| array.push(i) if values.include?(self[i])}
- array
- end
- #---------------------------------------------------------------------------
- # * Deep
- #---------------------------------------------------------------------------
- def deep(deep = -1)
- tmp_deep = deep + 1
- deep = tmp_deep
- self.each do |i|
- deep = i.deep(tmp_deep) if deep < i.deep(tmp_deep) rescue nil
- end
- deep
- end
- #---------------------------------------------------------------------------
- # * Flatten All
- #---------------------------------------------------------------------------
- def all_flatten
- array = self.clone_all
- array.each_index do |i|
- if array[i].is_a?(Hash)
- array[i] = array[i].to_a
- end
- array[i] = array[i].all_flatten rescue array[i]
- end
- array.flatten!
- array
- end
- #---------------------------------------------------------------------------
- # * Destructive Flatten All
- #---------------------------------------------------------------------------
- def all_flatten!
- self.each_index do |i|
- if self[i].is_a?(Hash)
- self[i] = self[i].to_a
- end
- self[i] = self[i].all_flatten rescue self[i]
- end
- self.flatten!
- self
- end
- #---------------------------------------------------------------------------
- # * Insert
- #---------------------------------------------------------------------------
- def insert(*args)
- array = self.clone
- to_insert = args[1, args.size - 1]
- args[0] = [args[0], array.size - 1].min
- return array.reverse.concat(to_insert).reverse if args[0] < 0
- array[0..args[0]].concat(to_insert).concat(array[args[0] + 1...array.size])
- end
- end
- #=============================================================================
- # ** Class Bitmap
- #=============================================================================
- class Bitmap
- #---------------------------------------------------------------------------
- # * Initialize
- #---------------------------------------------------------------------------
- if @alibrary_aleworks_bitmap_initialize.nil?
- alias_method(:alibrary_aleworks_bitmap_initialize, :initialize)
- @alibrary_aleworks_bitmap_initialize = true
- end
- def initialize(*args)
- alibrary_aleworks_bitmap_initialize(*args)
- if block_given?
- yield self
- self.dispose unless self.disposed?
- end
- end
- #---------------------------------------------------------------------------
- # * Draw Text
- #---------------------------------------------------------------------------
- unless self.method_defined?(:alibrary_aleworks_bitmap_drawtext)
- alias_method(:alibrary_aleworks_bitmap_drawtext, :draw_text)
- end
- def draw_text(*args)
- if args.size.between?(2,3)
- args[2] = 0 if args.size == 2
- args[4] = args[1]
- args[5] = args[2]
- args[1] = args[0].y
- args[2] = args[0].width
- args[3] = args[0].height
- args[0] = args[0].x
- elsif args.size == 5
- args[5] = 0
- end
- if args[4].is_a?(Array)
- args[4].all_flatten!
- args[4].each do |t|
- t = t.nil? ? 'nil' : "#{t}"
- width = args[2].nil? ? self.text_size(t).width : args[2]
- height = args[3].nil? ? self.text_size('0').height : args[3]
- self.draw_text(args[0], args[1], width, height, t, args[5])
- args[1] += height
- end
- return
- elsif args[4].is_a?(Hash)
- args[4] = args[4].fusion
- args[4].all_flatten!
- args[4].each do |t|
- t = t.nil? ? 'nil' : "#{t}"
- width = args[2].nil? ? self.text_size(t).width : args[2]
- height = args[3].nil? ? self.text_size('0').height : args[3]
- self.draw_text(args[0], args[1], width, height, t, args[5])
- args[1] += height
- end
- return
- elsif !args[4].is_a?(String)
- if args[4].to_s == ''
- args[4] = args[4].inspect
- else
- args[4] = args[4].to_s
- end
- end
- args[2] = args[2].nil? ? self.text_size(args[4]).width + 2 : args[2]
- args[3] = args[3].nil? ? self.text_size('0').height + 2 : args[3]
- alibrary_aleworks_bitmap_drawtext(*args)
- end
- #---------------------------------------------------------------------------
- # * Bitmap Save in Bmp Format
- #---------------------------------------------------------------------------
- def bmp_dump(filename = nil, background_color = nil)
- bmp = self
- filename = "#{bmp.object_id}" if filename.nil?
- filename += '.bmp' if File.extname(filename) != '.bmp'
- if !background_color.nil?
- temp_bmp = bmp.clone
- rect = Rect.new(0, 0, temp_bmp.width, temp_bmp.height)
- bmp = Bitmap.new(temp_bmp.width, temp_bmp.height)
- bmp.fill_rect(rect, background_color)
- bmp.stretch_blt(rect, temp_bmp, rect)
- temp_bmp.dispose
- Graphics.update
- end
- file = File.open(filename, 'wb')
- file.write('BM')
- file.write([54 + (bmp.width * bmp.height * 24) / 8].pack('L'))
- file.write('ALEW')
- file.write([54].pack('L'))
- file.write([40].pack('L'))
- file.write([bmp.width].pack('L'))
- file.write([bmp.height].pack('L'))
- file.write([1].pack('L')[0, 2])
- file.write([24].pack('L')[0, 2])
- file.write([0, 0, 0, 0, 0, 0].pack('L6'))
- null_spaces = 0
- if bmp.width / 4 != bmp.width / 4.0
- if (bmp.width + 1) / 4 == (bmp.width + 1) / 4.0
- null_spaces = 1
- elsif (bmp.width + 2) / 4 == (bmp.width + 2) / 4.0
- null_spaces = 2
- elsif (bmp.width + 3) / 4 == (bmp.width + 3) / 4.0
- null_spaces = 3
- end
- end
- time = Time.now
- last_porcentage = -1
- for y in (-bmp.height + 1)..0
- line = ''
- for x in 0...bmp.width
- color = bmp.get_pixel(x, y.abs)
- line += [color.blue.to_i].pack('L')[0, 1]
- line += [color.green.to_i].pack('L')[0, 1]
- line += [color.red.to_i].pack('L')[0, 1]
- time = Aleworks.check_hang_up(time)
- if block_given?
- porcentage = (((y + bmp.height) * bmp.width + x)) * 100
- porcentage /= bmp.height * bmp.width
- if porcentage > last_porcentage
- yield porcentage
- last_porcentage = porcentage
- end
- end
- end
- file.write(line)
- time = Aleworks.check_hang_up(time)
- end
- file.close
- end
- end
- #=============================================================================
- # ** Class Hash
- #=============================================================================
- class Hash
- #---------------------------------------------------------------------------
- # * Clone All
- #---------------------------------------------------------------------------
- def clone_all
- cloned = self.clone
- cloned.each_key do |i|
- cloned[i] = cloned[i].clone_all rescue cloned[i].clone rescue cloned[i]
- end
- cloned
- end
- #---------------------------------------------------------------------------
- # * Deep
- #---------------------------------------------------------------------------
- def deep(deep = -1)
- tmp_deep = deep + 1
- key_deep = tmp_deep
- value_deep = tmp_deep
- self.each do |k, v|
- key_deep = k.deep(tmp_deep) if key_deep < k.deep(tmp_deep) rescue nil
- value_deep = v.deep(tmp_deep) if value_deep < v.deep(tmp_deep) rescue nil
- end
- if key_deep > value_deep
- key_deep
- else
- value_deep
- end
- end
- #---------------------------------------------------------------------------
- # * To Array, combining Key and Value
- #---------------------------------------------------------------------------
- def fusion
- array = self.sort
- array.each_index do|i|
- begin
- array[i] = array[i][0] + array[i][1]
- rescue
- raise Errno::EINVAL, "Can't fusion Hash"
- end
- end
- end
- end
- #=============================================================================
- # ** Nil Class
- #=============================================================================
- class NilClass
- def clone;end
- end
- #=============================================================================
- # ** Class String
- #=============================================================================
- class String
- #---------------------------------------------------------------------------
- # * Pixel Width of String
- #---------------------------------------------------------------------------
- def pixel_width(*args)
- if args[0].is_a?(Font)
- size = args[0].size
- name = args[0].name
- bold = args[0].bold
- else
- size = args[0].nil? ? Font.default_size : args[0]
- name = args[1].nil? ? Font.default_name : args[1]
- bold = args[2].nil? ? Font.default_bold : args[2]
- end
- pix = 0
- Bitmap.new(1, 1) do |bitmap|
- bitmap.font.name = name
- bitmap.font.size = size
- bitmap.font.bold = bold
- pix = bitmap.text_size(self).width
- end
- pix
- end
- #---------------------------------------------------------------------------
- # * Pixel Height of String
- #---------------------------------------------------------------------------
- def pixel_height(*args)
- if args[0].is_a?(Font)
- size = args[0].size
- name = args[0].name
- bold = args[0].bold
- else
- size = args[0].nil? ? Font.default_size : args[0]
- name = args[1].nil? ? Font.default_name : args[1]
- bold = args[2].nil? ? Font.default_bold : args[2]
- end
- pix = 0
- Bitmap.new(1, 1) do |bitmap|
- bitmap.font.name = name
- bitmap.font.size = size
- bitmap.font.bold = bold
- pix = bitmap.text_size(self).height
- end
- pix
- end
- #---------------------------------------------------------------------------
- # * Cut String to Strings with less or equal size than Width
- #---------------------------------------------------------------------------
- def width_slice(width, *args)
- if args[0].is_a?(Font)
- size = args[0].size
- name = args[0].name
- bold = args[0].bold
- else
- size = args[0].nil? ? Font.default_size : args[0]
- name = args[1].nil? ? Font.default_name : args[1]
- bold = args[2].nil? ? Font.default_bold : args[2]
- end
- result = ['']
- txt = self.clone
- txt = txt.cscan
- Bitmap.new(1, 1) do |bitmap|
- bitmap.font.name = name
- bitmap.font.size = size
- bitmap.font.bold = bold
- txt.each_index do |i|
- if txt[i].is_a?(String)
- txt[i] = [txt[i], bitmap.text_size(txt[i]).width]
- if txt.include?(txt[i][0])
- txt.collect! do |e|
- if e == txt[i][0]
- txt[i]
- else
- e
- end
- end
- end
- end
- end
- end
- act_width = 0
- loop do
- if txt.size > 0
- tmp_width = act_width + txt[0][1]
- tmp_width += txt[1][1] if txt.size > 1
- if width >= act_width + txt[0][1]
- result[result.size - 1] += txt[0][0]
- act_width += txt[0][1]
- txt.delete_at(0)
- else
- result.push('')
- act_width = 0
- end
- else
- break
- end
- end
- result
- end
- #---------------------------------------------------------------------------
- # * Max Font Size for Width
- #---------------------------------------------------------------------------
- def font_size_width(width, *args)
- if args[0].is_a?(Font)
- name = args[0].name
- bold = args[0].bold
- else
- name = args[0].nil? ? Font.default_name : args[0]
- bold = args[1].nil? ? Font.default_bold : args[1]
- end
- size = 6
- Bitmap.new(1, 1) do |bitmap|
- bitmap.font.name = name
- bitmap.font.bold = bold
- for i in 6..96
- bitmap.font.size = i
- size = i if bitmap.text_size(self).width <= width
- end
- end
- size
- end
- #---------------------------------------------------------------------------
- # * Max Font Size for Height
- #---------------------------------------------------------------------------
- def font_size_height(height, *args)
- if args[0].is_a?(Font)
- name = args[0].name
- bold = args[0].bold
- else
- name = args[0].nil? ? Font.default_name : args[0]
- bold = args[1].nil? ? Font.default_bold : args[1]
- end
- size = 6
- Bitmap.new(1, 1) do |bitmap|
- bitmap.font.name = name
- bitmap.font.bold = bold
- for i in 6..96
- bitmap.font.size = i
- size = i if bitmap.text_size(self).height <= height
- end
- end
- size
- end
- #---------------------------------------------------------------------------
- # * Max Font Size for Width & Height
- #---------------------------------------------------------------------------
- def font_size(width, height, *args)
- if args[0].is_a?(Font)
- name = args[0].name
- bold = args[0].bold
- else
- name = args[0].nil? ? Font.default_name : args[0]
- bold = args[1].nil? ? Font.default_bold : args[1]
- end
- size = 6
- Bitmap.new(1, 1) do |bitmap|
- bitmap.font.name = name
- bitmap.font.bold = bold
- for i in 6..96
- bitmap.font.size = i
- if bitmap.text_size(self).width <= width and
- bitmap.text_size(self).height <= height
- size = i
- end
- end
- end
- size
- end
- #---------------------------------------------------------------------------
- # * Insert
- #---------------------------------------------------------------------------
- def insert(*args)
- string = self
- to_insert = args[1, args.size - 1].join
- args[0] = [args[0], string.size - 1].min
- string[0..args[0]] + to_insert + string[args[0] + 1...string.size]
- end
- #---------------------------------------------------------------------------
- # * Iterate each Character
- #---------------------------------------------------------------------------
- def each_chr
- self.cscan.each {|chr| yield chr}
- end
- #---------------------------------------------------------------------------
- # * Character Scan
- #---------------------------------------------------------------------------
- def cscan
- chrs = []
- for i in 0...self.size
- chrs.push(self[i..i])
- end
- chrs
- end
- #---------------------------------------------------------------------------
- # * One Character Scan
- #---------------------------------------------------------------------------
- def oscan
- self.scan(/./)
- end
- #---------------------------------------------------------------------------
- # * To ASCII Integer
- #---------------------------------------------------------------------------
- def to_ascii_i
- self.unpack('B8')[0].to_i(2)
- end
- #---------------------------------------------------------------------------
- # * Transform the undrawable Characters
- #---------------------------------------------------------------------------
- def trans_undrawable_chr(font = Font.new, chr = '?')
- bmp = Bitmap.new(1, 1)
- bmp.font= font
- txt = ''
- oscan.each {|c| txt += (bmp.text_size(c).width == 0) ? chr : c}
- txt
- end
- end
- #=============================================================================
- # ** Module Graphics
- #=============================================================================
- module Graphics
- Update = []
- class << self
- #-------------------------------------------------------------------------
- # * Multiple Graphics update & objects update
- #-------------------------------------------------------------------------
- unless self.method_defined?(:alibrary_aleworks_graphics_update)
- alias_method(:alibrary_aleworks_graphics_update, :update)
- end
- def update(frames = 0)
- alibrary_aleworks_graphics_update
- Update.each {|k| k[0].method(k[1]).call}
- update(frames - 1) if frames > 0
- end
- end
- end
Advertisement
Add Comment
Please, Sign In to add comment