mirror of
https://github.com/infinitefusion/infinitefusion-e18.git
synced 2025-12-06 06:01:46 +00:00
195 lines
6.4 KiB
Ruby
195 lines
6.4 KiB
Ruby
#===============================================================================
|
|
# ** Map Autoscroll
|
|
#-------------------------------------------------------------------------------
|
|
# Wachunga
|
|
# Version 1.02
|
|
# 2005-12-18
|
|
#===============================================================================
|
|
=begin
|
|
|
|
This script supplements the built-in "Scroll Map" event command with the
|
|
aim of simplifying cutscenes (and map scrolling in general). Whereas the
|
|
normal event command requires a direction and number of tiles to scroll,
|
|
Map Autoscroll scrolls the map to center on the tile whose x and y
|
|
coordinates are given.
|
|
|
|
FEATURES
|
|
- automatic map scrolling to given x,y coordinate (or player)
|
|
- destination is fixed, so it's possible to scroll to same place even if
|
|
origin is variable (e.g. moving NPC)
|
|
- variable speed (just like "Scroll Map" event command)
|
|
- diagonal scrolling supported
|
|
|
|
SETUP
|
|
Instead of a "Scroll Map" event command, use the "Call Script" command
|
|
and enter on the following on the first line:
|
|
|
|
autoscroll(x,y)
|
|
|
|
(replacing "x" and "y" with the x and y coordinates of the tile to scroll to)
|
|
|
|
To specify a scroll speed other than the default (4), use:
|
|
|
|
autoscroll(x,y,speed)
|
|
|
|
(now also replacing "speed" with the scroll speed from 1-6)
|
|
|
|
Diagonal scrolling happens automatically when the destination is diagonal
|
|
relative to the starting point (i.e., not directly up, down, left or right).
|
|
|
|
To scroll to the player, instead use the following:
|
|
|
|
autoscroll_player(speed)
|
|
|
|
Note: because of how the interpreter and the "Call Script" event command
|
|
are setup, the call to autoscroll(...) can only be on the first line of
|
|
the "Call Script" event command (and not flowing down to subsequent lines).
|
|
|
|
For example, the following call may not work as expected:
|
|
|
|
autoscroll($game_variables[1],
|
|
$game_variables[2])
|
|
|
|
(since the long argument names require dropping down to a second line)
|
|
A work-around is to setup new variables with shorter names in a preceding
|
|
(separate) "Call Script" event command:
|
|
|
|
@x = $game_variables[1]
|
|
@y = $game_variables[2]
|
|
|
|
and then use those as arguments:
|
|
|
|
autoscroll(@x,@y)
|
|
|
|
The renaming must be in a separate "Call Script" because otherwise
|
|
the call to autoscroll(...) isn't on the first line.
|
|
|
|
Originally requested by militantmilo80:
|
|
http://www.rmxp.net/forums/index.php?showtopic=29519
|
|
|
|
=end
|
|
|
|
class Interpreter
|
|
SCROLL_SPEED_DEFAULT = 4
|
|
#-----------------------------------------------------------------------------
|
|
# * Map Autoscroll to Coordinates
|
|
# x : x coordinate to scroll to and center on
|
|
# y : y coordinate to scroll to and center on
|
|
# speed : (optional) scroll speed (from 1-6, default being 4)
|
|
#-----------------------------------------------------------------------------
|
|
def autoscroll(x,y,speed=SCROLL_SPEED_DEFAULT)
|
|
if $game_map.scrolling?
|
|
return false
|
|
elsif !$game_map.valid?(x,y)
|
|
print 'Map Autoscroll: given x,y is invalid'
|
|
return command_skip
|
|
elsif !(1..6).include?(speed)
|
|
print 'Map Autoscroll: invalid speed (1-6 only)'
|
|
return command_skip
|
|
end
|
|
center_x = (Graphics.width/2 - Game_Map::TILE_WIDTH/2) * 4 # X coordinate in the center of the screen
|
|
center_y = (Graphics.height/2 - Game_Map::TILE_HEIGHT/2) * 4 # Y coordinate in the center of the screen
|
|
max_x = ($game_map.width - Graphics.width*1.0/Game_Map::TILE_WIDTH) * 4 * Game_Map::TILE_WIDTH
|
|
max_y = ($game_map.height - Graphics.height*1.0/Game_Map::TILE_HEIGHT) * 4 * Game_Map::TILE_HEIGHT
|
|
count_x = ($game_map.display_x - [0,[x*Game_Map::REAL_RES_X-center_x,max_x].min].max)/Game_Map::REAL_RES_X
|
|
count_y = ($game_map.display_y - [0,[y*Game_Map::REAL_RES_Y-center_y,max_y].min].max)/Game_Map::REAL_RES_Y
|
|
if !@diag
|
|
@diag = true
|
|
dir = nil
|
|
if count_x > 0
|
|
if count_y > 0
|
|
dir = 7
|
|
elsif count_y < 0
|
|
dir = 1
|
|
end
|
|
elsif count_x < 0
|
|
if count_y > 0
|
|
dir = 9
|
|
elsif count_y < 0
|
|
dir = 3
|
|
end
|
|
end
|
|
count = [count_x.abs,count_y.abs].min
|
|
else
|
|
@diag = false
|
|
dir = nil
|
|
if count_x != 0 && count_y != 0
|
|
return false
|
|
elsif count_x > 0
|
|
dir = 4
|
|
elsif count_x < 0
|
|
dir = 6
|
|
elsif count_y > 0
|
|
dir = 8
|
|
elsif count_y < 0
|
|
dir = 2
|
|
end
|
|
count = count_x != 0 ? count_x.abs : count_y.abs
|
|
end
|
|
$game_map.start_scroll(dir, count, speed) if dir != nil
|
|
if @diag
|
|
return false
|
|
else
|
|
return true
|
|
end
|
|
end
|
|
|
|
#-----------------------------------------------------------------------------
|
|
# * Map Autoscroll (to Player)
|
|
# speed : (optional) scroll speed (from 1-6, default being 4)
|
|
#-----------------------------------------------------------------------------
|
|
def autoscroll_player(speed=SCROLL_SPEED_DEFAULT)
|
|
autoscroll($game_player.x,$game_player.y,speed)
|
|
end
|
|
end
|
|
|
|
|
|
|
|
class Game_Map
|
|
def scroll_downright(distance)
|
|
@display_x = [@display_x + distance,
|
|
(self.width - Graphics.width*1.0/TILE_WIDTH) * REAL_RES_X].min
|
|
@display_y = [@display_y + distance,
|
|
(self.height - Graphics.height*1.0/TILE_HEIGHT) * REAL_RES_Y].min
|
|
end
|
|
|
|
def scroll_downleft(distance)
|
|
@display_x = [@display_x - distance, 0].max
|
|
@display_y = [@display_y + distance,
|
|
(self.height - Graphics.height*1.0/TILE_HEIGHT) * REAL_RES_Y].min
|
|
end
|
|
|
|
def scroll_upright(distance)
|
|
@display_x = [@display_x + distance,
|
|
(self.width - Graphics.width*1.0/TILE_WIDTH) * REAL_RES_X].min
|
|
@display_y = [@display_y - distance, 0].max
|
|
end
|
|
|
|
def scroll_upleft(distance)
|
|
@display_x = [@display_x - distance, 0].max
|
|
@display_y = [@display_y - distance, 0].max
|
|
end
|
|
|
|
def update_scrolling
|
|
# If scrolling
|
|
if @scroll_rest > 0
|
|
# Change from scroll speed to distance in map coordinates
|
|
distance = (1<<@scroll_speed)*40/Graphics.frame_rate
|
|
distance = @scroll_rest if distance>@scroll_rest
|
|
# Execute scrolling
|
|
case @scroll_direction
|
|
when 1 then scroll_downleft(distance)
|
|
when 2 then scroll_down(distance)
|
|
when 3 then scroll_downright(distance)
|
|
when 4 then scroll_left(distance)
|
|
when 6 then scroll_right(distance)
|
|
when 7 then scroll_upleft(distance)
|
|
when 8 then scroll_up(distance)
|
|
when 9 then scroll_upright(distance)
|
|
end
|
|
# Subtract distance scrolled
|
|
@scroll_rest -= distance
|
|
end
|
|
end
|
|
end
|