The RPG Maker Resource Kit

RMRK RPG Maker Creation => XP => XP Scripts Database => Topic started by: game_guy on October 08, 2009, 05:04:59 AM

Title: [XP] Tileset Merger
Post by: game_guy on October 08, 2009, 05:04:59 AM
Tileset Merger
Authors: game_guy
Version: 1.0
Type: Tileset Merger
Key Term: Misc System

Introduction

Ever needed a few tilesets merged for mapping? This script will merge any tilesets for you into one!

Features


Screenshots

Video (http://www.youtube.com/watch?v=PC2MhWlibs4)

Demo

http://www.sendspace.com/file/ufkvn9

Script

Spoiler for:
Code: [Select]
#===============================================================================
# Tileset Merger
# Version 1.0
# Author game_guy
#-------------------------------------------------------------------------------
# Intro:
# Ever needed a few tilesets merged for mapping? This script will merge any
# tileset for you into one!
#
# Features:
# Merges any amount of tilesets into one tileset!
#
# Instructions:
# Import any tileset into the Tilesets folder that you want merged together.
# Then run the game and it'll merge it for you.
# Make sure all the tilesets have the same background color.
#
# Credits:
# game_guy ~ making it
# Fantasist ~ giving me a neat piece of code
# 66rpg ~ Bitmap to Png code
# GAX72 ~ Requesting merged tilesets
#===============================================================================

=begin
==============================================================================
                        Bitmap to PNG By ???
==============================================================================

 ?Bitmap??????
 
 bitmap_obj.make_png(name[, path])
 
 name:?????
 path:????

 ??66??????????????
  
==============================================================================
=end

module Zlib
  class Png_File < GzipWriter
    #--------------------------------------------------------------------------
    # ? ???
    #--------------------------------------------------------------------------
    def make_png(bitmap_Fx,mode)
      @mode = mode
      @bitmap_Fx = bitmap_Fx
      self.write(make_header)
      self.write(make_ihdr)
      self.write(make_idat)
      self.write(make_iend)
    end
    #--------------------------------------------------------------------------
    # ? PNG??????
    #--------------------------------------------------------------------------
    def make_header
      return [0x89,0x50,0x4e,0x47,0x0d,0x0a,0x1a,0x0a].pack("C*")
    end
    #--------------------------------------------------------------------------
    # ? PNG????????(IHDR)
    #--------------------------------------------------------------------------
    def make_ihdr
      ih_size = [13].pack("N")
      ih_sign = "IHDR"
      ih_width = [@bitmap_Fx.width].pack("N")
      ih_height = [@bitmap_Fx.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
    #--------------------------------------------------------------------------
    # ? ??????(IDAT)
    #--------------------------------------------------------------------------
    def make_idat
      header = "\x49\x44\x41\x54"
      case @mode # ?54~
      when 1
        data = make_bitmap_data#1
      else
        data = make_bitmap_data
      end
      data = Zlib::Deflate.deflate(data, 8)
      crc = [Zlib.crc32(header + data)].pack("N")
      size = [data.length].pack("N")
      return size + header + data + crc
    end
    #--------------------------------------------------------------------------
    # ? ?Bitmap????????? mode 1(?54~)
    #--------------------------------------------------------------------------
    def make_bitmap_data1
      w = @bitmap_Fx.width
      h = @bitmap_Fx.height
      data = []
      for y in 0...h
        data.push(0)
        for x in 0...w
          color = @bitmap_Fx.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)
        end
      end
      return data.pack("C*")
    end
    #--------------------------------------------------------------------------
    # ? ?Bitmap????????? mode 0
    #--------------------------------------------------------------------------
    def make_bitmap_data
      gz = Zlib::GzipWriter.open('hoge.gz')
      t_Fx = 0
      w = @bitmap_Fx.width
      h = @bitmap_Fx.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
            #GC.start
          end
          color = @bitmap_Fx.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)
        end
      end
      s = data.pack("C*")
      gz.write(s)
      gz.close    
      data.clear
      gz = Zlib::GzipReader.open('hoge.gz')
      data = gz.read
      gz.close
      File.delete('hoge.gz')
      return data
    end
    #--------------------------------------------------------------------------
    # ? PNG??????(IEND)
    #--------------------------------------------------------------------------
    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
#------------------------------------------------------------------------------
# ????Bitmap?
#==============================================================================
class Bitmap
  #--------------------------------------------------------------------------
  # ? ??
  #--------------------------------------------------------------------------
  def make_png(name="like", path="",mode=0)
    make_dir(path) if path != ""
    Zlib::Png_File.open("temp.gz") {|gz|
      gz.make_png(self,mode)
    }
    Zlib::GzipReader.open("temp.gz") {|gz|
      $read = gz.read
    }
    f = File.open(path + name + ".png","wb")
    f.write($read)
    f.close
    File.delete('temp.gz')
    end
  #--------------------------------------------------------------------------
  # ? ??????
  #--------------------------------------------------------------------------
  def make_dir(path)
    dir = path.split("/")
    for i in 0...dir.size
      unless dir == "."
        add_dir = dir[0..i].join("/")
        begin
          Dir.mkdir(add_dir)
        rescue
        end
      end
    end
  end
end
begin
  @time = Time.now
  @height = 0
  @names = []
  dir = Dir.new('Graphics/Tilesets/')
  dir.entries.each {|file| next unless file.include?('.png')
  @names.push(file); RPG::Cache.tileset(file)}
  for i in 0...@names.size
    @tile = RPG::Cache.tileset(@names[i])
    @height += @tile.height
  end
  @bitmap = Bitmap.new(256, @height)
  @height = 0
  for i in 0...@names.size
    @tile = RPG::Cache.tileset(@names[i])
    @rect = Rect.new(0, 0, @tile.width, @tile.height)
    @bitmap.blt(0, @height, @tile, @rect)
    @height += @tile.height
  end
  @bitmap.make_png("MergedTile")
  print "Merged #{@names.size} tilesets together in \n#{Time.now - @time} seconds."
  exit
end

Instructions

Import any tileset into the Tilesets folder that you want merged together.
Then run the game and it'll merge it for you.
Make sure all the tilesets have the same background color.
Merged tilesets will appear in the root of the game folder.

Compatibility

Should work with anything
Not tested with SDK

Credits and Thanks


Author's Notes

Give credits and enjoy!
Title: Re: [XP] Tileset Merger
Post by: game_guy on October 08, 2009, 05:37:26 AM
Yea it supports transparency, the blue bg is my transparency color I changed it.
Title: Re: [XP] Tileset Merger
Post by: modern algebra on October 08, 2009, 12:39:40 PM
Cool - great work, game_guy
Title: Re: [XP] Tileset Merger
Post by: nayrz on October 09, 2009, 01:00:55 AM
Ello, this is my first time using this site, I mean I used it before for scripts but never posted on anything, anyways, I just used the tileset merger, great stuff, just one thing bugs me, if you take all 50 tilesets that come with rpgxp, they merge great but when your going down Through to use any of the ones on the bottom it freezes and sends you back up to the top, u gotta stop half way Through and slowly use the wheel on the mouse and hope it doesn't send u back up again also sometimes it says "script hanging", besides that i love it, i think I'm using a few other scripts of yours also, except maybe a bank, i had to use a Spanish bank script and just make the words that show in-game English lol
Title: Re: [XP] Tileset Merger
Post by: Lazer Ki on October 09, 2009, 01:12:57 AM
I'm trying this out tommorow
Title: Re: [XP] Tileset Merger
Post by: nayrz on October 09, 2009, 01:16:37 AM
Ah, well, at least it works X]