#Basic Mouse System v2.7h
#----------#
#Features: Provides a series of functions to find the current x, y position of
# the mouse and whether it is being clicked or not (left or right click)
#
#Usage: Script calls:
# Mouse.pos? - returns the x, y position as an array
# Mouse.lclick?(repeat) - returns if left click is achieved
# repeat = true for repeated checks
# Mouse.rclick?(repeat) - same as above for right click
# Mouse.within?(rect) - passes a Rect through to check if cursor
# is within it, returns true if so
#
# Events:
# The following are placed in the name of an event:
# && - event can be triggered from afar by mouse click
# I:# - where # is the icon_index to change the cursor on hover
#
# Example: I:262
#
#----------#
#-- Script by: V.M of D.T
#
#- Questions or comments can be:
# posted on the thread for the script
# provided on facebook: [url]http://www.facebook.com/DaimoniousTailsGames[/url]
#
#--- Free to use in any project, commercial or non-commercial, with credit given
# - - Though a donation's always a nice way to say thank you~ (I also accept actual thank you's)
CPOS = Win32API.new 'user32', 'GetCursorPos', ['p'], 'v'
WINX = Win32API.new 'user32', 'FindWindowEx', ['l','l','p','p'], 'i'
ASKS = Win32API.new 'user32', 'GetAsyncKeyState', ['p'], 'i'
SMET = Win32API.new 'user32', 'GetSystemMetrics', ['i'], 'i'
WREC = Win32API.new 'user32', 'GetWindowRect', ['l','p'], 'v'
#MOUSE_ICON, set to the index of the icon to use as a cursor
$mouse_icon = 147
CURSOR_OFFSET_X = 0
CURSOR_OFFSET_Y = 0
#Keeps cursor sprite within the game window
MOUSE_KEEP_WINDOW = true
#Whether clicking requires cursor to be within window or not
MOUSE_CLICK_WITHIN = false
#Whether to use 8 directional movement or not
MOUSE_DIR8 = false
#Use the Mouse Button Overlay:
USE_MOUSE_BUTTONS = true
#And here is where you set up your buttons! Simple overlay:
#(Picture files are to be stored in System)
#
# [ x , y, "filename", "script call when left clicked" ]
MOUSE_BUTTONS = [
[0,416-32,"Shadow.png","SceneManager.call(Scene_Equip)"],
[32,416-32,"Shadow.png","SceneManager.call(Scene_Item)"], ]
SHOWMOUS = Win32API.new 'user32', 'ShowCursor', 'i', 'i'
SHOWMOUS.call(0)
#Switch option to enable/disable the script
USE_MOUSE_SWITCH = true
MOUSE_SWITCH = 1
module Mouse
def self.setup
@enabled = true
@delay = 0
bwap = true if SMET.call(23) != 0
bwap ? @lmb = 0x02 : @lmb = 0x01
bwap ? @rmb = 0x01 : @rmb = 0x02
end
def self.update
return false unless @enabled
return false if USE_MOUSE_SWITCH && $game_switches[MOUSE_SWITCH]
self.setup if @lmb.nil?
@delay -= 1
@window_loc = WINX.call(0,0,"RGSS PLAYER",0)
if ASKS.call(@lmb) == 0 then @l_clicked = false end
if ASKS.call(@rmb) == 0 then @r_clicked = false end
rect = '0000000000000000'
cursor_pos = '00000000'
WREC.call(@window_loc, rect)
side, top = rect.unpack("ll")
CPOS.call(cursor_pos)
@m_x, @m_y = cursor_pos.unpack("ll")
w_x = side + SMET.call(5) + SMET.call(45)
w_y = top + SMET.call(6) + SMET.call(46) + SMET.call(4)
@m_x -= w_x; @m_y -= w_y
if MOUSE_KEEP_WINDOW
@m_x = [[@m_x, 0].max,Graphics.width-5].min
@m_y = [[@m_y, 0].max,Graphics.height-5].min
end
return true
end
def self.pos?
return[-50,-50] unless self.update
return [@m_x, @m_y]
end
def self.lclick?(repeat = false)
return unless self.update
return false if @l_clicked
if ASKS.call(@lmb) != 0 then
@l_clicked = true if !repeat
return true end
end
def self.rclick?(repeat = false)
return unless self.update
return false if @r_clicked
if ASKS.call(@rmb) != 0 then
@r_clicked = true if !repeat
return true end
end
def self.slowpeat
return unless self.update
return false if @delay > 0
@delay = 120
return true
end
def self.within?(rect)
return unless self.update
return false if @m_x < rect.x or @m_y < rect.y
bound_x = rect.x + rect.width; bound_y = rect.y + rect.height
return true if @m_x < bound_x and @m_y < bound_y
return false
end
def self.disable
@enabled = false
SHOWMOUS.call(1)
end
def self.enable
@enabled = true
SHOWMOUS.call(0)
end
end
Mouse.setup
module DataManager
class << self
alias mouse_init init
end
def self.init
mouse_init
$cursor = Mouse_Cursor.new
end
end
class Scene_Base
alias cursor_update update_basic
def update_basic
cursor_update
mouse_cursor
end
def mouse_cursor
pos = Mouse.pos?
$cursor.x = pos[0] + CURSOR_OFFSET_X
$cursor.y = pos[1] + CURSOR_OFFSET_Y
end
end
class Mouse_Cursor < Sprite_Base
def initialize
super
@icon = $mouse_icon
self.bitmap = Bitmap.new(24,24)
draw_cursor
self.z = 255
end
def set_icon(icon)
return if @icon == icon
@icon = icon
draw_cursor
end
def draw_cursor
self.bitmap.clear
icon_bitmap = Cache.system("Iconset")
rect = Rect.new(@icon % 16 * 24, @icon / 16 * 24, 24, 24)
self.bitmap.blt(0, 0, icon_bitmap, rect)
end
end
class Window_Selectable
alias mouse_update update
alias mouse_init initialize
def initialize(x,y,w,h)
mouse_init(x,y,w,h)
@mouse_all_rects = []
@timer = 0
end
def update
mouse_update
update_mouse if self.active
end
def update_mouse
@timer -= 1
@mouse_all_rects = []
item_max.times {|i|
rect = item_rect(i)
rect.x += self.x + standard_padding - self.ox
rect.y += self.y + standard_padding - self.oy
if !self.viewport.nil?
rect.x += self.viewport.rect.x - self.viewport.ox
rect.y += self.viewport.rect.y - self.viewport.oy
end
@mouse_all_rects.push(rect) }
item_max.times {|i|
next if @timer > 0
next unless Mouse.within?(@mouse_all_rects[i])
@timer = 10 if i > top_row * 2 + page_item_max - 1
@timer = 10 if i < top_row * 2
self.index = i }
process_cancel if Mouse.rclick? && cancel_enabled?
return if MOUSE_CLICK_WITHIN && !within_index
process_ok if Mouse.lclick? && ok_enabled?
end
def within_index
item_max.times {|i|
return true if Mouse.within?(@mouse_all_rects[i]) }
return false
end
end
class Window_NameInput
alias mouse_process_handling process_handling
def process_handling
mouse_process_handling
process_back if Mouse.rclick?
end
def item_max
return 90
end
end
class Window_Message < Window_Base
def input_pause
self.pause = true
wait(10)
Fiber.yield until Input.trigger?(:B) || Input.trigger?(:C) || Mouse.lclick? #if !SceneManager.scene_is?(Scene_Map))
Input.update
self.pause = false
end
end
class Scene_File < Scene_MenuBase
alias mouse_update update
def update
mouse_update
mouse_input
end
def mouse_input
xx = 0
yy = 56
width = Graphics.width
rectcm1 = Rect.new(xx, yy, width, savefile_height)
rectcm2 = Rect.new(xx, yy + rectcm1.height, width, savefile_height)
rectcm3 = Rect.new(xx, yy + rectcm1.height * 2, width, savefile_height)
rectcm4 = Rect.new(xx, yy + rectcm1.height * 3, width, savefile_height)
rectttl = Rect.new(xx, yy, width, rectcm1.height * 4)
rectcmA = Rect.new(0, yy - 12, Graphics.width, 24)
rectcmB = Rect.new(0, Graphics.height - 12, Graphics.width, 24)
@scroll = self.top_index
last_index = @index
@index = (0 + @scroll) if Mouse.within?(rectcm1)
@index = (1 + @scroll) if Mouse.within?(rectcm2)
@index = (2 + @scroll) if Mouse.within?(rectcm3)
@index = (3 + @scroll) if Mouse.within?(rectcm4)
cursor_down(false) if Mouse.within?(rectcmB) and Mouse.slowpeat
cursor_up(false) if Mouse.within?(rectcmA) and Mouse.slowpeat
if @index != last_index
Sound.play_cursor
@savefile_windows[last_index].selected = false
@savefile_windows[@index].selected = true
end
on_savefile_ok if Mouse.lclick? and Mouse.within?(rectttl)
on_savefile_cancel if Mouse.rclick? and Mouse.within?(rectttl)
end
end
class Scene_Gameover
alias mouse_update update
def update
mouse_update
goto_title if Mouse.lclick? or Mouse.rclick?
end
end
class Game_Player < Game_Character
alias mouse_move_update update
def update
mouse_move_update
mouse_input
end
def mouse_input
begin
return if USE_MOUSE_BUTTONS && SceneManager.scene.mouse_overlay.update
rescue
return
end
return if !movable? || $game_map.interpreter.running?
if !Mouse.lclick?(true) then return end
if moving? then return end
Graphics.width / 32 % 2 == 0 ? xxx = 16 : xxx = 0
Graphics.height / 32 % 2 == 0 ? yyy = 16 : yyy = 0
x = $game_map.display_x + (Mouse.pos?[0] + xxx) / 32
y = $game_map.display_y + (Mouse.pos?[1] + yyy) / 32
x -= 0.5 if Graphics.width / 32 % 2 == 0
y -= 0.5 if Graphics.height / 32 % 2 == 0
return if start_map_event_mouse(x, y, [0,1,2], false)
if MOUSE_DIR8
x = $game_map.display_x * 32 + Mouse.pos?[0]
y = $game_map.display_y * 32 + Mouse.pos?[1]
x -= @x * 32 + 16
y -= @y * 32 + 16
angle = Math.atan(x.abs/y.abs) * (180 / Math::PI)
angle = (90 - angle) + 90 if x > 0 && y > 0
angle += 180 if x < 0 && y > 0
angle = 90 - angle + 180 + 90 if x < 0 && y < 0
move_straight(8) if angle >= 337 || angle < 22
move_diagonal(6,8) if angle >= 22 && angle < 67
move_straight(6) if angle >= 67 && angle < 112
move_diagonal(6,2) if angle >= 112 && angle < 157
move_straight(2) if angle >= 157 && angle < 202
move_diagonal(4,2) if angle >= 202 && angle < 247
move_straight(4) if angle >= 247 && angle < 292
move_diagonal(4,8) if angle >= 292 && angle < 337
else
x = $game_map.display_x + Mouse.pos?[0] / 32
y = $game_map.display_y + Mouse.pos?[1] / 32
sx = distance_x_from(x)
sy = distance_y_from(y)
if sx.abs > sy.abs
move_straight(sx > 0 ? 4 : 6)
move_straight(sy > 0 ? 8 : 2) if !@move_succeed && sy != 0
elsif sy != 0
move_straight(sy > 0 ? 8 : 2)
move_straight(sx > 0 ? 4 : 6) if !@move_succeed && sx != 0
end
end
end
def start_map_event_mouse(x, y, triggers, normal)
return false if $game_map.interpreter.running?
$game_map.events_xy(x, y).each do |event|
next unless event.trigger_from_afar
if event.trigger_in?(triggers)
event.start
return true
end
end
return false
end
end
class Game_Event
def trigger_from_afar
return @event.name.include?("&&")
end
def mouse_icon?
@event.name =~ /I:(\d+)/ ? $1.to_i : false
end
end
class Scene_Map
attr_accessor :mouse_overlay
alias mouse_update update
alias mouse_overlay_init start
alias mouse_pre_battle pre_battle_scene
def start(*args)
mouse_overlay_init(*args)
@mouse_overlay = Mouse_Overlay.new if USE_MOUSE_BUTTONS
@last_mouse_x = -1
@last_mouse_y = -1
end
def update
mouse_update
mouse_input_events
update_mouse_icon
end
def mouse_input_events
xx = $game_player.screen_x
yy = $game_player.screen_y
xx -= 16;
recttop = Rect.new(xx - 6, yy - 80, 44, 48)
rectrit = Rect.new(xx + 32, yy - 36, 48, 44)
rectbot = Rect.new(xx - 6, yy, 44, 48)
rectleft = Rect.new(xx - 48, yy - 38, 48, 44)
mouse_action(8) if Mouse.within?(recttop)
mouse_action(6) if Mouse.within?(rectrit)
mouse_action(2) if Mouse.within?(rectbot)
mouse_action(4) if Mouse.within?(rectleft)
call_menu if Mouse.rclick? and !$game_map.interpreter.running?
end
def update_mouse_icon
Graphics.width / 32 % 2 == 0 ? xxx = 16 : xxx = 0
Graphics.height / 32 % 2 == 0 ? yyy = 16 : yyy = 0
x = $game_map.display_x + (Mouse.pos?[0] + xxx) / 32
y = $game_map.display_y + (Mouse.pos?[1] + yyy) / 32
x -= 0.5 if Graphics.width / 32 % 2 == 0
y -= 0.5 if Graphics.height / 32 % 2 == 0
return if x == @last_mouse_x && y == @last_mouse_y
@last_mouse_x = x
@last_mouse_y = y
events = $game_map.events_xy(x,y)
icon = $mouse_icon
events.each do |event|
icon = event.mouse_icon? if event.mouse_icon?
end
$cursor.set_icon(icon)
end
def mouse_action(d)
return if !Mouse.rclick?(true) || $game_map.interpreter.running?
$game_player.set_direction(d)
$game_player.check_action_event
end
def pre_battle_scene
mouse_pre_battle
@mouse_overlay.dispose
end
end
class Window_NumberInput
OFS = 12
WLH = 24
alias mouse_update update
def update
mouse_update
mouse_input if SceneManager.scene_is?(Scene_Map) and self.active
end
def mouse_input
hold_rect = []
xx = self.x + OFS
yy = self.y + OFS
width = 20
rectttl = Rect.new(xx, yy, self.contents.width, WLH)
for i in Range.new(0, @digits_max - 1)
hold_rect.push(Rect.new(xx, yy, width, WLH))
xx += width
end
for i in Range.new(0, @digits_max - 1)
@index = i if Mouse.within?(hold_rect[i])
end
rectok = Rect.new(xx, yy, 34, 24)
rectnum = Rect.new(self.x + OFS, yy, @digits_max * 20, WLH)
self.process_ok if Mouse.within?(rectok) and Mouse.lclick?
process_mouse_change if Mouse.within?(rectnum)
end
def refresh
contents.clear
change_color(normal_color)
s = sprintf("%0*d", @digits_max, @number)
@digits_max.times do |i|
rect = item_rect(i)
rect.x += 1
draw_text(rect, s[i,1], 1)
end
draw_text(self.contents.width - 24, 0, 34, WLH, "OK")
end
def update_placement
self.width = @digits_max * 20 + padding * 2 + 34
self.height = fitting_height(1)
self.x = (Graphics.width - width) / 2
if @message_window.y >= Graphics.height / 2
self.y = @message_window.y - height - 8
else
self.y = @message_window.y + @message_window.height + 8
end
end
def process_mouse_change
return unless active
place = 10 ** (@digits_max - 1 - @index)
n = @number / place % 10
@number -= n * place
if Mouse.lclick?
n = (n + 1) % 10
Sound.play_cursor
end
if Mouse.rclick?
n = (n + 9) % 10
Sound.play_cursor
end
@number += n * place
refresh
end
end
class Mouse_Overlay
def initialize
@mouse_buttons = []
MOUSE_BUTTONS.size.times do |i|
@mouse_buttons[i] = Mouse_Button.new
@mouse_buttons[i].x = MOUSE_BUTTONS[i][0]
@mouse_buttons[i].y = MOUSE_BUTTONS[i][1]
@mouse_buttons[i].bitmap = Bitmap.new("Graphics/System/" + MOUSE_BUTTONS[i][2])
@mouse_buttons[i].on_lclick = MOUSE_BUTTONS[i][3]
end
end
def update
@mouse_buttons.size.times do |i| @mouse_buttons[i].update end
if Mouse.lclick?(true)
@mouse_buttons.size.times do |i|
if Mouse.within?(@mouse_buttons[i].current_rect?)
@mouse_buttons[i].on_lclick_eval
return true
end
end
end
return false
end
def dispose
@mouse_buttons.each do |sprite|
sprite.dispose
end
end
end
class Mouse_Button < Sprite_Base
attr_accessor :on_lclick
def current_rect?
Rect.new(x,y,width,height)
end
def on_lclick_eval
eval(on_lclick)
end
end
class Window_Base
def rect
Rect.new(self.x,self.y,self.width,self.height)
end
end
class Scene_Options < Scene_MenuBase
alias mouse_update update
def update
mouse_update
update_mouse
end
def update_mouse
create_rects unless @rects
@rects.size.times do |i|
@index = i if Mouse.within?(@rects[i])
end
if Mouse.lclick?
if audio_index(@index)
x = Mouse.pos?[0]
return if x < 48+4
return if x > 48+4+400
value = (x - 48).to_f / 400
$game_options.preset_volume(:master, value) if @window_index[@index] == :master
$game_options.preset_volume(:bgm, value) if @window_index[@index] == :bgm
$game_options.preset_volume(:se, value) if @window_index[@index] == :se
@window_masterbar.refresh($game_options.master_volume)
@window_bgmbar.refresh($game_options.bgm_volume)
@window_sebar.refresh($game_options.se_volume)
Sound.play_cursor
$game_map.autoplay if $game_map && $game_map.map_id > 0
end
end
end
def create_rects
@rects = []
WINDOW_ORDER.each do |sym|
@rects.push(@window_masterbar.rect) if sym == :master
@rects.push(@window_bgmbar.rect) if sym == :bgm
@rects.push(@window_sebar.rect) if sym == :se
@rects.push(@window_resolution.rect) if sym == :resolution
@rects.push(@window_message.rect) if sym == :message_se
@rects.push(@window_switch.rect) if sym == :switch
end
@rects.push(@window_command.rect)
end
end
class Window_RecipeConfirm < Window_Selectable
alias mouse_rec_update update
def update
mouse_rec_update
update_mouse if self.active
end
def update_mouse
@timer -= 1
@mouse_all_rects = []
@mouse_all_rects.push(Rect.new(self.x,self.y,self.contents.width*0.85,self.height))
@mouse_all_rects.push(Rect.new(self.x + self.contents.width*0.85,self.y,self.contents.width*0.25,self.height))
if Mouse.rclick?
if Mouse.within?(@mouse_all_rects[1])
change_amount(-1)
else
process_cancel if cancel_enabled?
end
elsif Mouse.lclick?
process_ok if ok_enabled? && Mouse.within?(@mouse_all_rects[0])
change_amount(1) if Mouse.within?(@mouse_all_rects[1])
end
end
def within_index
item_max.times {|i|
return true if Mouse.within?(@mouse_all_rects[i]) }
return false
end
end