Pushover Theme Table Format
THEMES/THEME.KEY is a 320-byte uncompressed table used by Pushover for menu/level counts and theme-to-music selection. It is not an encryption key.
File format
| Offset | Data type | Description |
|---|---|---|
| 0x00 | UINT16BE[26] | Menu/count values |
| 0x34 | BYTE[12] | Zero padding |
| 0x40 | CHAR[12][16] | NUL-padded name records |
| 0x100 | BYTE[64] | Zero tail; four further empty name-sized slots |
Count values
1 2 3 4 5 6 7 8 1 2 3 4 5 6 7 10 11 20 29 43 55 62 77 88 99 100
The ten words starting at 0x20 are cumulative world boundaries. The first word, masked with 0x7F, is used as a seed by the menu logic. Do not interpret all 26 values as one monotonic list.
Music names
Slots 0–11 are OPTION, MECHANIC, TITLE, CASTLE, JAPANESE, PRIZE, GREEK, AZTEC, SPACE, TOXCITY, ELECTRO, DUNGEON. A name match at slot i sets pending selection i+1; the game subsequently sends (pending−1) % 13 to the driver. See Pushover Music Format for the AdLib driver's invalid slot-zero caveat.
These names are not an ordered list of worlds. CAVERN has real art but no matching name here; the documented scan found no CAVERN theme among the 103 screen files examined. The ten world buckets also need not correspond one-to-one with distinct art themes.
Notes
The music-name interpretation was confirmed with live SPACE and TOXCITY selections. Older notes identifying the same runtime buffer as permanently containing staff credits were superseded: the buffer is reused.
Source code
From pushover, the open-source browser port and its reverse-engineering notes:
- docs/formats/theme-key.md – reverse-engineering documentation
- docs/formats/level-order.md – reverse-engineering documentation
- engine/src/core/levelOrder.js – level mapping
- engine/viewer/music.js – music explorer
Credits
This file format was reverse engineered by VorticonCmdr. If you find this information helpful in a project you're working on, please give credit where credit is due. (A link back to this wiki would be nice too!)