Keep mouse cursor in game window

TheDrifter

Veteran
Veteran
Joined
Apr 18, 2012
Messages
99
Reaction score
2
First Language
English
Primarily Uses
Greetings,

I have been using the Super Simple Mouse Script v1.10 by Shaz in conjunction with the Fullscreen++ v2.2 script by Zeus81.

SUPER SIMPLE MOUSE SCRIPT v1.10 by Shaz

#============================================================================# SUPER SIMPLE MOUSE SCRIPT# v1.10 by Shaz#----------------------------------------------------------------------------# This is a conversion of the XP Mouse script by Near Fantastica and# SephirothSpawn modified by Amaranth Games, to run under VX Ace.#----------------------------------------------------------------------------# To Install:# Copy and paste into a new slot in materials, below all other scripts#----------------------------------------------------------------------------# To Customize:# Add keyword icon index pairs to the ICON hash (below this documentation). # Each of the keywords can be used in an event comment to make the mouse# cursor change into that icon when hovering over the event.#----------------------------------------------------------------------------# To Use:# Add the following comment to an event page:# <mouse icon [x y] [name]># where icon is the keyword from the ICON hash below# x and y are the offsets to override player movement (optional)# name is the text to display next to the icon when hovering over the event (optional)## Examples:# <mouse fight># will change the cursor into the 'fight' icon when over the event# <mouse touch 0 1># will change the cursor into the 'touch' icon when over the event, and# make the player walk to the tile below the event when the mouse button is# clicked# <mouse talk Gloria># will change the cursor into the 'talk' icon and display the name Gloria# <mouse talk 0 2 Henry Smith># will change the cursor into the 'talk' icon and display the name Henry Smith,# and when the mouse button is clicked, the player will walk to the tile# two below the event (good to use for shops where there's a counter in between)## To force pathfinding on the player or an event, simply add a move route with# the player or event as the subject, with a Script command, and call# find_path(x, y) where x and y are the coordinates of the tile you want to move to# Examples:# Set Move Route (Player): Script: find_path(5, 8)# will make the player find a path to tile 5, 8# Set Move Route (This Event): Script: find_path(10, 5)# will make the event find a path to tile 10, 5## NOTE: The path will be ATTEMPTED. If there is no path TO that exact tile,# a path to an adjacent tile will be attempted. If no path is found there# either, no movement will occur.# If a route is found, the player or event will begin moving towards it. But# if their path is blocked while they are moving, movement will be cancelled.#----------------------------------------------------------------------------# Author's Notes:# This script should work with any RTP script.# I do not guarantee that it will work with ANY other script (especially anything# that overrides player or event movement, such as pixel movement scripts, or# custom window scripts).## Script OVERWRITES the following methods:# Game_Map.setup_starting_map_event# Game_Map.setup_autorun_common_event## If you have other scripts that ALIAS these methods, this mouse script should# be placed above them.#----------------------------------------------------------------------------# Terms:# Use in free and commercial games# Credit: Near Fantastica, SephirothSpawn, Amaranth Games, Shaz#----------------------------------------------------------------------------# Versions:# 1.0 - 6 Sept 2013 - initial release# 1.02 - 7 Sept 2013 - fixed crash when loading games saved prior to adding script# - fixed player gets stuck on impassable area on world map# when clicking while leaving air ship# 1.03 - 8 Sept 2013 - fixed actor moving to diagonal tile instead of adjacent# 1.04 - 10 Sept 2013 - fixed vehicle pathfinding on world map# - fixed event trigger when no path found# 1.05 - 14 Sept 2013 - tweaked accessing of tilemap offset# 1.06 - 3 Nov 2013 - disabled mouse movement when waiting for NPC move route# - fixed events not triggering after player finishes walking# 1.07 - 6 Nov 2013 - slow down mouse scrolling, and don't loop save files# 1.08 - 24 Nov 2013 - cater for YEA Core large resolution with too-small maps# - fixed early event activation bug introduced in 1.06# - replaced calc of Windows_Selectable boundaries with item_rect# - added ability to completely disable mouse# 1.09 - 21 Dec 2013 - fixed mouse re-enable when calling common events# 1.10 - 6 Apr 2014 - add interaction for top part of > 32pixel high event# - activate an event without walking up to it# (add <autoactivate> comment at top of event page)# - arrow keys override mouse movement when pathfinding# - ignore mouse in menus when using keyboard# - make player walk to counter opposite shopkeepers#============================================================================#============================================================================# SUPER SIMPLE MOUSE SCRIPT# Mouse Sprite#============================================================================# Add/remove/change icon names here. The icon name is what will be used in the# event <mouse ...> command to show a different mouse icon when hovering over# the event. These MUST be in lower case here!ICON = {'sword' => 1, 'talk' => 2, 'look' => 3, 'fight' => 4}DEFAULT_ICON = 'sword'class Sprite_Mouse < Sprite #-------------------------------------------------------------------------- # * Initialization #-------------------------------------------------------------------------- def initialize super self.z = 10100 self.ox = 4 update @dummy = Bitmap.new(32, 32) self.bitmap = Bitmap.new(32, 32) @enabled = true @ignored = false end #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update return if !@enabled super if !SceneManager.scene.nil? if !Mouse.position.nil? mx, my = *Mouse.position if @cursor == DEFAULT_ICON self.x = mx unless mx.nil? else self.x = [mx, Graphics.width - self.bitmap.width].min unless mx.nil? end self.y = my unless my.nil? end if @scene != SceneManager.scene.class || Mouse.trigger? @scene = SceneManager.scene.class set_bitmap end end end #-------------------------------------------------------------------------- # * Set Bitmap #-------------------------------------------------------------------------- def set_bitmap(cursor = DEFAULT_ICON, text = nil) if @ignored cursor = DEFAULT_ICON text = nil end if @cursor != cursor || @text != text @cursor = cursor @text = text item_cursor = ICON[cursor] rect = Rect.new(item_cursor % 16 * 24, item_cursor / 16 * 24, 24, 24) if @text.nil? self.bitmap = Bitmap.new(24, 32) self.bitmap.blt(0, 0, Cache.system('Iconset'), rect) else w = @dummy.text_size(@text).width h = @dummy.font.size bitmap = Bitmap.new(26 + w, [32, h+2].max) bitmap.font.size = @dummy.font.size bitmap.font.shadow = true if self.x + 26 + w > Graphics.width bitmap.draw_text(0, 0, w, h, @text) bitmap.blt(w, 0, Cache.system('Iconset'), rect) else bitmap.blt(0, 0, Cache.system('Iconset'), rect) bitmap.draw_text(26, 0, w, h, @text) end self.bitmap = bitmap end end end #-------------------------------------------------------------------------- # * Update Event Cursors #-------------------------------------------------------------------------- def update_event_cursors # Remove mouse icon and text if we're off the grid if Mouse.grid.nil? set_bitmap return end # Set cursor and text according to event x, y = *Mouse.grid event = $game_map.lowest_mouse_event_xy(x, y) unless event.nil? && y < 410 if !event.mouse_icon.nil? || !event.mouse_text.nil? set_bitmap(event.mouse_icon, event.mouse_text) return end end # default bitmap if not over an event set_bitmap end #-------------------------------------------------------------------------- # * Enable Mouse #-------------------------------------------------------------------------- def enabled=(value) @enabled = value self.visible = value end #-------------------------------------------------------------------------- # * Mouse Enabled? #-------------------------------------------------------------------------- def enabled? @enabled end #-------------------------------------------------------------------------- # * Ignore Mouse #-------------------------------------------------------------------------- def ignored=(value) @ignored = value end #-------------------------------------------------------------------------- # * Mouse Ignored? #-------------------------------------------------------------------------- def ignored? @ignored endend$mouse = Sprite_Mouse.new#============================================================================# SUPER SIMPLE MOUSE SCRIPT# Mouse Module#============================================================================#==============================================================================# ** Mouse Module#------------------------------------------------------------------------------# by Near Fantastica and SephirothSpawn# adapted and converted to VX Ace by Shaz#==============================================================================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 Declarations #-------------------------------------------------------------------------- GAKS = Win32API.new('user32', 'GetAsyncKeyState', 'i', 'i') GSM = Win32API.new('user32', 'GetSystemMetrics', 'i', 'i') Cursor_Pos = Win32API.new('user32', 'GetCursorPos', 'p', 'i') 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') ShowCursor = Win32API.new('user32', 'ShowCursor', 'i', 'l') #-------------------------------------------------------------------------- # * Module Variables #-------------------------------------------------------------------------- @triggers = [[0, 1], [0, 2], [0, 4]] @old_pos = 0 @pos_i = 0 @sys_cursor_visible = false #-------------------------------------------------------------------------- # * Mouse Grid Position #-------------------------------------------------------------------------- def self.grid return nil if @pos.nil? mx, my = SceneManager.scene.instance_variable_get:)@spriteset).tilemap_offset x = (@pos[0] + mx) / 32 y = (@pos[1] + my) / 32 return [x, y] end #-------------------------------------------------------------------------- # * Mouse Position #-------------------------------------------------------------------------- def self.position return @pos.nil? ? [0, 0] : @pos end #-------------------------------------------------------------------------- # * Mouse Global Position #-------------------------------------------------------------------------- def self.global_pos pos = [0, 0].pack('ll') 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 gx, gy = global_pos x, y = screen_to_client(gx, gy) # Test boundaries begin if (x >= 0 && y >= 0 && x <= Graphics.width && y <= Graphics.height) return x, y else return -20, -20 end rescue return 0, 0 end end #-------------------------------------------------------------------------- # * Update Mouse Position #-------------------------------------------------------------------------- def self.update old_pos = @pos @pos = self.pos # Has mouse been moved? if old_pos != @pos Input.method = :mouse end # Which mouse to show - custom, or system? if $mouse.enabled? == @sys_cursor_visible @sys_cursor_visible = !@sys_cursor_visible ShowCursor.call(@sys_cursor_visible ? 1 : 0) end return if !$mouse.enabled? # Leaving / Entering Range? if old_pos != [-20, -20] && @pos == [-20, -20] # leaving range ShowCursor.call(1) elsif old_pos == [-20, -20] && @pos != [-20, -20] # entering range ShowCursor.call(0) end # Update Triggers for i in @triggers n = GAKS.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? # id : 0:Left, 1:Right, 2:Center #-------------------------------------------------------------------------- def self.trigger?(id = 0) if pos != [-20, -20] return @triggers[id][0] == 1 end return false end #-------------------------------------------------------------------------- # * Repeat? # id : 0:Left, 1:Right, 2:Center #-------------------------------------------------------------------------- def self.repeat?(id = 0) return @triggers[id][0] > 0 && @triggers[id][0] % 5 == 1 end #-------------------------------------------------------------------------- # * Hwnd #-------------------------------------------------------------------------- def self.hwnd if @hwnd.nil? title = "\0" * 256 Readini.call('Game', 'Title', '', title, 255, '.\\Game.ini') title.delete!("\0") @hwnd = Findwindow.call('RGSS Player', title) ShowCursor.call(0) end return @hwnd end #-------------------------------------------------------------------------- # * Client Size #-------------------------------------------------------------------------- def self.client_size rect = [0, 0, 0, 0].pack('l4') Client_rect.call(self.hwnd, rect) return rect.unpack('l4')[2..3] endend#============================================================================# SUPER SIMPLE MOUSE SCRIPT# Input#============================================================================class << Input #-------------------------------------------------------------------------- # * Public Instance Variables #-------------------------------------------------------------------------- attr_accessor :method #-------------------------------------------------------------------------- # * Alias Listings #-------------------------------------------------------------------------- alias :seph_mouse_input_update :update alias :seph_mouse_input_trigger? :trigger? alias :seph_mouse_input_repeat? :repeat? #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- def update $mouse.update Mouse.update seph_mouse_input_update # Are we using the mouse or the keyboard? @method = :keyboard if dir4 != 0 || dir8 != 0 end #-------------------------------------------------------------------------- # * Trigger? Test #-------------------------------------------------------------------------- def trigger?(constant) return true if seph_mouse_input_trigger?(constant) if $mouse.enabled? && !Mouse.pos.nil? if Mouse::Mouse_to_Input_Triggers.has_value?(constant) return true if Mouse.trigger?(Mouse::Mouse_to_Input_Triggers.index(constant)) end end return false end #-------------------------------------------------------------------------- # * Repeat? Test #-------------------------------------------------------------------------- def repeat?(constant) return true if seph_mouse_input_repeat?(constant) if $mouse.enabled? && !Mouse.pos.nil? if Mouse::Mouse_to_Input_Triggers.has_value?(constant) return true if Mouse.repeat?(Mouse::Mouse_to_Input_Triggers.index(constant)) end end return false endend#============================================================================# SUPER SIMPLE MOUSE SCRIPT# Map#============================================================================class Spriteset_Map #-------------------------------------------------------------------------- # * Tilemap Offset #-------------------------------------------------------------------------- def tilemap_offset if $imported && $imported["YEA-CoreEngine"] [@tilemap.ox - @viewport1.rect.x, @tilemap.oy - @viewport1.rect.y] else [@tilemap.ox, @tilemap.oy] end endendclass Game_Map #-------------------------------------------------------------------------- # * Detect/Set Up Starting Map Event #-------------------------------------------------------------------------- def setup_starting_map_event event = @events.values.find {|event| event.starting } event.clear_starting_flag if event @interpreter.setup(event.list, event.id, event.trigger_in?([0,1,2,3])) if event event end #-------------------------------------------------------------------------- # * Detect/Set Up Autorun Common Event #-------------------------------------------------------------------------- def setup_autorun_common_event event = $data_common_events.find do |event| event && event.autorun? && $game_switches[event.switch_id] end @interpreter.setup(event.list, 0, true) if event event end #-------------------------------------------------------------------------- # * Get ID of Lowest Mouse-enabled Event at Designated Coordinates #-------------------------------------------------------------------------- def lowest_mouse_event_xy(x, y) list = events_xy(x, y) + events_xy(x, y+1) list.sort! {|a, b| b.y - a.y} evt = nil list.each do |event| if (event.pos?(x, y) || (event.pos?(x, y+1) && event.height > 32)) && (evt.nil? || event.y > evt.y) evt = event break end end return evt endendclass Scene_Map #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- alias shaz_mouse_scene_map_update update def update $mouse.update_event_cursors shaz_mouse_scene_map_update endend#============================================================================# SUPER SIMPLE MOUSE SCRIPT# Event#============================================================================module RPG class Event class Page #-------------------------------------------------------------------- # * Public Instance Variables #-------------------------------------------------------------------- attr_reader :mouse_icon attr_reader :mouse_text attr_reader :mouse_position attr_reader :mouse_autoactivate #-------------------------------------------------------------------- # * Build Stats #-------------------------------------------------------------------- def build_stats # Mouse icons (icon mandatory, others optional) # <mouse icon destx desty name> @mouse_icon = nil @mouse_text = nil @mouse_position = [0, 0] @mouse_autoactivate = false # look for mouse instructions list.each do |command| if [108, 408].include?(command.code) comment = command.parameters[0] case comment when /<mouse/i params = /<mouse (.*)>/i.match(comment)[1].split(' ') @mouse_icon = params.shift if params.size > 1 && params[0] =~ /\d+/ && params[1] =~ /\d+/ @mouse_position = [params.shift.to_i, params.shift.to_i] end if params.size > 0 @mouse_text = params.join(' ') end when /<autoactivate>/ @mouse_autoactivate = true end end #if end #do end #def end endendclass Game_Event < Game_Character #-------------------------------------------------------------------------- # * Public Instance Variables #-------------------------------------------------------------------------- attr_reader :mouse_icon attr_reader :mouse_text attr_reader :mouse_position attr_reader :mouse_autoactivate #-------------------------------------------------------------------------- # * Start Event #-------------------------------------------------------------------------- alias shaz_mouse_game_event_start start def start $game_player.start_event(@id) if !empty? shaz_mouse_game_event_start end #-------------------------------------------------------------------------- # * Clear Event Page Settings #-------------------------------------------------------------------------- alias shaz_mouse_game_event_clear_page_settings clear_page_settings def clear_page_settings shaz_mouse_game_event_clear_page_settings @mouse_icon = nil @mouse_text = nil @mouse_position = [0, 0] @mouse_autoactivate = false @height = 0 end #-------------------------------------------------------------------------- # * Set Up Event Page Settings #-------------------------------------------------------------------------- alias shaz_mouse_game_event_setup_page_settings setup_page_settings def setup_page_settings shaz_mouse_game_event_setup_page_settings @page.build_stats @mouse_icon = @page.mouse_icon @mouse_text = @page.mouse_text @mouse_position = @page.mouse_position @mouse_autoactivate = @page.mouse_autoactivate set_size endend#============================================================================# SUPER SIMPLE MOUSE SCRIPT# Character#============================================================================class Game_CharacterBase attr_reader :height # Height of character bitmap #-------------------------------------------------------------------------- # * Initialize Public Member Variables #-------------------------------------------------------------------------- alias shaz_mouse_game_characterbase_init_public_members init_public_members def init_public_members shaz_mouse_game_characterbase_init_public_members @height = 0 end #-------------------------------------------------------------------------- # * Change Graphics # character_name : new character graphic filename # character_index : new character graphic index #-------------------------------------------------------------------------- alias shaz_mouse_game_characterbase_set_graphic set_graphic def set_graphic(character_name, character_index) shaz_mouse_game_characterbase_set_graphic(character_name, character_index) set_size end #-------------------------------------------------------------------------- # * Set character width/height size #-------------------------------------------------------------------------- def set_size bw = Cache.character(@character_name).width bh = Cache.character(@character_name).height sign = @character_name[/^[\!\$]./] if sign && sign.include?('$') @width = bw / 3 @height = bh / 4 else @width = bw / 12 @height = bh / 8 end end #-------------------------------------------------------------------------- # * Detect Collision with Event #-------------------------------------------------------------------------- def collide_with_events?(x, y) $game_map.events_xy_nt(x, y).any? do |event| self != event && (event.normal_priority? || self.is_a?(Game_Event)) end end #-------------------------------------------------------------------------- # * Detect Collision with Vehicle #-------------------------------------------------------------------------- def collide_with_vehicles?(x, y) !self.is_a?(Game_Player) && ($game_map.boat.pos_nt?(x, y) || $game_map.ship.pos_nt?(x, y)) end #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- alias shaz_mouse_game_characterbase_update update def update run_path if @runpath shaz_mouse_game_characterbase_update end #-------------------------------------------------------------------------- # * Run Path #-------------------------------------------------------------------------- def run_path return if moving? @step = @map.nil? || @map[@x, @y].nil? ? 0 : @map[@x, @y] - 1 if @step < 1 clear_path else x, y = @x, @y dirs = [] dirs.push(6) if @map[@x+1, @y] == @step && passable?(@x, @y, 6) dirs.push(2) if @map[@x, @y+1] == @step && passable?(@x, @y, 2) dirs.push(4) if @map[@x-1, @y] == @step && passable?(@x, @y, 4) dirs.push(8) if @map[@x, @y-1] == @step && passable?(@x, @y, 8) while dirs.size > 0 dir = dirs.delete_at(rand(dirs.size)) move_straight(dir) break if x != @x || y != @y end # clear the path if we couldn't move clear_path if x == @x && y == @y end end #-------------------------------------------------------------------------- # * Find Path #-------------------------------------------------------------------------- def find_path(x, y) sx, sy = @x, @y @tx, @ty = x, y result = setup_map(sx, sy) @runpath = result[0] @map = result[1] @map[sx, sy] = result[2] if result[2] != nil end #-------------------------------------------------------------------------- # * Clear Path #-------------------------------------------------------------------------- def clear_path @map = nil @runpath = false end #-------------------------------------------------------------------------- # * Setup Map #-------------------------------------------------------------------------- def setup_map(sx, sy) map = Table.new($game_map.width, $game_map.height) update_counter = 0 map[@tx, @ty] = 1 old_positions = [[@tx, @ty]] new_positions = [] # if tile is impassable, but CAN move to adjacent tiles, use the adjacent tiles instead if (!passable?(@tx, @ty, 2) && !passable?(@tx, @ty, 4) && !passable?(@tx, @ty, 6) && !passable?(@tx, @ty, 8)) || $game_map.events_xy_nt(@tx, @ty).any? { |evt| evt.normal_priority? && evt != self } old_positions = [] # Can we move from the destination tile in any direction? if map_passable?(@tx, @ty, 2) map[@tx, @ty+1] = 1 old_positions.push([@tx, @ty+1]) end if map_passable?(@tx, @ty, 8) map[@tx, @ty-1] = 1 old_positions.push([@tx, @ty-1]) end if map_passable?(@tx, @ty, 4) map[@tx-1, @ty] = 1 old_positions.push([@tx-1, @ty]) end if map_passable?(@tx, @ty, 6) map[@tx+1, @ty] = 1 old_positions.push([@tx+1, @ty]) end # If not, can we at least move up to the destination tile? if old_positions.size == 0 if map_passable?(@tx-1,@ty,6) map[@tx-1,@ty] = 1 old_positions.push([@tx-1,@ty]) end if map_passable?(@tx+1,@ty,4) map[@tx+1,@ty] = 1 old_positions.push([@tx+1,@ty]) end if map_passable?(@tx,@ty-1,2) map[@tx,@ty-1] = 1 old_positions.push([@tx,@ty-1]) end if map_passable?(@tx,@ty+1,8) map[@tx,@ty+1] = 1 old_positions.push([@tx,@ty+1]) end end end # If there are any counters, can we move to the tile on the other side? if map_passable?(@tx-2,@ty,6) && $game_map.counter?(@tx-1,@ty) map[@tx-2,@ty] = 1 old_positions.push([@tx-2,@ty]) end if map_passable?(@tx+2,@ty,4) && $game_map.counter?(@tx+1,@ty) map[@tx+2,@ty] = 1 old_positions.push([@tx+2,@ty]) end if map_passable?(@tx,@ty-2,2) && $game_map.counter?(@tx,@ty-1) map[@tx,@ty-2] = 1 old_positions.push([@tx,@ty-2]) end if map_passable?(@tx,@ty+2,2) && $game_map.counter?(@tx,@ty+1) map[@tx,@ty+2] = 1 old_positions.push([@tx,@ty+2]) end depth = 2 depth.upto(100) { |step| break if old_positions[0].nil? @step = step loop do break if old_positions[0].nil? x, y = old_positions.shift return [true, map, @step-1] if x == sx && y == sy if map[x, y + 1] == 0 && passable?(x, y, 2) map[x, y + 1] = @step new_positions.push([x, y + 1]) end if map[x - 1, y] == 0 && passable?(x, y, 4) map[x - 1, y] = @step new_positions.push([x - 1, y]) end if map[x + 1, y] == 0 && passable?(x, y, 6) map[x + 1, y] = @step new_positions.push([x + 1, y]) end if map[x, y - 1] == 0 && passable?(x, y, 8) map[x, y - 1] = @step new_positions.push([x, y - 1]) end # Update graphics? (to reduce lag) update_counter += 1 if update_counter > 50 Graphics.update update_counter = 0 end end old_positions = new_positions new_positions = [] } return [false, nil, nil] endend class Game_Character < Game_CharacterBase #-------------------------------------------------------------------------- # * Force Move Route #-------------------------------------------------------------------------- alias shaz_mouse_game_character_force_move_route force_move_route def force_move_route(move_route) clear_path shaz_mouse_game_character_force_move_route(move_route) endend#============================================================================# SUPER SIMPLE MOUSE SCRIPT# Player#============================================================================class Game_Player < Game_Character #-------------------------------------------------------------------------- # * Trigger Map Event # triggers : Trigger array # normal : Is priority set to [Same as Characters] ? #-------------------------------------------------------------------------- alias shaz_mouse_game_player_start_map_event start_map_event def start_map_event(x, y, triggers, normal) @started_events = [] shaz_mouse_game_player_start_map_event(x, y, triggers, normal) end #-------------------------------------------------------------------------- # * Start Event #-------------------------------------------------------------------------- def start_event(event_id) @started_events = [] if @started_events.nil? @started_events.push(event_id) end #-------------------------------------------------------------------------- # * Processing of Movement via Input from Directional Buttons #-------------------------------------------------------------------------- alias shaz_mouse_game_player_move_by_input move_by_input def move_by_input if Input.dir4 > 0 clear_path shaz_mouse_game_player_move_by_input else # Move by mouse input if !$game_message.busy? && !$game_message.visible && !@move_route_forcing && !@vehicle_getting_on && !@vehicle_getting_off && Mouse.trigger?(0) && !Mouse.grid.nil? && !$mouse.ignored? mx, my = *Mouse.grid # turn in direction if (@x - mx).abs >= (@y - my).abs set_direction(@x > mx ? 4 : 6) else set_direction(@y > my ? 8 : 2) end # find path @event = $game_map.lowest_mouse_event_xy(mx, my) if @event.nil? find_path(mx, my) elsif @event.mouse_autoactivate @event.start @started_events = [] clear_path else find_path(@event.x + @event.mouse_position[0], @event.y + @event.mouse_position[1]) end end end end #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- alias shaz_mouse_game_player_update update def update shaz_mouse_game_player_update update_pathfinding if !@event.nil? && !moving? end #-------------------------------------------------------------------------- # * Check event after pathfinding #-------------------------------------------------------------------------- def update_pathfinding if @map.nil? || @map[@x, @y] <= 1 dir = @x < @event.x ? 6 : @x > @event.x ? 4 : @y < @event.y ? 2 : @y > @event.y ? 8 : 0 # Face event and trigger it (only if not triggered by start_map_event) turn_toward_character(@event) if !@event.pos?(@x, @y) if !@started_events.include?(@event.id) && !@map.nil? && !in_airship? @event.start @started_events = [] end clear_path end end #-------------------------------------------------------------------------- # * Clear Path #-------------------------------------------------------------------------- def clear_path @event = nil super endend#============================================================================# SUPER SIMPLE MOUSE SCRIPT# Interpreter#============================================================================class Game_Interpreter #-------------------------------------------------------------------------- # * Event Setup #-------------------------------------------------------------------------- alias shaz_mouse_game_interpreter_setup setup def setup(list, event_id = 0, lock_player = false) shaz_mouse_game_interpreter_setup(list, event_id) @lock_player = lock_player end #-------------------------------------------------------------------------- # * Execute #-------------------------------------------------------------------------- alias shaz_mouse_game_interpreter_run run def run $mouse.ignored = true if @lock_player shaz_mouse_game_interpreter_run $mouse.ignored = false if @lock_player endend#============================================================================# SUPER SIMPLE MOUSE SCRIPT# Windows#============================================================================class Window_Selectable < Window_Base #-------------------------------------------------------------------------- # * Frame Update #-------------------------------------------------------------------------- alias shaz_mouse_window_selectable_update update def update shaz_mouse_window_selectable_update process_mouse_handling if Input.method == :mouse end #-------------------------------------------------------------------------- # * Mouse Movement Processing #-------------------------------------------------------------------------- def process_mouse_handling return unless $mouse.enabled? && cursor_movable? # Add a delay to prevent too-fast scrolling @delay = @delay ? @delay + 1 : 0 return if @delay % 3 > 0 mx, my = *Mouse.position vx = self.viewport ? self.x - self.viewport.ox + self.viewport.rect.x : self.x vy = self.viewport ? self.y - self.viewport.oy + self.viewport.rect.y : self.y if mx.between?(vx, vx + self.width) && my.between?(vy, vy + self.height) mx -= vx mx -= padding my -= vy my -= padding my += oy for i in 0 ... item_max rect = item_rect(i) if mx.between?(rect.x, rect.x + rect.width) && my.between?(rect.y, rect.y + rect.height) last_index = @index select(i) if @index != last_index Sound.play_cursor end break end end end endend class Window_NameInput < Window_Selectable #-------------------------------------------------------------------------- # * Mouse Movement Processing #-------------------------------------------------------------------------- def process_mouse_handling return unless $mouse.enabled? # Add a delay to prevent too-fast scrolling @delay = @delay ? @delay + 1 : 0 return if @delay % 3 > 0 mx, my = *Mouse.position vx = (self.viewport ? self.x - self.viewport.ox + self.viewport.rect.x : self.x) + padding vy = (self.viewport ? self.y - self.viewport.oy + self.viewport.rect.y : self.y) + padding if mx.between?(vx, vx + self.width - padding * 2) && my.between?(vy, vy + self.height - padding * 2) mx -= vx my -= vy x = (mx > 5*32+16 ? mx-16 : mx) / 32 y = my / line_height last_index = @index @index = y * 10 + x Sound.play_cursor if @index != last_index end endendclass Scene_File < Scene_MenuBase #-------------------------------------------------------------------------- # * Update Cursor #-------------------------------------------------------------------------- alias shaz_mouse_scene_file_update_cursor update_cursor def update_cursor shaz_mouse_scene_file_update_cursor process_mouse_handling if Input.method == :mouse end #-------------------------------------------------------------------------- # * Mouse Movement Processing #-------------------------------------------------------------------------- def process_mouse_handling return unless $mouse.enabled? # Add a delay to prevent too-fast scrolling @delay = @delay ? @delay + 1 : 0 return if @delay % 3 > 0 mx, my = *Mouse.position vx = @savefile_viewport.ox + mx vy = @savefile_viewport.oy + my last_index = @index new_index = vy / savefile_height if @index != new_index if new_index > @index cursor_down(false) else cursor_up(false) end Sound.play_cursor @savefile_windows[last_index].selected = false @savefile_windows[@index].selected = true end endend 
Fullscreen++ v2.2 script by Zeus81

