home *** CD-ROM | disk | FTP | other *** search
/ Xentax forum attachments archive / xentax.7z / 4427 / aisp_memo-20090510.7z / script_decoder / decoder.rb next >
Encoding:
Ruby Source  |  2009-01-28  |  1.8 KB  |  74 lines

  1. #!/usr/bin/env ruby
  2. # $Revision: 1.2 $
  3.  
  4. require 'nkf'
  5. NKF_OPT = '-W16L --unix'    # UNIX═╤
  6. #NKF_OPT = '-W16L --windows'    # Windows═╤
  7.  
  8. # Ñ╣Ñ»ÑΘÑ≤Ñ╓ÑδÑ╟í╝Ñ┐ñ╬╝■┤ⁿ
  9. PERIOD = 20
  10. # Ñ╖Ñ░Ñ═Ñ┴Ñπñ╬─╣ñ╡
  11. SIGNATURE_SIZE = 4
  12.  
  13. # Ñ╣Ñ»ÑΘÑ≤Ñ╓ÑδÑ╟í╝Ñ┐
  14. jammer = Array.new(20)
  15.  
  16. ARGV.each do |arg|
  17.   # Ñ┘í╝Ñ╣Ñ╒ÑíÑñÑδ╠╛ñ≥╞└ñδ
  18.   if arg =~ /^(.*)\.[^.]+$/
  19.     basename = $1
  20.   else
  21.     basename = arg
  22.   end
  23.  
  24.   # *.txtÑ╒ÑíÑñÑδñ≥╞╔ñ▀╣■ñ▀
  25.   fd = open(arg);
  26.   raw = fd.sysread(fd.stat.size)
  27.   fd.close
  28.   uu = raw.unpack('C*')
  29.  
  30.   # Ñ╪Ñ├Ñ└▓≥└╧
  31.   chardef_size = uu[12] | (uu[13] << 8) | (uu[14] << 16) | (uu[15] << 24)
  32.   drama_size = uu[16] | (uu[17] << 8) | (uu[18] << 16) | (uu[19] << 24)
  33.   header_size = uu[20] | (uu[21] << 8) | (uu[22] << 16) | (uu[23] << 24)
  34.  
  35.   header_start = SIGNATURE_SIZE
  36.   chardef_start = header_start + header_size
  37.   drama_start = chardef_start + chardef_size
  38.  
  39.   chardef_end = chardef_start + chardef_size - 4
  40.   drama_end = drama_start + drama_size - 4
  41.  
  42.   # Ñ╣Ñ»ÑΘÑ≤Ñ╓ÑδÑ╟í╝Ñ┐ñ≥╝Φ╞└
  43.   (0 ... PERIOD).each do |i|
  44.     jammer[i] = uu[uu.length - PERIOD + i]
  45.   end
  46.  
  47.   # Ñ╔ÑΘÑ▐ñ½ñ┴ñσí╝ñ≤ñ½╚╜─Ω
  48.   type = (chardef_size > 0) ? 'drama' : 'tune'
  49.  
  50.   # Ñ¡ÑπÑΘÑ»Ñ┐─Ω╡┴╔⌠ñ≥╜╨╬╧
  51.   if type == 'drama'
  52.     (chardef_start ... chardef_end).each do |pos|
  53.       uu[pos] = (uu[pos] - jammer[(pos - chardef_start) % PERIOD]) & 0xff
  54.     end
  55.     out = open("#{basename}_chara.txt", "w")
  56.     utf = uu[chardef_start, chardef_end - chardef_start].pack("C*")
  57.     out.print NKF.nkf(NKF_OPT, utf)
  58.     out.close
  59.   end
  60.  
  61.   # Ñ╔ÑΘÑ▐╔⌠ñ≥╜╨╬╧
  62.   (drama_start ... drama_end).each do |pos|
  63.     uu[pos] = (uu[pos] - jammer[(pos - drama_start) % PERIOD]) & 0xff
  64.   end
  65.   if type == 'drama'
  66.     out = open("#{basename}_drama.txt", "w")
  67.   else
  68.     out = open("#{basename}_tune.txt", "w")
  69.   end
  70.   utf = uu[drama_start, drama_end - drama_start].pack("C*")
  71.   out.print NKF.nkf(NKF_OPT, utf)
  72.   out.close
  73. end
  74.