Pushover Map Format

From ModdingWiki
Jump to navigation Jump to search
Pushover Map Format
File:Pushover Map Format.png
There is no image of a map in this format — upload one!
Format typeMap/level
Map type2D tile-based
Layer count3 (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:

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!)