# Fullscreen++ v2.2 for VX and VXace by Zeus81# Free for non commercial and commercial use# Licence : http://creativecommons.org/licenses/by-sa/3.0/# Contact : zeusex81@gmail.com# (fr) Manuel d'utilisation : http://pastebin.com/raw.php?i=1TQfMnVJ# (en) User Guide : http://pastebin.com/raw.php?i=EgnWt9ur # Disable ALT+Enter reghotkey = Win32API.new('user32', 'RegisterHotKey', 'LIII', 'I') reghotkey.call(0, 1, 1, 0x0D) $imported ||= {}$imported[:Zeus_Fullscreen] = __FILE__class << Graphics Disable_VX_Fullscreen = false CreateWindowEx = Win32API.new('user32' , 'CreateWindowEx' , 'ippiiiiiiiii', 'i') GetClientRect = Win32API.new('user32' , 'GetClientRect' , 'ip' , 'i') GetDC = Win32API.new('user32' , 'GetDC' , 'i' , 'i') GetSystemMetrics = Win32API.new('user32' , 'GetSystemMetrics' , 'i' , 'i') GetWindowRect = Win32API.new('user32' , 'GetWindowRect' , 'ip' , 'i') FillRect = Win32API.new('user32' , 'FillRect' , 'ipi' , 'i') FindWindow = Win32API.new('user32' , 'FindWindow' , 'pp' , 'i') ReleaseDC = Win32API.new('user32' , 'ReleaseDC' , 'ii' , 'i') SendInput = Win32API.new('user32' , 'SendInput' , 'ipi' , 'i') SetWindowLong = Win32API.new('user32' , 'SetWindowLong' , 'iii' , 'i') SetWindowPos = Win32API.new('user32' , 'SetWindowPos' , 'iiiiiii' , 'i') ShowWindow = Win32API.new('user32' , 'ShowWindow' , 'ii' , 'i') SystemParametersInfo = Win32API.new('user32' , 'SystemParametersInfo' , 'iipi' , 'i') UpdateWindow = Win32API.new('user32' , 'UpdateWindow' , 'i' , 'i') GetPrivateProfileString = Win32API.new('kernel32', 'GetPrivateProfileString' , 'ppppip' , 'i') WritePrivateProfileString = Win32API.new('kernel32', 'WritePrivateProfileString', 'pppp' , 'i') CreateSolidBrush = Win32API.new('gdi32' , 'CreateSolidBrush' , 'i' , 'i') DeleteObject = Win32API.new('gdi32' , 'DeleteObject' , 'i' , 'i') unless method_defined?:)zeus_fullscreen_update) HWND = FindWindow.call('RGSS Player', 0) BackHWND = CreateWindowEx.call(0x08000008, 'Static', '', 0x80000000, 0, 0, 0, 0, 0, 0, 0, 0) alias zeus_fullscreen_resize_screen resize_screen alias zeus_fullscreen_update update endprivate def initialize_fullscreen_rects @borders_size ||= borders_size @fullscreen_rect ||= screen_rect @workarea_rect ||= workarea_rect end def borders_size GetWindowRect.call(HWND, wrect = [0, 0, 0, 0].pack('l4')) GetClientRect.call(HWND, crect = [0, 0, 0, 0].pack('l4')) wrect, crect = wrect.unpack('l4'), crect.unpack('l4') Rect.new(0, 0, wrect[2]-wrect[0]-crect[2], wrect[3]-wrect[1]-crect[3]) end def screen_rect Rect.new(0, 0, GetSystemMetrics.call(0), GetSystemMetrics.call(1)) end def workarea_rect SystemParametersInfo.call(0x30, 0, rect = [0, 0, 0, 0].pack('l4'), 0) rect = rect.unpack('l4') Rect.new(rect[0], rect[1], rect[2]-rect[0], rect[3]-rect[1]) end def hide_borders() SetWindowLong.call(HWND, -16, 0x14000000) end def show_borders() SetWindowLong.call(HWND, -16, 0x14CA0000) end def hide_back() ShowWindow.call(BackHWND, 0) end def show_back ShowWindow.call(BackHWND, 3) UpdateWindow.call(BackHWND) dc = GetDC.call(BackHWND) rect = [0, 0, @fullscreen_rect.width, @fullscreen_rect.height].pack('l4') brush = CreateSolidBrush.call(0) FillRect.call(dc, rect, brush) ReleaseDC.call(BackHWND, dc) DeleteObject.call(brush) end def resize_window(w, h) if @fullscreen x, y, z = (@fullscreen_rect.width-w)/2, (@fullscreen_rect.height-h)/2, -1 else w += @borders_size.width h += @borders_size.height x = @workarea_rect.x + (@workarea_rect.width - w) / 2 y = @workarea_rect.y + (@workarea_rect.height - h) / 2 z = -2 end SetWindowPos.call(HWND, z, x, y, w, h, 0) end def release_alt inputs = [1,18,2, 1,164,2, 1,165,2].pack('LSx2Lx16'*3) SendInput.call(3, inputs, 28) endpublic def load_fullscreen_settings buffer = [].pack('x256') section = 'Fullscreen++' filename = './Game.ini' get_option = Proc.new do |key, default_value| l = GetPrivateProfileString.call(section, key, default_value, buffer, buffer.size, filename) buffer[0, l] end @fullscreen = false#get_option.call('Fullscreen' , '0') == '1' @fullscreen_ratio = 1#get_option.call('FullscreenRatio', '0').to_i @windowed_ratio = 1#get_option.call('WindowedRatio' , '1').to_i toggle_vx_fullscreen if Disable_VX_Fullscreen and vx_fullscreen? fullscreen? ? fullscreen_mode : windowed_mode end def save_fullscreen_settings section = 'Fullscreen++' filename = './Game.ini' set_option = Proc.new do |key, value| WritePrivateProfileString.call(section, key, value.to_s, filename) end set_option.call('Fullscreen' , @fullscreen ? '1' : '0') set_option.call('FullscreenRatio', @fullscreen_ratio) set_option.call('WindowedRatio' , @windowed_ratio) end def fullscreen? @fullscreen or vx_fullscreen? end def vx_fullscreen? rect = screen_rect rect.width == 640 and rect.height == 480 end def toggle_fullscreen fullscreen? ? windowed_mode : fullscreen_mode end def toggle_vx_fullscreen windowed_mode if @fullscreen and !vx_fullscreen? inputs = [1,18,0, 1,13,0, 1,13,2, 1,18,2].pack('LSx2Lx16'*4) SendInput.call(4, inputs, 28) zeus_fullscreen_update self.ratio += 0 # refresh window size end def vx_fullscreen_mode return if vx_fullscreen? toggle_vx_fullscreen end def fullscreen_mode return if vx_fullscreen? initialize_fullscreen_rects show_back hide_borders @fullscreen = true self.ratio += 0 # refresh window size end def windowed_mode toggle_vx_fullscreen if vx_fullscreen? initialize_fullscreen_rects hide_back show_borders @fullscreen = false self.ratio += 0 # refresh window size end def toggle_ratio return if vx_fullscreen? self.ratio += 1 end def ratio return 1 if vx_fullscreen? @fullscreen ? @fullscreen_ratio : @windowed_ratio end def ratio=(r) return if vx_fullscreen? initialize_fullscreen_rects r = 0 if r < 0 if @fullscreen @fullscreen_ratio = r w_max, h_max = @fullscreen_rect.width, @fullscreen_rect.height else @windowed_ratio = r w_max = @workarea_rect.width - @borders_size.width h_max = @workarea_rect.height - @borders_size.height end if r == 0 w, h = w_max, w_max * height / width h, w = h_max, h_max * width / height if h > h_max else w, h = width * r, height * r return self.ratio = 0 if w > w_max or h > h_max end resize_window(w, h) #save_fullscreen_settings end def update #release_alt if Disable_VX_Fullscreen and Input.trigger?(Input::ALT) zeus_fullscreen_update toggle_fullscreen if Input.trigger?(Input::F5) toggle_ratio if Input.trigger?(Input::F6) end def resize_screen(width, height) zeus_fullscreen_resize_screen(width, height) self.ratio += 0 # refresh window size endendGraphics.load_fullscreen_settings 
When testing my project, the Sword-like cursor disappears and reverts back to the regular arrow-like cursor as soon as I approach the black borders inside the game window (made fullscreen with F5 using the Fullscreen++ script).

