{"id":15047574,"url":"https://github.com/lethal-guitar/saucermapviewer","last_synced_at":"2026-03-05T18:38:19.402Z","repository":{"id":256212271,"uuid":"841614031","full_name":"lethal-guitar/SaucerMapViewer","owner":"lethal-guitar","description":"Map viewer and asset exporter for Attack of the Saucerman","archived":false,"fork":false,"pushed_at":"2024-12-27T13:51:35.000Z","size":632,"stargazers_count":3,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"main","last_synced_at":"2025-04-03T10:37:20.368Z","etag":null,"topics":["cpp","cpp17","game-development","opengl","reverse-engineering"],"latest_commit_sha":null,"homepage":"","language":"C++","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"gpl-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/lethal-guitar.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":"2024-08-12T19:00:11.000Z","updated_at":"2024-12-27T13:51:23.000Z","dependencies_parsed_at":"2024-09-09T16:44:38.582Z","dependency_job_id":"7cff5dfb-8c9f-4a38-ac4c-14f75328a5ba","html_url":"https://github.com/lethal-guitar/SaucerMapViewer","commit_stats":{"total_commits":21,"total_committers":2,"mean_commits":10.5,"dds":"0.19047619047619047","last_synced_commit":"a4ed8a34670f006608a7f404454d16f1fa75e59e"},"previous_names":["lethal-guitar/saucermapviewer"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lethal-guitar%2FSaucerMapViewer","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lethal-guitar%2FSaucerMapViewer/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lethal-guitar%2FSaucerMapViewer/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/lethal-guitar%2FSaucerMapViewer/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/lethal-guitar","download_url":"https://codeload.github.com/lethal-guitar/SaucerMapViewer/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":254349530,"owners_count":22056369,"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":["cpp","cpp17","game-development","opengl","reverse-engineering"],"created_at":"2024-09-24T21:00:29.507Z","updated_at":"2026-03-05T18:38:19.299Z","avatar_url":"https://github.com/lethal-guitar.png","language":"C++","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Map viewer and asset exporter for Attack of the Saucerman\n\nI'm working on reverse engineering the file formats of the 1999 game [Attack of the Saucerman](https://en.wikipedia.org/wiki/Attack_of_the_Saucerman) (Windows version). This repository contains the results of this work so far:\n\n* [Map viewer](#map-viewer)\n* [Asset exporter](#asset-exporter)\n* [File format specifications](/file_format_specs.md)\n\nAll of this is work in progress and not complete yet.\n\n\u003cimg src=\"images/screenshot.png\" width=\"400\" /\u003e \u003cimg src=\"images/screenshot2.png\" width=\"400\" /\u003e\n\n\n\n## Map viewer\n\nThe map viewer is written in C++, and uses SDL+OpenGL. It's currently fairly basic: It can open and display all of the game's level files, but it can't display all elements of a map yet, and only offers very basic camera movement.\n\nUse the up/down arrow keys to move forwards/backwards, and left/right to turn. Holding shift + arrow up/down allows moving up and down vertically.\n\n### What works\n\n* Displaying terrain, level geometry, and 3D models\n* Basic tank-control style camera movement\n* Toggling display of different elements\n\n### What's missing\n\n* Displaying billboard sprites\n* Texture animations\n* Handling translucent surfaces\n* Lighting (texture brightness adjustments)\n* Displaying entities and other map elements\n* More flexible camera movement (looking up/down, mouse look?)\n\n### How to run it\n\nBuilding the map viewer requires CMake, SDL2, and a C++-17 capable compiler.\nOn Windows, the SDL dependency can be installed using vcpkg, on Linux/Mac it's available via the usual package managers.\nThe build process is standard CMake fare. For example (using the Ninja build tool):\n\n```bash\nmkdir build\ncd build\ncmake .. -GNinja\nninja\n```\n\nThe resulting binary, `bin/SaucerMapViewer`, accepts the path to a map file as command line argument. On Windows, you can also drag a map file onto the executable to launch it.\n\n\n## Asset exporter\n\nThe asset exporter is a Python script. It reads files in the game's `wad` format (unrelated to Doom WADs), and currently unpacks the following assets:\n\n* Textures and other images (converted to PNG files)\n* 3D models (converted to glTF files)\n* Sound effects (exported as WAVE files)\n\nThe exported 3D models currently don't support translucent surfaces, and aren't the most efficient representation.\n\nThe script requires Python 3 and the [Pillow](https://python-pillow.org/) library, which can be installed using PIP (`pip install Pillow`).\n\nTo use the script, first unpack the game's main data container `Saucerdata.pak`. This is basically just a ZIP file, and most standard tools should be able to extract it (I had trouble using 7zip, but Linux `unzip` and Windows Explorer's built-in ZIP support worked fine).\nAfter that, invoke the script on the desired WAD file by passing its path as a command-line argument.\nThe dumped files are placed into a new directory called `\u003cwad_file_name\u003e_exported`.\n\nFor example, to unpack the first level's assets:\n\n```bash\nunzip Saucerdata.pak\npython3 dump_wad_file.py LEVELS/ar51_1.wad\n```\n\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flethal-guitar%2Fsaucermapviewer","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Flethal-guitar%2Fsaucermapviewer","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Flethal-guitar%2Fsaucermapviewer/lists"}