Chaos Project

RPG Maker => RPG Maker Scripts => RMXP Script Database => Topic started by: G_G on August 14, 2009, 12:16:59 pm

Title: [XP] Vx To Xp Char Converter
Post by: G_G on August 14, 2009, 12:16:59 pm
Vx To Xp Char Converter
Authors: game_guy
Version: 1.0
Type: Character Converter
Key Term: Misc System



Introduction

Converts the little vx guys to xp format.


Features




Screenshots

Here's what it does, just an example
(http://img20.imageshack.us/img20/9695/pinedaxp36.png)(http://img34.imageshack.us/img34/5177/pinedaxp35.png)


Demo

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


Script

Spoiler: ShowHide

#===============================================================================
#===============================================================================
# Vx To Xp Char Converter
# Version 1.0
# Author game_guy
#-------------------------------------------------------------------------------
# Intro
# Converts the little vx guys to xp format.
#
# Features
# Converts the 12x8 frame chars (ones with 8 people)
# Converts the 3x4 frame chars (the single person)
#
# Instructions
# Just place character files in the Chars/12x8 folder for 12x8 chars.
# Place files in Chars/3x4 folder for 3x4 chars.
# Then run the game, it'll convert it for you.
#
# Credits
# game_guy ~ for making it
# Fantasist ~ teaching me how to get files from folder, and how to use bitmap to
#             png code
# 66rpg ~ for their bitmap to png code
#
#===============================================================================
=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
module GameGuy
 def self.vxconvert(file)
   begin
     char = GameGuy.character(file, 0)
   rescue
     $skipped += 1
     return
   end
   width = char.width / 4
   height = char.height / 2
   vxwidth = width / 3
   index = 0
   xx = 0
   yy = 0
   unless FileTest.directory?("Converted/#{file}/")
     Dir.mkdir("Converted/#{file}/")
   end
   loop do
     bitmap = Bitmap.new(width + vxwidth, height)
     rect1 = Rect.new(xx+vxwidth, yy, vxwidth, height)
     bitmap.blt(0, 0, char, rect1)
     rect2 = Rect.new(xx, yy, width, height)
     bitmap.blt(vxwidth, 0, char, rect2)
     bitmap.make_png("#{file} #{index}", "Converted/#{file}/")
     bitmap.dispose
     bitmap = nil
     if index == 7
       $converted += 1
       break
     end
     index += 1
     case index
     when 0,4
       xx = width*0
     when 1,5
       xx = width*1
     when 2,6
       xx = width*2
     when 3,7
       xx = width*3
     end
     if index == 4
       yy = height
     end
   end
 end
 def self.svxconvert(file)
   begin
     char = GameGuy.scharacter(file, 0)
   rescue
     $skipped += 1
     return
   end
   width = char.width / 3
   height = char.height
   bitmap = Bitmap.new(width * 4, height)
   rect1 = Rect.new(width, 0, width, height)
   bitmap.blt(0, 0, char, rect1)
   rect2 = Rect.new(0, 0, width * 3, height)
   bitmap.blt(width, 0, char, rect2)
   unless FileTest.directory?("Converted/#{file}/")
     Dir.mkdir("Converted/#{file}/")
   end
   bitmap.make_png("#{file}", "Converted/#{file}/")
   $converted += 1
 end
end
module GameGuy
   @cache = {}
   def self.load_bitmap(folder_name, filename, hue = 0)
     path = folder_name + filename
     if not @cache.include?(path) or @cache[path].disposed?
       if filename != ""
         @cache[path] = Bitmap.new(path)
       else
         @cache[path] = Bitmap.new(32, 32)
       end
     end
     if hue == 0
       @cache[path]
     else
       key = [path, hue]
       if not @cache.include?(key) or @cache[key].disposed?
         @cache[key] = @cache[path].clone
         @cache[key].hue_change(hue)
       end
       @cache[key]
     end
   end
   def self.character(filename, hue)
     self.load_bitmap("Chars/12x8/", filename, hue)
   end
   def self.scharacter(filename, hue)
     self.load_bitmap("Chars/3x4/", filename, hue)
   end
 end

begin
 
 unless FileTest.directory?("Converted")
   Dir.mkdir("Converted")
 end
 $time = Time.now
 $converted = 0
 $skipped = 0
 @names = []
 dir = Dir.new('Chars/12x8/')
 dir.entries.each {|file| next unless file.include?('.png')
 @names.push(file); GameGuy.character(file, 0)}
 for i in 0...@names.size
   GameGuy.vxconvert(@names[i])
 end
 @names = []
 dir = Dir.new('Chars/3x4/')
 dir.entries.each {|file| next unless file.include?('.png')
 @names.push(file); GameGuy.scharacter(file, 0)}
 for i in 0...@names.size
   GameGuy.svxconvert(@names[i])
 end
 print "Converted #{$converted} files in #{Time.now - $time} seconds" + "\n" +
       "Total Skipped Files: #{$skipped}"
 exit
end



Instructions
FIRST MAKE SURE THESE FOLDERS ARE CREATED IN THE ROOT OF THE GAME
Chars/12x8/
Chars/3x4/
Demo includes them

Just place character files in the Chars/12x8 folder for 12x8 chars.
(http://img199.imageshack.us/img199/9186/re1qq.png)
Place files in Chars/3x4 folder for 3x4 chars.
(http://img34.imageshack.us/img34/5246/soldierq.png)
Then run the game, it'll convert it for you.


Compatibility

Should work with anything.
Not tested with SDK


Credits and Thanks




Author's Notes

Give credits and Enjoy
Title: Re: [XP] Vx To Xp Char Converter
Post by: Fantasist on August 14, 2009, 12:20:10 pm
You've released it, eh? Good job! How about splitting up icon sheets? It isn't too much trouble to add. You could also try converting the autotile sheets. *levels up*
Title: Re: [XP] Vx To Xp Char Converter
Post by: G_G on August 14, 2009, 12:26:58 pm
Yea I'm working on the icon one, and maybe autotiles, heck maybe tilesets...hmm..well I'll see
Title: Re: [XP] Vx To Xp Char Converter
Post by: Blizzard on August 15, 2009, 03:36:21 am
<3 for this script.
Title: Re: [XP] Vx To Xp Char Converter
Post by: G_G on August 23, 2009, 12:41:46 pm
Temporarily locking topic, I'm going to turn this into an Xp to Vx converter. Converts chars, tiles, icons, and anything else I can think of.
Title: Re: [XP] Vx To Xp Char Converter
Post by: G_G on October 01, 2009, 07:03:30 pm
Okay I'm just letting you guys know some progress I made...Here's what it does

-Converts 3x4 and 12x8 Characters
-Converts any icon sheet of any size
-Converts face sets into individual pictures

Now I had some ideas here...I was thinking maybe also making the converter convert the normal rvdata to rxdata like weapons, items, actors, skills, armors to the best it can.

I dont want to implement this feature until I get a few yeses and I'm not going to release the new version until I clean up the code quite a bit and when I'm done finishing the update for the achievement script.
Title: Re: [XP] Vx To Xp Char Converter
Post by: Neko Hibiki on May 25, 2010, 03:48:15 am
Quote from: game_guy on October 01, 2009, 07:03:30 pm
-Converts face sets into individual pictures


Got anything that converts XP individual pictures into VX face sets, that'd be really useful?