The regular arrow-like cursor doesn't have the same sensitivity as the Sword-like cursor and gets lost off-screen very easily.

It's very awkward trying to "find back" your way onto the game screen every time you approach the black borders.

I could understand if it did that once I got out the game window, but the black borders are still inside of it.

It's exactly like having two monitors for your computer, and you could still hover your cursor over to the second monitor while it was off.

Is there a way to keep the cursor sprite within the game window so it can't go off-screen? Either a way to fix some borders, or maybe allow the cursor to retain its sword-like appearance and speed without disappearing, even when outside the game window?

I really don't know RGSS3, but maybe something like this is what I'm looking for (I have no clue):

  1.     if MOUSE_KEEP_WINDOW
  2.       @m_x = [[@m_x, 0].max,Graphics.width-5].min
  3.       @m_y = [[@m_y, 0].max,Graphics.height-5].min
 

Thank you very much for your help! It is much appreciated.
 
Last edited by a moderator:

TheDrifter

Veteran
Veteran
Joined
Apr 18, 2012
Messages
99
Reaction score
2
First Language
English
Primarily Uses
The script works nicely with the top and left borders of the screen, but the cursor can still go past the right and bottom borders.

As soon as the Sword-like cursor touches the right border of the screen, it changes into the regular arrow-like cursor, and that cursor appears in the horizontal middle of the screen as a starting point.

