#assets #parser #index-file #game-assets #regnum #champions #mmorpg

regnumassets

A crate for parsing game asset files from MMORPG Champions of Regnum

1 unstable release

0.1.0 Jan 20, 2024

#1110 in Database interfaces

MIT license

34KB
741 lines

A crate for parsing game asset files from MMORPG Champions of Regnum.

regnumassets on Crates.io Documentation License: MIT

Table of Contents

About

This crate provides a set of tools for retrieving information from a set of asset files that are located within your local installation of Champions of Regnum.

Basic Usage

Champions of Regnum comes with 2 types of asset files: index files and database files. Both of these files are located in the game installation folder and use the .idx and .sdb extensions respectively. Each file contains a given set of asset files, that could be either sounds, music, textures, etc. For each index file there's a corresponding database files. Index files do not include the assets but provide information on how to retrieve a give asset from the Database file.

The process of retrieving data from asset files consist of parsing an index file using ResourceIndex to generate a list of bookmarks, each one pointing to a particular asset in the database file. Bookmarks can later be used to retrieve the asset data from the database file.

The next example illustrates how to retrieve the list of sounds from the corresponding index file:

use anyhow::Result;
use regnumassets::{AssetType, ResourceIndex};
use std::fs::File;

fn main() -> Result<()> {
    let f = File::open("data2.idx")?;
    let index = ResourceIndex::new(f).unwrap();

    let sounds = index.filter_by_type(AssetType::Sound);

    for sound in &sounds {
        println!(
            "Resource #{}: {}",
            sound.resource_id,
            sound.name.as_deref().unwrap_or("(unnamed)".into())
        );
    }

    Ok(())
}

The ResourceIndex struct provides an API to retrieve assets either by their resource id or by their asset type. Calling these methods will get you an instance of AssetBookmark. To get data from a database file we use the AssetData struct, which has a constructor expecting the database file handle and a &AssetBookmark.

The next example shows how to obain a sound by its id and save the contents to a new file:

use anyhow::Result;
use regnumassets::{AssetData, ResourceIndex};
use std::fs::File;
use std::io::Write;

fn main() -> Result<()> {
    let f = File::open("data2.idx")?;
    let index = ResourceIndex::new(f).unwrap();

    let sound = index.get_by_resource_id(50677).unwrap();

    let f = File::open("data2.sdb")?;
    let asset = AssetData::new(&f, &sound).unwrap();

    let filename = asset.filename.unwrap();
    println!("Writing file to {}", filename);

    let mut output = File::create(filename)?;
    output.write_all(asset.bytes.unwrap().as_ref())?;
    output.flush()?;

    Ok(())
}

License

Released under the MIT License.

Disclaimer

Champions of Regnum is a registered trademark of Nimble Giant Entertainment. I don't hold any type of relation to the company or its staff.

Dependencies

~3.5MB
~119K SLoC