じ☆ve冰风 发表于 2026-8-2 08:57:23

Teleport to Visited sites

https://www.youtube.com/embed/jrAQVEw21lQ

Script Name:TeleportToVisited

Author:       Newold

Description:With this script you can make a window appear that
                     allows you to teleport to any map you have visited before.
                     You can also store different teleport points on each map.

Version:      1.4 - 10-01-2019

Credits and License: You can use this script as you want. It is free for comercial and not comercial projects. You can give me thanks in the credits of your game or not, as you wish



**************************************************************************
Installation and use
   **************************************************************************

️ INSTALLATION

   - Put this script over main

   - You need to download these images and unzip them in the folder
       "Graphics/Pictures"
       Link: Bajar]https://www.mediafire.com/file/n7bv66tbdr7cj3m/TeleportImages.rar/file] (Downloads images from mediafire)

   - you can configure this script below this instructions


️ HOW TO USE

   - When you visited a map, this map is added automatically to the
       teleport's list.
       If you do not want the map to be added automatically, you need
       to create an empty event on that map and name it
       ⇒⇒⇒⇒            noAddToTeleportList            ⇐⇐⇐⇐

   ··········································································

   - To add a teleport point manually, use the command call script of
       the events and inside you put this code:

       add_map(ref, name, map_id, x, y, direction)

         ● ref         
Can be a number (Ex: 1), a string (Ex: "name") or
                         symbol
symbol)
                         ref is used to identify this teleport.
         ● name      
Only can be a string (Ex: "name")
                         name is used to name this teleport.
         ● map_id      
it can be nil (current map) or a number.
                         map_id refers to the id of the map.
         ● x         
it can be nil (current position X of player)
                         or a number.
         ● y         
it can be nil (current position Y of player)
                         or a number.
         ● direction   
it can be nil (current direction of player)
                         or a number. (2 = Down, 4 = Left, 6 = Right, 8 = Up)

   ··········································································

   - To modify a parameter of a teleport point already added, use the
       command call script of the events and inside you put this code:

       update_map_info(map_id, attr, value, ref)

         ● map_id      
it is a number. map_id refers to the id of the map.
         ● attr      
name of the parameter to modify
                         (including the two points)
                         attr only can be :x, :y, :direction or :map_name
                           ● :x         
Use :x to modify the
                                             X coordinate of teleport
                           ● :y         
Use :y to modify the
                                             Y coordinate of teleport
                           ● :direction
Use :direction to modify where
                                             the character will look when
                                             teleporting
                           ● :map_name   
Use :map_name to change the name
                                             of teleport
         ● value      
It must be a text between quotation marks to modify
                         the value of :map_name (example "my text") or a number
                         to modify the other values
         ● ref         
Can be a number (Ex: 1), a string (Ex: "name") or
                         symbol
symbol)

   ··········································································

   - To show the teleport selection window, use the command call script
       of the events and inside you put this code:

       open_teleport

   ··········································································
   **************************************************************************



️ SCRIPT

                Code:       
#===============================================================================
class TeleportToVisited

