Super Simple Mouse Script

Discussion in 'RGSS Scripts (RMXP)' started by amaranth, Aug 7, 2013.

    Tags:
  1. amaranth

    amaranth Veteran Veteran

    Messages:
    42
    Likes Received:
    97
    First Language:
    English
    SUPER SIMPLE MOUSE SCRIPT

    Author- Shaz, Near Fantastica, SephirothSpawn, Amaranth

    Introduction

    This script will let you play your RMXP game with the keyboard or a mouse.

    Features

    • Pathfinding
    • Icons on events
    • Custom mouse cursors
    • Mouse-enabled menus
    Screenshots[​IMG]

    Enter the icon name as a comment on the first line. The mouse pointer will change to this icon when it moves over the event.

    Other options go on the second line (if using both the Mouse and the Name option, Name must come second):

    • Mouse[x-offset,y-offset] will make the PC walk to the offset, then turn and interact with the event
    • So, Mouse[1, 2] will make the player walk one tile to the right and two tiles below the event, turn up, and trigger the event.
    • Useful for reading signposts, mailboxes, bookshelves, etc, where you want the player to approach from a specific direction
    • Name abc def will make the name appear next to the event when you move the mouse over it
    [​IMG]

    How to Use

    Add the following scripts above Main.

    Demo

    SuperSimpleMouseSystem.zip

    Mod Note: The above demo does not work anymore. You can find a working demo here.

    Scripts

    Start Game

    module StartGame $game_mouse = true end
    Mouse 1

    #============================================================================== # ** Modules.Mouse Input (7.0) By Near Fantastica & SephirothSpawn#==============================================================================module Mouse #-------------------------------------------------------------------------- # * Mouse to Input Triggers # # key => Input::KeyCONSTANT (key: 0 - Left, 1 - Middle, 2 - Right) #-------------------------------------------------------------------------- Mouse_to_Input_Triggers = {0 => Input::C, 1 => Input::B, 2 => Input::A} #-------------------------------------------------------------------------- # * API Declaration #-------------------------------------------------------------------------- GAKS = Win32API.new('user32', 'GetAsyncKeyState', 'i', 'i') GSM = Win32API.new('user32', 'GetSystemMetrics', 'i', 'i') Cursor_Pos = Win32API.new('user32', 'GetCursorPos', 'p', 'i') $ShowCursor = Win32API.new('user32', 'ShowCursor', 'i', 'l') Scr2cli = Win32API.new('user32', 'ScreenToClient', %w(l p), 'i') Client_rect = Win32API.new('user32', 'GetClientRect', %w(l p), 'i') Findwindow = Win32API.new('user32', 'FindWindowA', %w(p p), 'l') Readini = Win32API.new('kernel32', 'GetPrivateProfileStringA', %w(p p p p l p), 'l') # if graphical effects turned on, show fancy cursor $ShowCursor.call($game_mouse ? 0 : 1) @triggers = [[0, 1], [0, 2], [0, 4]] @old_pos = 0 @pos_i = 0 #-------------------------------------------------------------------------- # * Mouse Grid Position #-------------------------------------------------------------------------- def self.grid # Return Nil if Position is Nil return nil if @pos.nil? # Get X & Y Locations x = (@pos[0] + $game_map.display_x / 4) / 32 y = (@pos[1] + $game_map.display_y / 4) / 32 # Vehicle Stuff $mouse_x = x $mouse_y = y # Return X & Y return [x, y] end #-------------------------------------------------------------------------- # * Mouse Position #-------------------------------------------------------------------------- def self.position return @pos == nil ? [0, 0] : @pos end #-------------------------------------------------------------------------- # * Mouse Global Position #-------------------------------------------------------------------------- def self.global_pos # Packs 0 Position pos = [0, 0].pack('ll') # Returns Unpacked Cursor Position Call return Cursor_Pos.call(pos) == 0 ? nil : pos.unpack('ll') end #-------------------------------------------------------------------------- # * Screen to Client #-------------------------------------------------------------------------- def self.screen_to_client(x=0, y=0) pos = [x, y].pack('ll') return Scr2cli.call(self.hwnd, pos) == 0 ? nil : pos.unpack('ll') end #-------------------------------------------------------------------------- # * Mouse Position #-------------------------------------------------------------------------- def self.pos global_pos = [0, 0].pack('ll') gx, gy = Cursor_Pos.call(global_pos) == 0 ? nil : global_pos.unpack('ll') local_pos = [gx, gy].pack('ll') x, y = Scr2cli.call(self.hwnd, local_pos) == 0 ? nil : local_pos.unpack('ll') # Begins Test begin # Return X & Y or Nil Depending on Mouse Position if (x >= 0 && y >= 0 && x <= 640 && y <= 480) return x, y else return -20, -20 end rescue return 0, 0 #nil end end #-------------------------------------------------------------------------- # * Update Mouse Position #-------------------------------------------------------------------------- def self.update # Update Position old_pos = @pos @pos = self.pos # agf = hide system mouse if !$mouse_sprite.visible && old_pos != @pos $mouse_sprite.visible = true end # when mouse leaves game window, show system mouse if old_pos != [-20, -20] && @pos == [-20, -20] $ShowCursor.call(1) # when mouse is in game window, show custom mouse if it's turned on elsif old_pos == [-20, -20] && @pos != [-20, -20] $ShowCursor.call($game_mouse ? 0 : 1) end # Update Triggers for i in @triggers # Gets Async State n = GAKS.call(i[1]) # If 0 or 1 if [0, 1].include?(n) i[0] = (i[0] > 0 ? i[0] * -1 : 0) else i[0] = (i[0] > 0 ? i[0] + 1 : 1) end end end #-------------------------------------------------------------------------- # * Trigger? # id : 0:Left, 1:Right, 2:Center #-------------------------------------------------------------------------- def self.trigger?(id = 0) #only user trigger if in range of screen pos = self.pos if pos != [-20,-20] case id when 0 # Left return @triggers[id][0] == 1 when 1 # Right (only when menu enabled) if @triggers[1][0] == 1 && !$game_system.menu_disabled return @triggers[id][0] == 1 end when 2 # Center return @triggers[id][0] == 1 end end end #-------------------------------------------------------------------------- # * Repeat? # id : 0:Left, 1:Right, 2:Center #-------------------------------------------------------------------------- def self.repeat?(id = 0) if @triggers[id][0] <= 0 return false else return @triggers[id][0] % 5 == 1 && @triggers[id][0] % 5 != 2 end end #-------------------------------------------------------------------------- # * Screen to Client #-------------------------------------------------------------------------- def self.screen_to_client(x=0, y=0) # Pack X & Y pos = [x, y].pack('ll') # Return Unpacked Position or Nil return Scr2cli.call(self.hwnd, pos) == 0 ? nil : pos.unpack('ll') end #-------------------------------------------------------------------------- # * Hwnd - window handle #-------------------------------------------------------------------------- def self.hwnd if @hwnd.nil? # Finds Game Name from ini file game_name = "\0" * 256 Readini.call('Game', 'Title', '', game_name, 255, ".\\Game.ini") game_name.delete!("\0") # Finds Window @hwnd = Findwindow.call('RGSS Player', game_name) end return @hwnd end #-------------------------------------------------------------------------- # * Client Size #-------------------------------------------------------------------------- def self.client_size # Packs Empty Rect rect = [0, 0, 0, 0].pack('l4') # Gets Game Window Rect Client_rect.call(self.hwnd, rect) # Unpacks Right & Bottom right, bottom = rect.unpack('l4')[2..3] # Returns Right & Bottom return right, bottom endend#==============================================================================# ** Input#==============================================================================class << Input #------------------------------------------------------------------------ # * Alias Listings #------------------------------------------------------------------------ unless self.method_defined?:)seph_mouse_input_update) alias_method :seph_mouse_input_update, :update alias_method :seph_mouse_input_trigger?, :trigger? alias_method :seph_mouse_input_repeat?, :repeat? end #------------------------------------------------------------------------ # * Frame Update #------------------------------------------------------------------------ def update # Update Mouse Mouse.update # Original Update seph_mouse_input_update end #-------------------------------------------------------------------------- # * Trigger? Test #-------------------------------------------------------------------------- def trigger?(constant) # Return true if original test is true return true if seph_mouse_input_trigger?(constant) # If Mouse Position isn't Nil unless Mouse.pos.nil? # If Mouse Trigger to Input Trigger Has Constant if Mouse::Mouse_to_Input_Triggers.has_value?(constant) # Return True if Mouse Triggered mouse_trigger = Mouse::Mouse_to_Input_Triggers.index(constant) return true if Mouse.trigger?(mouse_trigger) end end # Return False return false end #-------------------------------------------------------------------------- # * Repeat? Test #-------------------------------------------------------------------------- def repeat?(constant) # Return true if original test is true return true if seph_mouse_input_repeat?(constant) # If Mouse Position isn't Nil unless Mouse.pos.nil? # If Mouse Trigger to Input Trigger Has Constant if Mouse::Mouse_to_Input_Triggers.has_value?(constant) # Return True if Mouse Triggered mouse_trigger = Mouse::Mouse_to_Input_Triggers.index(constant) return true if Mouse.repeat?(mouse_trigger) end end # Return False return false endend#==============================================================================# ¦ Path Finding#==============================================================================# Near Fantastica# Version 1# 29.11.05#============================================================================== class Game_Character #-------------------------------------------------------------------------- alias nf_pf_game_character_initialize initialize alias nf_pf_game_character_update update #-------------------------------------------------------------------------- attr_accessor :map attr_accessor :runpath attr_accessor :ovrdest #-------------------------------------------------------------------------- def initialize nf_pf_game_character_initialize @map = nil @runpath = false @ovrdest = false end #-------------------------------------------------------------------------- def update run_path if @runpath == true nf_pf_game_character_update end #-------------------------------------------------------------------------- def run_path return if moving? step = @map[@x,@y] if step == 1 @map = nil @runpath = false return end dir = rand(2) case dir when 0 move_right if @map[@x+1,@y] == step - 1 and step != 0 move_down if @map[@x,@y+1] == step - 1 and step != 0 move_left if @map[@x-1,@y] == step -1 and step != 0 move_up if @map[@x,@y-1] == step - 1 and step != 0 when 1 move_up if @map[@x,@y-1] == step - 1 and step != 0 move_left if @map[@x-1,@y] == step -1 and step != 0 move_down if @map[@x,@y+1] == step - 1 and step != 0 move_right if @map[@x+1,@y] == step - 1 and step != 0 end end #-------------------------------------------------------------------------- def find_path(x,y, force = true) sx, sy = @x, @y result = setup_map(sx,sy,x,y) @runpath = result[0] @map = result[1] @map[sx,sy] = result[2] if result[2] != nil $game_player.ignore_movement = @runpath ? force : false end #-------------------------------------------------------------------------- def clear_path @map = nil @runpath = false @ovrdest = false $game_player.ignore_movement = false end #-------------------------------------------------------------------------- def setup_map(sx,sy,ex,ey) map = Table.new($game_map.width, $game_map.height) # Shaz - adding this comment to the second line of the event commands # Mouse[0,1] # will cause the player to go to the tile BELOW the event, turn up, # and interact with the event ([0,1] is x+0, y+1) tx = ex ty = ey event = $game_map.event_at(ex, ey) if !event.nil? && !event.list.nil? && !event.erased && event.list.size > 1 && event.list[1].code == 108 text = event.list[1].parameters.to_s text.gsub!(/[Mm][Oo][Uu][Ss][Ee]\[([-,0-9]+),([-,0-9]+)\]/) do tx = ex + $1.to_i ty = ey + $2.to_i map[ex, ey] = 999 @ovrdest = true end end update_counter = 0 map[tx,ty] = 1 old_positions = [] new_positions = [] old_positions.push([tx, ty]) depth = 2 $path_allow = false depth.upto(100){|step| loop do break if old_positions[0] == nil x,y = old_positions.shift return [true, map, step-1] if x == sx and y == sy if map[x,y + 1] == 0 and $game_player.passable?(x, y, 2, step, tx, ty) map[x,y + 1] = step new_positions.push([x,y + 1]) end if map[x - 1,y] == 0 and $game_player.passable?(x, y, 4, step, tx, ty) map[x - 1,y] = step new_positions.push([x - 1,y]) end if map[x + 1,y] == 0 and $game_player.passable?(x, y, 6, step, tx, ty) map[x + 1,y] = step new_positions.push([x + 1,y]) end if map[x,y - 1] == 0 and $game_player.passable?(x, y, 8, step, tx, ty) map[x,y - 1] = step new_positions.push([x,y - 1]) end # If we've checked quite a few tiles, allow graphics and input # to update - to avoid the 'script hanging' error update_counter += 1 if update_counter > 100 Graphics.update update_counter = 0 end end old_positions = new_positions new_positions = [] } @ovrdest = false return [false, nil, nil] end end class Game_Map #-------------------------------------------------------------------------- alias pf_game_map_setup setup #-------------------------------------------------------------------------- def setup(map_id) pf_game_map_setup(map_id) $game_player.clear_path end end class Game_Player attr_accessor :ignore_movement #-------------------------------------------------------------------------- alias pf_game_player_update update #-------------------------------------------------------------------------- def update $game_player.clear_path if Input.dir4 != 0 pf_game_player_update end end class Interpreter #-------------------------------------------------------------------------- def event return $game_map.events[@event_id] end endMouse 2
    Code:
    #==============================================================================# ** MouseCursor#==============================================================================module MouseCursor    Default_Cursor = 'Arrow'    Event_Cursor   = 'Arrow3'    Actor_Cursor   = 'Arrow'    Enemy_Cursor   = 'Arrow4'    Item_Cursor    = true    Skill_Cursor   = true    Dummy = Bitmap.new(32, 32)end#==============================================================================# ** Sprite_Mouse#==============================================================================class Sprite_Mouse < Sprite  #--------------------------------------------------------------------------  # * Object Initialization  #--------------------------------------------------------------------------  def initialize    super    self.z = 10100    self.ox = 4    update  end  #--------------------------------------------------------------------------  # ** Frame Update  #--------------------------------------------------------------------------  def update    super        # Update Visibility    self.visible = $scene != nil        # If Visible    if self.visible            # If Non-nil Mouse Position      if Mouse.position != nil                # Gets Mouse Position        mx, my = *Mouse.position                # Update POsition        self.x = mx unless mx.nil?        self.y = my unless my.nil?                    end            # If Scene changes or Mouse is Triggered      if @scene != $scene.class || Mouse.trigger?                # Update Scene Instance        @scene = $scene.class                # Update Bitmap        set_bitmap(MouseCursor::Default_Cursor)      end          end      end  #--------------------------------------------------------------------------  # ** Set Bitmap  #--------------------------------------------------------------------------  def set_bitmap(cursor, xNPCname = nil)        # show fancy cursor only if custom mouse on    if $game_mouse                   # If Cursor Info matches      if (@_cursor == cursor) && (@_NPCname == xNPCname)        return      end            # Reset Cursor Info      @_cursor      = cursor      @_NPCname     = xNPCname            # Gets Dummy      dummy = MouseCursor::Dummy            # Gets Item Cursor Bitmap      item_cursor = cursor.nil? ? MouseCursor::Default_Cursor : cursor            # Start Cursor Bitmap      bitmap = RPG::Cache.icon(item_cursor) if item_cursor != ''      # Show NPC name      if @_NPCname != nil        # Get name width        w = dummy.text_size(@_NPCname).width        h = dummy.font.size        b = RPG::Cache.icon(item_cursor)        # Create New Bitmap        bitmap = Bitmap.new((bitmap.nil? ? w : 40 + w), [b.height, h + 2].max)        bitmap.font.size = dummy.font.size        bitmap.blt(0, 0, b, b.rect)        # Draw NPC Name        x = item_cursor == '' ? 0 : 32        bitmap.font.color = Color.new(0, 0, 0, 255) # black        bitmap.draw_text(b.width + 9, 0, w, h, @_NPCname) # 0        bitmap.draw_text(b.width + 11, 0, w, h, @_NPCname) # 0         bitmap.draw_text(b.width + 10, -1, w, h, @_NPCname) # -1        bitmap.draw_text(b.width + 10, 1, w, h, @_NPCname) # 1        bitmap.font.color = Color.new(255, 255, 255, 255) # white        bitmap.draw_text(b.width + 10, 0, w, h, @_NPCname)      end          # Set Bitmap      self.bitmap = bitmap          elsif self.bitmap      @_cursor = nil      self.bitmap = nil          end      end  #--------------------------------------------------------------------------  # ** Frame Update : Update Event Cursors  #--------------------------------------------------------------------------  def update_event_cursors        # If Nil Grid Position    if Mouse.grid.nil?      # Set Default Cursor      set_bitmap(MouseCursor::Default_Cursor)      return    end        # Gets Mouse Position    x, y = *Mouse.grid        # Gets Mouse Position    mx, my = *Mouse.position            # Gets Mouse Event    event = $game_map.event_at(x, y)        # If Non-Nil Event or not over map HUD    unless event.nil?       # If Not Erased or Nil List      if event.list != nil && event.erased == false && event.list[0].code == 108        # Get the cursor to show        icon = event.list[0].parameters         icon = icon.to_s        if !((icon == "Arrow2") ||            (icon == "Arrow3") ||            (icon == "Arrow4") ||            (icon == "Arrow5") ||            (icon == "Arrow6") ||           (icon == "Arrow7"))           icon = MouseCursor::Default_Cursor        end                xNPCname = nil         if event.list.size > 1 && event.list[1].code == 108          text = event.list[1].parameters.to_s          text.gsub!(/[Nn][Aa][Mm][Ee] (.*)/) do            xNPCname = $1.to_s          end        end        set_bitmap(icon, xNPCname)            return      end      return    end        # Set Default Cursor    set_bitmap(MouseCursor::Default_Cursor)      endend#==============================================================================# ** Input#==============================================================================class << Input  #------------------------------------------------------------------------  # * Alias Listings  #------------------------------------------------------------------------  unless self.method_defined?(:sephlamchop_mousesys_input_update)    alias_method :sephlamchop_mousesys_input_update,   :update  end  #------------------------------------------------------------------------  # * Frame Update  #--------------------------------------------------------------------------  def update    $mouse_sprite.update if $mouse_sprite.visible    # Original Update    sephlamchop_mousesys_input_update  endend
    Mouse 3 (Part 1)

    WORLD_MAP_ID = 1#==============================================================================# ** Game_Map#==============================================================================class Game_Map #-------------------------------------------------------------------------- # * Event At #-------------------------------------------------------------------------- def event_at(x, y) for event in @events.values return event if event.x == x && event.y == y end return nil end #-------------------------------------------------------------------------- # * Events At (returns multiple events at the same position in an array) #-------------------------------------------------------------------------- def events_at(x, y) eventarray = [] for event in @events.values eventarray.push event if event.x == x && event.y == y end return eventarray if eventarray.size > 0 return nil endend#==============================================================================# ** Game_Event#==============================================================================class Game_Event #-------------------------------------------------------------------------- # * Public Instance Variables #-------------------------------------------------------------------------- attr_reader :erased # trigger attr_accessor :mouse_autostart # mouse autostart boolean attr_accessor :mouse_cursor_icon # mouse cursor icon attr_accessor :mouse_cursor_desc # mouse cursor desc attr_reader :name # name of event #-------------------------------------------------------------------------- # * Alias Listings #-------------------------------------------------------------------------- alias_method :sephlamchop_mousesys_gmevt_refresh, :refresh #-------------------------------------------------------------------------- # * Start Event #-------------------------------------------------------------------------- def start # If list of event commands is not empty if @list && @list.size > 1 @starting = true end end #-------------------------------------------------------------------------- # * Refresh #-------------------------------------------------------------------------- def refresh # Original Refresh sephlamchop_mousesys_gmevt_refresh # Click triggers event for action button, player or event touch @mouse_autostart = [0, 1, 2].include?(@Trigger) @mouse_cursor_icon = MouseCursor::Event_Cursor @mouse_cursor_desc = nil # Return if Erased or Nil List #return if @erased || @list.nil? endend#==============================================================================# ** Game_Character#==============================================================================class Game_Character def passable?(x, y, d, step = 999, tx = nil, ty = nil) # Get new coordinates new_x = x + (d == 6 ? 1 : d == 4 ? -1 : 0) new_y = y + (d == 2 ? 1 : d == 8 ? -1 : 0) # If coordinates are outside of map unless $game_map.valid?(new_x, new_y) return false end # If through is ON if @through return true end # Able to leave current tile in desired direction? # SHAZ: for counter, must be old, counter, new, in a straight line unless $game_map.passable?(x, y, d, self) || (step == 2 && $game_map.event_at(x, y)) || (step == 3 && $game_map.counter?(x, y) && tx != nil && ty != nil && new_x - x == x - tx && new_y - y == y - ty) return false end # Able to enter adjoining tile in current direction? unless $game_map.passable?(new_x, new_y, 10 - d) || (step == 2 && $game_map.counter?(new_x, new_y)) return false end # SHAZ - ignore events sitting on a counter next to the destination if step != 2 || !$game_map.counter?(new_x, new_y) # Loop all events for event in $game_map.events.values # If event coordinates are consistent with move destination if event.x == new_x and event.y == new_y @state = true # If through is OFF unless event.through # If self is event if self != $game_player return false end # With self as the player and partner graphic as character if event.character_name != "" return false end end end end end # If on world map, don't allow to go through events. Otherwise, # the event will be triggered while the PC is walking if $game_map.map_id == WORLD_MAP_ID && @state == false return false end # If player coordinates are consistent with move destination if $game_player.x == new_x && $game_player.y == new_y && self != $game_player # If through is OFF unless $game_player.through # If your own graphic is the character if @character_name != "" return false end end end return true endend#==============================================================================# ** Game_Player#==============================================================================class Game_Player < Game_Character #-------------------------------------------------------------------------- # * Alias Listings #-------------------------------------------------------------------------- alias_method :sephlamchop_mousesys_gmplyr_update, :update #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update # Unless Interpreter Running, Forcing a Route or Message Showing unless $game_system.map_interpreter.running? or @move_route_forcing or $game_temp.message_window_showing # Find Path If Mouse Triggered if Mouse.trigger?(0) && Mouse.grid != nil # Check if mouse is over HUD on map screen_x,screen_y = Mouse.pos # Gets Mouse X & Y mx, my = *Mouse.grid # Turn Character in direction newd_x = (@x - mx).abs newd_y = (@y - my).abs if @x > mx turn_left if newd_x >= newd_y elsif @x < mx turn_right if newd_x >= newd_y end if @y > my turn_up if newd_x < newd_y elsif @y < my turn_down if newd_x < newd_y end # Run Pathfinding find_path(mx, my, false) # Gets Event @eventarray = @runpath ? $game_map.events_at(mx, my) : nil # If Event At Grid Location unless @eventarray.nil? @eventarray.each do |event| # If Event Autostart if !event.mouse_autostart @eventarray.delete(event) end end @eventarray = nil if @eventarray.size == 0 end end end if @move_route_forcing clear_path @eventarray = nil end # Original Update sephlamchop_mousesys_gmplyr_update # If Non-nil Event Autostarter if @eventarray != nil && !moving? && (!@ovrdest || @map.nil? || @map[@x,@y] == 1) # Gets Event @eventarray.each do |event| # If Event Within Range if event and (@x == event.x or @y == event.y) # SHAZ - trigger event when: # - Action button and standing on or beside, or with a counter between # - player/event touch and standing as close as possible (on, if possible) distance = Math.hypot(@x - event.x, @y - event.y) dir = @x < event.x ? 6 : @x > event.x ? 4 : @y < event.y ? 2 : @y > event.y ? 8 : 0 if (event.trigger == 0 and (distance < 2 or (distance == 2 and $game_map.counter?((@x+event.x)/2, (@y+event.y)/2)))) or ([1,2].include?(event.trigger) and ((distance == 0 and $game_player.passable?(@x, @y, dir)) or (distance == 1 and !$game_player.passable?(@x, @y, dir)))) # Turn toward Event if @x == event.x turn_up if @y > event.y turn_down if @y < event.y else turn_left if @x > event.x turn_right if @x < event.x end # Start Event clear_path event.start @eventarray.delete(event) @eventarray = nil if @eventarray.size == 0 end end end end end def passable?(x1, y1, d, step = 999, tx = nil, ty = nil) super end end#==============================================================================# ** Mouse Selectable Windows#------------------------------------------------------------------------------# SephirothSpawn# Version 2.1#==============================================================================#==============================================================================# ** Window_Base#==============================================================================class Window_Base #-------------------------------------------------------------------------- # * Frame Update : Mouse Cursor - Item #-------------------------------------------------------------------------- def update_mouse_cursors_item(item, cursor, show) # Return if not Active return unless self.active # Return if nil Position return if Mouse.position.nil? # Gets Mouse Position mx, my = Mouse.position # Gets Cursor Position cr = self.cursor_rect cx, cy = cr.x + self.x + 16, cr.y + self.y + 16 cw, ch = cr.width, cr.height # If Not on Item if mx.between?(self.x, self.x + self.width) == false || my.between?(self.y, self.y + self.height) == false || item.nil? || @item_max == 0 || mx.between?(cx, cx + cw) == false || my.between?(cy, cy + ch) == false # Clear Mouse Index @mouse_index = nil # Set Mouse to Default Cursor $mouse_sprite.set_bitmap(MouseCursor::Default_Cursor) return end # If Index is different than mouse index and window active if @mouse_index != @index # Reset Index @mouse_index = @index # set to item icon if cursor is true cursor = item.icon_name if cursor # Set Bitmap $mouse_sprite.set_bitmap(cursor) end end endclass Window_Selectable #-------------------------------------------------------------------------- # * Default Settings #-------------------------------------------------------------------------- Default_Mouse_Selectable = true Default_Window_Padding = 16 #-------------------------------------------------------------------------- # * Public Instance Variables #-------------------------------------------------------------------------- attr_accessor :mouse_selectable attr_accessor :window_padding #-------------------------------------------------------------------------- # * Alias Listings #-------------------------------------------------------------------------- alias_method :seph_mouseselectable_wndslct_init, :initialize alias_method :seph_mouseselectable_wndslct_update, :update #-------------------------------------------------------------------------- # * Object Initialization #-------------------------------------------------------------------------- def initialize(x, y, width, height) # Original Initialization seph_mouseselectable_wndslct_init(x, y, width, height) # Set Mouse Selectable Flag @mouse_selectable = Default_Mouse_Selectable @window_padding = Default_Window_Padding end #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update # agf = hide mouse if $mouse_sprite.visible == true # If Mouse Selectable, Active, at Least 1 Item and Non-negitive index if self.mouse_selectable && self.active && @item_max > 0 && @index >= 0 # Gets Mouse Position mouse_x, mouse_y = *Mouse.position # If Mouse Within Window if mouse_x.between? (self.x, self.x + self.width) && mouse_y.between? (self.y, self.y + self.height) # Calculates Mouse X and Y Position Within Window mouse_x -= self.x; mouse_y -= self.y # Subtracts Window Padding mouse_x -= @window_padding; mouse_y -= @window_padding # Subtracts Mouse Oh mouse_y -= self.mouse_oh # Gets Cursor Width cursor_width = (self.width / @column_max - 32) # Passes Through Item Max for i in 0...@item_max # Calculates Index Position x = i % @column_max * (cursor_width + 32) y = i / @column_max * self.oh - self.oy # If Mouse Between Rect if mouse_x.between?(x, x + cursor_width) && mouse_y.between?(y, y + self.oh) # Set Index prev_index = @index @index = i if prev_index != @index $game_system.se_play($data_system.cursor_se) end break end end end end end # Original Update seph_mouseselectable_wndslct_update end #-------------------------------------------------------------------------- # * Oh #-------------------------------------------------------------------------- def oh return 32 end #-------------------------------------------------------------------------- # * Mouse Oh #-------------------------------------------------------------------------- def mouse_oh return 0 end end
    Mouse 3 (Part 2)

    (Attach the following to the end of the previous script - I had to split it into two as I couldn't add it as a spoiler otherwise. ~Shaz)

    #==============================================================================# ** Window_MenuStatus#==============================================================================class Window_MenuStatus < Window_Selectable #-------------------------------------------------------------------------- # * Oh #-------------------------------------------------------------------------- def oh return 60 endend#==============================================================================# ** Window_Target#==============================================================================class Window_Target < Window_Selectable #-------------------------------------------------------------------------- # * Oh #-------------------------------------------------------------------------- def oh return 105 endend#==============================================================================# ** Window_BattleReserve#==============================================================================class Window_BattleReserve < Window_Selectable #-------------------------------------------------------------------------- # * Oh #-------------------------------------------------------------------------- def oh return 105 endend#==============================================================================# ** Window_EquipRight#==============================================================================class Window_EquipRight < Window_Selectable #-------------------------------------------------------------------------- # * Oh #-------------------------------------------------------------------------- def oh return 50 end #-------------------------------------------------------------------------- # * Mouse Oh #-------------------------------------------------------------------------- def mouse_oh return 140 end end#==============================================================================# ** Window_Message#==============================================================================class Window_Message < Window_Selectable #-------------------------------------------------------------------------- # * Mouse Oh #-------------------------------------------------------------------------- def mouse_oh return $game_temp.choice_start * 32 endend#==============================================================================# ** Window_Party#==============================================================================class Window_Party < Window_Selectable #-------------------------------------------------------------------------- # * Oh #-------------------------------------------------------------------------- def oh return 52 endend#==============================================================================# ** Window_Menu#==============================================================================class Window_Menu < Window_Selectable #-------------------------------------------------------------------------- # * Oh #-------------------------------------------------------------------------- def oh return 35 endend#==============================================================================# ** Window_ActorCommand#==============================================================================class Window_ActorCommand < Window_Selectable #-------------------------------------------------------------------------- # * Update #-------------------------------------------------------------------------- def update if $mouse_sprite.visible # if Mouse sleectable, active, at least 1 item and non-negative index if self.mouse_selectable && self.active && @item_max > 0 && @index >= 0 # Get / check mouse position mouse_x, mouse_y = *Mouse.position if mouse_x.between?(self.x, self.x + self.width) && mouse_y.between?(self.y, self.y + self.height) # Calculates mouse position within window mouse_x -= self.x mouse_y -= self.y # Subtracts widnow padding and overhead mouse_x -= @window_padding mouse_y -= @window_padding - self.mouse_oh # Look through all items for i in 0...@item_max ix,iy = @positions if mouse_x.between?(ix, ix + 32) && mouse_y.between?(iy, iy + self.oh) if i != @index $game_system.se_play($data_system.cursor_se) end @index = i break end end end end end super end #-------------------------------------------------------------------------- # * Oh #-------------------------------------------------------------------------- def oh return 32 endend#==============================================================================# ** Window_NameInput#==============================================================================class Window_NameInput < Window_Base #-------------------------------------------------------------------------- # * Default Settings #-------------------------------------------------------------------------- Default_Mouse_Selectable = true Default_Window_Padding = 16 #-------------------------------------------------------------------------- # * Public Instance Variables #-------------------------------------------------------------------------- attr_accessor :mouse_selectable attr_accessor :window_padding #-------------------------------------------------------------------------- # * Alias Listings #-------------------------------------------------------------------------- alias_method :shaz_mouseselectable_wndslct_init, :initialize alias_method :shaz_mouseselectable_wndslct_update, :update #-------------------------------------------------------------------------- # ● Initialize the Name Input window #-------------------------------------------------------------------------- def initialize # Original Initialization shaz_mouseselectable_wndslct_init # Set Mouse Selectable Flag @mouse_selectable = Default_Mouse_Selectable @window_padding = Default_Window_Padding end #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update # if mouse selectable, visible, active, and non-negative index if $mouse_sprite.visible && self.mouse_selectable && self.active && @index >= 0 # Get mouse position mouse_x, mouse_y = *Mouse.position # If mouse within window if mouse_x.between? (self.x, self.x + self.width) && mouse_y.between? (self.y, self.y + self.height) # Calculates mouse X and Y positions within window mouse_x -= self.x; mouse_y -= self.y # Subtracts window padding mouse_x -= @window_padding; mouse_y -= @window_padding # Subtracts mouse oh mouse_y -= self.mouse_oh # Gets cursor width cursor_width = 28 # If not Submit button, pass through all items if mouse_x.between?(428, 428+48) && mouse_y.between?(9*32, 9*32+32) $game_system.se_play($data_system.cursor_se) if @index != 180 @index = 180 else for i in 0..90 # Calculate index position x = 140 + i / 5 / 9 * 180 + i % 5 * 32 y = i / 5 % 9 * 32 # If mouse between rect if mouse_x.between?(x, x + cursor_width) && mouse_y.between?(y, y + self.oh) # set index prev_index = @index @index = i if prev_index != @index $game_system.se_play($data_system.cursor_se) end break end end end end end # Original update shaz_mouseselectable_wndslct_update end #-------------------------------------------------------------------------- # * Oh #-------------------------------------------------------------------------- def oh return 32 end #-------------------------------------------------------------------------- # * Mouse Oh #-------------------------------------------------------------------------- def mouse_oh return 0 end end#==============================================================================# ** Scene_File#==============================================================================class Scene_File #-------------------------------------------------------------------------- # * Alias Listings #-------------------------------------------------------------------------- alias_method :sephlamchop_mousesys_scnfl_update, :update #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update # agf = hide mouse if $mouse_sprite.visible == true # If Mouse Position isn't Nil if Mouse.pos != nil # Gets Mouse Position x, y = Mouse.pos y = y + 32 # Pass Through Savefile Windows for i in 0...@savefile_windows.size # Gets Window w = @savefile_windows # Don't allow user to select autosave slot in Load Menu if @autosave_slot == false i = 1 if i == 0 end # If Within Window Range if x.between?(w.x, w.x + w.width) && y.between?(w.y, w.y + w.height) && w.active prev_index = @file_index # Set File Index @file_index = i # Turns Window On w.selected = true # Play SE if prev_index != @file_index $game_system.se_play($data_system.cursor_se) end # Unhighlight remaining windows for j in 0...@savefile_windows.size if j != i @savefile_windows[j].selected = false end end # Don't select autosave slot in Load Menu if @autosave_slot == false @savefile_windows[0].selected = false if i == 1 end # Break Main Loop break end end end end # Original Update sephlamchop_mousesys_scnfl_update endend#==============================================================================# ** Game_Battler#==============================================================================class Game_Battler #-------------------------------------------------------------------------- # * Battler Width #-------------------------------------------------------------------------- def battler_width return RPG::Cache.battler(@battler_name, @battler_hue).width end #-------------------------------------------------------------------------- # * Battler Height #-------------------------------------------------------------------------- def battler_height return RPG::Cache.battler(@battler_name, @battler_hue).height endend#==============================================================================# ** Arrow_Enemy#==============================================================================class Arrow_Enemy < Arrow_Base #-------------------------------------------------------------------------- # * Alias Listings #-------------------------------------------------------------------------- alias_method :seph_mouseselectablewindows_arrenmy_update, :update #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update # Original Update seph_mouseselectablewindows_arrenmy_update if $mouse_sprite.visible == true # Return if Nil Mouse Position return if Mouse.position.nil? # Gets Mouse Position mx, my = *Mouse.position # Pass Through Enemies $game_troop.enemies.each do |enemy| # Skip if Non-Existing Enemy next unless enemy.exist? # Gets Paddings w, h = enemy.battler_width / 2, enemy.battler_height # If Within Mouse Padding Range if mx.between?(enemy.screen_x - w, enemy.screen_x + w) && my.between?(enemy.screen_y - h, enemy.screen_y + 10) # Set Index @index = $game_troop.enemies.index(enemy) # Set mouse cursor to bitmap $mouse_sprite.set_bitmap(MouseCursor::Enemy_Cursor) return # break end end # Set Mouse to Default Cursor $mouse_sprite.set_bitmap(MouseCursor::Default_Cursor) end endend#==============================================================================# ** Arrow_Actor#==============================================================================class Arrow_Actor < Arrow_Base #-------------------------------------------------------------------------- # * Alias Listings #-------------------------------------------------------------------------- alias_method :seph_mouseselectablewindows_arractr_update, :update #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update # Original Update seph_mouseselectablewindows_arractr_update # Return if Nil Mouse Position return if Mouse.position.nil? # Gets Mouse Position mx, my = *Mouse.position # Pass Through Actors $game_party.actors.each do |actor| # Gets Paddings w, h = actor.battler_width / 2, actor.battler_height # If Within Mouse Padding Range if mx.between?(actor.screen_x - w, actor.screen_x + w) && my.between?(actor.screen_y - h, actor.screen_y + 10) # Set Index @index = $game_party.actors.index(actor) end end endend#==============================================================================# ** Scene_Map#==============================================================================class Scene_Map #-------------------------------------------------------------------------- # * Alias Listings #-------------------------------------------------------------------------- alias_method :sephlamchop_mousesys_scnmap_update, :update #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update # Unless Message Showing unless $game_temp.message_text # Update Event Cursors $mouse_sprite.update_event_cursors end # Original Update sephlamchop_mousesys_scnmap_update endend#==============================================================================# ** Interpreter#==============================================================================class Interpreter #-------------------------------------------------------------------------- # * Alias Listings #-------------------------------------------------------------------------- alias_method :shaz_mousesys_intrprtr_command_101, :command_101 #-------------------------------------------------------------------------- # * Show Text #-------------------------------------------------------------------------- def command_101 # return mouse sprite to default cursor $mouse_sprite.set_bitmap(MouseCursor::Default_Cursor) # original command_101 shaz_mousesys_intrprtr_command_101 endend$mouse_sprite = Sprite_Mouse.new# game mouse is visible, system mouse is hidden$mouse_sprite.visible = true
    NOTE: There is a missing line that will cause the game to crash. I have fixed it in the scripts above, but the demo does not have the fix. If you use the demo, please go to the Mouse 1 script, find the Game_Player class, and add the following line immediately after class Game_Player:

    class Game_Player attr_accessor :ignore_movementSuperSimpleMouseSystem.zip
     

    Attached Files:

    Last edited by a moderator: Sep 18, 2019
    #1
  2. Kyther

    Kyther Warper Member

    Messages:
    2
    Likes Received:
    0
    Hey. I am getting this error.

    Script 'Mouse 1' line 334: NoMethodError occured.

    undefined method 'ignore_movement=' for

    #<Game_Player:0x905e728>

    Do you have any idea of how to fix it?

    EDIT:

    Turns out that there is a missing line.

    attr_accessor :ignore_movement

    Is to be put in the Game_Character class after line 280.

    Found this out on a different site that has your script on it. The person credited you as well.
     
    Last edited by a moderator: Aug 20, 2013
    #2
  3. supercow

    supercow Artist Veteran

    Messages:
    383
    Likes Received:
    144
    Location:
    Indonesia
    First Language:
    indonesia
    i had it long time ago, best mouse script i know BD :rock-right:   nice!!
     
    #3
  4. Allerka

    Allerka Veteran Veteran

    Messages:
    289
    Likes Received:
    71
    First Language:
    English
    Well, this seems like a pretty spiffy tool! I am, unfortunately, having some issues with it.

    I had the above issue with line 334, but the solution Kyther shared worked. Unfortunately, it's still giving me trouble. When I try to fire it up in my actual game (the demo runs fine), it gives me an error saying either seph_mouse_input_repeat?(constant) or seph_mouse_input_trigger?(constant) is undefined. If I comment them both out, the game starts, but I have no keyboard input, which is obviously a problem!

    I'm using the SDK, which I'm guessing is the issue. The only other custom stuff I have loaded is the LeGAcY CMS. Any thoughts? Thanks!
     
    #4
  5. Shaz

    Shaz Veteran Veteran

    Messages:
    37,720
    Likes Received:
    11,430
    Location:
    Australia
    First Language:
    English
    Primarily Uses:
    RMMV
    SDK? Do you mean RTP?


    Did you bring ALL the necessary scripts from the demo project into your game? It sounds like one might be missing.
     
    #5
  6. Allerka

    Allerka Veteran Veteran

    Messages:
    289
    Likes Received:
    71
    First Language:
    English
    No, I mean the SDK SephirothSpawn made back in the day.

    And yes, I copied all four scripts (Start Game and Mouse 1-3) over. I don't THINK I missed one, but maybe I did?
     
    #6
  7. Shaz

    Shaz Veteran Veteran

    Messages:
    37,720
    Likes Received:
    11,430
    Location:
    Australia
    First Language:
    English
    Primarily Uses:
    RMMV
    Do you have a link to that? And when you DON'T have them commented out, which script and which line does it tell you is in error?
     
    #7
  8. Allerka

    Allerka Veteran Veteran

    Messages:
    289
    Likes Received:
    71
    First Language:
    English
    Sure, I originally got it here.

    The errors are being reported from lines 234 and 252 (normally 252, but if I comment it out, it reports 234 next).
     
    #8
  9. Shaz

    Shaz Veteran Veteran

    Messages:
    37,720
    Likes Received:
    11,430
    Location:
    Australia
    First Language:
    English
    Primarily Uses:
    RMMV
    I cannot download that.


    So it's a line in the SDK that is throwing the error, and not a line in the mouse script? If that's the case, I don't know if I can help you. I don't have the time to go through and make this script compatible with every other script that someone might want to use. Ensuring compatibility between different scripts is up to the person who chooses to combine them.
     
    Last edited by a moderator: Oct 19, 2013
    #9
  10. Allerka

    Allerka Veteran Veteran

    Messages:
    289
    Likes Received:
    71
    First Language:
    English
    No, it's Mouse 1 that's giving the error. Sorry for not mentioning that previously.

    I'm kind of surprised you're not familiar with the SDK, given how widespread it used to be, as well as having several people involved with its development also being involved with this script. I'm assuming the lines giving the error have something to do with it, since there's "seph" in name of the function, but that's just a guess.

    Not a particularly huge deal if we can't get this to work, but it may be worth noting if we can't that it's not SDK-compatible.
     
    #10
  11. Monkeysnow55 The Cookie

    Monkeysnow55 The Cookie Cookie Queen Veteran

    Messages:
    946
    Likes Received:
    152
    Location:
    Hyrule
    First Language:
    Cookie
    #11
  12. Shaz

    Shaz Veteran Veteran

    Messages:
    37,720
    Likes Received:
    11,430
    Location:
    Australia
    First Language:
    English
    Primarily Uses:
    RMMV
    Can you post that in a new thread in RGSSx Script Support, with both a link to the battle script, and a link to the mouse script?


    I don't provide support to make scripts compatible with each other. If I had the time, I might take a look at it for you, but I think you'll probably get help faster if you just post a new support request and see if ANYBODY can do it.


    Make sure you let people know you're using XP, as your profile says you use VX.
     
    #12
  13. drago453

    drago453 Veteran Veteran

    Messages:
    183
    Likes Received:
    3
    I'm assuming this is only usable on RPG Maker XP?
     
    #13
  14. Shaz

    Shaz Veteran Veteran

    Messages:
    37,720
    Likes Received:
    11,430
    Location:
    Australia
    First Language:
    English
    Primarily Uses:
    RMMV
    THIS script is for XP. There is an equivalent one in the RGSS3 (VX Ace) Scripts forum for Ace.


    And as an update on the above issue ... it had nothing to do with the mouse system. Monkeysnow55 had pasted one of the side view battle scripts in two different slots, which is what caused the stack overflow error.
     
    Last edited by a moderator: Dec 31, 2013
    #14
  15. Gardesion

    Gardesion Villager Member

    Messages:
    9
    Likes Received:
    0
    Hi there, first post as I'm more of a lurker.

    Whenever I have a map which is scrollable (bigger than 20*15), the events name I put in will only display when I'm at the corresponding X coordinate with the mouse. If the Y value is any bigger than 0 of said event, it simply does not display a name or custom cursor. This only occurs when the map has scrolled once in any direction.

    Is there a superhero out here who knows how to fix this without me posting my full custom chaotic project with tons of selfmade unorganized methods including original script edits without aliasing?
     
    Last edited by a moderator: May 12, 2014
    #15
  16. Shaz

    Shaz Veteran Veteran

    Messages:
    37,720
    Likes Received:
    11,430
    Location:
    Australia
    First Language:
    English
    Primarily Uses:
    RMMV
    Can you post a screenshot that clearly shows the position of the character, the mouse and the name/custom cursor? (this is while playing the game, not in the editor)


    Do you mean your PC has to be at the same X value as the NPC? That just doesn't sound right.


    Also, what other scripts do you have? It may well be caused by one of those, especially if you've done edits of the original scripts without aliasing.
     
    Last edited by a moderator: May 12, 2014
    #16
  17. Gardesion

    Gardesion Villager Member

    Messages:
    9
    Likes Received:
    0
    Thanks Shaz for your fast reply!

    If I stand still or just stay in the 'firstly loaded 640*480'-part of the map it's good to go, image 1.

    [​IMG]

    Now if Screen.x has been altered by scrolling the map, I need to be close to the event otherwise nothing is displayed, image 2.

    [​IMG]

    If Screen.y has been altered by scrolling the map it gets even worse because it now only has one y-coordinate (which is the beginning y of the event) for it to return true > actually showing something, image 3.

    [​IMG]

    Final image, the issue in best detail.

    [​IMG]

    Thanks again in advance.
     
    #17
  18. Shaz

    Shaz Veteran Veteran

    Messages:
    37,720
    Likes Received:
    11,430
    Location:
    Australia
    First Language:
    English
    Primarily Uses:
    RMMV
    I'd be looking at what other scripts you've got in there that are affecting it.


    What happens if you start a new project and ONLY add the mouse script, then make a similar map - does the problem still happen? If it doesn't, then it's almost guaranteed to be another script that's conflicting.
     
    #18
  19. Gardesion

    Gardesion Villager Member

    Messages:
    9
    Likes Received:
    0
    Been there done that, sorry I didn't mention it, the problem is non-existent.

    Even when I remove all custom scripts, excluding the original rmxp scripts (where I made edits too, though not in Game_Event or any heavy things in Scene_Map), the problem persists in my project.

    Could it be that perhaps this game was started as a project in PKE? Ever since I have an original copy of RmXP, this project has been an import.
     
    #19
  20. Shaz

    Shaz Veteran Veteran

    Messages:
    37,720
    Likes Received:
    11,430
    Location:
    Australia
    First Language:
    English
    Primarily Uses:
    RMMV
    What's PKE? I'm not aware that you can import anything from another format to RMXP. If you did, it's still unlikely that that's the cause.


    You say you remove all custom scripts, but DID you try it in a brand new project with JUST the mouse script? Removing all custom scripts while leaving some edits behind is not the same as starting in a brand new project.


    The fact that nobody else has reported this problem makes me think it's something to do with your script mods.
     
    #20

Share This Page