module RGSSAD
Constants
- ENC_FILE
- RGSSAD_File
Public Class Methods
add_file(file_contents, filename)
click to toggle source
# File lib/rgss3/rgss3a.rb, line 41 def self.add_file(file_contents, filename) file = RGSSAD_File.new file.filename = filename file.filename_size = filename.size file.file = file_contents file.file_size = file_contents.size @@files.delete_if {|f| f.filename == file.filename} @@files << file @@files.sort! {|a,b| a.filename <=> b.filename} end
decrypt()
click to toggle source
# File lib/rgss3/rgss3a.rb, line 12 def self.decrypt return unless File.exists?(ENC_FILE) @@files.clear rgssad = '' File.open(ENC_FILE, 'rb') {|file| file.read(8) @@orig_xor = file.read(4).unpack('L*') * 9 + 3 if ENC_FILE == "Game.rgss3a" rgssad = file.read } rgssad = self.parse_rgssad(rgssad, true) offset = 0 while rgssad[offset] != nil file = RGSSAD_File.new file.filename_size = rgssad[offset, 4].unpack('L')[0] offset += 4 file.filename = rgssad[offset, file.filename_size] offset += file.filename_size file.file_size = rgssad[offset, 4].unpack('L')[0] offset += 4 file.file = rgssad[offset, file.file_size] @@files << file offset += file.file_size end end
encrypt()
click to toggle source
# File lib/rgss3/rgss3a.rb, line 52 def self.encrypt return if @@files.empty? && !File.exists?(ENC_FILE) rgssad = '' @@files.each do |file| rgssad << [file.filename_size].pack('L') rgssad << file.filename rgssad << [file.file_size].pack('L') rgssad << file.file end File.open(ENC_FILE, 'wb') do |file| file.print("RGSSAD\0\1") file.print(self.parse_rgssad(rgssad, false)) end end
files()
click to toggle source
# File lib/rgss3/rgss3a.rb, line 37 def self.files @@files end
Private Class Methods
next_key()
click to toggle source
# File lib/rgss3/rgss3a.rb, line 69 def self.next_key if ENC_FILE == "Game.rgss3a" @@rgss3a_xor = (@@rgss3a_xor * 7 + 3) & 0xFFFFFFFF else @@xor = (@@xor * 7 + 3) & 0xFFFFFFFF end end
parse_rgssad(string, decrypt)
click to toggle source
# File lib/rgss3/rgss3a.rb, line 81 def self.parse_rgssad(string, decrypt) @@xor = 0xDEADCAFE @@rgss3a_xor = @@orig_xor new_string = '' offset = 0 remember_offsets = [] remember_keys = [] remember_size = [] while string[offset] != nil namesize = string[offset, 4].unpack('L')[0] new_string << [namesize ^ used_xor].pack('L') namesize ^= used_xor if decrypt offset += 4 self.next_key filename = string[offset, namesize] namesize.times do |i| filename.setbyte(i, filename.getbyte(i) ^ used_xor & 0xFF) self.next_key end new_string << filename offset += namesize datasize = string[offset, 4].unpack('L')[0] new_string << [datasize ^ used_xor].pack('L') datasize ^= used_xor if decrypt remember_size << datasize offset += 4 self.next_key data = string[offset, datasize] new_string << data remember_offsets << offset remember_keys << used_xor offset += datasize end remember_offsets.size.times do |i| offset = remember_offsets[i] used_xor = remember_keys[i] size = remember_size[i] data = new_string[offset, size] data = data.ljust(size + (4 - size % 4)) if size % 4 != 0 s = '' data.unpack('L' * (data.size / 4)).each do |j| s << ([j ^ used_xor].pack('L')) self.next_key end new_string[offset, size] = s.slice(0, size) end return new_string end
used_xor()
click to toggle source
# File lib/rgss3/rgss3a.rb, line 77 def self.used_xor ENC_FILE == "Game.rgss3a" ? @@rgss3a_xor : @@xor end