RMRK is retiring.
Registration is disabled. The site will remain online, but eventually become a read-only archive. More information.

RMRK.net has nothing to do with Blockchains, Cryptocurrency or NFTs. We have been around since the early 2000s, but there is a new group using the RMRK name that deals with those things. We have nothing to do with them.
NFTs are a scam, and if somebody is trying to persuade you to buy or invest in crypto/blockchain/NFT content, please turn them down and save your money. See this video for more information.
[RESOLVED] Mode7 script error

0 Members and 1 Guest are viewing this topic.

*
Rise From The Ashes!
Rep:
Level 91
"Time to bring the Law!"
Project of the Month winner for September 2009
Hey guys, I am using the Mode7 script with a tactics battle system, which has a working compatability script with it, for one of my projects but everytime something in the tileset has the Terrain tag "1" and above, it gives me this error:

Code: [Select]
---------------------------
Script 'Mode7' line 1263: NoMethodError occurred.

undefined method `opacity_values' for #<Tilemap:0x4159438>


Can anyone help me?

Here is the Mode7 Script:

[code]#============================================================================
# This script adds a kind of depth for the maps.
# Written by MGCaladtogel
# English version (21/05/07)
#----------------------------------------------------------------------------
# Instructions :
# You must add to the map's name :
#- [M7]  : to activate Mode7
#- [#XX] : XX is the slant angle (in degree). Default value is 0 (normal maps)
#- [Y]   : Y-map looping
#- [X]   : X-map looping. This option needs resources (lower fps).
#- [A]   : animated autotiles (with 4 patterns). This option increases
#          significantly the loading time, so it may crash for large maps
#          (SystemStackError)
#- [C]   : to center the map on the hero (even for small maps)
#- [P]   : to have a fixed panorama
#- [H]   : to have a white horizon
#- [OV]  : Overworld Sprite Resize (a Mewsterus's script feature)
#
# OR :
# see the "$mode7_maps_settings" below (l.48) to prapare your settings
#----------------------------------------------------------------------------
# Other commands (for events) :
#- $scene.spriteset.tilemap.mode7_set(new_angle)
#  To redraw the map with the new_angle
#- $scene.spriteset.tilemap.mode7_set_p(new_angle)
#  To redraw progressively the map from the current angle to the new
#- $scene.spriteset.tilemap.mode7_redraw
#  To redraw the map (useful with the following commands)
#- $game_system.map_opacity = value
#  To define the opacity for Mode7 maps (it needs to redraw)
#- $game_system.map_gradual_opacity = value
#  To define a gradual opacity for Mode7 maps (it needs to redraw)
#  (it bugs with horizontal looping)
#- $game_system.map_tone = Color.new(Red, Green, Blue)
#  To define the tone for Mode7 maps (it needs to redraw)
#- $game_system.map_gradual_tone = Tone.new(Red, Green, Blue, Gray)
#  To define a gradual tone for Mode7 maps (it needs to redraw)
#- $game_system.horizon = value
#  To define the view's distance (default : 960) (it needs to redraw)
#- $game_system.reset
#  To initialize the previous options
#
#- To obtain flat events :
# just add a comment in the event's commands list with : "Flat"
#
#- To handle the height of a vertical event :
# add a comment in the event's commands list with : "Heigth X", where X is the
# height value ("Heigth 2" will draw the event 64 pixels above its original
# position - you can use floats)
#============================================================================
# The map is drawn from all the tiles of the three layers that do not have a
# terrain_tag's value of 1 or 2.
# The other tiles (terrain_tag = 1 or 2) form elements that are drawn vertically,
# like the 3rd-layer elements in the old version.
# The 2 terrains ID used to form vertical elements
$terrain_tags_vertical_tiles = [1,2] # You can modify these values
# To access maps names
$data_maps = load_data("Data/MapInfos.rxdata")
$mode7_maps_settings = {}
# Prepare your own settings for mode7 maps
# Just put the first parameter in a map's name
# For example :
$mode7_maps_settings["Worldmap"] = ["#60", "X", "Y", "A", "H", "OV"]
# -> will  be called  when "Worldmap" is included in the name
$mode7_maps_settings["Smallslant"] = ["#20", "A", "S"]
# Add any number of settings you want


#============================================================================
# ? Game_System
#----------------------------------------------------------------------------
# Add attributes to this class
#============================================================================

class Game_System
  attr_accessor :mode7 # false : normal map / true : mode 7
  attr_accessor :loop_x # true : horizontal-looping map
  attr_accessor :loop_y # true : vertical-looping map
  attr_accessor :always_scroll # true : to center the camera around the hero
  attr_accessor :map_tone # mode7 map's tone (Color)
  attr_accessor :map_opacity # mode7 map's opacity (0..255)
  attr_accessor :animated # true : animated autotiles for mode7 maps
  attr_accessor :white_horizon # true : white line horizon for mode7 maps
  attr_accessor :angle # mode7 map's slant angle (in degree)
  attr_accessor :horizon # horizon's distance
  attr_accessor :fixed_panorama # true : to fix the panorama (no scrolling any more)
  attr_accessor :ov # true : Overworld Sprite Resize (smaller hero's sprite)
  attr_accessor :ov_zoom # resize's value with ov
  attr_accessor :map_gradual_opacity # mode7 map's gradual opacity (0..255)
  attr_accessor :map_gradual_tone # mode7 map's gradual tone (Color)
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  alias initialize_mode7_game_system initialize
  def initialize
    initialize_mode7_game_system
    self.mode7 = false
    self.loop_x = false
    self.loop_y = false
    self.always_scroll = false
    self.animated = false
    self.white_horizon = false
    self.angle = 0
    self.fixed_panorama = false
    self.ov = false
    self.ov_zoom = 0.6
    reset
  end
  #--------------------------------------------------------------------------
  # * Reset the values for opacity, tone and horizon's distance
  #--------------------------------------------------------------------------
  def reset
    self.map_opacity = 255
    self.map_tone = Color.new(0,0,0,0)
    self.horizon = 960 # default value, equivalent to 30 tiles
    self.map_gradual_opacity = 0
    self.map_gradual_tone = Tone.new(0,0,0,0)
  end
end

#============================================================================
# ? Tilemap_mode7
#----------------------------------------------------------------------------
# This new Tilemap class handles the drawing of a mode7 map
#============================================================================

class Tilemap_mode7
  attr_accessor  :maps_list # contains map's graphics
  attr_accessor  :map_ground # original map's graphic to handle flat events
  attr_accessor  :tone_values # tone values for each line (Hash)
  attr_accessor  :opacity_values # opacity values for each line (Hash)
  #--------------------------------------------------------------------------
  # * Object Initialization
  #     viewport  : viewport
  #--------------------------------------------------------------------------
  def initialize(viewport)
    @id = $game_map.map_id # map's ID : to load or save the map in Cache
    @maps_list = [] # contains map's drawings (Bitmap)
    @disp_y = $game_map.display_y # @disp_y : tilemap's display_y
    @disp_x = $game_map.display_x # @disp_x : tilemap's display_x
    @height = 32 * $game_map.height # @height : map's height (in pixel)
    @width = 32 * $game_map.width # @width : map's width (in pixel)
    $game_temp.height = @height
    # map's drawings are loaded if already in Cache
    if RPG::Cache_Carte.in_cache(@id)
      @map = RPG::Cache_Carte.load(@id)
      @maps_list.push(@map)
      @map_ground = RPG::Cache_Carte.load(@id, 4) # to handle flat events
      if $game_system.animated
        @map_2 = RPG::Cache_Carte.load(@id, 1)
        @map_3 = RPG::Cache_Carte.load(@id, 2)
        @map_4 = RPG::Cache_Carte.load(@id, 3)
        @maps_list.push(@map_2)
        @maps_list.push(@map_3)
        @maps_list.push(@map_4)
      end
    else # draw the map and save it in the Cache
      draw_map
    end
    # create vertical elements from tiles
    data_V = Data_Vertical_Sprites.new(viewport)
    # @sprites_V : list of vertical sprites (Sprite_V)
    @sprites_V = data_V.list_sprites_V
    # @sprites_V_animated : list of animated vertical sprites (Sprite_V)
    @sprites_V_animated = data_V.list_sprites_V_animated
    @angle = $game_system.angle # map's slant angle (in degree)
    @distance_h = 480 # distance between the map's center and the vanishing point
    @pivot = 256 # screenline's number of the slant's pivot
    @index_animated = 0 # 0..3 : index of animated tiles pattern
    @viewport = viewport
    @tone_values = {} # list of the tone values for each line
    @opacity_values = {} # list of the opacity values for each line
    init_sprites(@angle) # initialize screenlines sprites
  end
  #--------------------------------------------------------------------------
  # * Dispose
  #--------------------------------------------------------------------------
  def dispose
    # dispose of @sprites (scanlines), @sprites_V (vertical_sprites), and
    # @sprites_loop_x (additional scanlines for horizontal looping)
    for sprite in @sprites + @sprites_V + @sprites_loop_x
      sprite.dispose
    end
    @sprites.clear
    @sprites_loop_x.clear
    @sprites_V.clear
    @sprites_V_animated.clear
    @maps_list.clear
    $game_system.angle = @angle
  end
  #--------------------------------------------------------------------------
  # * Increase slant's angle
  #--------------------------------------------------------------------------
  def increase_angle
    return if @angle == 88
    @angle = [@angle + 2, 88].min # angle's value between 0 and 88 degrees
    @sprites.clear
    @sprites_loop_x.clear
    init_sprites(@angle) # reinitialize screenlines sprites
  end
  #--------------------------------------------------------------------------
  # * Decrease slant's angle
  #--------------------------------------------------------------------------
  def decrease_angle
    return if @angle == 0
    @angle = [@angle - 2, 0].max # angle's value between 0 and 88 degrees
    @sprites.clear
    @sprites_loop_x.clear
    init_sprites(@angle) # reinitialize screenlines sprites
  end
  #--------------------------------------------------------------------------
  # * Slide from the current angle into the target value
  #     value  : target angle's value (in degree)
  #--------------------------------------------------------------------------
  def mode7_set_p(value)
    while value > @angle
      increase_angle
      update
      Graphics.update
    end
    while value < @angle
      decrease_angle
      update
      Graphics.update
    end
  end
  #--------------------------------------------------------------------------
  # * Redraw the map instantaneously with the new slant angle's value
  #     value  : target angle's value (in degree)
  #--------------------------------------------------------------------------
  def mode7_set(value)
    @angle = [[value, 0].max, 89].min
    @sprites.clear
    @sprites_loop_x.clear
    init_sprites(@angle) # reinitialize screenlines sprites
    update
    Graphics.update
  end
  #--------------------------------------------------------------------------
  # * Reinitialize screenlines sprites
  #--------------------------------------------------------------------------
  def mode7_redraw
    @sprites.clear
    @sprites_loop_x.clear
    init_sprites(@angle) # reinitialize scanlines
    update
    Graphics.update
  end
  #--------------------------------------------------------------------------
  # * Create sprites equivalent to scanlines
  #     value  : target angle's value (in degree)
  #--------------------------------------------------------------------------
  def init_sprites(angle)
    @horizon = $game_system.horizon
    angle_rad = (Math::PI * angle) / 180 # angle in radian
    @sprites = [] # list of the scanlines sprites (Sprite)
    @sprites_loop_x = [] # list of the additionnal sprites (for X-looping)
    cos_angle = Math.cos(angle_rad)
    sin_angle = Math.sin(angle_rad)
    # save values in $game_temp
    $game_temp.distance_h = @distance_h
    $game_temp.pivot = @pivot
    $game_temp.cos_angle = cos_angle
    $game_temp.sin_angle = sin_angle
    # h0, z0 : intermediate values
    h0 = (- @distance_h * @pivot * cos_angle).to_f /
    (@distance_h + @pivot * sin_angle) + @pivot
    z0 = @distance_h.to_f / (@distance_h + @pivot * sin_angle)
    $game_temp.slope_value = (1.0 - z0) / (@pivot - h0)
    $game_temp.corrective_value = 1.0 - @pivot * $game_temp.slope_value
    last_line = - @pivot - @horizon # last_line : the highest line that is drawn
    height_limit = (@distance_h * last_line * cos_angle).to_f /
    (@distance_h - last_line * sin_angle) + @pivot # the line corresponding to
    # the last_line in the warped reference = horizon's line
    $game_temp.height_limit = height_limit
    # constant to handle gradual opacity
    k2lim = ((@distance_h * last_line).to_f /
      (@distance_h * cos_angle + last_line * sin_angle)).to_i
    # one sprite is created for each screenline
    for j in 0..479
      next if j < height_limit # if the line is further than the horizon's line,
      # no sprite is created
      i = j - @pivot # y-reference is the pivot's line
      sprite = Sprite.new(@viewport)
      sprite.x = 320 # x-reference is the vertical line in the middle of the screen
      sprite.y = j
      sprite.z = - 99999 # map must not mask vertical elements
      sprite.y_origin_bitmap = (@distance_h * i).to_f /
      (@distance_h * cos_angle + i * sin_angle) + @pivot
      sprite.y_origin_bitmap_i = (sprite.y_origin_bitmap + 0.5).to_i
      sprite.y_origin_bitmap_i %= @height if $game_system.loop_y
      sprite.zoom_x = $game_temp.slope_value * j + $game_temp.corrective_value
      sprite.length = 2 + (640.to_f / sprite.zoom_x).to_i
      sprite.x_origin_bitmap_i = ((642 - sprite.length) / 2)
      sprite.x_origin_bitmap_i %= @width if $game_system.loop_x
      sprite.x_origin_bitmap = (sprite.x_origin_bitmap_i).to_f
      sprite.ox = sprite.length / 2
      sprite.bitmap = @map
      # horizontal translation to center around the hero
      if @disp_x != 0
        sprite.x_origin_bitmap += @disp_x / 4
        sprite.x_origin_bitmap_i = (sprite.x_origin_bitmap).to_i
        sprite.x_origin_bitmap_i %= @width if $game_system.loop_x
      end
      # vertical translation to center around the hero
      if @disp_y != 0
        sprite.y_origin_bitmap += @disp_y / 4
        sprite.y_origin_bitmap_i = (sprite.y_origin_bitmap + 0.5).to_i
        sprite.y_origin_bitmap_i %= @height if $game_system.loop_y
      end
      # handle opacity and tone
      k2 = ((@distance_h * i).to_f /
      (@distance_h * cos_angle + i * sin_angle)).to_i
      k2 = 0 if k2 > 0
      k_red = (- k2.to_f/k2lim * $game_system.map_gradual_tone.red).to_i
      k_green = (- k2.to_f/k2lim * $game_system.map_gradual_tone.green).to_i
      k_blue = (- k2.to_f/k2lim * $game_system.map_gradual_tone.blue).to_i
      k_gray = (- k2.to_f/k2lim * $game_system.map_gradual_tone.gray).to_i
      k2 = (- k2.to_f/k2lim * $game_system.map_gradual_opacity).to_i
      sprite.tone = Tone.new(k_red, k_green, k_blue, k_gray)
      sprite.opacity = 255 - k2
      sprite.opacity *= ($game_system.map_opacity).to_f / 255
      sprite.color = $game_system.map_tone
      # white horizon's line
      k = j - height_limit
      k = 500 / k
      if $game_system.white_horizon
        tone_red = sprite.tone.red + k
        tone_green = sprite.tone.green + k
        tone_blue = sprite.tone.blue + k
        tone_gray = sprite.tone.gray + k
        sprite.tone = Tone.new(tone_red, tone_green, tone_blue, tone_gray)
      end
      @tone_values[j] = sprite.tone
      @opacity_values[j] = sprite.opacity
      # set sprite's graphics
      sprite.src_rect.set(sprite.x_origin_bitmap_i, sprite.y_origin_bitmap_i,
      sprite.length, 1)
      @sprites.push(sprite)
      if $game_system.loop_x and j < @pivot
        # additional sprite to handle horizontal looping
        sprite2 = Sprite.new(@viewport)
        sprite2.x = 320
        sprite2.y = j
        sprite2.z = - 99999
        sprite2.y_origin_bitmap = sprite.y_origin_bitmap
        sprite2.y_origin_bitmap_i = sprite.y_origin_bitmap_i
        sprite2.zoom_x = sprite.zoom_x
        sprite2.length = sprite.length
        sprite2.x_origin_bitmap_i = sprite.x_origin_bitmap_i - @width
        sprite2.x_origin_bitmap = sprite.x_origin_bitmap_i - @width
        sprite2.ox = sprite.ox
        sprite2.bitmap = @map
        sprite2.opacity = sprite.opacity
        sprite2.color = sprite.color
        sprite2.tone = sprite.tone
        sprite2.src_rect.set(sprite2.x_origin_bitmap_i, sprite2.y_origin_bitmap_i,
        sprite2.length, 1)
        @sprites_loop_x.push(sprite2)
      end
    end
  end
  #--------------------------------------------------------------------------
  # * Update the screenlines sprites and the vertical sprites
  #   compare tilemap's display with map's display
  #--------------------------------------------------------------------------
  def update
    # update screenlines sprites
    if @disp_y < $game_map.display_y
      difference = $game_map.display_y - @disp_y
      @disp_y += difference
      for sprite in @sprites + @sprites_loop_x
        sprite.y_origin_bitmap += difference.to_f / 4
        sprite.y_origin_bitmap_i = (sprite.y_origin_bitmap+0.5).to_i
        sprite.y_origin_bitmap_i %= @height if $game_system.loop_y
        sprite.src_rect.set(sprite.x_origin_bitmap_i, sprite.y_origin_bitmap_i,
        sprite.length, 1)
      end
    end
    if @disp_y > $game_map.display_y
      difference = @disp_y - $game_map.display_y
      @disp_y -= difference
      for sprite in @sprites + @sprites_loop_x
        sprite.y_origin_bitmap -= difference.to_f / 4
        sprite.y_origin_bitmap_i = (sprite.y_origin_bitmap+0.5).to_i
        sprite.y_origin_bitmap_i %= @height if $game_system.loop_y
        sprite.src_rect.set(sprite.x_origin_bitmap_i, sprite.y_origin_bitmap_i,
        sprite.length, 1)
      end
    end
    if @disp_x < $game_map.display_x
      difference = $game_map.display_x - @disp_x
      @disp_x += difference
      for sprite in @sprites
        sprite.x_origin_bitmap += difference.to_f / 4
        sprite.x_origin_bitmap_i = (sprite.x_origin_bitmap).to_i
        sprite.x_origin_bitmap_i %= @width if $game_system.loop_x
        sprite.src_rect.set(sprite.x_origin_bitmap_i, sprite.y_origin_bitmap_i,
        sprite.length, 1)
      end
      for sprite in @sprites_loop_x
        sprite.x_origin_bitmap += difference.to_f / 4
        sprite.x_origin_bitmap_i = (sprite.x_origin_bitmap).to_i
        sprite.x_origin_bitmap_i %= @width
        sprite.x_origin_bitmap_i -= @width
        sprite.src_rect.set(sprite.x_origin_bitmap_i, sprite.y_origin_bitmap_i,
        sprite.length, 1)
      end
    end
    if @disp_x > $game_map.display_x
      difference = @disp_x - $game_map.display_x
      @disp_x -= difference
      for sprite in @sprites
        sprite.x_origin_bitmap -= difference.to_f / 4
        sprite.x_origin_bitmap_i = (sprite.x_origin_bitmap).to_i
        sprite.x_origin_bitmap_i %= @width if $game_system.loop_x
        sprite.src_rect.set(sprite.x_origin_bitmap_i, sprite.y_origin_bitmap_i,
        sprite.length, 1)
      end
      for sprite in @sprites_loop_x
        sprite.x_origin_bitmap -= difference.to_f / 4
        sprite.x_origin_bitmap_i = (sprite.x_origin_bitmap).to_i
        sprite.x_origin_bitmap_i %= @width
        sprite.x_origin_bitmap_i -= @width
        sprite.src_rect.set(sprite.x_origin_bitmap_i, sprite.y_origin_bitmap_i,
        sprite.length, 1)
      end
    end
    # update vertical sprites
    for sprite in @sprites_V
      sprite.update
    end
  end
  #--------------------------------------------------------------------------
  # * Update animation for animated tiles
  #--------------------------------------------------------------------------
  def update_animated
    @index_animated += 1
    @index_animated %= 4
    map = @maps_list[@index_animated]
    # update screenlines sprites
    for sprite in @sprites + @sprites_loop_x
      sprite.bitmap = map
      sprite.src_rect.set(sprite.x_origin_bitmap_i, sprite.y_origin_bitmap_i,
      sprite.length, 1)
    end
    # update vertical sprites
    for sprite in @sprites_V_animated
      sprite.update_animated(@index_animated)
    end
  end
  #--------------------------------------------------------------------------
  # * Create bitmaps representing the map
  #--------------------------------------------------------------------------
  def draw_map
    data = $game_map.data
    # Table where animated tiles are flagged
    data_animated = Table.new($game_map.width, $game_map.height)
    # bigger maps to handle horizontal looping
    offset = ($game_system.loop_x ? 640 : 0)
    @map = Bitmap.new(@width + offset, @height)
    @maps_list.push(@map)
    rect = Rect.new(0, 0, 32, 32)
    # create autotiles graphics
    RPG::Cache.clear
    @autotiles = []
    for i in 0..6
      autotile_name = $game_map.autotile_names
      fichier = RPG::Cache.autotile(autotile_name)
      for l in 0..3
        data_autotile = Data_Autotiles.new(fichier,l)
        data_autotile.number = 4*i + l
        RPG::Cache.save_autotile(data_autotile, data_autotile.number)
        @autotiles.push(data_autotile)
      end
    end
    # scan map's data to draw it
    for i in 0...$game_map.height
      for j in 0...$game_map.width
        data_animated[j, i] = 0
        # tile's ID for the first layer
        value1 = data[j, i, 0].to_i
        # prevent from drawing a vertical tile
        value1 = ($terrain_tags_vertical_tiles.include?($game_map.terrain_tags[value1]) ?
        0 : value1)
        # value1 != 0
        if value1 != 0
          # tile's ID for the second layer
          value2 = data[j, i, 1].to_i
          # prevent from drawing a vertical tile
          value2 = ($terrain_tags_vertical_tiles.include?($game_map.terrain_tags[value2]) ?
          0 : value2)
          # tile's ID for the third layer
          value3 = data[j, i, 2].to_i
          # prevent from drawing a vertical tile
          value3 = ($terrain_tags_vertical_tiles.include?($game_map.terrain_tags[value3]) ?
          0 : value3)
          # value1 != 0, value2 = 0
          if value2 == 0
            # value1 != 0, value2 = 0, value3 = 0
            if value3 == 0
              # value1 associated with a normal autotile
              if value1 > 383
                bitmap = RPG::Cache.tile($game_map.tileset_name, value1, 0)
                @map.blt(32*j, 32*i, bitmap, rect)
                if $game_system.loop_x and j.between?(0, 19)
                  @map.blt(32*(j+$game_map.width), 32*i, bitmap, rect)
                end
              # value1 associated with an autotile
              else
                num = 4*((value1 / 48) - 1)
                bitmap = RPG::Cache.autotile_base(num, value1)
                if @autotiles[num].animated
                  data_animated[j, i] = 1
                end
                @map.blt(32*j, 32*i, bitmap, rect)
                if $game_system.loop_x and j.between?(0, 19)
                  @map.blt(32*(j+$game_map.width), 32*i, bitmap, rect)
                end
              end
            # value1 != 0, value2 = 0, value3 != 0
            else
              bitmap = RPG::Cache_Tile.load(value1, value3)
              # value1 associated with an autotile
              if value1 < 384
                num = 4*((value1 / 48) - 1)
                data_animated[j, i] = 1 if @autotiles[num].animated
              end
              # value3 associated with an autotile
              if value3 < 384
                num = 4*((value3 / 48) - 1)
                data_animated[j, i] = 1 if @autotiles[num].animated
              end
              @map.blt(32*j, 32*i, bitmap, rect)
              if $game_system.loop_x and j.between?(0, 19)
                @map.blt(32*(j+$game_map.width), 32*i, bitmap, rect)
              end
            end
          # value1 != 0, value2 != 0
          else
            # value1 != 0, value2 != 0, value3 = 0
            if value3 == 0
              bitmap = RPG::Cache_Tile.load(value1, value2)
              # value1 associated with an autotile
              if value1 < 384
                num = 4*((value1 / 48) - 1)
                data_animated[j, i] = 1 if @autotiles[num].animated
              end
              # value2 associated with an autotile
              if value2 < 384
                num = 4*((value2 / 48) - 1)
                data_animated[j, i] = 1 if @autotiles[num].animated
              end
              @map.blt(32*j, 32*i, bitmap, rect)
              if $game_system.loop_x and j.between?(0, 19)
                @map.blt(32*(j+$game_map.width), 32*i, bitmap, rect)
              end
            # value1 != 0, value2 != 0, value3 != 0
            else
              bitmap = RPG::Cache_Tile.load2(value1, value2, value3)
              # value1 associated with an autotile
              if value1 < 384
                num = 4*((value1 / 48) - 1)
                data_animated[j, i] = 1 if @autotiles[num].animated
              end
              # value2 associated with an autotile
              if value2 < 384
                num = 4*((value2 / 48) - 1)
                data_animated[j, i] = 1 if @autotiles[num].animated
              end
              # value3 associated with an autotile
              if value3 < 384
                num = 4*((value3 / 48) - 1)
                data_animated[j, i] = 1 if @autotiles[num].animated
              end
              @map.blt(32*j, 32*i, bitmap, rect)
              if $game_system.loop_x and j.between?(0, 19)
                @map.blt(32*(j+$game_map.width), 32*i, bitmap, rect)
              end
            end
          end
        # value1 = 0
        else
          value2 = data[j, i, 1].to_i
          value2 = ($terrain_tags_vertical_tiles.include?($game_map.terrain_tags[value2]) ?
          0 : value2)
          value3 = data[j, i, 2].to_i
          value3 = ($terrain_tags_vertical_tiles.include?($game_map.terrain_tags[value3]) ?
          0 : value3)
          # value1 = 0, value2 = 0
          if value2 == 0
            # value1 = 0, value2 = 0, value3 != 0
            if value3 != 0
              # value3 associated with a normal tile
              if value3 > 383
                bitmap = RPG::Cache.tile($game_map.tileset_name, value3, 0)
                @map.blt(32*j, 32*i, bitmap, rect)
                if $game_system.loop_x and j.between?(0, 19)
                  @map.blt(32*(j+$game_map.width), 32*i, bitmap, rect)
                end
              # value3 associated with an autotile
              else
                num = 4*((value3 / 48) - 1)
                bitmap = RPG::Cache.autotile_base(num, value3)
                if @autotiles[num].animated
                  data_animated[j, i] = 1
                end
                @map.blt(32*j, 32*i, bitmap, rect)
                if $game_system.loop_x and j.between?(0, 19)
                  @map.blt(32*(j+$game_map.width), 32*i, bitmap, rect)
                end
              end
            end
          # value1 = 0, value2 != 0
          else
            # value1 = 0, value2 != 0, value3 = 0
            if value3 == 0
              # value2 associated with a normal tile
              if value2 > 383
                bitmap = RPG::Cache.tile($game_map.tileset_name, value2, 0)
                @map.blt(32*j, 32*i, bitmap, rect)
                if $game_system.loop_x and j.between?(0, 19)
                  @map.blt(32*(j+$game_map.width), 32*i, bitmap, rect)
                end
              # value2 associated with an autotile
              else
                num = 4*((value2 / 48) - 1)
                bitmap = RPG::Cache.autotile_base(num, value2)
                if @autotiles[num].animated
                  data_animated[j, i] = 1
                end
                @map.blt(32*j, 32*i, bitmap, rect)
                if $game_system.loop_x and j.between?(0, 19)
                  @map.blt(32*(j+$game_map.width), 32*i, bitmap, rect)
                end
              end
            # value1 = 0, value2 != 0, value3 != 0
            else
              bitmap = RPG::Cache_Tile.load(value2, value3)
              # value2 associated with an autotile
              if value2 < 384
                num = 4*((value2 / 48) - 1)
                data_animated[j, i] = 1 if @autotiles[num].animated
              end
              # value3 associated with an autotile
              if value3 < 384
                num = 4*((value3 / 48) - 1)
                data_animated[j, i] = 1 if @autotiles[num].animated
              end
              @map.blt(32*j, 32*i, bitmap, rect)
              if $game_system.loop_x and j.between?(0, 19)
                @map.blt(32*(j+$game_map.width), 32*i, bitmap, rect)
              end
            end
          end
        end
      end
    end
    # save the map's drawing in the Cache
    RPG::Cache_Carte.save(@id, @map)
    @map_ground = @map.clone
    # save a copy of the map to handle flat events
    RPG::Cache_Carte.save(@id, @map_ground, 4)
    return if !$game_system.animated
    # create 3 other maps in case of animated tiles
    @map_2 = @map.clone
    @map_3 = @map.clone
    @map_4 = @map.clone
    @maps_list.push(@map_2)
    @maps_list.push(@map_3)
    @maps_list.push(@map_4)
    for i in 0...$game_map.height
      for j in 0...$game_map.width
        next if data_animated[j, i].to_i == 0
        # modify the tile if it is flagged as animated
        value1 = data[j, i, 0].to_i
        value2 = data[j, i, 1].to_i
        value3 = data[j, i, 2].to_i
        # prevent from drawing a vertical tile
        value1 = ($terrain_tags_vertical_tiles.include?($game_map.terrain_tags[value3]) ?
        0 : value3)
        value2 = ($terrain_tags_vertical_tiles.include?($game_map.terrain_tags[value3]) ?
        0 : value3)
        value3 = ($terrain_tags_vertical_tiles.include?($game_map.terrain_tags[value3]) ?
        0 : value3)
        if value1 != 0
          if value2 == 0
            if value3 == 0
              num = 4*((value1 / 48) - 1)
              bitmap_2 = RPG::Cache.autotile_base(num+1, value1)
              bitmap_3 = RPG::Cache.autotile_base(num+2, value1)
              bitmap_4 = RPG::Cache.autotile_base(num+3, value1)
              @map_2.blt(32*j, 32*i, bitmap_2, rect)
              @map_3.blt(32*j, 32*i, bitmap_3, rect)
              @map_4.blt(32*j, 32*i, bitmap_4, rect)
              if $game_system.loop_x and j.between?(0, 19)
                @map_2.blt(32*(j+$game_map.width), 32*i, bitmap_2, rect)
                @map_3.blt(32*(j+$game_map.width), 32*i, bitmap_3, rect)
                @map_4.blt(32*(j+$game_map.width), 32*i, bitmap_4, rect)
              end
            else
              bitmap_2 = RPG::Cache_Tile.load(value1, value3, 1)
              bitmap_3 = RPG::Cache_Tile.load(value1, value3, 2)
              bitmap_4 = RPG::Cache_Tile.load(value1, value3, 3)
              @map_2.blt(32*j, 32*i, bitmap_2, rect)
              @map_3.blt(32*j, 32*i, bitmap_3, rect)
              @map_4.blt(32*j, 32*i, bitmap_4, rect)
              if $game_system.loop_x and j.between?(0, 19)
                @map_2.blt(32*(j+$game_map.width), 32*i, bitmap_2, rect)
                @map_3.blt(32*(j+$game_map.width), 32*i, bitmap_3, rect)
                @map_4.blt(32*(j+$game_map.width), 32*i, bitmap_4, rect)
              end
            end
          else
            if value3 == 0
              bitmap_2 = RPG::Cache_Tile.load(value1, value2, 1)
              bitmap_3 = RPG::Cache_Tile.load(value1, value2, 2)
              bitmap_4 = RPG::Cache_Tile.load(value1, value2, 3)
              @map_2.blt(32*j, 32*i, bitmap_2, rect)
              @map_3.blt(32*j, 32*i, bitmap_3, rect)
              @map_4.blt(32*j, 32*i, bitmap_4, rect)
              if $game_system.loop_x and j.between?(0, 19)
                @map_2.blt(32*(j+$game_map.width), 32*i, bitmap_2, rect)
                @map_3.blt(32*(j+$game_map.width), 32*i, bitmap_3, rect)
                @map_4.blt(32*(j+$game_map.width), 32*i, bitmap_4, rect)
              end
            else
              bitmap_2 = RPG::Cache_Tile.load2(value1, value2, value3, 1)
              bitmap_3 = RPG::Cache_Tile.load2(value1, value2, value3, 2)
              bitmap_4 = RPG::Cache_Tile.load2(value1, value2, value3, 3)
              @map_2.blt(32*j, 32*i, bitmap_2, rect)
              @map_3.blt(32*j, 32*i, bitmap_3, rect)
              @map_4.blt(32*j, 32*i, bitmap_4, rect)
              if $game_system.loop_x and j.between?(0, 19)
                @map_2.blt(32*(j+$game_map.width), 32*i, bitmap_2, rect)
                @map_3.blt(32*(j+$game_map.width), 32*i, bitmap_3, rect)
                @map_4.blt(32*(j+$game_map.width), 32*i, bitmap_4, rect)
              end
            end
          end
        else
          if value2 != 0
            if value3 == 0
              num = 4*((value2 / 48) - 1)
              bitmap_2 = RPG::Cache.autotile_base(num+1, value2)
              bitmap_3 = RPG::Cache.autotile_base(num+2, value2)
              bitmap_4 = RPG::Cache.autotile_base(num+3, value2)
              @map_2.blt(32*j, 32*i, bitmap_2, rect)
              @map_3.blt(32*j, 32*i, bitmap_3, rect)
              @map_4.blt(32*j, 32*i, bitmap_4, rect)
              if $game_system.loop_x and j.between?(0, 19)
                @map_2.blt(32*(j+$game_map.width), 32*i, bitmap_2, rect)
                @map_3.blt(32*(j+$game_map.width), 32*i, bitmap_3, rect)
                @map_4.blt(32*(j+$game_map.width), 32*i, bitmap_4, rect)
              end
            else
              bitmap_2 = RPG::Cache_Tile.load(value2, value3, 1)
              bitmap_3 = RPG::Cache_Tile.load(value2, value3, 2)
              bitmap_4 = RPG::Cache_Tile.load(value2, value3, 3)
              @map_2.blt(32*j, 32*i, bitmap_2, rect)
              @map_3.blt(32*j, 32*i, bitmap_3, rect)
              @map_4.blt(32*j, 32*i, bitmap_4, rect)
              if $game_system.loop_x and j.between?(0, 19)
                @map_2.blt(32*(j+$game_map.width), 32*i, bitmap_2, rect)
                @map_3.blt(32*(j+$game_map.width), 32*i, bitmap_3, rect)
                @map_4.blt(32*(j+$game_map.width), 32*i, bitmap_4, rect)
              end
            end
          else
            if value3 != 0
              num = 4*((value3 / 48) - 1)
              bitmap_2 = RPG::Cache.autotile_base(num+1, value3)
              bitmap_3 = RPG::Cache.autotile_base(num+2, value3)
              bitmap_4 = RPG::Cache.autotile_base(num+3, value3)
              @map_2.blt(32*j, 32*i, bitmap_2, rect)
              @map_3.blt(32*j, 32*i, bitmap_3, rect)
              @map_4.blt(32*j, 32*i, bitmap_4, rect)
              if $game_system.loop_x and j.between?(0, 19)
                @map_2.blt(32*(j+$game_map.width), 32*i, bitmap_2, rect)
                @map_3.blt(32*(j+$game_map.width), 32*i, bitmap_3, rect)
                @map_4.blt(32*(j+$game_map.width), 32*i, bitmap_4, rect)
              end
            end
          end
        end
      end
    end
    # save the three additional maps in the Cache
    RPG::Cache_Carte.save(@id, @map_2, 1)
    RPG::Cache_Carte.save(@id, @map_3, 2)
    RPG::Cache_Carte.save(@id, @map_4, 3)
  end
end

#============================================================================
# ? Game_Map
#----------------------------------------------------------------------------
# Methods modifications to handle map looping
#============================================================================

class Game_Map
  #--------------------------------------------------------------------------
  # * Scroll Down
  #     distance : scroll distance
  #--------------------------------------------------------------------------
  alias scroll_down_mode7_game_map scroll_down
  def scroll_down(distance)
    if !$game_system.mode7
      scroll_down_mode7_game_map(distance)
      return
    end
    if $game_system.loop_y or $game_system.always_scroll
      @display_y = @display_y + distance # always scroll
    else
      @display_y = [@display_y + distance, (self.height - 15) * 128].min
    end
  end
  #--------------------------------------------------------------------------
  # * Scroll Left
  #     distance : scroll distance
  #--------------------------------------------------------------------------
  alias scroll_left_mode7_game_map scroll_left
  def scroll_left(distance)
    if !$game_system.mode7
      scroll_left_mode7_game_map(distance)
      return
    end
    if $game_system.loop_x or $game_system.always_scroll
      @display_x = @display_x - distance # always scroll
    else
      @display_x = [@display_x - distance, 0].max
    end
  end
  #--------------------------------------------------------------------------
  # * Scroll Right
  #     distance : scroll distance
  #--------------------------------------------------------------------------
  alias scroll_right_mode7_game_map scroll_right
  def scroll_right(distance)
    if !$game_system.mode7
      scroll_right_mode7_game_map(distance)
      return
    end
    if $game_system.loop_x or $game_system.always_scroll
      @display_x = @display_x + distance # always scroll
    else
      @display_x = [@display_x + distance, (self.width - 20) * 128].min
    end
  end
  #--------------------------------------------------------------------------
  # * Scroll Up
  #     distance : scroll distance
  #--------------------------------------------------------------------------
  alias scroll_up_mode7_game_map scroll_up
  def scroll_up(distance)
    if !$game_system.mode7
      scroll_up_mode7_game_map(distance)
      return
    end
    if $game_system.loop_y or $game_system.always_scroll
      @display_y = @display_y - distance # always scroll
    else
      @display_y = [@display_y - distance, 0].max
    end
  end
  #--------------------------------------------------------------------------
  # * Determine Valid Coordinates
  #     x          : x-coordinate
  #     y          : y-coordinate
  #   Allow the hero to go out of the map when map looping
  #--------------------------------------------------------------------------
  alias valid_mode7_game_map? valid?
  def valid?(x, y)
    if !$game_system.mode7
      return (valid_mode7_game_map?(x, y))
    end
    if $game_system.loop_x
      if $game_system.loop_y
        return true
      else
        return (y >= 0 and y < height)
      end
    elsif $game_system.loop_y
      return (x >= 0 and x < width)
    end
    return (x >= 0 and x < width and y >= 0 and y < height)
  end
  #--------------------------------------------------------------------------
  # * Determine if Passable
  #     x          : x-coordinate
  #     y          : y-coordinate
  #     d          : direction (0,2,4,6,8,10)
  #                  *  0,10 = determine if all directions are impassable
  #     self_event : Self (If event is determined passable)
  #--------------------------------------------------------------------------
  alias passable_mode7_game_map? passable?
  def passable?(x, y, d, self_event = nil)
    if !$game_system.mode7
      passable_mode7_game_map?(x, y, d, self_event)
      return(passable_mode7_game_map?(x, y, d, self_event))
    end
    unless valid?(x, y)
      return false
    end
    bit = (1 << (d / 2 - 1)) & 0x0f
    for event in events.values
      if event.tile_id >= 0 and event != self_event and
         event.x == x and event.y == y and not event.through
        if @passages[event.tile_id] & bit != 0
          return false
        elsif @passages[event.tile_id] & 0x0f == 0x0f
          return false
        elsif @priorities[event.tile_id] == 0
          return true
        end
      end
    end
    for i in [2, 1, 0]
      tile_id = data[x % width, y % height, i] # handle map looping
      if tile_id == nil
        return false
      elsif @passages[tile_id] & bit != 0
        return false
      elsif @passages[tile_id] & 0x0f == 0x0f
        return false
      elsif @priorities[tile_id] == 0
        return true
      end
    end
    return true
  end
end

#============================================================================
# ? Game_Character
#----------------------------------------------------------------------------
# "update" method modifications to handle map looping
#============================================================================

class Game_Character
  attr_accessor :x
  attr_accessor :y
  attr_accessor :real_x
  attr_accessor :real_y
  attr_reader   :flat
  attr_reader   :height
  #--------------------------------------------------------------------------
  # * Object Initialization
  #--------------------------------------------------------------------------
  alias initialize_mode7_game_character initialize
  def initialize
    initialize_mode7_game_character
    @flat = false
    @height = 0.0
  end
  #--------------------------------------------------------------------------
  # * Update
  #--------------------------------------------------------------------------
  alias update_mode7_game_character update
  def update
    if !$game_system.mode7
      update_mode7_game_character
      return
    end
    # if x-coordinate is out of the map
    if !(x.between?(0, $game_map.width - 1))
      difference = 128 * x - real_x
      if self.is_a?(Game_Player)
        # increase or decrease map's number
        self.map_number_x += difference / (difference.abs)
      end
      # x-coordinate is equal to its equivalent in the map
      self.x %= $game_map.width
      self.real_x = 128 * x - difference
    end
    # if y-coordinate is out of the map
    if !(y.between?(0, $game_map.height - 1))
      difference = 128 * y - real_y
      if self.is_a?(Game_Player)
        # increase or decrease map's number
        self.map_number_y += difference / (difference.abs)
      end
      # y-coordinate is equal to its equivalent in the map
      self.y %= $game_map.height
      self.real_y = 128 * y - difference
    end
    update_mode7_game_character
  end
end

#==============================================================================
# ? Game_Event
#----------------------------------------------------------------------------
# Add methods to handle flat events and altitude for vertical event
#============================================================================

class Game_Event < Game_Character
  #--------------------------------------------------------------------------
  # * scan the event's commands list
  #     page : the scanned page (RPG::Event::Page)
  #--------------------------------------------------------------------------
  def check_commands(page)
    @height = 0.0
    command_list = pa
« Last Edit: June 06, 2007, 05:13:08 AM by Zeriab »

********
Hungry
Rep:
Level 96
Mawbeast
2013 Best ArtistParticipant - GIAW 11Secret Santa 2013 ParticipantFor the great victory in the Breakfast War.2012 Best Game Creator (Non-RM Programs)~Bronze - GIAW 9Project of the Month winner for December 2009Project of the Month winner for August 20082011 Best Game Creator (Non RM)Gold - GIAW Halloween
you can't do the grass-see-through effect, that's why they said to use events for anything you want the
character to walk behind.

try disabling that

FCF3a A+ C- D H- M P+ R T W- Z- Sf RLCT a cmn+++ d++ e++ f h+++ iw+++ j+ p sf+
Follow my project: MBlok | Find me on: Bandcamp | Twitter | Patreon

*
Rise From The Ashes!
Rep:
Level 91
"Time to bring the Law!"
Project of the Month winner for September 2009
Okay,I think I disabled it, now I have another error:


Code: [Select]
Script 'Mode7' line 1263: NoMethodError occurred.

undefined method `opacity_values' for #<Tilemap:0x41744f8>