Same goes for the bottom boundary. As soon as the sword-like cursor becomes the arrow-like cursor, it appears in the vertical middle of the screen.

This tells me that, if you imagine the screen size to be 100 units in length and 100 units in height (x,y), the script's boundaries are (x=150, y=150) instead of (x=100, y=100).

I'm not sure what values to change in the script, assuming my understanding is correct.
 
Last edited by a moderator:

Jet

Flying in a sky near you
Veteran
Joined
Mar 19, 2012
Messages
172
Reaction score
102
First Language
English
Primarily Uses
Are you using the F6 ratio function of the fullscreen script? If so, this is not a cursor clipping issue, rather a display issue present in all mouse scripts with the type of scaling that is done.

There's nothing I can do to fix that sadly, don't have time to delve into it. My cursor boundary script works with normal sized windows/fullscreen, and windows made bigger while also increasing the resolution, such as the graphics resizer floating around.
 

Shaz

Veteran
Veteran
Joined
Mar 2, 2012
Messages
38,243
Reaction score
11,853
First Language
English
Primarily Uses
RMMV
Please don't post other people's scripts in your post - especially when they're as long as that! Just a link to the thread is plenty, and will give people more information than they can get from the script itself.
 

Wilczek

Veteran
Veteran
Joined
Oct 8, 2012
Messages
31
Reaction score
15
First Language
Polish
Primarily Uses
The solution is very easy - replace line 337

