Jump to content
Falcao

Mouse System Buttons 2.5 update

Recommended Posts

Hey Falcao / all. Is it possible to trigger an event by clicking on it AND/OR its normal trigger (action, player touch, etc.). It appears that once you set an event as MOUSE START you have to click on it in order for it to run (kind of a duh). That being said, I would like to find a way to trigger NPC interactions by clicking on them while also being able to trigger a conversation by approaching and pressing the action button not clicking on the event per se. But, unfortunately, I cant seem to make it work... Any thoughts?!

Share this post


Link to post
Share on other sites

Hey Falcao / all. Is it possible to trigger an event by clicking on it AND/OR its normal trigger (action, player touch, etc.). It appears that once you set an event as MOUSE START you have to click on it in order for it to run (kind of a duh). That being said, I would like to find a way to trigger NPC interactions by clicking on them while also being able to trigger a conversation by approaching and pressing the action button not clicking on the event per se. But, unfortunately, I cant seem to make it work... Any thought

Alight, I figured it out... added a quick method here, altered a line there and POOF! The script now allows "click triggering" and action triggering on specified events. Let me know if anyone could use the snippet... I'm actually not sure if I'm allowed to post it without Falcao's permission... hmm...

Share this post


Link to post
Share on other sites

I have a big problem. I need to know if there is a way to turn off left-click-button on a specific event. Do you know anything?

 

 

 

 

#===========================================================================#
#  #*****************#                                                      #
#  #*** By Falcao ***#         Mouse System Buttons 2.5                     #
#  #*****************#         This is a button based mouse script, allow   #
#                              create as many buttons you want to the map   #
#                              screen or map ground, also provide you full  #
#       RMVXACE                mouse interaction within the game play       #
#                                                                           #
#                                                                           #
# Falcao RGSS site:  http://falcaorgss.wordpress.com                        #
# Falcao Forum site: http://makerpalace.com                                 #
#                                                                           #
#===========================================================================#
 
#----------------------------------------------------------------------------
# * Version 2.5 change log (Date: June 9 2013)
#
# Fixed non-refreshing item description bug
# Fixed Save file selection issue
# Added ability to start events even if the player is no facing the event 
# Removed option to display arrow selector on save file
# Added compatibility for multiples game resolutions
# Item selection with mouse is now more occurate
# Fixed issue with pearl skillbar (when clicking any tool perform path finding)
# Cleaned up some code
#
#----------------------------------------------------------------------------
# * Version 2.0 change log (Date: January 13 2013)
#
# - Added path finding, now the game player is able to move using the mouse
# - Now you are able to change the mouse cursor icon in game
# - Two new notetags added to change the mouse cursor by event comment tags
# - Fixed crash when pointing a notetagged event with a valid condition
#----------------------------------------------------------------------------
# * Version 1.6 change log (Date: November 21 2012)
# - Added compatibility for any game screen resolution
# - System optimized to consume less cpu than before
# - Added extra compatibility for Pearl ABS Liquid
# - Removed the font fix
# - Added the imported bolean
#----------------------------------------------------------------------------
# * Version 1.5 change log
#
# - Fixed cursor sound over loading on selectable windows
# - Fixed bug when selecting event graphic tileset that have mouse comment tag
# - FIxed minor bug when transfering (event name now erase completely)
# - Added option to turn on / off arrow selector on save file
# - Important! changes on mouse comment tags! 
#   ~ CLICK START change to MOUSE START
#   ~ ANIMATION   change to MOUSE ANIMATION
#   ~ NAME        change to MOUSE NAME
#
#---------------------------------------------------------------------------
# * installation
#
# Copy and paste this script above main done!
#
# * Mouse triggers 
#   - Left click:     Action button
#   - Right click:    Cancel button, close windows
#   - Mouse wheel middle button:   DASH
#
#---------------------------------------------------------------------------
# * Main features
# - Allow you create buttons and configure them to do something
# - Events can be buttons too, map ground buttons! for some puzzles etc.
# - Allow you display event name 
# - Full mouse interaction
# - WASD movement optional
# - Path finding feature, player is able to move using the mouse
# - Mouse cursor changing in-game enabled
#---------------------------------------------------------------------------
# * Event buttons commands
# Write this lines on event comments tags
# MOUSE START       - Event start when you click the event
# MOUSE ANIMATION x - Show animation when mouse is over event,
#                     ex: MOUSE ANIMATION 1
# MOUSE NAME x      - Display event name when mouse is over event,
#                     ex: MOUSE NAME Falcao
# MOUSE ICON x      - change the mouse cursor icon when it is over the event
#                     change x for the icon index to display
# MOUSE PIC X       - Change the mouse cursor when is over an event but in this
#                     case it display a picture graphic name, change x for the
#                     picture name
#------------------------------------------------------------------------------
# * Script calls
#
# Call this line to turn off/on the mouse cursor within the game true/false
# Mouse.show_cursor(false)
#
# If you want to change the mouse cursor manually use the following script calls
# Mouse.set_cursor(:iconset, x)     - change x for any icon index
#
# if you want to show a picture instead iconset use the next script call
# Mouse.set_cursor(:picture, name)  - change name for picture name
#-----------------------------------------------------------------------------
 