=begin

      **************************************************************************
      Script Name:TeleportToVisited
   
      Author:       Newold
   
      Description:With this script you can make a window appear that
                  allows you to teleport to any map you have visited before.
                  You can also store different teleport points on each map.
                  
      Version:      1.4 - 10-01-2019
   
      License and   You can use this script as you want.
      Credits       It is free for comercial and not comercial projects.
                  You can give me thanks in the credits of your game or not,
                  as you wish.
   
      History / Updates:
      ▼ 10-01-2019 - Fixed "stack to deep" bug
      ▼ 09-01-2019 - You can now to postpone teleport and do it manually.
      ▼ 09-01-2019 - You can now disable/enable last teleport used
                      (default = false)
      ▼ 08-01-2019 - Now you can add teleports to any map from any map
      ▼ 07-01-2019 - Release Day.
      **************************************************************************
   
   
      **************************************************************************
                            Installation and use
      **************************************************************************
      ⚫ INSTALLATION
   
      - Put this script over main
   
      - You need to download these images and unzip them in the folder
      "Graphics/Pictures"
      Link: Download images from mediafire (you need unzip):
          https://www.mediafire.com/file/n7bv66tbdr7cj3m/TeleportImages.rar/file
      
      - you can configure this script below this instructions
   
      ⚫ HOW TO USE
   
      - When you visited a map, this map is added automatically to the
      teleport's list.
      If you do not want the map to be added automatically, you need
      to create an empty event on that map and name it
      ⇒⇒⇒⇒            noAddToTeleportList            ⇐⇐⇐⇐
   
      ··········································································
   
      - To add a teleport point manually, use the command call script of
      the events and inside you put this code:
      
      add_map(ref, name, map_id, x, y, direction)
      
          ● ref         ▶ Can be a number (Ex: 1), a string (Ex: "name") or
                        symbol (:symbol)
                        ref is used to identify this teleport.
          ● name      ▶ Only can be a string (Ex: "name")
                        name is used to name this teleport.
          ● map_id      ▶ it can be nil (current map) or a number.
                        map_id refers to the id of the map.
          ● x         ▶ it can be nil (current position X of player)
                        or a number.
          ● y         ▶ it can be nil (current position Y of player)
                        or a number.
          ● direction   ▶ it can be nil (current direction of player)
                        or a number. (2 = Down, 4 = Left, 6 = Right, 8 = Up)
                        
      ··········································································
   
      - To modify a parameter of a teleport point already added, use the
      command call script of the events and inside you put this code:
      
      update_map_info(map_id, attr, value, ref)
      
          ● map_id      ▶ it is a number. map_id refers to the id of the map.
          ● attr      ▶ name of the parameter to modify
                        (including the two points)
                        attr only can be :x, :y, :direction or :map_name
                              ● :x          ▶ Use :x to modify the
                                              X coordinate of teleport
                              ● :y          ▶ Use :y to modify the
                                              Y coordinate of teleport
                              ● :direction▶ Use :direction to modify where
                                              the character will look when
                                              teleporting
                              ● :map_name   ▶ Use :map_name to change the name
                                              of teleport
          ● value       ▶ It must be a text between quotation marks to modify
                        the value of :map_name (example "my text") or a number
                        to modify the other values
          ● ref         ▶ Can be a number (Ex: 1), a string (Ex: "name") or
                        symbol (:symbol)
                        
      ··········································································
   
      - To show the teleport selection window, use the command call script
      of the events and inside you put this code:
      
      open_teleport
      
      - If you want to postpone the teleport and activate a switch instead to
      create some engine, you need put config @@config[:pospone_teleport] in
      true and define switch in @@config[:activate_switch]. Then you can
      create any engine in your game and finally teleport using the command
      call script of the events and inside you put this code:
      
      perform_teleport
      
      ··········································································
      **************************************************************************
=end


   
#=============================================================================
#             ▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼ CONFIGURATION ▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼▼
#=============================================================================
@@config = {}
# ············································································
#                   images (in folder Graphics/Pictures)
# ············································································
# Image of cursor (hand)
@@config[:cursor1] = "cursor001"
# Image of cursor (selector)
@@config[:cursor2] = "cursor002"
# Image of cursor (current map)
@@config[:cursor3] = "cursor003"
# Pattern for window
@@config[:window_pattern] = "window001"
# ············································································



# ············································································
#                     Sounds (in folder Audio/SE)
# ············································································
# Cursor movement
@@config[:cursor_se] = {
    :name   => "Cursor1",
    :volume   => 75,
    :pitch    => 100
}
# Decision (OK)
@@config[:decision_se] = {
    :name   => "Decision2",
    :volume   => 75,
    :pitch    => 100
}
# Error (Buzzer)
@@config[:buzzer_se] = {
    :name   => "Buzzer1",
    :volume   => 75,
    :pitch    => 100
}
# Cancel
@@config[:cancel_se] = {
    :name   => "Cancel1",
    :volume   => 75,
    :pitch    => 100
}
# Teleport
@@config[:teleport_se] = {
    :name   => "Teleport",
    :volume   => 75,
    :pitch    => 100
}
# ············································································



# ············································································
#                         Window Config
# ············································································
# Width window
@@config[:window_width] = 240
# Height window
@@config[:window_height] = 160
# Show displacement bar
@@config[:show_displacement_bar] = true
# Draw background stretched
@@config[:stretch_background] = false
# Config Font
@@config[:font] = {
    :name               => "Verdana",
    :size               => 20,
    :color                => Color.new(255,255,255),
    :outline            => true,
    :out_color            => Color.new(0,0,0),
    :current_map_color    => Color.new(9,104,20)
}
# ············································································

    # ·········································································
    # Position Window
    # ·········································································
    # :top_left       > -------------------------------------------------------
    # :top            >
    # :top_right      >
    # :left         >
    # :screen_center>                     screen
    # :right          >
    # :bottom_left    >
    # :bottom         >
    # :bottom_right   > -------------------------------------------------------
   
    # :center_top   > -------------------------------------------------------
    # :center_left    >
    # :center_right   >                      character
    # :center_bottom>
    # :center         > -------------------------------------------------------
   
    # Point         > Fixed point (Point.new(x, y))
    # ·········································································
    @@config[:window_position] = :center_left
    # ·········································································
# ············································································


   
# ············································································
# Other Config
# ············································································
# Suavize animation (show / hide window)
@@config[:animation_suavize] = 8
# Screen margin for window
@@config[:screen_margin] = 10
# Disable same teleport than current map
# (last teleport is disabled. It enable when change teleport)
@@config[:disable_last_teleport] = false
# Postpone teleportation and activate switch
@@config[:pospone_teleport] = false
# switch to activate when success teleport. If you use
# @@config[:pospone_teleport], this switch is activated instead of teleport
# player. You must manually teleport the player using this command:
# $TeleportToVisited.perform_teleport
@@config[:activate_switch] = 100
# ············································································


