#image #gta #gta

bin+lib gta-img

gta-img 是一个用于读取《侠盗猎车手》3D宇宙时代的IMG/DIR文件的库

1 个不稳定版本

0.1.0 2024年5月6日

#934 in 解析实现

MIT 许可证

19KB
387

gta-img

gta-img 是一个基于 Rust 的库,用于从 IMG 归档(以及补充的 DIR 文件)中读取数据。

概述

对于所有早期的基于 3D 的《侠盗猎车手》游戏,它们的大多数资源(如模型和纹理)都存储在 img 文件中(对于较老的游戏,还有一个伴随的 dir 文件),这实际上是一个包含每个条目元数据和条目本身的整个内容的单个归档。这些文件的结构相对简单:实际上包含条目的名称,以及它的偏移量和长度。然而,这些条目存储在 2048 字节的扇区对齐部分中,就像典型的 磁盘扇区 一样。在启动时,游戏将根据需要将归档内容读取到内存中。

有关格式的更多文档以及额外的阅读材料,可以从 gtamods.com 上的非常有帮助的 IMG 归档 文章中获取。

用法

遍历归档中每个条目的元数据

let mut img = File::open("gta3.img").expect("failed to open img");
let mut dir = File::open("gta3.dir").expect("failed to open dir");

gta_img::read(V1Reader::new(&mut dir, &mut img))
	.expect("failed to read archive")
	.iter()
	.for_each(|entry| {
		println!("{} - offset: {}, length: {}", entry.name, entry.off, entry.len);
	})

打开归档中的每个条目进行读取

let mut img = File::open("gta3.img").expect("failed to open img");
let mut archive = gta_img::read(V2Reader::new(&mut img)).expect("failed to read archive");

for index in 0..archive.len() {
	let mut source = archive.open(index).expect("failed to open entry");
	let mut dest = io::empty();

	io::copy(&mut source, &mut dest).expect("failed to copy entry");
}

支持

目前,该库支持读取 V1 和 V2 格式的归档,这扩展到支持以下游戏

  • 《侠盗猎车手:III
  • 《侠盗猎车手: Vice City
  • 《侠盗猎车手: San Andreas
  • Bully: Scholarship Edition (仅限 PC)

补充

在仓库中还包含一个基于 Rust 的命令行应用程序示例,可以用于对 IMGDIR 文件执行一些基本操作,即检查和提取。

gta-img inspect v1 gta3.img gta3.dir
gta-img extract --target out v1 gta3.img gta3.dir

依赖关系

~1.3–2MB
~36K SLoC