#wad #doom #patch #lib #color-palette #lumps

tinywad

一个用于管理/合成 WAD 资源的库

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 图像

MIT 许可证

64KB
1.5K SLoC

🩸 tinywad

build

一个用于管理基于 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 文件

📖 如何构建和运行 ?

  1. 安装依赖项
    • 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