#=============================================================================
#         ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲ END CONFIGURATION ▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲▲
#=============================================================================



#=============================================================================
class Point
    attr_accessor :x, :y
    def initialize(x=0, y=0)
      @x, @y = x, y
    end
end
#=============================================================================
class Data
    attr_accessor :x, :y, :direction, :map_name, :map_id, :ref
end
#=============================================================================

#-----------------------------------------------------------------------------
attr_reader :data
#-----------------------------------------------------------------------------
def initialize
    @data = []
    @drawed = []
    @current_map = nil
    @index = 0
    @cursor_animation_index = 0
    @cursor_animation = [-1, 0, 0, -1, -1, 0, 1, 0, 0, 1, 0, 0, 1]
    @arrows_animation_index = 0
    @arrows_animation = [-1, 0, 0, 0, 0, -1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0]
    @bar_displacement = 0
    @show_displacement_bar = true
    create_cursor
    create_window
end
#-----------------------------------------------------------------------------
def create_cursor
    @cursor = Sprite.new
    @cursor.bitmap = Cache.picture(@@config[:cursor1])
    @cursor.z = 10000020
    @cursor.opacity = 0
    @cursor.visible = false
end
#-----------------------------------------------------------------------------
def create_window
    src_rects = get_rects
   
    bitmap = Cache.picture(@@config[:window_pattern])
    transparent = Color.new(0,0,0,0)
   
    viewport = Viewport.new(0, 0, Graphics.width, Graphics.height)
    viewport.z = 500
    @window = Sprite.new(viewport)
    @window.x = 200
    @window.y = 100
    @window.bitmap = Bitmap.new(@@config[:window_width],
      @@config[:window_height])
    @window.ox = @window.width / 2
    @window.oy = @window.height / 2
    # Draw borders
    # ··············································
    # Left
    rect = src_rects[:left]
    h1 = src_rects[:top_left].height
    h2 = src_rects[:bottom_left].height
    rect2 = Rect.new(0, h1, rect.width, @window.height - h1 - h2)
    draw_window_part(bitmap, rect, rect2)
    # ··············································
    # Right
    rect = src_rects[:right]
    h1 = src_rects[:top_right].height
    h2 = src_rects[:bottom_right].height
    rect2 = Rect.new(@window.width - rect.width,
      h1, rect.width, @window.height - h1 - h2)
    draw_window_part(bitmap, rect, rect2)
    # ··············································
    # Top
    rect = src_rects[:top]
    w1 = src_rects[:top_left].width
    w2 = src_rects[:top_right].width
    rect2 = Rect.new(w1, 0, @window.width - w1 - w2, rect.height)
    draw_window_part(bitmap, rect, rect2)
    # ··············································
    # Bottom
    rect = src_rects[:bottom]
    w1 = src_rects[:bottom_left].width
    h2 = src_rects[:bottom_right].width
    rect2 = Rect.new(w1, @window.height - rect.height,
    @window.width - w1 - w2, rect.height)
    draw_window_part(bitmap, rect, rect2)
    # ··············································
    # Center and contents
    rect = src_rects[:center]
    x = src_rects[:top_left].width
    y = src_rects[:top_left].height
    w = @window.width - x - src_rects[:top_right].width
    h = @window.height - y - src_rects[:bottom_right].height
    rect2 = Rect.new(x, y, w, h)
    draw_window_part(bitmap, rect, rect2)
    # ··············································
    # Corner Top Left
    rect = src_rects[:top_left]
    x = 0
    y = 0
    draw_window_part_corner(bitmap, x, y, rect, transparent)
    # ··············································
    # Corner Top Right
    rect = src_rects[:top_right]
    x = @window.width - rect.width
    y = 0
    draw_window_part_corner(bitmap, x, y, rect, transparent)
    # ··············································
    # Corner Bottom Left
    rect = src_rects[:bottom_left]
    x = 0
    y = @window.height - rect.height
    draw_window_part_corner(bitmap, x, y, rect, transparent)
    # ··············································
    # Corner Bottom Right
    rect = src_rects[:bottom_right]
    x = @window.width - rect.width
    y = @window.height - rect.height
    draw_window_part_corner(bitmap, x, y, rect, transparent)
    # ··············································
    @window.z = 10000000
    # ··············································
   
    x = @window.x - @window.ox + src_rects[:top_left].width
    y = @window.y - @window.oy + src_rects[:top_left].height
    @viewport = Viewport.new(x, y, w, h)
    @viewport.z = 1000
   
    @contents = Sprite.new(@viewport)
    @bar_background = Sprite.new(@viewport)
    @bar_top = Sprite.new(@viewport)
    @selector = Sprite.new(@viewport)
   
    @contents.z = 100
    @selector.z = 150
    @bar_background.z = 200
    @bar_top.z = 250
   
    @arrow_top = Sprite.new
    rect = src_rects[:arrow_top]
    @arrow_top.bitmap = Bitmap.new(rect.width, rect.height)
    @arrow_top.bitmap.blt(0, 0, bitmap, rect)
    @arrow_bottom = Sprite.new
    rect = src_rects[:arrow_bottom]
    @arrow_bottom.bitmap = Bitmap.new(rect.width, rect.height)
    @arrow_bottom.bitmap.blt(0, 0, bitmap, rect)
    @arrow_top.z = 10000050
    @arrow_bottom.z = 10000050
   
    @window.visible         =         @contents.visible   =
    @bar_background.visible   =         @bar_top.visible    = false
   
    @window.opacity         =         @contents.opacity   =
    @bar_background.opacity   =         @bar_top.opacity    =
    @window.zoom_x            =         @contents.zoom_x    =
    @bar_background.zoom_x    =         @bar_top.zoom_x   =
    @window.zoom_y            =         @contents.zoom_y    =
    @bar_background.zoom_y    =         @bar_top.zoom_y   = 0

    @selector.visible = @arrow_top.visible = @arrow_bottom.visible = false
