tiger-pkg 0.20.1

Tiger engine package reading library for Destiny 1/2 and Marathon
Documentation
use std::io::SeekFrom;

use binrw::{binrw, BinRead};

use crate::{
    package::{PackageLanguage, PackagePlatform},
    TagHash,
};

#[derive(BinRead, Debug)]
#[allow(dead_code)]
pub struct PackageHeader {
    #[br(assert(version == 24))]
    pub version: u16,
    pub platform: PackagePlatform,

    pub pkg_id: u16,
    pub _unk6: u16,
    pub _unk8: u64,
    pub build_time: u64,
    pub _unk_buildid: u32,
    pub version_major: u16,
    pub version_minor: u16,
    pub patch_id: u16,
    pub language: PackageLanguage,

    #[brw(count = 128)]
    #[br(map = |s: Vec<u8>| String::from_utf8_lossy(&s).to_string().trim_end_matches('\0').to_string())]
    pub tool_string: String,

    pub _unka4: u32,
    pub _unka8: u32,
    pub _unkac: u32,
    pub header_signature_offset: u32,

    pub entry_table_size: u32,
    pub entry_table_offset: u32,
    pub entry_table_hash: [u8; 20],

    pub block_table_size: u32,
    pub block_table_offset: u32,
    pub block_table_hash: [u8; 20],

    pub named_tag_table_size: u32,
    pub named_tag_table_offset: u32,
    pub named_tag_table_hash: [u8; 20],

    #[br(seek_before = SeekFrom::Start(0x13c))]
    pub file_size: u32,
}

#[derive(BinRead, Debug)]
#[allow(dead_code)]
pub struct EntryHeader {
    pub reference: u32,

    thing: u32,
    #[br(calc = (thing & 0xffff) as u8)]
    pub file_type: u8,
    #[br(calc = (thing >> 24) as u8)]
    pub file_subtype: u8,

    _block_info: u64,

    #[br(calc = _block_info as u32 & 0x3fff)]
    pub starting_block: u32,

    #[br(calc = ((_block_info >> 14) as u32 & 0x3FFF) << 4)]
    pub starting_block_offset: u32,

    #[br(calc = (_block_info >> 28) as u32 & 0x3FFFFFFF)]
    pub file_size: u32,
}

#[derive(Debug)]
#[binrw]
pub struct BlockHeader {
    pub offset: u32,
    pub size: u32,
    pub patch_id: u16,
    pub flags: u16,
    pub hash: [u8; 20],
}

#[derive(BinRead, Debug, Clone)]
pub struct NamedTagEntryD1 {
    pub hash: TagHash,
    pub class_hash: u32,
    pub name: [u8; 60],
}