Код:
	# Event shifts script VX ACE
# автор: caveman
# версия 1.1
#
# Скрипт позволяет:
# - задавать сдвиги в px для отрисовки спрайта события
# - задавать сдвиг по высоте z для определения, что будет отрисовано
#   сверху при наложении спрайтов событий
#
# Просто напишите в комменте события нечто вроде
# [es|-16|16|1]
# для сдвига картинки события влево на 16 пикселей и вниз на 16, и 
# сдвига 1 по оси z (даже +1 по z хватит, чтобы перекрыть события
# без этого сдвига.
#
#
# BIG events script VX ACE
# автор: caveman
# версия 1.1
# Скрипт позволяет задать ограничивающий прямоугольник вокруг события
# Он корректно подсчитывает коллизии, с учетом поворотов и движений
# 
# Можно пользовать скрипт для больших монстров или линий-телепортов на 
# другую карту
#
# Просто напишите в комменте события нечто вроде
# [bbox|1|1|2|0] (влево, вправо, вверх, вниз)
#
#
# MultiGraphic script VX ACE
# автор: caveman
# версия 1.2
#
# Скрипт позволяет:
# - комментарием навершивать сверху на событие графику из любого
# доступного тайлсета, потенциально сколько угодно слоев
# - делать то же самое из чарсета, с возможностью stop анимации
# - задавать сдвиги этой графике, аналогично скрипту Event shifts
#   сверху при наложении спрайтов событий
# - проставлять событиям свойство counter
#
# Просто напишите в комменте события нечто вроде
# [dop|Inside_C|t|1|3|8|-16|1]
# на событие сверху наложится графика из тайлсета Inside_C в позиции
# 1, 3 (отсчет по 32 пикселя тайл, от нуля сверху слева)
# со сдвигом картинки вправо на 8 пикселей и вверх на 16, и 
# сдвига 1 по оси z
#
# Режимы доп графики - это второй параметр
#   t - тайлсет
#   с - чарсет (мелкий, 3 на 4)
#   a - анимация stop из чарсета (мелкий, 3 на 4). Скорость анимации зависит
# от заданной frequency события
# 
# дополнительный тег <counter> в комментарии события позволяет взаимодействовать с другим событием
# через это (работает как counter в тайлсете)
# 
# Event features script
# автор: caveman
# версия 1.0
#
# Скрипт позволяет:
# - комментарием поворачивать или зумить графику события
# - задавать вращение событию, регулируя скорость в комменте
#
# Просто напишите в комменте события нечто вроде
# 1) [rot|10|0]
# графика события повернется по часовой стрелке на 10 градусов
# 2) [rot|0|5]
# графика события будет вращаться по часовой стрелке со скоростью 5 градусов за фрейм
# (важно: первый и второй параметры исключают друг друга)
# 3) [zoom|50|50]
# графика события будет сжата по х и у в 2 раза (значение - это проценты) 
class Dop_Graphic
  attr_accessor :xs # сдвиг по х
  attr_accessor :ys # сдвиг по y
  attr_accessor :zs # сдвиг по z
  attr_accessor :rangle # угол поворота
  
  attr_accessor :tile_x  # x в тайлсете (В-Е)
  attr_accessor :tile_y  # y в тайлсете (В-Е)
  attr_accessor :tileset # тайлсет (В-Е)
  attr_accessor :mode # 0-тайлсет, 1-чарсет, 2-анимация чарсета
  
  def initialize(tileset, mode, tile_x, tile_y, xs, ys, zs)
    self.tileset=tileset
    self.mode=mode
    self.tile_x=tile_x
    self.tile_y=tile_y
    self.xs=xs
    self.ys=ys
    self.zs=zs
    self.rangle = 0
  end
