累计送礼: 0 个 累计收礼: 1 个 TA的每日心情 开心 2026-7-12 04:10
签到天数: 209 天
连续签到: 2 天
[LV.7]常住居民III
管理员
VIP
7
卡币
58883
OK点
16
推广点
0
同能卷
50
积分 68848
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_height / extra_rows, min_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 = [iniData + @contents.viewport.rect.height / @h, data.size].min for i in iniData..endData next unless @drawed[i].nil? d = data[i] 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[i] = 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[map_id].name : name.to_s if @data[map_id].nil? @data[map_id] ||= [] 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[map_id] << data @current_map = data else add = true @data[map_id].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[map_id] << data @current_map = data end end end #----------------------------------------------------------------------------- def update_map_info(map_id, attr, value, ref=nil) unless @data[map_id].nil? data = nil @data[map_id].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[id] = 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[id] = 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[id] 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][0] 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 = ([nil, 2, 4, 6, 8].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/
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有账号?立即注册
x