module Map_Buttons
 
# You can easily insert as many buttons you want to the map screen
# define here below your buttons parameters
  
  Insert = {
#-----------------------------------------------------------------------------
#  A => [b, C, D, E, F]
#  
#  A = Button number
#
#  B = Name 
#  C = X position in screen tile
#  D = Y position in screen tile
#  E = Icon, if you want a picture write picture 'name' otherwise icon index
#  F = What this button gonna do?, you have two options, call scene or call
#  common event, if you want scene put scene name, if you want common event
#  put common event ID
  
  # This button call the menu screen
  1=> ["Menu", 16, 11, 117, Scene_Menu],  
  
  # This button call a common event ID 1
  2=>  ["Bestiary",  16, 12, 121, 1],
  
  
 
  }
 
# * General configutration
 
# Mouse cursor icon, if you want a picture write pic 'name' otherwise icon index
  CursorIcon = 386
 
# Switch ID to turn off/on the icons on the screen
  Switch = 100
  
# Allow movement with  W A S D keys true/false
  WASD_Movement = true
  
# When you click on event, do you want the player to ignore the self movement?
  IgnoreEventPath = true
  
# Switch id to enable or disable the path finding feature
  PathFinderSwitch = 500
#
#----------------------------------------------------------------------------
#
# * License
#
# You can use this script in non comercial games, in you need it for comercial
# games let me know. falmc99@gmail.com
#-----------------------------------------------------------------------------
 
  def self.check_value(value)
    return 'numeric' if value.is_a? Fixnum 
    return 'string'
  end
end
 
($imported ||= {})[:Mouse_System_Buttons] = 2.0
 