end
class Sprite_Dop < Sprite_Base
  attr_accessor :character
  attr_accessor :dop
  
  def initialize(viewport, character, dop)
    super(viewport)
    self.character = character
    self.dop = dop
    @cur_x = self.dop.tile_x if self.dop.mode > 0
    @ani_count = 0
  end
 
  #--------------------------------------------------------------------------
  # * Frame Update
  #--------------------------------------------------------------------------
  def update
    super
    update_bitmap
    update_ani
    update_src_rect
    update_position
    update_other
  end
  
  #--------------------------------------------------------------------------
  # * Update Transfer Origin Bitmap
  #--------------------------------------------------------------------------
  def update_bitmap
    if self.dop.mode == 0
      set_tile_bitmap
    else
      set_character_bitmap
    end
  end
  #--------------------------------------------------------------------------
  # * Set Tile Bitmap
  #--------------------------------------------------------------------------
  def set_tile_bitmap
    sx = self.dop.tile_x * 32;
    sy = self.dop.tile_y * 32;
    self.bitmap =  Cache.tileset(self.dop.tileset)
    self.src_rect.set(sx, sy, 32, 32)
    self.ox = 16
    self.oy = 32
  end
  
  #--------------------------------------------------------------------------
  # * Set Character Bitmap
  #--------------------------------------------------------------------------
  def set_character_bitmap
    self.bitmap = Cache.character(self.dop.tileset)
    @cw = bitmap.width / 3
    @ch = bitmap.height / 4
    self.ox = @cw / 2
    self.oy = @ch
  end
  
  #--------------------------------------------------------------------------
  # * Update Position
  #--------------------------------------------------------------------------
  def update_position
    self.x = @character.screen_x + dop.xs
    self.y = @character.screen_y + dop.ys
    self.z = @character.screen_z + dop.zs
    self.angle = dop.rangle
  end
  
  def update_ani
    if self.dop.mode == 2
      @ani_count += 1
      if @ani_count > 18 - character.move_frequency * 2
        @ani_count = 0
        @cur_x += 1
        @cur_x = 0 if @cur_x > 2
      end
    end
  end
  
  def update_src_rect
    if self.dop.mode > 0
      sx = @cur_x * @cw;
      sy = self.dop.tile_y * @ch;
      self.src_rect.set(sx, sy, @cw, @ch)
    end
  end
  
  #--------------------------------------------------------------------------
  # * Update Other
  #--------------------------------------------------------------------------
  def update_other
    self.opacity = @character.opacity
    self.blend_type = @character.blend_type
    self.bush_depth = @character.bush_depth
    self.visible = !@character.transparent
  end
end
class Game_CharacterBase
  attr_accessor :xs # сдвиг по х
  attr_accessor :ys # сдвиг по y
  attr_accessor :zs # сдвиг по z
  attr_accessor :x_sub # shift to left
  attr_accessor :x_add # shift to right
  attr_accessor :y_sub # shift to up
  attr_accessor :y_add # shift to down
  
  attr_accessor :rangle # rotate angle
  attr_accessor :rotate_speed # rotate speed
  
  attr_accessor :zoom_x  # zoom (percents from 100)
  attr_accessor :zoom_y  # zoom (percents from 100)
  
  attr_accessor :dop_graphic # доп графика события
  
  attr_accessor :counter # событие работает как counter тайл
  
  alias es_initialize initialize
  def initialize
    clear_dops
    es_initialize
  end
  
  def clear_dops
    self.xs=0
    self.ys=0
    self.zs=0
    self.x_sub=0
    self.x_add=0
    self.y_sub=0
    self.y_add=0
    self.rangle=0
    self.rotate_speed = 0
    self.zoom_x = 100
    self.zoom_y = 100
    self.counter = false
    self.dop_graphic = []
  end
 
  def setup_shifts(dispose)
    clear_dops
    unless dispose && @list.nil?
      for command in @list
        if command.code == 108 && command.parameters[0].include?("[es")
          command.parameters[0].gsub(/\[[Ee][Ss]\|(.+?)\|(.+?)\|(.+?)\]/) do
            self.xs = $1.to_s.to_i
            self.ys = $2.to_s.to_i
            self.zs = $3.to_s.to_i
          end
        end
        if command.code == 108 && command.parameters[0].include?("[bbox")
          command.parameters[0].gsub(/\[[Bb][Bb][Oo][Xx]\|(.+?)\|(.+?)\|(.+?)\|(.+?)\]/) do
            self.x_sub = $1.to_s.to_i
            self.x_add = $2.to_s.to_i
            self.y_sub = $3.to_s.to_i
            self.y_add = $4.to_s.to_i
          end
        end
        if command.code == 108 && command.parameters[0].include?("[rot")
          command.parameters[0].gsub(/\[[Rr][Oo][Tt]\|(.+?)\|(.+?)\]/) do
            self.rangle = $1.to_s.to_i
            self.rotate_speed = $2.to_s.to_i
          end
        end
        if command.code == 108 && command.parameters[0].include?("[zoom")
          command.parameters[0].gsub(/\[[Zz][Oo][Oo][Mm]\|(.+?)\|(.+?)\]/) do
            self.zoom_x = $1.to_s.to_i
            self.zoom_y = $2.to_s.to_i
          end
        end
        if command.code == 108 && command.parameters[0].include?("[dop")
          command.parameters[0].gsub(/\[[Dd][Oo][Pp]\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\|(.+?)\]/) do
            mode = 0  
            mode = 0 if $2.to_s == "t"
            mode = 1 if $2.to_s == "c"
            mode = 2 if $2.to_s == "a"
            dop = Dop_Graphic.new($1.to_s, mode, $3.to_s.to_i, $4.to_s.to_i, 
              $5.to_s.to_i, $6.to_s.to_i, $7.to_s.to_i)
            self.dop_graphic.push(dop)
          end
        end
        if command.code == 108 && command.parameters[0] == "<counter>"
          self.counter = true
        end
      end
    end
  end
  
  # Столкновения для BigEvent
  def pos?(x, y)
    case @direction
    when 2
      x_s = x_sub
      x_a = x_add
      y_s = y_sub
      y_a = y_add
    when 4
      x_s = y_add
      x_a = y_sub
      y_s = x_sub
      y_a = x_add
    when 6
      x_s = y_sub
      x_a = y_add
      y_s = x_add
      y_a = x_sub
    when 8
      x_s = x_add
      x_a = x_sub
      y_s = y_add
      y_a = y_sub
    end
    
    for i in @x - x_s..@x + x_a
      for j in @y - y_s..@y + y_a
        if x == i && y == j
          return true
        end
      end
    end
    return false
  end
  
  def collide_with_events?(x, y)
    $game_map.events_xy_nt(x, y).any? do |event|
      event.id != @id && (event.normal_priority? || self.is_a?(Game_Event))
    end
  end
