Pushover Map Format
| Format type | Map/level |
|---|---|
| Map type | 2D tile-based |
| Layer count | 3 (background, structure, dominoes) |
| Tile size (pixels) | 16×16 |
| Viewport (pixels) | 320×200 |
| Games |
SCREENS/*.SCR contains the playable levels and menu backgrounds of Pushover. Files are RNC-compressed. All offsets below refer to decompressed bytes. Numbered levels are 3958 bytes (0xF76); menu backgrounds can have shorter tails.
File format
| Offset | Size | Description |
|---|---|---|
| 0x000 | 1560 | 20×13 row-major grid, 260 records of 6 bytes |
| 0x618 | 8 | NUL-padded ASCII theme name |
| 0x620 | 2 | Unidentified; zero in checked samples |
| 0x622 | 8 | NUL-padded music-name field; do not confuse with theme-to-track selection |
| 0x62A | 2 | Unidentified; zero in checked samples |
| 0x62C | 4 | Entry X, entry Y, exit X, exit Y; byte coordinates |
| 0x630 | 4 | Short ASCII tag; purpose unconfirmed |
| 0x634 | 320 | Four 80-byte hint slots |
| 0x774 | 1 | Time allowance: minutes |
| 0x775 | 1 | Time allowance: seconds |
| 0x776 | 2048 | Recorded input tape in numbered levels |
Grid cells
| Relative offset | Data type | Description |
|---|---|---|
| 0 | UINT16BE | Background tile index into the selected theme’s .BCX bank |
| 2 | UINT8 | Foreground structure |
| 3 | UINT8 | Domino type |
| 4 | BYTE[2] | Skipped by the confirmed grid loader; preserve when editing |
The grid is 20 columns by 13 rows, each cell representing 16×16 pixels. Foreground 20 marks the exit and 23 the entry. Values 4, 5 and 6 describe platform/ladder combinations or ladders. Do not adopt the unrelated clone's door names for 18, 19 or 21: their meanings are not established for these files.
Domino 0 is empty; 1–10 are Standard, Stopper, Splitter, Exploder, Delay, Tumbler, Bridger, Vanish, Trigger and Ascender. Higher runtime values include crash states; names inherited from another implementation in the JSON parser are not a confirmed extended placement vocabulary.
Hint text and solution tape
Each hint slot contains five 16-byte, NUL-terminated, space-padded lines. Slots 0–2 are English, French and German; slot 3's language/purpose is unconfirmed. The time allowance is 60 * minutes + seconds; do not require the seconds byte to be less than 60, since 0:60 occurs in the documented samples.
The final 2048 bytes are a tick-by-tick input-bitmask recording, not padding. Preserve them when changing unrelated fields. The original hidden solution playback can use this tape; the repository's level editor can record replacements.
Filenames
The decimal filename number is not the level ordinal. Starting with the level index, apply this 15-bit LFSR step three times, then format five decimal digits after P:
feedback = (state & 1) ^ ((state >> 1) & 1) state = ((state >> 1) | (feedback << 14)) & 0x7FFF
Level 1 is P04096.SCR. The entered passcode uses six steps instead (level 1: 00512). OPTION0.SCR and OPTION1.SCR use the same grid format. P00000.SCR is a special bootstrap screen; its anti-piracy text does not establish that it is selected by a failed protection check.
Notes
The short tag may contain designer initials, but this is a hypothesis. OPTION0.SCR is documented as 3718 bytes: do not require every file to have the numbered-level tail size.
Source code
From pushover, the open-source browser port and its reverse-engineering notes:
- docs/formats/screens-scr.md – reverse-engineering documentation
- docs/formats/screens-scr-editor.md – reverse-engineering documentation
- tools/asset-convert/scr-to-json.js – decoder / format implementation
- tools/asset-convert/scr-writer.js – decoder / format implementation
- engine/src/core/levelOrder.js – filename and passcode mapping
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!)