Special mouse script

● ARCHIVED · READ-ONLY
Started by Tw0Face 6 posts View original ↗
  1. I was curious if there was a script for using the mouse where I could make Conditional Branches for different mouse keys. For example, it would be cool to change a Show Picture when the mouse wheel is being scrolled (e.g. to change weapons by using the mouse wheel). Also, it would be a good idea to be able to scroll through Choice Windows using the mouse wheel and then left click to confirm/right click to cancel. There are a lot of mouse scripts out there, but it seems like they can't do that. But maybe you guys know more?

    Greetings,
    Tw0Face
  2. There are some mouse scripts that can do mouse scrolls.
    I think one of them was Jet's Mouse script, but that one kills the FPS on older PCs.
    There was also Dekita's Input system which comes with mouse scroll checks too. This one won't jack your FPS.

    And there is the RGD upgrade for VX Ace, which has a built-in mouse module including mouse scroll checks. That one won't affect performance, well, not in a bad way, at least (it will most probably improve overall performance if you install that).
    You can find it here:
    https://forums.rpgmakerweb.com/index.php?threads/rgd-directx-implementation-of-rgss3.95228/
    Note that it changes a lot of things, so you could get into some compatibility issues with it.

    Choose the one you like.
    Just be aware that these are just ways to check for the mouse, they do not add the features you requested directly, but depending on your choice, the code for what you request will differ. So, before anyone does anything about these features, you should choose one mouse script, and let the people here know about that choice.
  3. I checked on Dekita's Input system, but it seems like it won't run with Hanzo Kimura's Animated Title Screen. Sadly, most of the mouse scripts from the internet won't work with Hanzo or MOG - Scene File A (V1.3). I was looking for RGD upgrade for VX Ace as well but it wasn't working for me. I don't want to run into some unpredictable compatibility issues as I don't know what else they changed in the default scripts. What's left over is Jet's Mouse script. I saw over the script but I don't see how it supports mouse wheel checks.
  4. Like I wrote, the features you asked are not directly implemented just by installing these mouse scripts.
    Spoiler
    Code:
      def scroll
        msg = "\0" * 32
        Get_Message.call(msg, @handle, 0, 0)
        r = wmcallback(unpack_msg(msg))
        return r if !r.nil?
      end
    This part of the code will return the delta of the mouse scroll.
    But other than that, it won't do anything. It's like checking for a key press. Just by doing that, it won't change anything in the game, you need to trigger something else based on that check.

    That's why I wrote that before anyone could make the features you asked for, you must choose a mouse script, because different mouse scripts may use different method names for checking the mouse scroll.
  5. Thanks for the reply, @Sixth. I would go with this one:

    Jets Mouse System
    Code:
    #===============================================================================
    # Mouse System
    # By Jet10985(Jet)
    # Some code by Daniel Martin
    #===============================================================================
    # This script will allow full use of the mouse inside of Ace for various
    # purposes.
    # This script has: 13 customization options.
    #===============================================================================
    # Overwritten Methods:
    # Game_Player: move_by_input
    # Window_NameInput: item_max
    #-------------------------------------------------------------------------------
    # Aliased methods:
    # Scene_Title: start
    # Scene_Map: update, terminate, update_transfer_player
    # Input: update, trigger?, press?, repeat?, dir8/dir4
    # Window_Selectable: update
    # Scene_File: update, top_index=
    # Game_Event: update, setup_page
    # Game_Player: check_action_event, get_on_off_vehicle
    # Game_System: initialize, on_after_load
    #===============================================================================
    =begin
    Showing text above event when mouse hovers:
    
    If you want a message to appear over an event's head if the mouse is hovering
    over the event, put this comment in the event:
    
    MOUSE TEXT MESSAGE HERE
    
    everything after TEXT will be the hovering display.
    --------------------------------------------------------------------------------
    Change mouse picture above event when mouse hovers:
    
    If you want the mouse's picture to temporarily change whne over an event, put
    this comment in the event
    
    MOUSE PIC NAME/NUMBER
    
    if you put a name, the mouse will become that picture, but if you put a number
    then the mouse will become the icon that is the id number
    --------------------------------------------------------------------------------
    Specific mouse click movement routes:
    
    If you want the player to land specifically in a square around an event when
    they click to move on the event, put one of these comments in the event:
    
    MOUSE MOVE UP/LEFT/RIGHT/DOWN
    
    only put the direction that you want the player to land on.
    --------------------------------------------------------------------------------
    Click to activate:
    
    If you want an event to automatically start when it is clicked on, place
    this in an event comment:
    
    MOUSE CLICK
    --------------------------------------------------------------------------------
    Ignore Events:
    
    To have an event be ignored when the mouse makes it's movement path(as if the
    event isn't there), put this comment in the event:
    
    MOUSE THROUGH
    --------------------------------------------------------------------------------
    You can do some extra things with the mouse using event "Script..." commands:
    
    Mouse.set_pos(x, y) will set the mouse's position to the x and y specified.
    
    Mouse.area?(x, y, width, height) will check if the mouse is inside the given
    rectangle, on-screen. This does not account for a scrolled map.
    
    Mouse.grid will return where on the screen the mouse is, not accounting for
    a scrolled map. Returns an array: [x, y]
    
    Mouse.true_grid will return where on the map the mouse is, accounting for a
    scrolled map. Returns an array: [x, y]
    
    Mouse.click?(1 or 2) will return true/false depending on if a mouse button was
    clicked, in only the current frame. Use 1 for left-click, 2 for right-click.
    
    Mouse.press?(1 or 2) will return true/false depending on if a mouse button is
    currently being pressed. Use 1 for left-click, 2 for right-click.
    
    swap_mouse_cursor(data) will change the idle look of the mouse icon, and it will
    persist on the savefile. data is either the name of a picture eg "cursor-icon2"
    or the number of an icon eg 12. Images should be in quotes, whereas icons should
    just be the number.
    --------------------------------------------------------------------------------
    Extra Notes:
    
    You can activate action button events by standing next to the event and clicking
    on it with the mouse.
    =end
    
    module Jet
      module MouseSystem
       
       # This is the image used to display the cursor in-game.
       CURSOR_IMAGE = "cursor-picture"
       
       # If the above image does not exist, the icon at this index will be used.
       CURSOR_ICON = 147
       
       # turning ths switch on will completely disable the mouse.
       TURN_MOUSE_OFF_SWITCH = 99
       
       # Do you want the player to be able to move using the mouse?
       # This can be changed in-game using toggle_mouse_movement(true/false)
       ALLOW_MOUSE_MOVEMENT = true
       
       # Do you want to check for diagonal movement as well? Please note this
       # enables regular diagonal movement with the keyboard as well.
       DO_DIAGONAL_MOVEMENT = false
       
       # If the tile they click on for movement is not passable, do you want
       # to check the surround tiles for a movable area?
       CHECK_FOR_MOVES = true
       
       # Would you like a black box to outline the exact tile the mouse is over?
       DEV_OUTLINE = true
       
       # Do you want the mouse to be confined to the game window?
       CLIP_CURSOR = true
       
       # Allow the use of the mouse wheel to scroll selectable windows?
       USE_WHEEL_DETECTION = true
       
      end
     
      module HoverText
       
       # This is the font for the hovering mouse text.
       FONT = "Verdana"
       
       # This is the font color for hovering mouse text.
       COLOR = Color.new(255, 255, 255, 255)
       
       # This is the font size for hovering mouse text.
       SIZE = 20
       
      end
     
      module Pathfinder
       
       # While mainly for coders, you may change this value to allow the
       # pathfinder more time to find a path. 1000 is default, as it is enough for
       # a 100x100 maze.
       MAXIMUM_ITERATIONS = 1000
       
       # This is a hash of directional values, please don't modify this.
       DIRECTIONAL_VALUES = {[1, 0] => 6, [-1, 0] => 4, [0, 1] => 2, [0, -1] => 8,
           [-1, 1] => 1, [-1, -1] => 7, [1, 1] => 3, [1, -1] => 9}
           
       # This is a hash of diagonal keys, please don't modify this.
       DIAGONAL_VALUES = {[-1, 1] => [4, 2], [-1, -1] => [4, 8],
           [1, 1] => [6, 2], [1, -1] => [6, 8], [1, 0] => [6, 6], [-1, 0] => [4, 4],
           [0, 1] => [2, 2], [0, -1] => [8, 8]}
       
      end
    end
    
    #===============================================================================
    # DON'T EDIT FURTHER UNLESS YOU KNOW WHAT TO DO.
    #===============================================================================
    module Mouse
     
      ClipCursor = Win32API.new('user32', 'ClipCursor', 'p', 'l')
      Get_Message = Win32API.new('user32', 'GetMessage', 'plll', 'l')
      GetAsyncKeyState = Win32API.new("user32", "GetAsyncKeyState", 'i', 'i')
      GetKeyState = Win32API.new("user32", "GetKeyState", 'i', 'i')
      GetCursorPo = Win32API.new('user32', 'GetCursorPos', 'p', 'i')
      SetCursorPos = Win32API.new('user32', 'SetCursorPos', 'nn', 'n')
      ScreenToClient = Win32API.new('user32', 'ScreenToClient', 'lp', 'i')
      GetClientRect = Win32API.new('user32', 'GetClientRect', 'lp', 'i')
      GetWindowRect = Win32API.new('user32', 'GetWindowRect', 'lp', 'i')
      a = Win32API.new('kernel32', 'GetPrivateProfileString', 'pppplp', 'l')
      b = Win32API.new('user32', 'FindWindow', 'pp', 'i')
      a.call("Game", "Title", "", title = "\0" * 256, 256, ".//Game.ini")
      @handle = b.call("RGSS Player", title.unpack("C*").collect {|a| a.chr }.join.delete!("\0"))
     
      Win32API.new('user32', 'ShowCursor', 'i', 'i').call(0)
     
      Point = Struct.new(:x, :y)
     
      Message = Struct.new(:message, :wparam, :lparam, :pt)
     
      Param = Struct.new(:x, :y, :scroll)
     
      Scroll = 0x0000020A
     
      module_function
     
    
      def hiword(dword)
       return((dword & 0xffff0000) >> 16) & 0x0000ffff
      end
     
      def loword(dword)
       return dword & 0x0000ffff
      end
       
      def word2signed_short(value)
       return value if (value & 0x8000) == 0
       return -1 *((~value & 0x7fff) + 1)
      end
     
      def unpack_dword(buffer, offset = 0)
       bitso = buffer.bytes.to_a
       ret = bitso[offset + 0] & 0x000000ff
       ret |=(bitso[offset + 1] << (8 * 1)) & 0x0000ff00
       ret |=(bitso[offset + 2] << (8 * 2)) & 0x00ff0000
       ret |=(bitso[offset + 3] << (8 * 3)) & 0xff000000
       return ret
      end
     
      def unpack_msg(buffer)
       msg = Message.new
       msg.pt = Point.new
       msg.message = unpack_dword(buffer,4 * 1)
       msg.wparam = unpack_dword(buffer, 4 * 2)
       msg.lparam = unpack_dword(buffer,4 * 3)
       msg.pt.x = unpack_dword(buffer, 4 * 5)
       msg.pt.y = unpack_dword(buffer, 4 * 6)
       return msg
      end
     
      def wmcallback(msg)
       return unless msg.message == Scroll
       param = Param.new
       param.x = word2signed_short(loword(msg.lparam))
       param.y = word2signed_short(hiword(msg.lparam))
       param.scroll = word2signed_short(hiword(msg.wparam))
       return [param.x, param.y, param.scroll]
      end
     
      def scroll
       msg = "\0" * 32
       Get_Message.call(msg, @handle, 0, 0)
       r = wmcallback(unpack_msg(msg))
       return r if !r.nil?
      end
     
      def click?(button)
       return true if @keys.include?(button)
       return false
      end
     
      def press?(button)
       return true if @press.include?(button)
       return false
      end
     
      def set_pos(x_pos = 0, y_pos = 0)
       rect = client_rect
       width = rect[2] - rect[0]
       height = rect[3] - rect[1]
       if (x_pos.between?(0, width) && y_pos.between?(0, height))
         SetCursorPos.call(rect[0] + x_pos, rect[1] + y_pos)
       end
      end
     
      def moved?
       @pos != @old_pos
      end
     
      def cursor
       @cursor
      end
     
      def set_cursor(image)
       (@cursor ||= Sprite_Cursor.new).set_cursor(image)
      end
     
      def revert_cursor
       (@cursor ||= Sprite_Cursor.new).revert
      end
     
      def update
       ClipCursor.call(client_rect.pack('l4')) if Jet::MouseSystem::CLIP_CURSOR
       if !$game_switches.nil?
         if $game_switches[Jet::MouseSystem::TURN_MOUSE_OFF_SWITCH]
           @keys, @press = [], []
           @pos = [-1, -1]
           @cursor.update
           return
         end
       end
       @old_pos = @pos.dup
       @pos = Mouse.pos
       @keys.clear
       @press.clear
       @keys.push(1) if GetAsyncKeyState.call(1) & 0x01 == 1
       @keys.push(2) if GetAsyncKeyState.call(2) & 0x01 == 1
       @keys.push(3) if GetAsyncKeyState.call(4) & 0x01 == 1
       @press.push(1) if pressed?(1)
       @press.push(2) if pressed?(2)
       @press.push(3) if pressed?(4)
       @cursor.update rescue @cursor = Sprite_Cursor.new
      end
     
      def init
       @keys = []
       @press = []
       @pos = Mouse.pos
       @cursor = Sprite_Cursor.new
      end
     
      def pressed?(key)
       return true unless GetKeyState.call(key).between?(0, 1)
       return false
      end
     
      def global_pos
       pos = [0, 0].pack('ll')
       GetCursorPo.call(pos) != 0 ? (return pos.unpack('ll')) : (return [0, 0])
      end
     
      def pos
       x, y = screen_to_client(*global_pos)
       width, height = client_size
       begin
         x = 0 if x <= 0; y = 0 if y <= 0
         x = width if x >= width; y = height if y >= height
         return x, y
       end
      end
     
      def screen_to_client(x, y)
       return nil unless x && y
       pos = [x, y].pack('ll')
       if ScreenToClient.call(@handle, pos) != 0
         return pos.unpack('ll')
       else
         return [0, 0]
       end
      end
     
      def client_size
       rect = [0, 0, 0, 0].pack('l4')
       GetClientRect.call(@handle, rect)
       right,bottom = rect.unpack('l4')[2..3]
       return right, bottom
      end
     
      def client_rect
       rect = [0, 0, 0, 0].pack('l4')
       GetWindowRect.call(@handle || @hwnd, rect)
       posi = rect.unpack('l4')[0..1]
       GetClientRect.call(@handle || @hwnd, rect)
       size = rect.unpack('l4')[2..3]
       scr = screen_to_client(*posi)
       x1 = posi[0] + scr[0].abs
       y1 = posi[1] + scr[1].abs
       x2 = size[0] + posi[0]
       y2 = size[1] + posi[1] + scr[1].abs
       rect = [x1, y1, x2, y2]
       rect
      end
     
      def grid
       [(@pos[0]/32),(@pos[1]/32)]
      end
     
      def true_grid
       xy = @pos
       x = ((xy[0] + ($game_map.display_x * 32)) / 32).floor
       y = ((xy[1] + ($game_map.display_y * 32)) / 32).floor
       [x, y]
      end
     
      def grid_by_pos
       [pos[0] / 32, pos[1] / 32]
      end
     
      def true_grid_by_pos
       xy = pos
       x = ((xy[0] + ($game_map.display_x * 32)) / 32).floor
       y = ((xy[1] + ($game_map.display_y * 32)) / 32).floor
       [x, y]
      end
     
      def area?(x, y, width, height)
       @pos[0].between?(x, width + x) && @pos[1].between?(y, height + y)
      end
     
      class Sprite_Cursor < Sprite
       
       attr_reader :cursor_bitmap
       
       def initialize
         super(nil)
         self.z = 50000
         @bitmap_cache = initial_bitmap
         if Jet::MouseSystem::DEV_OUTLINE
           @outline = Sprite.new(nil)
           @outline.bitmap = Bitmap.new(32, 32)
           @outline.bitmap.fill_rect(0, 0, 32, 32, Color.new(0, 0, 0, 190))
           @outline.bitmap.fill_rect(1, 1, 30, 30, Color.new(0, 0, 0, 0))
         end
       end
       
       def swap_bitmap(data)
         begin
           self.bitmap = Cache.picture(data)
         rescue
           self.bitmap = Bitmap.new(24, 24)
           icon_index = data
           rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
           self.bitmap.blt(0, 0, Cache.system("Iconset"), rect, 255)
         end
         @bitmap_cache = self.bitmap.dup
         @cursor_bitmap = data
       end
       
       def initial_bitmap
         begin
           self.bitmap = Cache.picture(Jet::MouseSystem::CURSOR_IMAGE)
           @cursor_bitmap = Jet::MouseSystem::CURSOR_IMAGE
         rescue
           self.bitmap = Bitmap.new(24, 24)
           icon_index = Jet::MouseSystem::CURSOR_ICON
           rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
           self.bitmap.blt(0, 0, Cache.system("Iconset"), rect, 255)
           @cursor_bitmap = Jet::MouseSystem::CURSOR_ICON
         end
         self.bitmap.dup
       end
       
       def set_cursor(image)
         if image.is_a?(Integer)
           self.bitmap = Bitmap.new(24, 24)
           icon_index = image
           rect = Rect.new(icon_index % 16 * 24, icon_index / 16 * 24, 24, 24)
           self.bitmap.blt(0, 0, Cache.system("Iconset"), rect, 255)
         else
           self.bitmap = Cache.picture(image)
         end
       end
       
       def revert
         self.bitmap = @bitmap_cache.dup
       end
       
       def update
         super
         self.x, self.y = *Mouse.pos
         self.visible = !$game_switches[Jet::MouseSystem::TURN_MOUSE_OFF_SWITCH]
         if !@outline.nil?
           @outline.visible = SceneManager.scene_is?(Scene_Map)
           x = Mouse.true_grid_by_pos[0] * 32
           x -= $game_map.display_x.floor * 32
           x -= ($game_map.display_x % 1) * 32
           y = Mouse.true_grid_by_pos[1] * 32
           y -= $game_map.display_y.floor * 32
           y -= ($game_map.display_y % 1) * 32
           @outline.x = x
           @outline.y = [y, 1].max
         end
       end
      end
    end
    
    Mouse.init
    
    class << Input
    
      alias jet5888_press? press?
      def press?(arg)
       if arg == Input::C
         return true if Mouse.press?(1)
       elsif arg == Input::B
         return true if Mouse.press?(2)
       end
       jet5888_press?(arg)
      end
     
      alias jet5888_repeat? repeat?
      def repeat?(arg)
       if arg == Input::C
         return true if Mouse.click?(1)
       elsif arg == Input::B
         return true if Mouse.click?(2)
       end
       jet5888_repeat?(arg)
      end
     
      alias jet5888_trigger? trigger?
      def trigger?(arg)
       if arg == Input::C
         return true if Mouse.click?(1)
       elsif arg == Input::B
         return true if Mouse.click?(2)
       end
       jet5888_trigger?(arg)
      end
     
      if Jet::MouseSystem::DO_DIAGONAL_MOVEMENT
     
       alias jet3845_dir8 dir8
       def dir8(*args, &block)
         if (orig = jet3845_dir8(*args, &block)) == 0
           if !$game_temp.nil? && SceneManager.scene_is?(Scene_Map)
             if !(a = $game_temp.mouse_character).nil? && a.movable?
               if !$game_temp.mouse_path.nil? && !$game_temp.mouse_path.empty?
                 return $game_temp.mouse_path.shift
               end
             end
           end
         end
         $game_temp.mouse_path = nil if !$game_temp.nil?
         return orig
       end
       
      else
       
       alias jet3845_dir4 dir4
       def dir4(*args, &block)
         if (orig = jet3845_dir4(*args, &block)) == 0
           if !$game_temp.nil? && SceneManager.scene_is?(Scene_Map)
             if !(a = $game_temp.mouse_character).nil? && a.movable?
               if !$game_temp.mouse_path.nil? && !$game_temp.mouse_path.empty?
                 return $game_temp.mouse_path.shift
               end
             end
           end
         end
         $game_temp.mouse_path = nil if !$game_temp.nil?
         return orig
       end
      end
     
      alias jet8432_update update
      def update(*args, &block)
       jet8432_update(*args, &block)
       Mouse.update
      end
    end
    
    class Window_Selectable
     
      alias jet1084_update update
      def update(*args, &block)
       jet1084_update(*args, &block)
       @scrolled ||= false
       return if $game_switches[Jet::MouseSystem::TURN_MOUSE_OFF_SWITCH]
       update_scroll if self.active && self.visible && Jet::MouseSystem::USE_WHEEL_DETECTION
       update_mouse if self.active && self.visible && (Mouse.moved? or @scrolled)
      end
     
      def update_scroll
       f = Mouse.scroll
       if !f.nil?
         if f[2] < 0
           if contents.height > self.height && self.oy - contents.height < -self.height + 32
             self.top_row = self.top_row + 1
           end
         else
           self.top_row = self.top_row - 1 if contents.height > self.height
         end
         @scrolled = true
       end
      end
     
      def update_mouse
       @scrolled = false
       orig_index = @index
       rects = []
       add_x = self.x + 16 - self.ox
       add_y = self.y + 16 - self.oy
       if !self.viewport.nil?
         add_x += self.viewport.rect.x - self.viewport.ox
         add_y += self.viewport.rect.y - self.viewport.oy
       end
       self.item_max.times {|i|
         @index = i
         mouse_update_cursor
         rects << cursor_rect.dup
       }
       @index = orig_index
       rects.each_with_index {|rect, i|
         if Mouse.area?(rect.x + add_x, rect.y + add_y, rect.width, rect.height)
           @index = i
         end
       }
       update_cursor
       call_update_help
      end
     
      def mouse_update_cursor
       if @cursor_all
         cursor_rect.set(0, 0, contents.width, row_max * item_height)
       elsif @index < 0
         cursor_rect.empty
       else
         cursor_rect.set(item_rect(@index))
       end
      end
    end
    
    class Window_NameInput
     
      def item_max
       90
      end
    end
    
    class Scene_File
     
      alias jet3467_update update
      def update(*args, &block)
       update_mouse if Mouse.moved?
       jet3467_update(*args, &block)
      end
     
      alias jet7222_top_index top_index=
      def top_index=(*args, &block)
       @last_cursor_move = 0 if @last_cursor_move.nil?
       @last_cursor_move -= 1
       return if @last_cursor_move > 0 && Mouse.moved?
       jet7222_top_index(*args, &block)
       @last_cursor_move = 10
      end
     
      def update_mouse
       self.item_max.times {|i|
         ix = @savefile_windows[i].x
         iy = @savefile_windows[i].y + 48 - @savefile_viewport.oy
         iw = @savefile_windows[i].width
         ih = @savefile_windows[i].height
         if Mouse.area?(ix, iy, iw, ih)
           @savefile_windows[@index].selected = false
           @savefile_windows[i].selected = true
           @index = i
         end
       }
       ensure_cursor_visible
      end
    end
    
    class Game_Temp
     
      attr_accessor :mouse_character, :mouse_movement, :mouse_path
     
    end
    
    class Game_Player
     
      def move_by_input
       return if !movable? || $game_map.interpreter.running?
       dir = (Jet::MouseSystem::DO_DIAGONAL_MOVEMENT ? Input.dir8 : Input.dir4)
       if dir % 2 == 0 || !Jet::MouseSystem::DO_DIAGONAL_MOVEMENT
         move_straight(dir) if dir > 0 && dir % 2 == 0
       else
         horz = case dir; when 1,7; 4; when 3,9; 6; end
         vert = case dir; when 7,9; 8; when 1,3; 2; end
         move_diagonal(horz, vert)
       end
      end
     
      alias jet3745_check_action_event check_action_event
      def check_action_event(*args, &block)
       return false unless Input.jet5888_trigger?(:C)
       jet3745_check_action_event(*args, &block)
      end
     
      alias jet3745_get_on_off_vehicle get_on_off_vehicle
      def get_on_off_vehicle(*args, &block)
       if !Input.jet5888_trigger?(:C)
         [:boat, :ship, :airship].each {|a|
           if $game_map.send(a).pos?(*Mouse.true_grid)
             jet3745_get_on_off_vehicle(*args, &block)
             return
           end
         }
       elsif Input.jet5888_trigger?(:C)
         jet3745_get_on_off_vehicle(*args, &block)
       end
      end
     
      def get_on_vehicle_mouse(veh)
       return if vehicle
       @vehicle_type = veh.type
       if vehicle
         turn_toward_character(veh)
         @vehicle_getting_on = true
         force_move_forward unless in_airship?
         @followers.gather
       end
       @vehicle_getting_on
      end
    end
    
    class Window_MousePopUp < Window_Base
     
      def initialize(event, text)
       rect = Bitmap.new(1, 1).text_size(text)
       width = rect.width
       height = rect.height
       super(event.screen_x - width / 2, event.screen_y - 48, width + 32, height + 32)
       self.opacity = 0
       self.contents.font.name = Jet::HoverText::FONT
       self.contents.font.color = Jet::HoverText::COLOR
       self.contents.font.size = Jet::HoverText::SIZE
       @text = text
       @event = event
       refresh
      end
     
      def refresh
       contents.clear
       draw_text(0, 0, contents.width, contents.height, @text)
      end
     
      def update
       super
       self.visible = !@event.erased? && Mouse.true_grid_by_pos == [@event.x, @event.y]
       self.x = @event.screen_x - contents.width / 2 - 8
       self.y = @event.screen_y - 64
      end
    end
    
    class Game_Event
     
      attr_accessor :text_box
     
      def check_for_comment(regexp)
       return false if empty?
       for item in @list
         if item.code == 108 or item.code == 408
           if !item.parameters[0][regexp].nil?
             return $1.nil? ? true : $1
           end
         end
       end
       return false
      end
     
      def mouse_empty?
       return true if empty?
       return @list.reject {|a| [108, 408].include?(a.code) }.size <= 1
      end
     
      alias jet3745_setup_page setup_page
      def setup_page(*args, &block)
       jet3745_setup_page(*args, &block)
       @text_box = nil
       @mouse_activated = nil
       @mouse_cursor = nil
      end
     
      def mouse_activated?
       @mouse_activated ||= check_for_comment(/MOUSE[ ]*CLICK/i)
      end
     
      def text_box
       @text_box ||= (
         if (a = check_for_comment(/MOUSE[ ]*TEXT[ ]*(.+)/i))
           Window_MousePopUp.new(self, a)
         else
           false
         end
       )
      end
     
      def through
       if $game_temp.mouse_movement && check_for_comment(/MOUSE[ ]*THROUGH/i)
         true
       else
         super
       end
      end
     
      def mouse_cursor
       @mouse_cursor ||= (
         if (a = check_for_comment(/MOUSE[ ]*PIC[ ]*(\d+)/i))
           a.to_i
         elsif (a = check_for_comment(/MOUSE[ ]*PIC[ ]*(.+)/i))
           a
         else
           false
         end
       )
      end
     
      def erased?
       @erased
      end
     
      def movable?
       return false if moving?
       return false if $game_message.busy? || $game_message.visible
       return true
      end
     
      def check_mouse_change
       if mouse_cursor
         Mouse.set_cursor(@mouse_cursor)
         return true
       end
       return false
      end
     
      alias jet3845_update update
      def update(*args, &block)
       jet3845_update(*args, &block)
       @text_box.update if text_box
      end
    end
    
    class Game_Vehicle
     
      attr_reader :type
     
    end
    
    class Game_System
     
      attr_accessor :mouse_movement, :cursor_bitmap
     
      alias jet2735_initialize initialize
      def initialize(*args, &block)
       jet2735_initialize(*args, &block)
       @mouse_movement = Jet::MouseSystem::ALLOW_MOUSE_MOVEMENT
       @cursor_bitmap = Mouse.cursor.cursor_bitmap
      end
     
      def change_cursor_bitmap(data)
       Mouse.cursor.swap_bitmap(data)
       @cursor_bitmap = data
      end
     
      alias jet3457_on_after_load on_after_load
      def on_after_load(*args, &block)
       jet3457_on_after_load(*args, &block)
       Mouse.cursor.swap_bitmap(@cursor_bitmap)
      end
    end
    
    class Game_Interpreter
     
      def toggle_mouse_movement(bool)
       $game_system.mouse_movement = bool
      end
     
      def swap_mouse_cursor(data)
       $game_system.change_cursor_bitmap(data)
      end
    end
    
    class Scene_Title
     
      alias jet0019_start start
      def start(*args, &block)
       Mouse.cursor.initial_bitmap
       jet0019_start(*args, &block)
      end
    end
    
    class Scene_Map
     
      alias jet3745_update update
      def update(*args, &block)
       jet3745_update
       check_mouse_movement
       check_mouse_icon_change
      end
     
      alias jet5687_terminate terminate
      def terminate(*args, &block)
       $game_map.events.values.each {|a|
         a.text_box.dispose if a.text_box
         a.text_box = nil
       }
       Mouse.update
       jet5687_terminate(*args, &block)
      end
     
      def mouse_char
       $game_temp.mouse_character
      end
     
      def check_mouse_icon_change
       changed_mouse = false
       $game_map.events_xy(*Mouse.true_grid_by_pos).each {|event|
         changed_mouse = changed_mouse || event.check_mouse_change
       }
       Mouse.revert_cursor unless changed_mouse
      end
    
      def check_mouse_movement
       $game_temp.mouse_character ||= $game_player
       did_dir = false
       if Mouse.click?(1)
         dont_move = false
         x, y = *Mouse.true_grid_by_pos
         evs = $game_map.events_xy(x, y)
         (evs + $game_map.vehicles).each {|event|
           if event.is_a?(Game_Vehicle)
             if (event.x - mouse_char.x).abs + (event.y - mouse_char.y).abs == 1
               mouse_char.get_on_vehicle_mouse(event)
               dont_move = true
             end
           elsif !!!mouse_char.vehicle
             if event.mouse_activated?
               event.start
               dont_move = true
             elsif (event.x - mouse_char.x).abs + (event.y - mouse_char.y).abs == 1
               if !event.mouse_empty? && [0, 1, 2].include?(event.trigger)
                 mouse_char.turn_toward_character(event)
                 event.start
                 dont_move = true
               end
             else
               {UP: [0, -1], DOWN: [0, 1], LEFT: [-1, 0], RIGHT: [1, 0]}.each {|d, a|
                 if event.check_for_comment(/MOUSE[ ]*MOVE[ ]*#{d.to_s}/i)
                   x += a[0]; y += a[1]
                   did_dir = true
                 end
               }
             end
           end
         } if $game_system.mouse_movement
         if $game_system.mouse_movement
           mouse_char.mouse_path(x, y, did_dir) unless dont_move
         else
           evs.each {|event|
             if event.mouse_activated?
               event.start
             end
           }
         end
       end
      end
    end
    
    class Game_CharacterBase
    
      def mouse_path(target_x, target_y, did_dir = false)
       return if target_x == self.x && target_y == self.y
       f = $game_map.find_path(target_x.to_i, target_y.to_i, @x.to_i, @y.to_i, 0, self)
       if f.empty? && !did_dir && Jet::MouseSystem::CHECK_FOR_MOVES
         f = $game_map.find_path(target_x.to_i, target_y.to_i, @x.to_i, @y.to_i, 1, self)
       end
       $game_temp.mouse_path = f
      end
    end
    
    class Node
     
      @@nodes = {}
     
      attr_reader :x, :y
     
      def self.new(*args, &block)
       return @@nodes[args] if @@nodes.include?(args)
       f = allocate
       f.send(:initialize, *args, &block)
       f
      end
    
      def initialize(x, y)
       @x, @y = x, y
       @@nodes[[x, y]] = self
      end
    
      def ==(other)
       return false unless self.class === other
       @x == other.x && @y == other.y
      end
    
      def distance(other)
       (@x - other.x).abs + (@y - other.y).abs
      end
    end
    
    500.times do |x|
      500.times do |y|
       Node.new(x, y)
      end
    end
    
    class Game_Map
    
      def get_node(x, y)
       Node.new(x, y)
      end
    
      def each_neighbor(node, char = $game_player)
       x = node.x
       y = node.y
       nodes = []
       Jet::Pathfinder::DIRECTIONAL_VALUES.each do |value, dir|
         next if [1, 3, 7, 9].include?(dir) && !Jet::MouseSystem::DO_DIAGONAL_MOVEMENT
         dia = Jet::Pathfinder::DIAGONAL_VALUES[value]
         new_x = round_x_with_direction(x, dia[0])
         new_y = round_y_with_direction(y, dia[1])
         if dir % 2 != 0
           next unless char.diagonal_passable?(x, y, dia[0], dia[1])
         else
           next unless char.passable?(x, y, dia[0])
         end
         nodes << get_node(new_x, new_y)
       end
       nodes
      end
     
      def find_path(tx, ty, sx, sy, dist, char = $game_player)
       start = get_node(sx, sy)
       goal = get_node(tx, ty)
       return [] if start == goal or (dist > 0 and start.distance(goal) <= dist)
       return [] if ![2, 4, 6, 8].any? {|i| char.passable?(tx, ty, i) }
       open_set = [start]
       closed_set = []
       path = []
       costs = {}
       costs.default = 0
       costs_estimated = {}
       costs_estimated.default = 0
       parents = {}
       iterations = 0
       loop do
         return [] if iterations == Jet::Pathfinder::MAXIMUM_ITERATIONS
         iterations += 1
         current = open_set.min {|n1, n2| (costs[n1] + costs_estimated[n1]) <=> (costs[n2] + costs_estimated[n2]) }
         return [] unless current
         each_neighbor(current, char).each {|node|
           if node == goal or (dist > 0 and node.distance(goal) <= dist)
             parents[node] = current
             return recreate_path(node, parents)
           end
           next if closed_set.include?(node)
           cost = costs[current] + 1
           if open_set.include?(node)
             if cost < costs[node]
               parents[node] = current
               costs[node] = cost
             end
           else
             open_set << node
             parents[node] = current
             costs[node] = cost
             costs_estimated[node] = node.distance(goal)
           end
         }
         closed_set << open_set.delete(current)
       end
      end
     
      def recreate_path(node, parents)
       path = []
       until node.nil?
         pos = node
         node = parents[node]
         next if node.nil?
         ar = [pos.x <=> node.x, pos.y <=> node.y]
         path << Jet::Pathfinder::DIRECTIONAL_VALUES[ar]
       end
       return path.reverse
      end
    end

    Is it possible to add mouse wheel checks and checks for left and right mouse click in here? Also the main problem is that this script doesn't seem to work with Mog's Save System (MOG - Scene File A (V1.3) and Hanzo Kimura's Animated Title Screen. Maybe someone could help with this issue?

    What do I want to with the mouse? My current controls are:
    - Movement: Arrow Keys
    - Shoot Enemies: D-key
    - Hold Direction (Strafe): S-key
    - Change weapon: A-key

    What I want the controls to be:
    - Movement: WSAD (I'll look for an extra script for doing this)
    - Shoot Enemies: Left mouse key
    - Hold Direction (Strafe): Right mouse key
    - Change weapon: Scroll mouse wheel

    Maybe this information will make things easier.

    Greetings,
    Tw0Face
  6. *opens treasure chest*
    BUMP obtained!

    This topic can be closed!