end
#-----------------------------------------------------------------------------
def draw_window_part(bitmap, rect1, rect2)
    if @@config[:stretch_background] == true
      @window.bitmap.stretch_blt(rect2, bitmap, rect1)
    else
      w1 = rect1.width
      h1 = rect1.height
      w2 = rect2.width
      h2 = rect2.height
      mx = [(w2 / w1.to_f).ceil, 1].max
      my = [(h2 / h1.to_f).ceil, 1].max
      for i in 0...mx
      for j in 0...my
          x = rect2.x + i*w1
          y = rect2.y + j*h1
          @window.bitmap.blt(x, y, bitmap, rect1)
      end
      end
    end
end
#-----------------------------------------------------------------------------
def draw_window_part_corner(bitmap, x, y, rect, fill_color)
    @window.bitmap.fill_rect(x, y, rect.width, rect.height, fill_color)
    @window.bitmap.blt(x, y, bitmap, rect)
end
#-----------------------------------------------------------------------------
def get_rects
    rects = {
      :top_left         => Rect.new(0,0,8,8),
      :top            => Rect.new(8,0,8,8),
      :top_right      => Rect.new(16,0,8,8),
      :bottom_left      => Rect.new(0,16,8,8),
      :bottom         => Rect.new(8,16,8,8),
      :bottom_right   => Rect.new(16,16,8,8),
      :left             => Rect.new(0,8,8,8),
      :right            => Rect.new(16,8,8,8),
      :center         => Rect.new(8,8,8,8),
      :arrow_top      => Rect.new(24,0,8,4),
      :arrow_bottom   => Rect.new(24,4,8,4),
      :bar_background   => Rect.new(24,16,8,8),
      :bar_topA         => Rect.new(24,8,8,3),
      :bar_topB         => Rect.new(24,11,8,2),
      :bar_topC         => Rect.new(24,13,8,3)
    }
    rects
end
#-----------------------------------------------------------------------------
def draw_displacement_bar(id)
    if @@config[:show_displacement_bar]
      bitmap = Cache.picture(@@config[:window_pattern])
      src_rects = get_rects
      case id
      when :background
      # Draw background
      unless @bar_background.bitmap.nil?
          @bar_background.bitmap.dispose
      end
      viewport = @viewport
      rect = src_rects[:bar_background]
      rect2 = Rect.new(0, 0, rect.width, viewport.rect.height)
      @bar_background.bitmap = Bitmap.new(rect2.width, rect2.height)
      ox = @bar_background.width / 2
      oy = @bar_background.height / 2
      @bar_background.ox = ox
      @bar_background.oy = oy
      @bar_background.bitmap.stretch_blt(rect2, bitmap, rect)
      @bar_background.x = viewport.rect.width - @bar_background.width + ox
      @bar_background.y = oy
      when :top
      # draw top
      unless @bar_top.bitmap.nil?
          @bar_top.bitmap.dispose
      end
      min_height = 25
      max_height = @contents.viewport.rect.height
      rows = max_height / @h
      extra_rows = @real_data.size - rows
      bar_height = (extra_rows <= 0) ? max_height :
          [.max, max_height].min
         
      if rows == @real_data.size-1 && bar_height == max_height
          bar_height = max_height * 0.9
      end
      
      @bar_top.bitmap = Bitmap.new(@bar_background.width, bar_height)
      
      rect1 = src_rects[:bar_topA]
      rect2 = Rect.new(0, 0, @bar_top.width, 3)
      @bar_top.bitmap.stretch_blt(rect2, bitmap, rect1)
      
      rect1 = src_rects[:bar_topB]
      rect2 = Rect.new(0, 3, @bar_top.width, bar_height - 6)
      @bar_top.bitmap.stretch_blt(rect2, bitmap, rect1)
      
      rect1 = src_rects[:bar_topC]
      rect2 = Rect.new(0, @bar_top.height - 3, @bar_top.width, 3)
      @bar_top.bitmap.fill_rect(rect2, Color.new(0,0,0,0))
      @bar_top.bitmap.stretch_blt(rect2, bitmap, rect1)
      
      @bar_top.ox, @bar_top.oy = @bar_top.width/2, @bar_top.height/2
      @bar_top.x = @bar_background.x
      @bar_top.y = @bar_background.y - @bar_background.oy + @bar_top.oy
      
      if @contents.height > @contents.viewport.rect.height
          h = extra_rows * @h.to_f
          h2 = (max_height - @bar_top.height)
          @bar_displacement = h2 / h
          @show_displacement_bar = true
      else
          @bar_displacement = 0
          @show_displacement_bar = false
      end
      end
    end
