Code:


# =============================================================================
# Map Saver
# Version 0.1
# Author: Omegas7.  Site: http://www.myrpgmaker.com
# Credit: Woratana for PNG Saver script.
# RGSS3 by Yami (yamiryzayuki)
# Original Topic http://www.rpgmakervxace.net/topic/669-map-saver-script-conversion-request/
# =============================================================================
# Save a whole map into a .png file by taking multiple screenshots and finally
# combining them. Exporting the resulting bitmap to a .png image file using
# Woratana's PNG Saver script.
# =============================================================================
# Instructions:
#  Go to Paint or whatever image editing software you want.
#  Create a new file, width and height will be the same as your map, but
#  multiplied by 32. (If map's width is 20, the image's width will be 640).
#  Name the image "Blank", and save it on the System folder of your game.
#  Go to your game map, and put the player starting position on the
#  bottom left part of the map.
#  Now make a new event, autorun, with script call:
#  $saver = Map_Saver.new
#  Then turn self-switch A ON.
#  Go to the event's second page, put as condition self-switch A, then put
#  script call:
#  $saver.update
#  Finally make the second page to be autorun as well.
#  Run the game, you will see the map will start scrolling. Let it be.
#  At the end the script will start creating the image file, this process
#  may take several minutes depending on your map's size.
#  Sure, it may take very long, but it saves HOURS if you planned to make
#  your map manually, so do not complain ;).
# =============================================================================
# Notes:
#  The final result will be an image file located on your game's main folder.
#  The image will be exactly what appears on the screen, so if you got a HUD,
#  it will appear as well.
#  If you notice a problem with the final result, like with tiles etc,
#  try activating "weird mode" below.
#  If the final result is still not fixed, try to get support.
# =============================================================================

class Map_Saver
  def initialize

        # If the resulting image seems to be wrongly made, try turning this value
        # to "true". Normally, this should be false.
        @weird_mode = false

        @result = Bitmap.new('Graphics/System/Blank')
        @bitmaps = []
        @moving = true
        @last_place = 'none'
        @finishing = false
        @pause_time = 30
        @scrolling_x = 13
  end
  def update
        if !(@finishing)
          if !($game_map.scrolling?)
                if @moving
                  execute_image
                else
                  if can_move?(8)
                        $game_map.start_scroll(8, @scrolling_x, 7)
                        @moving = true
                        @last_place = 'down'
                  elsif can_move?(6) && @last_place == 'down'
                        $game_map.start_scroll(6, 17, 7)
                        @last_place = 'left'
                  elsif can_move?(2) && @last_place == 'left'
                        $game_map.start_scroll(2, $game_map.height, 9)
                        @last_place = 'up'
                        @moving = true
                  else
                        @finishing = true
                        for i in [You must be registered and logged in to see this link.]
                          y = @bitmaps[i][2]*32
                          if @bitmaps[i][3] == true
                                y += 16 if @weird_mode
                          end
                          @result.blt(@bitmaps[i][1]*32,y,@bitmaps[i][0],
                          Rect.new(0,0,Graphics.width,Graphics.height))
                        end
                        @result.make_png('Map','')
                        print "Map image production is over!"
                        exit
                  end
                end
          end
        end
  end
  def execute_image
        Graphics.freeze
        @bitmaps.push([Graphics.snap_to_bitmap,
        $game_map.display_x,
        $game_map.display_y,
        nil])
        @moving = false
        Graphics.transition(@pause_time)
        if can_move?(8) && can_move?(2)
          @bitmaps[@bitmaps.size - 1][3] = true
        end
  end
  def can_move?(direction)
        case direction
        when 6
          return false if ($game_map.display_x) == ($game_map.width - Graphics.width / 32)
          return true
        when 2
          return false if ($game_map.display_y) == ($game_map.height - Graphics.height / 32)
          return true
        when 4
          return false if ($game_map.display_x == 0)
          return true
        when 8
          return false if ($game_map.display_y == 0)
          return true
        end
  end
end

