class NWN::Key::Key

Attributes

bif[R]

An array of Bif objects contained in this key index. Not needed to access individual files, use Container#content instead.

day_of_year[R]
file_type[R]
file_version[R]
year[R]

Public Class Methods

new(io, data_path) click to toggle source

Creates a new Key wrapper. The parameters exepected are an IO object pointing to the .key-file, and the base path in which your data/.bif files can be found. (This is usually your NWN directory, NOT the data/ directory).

Calls superclass method NWN::Resources::Container::new
# File lib/nwn/key.rb, line 67
def initialize io, data_path
  super()

  @root = data_path
  @bif = []

  @file_type, @file_version,
    bif_count, key_count,
    offset_to_file_table, offset_to_key_table,
    @year, @day_of_year, reserved =
    io.e_read(8 + (4 * 6) + 32, "header").unpack("A4 A4 VVVVVV a32")

  io.seek(offset_to_file_table)
  data = io.e_read(12 * bif_count, "bif data")

  # Contains all bifs linked in this key
  i = 0
  @file_table = []
  while (x = data[i, 12]) && x.size == 12
    i += 12
    size, name_offset, name_size, drives = x.unpack("VVvv")
    io.seek(name_offset)
    name = io.e_read(name_size, "name table").unpack("A*")[0]
    name.gsub!("\\", File::SEPARATOR)
    name = File.expand_path(@root + File::SEPARATOR + name)

    _io = File.new(name, "r")
    @bif << Bif.new(self, _io)

    @file_table << [size, name, drives]
  end

  @key_table = {}
  io.seek(offset_to_key_table)
  data = io.e_read(22 * key_count, "key table")
  i = 0
  while (x = data[i, 22]) && x.size == 22
    i += 22
    resref, res_type, res_id = x.unpack("A16 v V")
    @key_table[res_id] = [resref, res_type]
  end

  @fn_to_co = {}
  @key_table.each {|res_id, (resref, res_type)|
    bif_index = res_id >> 20
    bif = @bif[bif_index]
    id = res_id & 0xfffff
    bif.contained[id] or fail "#{bif} does not have #{id}"
    ofs, sz, _rt = bif.contained[id]
    o = NWN::Resources::ContentObject.new(resref, res_type, bif.io, ofs, sz)
    if @fn_to_co[o.filename] && @fn_to_co[o.filename][2] < bif_index
      oo, biff = @fn_to_co[o.filename]
      # NWN.log_debug "#{o.filename} in #{biff.io.inspect} shadowed by file of same name in #{bif.io.inspect}"
      remove oo
    end
    @fn_to_co[o.filename] = [o, bif, bif_index]
    add o
  }
end