end
#-----------------------------------------------------------------------------
def draw_contents(initial=false)
   
    data = []
    if initial
      @data.each{|d1|
      unless d1.nil?
          d1.each{|d2|
            unless d2.nil?
            data << d2
            end
          }
      end
      }
    else
      data = @real_data
    end
    b = Bitmap.new(1,1)
    font = Font.new
    font.name = @@config[:font][:name]
    font.size = @@config[:font][:size]
    font.outline = @@config[:font][:outline]
    font.color = @@config[:font][:color]
    font.out_color = @@config[:font][:out_color]
    b.font = font
    size = b.text_size("O")
    h = size.height * data.size
    w = @contents.viewport.rect.width
    if @show_displacement_bar == true || h > @contents.viewport.rect.height
      w -= @bar_background.width
    end
    if initial
      unless @contents.bitmap.nil?
      @contents.bitmap.dispose
      end
      @contents.bitmap = Bitmap.new(w, h)
      @contents.bitmap.font = font
      @h = size.height
    end
    iniData = @contents.viewport.oy / @h
    endData = .min
    for i in iniData..endData
      next unless @drawed.nil?
      d = data
      break if d.nil?
      tw = @contents.bitmap.font.size
      y = i * @h
      mod = 0
      if d == @current_map && @@config[:disable_last_teleport] == true
      b2 = Cache.picture(@@config[:cursor3])
      ratio = b2.height / @h.to_f
      nw = [(b2.width * ratio).to_i,   1].max
      nh = [(b2.height * ratio).to_i,1].max
      rect = Rect.new(w-nw, y, nw, nh)
      @contents.bitmap.stretch_blt(rect, b2, b2.rect)
      mod = rect.width
      end
      while @contents.bitmap.text_size(d.map_name).width - mod > w &&
      @contents.bitmap.font.size > 4
      @contents.bitmap.font.size -= 1
      end
      @contents.bitmap.font.color = (d == @current_map &&
      @@config[:disable_last_teleport] == true) ?
      @@config[:font][:current_map_color] : @@config[:font][:color]
      @contents.bitmap.draw_text(0, y, w, size.height, d.map_name)
      @contents.bitmap.font.size = tw
   
      @drawed = true
    end
    ox = @contents.width / 2
    oy = @contents.height / 2
    @contents.ox = ox
    @contents.oy = oy
    @contents.x = ox
    @contents.y = oy
   
    if initial
      unless @selector.bitmap.nil?
      @selector.bitmap.dispose
      end
      @selector.bitmap = Bitmap.new(w, @h)
      bitmap = Cache.picture(@@config[:cursor2])
      @selector.bitmap.stretch_blt(@selector.bitmap.rect, bitmap, bitmap.rect)
      @selector.y = 0
      @selector.visible = true
      @selector.opacity = 0
      @real_data = data
    end
end
#-----------------------------------------------------------------------------
def add_map(map_id, ref=nil, name=nil, x=nil, y=nil, direction=nil)
    if !FileTest.exist?(sprintf("Data/Map%03d.rvdata2", map_id))
      return
    end
    x = x.nil? ? $game_player.x : x.to_i rescue 0
    y = y.nil? ? $game_player.y : y.to_i rescue 0
    direction = direction.nil? ? $game_player.direction : direction.to_i rescue 0
    name = name.nil? ? $data_mapinfos.name : name.to_s
    if @data.nil?
      @data ||= []
      data            = Data.new
      data.x          = x
      data.y          = y
      data.direction= direction
      data.map_name   = name
      data.map_id   = map_id
      data.ref = ref
      @data << data
      @current_map = data
    else
      add = true
      @data.each{|data|
      if data.ref == ref
          add = false
          break
      end
      }
      if add
      data            = Data.new
      data.x          = x
      data.y          = y
      data.direction= direction
      data.map_name   = name
      data.map_id   = map_id
      data.ref = ref
      @data << data
      @current_map = data
      end
    end
