# =============================================================================# Map Saver ACE# Version 0.1# Author: Yami# Credit: Omegas7 for VX version Site:
http://www.myrpgmaker.com# Credit: Woratana for PNG Saver script.# =============================================================================# 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 0...@bitmaps.size y = @bitmaps
[2]*32 if @bitmaps[3] == true y += 16 if @weird_mode end @result.blt(@bitmaps[1]*32,y,@bitmaps[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 endend# =============================================================================# 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) 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:
eflate.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 endend#=============================================================================# ** Bitmap#=============================================================================class Bitmap def make_png(name = 'like', path = '', mode = 0) Zlib:
ng_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') endend