4 个版本
0.1.3 | 2024年6月12日 |
---|---|
0.1.2 | 2023年6月9日 |
0.1.1 | 2023年5月7日 |
0.1.0 | 2023年5月5日 |
#157 in 图像
64KB
1.5K SLoC
🩸 tinywad
一个用于管理基于 DOOM 游戏的 WAD 的库。它已与以下 IWAD 进行了测试:
- DOOM.WAD
- DOOM2.WAD
- HEXEN.WAD
- CHEX.WAD
- TNT.WAD
- PLUTONIA.WAD
- STRIFE0.WAD
- STRIFE1.WAD
- DOOMU.WAD
- DOOM2F.WAD
- HEXDD.WAD
它支持以下功能
- 加载 WAD 缓冲区/文件
- 提取 lump 的原始内容
- 将 lump 作为原始文件(PNG)提取
- 使用自定义颜色表提取图像 lump
- 更新 lump 的原始内容
- 构建 IWAD/PWAD
- 添加/插入 lump 然后保存 WAD 文件
📖 如何构建和运行 ?
- 安装依赖项
cargo
⭐ 用例
直接修补 IWAD
use tinywad::error::WadError;
use tinywad::models::operation::WadOp;
use tinywad::wad::Wad;
fn main() -> Result<(), WadError> {
let mut doom_2 = Wad::new();
doom_2.load_from_file("doom2.wad")?;
let gate = doom_2.lump("GATE3").unwrap();
let mut doom_1 = Wad::new();
doom_1.load_from_file("doom1.wad")?;
doom_1.select("^FLAT|FLOOR");
doom_1.update_lumps_raw(&gate.data().buffer);
doom_1.save("doom1.wad");
Ok(())
}
截图(s)
使用自定义调色板提取 lump
use std::fs;
use tinywad::dir::MAX_PAL;
use tinywad::error::WadError;
use tinywad::models::operation::WadOp;
use tinywad::wad::Wad;
fn main() -> Result<(), WadError> {
let mut doom_2 = Wad::new();
doom_2.load_from_file("doom2.wad")?;
for pal in 0..MAX_PAL {
doom_2.set_palette(pal);
doom_2.reload()?;
doom_2.select("^BOSF");
let dirpath = format!("doom2/pal_{}", pal);
fs::create_dir_all(dirpath.clone()).unwrap();
doom_2.save_lumps(dirpath);
}
Ok(())
}
提取的 lump (作为 PNG)
从头开始构建 PWAD
use tinywad::error::WadError;
use tinywad::lump::{LumpAdd, LumpAddKind};
use tinywad::models::operation::WadOp;
use tinywad::wad::{Wad, WadKind,};
fn main() -> Result<(), WadError> {
let mut src = Wad::new();
let lump_names = [
"FLOOR0_1", "FLOOR0_3", "FLOOR0_6",
"FLOOR1_1", "FLOOR1_7", "FLOOR3_3",
"FLOOR4_1", "FLOOR4_5", "FLOOR4_6",
"FLOOR4_8", "FLOOR5_1", "FLOOR5_2",
"FLOOR5_3", "FLOOR5_4", "FLOOR6_1",
"FLOOR6_2", "FLOOR7_1", "FLOOR7_2",
];
src.load_from_file("doom.wad")?;
let gate = src.lump("FLOOR6_1").unwrap();
let mut dest = Wad::new();
dest.set_kind(WadKind::Pwad);
dest.add_lump_raw(
LumpAdd::new(
LumpAddKind::Back,
&vec![],
"FF_START",
)
)?;
for lump_name in lump_names {
dest.add_lump_raw(
LumpAdd::new(
LumpAddKind::Back,
&gate.data().buffer,
lump_name,
)
)?;
}
dest.add_lump_raw(
LumpAdd::new(
LumpAddKind::Back,
&vec![],
"F_END",
)
)?;
dest.save("doom1_patch.wad");
Ok(())
}
转储元数据
use tinywad::error::WadError;
use tinywad::models::operation::WadOp;
use tinywad::wad::Wad;
fn main() -> Result<(), WadError> {
let mut src = Wad::new();
src.load_from_file("hexen.wad")?;
src.dump();
Ok(())
}
输出
Name: XXTIC, Size: 8, Offset: 12
Name: STARTUP, Size: 153648, Offset: 20
Name: PLAYPAL, Size: 21504, Offset: 153668, Palettes amount: 28
Name: COLORMAP, Size: 8704, Offset: 175172
Name: FOGMAP, Size: 8704, Offset: 183876
Name: TINTTAB, Size: 65536, Offset: 192580
Name: TRANTBL0, Size: 256, Offset: 258116
Name: TRANTBL1, Size: 256, Offset: 258372
Name: TRANTBL2, Size: 256, Offset: 258628
...
🪧 支持的 lump 类型
- DOOM 图像(s)
- 平面
- 调色板
- 标记
- 音乐
✅ Todo
名称 | 状态 |
---|---|
转储 WAD 标头 | ✅ |
转储 lump 元数据 | ✅ |
提取(保存)lump | ✅ |
从原始缓冲区/文件更新 lump | ✅ |
从原始缓冲区/文件(PNG、MIDI 等)更新 lump | ❌ |
重建然后保存 WAD 为新文件 | ✅ |
提取 DOOM 音乐 | ✅ |
提取原始 lump | ✅ |
删除 lump | ✅ |
添加 lump 独特一致 ID | ✅ |
更新元数据中的 lump 大小 | ✅ |
使用原始缓冲区添加 lump | ✅ |
ℹ️ 文档
运行 cargo doc --open
在浏览器中阅读文档。
依赖项
~10MB
~144K SLoC