end
#-----------------------------------------------------------------------------
def update_map_info(map_id, attr, value, ref=nil)
    unless @data.nil?
      data = nil
      @data.each{|data2|
      next if data2.nil? || data2.ref != ref
      data = data2
      break
      }
      unless data.nil?
      begin
          eval("data.#{attr} = value")
      rescue
      end
      end
    end
end
#-----------------------------------------------------------------------------
def show_window(x=0, y=0)
    if @window.disposed?
      dispose
      create_cursor
      create_window
    end
    @drawed.clear
    draw_displacement_bar(:background)
    draw_contents(true)
    draw_displacement_bar(:top)
    fix_position(x, y)
    mod = @@config[:animation_suavize]
    opacity = 255.0 / mod
    zoom = 1.0 / mod
    @viewport.ox = @viewport.oy = @index = 0
    update_index(0)
    data1 = [@cursor, @selector, @arrow_top, @arrow_bottom]
    data2 = [@window, @contents, @bar_background, @bar_top]
    data2.each{|s| s.visible = true}
    if !@show_displacement_bar
      @bar_background.visible = @bar_top.visible = false
    end
    while mod > 0
      data2.each{|s|
      s.opacity += opacity
      s.zoom_x += zoom
      s.zoom_y += zoom
      }
      Graphics.update
      mod -= 1
    end
    data1.each{|s|
      s.visible = true
      s.opacity = 255
    }
    update_pos_cursor
    @index = 0
    @cursor_animation_index = 0
    main
end
#-----------------------------------------------------------------------------
def fix_position(x, y)
    ox, oy, w, h = @window.ox, @window.oy, @window.width, @window.height
    smx, smy = Graphics.width / 2, Graphics.height / 2
    margin = @@config[:screen_margin]
    case @@config[:window_position]
    when :top_left
      @window.x = margin + ox
      @window.y = margin + oy
    when :top
      @window.x = smx - w/2 + ox
      @window.y = margin + oy
    when :top_right
      @window.x = Graphics.width - margin - w + ox
      @window.y = margin + @window.oy
    when :left
      @window.x = margin + ox
      @window.y = smy - h/2 + oy
    when :screen_center
      @window.x = smx - w/2 + ox
      @window.y = smy - h/2 + oy
    when :right
      @window.x = Graphics.width - margin - w + ox
      @window.y = smy - h/2 + oy
    when :bottom_left
      @window.x = margin + ox
      @window.y = Graphics.height - margin - h + oy
    when :bottom
      @window.x = smx - w/2 + ox
      @window.y = Graphics.height - margin - h + oy
    when :bottom_right
      @window.x = Graphics.width - margin - w + ox
      @window.y = Graphics.height - margin - h + oy
    when :center_top
      @window.x = x
      @window.y = y - h + oy - 32
    when :center_bottom
      @window.x = x
      @window.y = y + oy
    when :center_left
      @window.x = x - w + ox - 16
      @window.y = y - 13
    when :center_right
      @window.x = x + ox + 16
      @window.y = y - 13
    when Point
      @window.x = @@config[:window_position].x + ox
      @window.y = @@config[:window_position].y + oy
    else
      @window.x = x + 16
      @window.y = y - 13
    end
    if @window.x - ox < @@config[:screen_margin]
      @window.x = @@config[:screen_margin] + ox
    end
    if @window.y - oy < @@config[:screen_margin]
      @window.y = @@config[:screen_margin] + oy
    end
    if @window.x + ox > Graphics.width - @@config[:screen_margin]
      @window.x = Graphics.width - @@config[:screen_margin] - w + ox
    end
    if @window.y + oy > Graphics.height - @@config[:screen_margin]
      @window.y = Graphics.height - @@config[:screen_margin] - h + oy
    end
    src_rects = get_rects
    x = @window.x - @window.ox + src_rects[:top_left].width
    y = @window.y - @window.oy + src_rects[:top_left].height
    @viewport.rect.x = x
    @viewport.rect.y = y
    x = @window.x - @window.ox
    y = @window.y - @window.oy
    @arrow_top.x = (x + @window.width / 2) - (@arrow_top.width / 2)
    @arrow_top.y = y + (@arrow_top.height / 2)
    @arrow_bottom.x = (x + @window.width / 2) - (@arrow_bottom.width / 2)
    @arrow_bottom.y = y + @window.height - (@arrow_top.height / 2)
end
#-----------------------------------------------------------------------------
def hide(skip_animation=false)
    mod = @@config[:animation_suavize]
    opacity = 255.0 / mod
    zoom = 1.0 / mod
    data1 = [@cursor, @selector, @arrow_top, @arrow_bottom]
    data2 = [@window, @contents, @bar_background, @bar_top]
    while mod > 0 && !skip_animation
      data1.each{|s| s.opacity -= opacity}
      data2.each{|s|
      s.opacity -= opacity
      s.zoom_x -= zoom
      s.zoom_y -= zoom
      }
      Graphics.update
      mod -= 1
    end
    data1.each{|s|
      s.visible = false
      s.opacity = 0
    }
    data2.each{|s|
      s.visible = false
      s.opacity = s.zoom_x = s.zoom_y = 0
    }
    @exit = true