# =============================================================================
# PNG Saver by Woratana.
# =============================================================================
module Zlib
  class Png_File < GzipWriter
        def make_png(bitmap, mode = 0)
          @bitmap, @mode = bitmap, mode
          create_loader
          self.write(make_header)
          self.write(make_ihdr)
          self.write(make_idat)
          self.write(make_iend)
        end
        def create_loader
          w = @bitmap.width
          h = @bitmap.height
          @calculated = [0,nil]
          @calculated[1] = (w*h).to_f
          @window = Window_Base.new(0,150,544,116)
          @window.contents.font.size = 16
          @update = ((@bitmap.width*@bitmap.height)/3000.0).floor.to_i
          refresh_loader
        end
        def refresh_loader
          Graphics.update
          @window.contents.clear
          text = ['Creating image file, please wait...',
          percent.to_s + '% done...']
          for i in 0...text.size
                @window.contents.draw_text(0,20*i,520,20,text[i])
          end
          Graphics.update
        end
        def percent
          return ((100/@calculated[1])*@calculated[0]).floor
        end
        def make_header
          return [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a].pack('C*')
        end
        def make_ihdr
          ih_size                          = [13].pack('N')
          ih_sign                          = 'IHDR'
          ih_width                        = [@bitmap.width].pack('N')
          ih_height                      = [@bitmap.height].pack('N')
          ih_bit_depth            = [8].pack('C')
          ih_color_type          = [6].pack('C')
          ih_compression_method = [0].pack('C')
          ih_filter_method        = [0].pack('C')
          ih_interlace_method  = [0].pack('C')
          string = ih_sign + ih_width + ih_height + ih_bit_depth + ih_color_type +
                          ih_compression_method + ih_filter_method + ih_interlace_method
          ih_crc = [Zlib.crc32(string)].pack('N')
          return ih_size + string + ih_crc
        end
        def make_idat
          header  = "\x49\x44\x41\x54"
          data  = @mode == 0 ? make_bitmap_data0 : make_bitmap_data1
          data  = Zlib::Deflate.deflate(data, 8)
          crc    = [Zlib.crc32(header + data)].pack('N')
          size  = [data.length].pack('N')
          return size + header + data + crc
        end
        def make_bitmap_data0
          gz = Zlib::GzipWriter.open('png2.tmp')
          t_Fx = 0
          w = @bitmap.width
          h = @bitmap.height
          data = []
          for y in 0...h
                data.push(0)
                for x in 0...w
                  t_Fx += 1
                  if t_Fx % 10000 == 0
                        Graphics.update
                  end
                  if t_Fx % 100000 == 0
                        s = data.pack('C*')
                        gz.write(s)
                        data.clear
                  end
                  color = @bitmap.get_pixel(x, y)
                  red = color.red
                  green = color.green
                  blue = color.blue
                  alpha = color.alpha
                  data.push(red)
                  data.push(green)
                  data.push(blue)
                  data.push(alpha)
                  @calculated[0] += 1
                  if @calculated[0] % @update == 0
                        refresh_loader
                  end
                end
          end
          s = data.pack('C*')
          gz.write(s)
          gz.close 
          data.clear
          gz = Zlib::GzipReader.open('png2.tmp')
          data = gz.read
          gz.close
          File.delete('png2.tmp')
          return data
        end
        def make_bitmap_data1
          w = @bitmap.width
          h = @bitmap.height
          data = []
          for y in 0...h
                data.push(0)
                for x in 0...w
                  color = @bitmap.get_pixel(x, y)
                  red = color.red
                  green = color.green
                  blue = color.blue
                  alpha = color.alpha
                  data.push(red)
                  data.push(green)
                  data.push(blue)
                  data.push(alpha)
                  @calculated[0] += 1
                  if @calculated[0] % @update == 0
                        refresh_loader
                  end
                end
          end
          return data.pack('C*')
        end
        def make_iend
          ie_size = [0].pack('N')
          ie_sign = 'IEND'
          ie_crc  = [Zlib.crc32(ie_sign)].pack('N')
          return ie_size + ie_sign + ie_crc
        end
  end
end
#=============================================================================
# ** Bitmap
#=============================================================================
class Bitmap
  def make_png(name = 'like', path = '', mode = 0)
        Zlib::Png_File.open('png.tmp')  { |gz| gz.make_png(self, mode) }
        Zlib::GzipReader.open('png.tmp') { |gz| $read = gz.read }
        f = File.open(path + name + '.png', 'wb')
        f.write($read)
        f.close
        File.delete('png.tmp')
  end
end