# This class create all screen and event buttons on game screen
class Interactive_Buttoms
  attr_reader :cursoring
  def initialize
    create_screen_buttoms
    @ani_delay = 0
    @pearl_abs = $imported["Falcao Pearl ABS Liquid"]
  end
  
  def create_screen_buttoms
    @buttons_sprites = []
    for i in Map_Buttons::Insert.values
      @buttons_sprites.push(Sprite_Buttons.new(i[0], i[1], i[2], i[3], i[4]))
    end
  end
  
  def create_button_text
    if @button_text.nil?
      @button_text = Sprite.new
      @button_text.bitmap = Bitmap.new(100, 32)
      @button_text.z = 50
      @button_text.bitmap.font.size = 16
    end
  end
  
  def dispose_screen_buttons
    for button in @buttons_sprites
      button.dispose
    end
    @buttons_sprites = []
  end
  
  def dispose_button_text
    if not @button_text.nil?
      @button_text.dispose
      @button_text.bitmap.dispose
      @button_text = nil
    end
  end
  
  def dispose
    dispose_screen_buttons
    dispose_button_text
  end
  
  def update
    if $game_switches[Map_Buttons::Switch] and not @buttons_sprites.empty?
      dispose_screen_buttons
    elsif not $game_switches[Map_Buttons::Switch] and @buttons_sprites.empty?
      create_screen_buttoms
    end
    update_buttons
    update_event_selection
  end
  
  # path update
  def update_path
    return if $game_switches[Map_Buttons::PathFinderSwitch]
    return if $game_message.busy?
    return unless $game_player.normal_walk?
    @mxx, @myy = Mouse.map_grid[0], Mouse.map_grid[1]
    if Map_Buttons::IgnoreEventPath
      $game_map.events.values.each do |event|
        return if event.x == @mxx and event.y == @myy
      end
    end
    $game_player.find_path(@mxx, @myy) unless on_toolbar?
  end
  
  
  def on_toolbar?
    return false unless @pearl_abs
    9.times.each {|x| return true if @mxx == PearlSkillBar::Tile_X + x and
    @myy == PearlSkillBar::Tile_Y}
    return false
  end
  
  
  def update_buttons
    for button in @buttons_sprites
      button.update
      if button.zooming
        @screen_b = true
        create_button_text
        if button.x > 272 
          x, y = button.px * 32 - 98, button.py * 32
          draw_button_text(x, y, button.name, 2)
        elsif button.x < 272 
          x, y = button.px * 32 + 31, button.py * 32
          draw_button_text(x, y, button.name, 0)
        end
      end
    end
    
    if @screen_b != nil
      unless mouse_over_button?
        dispose_button_text
        @screen_b = nil
      end
    end
  end
  
  def reset_cursor
    if Map_Buttons::check_value(@cursoring[1]) == 'numeric'
      Mouse.set_cursor(:iconset, @cursoring[1], true)
    else
      Mouse.set_cursor(:picture, @cursoring[1], true)
    end
    @cursoring = nil
  end
  
  def apply_iconchanging(sym, operand, event)
    cursor = $game_system.cursorr
    cursor = Map_Buttons::CursorIcon if cursor.nil?
    @cursoring = [event, cursor]
    Mouse.set_cursor(sym, operand, true)
  end
  
  def update_event_selection
    return if @screen_b #disable event buttom if mouse over screen buttom
    update_path if Mouse.trigger?(0)
    for event in $game_map.events.values
      next if event.page.nil?
      if event.x == Mouse.map_grid[0] and event.y == Mouse.map_grid[1]
        if event.mouse_start
          if Mouse.trigger?(0) and !$game_map.interpreter.running?
            event.start
          end
        end
        
        if event.square_size?($game_player, 2)
          if Mouse.trigger?(0) and !$game_map.interpreter.running?
            event.start
          end
        end
        
        anime = event.mouse_animation
        if anime != 0
          @ani_delay += 1
          event.animation_id = anime if @ani_delay == 1
          @ani_delay = 0 if @ani_delay > 16
        end
        name = event.mouse_name
        if name != ""
          @eve = [event.x, event.y, event, name]
          create_button_text
        end
        icon = event.mouse_iconset
        picture = event.mouse_picture
        if !icon.nil? and icon != 0 and @cursoring.nil?
          apply_iconchanging(:iconset, icon, event)
        elsif !picture.nil? and picture != "" and @cursoring.nil?
          apply_iconchanging(:picture, picture, event)
        end
      end
    end
    
    if @cursoring != nil
      reset_cursor if not mouse_over_event?(@cursoring[0].x, @cursoring[0].y)
    end
    
    if @eve != nil
      @eve[2].ch_oy.nil? ? event_oy = 32 : event_oy = @eve[2].ch_oy
      if event_oy > 32
        draw_button_text(@eve[2].screen_x - 49,
        @eve[2].screen_y - event_oy / 2 - 50, @eve[3], 1)
      else
        draw_button_text(@eve[2].screen_x - 49,
        @eve[2].screen_y - event_oy / 2 - 36, @eve[3], 1)
      end
      if not mouse_over_event?(@eve[0], @eve[1])
        dispose_button_text
        @eve = nil
      end
    end
  end
  
  def draw_button_text(x, y, text, a=0)
    return if @button_text.nil?
    @button_text.x = x
    @button_text.y = y
    return if @old_name == text
    @button_text.bitmap.clear
    @button_text.bitmap.draw_text(2, 0, @button_text.bitmap.width, 32, text, a)
    @old_name = text
  end
  
  def mouse_over_button?
    for button in @buttons_sprites
      if Mouse.object_area?(button.x, button.y - 6, button.width, button.height)
        return true
      end
    end
    @old_name = nil
    return false
  end
  
  def mouse_over_event?(event_x, event_y)
    if Mouse.map_grid[0] == event_x and Mouse.map_grid[1] == event_y
      return true
    end
    @old_name = nil
    return false
  end
end
 
# Set buttons sprites
class Spriteset_Map
  alias falcao_insert_buttuns_view create_viewports
  def create_viewports
    @interact_buttoms = Interactive_Buttoms.new
    falcao_insert_buttuns_view
  end
  
  alias falcao_insert_buttuns_dis dispose
  def dispose
    @interact_buttoms.reset_cursor if @interact_buttoms.cursoring != nil
    @interact_buttoms.dispose
    falcao_insert_buttuns_dis
  end
  
  alias falcao_insert_buttuns_up update
  def update
    if $game_player.clear_mousepointers
      @interact_buttoms.dispose
      $game_player.clear_mousepointers = nil
    end
    @interact_buttoms.update
    falcao_insert_buttuns_up
  end
end
 