end
#-----------------------------------------------------------------------------
def main
    @exit = false
    @action = false
    while !@exit
      Graphics.update
      Input.update
      update
      update_cursor_animation
      update_arrows_animation
      break if @exit
    end
    if @action
      if @@config[:pospone_teleport] == true
      id = [[@@config[:activate_switch].to_i, 1].max, 9999].min
      $game_switches = true
      else
      perform_teleport
      end
    end
end
#-----------------------------------------------------------------------------
def perform_teleport
    $game_map.interpreter.clear
    play_fx(:decision_se)
    play_fx(:teleport_se)
    SceneManager.scene.pre_transfer
    data = @real_data[@index]
    $game_player.reserve_transfer(data.map_id, data.x, data.y, data.direction)
    $game_player.perform_transfer
    $game_map.update
    SceneManager.scene.post_transfer
    if @@config[:pospone_teleport] == true
      id = [[@@config[:activate_switch].to_i, 1].max, 9999].min
      $game_switches = false
    end
end
#-----------------------------------------------------------------------------
def update
    if Input.repeat?(Input::DOWN)
      update_index(1)
    elsif Input.repeat?(Input::UP)
      update_index(-1)
    end
    if Input.repeat?(Input::LEFT) || Input.repeat?(Input::L)
      update_index(-(@contents.viewport.rect.height / @h))
    elsif Input.repeat?(Input::RIGHT) || Input.repeat?(Input::R)
      update_index(@contents.viewport.rect.height / @h)
    end
    if Input.trigger?(Input::B)
      play_fx(:cancel_se)
      hide
    end
    if Input.trigger?(Input::C)
      if @real_data[@index] == @current_map &&
      @@config[:disable_last_teleport] == true
      cancel_action
      return
      end
      hide(true)
      @action = true
      @current_map = @real_data[@index]
    end
end
#-----------------------------------------------------------------------------
def cancel_action
    play_fx(:buzzer_se)
end
#-----------------------------------------------------------------------------
def play_fx(id)
    begin
      data = @@config
      Audio.se_play("Audio/SE/#{data[:name]}",
      data [:volume].to_i, data[:pitch].to_i)
    rescue
    end
end
#-----------------------------------------------------------------------------
def update_index(n)
    last_index = @index
    @index += n
    if @index < 0
      @index = @real_data.size - 1
    elsif @index > @real_data.size - 1
      @index = 0
    end
    @selector.y = @h * @index
    if @selector.y - @viewport.oy < 0
      n = -(@selector.y - @viewport.oy)
      @viewport.oy -= n
      @bar_background.y -= n
    elsif @selector.y + @selector.height - @viewport.oy > @viewport.rect.height
      n = (@selector.y + @selector.height - @viewport.oy) - @viewport.rect.height
      @viewport.oy += n
      @bar_background.y += n
    end
    if last_index != @index
      play_fx(:cursor_se)
      draw_contents
      if @bar_displacement != 0
      @bar_top.y = @bar_background.y - @bar_background.oy + @bar_top.oy +
          @bar_displacement * @contents.viewport.oy
      end
      if @index == @real_data.size - 1
      @bar_top.y = @bar_background.y - @bar_background.oy +
          @bar_background.height + @bar_top.oy - @bar_top.height
      end
    end
    update_pos_cursor
end
#-----------------------------------------------------------------------------
def update_pos_cursor
    @cursor.x = @viewport.rect.x - @cursor.width
    @cursor.y = @selector.y + @selector.height / 2 - @cursor.height / 2 -
      @viewport.oy + @viewport.rect.y
    @cursor_animation_index = 0
end
#-----------------------------------------------------------------------------
def update_cursor_animation
    @cursor.x += @cursor_animation[@cursor_animation_index]
    @cursor_animation_index += 1
    if @cursor_animation_index > @cursor_animation.size - 1
      @cursor_animation_index = 0
    end
end
#-----------------------------------------------------------------------------
def update_arrows_animation
    v = @contents.viewport
    @arrow_top.visible = (v.oy != 0)
    @arrow_bottom.visible = (@contents.height - v.oy > v.rect.height)
    @arrow_top.y    += @arrows_animation[@arrows_animation_index]
    @arrow_bottom.y -= @arrows_animation[@arrows_animation_index]
    @arrows_animation_index += 1
    if @arrows_animation_index > @arrows_animation.size - 1
      @arrows_animation_index = 0
    end
end
#-----------------------------------------------------------------------------
def clear(data=nil)
    @data.clear
    unless data.nil?
      @data = data
      unless @data[$game_map.map_id].nil?
      @current_map = @data[$game_map.map_id]
      else
      @current_map = nil
      end
    end