ShowCursor.call(1)with

ShowCursor.call(0)It will not prevent the cursor from going beyond the screen borders, but you won't see a system cursor icon anymore.
 

Phonantiphon

Veteran
Veteran
Joined
Jan 17, 2016
Messages
261
Reaction score
145
First Language
English
Primarily Uses
This should do what you want, and should work with mostly any mouse script, only tested with my own and Shaz's though.


http://pastebin.com/raw.php?i=5FZa19ur


It should be plug-n-play, let me know if it works for you.
Hi,


Apologies for kind of necro-ing this thread but I'm wanting to utilize this module, now, I have enough scripting knowledge to make me dangerous in Ruby, but not enough to make me competent(!)


There is a [module mouse] section in the mouse script already - (obv.) - am I right in assuming that I ADD this script fragment to the existing module, or - do I REPLACE the existing module with this one?


I'm assuming it must be the former, since the original module has considerably more content in it than this fragment...?


Thanks! :)
 

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

Latest Threads

Latest Posts

Latest Profile Posts

I am dead tired but at the same time I really wanna write a tutorial x_x
Looked out side and couldn't see the neighbor's house through the snow. That age old Christmas song started going through my head. "It's a lovely day to say the heck at home."
Last year, I planted a bunch of spinach, and one plant wasn't doing well, so I transferred it to a separate pot. All its kin died while it hibernated over winter. Now it thrives. I've named it Prince Spinach.
Scooby Doo on Zombie Island is anime and you cant change my mind.
I guess the concept of friendship has changed :") Today I saw a very quiet boy getting bullied by his 'friends' because he wasn't talking. They made a circle and made him sit in the middle and were nagging him saying hey talk, sing a song, do this tongue twister etc. etc. And I could totally see the discomfort in the boy's face. Glad I don't have 'friends' lmao

Forum statistics

Threads
93,371
Messages
911,733
Members
122,863
Latest member
muhlijem
Top