#==============================================================================
# ■ Maplinks
#------------------------------------------------------------------------------
# This is the script for Maplinks.
#==============================================================================
<span style="color:#000080; font-style:italic;">=begin
<span style="color:#000080; font-style:italic;">============
<span style="color:#000080; font-style:italic;">Maplinks - version 0.95 (2005-11-10)
<span style="color:#000080; font-style:italic;">============
<span style="color:#000080; font-style:italic;">by Wachunga
<span style="color:#000080; font-style:italic;">
<span style="color:#000080; font-style:italic;">This script simplifies linking maps together: a single event sets up an
<span style="color:#000080; font-style:italic;">entire edge of the map as a teleport to another map. Players trying to
<span style="color:#000080; font-style:italic;">leave that edge of the current map are automatically teleported.
<span style="color:#000080; font-style:italic;">
<span style="color:#000080; font-style:italic;">(This can also be achieved with many copies of teleport events along the edges
<span style="color:#000080; font-style:italic;">of a map or with a parallel-process event that sets variables and uses them to
<span style="color:#000080; font-style:italic;">teleport, but these methods are not optimal -- causing lag and/or inconvenience
<span style="color:#000080; font-style:italic;">for the mapper.)
<span style="color:#000080; font-style:italic;">
<span style="color:#000080; font-style:italic;">To link a map with another on a specific edge (north, east, south or west),
<span style="color:#000080; font-style:italic;">create an event with <maplink> included in its name on the appropriate edge of
<span style="color:#000080; font-style:italic;">the map. (To avoid confusion, maplink events on corners of the map are
<span style="color:#000080; font-style:italic;">not valid.) Then, add a teleport ("Transfer Player") command to the event
<span style="color:#000080; font-style:italic;">to specify the destination map and other details (e.g. player direction,
<span style="color:#000080; font-style:italic;">fading on/off). If the destination is an east or west edge, then the Y
<span style="color:#000080; font-style:italic;">coordinate is calculated based on the player's Y coordinate when
<span style="color:#000080; font-style:italic;">teleporting; likewise, the X coordinate is calculated automatically when
<span style="color:#000080; font-style:italic;">the destination is a north or south edge.
<span style="color:#000080; font-style:italic;">
<span style="color:#000080; font-style:italic;">Note: unlike normal teleport events, maplinks are activated when the player
<span style="color:#000080; font-style:italic;">tries to leave the screen instead of when stepping on the last tile. This
<span style="color:#000080; font-style:italic;">behaviour could be changed, but I feel that it's more natural this way:
<span style="color:#000080; font-style:italic;">it leaves the whole map open for actual exploration, instead of "wasting"
<span style="color:#000080; font-style:italic;">the outer tiles of a map.
<span style="color:#000080; font-style:italic;">
<span style="color:#000080; font-style:italic;">=end
#-------------------------------------------------------------------------------
class Game_Event < Game_Character
alias ml_ge_init initialize
def initialize(map_id, event)
ml_ge_init(map_id, event)
if @event.name.upcase.include?('<MAPLINK>')
dir = nil
if @event.y == $game_map.height-1
dir = 2 unless @event.x == 0 or @event.x == $game_map.width-1
elsif @event.x == 0
dir = 4 unless @event.y == 0 or @event.y == $game_map.height-1
elsif @event.x == $game_map.width-1
dir = 6 unless @event.y == 0 or @event.y == $game_map.height-1
elsif @event.y == 0
dir = 8 unless @event.x == 0 or @event.x == $game_map.width-1
end
if dir != nil
@list.each { |command|
if command.code == 201
# make sure new location isn't be specified by variables
if command.parameters[0] == 0
$game_map.maplinks[dir] = Maplink.new(command.parameters)
break
end
end
}
end
end
end
end
#-------------------------------------------------------------------------------
class Game_Map
attr_accessor :maplinks
alias ml_gm_setup setup
def setup(map_id)
@maplinks = {}
ml_gm_setup(map_id)
end
def width(map_id = @map_id)
if map_id == @map_id
return @map.width
else
return load_data(sprintf("Data/Map%03d.rxdata", map_id)).width
end
end
def height(map_id = @map_id)
if map_id == @map_id
return @map.height
else
return load_data(sprintf("Data/Map%03d.rxdata", map_id)).height
end
end
end
#-------------------------------------------------------------------------------
class Maplink
def initialize(parameters)
@param = parameters
end
def activate
width = $game_map.width(@param[1])
height = $game_map.height(@param[1])
# modify x (p[2]) or y (p[3]) coordinates appropriately
if @param[2] == 0 or @param[2] == width-1
@param[3] = $game_player.y
elsif @param[3] == 0 or @param[3] == height-1
@param[2] = $game_player.x
end
# set up a dummy interpreter just for teleport
interpreter = Interpreter.new
interpreter.parameters = @param
interpreter.index = 0
interpreter.command_201
end
end
#-------------------------------------------------------------------------------
class Game_Player
alias ml_cett check_event_trigger_touch
def check_event_trigger_touch(x, y)
check_maplinks(x,y)
ml_cett(x,y)
end
def check_maplinks(x,y)
if $game_map.valid?(x, y) then return end
dir = nil
if y == $game_map.height then dir = 2
elsif x == -1 then dir = 4
elsif x == $game_map.width then dir = 6
elsif y == -1 then dir = 8
end
if dir != nil
if $game_map.maplinks[dir] != nil
$game_map.maplinks[dir].activate
end
end
end
end
#-------------------------------------------------------------------------------
class Interpreter
attr_accessor :parameters
attr_accessor :index
end