end
#-----------------------------------------------------------------------------
def dispose
    instance_variables.each{|var|
      if var.respond_to?(:dispose)
      var.dispose rescue next
      end
    }
end
#-----------------------------------------------------------------------------
end
#===============================================================================

#===============================================================================
class Game_Map
#-----------------------------------------------------------------------------
unless method_defined?(:setup_teleport_newold)
    alias setup_teleport_newold setup
end
#-----------------------------------------------------------------------------
def setup(map_id)
    setup_teleport_newold(map_id)
    add_to_teleport_list = true
    no_add_text = "noAddToTeleportList".downcase
    @map.events.each do |i, event|
      if event.name.downcase == no_add_text
      add_to_teleport_list = false
      break
      end
    end
    if add_to_teleport_list
      $TeleportToVisited.add_map(map_id)
    end
end
#-----------------------------------------------------------------------------
end
#===============================================================================

#===============================================================================
class Game_Player < Game_Character
#-----------------------------------------------------------------------------
unless method_defined?(:moveto_teleport_newold)
    alias moveto_teleport_newold moveto
end
#-----------------------------------------------------------------------------
def moveto(x, y)
    if (x < 0 || x > $game_map.width - 1)
      @new_x = 0
      x = 0
    end
    if (y < 0 || y > $game_map.height - 1)
      @new_y = 0
      y = 0
    end
    moveto_teleport_newold(x, y)
    map_id = $game_map.map_id
    $TeleportToVisited.update_map_info(map_id, :x, x)
    $TeleportToVisited.update_map_info(map_id, :y, y)
    $TeleportToVisited.update_map_info(map_id, :direction, self.direction)
end
#-----------------------------------------------------------------------------
end
#===============================================================================

#===============================================================================
module DataManager
#=============================================================================
class << self
    #---------------------------------------------------------------------------
    unless method_defined?(:setup_new_game_teleport_newold)
      alias setup_new_game_teleport_newold setup_new_game
    end
    def setup_new_game
      $TeleportToVisited.clear
      setup_new_game_teleport_newold
    end
    #---------------------------------------------------------------------------
    unless method_defined?(:load_game_without_rescue_teleport_newold)
      alias load_game_without_rescue_teleport_newold load_game_without_rescue
    end
    def load_game_without_rescue(index)
      $TeleportToVisited.clear
      load_game_without_rescue_teleport_newold(index)
    end
    #---------------------------------------------------------------------------
    unless method_defined?(:make_save_contents_teleport_newold)
      alias make_save_contents_teleport_newold make_save_contents
    end
    def make_save_contents
      contents = make_save_contents_teleport_newold
      contents[:teleportToVisited] = $TeleportToVisited.data.dup
      return contents
    end
    #---------------------------------------------------------------------------
    unless method_defined?(:extract_save_contents_teleport_newold)
      alias extract_save_contents_teleport_newold extract_save_contents
    end
    def extract_save_contents(contents)
      extract_save_contents_teleport_newold(contents)
      $TeleportToVisited.clear(contents[:teleportToVisited])
    end
    #---------------------------------------------------------------------------
end
#============================================================================
end
#===============================================================================

#===============================================================================
class Game_Interpreter
#-----------------------------------------------------------------------------
def open_teleport
    x = $game_map.events[@event_id].screen_x
    y = $game_map.events[@event_id].screen_y
    $TeleportToVisited.show_window(x, y)
end
#-----------------------------------------------------------------------------
def perform_teleport
    $TeleportToVisited.perform_teleport
end
#-----------------------------------------------------------------------------
def update_map_info(map_id, attr, value, ref=nil)
    $TeleportToVisited.update_map_info(map_id, attr, value, ref)
end
#-----------------------------------------------------------------------------
def add_map(ref=nil, name="", map_id=nil, x=nil, y=nil, direction=nil)
    map_id = map_id.nil? ? $game_map.map_id : map_id.to_i
    direction = (.include?(direction)) ? direction : 2
    $TeleportToVisited.add_map(map_id, ref, name, x, y, direction)
end
#-----------------------------------------------------------------------------
def run
    begin
      wait_for_message
      while @list[@index] do
      execute_command
      @index += 1
      end
    rescue
      return
    end
    Fiber.yield
    @fiber = nil
end
#-----------------------------------------------------------------------------
end
#===============================================================================

$TeleportToVisited = TeleportToVisited.new




本贴来自国际rpgmaker官方论坛作者:newold处,因国际论坛即将永久关站,为了存档多年珍贵资料,署名转载到本论坛存档,由于官方帖子为英文原帖,需要中文翻译请点击论坛顶部切换语言为中文就可以将帖子翻译成中文浏览,方便大家随时查看,原文地址:https://forums.rpgmakerweb.com/threads/teleport-to-visited-sites.104205/
页: [1]
查看完整版本: Teleport to Visited sites