# comments definition
class Game_Event < Game_Character
  attr_reader   :mouse_start, :mouse_animation, :mouse_name, :mouse_iconset
  attr_reader   :mouse_picture, :page
  alias falcaomouse_setup setup_page_settings
  def setup_page_settings
    falcaomouse_setup
    @mouse_start     = check_comment("MOUSE START")
    @mouse_animation = check_value("MOUSE ANIMATION")
    @mouse_name      = check_name("MOUSE NAME")
    @mouse_iconset   = check_value("MOUSE ICON")
    @mouse_picture   = check_name("MOUSE PIC")
  end
 
  def check_comment(comment)
    return false if @list.nil? or @list.size <= 0
    for item in @list
      if item.code == 108 or item.code == 408
        if item.parameters[0].include?(comment)
          return true
        end
      end
    end
    return false
  end
  
  def check_value(comment)
    return 0 if @list.nil? or @list.size <= 0
    for item in @list
      if item.code == 108 or item.code == 408
        if item.parameters[0] =~ /#{comment}[ ]?(\d+)?/
          return $1.to_i
        end
      end
    end
    return 0
  end
  
  def check_name(comment)
    return "" if @list.nil? or @list.size <= 0
    for item in @list
      next unless item.code == 108 or item.code == 408
      if item.parameters[0] =~ /#{comment} (.*)/
        return $1.to_s
      end
    end
    return ""
  end
  
  def square_size?(target, size)
    distance = (@x - target.x).abs + (@y - target.y).abs
    enable   = (distance <= size-1)
    return true if enable
    return false
  end
  
end
 
# Create screen buttons sprites
class Sprite_Buttons < Sprite
  attr_reader   :px
  attr_reader   :py
  attr_reader   :name
  attr_reader   :zooming
  def initialize(name, px, py, icon_index, action=nil)
    super()
    self.z = 50
    @icon_index = icon_index
    @px = px 
    @py = py
    @action = action
    @object_zooming = 0
    @zooming = false
    @name = name
    set_bitmap
    update
  end
  
  def update
    super
    if Mouse.object_area?(self.x, self.y - 4, self.bitmap.width,
      self.bitmap.height)
      @zooming = true
      @object_zooming += 1
      case @object_zooming
      when 1..10  ; self.zoom_x -= 0.02 ;  self.zoom_y -= 0.02
      when 11..20 ; self.zoom_x += 0.02 ;  self.zoom_y += 0.02
      when 21..30 ; self.zoom_x = 1.0   ;  self.zoom_y = 1.0
        @object_zooming = 0 
      end
      if Mouse.trigger?(0) and @action != nil
        unless $game_map.interpreter.running?
          Sound.play_ok
          if @action == Scene_Menu and not $game_system.menu_disabled
            SceneManager.call(@action)
            Window_MenuCommand::init_command_position
            return
          end
         if Map_Buttons::check_value(@action) == 'numeric'
           $game_temp.reserve_common_event(@action)
         else
           SceneManager.call(@action)
         end
        end
      end
    elsif @object_zooming > 0
      self.zoom_x = 1.0
      self.zoom_y = 1.0
      @object_zooming = 0 
    else
      @zooming = false
    end
  end
  
  def set_bitmap
    if Map_Buttons::check_value(@icon_index) == 'numeric'
      self.bitmap = Bitmap.new(24, 24)
      bitmap = Cache.system("Iconset")
      rect = Rect.new(@icon_index % 16 * 24, @icon_index / 16 * 24, 24, 24)
      self.bitmap.blt(0, 0, bitmap, rect)
    else
      self.bitmap = Cache.picture(@icon_index)
    end
    self.x = @px * 32 + 4
    self.y = @py * 32 + 4
  end
end
 
# Game_character new variable
class Game_CharacterBase
  attr_accessor :ch_oy
end
 
# Sprite character
class Sprite_Character < Sprite_Base
  alias falcaoadd_oxy_set_character_bitmap set_character_bitmap
  def set_character_bitmap
    falcaoadd_oxy_set_character_bitmap
    @character.ch_oy = self.oy
  end
end
 
class Game_System
  attr_accessor :current_cursor
  def cursorr
    return Map_Buttons::CursorIcon if @current_cursor.nil?
    return @current_cursor
  end
end
 