end
 
class Game_Event
  alias es_refresh refresh
  def refresh
    es_refresh
    setup_shifts(@page.nil?)
    #SceneManager.scene.update_dop(id) if SceneManager.scene_is?(Scene_Map)
  end
end
class Sprite_Character
  def update_position
    move_animation(@character.screen_x + @character.xs - x, 
      @character.screen_y + @character.ys - y)
    self.x = @character.screen_x + @character.xs
    self.y = @character.screen_y + @character.ys
    self.z = @character.screen_z + @character.zs
    rotate_update
    zoom_update
  end
  
  def rotate_update
    if @character.rotate_speed == 0
      self.angle = @character.rangle
    else
      self.ox = self.src_rect.width/2 if self.ox != self.src_rect.width/2
      self.oy = self.src_rect.height/2 if self.oy != self.src_rect.height/2
      self.angle += @character.rotate_speed
    end
  end
  
  def zoom_update
    self.zoom_y = @character.zoom_y / 100.0 if  @character.zoom_y != 100
    self.zoom_x = @character.zoom_x / 100.0 if  @character.zoom_x != 100
  end
end
class Spriteset_Map
  def create_characters
    @character_sprites = []
    $game_map.events.values.each do |event|
      @character_sprites.push(Sprite_Character.new(@viewport1, event))
    end
    create_dop
    
    $game_map.vehicles.each do |vehicle|
      @character_sprites.push(Sprite_Character.new(@viewport1, vehicle))
    end
    $game_player.followers.reverse_each do |follower|
      @character_sprites.push(Sprite_Character.new(@viewport1, follower))
    end
    @character_sprites.push(Sprite_Character.new(@viewport1, $game_player))
    @map_id = $game_map.map_id
    @init = true
  end
  
  def create_dop
    @dop_sprites = []
    $game_map.events.values.each do |event|
      event.dop_graphic.each do |dop|
        @dop_sprites.push(Sprite_Dop.new(@viewport1, event, dop))
      end  
    end
  end
  
  def clear_dop(event_id)
    return if @dop_sprites == nil 
    p @dop_sprites.length
    @dop_sprites.each do |dop|
      next if dop.character.id != event_id
      p 'aaaaaa'
      dop.dispose
      @dop_sprites.delete(dop)  
    end
    p @dop_sprites.length
  end
  
  def add_dop(event_id)
    @dop_sprites = [] if @dop_sprites == nil
    
    $game_map.events.values.each do |event|
      next if event.id != event_id
      if event.dop_graphic != nil && event.dop_graphic.length > 0
        event.dop_graphic.each do |dop|
          @dop_sprites.push(Sprite_Dop.new(@viewport1, event, dop))
        end
      end
    end  
  end
  
  def dispose_characters
    @character_sprites.each {|sprite| sprite.dispose }
    @dop_sprites.each {|sprite| sprite.dispose }
    @dop_sprites.clear 
    @dop_sprites = nil
  end
  
  def update_characters
    if (@flag == nil || @flag)
      refresh_characters if @map_id != $game_map.map_id
      @character_sprites.each {|sprite| sprite.update }
      @dop_sprites.each {|sprite| sprite.update }
    end
  end
  
  def set_flag(flag)
    @flag = flag
  end
end
class Scene_Map
  def update_dop(event_id)
    if @spriteset != nil
      @spriteset.set_flag(true)
      @spriteset.clear_dop(event_id) 
      @spriteset.add_dop(event_id) 
      @spriteset.set_flag(nil)
      @spriteset.update_characters
    end
  end
end
class Game_Player
  def start_map_event(x, y, triggers, normal)
    return if $game_map.interpreter.running?
    $game_map.events_xy(x, y).each do |event|
      if event.trigger_in?(triggers) && event.normal_priority? == normal && !event.counter
        event.start
      end
    end
  end
end
 
Социальные закладки