{"id":19764275,"url":"https://github.com/theobori/tinywad","last_synced_at":"2025-09-13T14:45:35.176Z","repository":{"id":159528885,"uuid":"565612168","full_name":"theobori/tinywad","owner":"theobori","description":"🩸 A library to manage WAD for DOOM based game","archived":false,"fork":false,"pushed_at":"2024-06-12T19:08:54.000Z","size":2606,"stargazers_count":2,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2024-10-31T11:39:21.370Z","etag":null,"topics":["composer","doom","iwad","library","manager","modding","pwad","rust"],"latest_commit_sha":null,"homepage":"https://crates.io/crates/tinywad","language":"Rust","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/theobori.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-11-13T23:36:32.000Z","updated_at":"2024-06-12T19:08:57.000Z","dependencies_parsed_at":"2024-06-13T00:22:47.363Z","dependency_job_id":"275d6b47-20ff-45ea-9e62-16dbba141221","html_url":"https://github.com/theobori/tinywad","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theobori%2Ftinywad","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theobori%2Ftinywad/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theobori%2Ftinywad/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/theobori%2Ftinywad/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/theobori","download_url":"https://codeload.github.com/theobori/tinywad/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":224214045,"owners_count":17274524,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["composer","doom","iwad","library","manager","modding","pwad","rust"],"created_at":"2024-11-12T04:13:00.583Z","updated_at":"2024-11-12T04:13:00.656Z","avatar_url":"https://github.com/theobori.png","language":"Rust","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 🩸 tinywad\n\n![build](https://github.com/theobori/tinywad/actions/workflows/build.yml/badge.svg)\n\n\nA library to manage WAD for DOOM based game. It has been tested with the following IWAD:\n- DOOM.WAD\n- DOOM2.WAD\n- HEXEN.WAD\n- CHEX.WAD\n- TNT.WAD\n- PLUTONIA.WAD\n- STRIFE0.WAD\n- STRIFE1.WAD\n- DOOMU.WAD\n- DOOM2F.WAD\n- HEXDD.WAD\n\nIt supports the following features:\n- Load WAD buffer/file\n- Extract lump raw content\n- Extract lump as original files (PNGs)\n- Extract the image lumps with a custom color palette\n- Update lump raw content\n- Build a IWAD/PWAD\n- Add/insert lumps then save the WAD file\n\n## 📖 How to build and run ?\n\n1. Install the dependencies\n    - `cargo`\n\n## ⭐ Use cases\n\n#### Patching directly the IWAD\n\n```rust\nuse tinywad::error::WadError;\nuse tinywad::models::operation::WadOp;\nuse tinywad::wad::Wad;\n\nfn main() -\u003e Result\u003c(), WadError\u003e {\n    let mut doom_2 = Wad::new();\n    doom_2.load_from_file(\"doom2.wad\")?;\n\n    let gate = doom_2.lump(\"GATE3\").unwrap();\n\n    let mut doom_1 = Wad::new();\n    doom_1.load_from_file(\"doom1.wad\")?;\n\n    doom_1.select(\"^FLAT|FLOOR\");\n    doom_1.update_lumps_raw(\u0026gate.data().buffer);\n    doom_1.save(\"doom1.wad\");\n\n    Ok(())\n}\n```\n\n#### Screenshot(s)\n\n\u003cimg src=\"/assets/doom_gate3.png\" width=\"60%\"\u003e\n\n#### Extracting lumps with custom palettes\n\n```rust\nuse std::fs;\n\nuse tinywad::dir::MAX_PAL;\nuse tinywad::error::WadError;\nuse tinywad::models::operation::WadOp;\nuse tinywad::wad::Wad;\n\nfn main() -\u003e Result\u003c(), WadError\u003e {\n    let mut doom_2 = Wad::new();\n    doom_2.load_from_file(\"doom2.wad\")?;\n\n    for pal in 0..MAX_PAL {\n        doom_2.set_palette(pal);\n        doom_2.reload()?;\n        doom_2.select(\"^BOSF\");\n        \n        let dirpath = format!(\"doom2/pal_{}\", pal);\n\n        fs::create_dir_all(dirpath.clone()).unwrap();\n\n        doom_2.save_lumps(dirpath);\n    }\n\n    Ok(())\n}\n```\n\n#### Extracted lumps (as PNGs)\n\n\u003cp float=\"left\"\u003e\n    \u003cimg src=\"/assets/doom2/pal_0/BOSFB0.png\"\u003e\n    \u003cimg src=\"/assets/doom2/pal_1/BOSFB0.png\"\u003e\n    \u003cimg src=\"/assets/doom2/pal_2/BOSFB0.png\"\u003e\n    \u003cimg src=\"/assets/doom2/pal_3/BOSFB0.png\"\u003e\n    \u003cimg src=\"/assets/doom2/pal_4/BOSFB0.png\"\u003e\n    \u003cimg src=\"/assets/doom2/pal_5/BOSFB0.png\"\u003e\n    \u003cimg src=\"/assets/doom2/pal_6/BOSFB0.png\"\u003e\n    \u003cimg src=\"/assets/doom2/pal_7/BOSFB0.png\"\u003e\n    \u003cimg src=\"/assets/doom2/pal_8/BOSFB0.png\"\u003e\n    \u003cimg src=\"/assets/doom2/pal_9/BOSFB0.png\"\u003e\n    \u003cimg src=\"/assets/doom2/pal_10/BOSFB0.png\"\u003e\n    \u003cimg src=\"/assets/doom2/pal_11/BOSFB0.png\"\u003e\n    \u003cimg src=\"/assets/doom2/pal_12/BOSFB0.png\"\u003e\n\u003c/p\u003e\n\n#### Building a PWAD from scratch\n\n```rust\nuse tinywad::error::WadError;\nuse tinywad::lump::{LumpAdd, LumpAddKind};\nuse tinywad::models::operation::WadOp;\nuse tinywad::wad::{Wad, WadKind,};\n\nfn main() -\u003e Result\u003c(), WadError\u003e {\n    let mut src = Wad::new();\n\n    let lump_names = [\n        \"FLOOR0_1\", \"FLOOR0_3\", \"FLOOR0_6\",\n        \"FLOOR1_1\", \"FLOOR1_7\", \"FLOOR3_3\",\n        \"FLOOR4_1\", \"FLOOR4_5\", \"FLOOR4_6\",\n        \"FLOOR4_8\", \"FLOOR5_1\", \"FLOOR5_2\",\n        \"FLOOR5_3\", \"FLOOR5_4\", \"FLOOR6_1\",\n        \"FLOOR6_2\", \"FLOOR7_1\", \"FLOOR7_2\",\n    ];\n\n    src.load_from_file(\"doom.wad\")?;\n\n    let gate = src.lump(\"FLOOR6_1\").unwrap();\n\n    let mut dest = Wad::new();\n\n    dest.set_kind(WadKind::Pwad);\n    dest.add_lump_raw(\n        LumpAdd::new(\n            LumpAddKind::Back,\n            \u0026vec![],\n            \"FF_START\",\n        )\n    )?;\n\n    for lump_name in lump_names {\n        dest.add_lump_raw(\n            LumpAdd::new(\n                LumpAddKind::Back,\n                \u0026gate.data().buffer,\n                lump_name,\n            )\n        )?;\n    }\n\n    dest.add_lump_raw(\n        LumpAdd::new(\n            LumpAddKind::Back,\n            \u0026vec![],\n            \"F_END\",\n        )\n    )?;\n\n    dest.save(\"doom1_patch.wad\");\n\n    Ok(())\n}\n```\n\n\u003cimg src=\"/assets/doom_floor6_1.png\" width=\"60%\"\u003e\n\n#### Dumping metadata\n\n```rust\nuse tinywad::error::WadError;\nuse tinywad::models::operation::WadOp;\nuse tinywad::wad::Wad;\n\nfn main() -\u003e Result\u003c(), WadError\u003e {\n    let mut src = Wad::new();\n\n    src.load_from_file(\"hexen.wad\")?;\n    src.dump();\n\n    Ok(())\n}\n```\n\n#### Output\n\n```\nName: XXTIC, Size: 8, Offset: 12\nName: STARTUP, Size: 153648, Offset: 20\nName: PLAYPAL, Size: 21504, Offset: 153668, Palettes amount: 28\nName: COLORMAP, Size: 8704, Offset: 175172\nName: FOGMAP, Size: 8704, Offset: 183876\nName: TINTTAB, Size: 65536, Offset: 192580\nName: TRANTBL0, Size: 256, Offset: 258116\nName: TRANTBL1, Size: 256, Offset: 258372\nName: TRANTBL2, Size: 256, Offset: 258628\n...\n```\n\n## 🪧 Supported lump types\n\n- DOOM image(s)\n- Flat\n- Palette\n- Markers\n- Music\n\n## ✅ Todo\n\nName           | State\n-------------  | :-------------:\nDump WAD header | ✅\nDump lumps metadata | ✅\nExtract (save) lump | ✅\nUpdate lump from raw buffer/file| ✅\nUpdate lump from original buffer/files (PNG, MIDI, etc..) | ❌\nRebuild then save the WAD as a new file | ✅\nExtract DOOM musics | ✅\nExtract raw lump | ✅\nRemove lumps | ✅\nAdd lump unique coherent IDs | ✅\nUpdate lump size in the metadatas | ✅\nAdd lump with raw buffer | ✅\n\n## ℹ️ Documentation\n\nRun `cargo doc --open` to read the documentation in the browser.\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheobori%2Ftinywad","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Ftheobori%2Ftinywad","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Ftheobori%2Ftinywad/lists"}