Super Simple Mouse Script

amaranth

Veteran
Veteran
Joined
Mar 18, 2012
Messages
42
Reaction score
99
First Language
English
Primarily Uses
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


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


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
 

Attachments

Last edited by a moderator:

Kyther

Warper
Member
Joined
Nov 10, 2012
Messages
2
Reaction score
0
Primarily Uses
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:

supercow

Artist
Veteran
Joined
Jul 16, 2013
Messages
383
Reaction score
146
First Language
indonesia
Primarily Uses
i had it long time ago, best mouse script i know BD :rock-right:   nice!!
 

Allerka

Veteran
Veteran
Joined
Dec 31, 2012
Messages
289
Reaction score
71
First Language
English
Primarily Uses
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!
 

Shaz

Veteran
Veteran
Joined
Mar 2, 2012
Messages
40,098
Reaction score
13,704
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.
 

Allerka

Veteran
Veteran
Joined
Dec 31, 2012
Messages
289
Reaction score
71
First Language
English
Primarily Uses
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?
 

Shaz

Veteran
Veteran
Joined
Mar 2, 2012
Messages
40,098
Reaction score
13,704
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?
 

Allerka

Veteran
Veteran
Joined
Dec 31, 2012
Messages
289
Reaction score
71
First Language
English
Primarily Uses
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).
 

Shaz

Veteran
Veteran
Joined
Mar 2, 2012
Messages
40,098
Reaction score
13,704
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:

Allerka

Veteran
Veteran
Joined
Dec 31, 2012
Messages
289
Reaction score
71
First Language
English
Primarily Uses
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.
 

Shaz

Veteran
Veteran
Joined
Mar 2, 2012
Messages
40,098
Reaction score
13,704
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.
 

drago453

Veteran
Veteran
Joined
Oct 16, 2012
Messages
183
Reaction score
3
Primarily Uses
I'm assuming this is only usable on RPG Maker XP?
 

Shaz

Veteran
Veteran
Joined
Mar 2, 2012
Messages
40,098
Reaction score
13,704
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:

Gardesion

Villager
Member
Joined
May 12, 2014
Messages
9
Reaction score
0
Primarily Uses
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:

Shaz

Veteran
Veteran
Joined
Mar 2, 2012
Messages
40,098
Reaction score
13,704
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:

Gardesion

Villager
Member
Joined
May 12, 2014
Messages
9
Reaction score
0
Primarily Uses
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.



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.



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.



Final image, the issue in best detail.



Thanks again in advance.
 

Shaz

Veteran
Veteran
Joined
Mar 2, 2012
Messages
40,098
Reaction score
13,704
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.
 

Gardesion

Villager
Member
Joined
May 12, 2014
Messages
9
Reaction score
0
Primarily Uses
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.
 

Shaz

Veteran
Veteran
Joined
Mar 2, 2012
Messages
40,098
Reaction score
13,704
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.
 

Users Who Are Viewing This Thread (Users: 0, Guests: 1)

Latest Threads

Latest Posts

Latest Profile Posts

Do you Find Tilesetting or Looking for Tilesets/Plugins more fun? Personally I like making my tileset for my Game (Cretaceous Park TM) xD
How many parameters is 'too many'??
Yay, now back in action Happy Christmas time, coming back!






Back in action to develop the indie game that has been long overdue... Final Fallacy. A game that keeps on giving! The development never ends as the developer thinks to be the smart cookie by coming back and beginning by saying... "Oh bother, this indie game has been long overdue..." How could one resist such? No-one c
So I was playing with filters and this looked interesting...

Versus the normal look...

Kind of gives a very different feel. :LZSexcite:

Forum statistics

Threads
105,854
Messages
1,016,998
Members
137,562
Latest member
tamedeathman
Top