To be honest, I think I am doing it wrong.

********
Hungry
Rep:
Level 96
Mawbeast
2013 Best ArtistParticipant - GIAW 11Secret Santa 2013 ParticipantFor the great victory in the Breakfast War.2012 Best Game Creator (Non-RM Programs)~Bronze - GIAW 9Project of the Month winner for December 2009Project of the Month winner for August 20082011 Best Game Creator (Non RM)Gold - GIAW Halloween
hmmm...well they did say it was still in production...

will it kill your game to set all tiles to 0?

FCF3a A+ C- D H- M P+ R T W- Z- Sf RLCT a cmn+++ d++ e++ f h+++ iw+++ j+ p sf+
Follow my project: MBlok | Find me on: Bandcamp | Twitter | Patreon

*
Rise From The Ashes!
Rep:
Level 91
"Time to bring the Law!"
Project of the Month winner for September 2009
Well, the game would look quite flat....

The author said this script does not crash, it just has things missing.

********
Hungry
Rep:
Level 96
Mawbeast
2013 Best ArtistParticipant - GIAW 11Secret Santa 2013 ParticipantFor the great victory in the Breakfast War.2012 Best Game Creator (Non-RM Programs)~Bronze - GIAW 9Project of the Month winner for December 2009Project of the Month winner for August 20082011 Best Game Creator (Non RM)Gold - GIAW Halloween
they told you to use events for anything that you want to stand up because of that error :D

FCF3a A+ C- D H- M P+ R T W- Z- Sf RLCT a cmn+++ d++ e++ f h+++ iw+++ j+ p sf+
Follow my project: MBlok | Find me on: Bandcamp | Twitter | Patreon

*
Rise From The Ashes!
Rep:
Level 91
"Time to bring the Law!"
Project of the Month winner for September 2009
LOL I must have missed that part.

Now it works (technically lol), thanks man!

+rep