[XP] Vx To Xp Char Converter

Started by G_G, August 14, 2009, 12:16:59 pm

Previous topic - Next topic

G_G

August 14, 2009, 12:16:59 pm Last Edit: August 14, 2009, 12:18:44 pm by game_guy
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


  • Converts the 12x8 frame chars (ones with 8 people)
  • Converts the 3x4 frame chars (the single person)



Screenshots

Here's what it does, just an example



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.

Place files in Chars/3x4 folder for 3x4 chars.

Then run the game, it'll convert it for you.


Compatibility

Should work with anything.
Not tested with SDK


Credits and Thanks


  • 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



Author's Notes

Give credits and Enjoy

Fantasist

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*
Do you like ambient/electronic music? Then you should promote a talented artist! Help out here. (I'm serious. Just listen to his work at least!)


The best of freeware reviews: Gizmo's Freeware Reviews




G_G

Yea I'm working on the icon one, and maybe autotiles, heck maybe tilesets...hmm..well I'll see

Blizzard

Check out Daygames and our games:

King of Booze 2      King of Booze: Never Ever
Drinking Game for Android      Never have I ever for Android
Drinking Game for iOS      Never have I ever for iOS


Quote from: winkioI do not speak to bricks, either as individuals or in wall form.

Quote from: Barney StinsonWhen I get sad, I stop being sad and be awesome instead. True story.

G_G

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.

G_G

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.

Neko Hibiki

May 25, 2010, 03:48:15 am #6 Last Edit: May 25, 2010, 03:50:21 am by Neko Hibiki
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?