SNES Development
Useful Ruby Snippets

Useful Ruby Snippets

These are useful code snippets I’ve used when working with SNES data and don’t want to forget them. Some examples are not optimized as much as they could be in order to help keep the functionality clear.

Command Line Script Template

Useful for running a script from the command line.
Used like:
./secret_of_mana_decompress.rb som-font-compressed.gfx som-font-uncompressed.gfx

#!/usr/bin/env ruby
if ARGV.size < 2
  puts("[!] I need both an input file and an output file.")
  exit
end

input_file  = ARGV[0]
output_file = ARGV[1]

puts "[*] Input:       #{ARGV[0]}"
puts "[*] Output:      #{ARGV[1]}"

Reading Header Data

Not specifically for a header, but reading subsequent bytes from a file.

@compression_type
@compressed_data
@uncompressed_size

File.open(input_file, "rb") do |f|
  bytes = f.read(2)
  @compression_type = bytes[1] << 8 | bytes[0]
  puts "[*] Format:      " + "%x" % @compression_type

  bytes = f.read(2)
  @uncompressed_size = bytes[0] << 8 | bytes[1]
  puts "[*] Output Size: " + "%d bytes" % @uncompressed_size

  @compressed_data = f.read()
  puts "[*] Compressed Data:  " + "%d bytes" % @compressed_data.length
end

Viewing Data as Hexadecimal

There are many ways to do this.

@uncompressed_data.map { |x| x.nil? ? '__' : "%02X" % x }.join

Writing data to File

There are many ways to do this.

File.open(output_file, "wb") do |output|
  @uncompressed_data.each do |byte|
    output.print byte.chr
  end
end