# Mouse module
module Mouse
  
  GetKeyState    = Win32API.new('user32',    'GetAsyncKeyState', 'i',     'i')
  GetCursorPos   = Win32API.new('user32',    'GetCursorPos',     'p',     'i')
  GetClientRect  = Win32API.new('user32',    'GetClientRect',    %w(l p), 'i')
  ShowCursor     = Win32API.new('user32',    'ShowCursor',       'i',     'l')
  ScreenToClient = Win32API.new('user32',    'ScreenToClient',   %w(l p), 'i')
  Findwindow     = Win32API.new('user32',    'FindWindowA',      %w(p p), 'l')
  GetPrivatePro  = Win32API.new('kernel32',  'GetPrivateProfileStringA', 
  %w(p p p p l p), 'l')
                               
  ShowCursor.call(0)
  
  @triggers     =   [[0, 1], [0, 2], [0, 4]]
  @old_pos      =   0
 
  # Mouse Sprite
  
  def self.set_cursor(sym, operand, write=false)
    case sym
    when :iconset
      $mouse_cursor.bitmap = Bitmap.new(24, 24)
      bitmap = Cache.system("Iconset")
      rect = Rect.new(operand % 16 * 24, operand / 16 * 24, 24, 24)
      $mouse_cursor.bitmap.blt(0, 0, bitmap, rect)
    when :picture then $mouse_cursor.bitmap = Cache.picture(operand)
    end
    $game_system.current_cursor = operand if write
  end
  
  $mouse_cursor = Sprite.new
  icon = Map_Buttons::CursorIcon
  if Map_Buttons::check_value(icon) == 'numeric'
    set_cursor(:iconset, icon)
  else
    set_cursor(:picture, icon)
  end
  $mouse_cursor.z = 10001
  $mouse_cursor.x = $mouse_cursor.y = 1000
  $mouse_cursor.ox = 4
  
  def self.show_cursor(value)
    unless value
      @pos[0] = @pos[1] = 600
    end
    $mouse_cursor.visible = value
  end
  
  def self.map_grid
    return nil if @pos == nil 
    x = ($game_map.display_x).to_i + (@pos[0] / 32)
    y = ($game_map.display_y).to_i + (@pos[1] / 32)
    return [x, y]
  end
  
  def self.standing?
    return false if @old_px != @pos[0]
    return false if @old_py != @pos[1]
    return true
  end
  
  def self.input_keys
    $game_arrows.mode_on ? type = $game_arrows.in_type : type = Input::C
    keys = {0 => type, 1 => Input::B, 2 => Input::A}
    return keys
  end
  
  def self.object_area?(x, y, width, height)
    return false if @pos.nil?
    return @pos[0].between?(x, width + x) && @pos[1].between?(y, height + y)
  end
  
  def self.position
    return @pos == nil ? [0, 0] : @pos
  end
  
  def self.global_pos
    pos = [0, 0].pack('ll')
    return GetCursorPos.call(pos) == 0 ? nil : pos.unpack('ll')
  end
 
  def self.screen_to_client(x=0, y=0)
    pos = [x, y].pack('ll')
    return ScreenToClient.call(self.hwnd, pos) == 0 ? nil : pos.unpack('ll')
  end  
 
  def self.pos
    global_pos = [0, 0].pack('ll')    
    gx, gy = GetCursorPos.call(global_pos) == 0 ? nil : global_pos.unpack('ll')
    local_pos = [gx, gy].pack('ll')
    x, y = ScreenToClient.call(self.hwnd,
    local_pos) == 0 ? nil : local_pos.unpack('ll')
    begin
      if (x >= 0 && y >= 0 && x <= Graphics.width && y <= Graphics.height)
        @old_px, @old_py = x, y
        return x, y
      else
        return -20, -20
      end
    rescue
      return 0, 0 
    end
  end  
    
  def self.update
    old_pos = @pos
    @pos = self.pos
    self.input_keys
    if !$mouse_cursor.visible && old_pos != @pos
      $mouse_cursor.visible = true
    end
    if old_pos != [-20, -20] && @pos == [-20, -20]
      ShowCursor.call(1)
    elsif old_pos == [-20, -20] && @pos != [-20, -20]
       ShowCursor.call(0)
    end
    for i in @triggers
      n = GetKeyState.call(i[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 definition
  def self.trigger?(id = 0)
    pos = self.pos
    if pos != [-20,-20]
    case id
      when 0  
        return @triggers[id][0] == 1
      when 1  
        if @triggers[1][0] == 1 && !$game_system.menu_disabled
          return @triggers[id][0] == 1 
        end
      when 2 
        return @triggers[id][0] == 1
      end    
    end
  end
  
  # repeat definition
  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
  
  #press definition
  def self.press?(id = 0)
    if @triggers[id][0] <= 0
      return false
    else
      return true 
    end
  end
  
  def self.screen_to_client(x=0, y=0)
    pos = [x, y].pack('ll')
    return ScreenToClient.call(self.hwnd, pos) == 0 ? nil : pos.unpack('ll')
  end
 
  def self.hwnd
    if @hwnd.nil?
      game_name = "\0" * 256
      GetPrivatePro.call('Game', 'Title', '', game_name, 255, ".\\Game.ini")
      game_name.delete!("\0")
      @hwnd = Findwindow.call('RGSS Player', game_name)
    end
    return @hwnd
  end
  
  def self.client_size
    rect = [0, 0, 0, 0].pack('l4')
    GetClientRect.call(self.hwnd, rect)
    right, bottom = rect.unpack('l4')[2..3]
    return right, bottom
  end
end
 
# Input module aliased
class << Input
  unless self.method_defined?(:falcao21_mouse_update)
    alias_method :falcao21_mouse_update,   :update
    alias_method :falcao21_mouse_trigger?, :trigger?
    alias_method :falcao21_mouse_repeat?,  :repeat?
    alias_method :fal_mouse_input_press?,  :press?
  end
  
  def update
    if $mouse_cursor.visible
      Mouse.update
      $game_arrows.update
      mx, my = *Mouse.position
      $mouse_cursor.x = mx unless mx.nil?
      $mouse_cursor.y = my unless my.nil?    
    end
    falcao21_mouse_update
  end
  
  # trigger
  def trigger?(constant)
    return true if falcao21_mouse_trigger?(constant)
    unless Mouse.pos.nil?
      if Mouse.input_keys.has_value?(constant)
        mouse_trigger = Mouse.input_keys.index(constant)
        return true if Mouse.trigger?(mouse_trigger) 
      end
    end
    return false
  end
 
  # press
  def press?(constant)
    return true if fal_mouse_input_press?(constant)
    unless Mouse.pos.nil?
      if Mouse.input_keys.has_value?(constant)
        mouse_trigger = Mouse.input_keys.index(constant)
        return true if Mouse.press?(mouse_trigger)      
      end
    end
    return false
  end
  
  # repeat
  def repeat?(constant)
    return true if falcao21_mouse_repeat?(constant)
    unless Mouse.pos.nil?
      if Mouse.input_keys.has_value?(constant)
        mouse_trigger = Mouse.input_keys.index(constant)     
        return true if Mouse.repeat?(mouse_trigger)
      end
    end
    return false
  end
end
 
# Here your best friend, you can call this script within the game, scene etc.
# $game_arrows.create_arrows(x, y), create it, $game_arrows.dispose, delete it
class Game_Arrow_Selector
  attr_accessor :mode_on
  attr_accessor :in_type
  def initialize
    @mode_on = false
  end
 
  def create_arrows(x, y)
    return unless @arrows_sprites.nil?
    buttons = {1=> 'UP', 2=> 'RIGHT', 3=> 'DOWN',
    4=> 'LEFT', 5=> 'OK', 6=> 'Cancel'}
    @arrows_sprites = []
    for i in buttons.values
      @arrows_sprites.push(Garrows_Sprites.new(i, x, y))
    end
  end
  
  def dispose
    return if @arrows_sprites.nil?
    for arrow in @arrows_sprites
      arrow.dispose
    end
    @arrows_sprites = nil
    @mode_on = false
  end
  
  def update
    return if @arrows_sprites.nil?
    for arrow in @arrows_sprites
      arrow.update
    end
  end
end
 
class Garrows_Sprites < Sprite
  def initialize(name, x, y)
    super()
    self.z = 1000
    @px, @py = x, y
    @name = name
    @object_zooming = 0
    @zooming = false
    set_bitmap
    update
  end
  
  def update
    super
    if Mouse.object_area?(self.x + @fix[0], self.y + @fix[1],
      self.bitmap.width + @fix[2], self.bitmap.height + @fix[3])
      $game_arrows.mode_on = true
      $game_arrows.in_type = Input::UP    if @name == 'UP'
      $game_arrows.in_type = Input::DOWN  if @name == 'DOWN'
      $game_arrows.in_type = Input::LEFT  if @name == 'LEFT'
      $game_arrows.in_type = Input::RIGHT if @name == 'RIGHT'
      $game_arrows.in_type = Input::C     if @name == 'OK'
      $game_arrows.in_type = Input::B     if @name == 'Cancel'
      @object_zooming += 1
      @zooming = true
      case @object_zooming
      when 1..10  ; self.zoom_x -= 0.01 ;  self.zoom_y -= 0.01
      when 11..20 ; self.zoom_x += 0.01 ;  self.zoom_y += 0.01
      when 21..30 ; self.zoom_x = 1.0   ;  self.zoom_y = 1.0
        @object_zooming = 0 
      end
    elsif @object_zooming > 0
      self.zoom_x = 1.0
      self.zoom_y = 1.0
      @object_zooming = 0 
    elsif @zooming
      @zooming = false
      $game_arrows.mode_on = false
    end
  end
  
  def set_bitmap
    self.bitmap = Bitmap.new(24, 15) if @name != 'Cancel'
    case @name
    when 'UP'
      self.x = @px + 25 ; self.y = @py - 2
      self.angle = 182  ; @fix = [-23, -18, 0,  0]
    when 'DOWN'
      self.x = @px + 1 ; self.y = @py + 26
      @fix = [0, -4, 0,  0]
    when 'LEFT'
      self.x = @px      ; self.y = @py + 1
      self.angle = - 92 ; @fix = [-14, -4, - 9,  9]
    when 'RIGHT'
      self.x = @px + 26  ; self.y = @py + 26
      self.angle = + 92  ; @fix = [0, - 26, - 9,  9]
    when 'OK'
      self.x = @px + 1  ; self.y = @py + 6
      @fix = [0, -4, 0,  0]
      self.bitmap.font.size = 20
      self.bitmap.draw_text(4, -7, self.bitmap.width, 32, @name)
      return
    when 'Cancel'
      self.x = @px - 11  ; self.y = @py + 42
      @fix = [0, -4, 0,  0]
      self.bitmap = Bitmap.new(50, 15)
      self.bitmap.font.size = 20
      self.bitmap.draw_text(2, -7, self.bitmap.width, 32, @name)
      return
    end
    draw_crappy_triangle(0, 0)
  end
  
  # This method create a crappy triangle pointing down
  def draw_crappy_triangle(px, py)
    color = Color.new(192, 224, 255, 255)
    x, y, w, =  0, 4, 24
    self.bitmap.fill_rect(px + 1, py, 22, 1, color)
    self.bitmap.fill_rect(px,     py + 1, 24, 4, color)
    for i in 1..10
      x += 1; y += 1; w -= 2
      self.bitmap.fill_rect(px + x, py + y,       w, 1, color) 
    end
  end
end
 
$game_arrows = Game_Arrow_Selector.new
 
# Arrow selector is displayed when Input number is on
class Game_Interpreter
  alias falcao_setup_num_input setup_num_input
  def setup_num_input(params)
    falcao_setup_num_input(params)
    $game_arrows.create_arrows(256, 194) if $game_message.position == 0
    $game_arrows.create_arrows(256, 340) if $game_message.position == 1
    $game_arrows.create_arrows(256, 180) if $game_message.position == 2
  end
end
 
# Arrow selector is disposed when press ok
class Window_NumberInput < Window_Base
  alias falcao_process_ok process_ok
  def process_ok
    falcao_process_ok
    $game_arrows.dispose
  end
end
 
# WASD Movements
module Input
  class << self
    if !method_defined?('vxe_dir4')
      alias vxace_dir4 dir4
    end
    def dir4
      if Map_Buttons::WASD_Movement
        return 2 if (Input.press?(Input::Y))
        return 4 if (Input.press?(Input::X))
        return 6 if (Input.press?(Input::Z))
        return 8 if (Input.press?(Input::R))
      end
      return vxace_dir4
    end
  end
end
 
# If event start with mouse
class Game_Player < Game_Character
  alias falcao_start_map_event start_map_event
  def start_map_event(x, y, triggers, normal)
    $game_map.events_xy(x, y).each do |event_click|
      return if event_click.check_comment("MOUSE START")
    end  
    falcao_start_map_event(x, y, triggers, normal)
  end
end
 
# clear pointers when tranfering
class Game_Player < Game_Character
  attr_accessor :clear_mousepointers
  alias falcaomouse_perform_transfer perform_transfer
  def perform_transfer
    @clear_mousepointers = true if $game_map.map_id !=  @new_map_id
    falcaomouse_perform_transfer
  end
end
 
# Path find
class Game_Character < Game_CharacterBase
  attr_accessor :map, :runpath
  alias pathfind1_ini initialize
  def initialize
    pathfind1_ini
    @map = nil
    @runpath = false
  end
  
  alias pathfind1_up update
  def update
    run_path if @runpath == true
    pathfind1_up
  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_straight(6) if @map[@x+1,@y] == step - 1 && step != 0
      move_straight(2) if @map[@x,@y+1] == step - 1 && step != 0
      move_straight(4) if @map[@x-1,@y] == step - 1 && step != 0
      move_straight(8) if @map[@x,@y-1] == step - 1 && step != 0
    when 1
      move_straight(8) if @map[@x,@y-1] == step - 1 && step != 0
      move_straight(4) if @map[@x-1,@y] == step - 1 && step != 0
      move_straight(2) if @map[@x,@y+1] == step - 1 && step != 0
      move_straight(6) if @map[@x+1,@y] == step - 1 && step != 0
    end
  end
 
  def find_path(x,y)
    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
  end
 
  def clear_path
    @map = nil
    @runpath = false
  end
  
  def setup_map(sx,sy,ex,ey)
    map = Table.new($game_map.width, $game_map.height)
    map[ex,ey] = 1
    old_positions = []
    new_positions = []
    old_positions.push([ex, ey])
    depth = 2
    depth.upto(100){|step|
      loop do
        break if old_positions[0] == nil
        x,y = old_positions.shift
        return [true, map, step] if x == sx and y+1 == sy
        if $game_player.passable?(x, y, 2) and map[x,y + 1] == 0
          map[x,y + 1] = step
          new_positions.push([x,y + 1])
        end
        return [true, map, step] if x-1 == sx and y == sy
        if $game_player.passable?(x, y, 4) and map[x - 1,y] == 0
          map[x - 1,y] = step
          new_positions.push([x - 1,y])
        end
        return [true, map, step] if x+1 == sx and y == sy
        if $game_player.passable?(x, y, 6) and map[x + 1,y] == 0
          map[x + 1,y] = step
          new_positions.push([x + 1,y])
        end
        return [true, map, step] if x == sx and y-1 == sy
        if $game_player.passable?(x, y, 8) and map[x,y - 1] == 0
          map[x,y - 1] = step
          new_positions.push([x,y - 1])
        end
      end
      old_positions = new_positions
      new_positions = []
    }
    return [false, nil, nil]
  end
end
  
class Game_Player
  alias pathfind_player_update update
  def update
    clear_path if Input.dir4 != 0
    pathfind_player_update
  end
  
  alias findpath_perform_transfer perform_transfer
  def perform_transfer
    clear_path if $game_map.map_id !=  @new_map_id
    findpath_perform_transfer
  end
end
 
# Window selectable (Thanks wora for some lines here)
class Window_Selectable < Window_Base
  alias mouse_selection_ini initialize
  def initialize(*args)
    mouse_selection_ini(*args)
    @scroll_wait = 0
    @cursor_wait = 0
    @sdelay = 0
  end
 
  alias mouse_selection_update update
  def update
    update_mouse_selection if self.active and self.visible
    @sdelay -= 1 if @sdelay > 0
    mouse_selection_update
  end
  
  def update_mouse_selection
    @cursor_wait -= 1 if @cursor_wait > 0
    plus_x = self.x + 16 - self.ox
    plus_y = self.y + 8 - self.oy
    unless self.viewport.nil?
      plus_x += self.viewport.rect.x - self.viewport.ox
      plus_y += self.viewport.rect.y - self.viewport.oy
    end
    (0..self.item_max - 1).each do |i|
      irect = item_rect(i)
      move_cursor(i) if Mouse.object_area?(
      irect.x + plus_x, irect.y + plus_y, irect.width, irect.height)
      update_cursor
    end
  end
 
  def move_cursor(index)
    return if @index == index
    @scroll_wait -= 1 if @scroll_wait > 0
    row1 = @index / self.col_max
    row2 = index / self.col_max
    bottom = self.top_row + (self.page_row_max - 1)
    if index != @index and @sdelay == 0
      Sound.play_cursor 
      @sdelay = 5
    end
    if row1 == self.top_row and row2 < self.top_row
      return if @scroll_wait > 0
      @index = [@index - self.col_max, 0].max
      @scroll_wait = 30
    elsif row1 == bottom and row2 > bottom
      return if @scroll_wait > 0
      @index = [@index + self.col_max, self.item_max - 1].min
      @scroll_wait = 30
    else
      @index = index
    end
    select(@index)
    return if @cursor_wait > 0
    @cursor_wait += 2
  end
end
 
 
class Window_NameInput
  def item_max
    return 90
  end
end
 
class Scene_File < Scene_MenuBase
 
  alias mouse_top_index top_index=
  def top_index=(index)
    @scroll_timer = 0 if @scroll_timer.nil? ; @scroll_timer -= 1
    return if @scroll_timer > 0
    mouse_top_index(index) ; @scroll_timer = 35
  end
  
  alias mouse_sb_update update
  def update
    (0..self.item_max - 1).each do |i|
      ix = @savefile_windows.x
      iy = @savefile_windows.y + 40 - @savefile_viewport.oy
      iw = @savefile_windows.width
      ih = @savefile_windows.height
      if Mouse.object_area?(ix, iy, iw, ih)
        @savefile_windows[@index].selected = false
        @savefile_windows.selected = true
        @index = i
      end
      ensure_cursor_visible
    end
    mouse_sb_update
  end
end
 

 

 

Edited by Let's Make

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Recently Browsing   0 members

    No registered users viewing this page.

×
Top ArrowTop Arrow Highlighted