Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # =============================================================================
- # Map Saver
- # Version 0.1
- # Author: Omegas7. 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[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
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement