Please create an account or Login! Have fun!

C2M: Difference between revisions

Jump to navigation Jump to search
imported>Zrax0111
(Update tile and modifier specifications based on testing.)
 
(→‎REPL / PRPL section: Make C2M solution input delay documentation clearer)
 
(15 intermediate revisions by 7 users not shown)
Line 1: Line 1:
=== Overview ===
A '''C2M '''file (having the extension .c2m) is the file format which [[Chip's Challenge 2]] individual levels are stored in.
A '''C2M '''file (having the extension .c2m) is the file format which [[Chip's Challenge 2]] individual levels are commonly stored in.


The file is a binary file consisting of several sections one after the other, terminated by the END section. Each section begins with a section header, which is followed by the section's data.
The file is a binary file consisting of several sections one after the other, terminated by the END section. Each section begins with a section header, which is followed by the section's data.
Line 6: Line 5:
All data in the file is little-endian.
All data in the file is little-endian.


=== Section header format ===
== Format ==
{| class="article-table"
=== Section header ===
{| class="wikitable" border="1"
!Bytes
!Bytes
!Content
!Content
Line 19: Line 19:


=== Section types ===
=== Section types ===
{| class="article-table"
{| class="wikitable" border="1"
!Section ID
!Section ID
!Content Type
!Content Type
Line 30: Line 30:
|LOCK
|LOCK
|Null-terminated string
|Null-terminated string
|Usually "Custom version for Chuck Sommerville", optional. Seems to be ignored by CC2.
|Usually "Custom version for Chuck Sommerville", optional. Seems to be ignored
|-
|-
|TITL
|TITL
Line 46: Line 46:
|CLUE
|CLUE
|Null-terminated string
|Null-terminated string
|Level clue (Only one allowed, but see <ref name=":0">The NOTE section can contain multiple clues separated by "[CLUE]" line. The clues are assigned to the clue tiles in order of appearance of both.</ref>)
|Level clue (Only one allowed, but see below <ref name=":0">The NOTE section can contain multiple clues separated by a "[CLUE]" line. The clues are assigned to the clue tiles in reading order.</ref>)
|-
|-
|NOTE
|NOTE
Line 62: Line 62:
|KEY
|KEY
|16 bytes
|16 bytes
|Unknown, seems not required, could be a MD5 hash of something
|Unknown, seems not required <!--could be a MD5 hash of something-->
|-
|-
|REPL / PRPL
|REPL / PRPL
|See REPL section table below
|See REPL section table below
|Solution replay, optional. A REPL section is not packed, a PRPL section is.
|Solution replay, optional. A REPL section is not packed; a PRPL section is.
|-
|-
|RDNY
|RDNY
|No content (length is 0)
|No content ''(length is 0)''
|The presence of this section makes the level readonly so it can't be edited in the level editor.
|The presence of this section makes the level read-only so it can't be edited in the level editor.
|-
|-
|END
|END
|No content (length is 0)
|No content ''(length is 0)''
|Signifies end of file
|Signifies end of file
|}
|}
Line 79: Line 79:
=== OPTN section ===
=== OPTN section ===
The size of the section can differ between file versions (and even between files with the same file version). Data beyond the size of the section is not read. (E.g. if the section size is 3, only the time and the view are stored.)
The size of the section can differ between file versions (and even between files with the same file version). Data beyond the size of the section is not read. (E.g. if the section size is 3, only the time and the view are stored.)
{| class="article-table"
{| class="wikitable" border="1"
!Bytes
!Bytes
!Content
!Content
Line 114: Line 114:
The PACK and PRPL sections contain compressed versions of the MAP and REPL sections respectively. The compression scheme is as follows:
The PACK and PRPL sections contain compressed versions of the MAP and REPL sections respectively. The compression scheme is as follows:


{| class="article-table"
{| class="wikitable" border="1"
!Bytes
!Bytes
!Content
!Content
Line 126: Line 126:
|}
|}


==== A Data Block: ====
==== Data block ====
When encountered during decompression, the data block's N bytes of data are added to the list..
When encountered during decompression, the data block's N bytes of data are added to the list..
{| class="article-table"
{| class="wikitable" border="1"
!Bytes
!Bytes
!Content
!Content
Line 139: Line 139:
|}
|}


==== A Back-Reference Block: ====
==== Back-reference block ====
When encountered during decompression, COUNT bytes are copied from position (CURRENT - OFFSET) in the list to position CURRENT in the list. (Where CURRENT is the current position in the list, while COUNT and OFFSET are defined below)
When encountered during decompression, COUNT bytes are copied from position (CURRENT - OFFSET) in the list to position CURRENT in the list. (Where CURRENT is the current position in the list, while COUNT and OFFSET are defined below)


Note that COUNT can be larger than OFFSET, allowing arbitrary pattern repetition to be efficiently encoded.
Note that COUNT can be larger than OFFSET, allowing arbitrary pattern repetition to be efficiently encoded.
{| class="article-table"
{| class="wikitable" border="1"
!Bytes
!Bytes
!Content
!Content
Line 156: Line 156:
=== MAP / PACK section ===
=== MAP / PACK section ===
This section contains the map data. If this is a PACK section, it must be unpacked using the above compression scheme first. The contents of this section is as follows:
This section contains the map data. If this is a PACK section, it must be unpacked using the above compression scheme first. The contents of this section is as follows:
{| class="article-table"
{| class="wikitable" border="1"
!Bytes
!Bytes
!Content
!Content
Line 170: Line 170:
|}
|}


==== Tile specification: ====
==== Tile specification ====
The tile specification consists of 1 or more bytes. The first byte is always the tile value, decoded as follows:
The tile specification consists of 1 or more bytes. The first byte is always the tile value, decoded as follows:
{| class="article-table"
{| class="wikitable" border="1"
!Value
!Value
!Tile
!Tile
!Additional data, if any
!Additional data, if any
!Modifier
|-
|-
|0x1
|0x1
|Floor
|[[Floor]]
|
|
| Wires
|-
|-
|0x2
|0x2
|Wall
|[[Wall]]
|
|
|
|-
|-
|0x3
|0x3
|Ice
|[[Ice]]
|
|
|
|-
|-
|0x4
|0x4
|Ice, South West Corner
|[[Ice]] corner ''(SW)''
|
|
|
|-
|-
|0x5
|0x5
|Ice, North West Corner
|[[Ice]] corner ''(NW)''
|
|
|
|-
|-
|0x6
|0x6
|Ice, North East Corner
|[[Ice]] corner ''(NE)''
|
|
|
|-
|-
|0x7
|0x7
|Ice, South East Corner
|[[Ice]] corner ''(SE)''
|
|
|
|-
|-
|0x8
|0x8
|Water
|[[Water]]
|
|
|
|-
|-
|0x9
|0x9
|Fire
|[[Fire]]
|
|
|
|-
|-
|0xa
|0xa
|Force Floor, North
|[[Force floor]] ''(N)''
|
|
|
|-
|-
|0xb
|0xb
|Force Floor, East
|[[Force floor]] ''(E)''
|
|
|
|-
|-
|0xc
|0xc
|Force Floor, South
|[[Force floor]] ''(S)''
|
|
|
|-
|-
|0xd
|0xd
|Force Floor, West
|[[Force floor]] ''(W)''
|
|
|
|-
|-
|0xe
|0xe
|Green Toggle Wall
|Green [[toggle wall]]
|
|
|
|-
|-
|0xf
|0xf
|Green Toggle Floor
|Green [[Toggle wall|toggle floor]]
|
|
|
|-
|-
|0x10
|0x10
|Red Teleport
|[[Red teleport]]
|
|
| Wires
|-
|-
|0x11
|0x11
|Blue Teleport
|[[Blue teleport]]
|
|
| Wires
|-
|-
|0x12
|0x12
|Yellow Teleport
|[[Yellow teleport]]
|
|
|
|-
|-
|0x13
|0x13
|Green Teleport
|[[Green teleport]]
|
|
|
|-
|-
|0x14
|0x14
|Exit
|[[Exit]]
|
|
|
|-
|-
|0x15
|0x15
|Slime (the obstacle)
|[[Slime]]
|
|
|
|-
|-
|0x16
|0x16
|Chip (the hero)
|[[Chip]] ''(the hero)''
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x17
|0x17
|Dirt Block
|[[Dirt block]]
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x18
|0x18
|Walker Enemy
|[[Walker]]
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x19
|0x19
|Ship Enemy
|[[Glider|Ship]]
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x1a
|0x1a
|Ice Block
|[[Ice block]]
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x1b
|0x1b
|(Unused) East Panel
|[[Thin wall]] ''(S) (used in CC1 levels)''
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x1c
|0x1c
|(Unused) South Panel
|[[Thin wall]] ''(E) (used in CC1 levels)''
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x1d
|0x1d
|(Unused) South+East Panel
|[[Thin wall]] ''(SE) (used in CC1 levels)''
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x1e
|0x1e
|Gravel
|[[Gravel]]
|
|
|
|-
|-
|0x1f
|0x1f
|Door Toggle Button
|[[Green button]]
|
|
|
|-
|-
|0x20
|0x20
|Blue Tank Button
|[[Blue button]]
|
|
|
|-
|-
|0x21
|0x21
|Blue Tank
|[[Tank|Blue tank]]
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x22
|0x22
|Red Door
|[[Red door]]
|
|
|
|-
|-
|0x23
|0x23
|Blue Door
|[[Blue door]]
|
|
|
|-
|-
|0x24
|0x24
|Yellow Door
|[[Yellow door]]
|
|
|
|-
|-
|0x25
|0x25
|Green Door
|[[Green door]]
|
|
|
|-
|-
|0x26
|0x26
|Red Key
|[[Red key]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x27
|0x27
|Blue Key
|[[Blue key]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x28
|0x28
|Yellow Key
|[[Yellow key]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x29
|0x29
|Green Key
|[[Green key]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x2a
|0x2a
|IC Chip
|[[Computer chip|IC Chip]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x2b
|0x2b
|Extra IC Chip
|Extra [[Computer chip|IC Chip]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x2c
|0x2c
|IC Chip Socket
|[[Socket|Chip socket]]
|
|
|
|-
|-
|0x2d
|0x2d
|Push-up Wall
|[[Recessed wall|Pop-up wall]]
|
|
|
|-
|-
|0x2e
|0x2e
|Appearing Wall
|[[Appearing wall]]
|
|
|
|-
|-
|0x2f
|0x2f
|Invisible Wall
|[[Invisible wall]]
|
|
|
|-
|-
|0x30
|0x30
|Solid Blue Wall
|Solid [[blue wall]]
|
|
|
|-
|-
|0x31
|0x31
|False Blue Wall
|False [[blue wall]]
|
|
|
|-
|-
|0x32
|0x32
|Dirt
|[[Dirt]]
|
|
|
|-
|-
|0x33
|0x33
|Ant
|[[Bug|Ant]]
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x34
|0x34
|Centipede
|[[Paramecium|Centipede]]
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x35
|0x35
|Purple Ball
|[[Ball|Purple ball]]
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x36
|0x36
|Blob
|[[Blob]]
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x37
|0x37
|Red Teeth
|[[Teeth|Angry teeth]]
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x38
|0x38
|Fire box
|[[Fireball|Fire box]]
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x39
|0x39
|Clone Button
|[[Red button]]
|
|
|
|-
|-
|0x3a
|0x3a
|Trap Button
|[[Brown button]]
|
|
|
|-
|-
|0x3b
|0x3b
|Cleats
|[[Ice skates|Cleats]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x3c
|0x3c
|Magno Shoes
|[[Suction boots]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x3d
|0x3d
|Fire Shoes
|[[Fire boots]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x3e
|0x3e
|Flippers
|[[Flippers]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x3f
|0x3f
|Red Thief
|Tool [[thief]]
|
|
|
|-
|-
|0x40
|0x40
|Red Bomb
|[[Bomb|Cherry bomb]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x41
|0x41
|(Unused)
|Open [[trap]] ''(unused in main levels)''
|
|
|
|-
|-
|0x42
|0x42
|Trap
|[[Trap]]
|
|
|
|-
|-
|0x43
|0x43
|(Unused -- Behaves like Clone Machine)
|[[Clone machine]] ''(used in CC1 levels)''
|
|
| Clone direction (?)
|-
|-
|0x44
|0x44
|Clone Machine (Modifier required, see below)
|[[Clone machine]]
|
|
| Clone direction
|-
|-
|0x45
|0x45
|Clue Tile
|[[Hint|Clue]]
|
|
|
|-
|-
|0x46
|0x46
|Force Field, Random
|[[Force floor]] ''(random)''
|
|
|
|-
|-
|0x47
|0x47
|Area Control Button
|[[Gray button]]
|
|
|
|-
|-
|0x48
|0x48
|Revolving Door, South West
|[[Swivel door]] ''(SW)''
|
|
|
|-
|-
|0x49
|0x49
|Revolving Door, North West
|[[Swivel door]] ''(NW)''
|
|
|
|-
|-
|0x4a
|0x4a
|Revolving Door, North East
|[[Swivel door]] ''(NE)''
|
|
|
|-
|-
|0x4b
|0x4b
|Revolving Door, South East
|[[Swivel door]] ''(SE)''
|
|
|
|-
|-
|0x4c
|0x4c
|Time Bonus
|[[Time bonus]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x4d
|0x4d
|Time Toggle
|[[Stopwatch]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x4e
|0x4e
|Transformer
|[[Transmogrifier]]
|
|
| Wires
|-
|-
|0x4f
|0x4f
|Train Tracks Base (Modifier required, see section below)
|[[Railroad track]]
|
|
| Tracks (see below)
|-
|-
|0x50
|0x50
|Metal Wall
|[[Steel wall]]
|
|
| Wires
|-
|-
|0x51
|0x51
|Time Bomb
|[[Time bomb]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x52
|0x52
|Helmet
|[[Helmet]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x53
|0x53
|(Unused)
|''(Unused)''
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x54
|0x54
|(Unused)
|''(Unused)''
|
|
|
|-
|-
|0x55
|0x55
|(Unused)
|''(Unused)''
|
|
|
|-
|-
|0x56
|0x56
|Melinda
|[[Melinda]]
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x57
|0x57
|Blue Teeth
|[[Teeth|Timid teeth]]
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x58
|0x58
|(Unused) Explosion Animation
|Explosion animation ''(unused in main levels)''
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x59
|0x59
|Hiking Shoes
|[[Hiking boots]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x5a
|0x5a
|Male Only Sign
|[[Gender-only sign|Male-only sign]]
|
|
|
|-
|-
|0x5b
|0x5b
|Female Only Sign
|[[Gender-only sign|Female-only sign]]
|
|
|
|-
|-
|0x5c
|0x5c
|Inverter Gate, North (Modifier allows other gates, see below)
|[[Wire#Gates|Logic gate]]
|
|
|Gate type and direction (see below)
|-
|-
|0x5d
|0x5d
|(Unused)
|''(Unused)''
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x5e
|0x5e
|Logic Switch, On
|[[Pink button]]
|
|
|Wires
|-
|-
|0x5f
|0x5f
|Flame Jet, Off
|[[Flame jet]] ''(OFF)''
|
|
|
|-
|-
|0x60
|0x60
|Flame Jet, On
|[[Flame jet]] ''(ON)''
|
|
|
|-
|-
|0x61
|0x61
|Flame Jet Button
|[[Orange button]]
|
|
|
|-
|-
|0x62
|0x62
|Lightning Bolt
|[[Lightning bolt]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x63
|0x63
|Yellow Tank
|[[Yellow tank]]
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x64
|0x64
|Yellow Tank D-Pad
|[[Yellow tank button]]
|
|
|
|-
|-
|0x65
|0x65
|Mirror Chip (the enemy)
|[[Mirror Chip]]
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x66
|0x66
|Mirror Melinda
|[[Mirror Melinda]]
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x67
|0x67
|(Unused)
|''(Unused)''
|
|
|
|-
|-
|0x68
|0x68
|Bowling Ball
|[[Bowling ball]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x69
|0x69
|Rover
|[[Rover]]
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x6a
|0x6a
|Time Penalty
|[[Time penalty]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x6b
|0x6b
|Custom Floor, Brown (Modifier allows other styles, see below)
|[[Custom tile|Custom floor]]
|
|
|Style (see below)
|-
|-
|0x6c
|0x6c
|(Unused)
|(Unused)
|
|
|
|-
|-
|0x6d
|0x6d
|Panels/Canopy, see below
|[[Thin wall]] / [[Canopy]]
|Panel/Canopy bitmask, Tile Specification for tile underneath
|Panel/Canopy bitmask ''(see below)'', Tile Specification for lower layer
|
|-
|-
|0x6e
|0x6e
|(Unused)
|''(Unused)''
|
|
|
|-
|-
|0x6f
|0x6f
|Railroad Crossing Sign
|[[Railroad sign]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x70
|0x70
|Custom Wall, Brown (Modifier allows other styles, see below)
|[[Custom tile|Custom wall]]
|
|
|Style (see below)
|-
|-
|0x71
|0x71
|"Sunken" Floor (Modifier required, see below)
|[[Letter tile]] ''(space)''
|
|
|Glyph type (see below)
|-
|-
|0x72
|0x72
|Purple Toggle Wall
|[[Switch door|Purple toggle floor]]
|
|
|
|-
|-
|0x73
|0x73
|Purple Toggle Floor
|[[Switch door|Purple toggle wall]]
|
|
|
|-
|-
|0x74
|0x74
|(Unused)
|''(Unused)''
|
|
|
|-
|-
|0x75
|0x75
|(Unused)
|''(Unused)''
|
|
|
|-
|-
|0x76
|0x76
|8-bit Modifier (see Modifier section below)
|8-bit Modifier ''(see Modifier section below)''
|1 modifier byte, Tile Specification for affected tile
|1 modifier byte, Tile Specification for affected tile
|N/A
|-
|-
|0x77
|0x77
|16-bit Modifier (see Modifier section below)
|16-bit Modifier ''(see Modifier section below)''
|2 modifier bytes, Tile Specification for affected tile
|2 modifier bytes, Tile Specification for affected tile
|N/A
|-
|-
|0x78
|0x78
|32-bit Modifier (see Modifier section below)
|32-bit Modifier ''(see Modifier section below)''
|4 modifier bytes, Tile Specification for affected tile
|4 modifier bytes, Tile Specification for affected tile
|N/A
|-
|-
|0x79
|0x79
|(Unused)
|''(Unused)''
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x7a
|0x7a
|10 Point Flag
|10 point [[Bonus flag|flag]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x7b
|0x7b
|100 Point Flag
|100 point [[Bonus flag|flag]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x7c
|0x7c
|1000 Point Flag
|1000 point [[Bonus flag|flag]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x7d
|0x7d
|Stay Up Green Wall
|Solid [[green wall]]
|
|
|
|-
|-
|0x7e
|0x7e
|Pop Down Green Wall
|False [[green wall]]
|
|
|
|-
|-
|0x7f
|0x7f
|"Forbidden" mark (modifies items/keys)
|[[No sign|Not allowed marker]]
|Tile Specification for tile underneath
|Modifies tools/keys. Tile Specification for lower layer
|
|-
|-
|0x80
|0x80
|2x Points Flag
|2x points [[Bonus flag|flag]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x81
|0x81
|Directional Block
|[[Directional block]]
|Direction byte, Directional Arrows Bitmask, Tile Specification for tile underneath
|Direction byte, Directional Arrows Bitmask, Tile Specification for lower layer
|
|-
|-
|0x82
|0x82
|Floor Mimic
|[[Floor mimic]]
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x83
|0x83
|Green Bomb
|[[Green bomb]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x84
|0x84
|Green IC Chip
|[[Green chip]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x85
|0x85
|(Unused)
|''(Unused)''
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x86
|0x86
|(Unused)
|''(Unused)''
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x87
|0x87
|Reverse Logic Button
|[[Black button]]
|
|
|Wires
|-
|-
|0x88
|0x88
|Off Switch, Off
|[[Switch|ON/OFF switch]] ''(OFF)''
|
|
|Wires
|-
|-
|0x89
|0x89
|On Switch, On
|[[Switch|ON/OFF switch]] ''(ON)''
|
|
|Wires
|-
|-
|0x8a
|0x8a
|Red Thief
|[[Key thief]]
|
|
|
|-
|-
|0x8b
|0x8b
|Ghost
|[[Ghost]]
|Direction byte, Tile Specification for tile underneath
|Direction byte, Tile Specification for lower layer
|
|-
|-
|0x8c
|0x8c
|Steel Foil
|[[Steel foil]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x8d
|0x8d
|Turtle
|[[Turtle]]
|
|
|
|-
|-
|0x8e
|0x8e
|Eye
|[[Secret eye]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x8f
|0x8f
|Bribe
|[[Bribe|Thief bribe]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x90
|0x90
|Speed Shoes
|[[Speed boots]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|-
|-
|0x91
|0x91
|(Unused)
|''(Unused)''
|
|
|
|-
|-
|0x92
|0x92
|Hook
|[[Hook]]
|Tile Specification for tile underneath
|Tile Specification for lower layer
|
|}
|}


==== Direction Byte ====
==== Direction byte ====
The direction byte comes after enemy tiles and some others:
The direction byte comes after enemy tiles and some others:
{| class="article-table"
{| class="wikitable" border="1"
!Value
!Value
!Meaning
!Meaning
Line 781: Line 928:
|}
|}


==== Panel/Canopy Bitmask ====
==== Thin wall/Canopy bitmask ====
Any number of these bits can be combined:
Any number of these bits can be combined:
{| class="article-table"
{| class="wikitable" border="1"
!Bitmask
!Bitmask
!Meaning
!Meaning
|-
|-
|0x1
|0x1
|Panel, North
|[[Thin wall]] ''(N)''
|-
|-
|0x2
|0x2
|Panel, East
|[[Thin wall]] ''(E)''
|-
|-
|0x4
|0x4
|Panel, South
|[[Thin wall]] ''(S)''
|-
|-
|0x8
|0x8
|Panel, West
|[[Thin wall]] ''(W)''
|-
|-
|0x10
|0x10
|Canopy
|[[Canopy]]
|}
|}


==== Directional Arrows Bitmask ====
==== Directional block arrows bitmask ====
Any number of these bits can be combined:
Any number of these bits can be combined:
{| class="article-table"
{| class="wikitable" border="1"
!Bitmask
!Bitmask
!Meaning
!Meaning
|-
|-
|0x1
|0x1
|Arrow, North
|North
|-
|-
|0x2
|0x2
|Arrow, East
|East
|-
|-
|0x4
|0x4
|Arrow, South
|South
|-
|-
|0x8
|0x8
|Arrow, West
|West
|}
|}


==== Tile Modifiers ====
==== Tile modifiers ====
The modifier "tiles" (0x76, 0x77, 0x78) affect the tile specification that they carry in their additional data. The meaning of the modifier value depends on the type of tile they affect.
The modifier "tiles" (0x76, 0x77, 0x78) affect the tile specification that they carry in their additional data. The meaning of the modifier value depends on the type of tile they affect.


==== Wire Modifier ====
The size of the modifier is irrelevant, and modifiers default to zero.  That is, if a tile is expecting a 16-bit modifier but the high byte is zero, an 8-bit modifier works as well.  If a tile is expecting an 8-bit modifier which is zero, the modifier may be omitted entirely.
This is an 8-bit modifier that affects floors, metal walls, on/off switches, transformers, and blue/red fans (possibly more?). It adds wires to the tile it affects. Any number of these bits can be combined:
 
{| class="article-table"
==== Wire modifier ====
This is an 8-bit modifier that affects [[floor]]s, [[steel wall]]s, ON/OFF switches, [[transmogrifier]]s, and [[Blue teleport|blue]] and [[red teleport]]s<!--possibly more?-->. It adds [[wire]]s to the tile it affects. Any number of these bits can be combined:
{| class="wikitable" border="1"
!Bitmask
!Bitmask
!Meaning
!Meaning
|-
|-
|0x1
|0x1
|Wire, North
|[[Wire]] ''(N)''
|-
|-
|0x2
|0x2
|Wire, East
|[[Wire]] ''(E)''
|-
|-
|0x4
|0x4
|Wire, South
|[[Wire]] ''(S)''
|-
|-
|0x8
|0x8
|Wire, West
|[[Wire]] ''(W)''
|-
|-
|0x10
|0x10
|Wire Tunnel, North
|[[Wire tunnel]] ''(N)''
|-
|-
|0x20
|0x20
|Wire Tunnel, East
|[[Wire tunnel]] ''(E)''
|-
|-
|0x40
|0x40
|Wire Tunnel, South
|[[Wire tunnel]] ''(S)''
|-
|-
|0x80
|0x80
|Wire Tunnel, West
|[[Wire tunnel]] ''(W)''
|}
|}


==== ASCII Modifier ====
==== Letter tile modifier ====
This is an 8-bit modifier that affects "sunken" floors by adding a symbol (usually an ASCII symbol) to them:
This is an 8-bit modifier that affects [[letter tile]]s by adding a symbol (usually an ASCII symbol) to them:
{| class="article-table"
{| class="wikitable" border="1"
!Values
!Values
!Meaning
!Meaning
|-
|-
|0x1c
|0x1c
|Up Arrow
|Up arrow
|-
|-
|0x1d
|0x1d
|Right Arrow
|Right arrow
|-
|-
|0x1e
|0x1e
|Down Arrow
|Down arrow
|-
|-
|0x1f
|0x1f
|Left Arrow
|Left arrow
|-
|-
|0x20 through 0x5f
|0x20 through 0x5f
|Corresponding ASCII Characterr (' ' through '_')
|Corresponding ASCII character (' ' through '_')
|}
|}


==== Clone Machine Arrow Modifier ====
==== Clone machine arrow modifier ====
This is an 8-bit modifier that affects clone machines by specifying their direction. The values can be combined and will show up on the clone machine appropriately, but the game will only clone in one direction:
This is an 8-bit modifier that affects [[clone machine]]s by specifying their direction. The values can be combined and will show up on the clone machine appropriately, but the game will only clone in one direction.
{| class="article-table"
{| class="wikitable" border="1"
!Value
!Value
!Meaning
!Meaning
|-
|-
|0x1
|0x1
|Arrow, North
|Arrow ''(N)''
|-
|-
|0x2
|0x2
|Arrow, East
|Arrow ''(E)''
|-
|-
|0x4
|0x4
|Arrow, South
|Arrow ''(S)''
|-
|-
|0x8
|0x8
|Arrow, West
|Arrow ''(W)''
|}
|}


==== Custom Floor/Wall Modifier ====
==== Custom floor/wall modifier ====
This is an 8-bit modifier that affects custom walls or floors by replaces their style:
This is an 8-bit modifier that affects custom walls or floors by replaces their style:
{| class="article-table"
{| class="wikitable" border="1"
!Value
!Value
!Meaning
!Meaning
|-
|0x0
|Green
|-
|-
|0x1
|0x1
|Custom Wall/Floor, Pink
|Pink
|-
|-
|0x2
|0x2
|Custom Wall/Floor, Yellow
|Yellow
|-
|-
|0x3
|0x3
|Custom Wall/Floor, Blue
|Blue
|}
|}


==== Logic Modifier ====
==== Logic modifier ====
This is an 8-bit modifier that affects an inverter gate by replacing it with another gate:
This is an 8-bit modifier that affects an inverter gate by replacing it with another gate. Modifiers outside of the ranges specified below will produce [[voodoo tile]]s.
{| class="article-table"
 
Most logic gates have 4 assigned values instead of just 1; unless otherwise specified below, the face direction of the logic gate is determined by its index, stored in the order: North, East, South, West.
{| class="wikitable" border="1"
!Values
!Values
!Meaning
!Meaning
|-
|-
|0x1 through 0x3
|0x0 through 0x3
|Inverter Gate East/South/West
|[[Inverter|Inverter gate]]
|-
|-
|0x4 through 0x7
|0x4 through 0x7
|And Gate North/East/South/West
|[[AND gate]]
|-
|-
|0x8 through 0xb
|0x8 through 0xb
|Or Gate North/East/South/West
|[[OR gate]]
|-
|-
|0xc through 0xf
|0xc through 0xf
|Xor Gate North/East/South/West
|[[XOR gate]]
|-
|-
|0x10 through 0x13
|0x10 through 0x13
|Latch North/East/South/West, Clockwise Arrow
|[[Latch gate]] ''(clockwise arrow)''
|-
|-
|0x14 through 0x17
|0x14 through 0x17
|Nand Gate North/East/South/West
|[[NAND gate]]
|-
|-
|0x1e through 0x27
|0x1e through 0x27
|Counter Gate 0 through 9
|[[Counter|Counter gate]] ''(0 through 9)''
|-
|-
|0x40 through 0x43
|0x40 through 0x43
|Latch North/East/South/West, Counter Clockwise Arrow
|[[Latch gate]] ''(counterclockwise arrow)''
|}
|}


==== Track Modifier ====
==== Track modifier ====
This is an 8- or 16-bit modifier that affects the train tracks base tile. The low-order byte specifies which tracks exist; any number of bits can be combined:
This is a 16-bit modifier that affects the [[railroad track]] tile. The low byte specifies which tracks exist; any number of bits can be combined:
{| class="article-table"
{| class="wikitable" border="1"
!Bitmask
!Bitmask
!Meaning
!Meaning
|-
|-
|0x1
|0x1
|Track, North East
|Turn ''(NE)''
|-
|-
|0x2
|0x2
|Track, South East
|Turn ''(SE)''
|-
|-
|0x4
|0x4
|Track, South West
|Turn ''(SW)''
|-
|-
|0x8
|0x8
|Track, North West
|Turn ''(NW)''
|-
|-
|0x10
|0x10
|Track, Horizontal
|Horizontal
|-
|-
|0x20
|0x20
|Track, Vertical
|Vertical
|-
|-
|0x40
|0x40
|Track Switch
|Track switch
|}
|}
The high order byte is optional and specifies which track is the active one. If omitted, the North East track is the active one. For tiles with a track switch, the active track is the only one that can be used (the other are shown red).
 
{| class="article-table"
The high byte is comprised of two nybbles.  The lower nybble specifies which track is active. For tiles with a track switch, the active track is the only one that can be used; the others are shown in red.
{| class="wikitable" border="1"
!Value
!Value
!Meaning
!Meaning
|-
|-
|(Omitted)
|0x000
|North East track is active
|NE track is active
|-
|-
|0x100
|0x100
|South East track is active
|SE track is active
|-
|-
|0x200
|0x200
|South West track is active
|SW track is active
|-
|-
|0x300
|0x300
|North West track is active
|NW track is active
|-
|-
|0x400
|0x400
Line 994: Line 1,149:
|Vertical track is active
|Vertical track is active
|}
|}
The upper nybble is the tile's initial "entered" direction.  When an actor starts the level already on top of this tile, it's treated as though it entered by moving in this direction.  (If there are no tracks corresponding to that direction, the actor will be unable to move.)


=== REPL / PRPL section ===
=== REPL / PRPL section ===
This section contains the replay data. If this is a PRPL section, it must be unpacked first (see Section Packing).
This section contains the replay data. If this is a PRPL section, it must be unpacked first (see Section Packing). However the hash for the replay and the valid solution bit-flag is set in the OPTN section and not here


The contents of this section are as follows:
The contents of this section are as follows:
{| class="article-table"
{| class="wikitable" border="1"
!Bytes
!Bytes
!Content
!Content
|-
|-
|1
|1
|Unknown (Usually 0)
|Usually 0; function unknown
|-
|-
|1
|1
|Random force floor initial direction
|[[Force floor|Random force floor]] initial direction
|-
|-
|1
|1
|Randomness seed (used by blobs)
|Randomness seed ''(used by [[blob]]s)''
|-
|-
|Varies
|Varies
|A sequence of input changes, optionally terminated by 0xff
|A sequence of input changes; optionally terminated by 0xff
|}
|}


==== Input Change ====
==== Input change ====
Specifies a change in input:
Specifies a change in input:
{| class="article-table"
{| class="wikitable" border="1"
!Bytes
!Bytes
!Content
!Content
|-
|-
|1
|1
|Number of frames passed since previous input change. Always <= 0xfc. Larger delays are specified via multiple input changes.
|Number of frames to wait before inputting the new input. The last input is still held while the new input is pending. Always <= 0xfc. Larger delays are specified via multiple input changes
|-
|-
|1
|1
Line 1,029: Line 1,186:
|}
|}


==== Input Bitmask ====
==== Input bitmask ====
Specifies which keys are pressed, any number of bits can be combined:
Specifies which keys are pressed, any number of bits can be combined:
{| class="article-table"
{| class="wikitable" border="1"
!Bitmask
!Bitmask
!Meaning
!Meaning
Line 1,057: Line 1,214:
|-
|-
|0x80
|0x80
|If set, this input is for player 2 in a split-screen game.
|If set, this input is for player 2 in a split-screen game <!-- doesn't work? -->
|}
|}


<references />
<references/>
 
[[Category:Terminology]]
[[Category:Terminology]]
[[Category:File formats]]

Latest revision as of 14:55, 15 May 2021

A C2M file (having the extension .c2m) is the file format which Chip's Challenge 2 individual levels are stored in.

The file is a binary file consisting of several sections one after the other, terminated by the END section. Each section begins with a section header, which is followed by the section's data.

All data in the file is little-endian.

Format[edit]

Section header[edit]

Bytes Content
4 Four character code identifying the section, see table below. Codes shorter than 4 characters (such as "END") are padded with spaces (making "END " in this case).
4 The length of the section's data

Section types[edit]

Section ID Content Type Content
CC2M Null-terminated string The file's version. The latest version is "7", but ranges from "3" to "7" in the levels supplied with CC2.
LOCK Null-terminated string Usually "Custom version for Chuck Sommerville", optional. Seems to be ignored
TITL Null-terminated string Level title
AUTH Null-terminated string Level author, optional
VERS Null-terminated string Version of the CC2 editor which created this level, optional
CLUE Null-terminated string Level clue (Only one allowed, but see below [1])
NOTE Null-terminated string Plain text comments ([1])
OPTN See OPTN section table below Various level options
MAP / PACK See MAP section table below The level's map. A MAP section is not packed, a PACK section is.
KEY 16 bytes Unknown, seems not required
REPL / PRPL See REPL section table below Solution replay, optional. A REPL section is not packed; a PRPL section is.
RDNY No content (length is 0) The presence of this section makes the level read-only so it can't be edited in the level editor.
END No content (length is 0) Signifies end of file

OPTN section[edit]

The size of the section can differ between file versions (and even between files with the same file version). Data beyond the size of the section is not read. (E.g. if the section size is 3, only the time and the view are stored.)

Bytes Content
2 Time
1 0 - 10x10 view, 1 - 9x9 view, 2 - split view
1 0 - no solution exists / solution not verified, 1 - a solution exists (in a REPL / PRPL section) and it works
1 0 - show map in editor, 1 - hide it
1 0 - map is editable, 1 - map is readonly
16 MD5 hash of the contents of the REPL section, or unpacked PRPL section.
1 "Hide Logic" option
1 "CC1 Boots" option
1 Blobs behavior: 0 - deterministic, 1 - 4 patterns, 2 - extra random

Section packing[edit]

The PACK and PRPL sections contain compressed versions of the MAP and REPL sections respectively. The compression scheme is as follows:

Bytes Content
2 Number of bytes in the uncompressed list.
Varies A sequence of blocks which can each be either a Data Block or a Back-Reference Block.

The sequence continues until it covers all bytes in the uncompressed list.

Data block[edit]

When encountered during decompression, the data block's N bytes of data are added to the list..

Bytes Content
1 The length of the data (N), must be between 0x00 to 0x7f (else, this is not a Data Block)
N N bytes of data.

Back-reference block[edit]

When encountered during decompression, COUNT bytes are copied from position (CURRENT - OFFSET) in the list to position CURRENT in the list. (Where CURRENT is the current position in the list, while COUNT and OFFSET are defined below)

Note that COUNT can be larger than OFFSET, allowing arbitrary pattern repetition to be efficiently encoded.

Bytes Content
1 0x80 + The number of items this block decodes to (COUNT). Must be between 0x80 to 0xff (else, this is not a Back-Reference Block)
1 The offset from the current position in the list (OFFSET)

MAP / PACK section[edit]

This section contains the map data. If this is a PACK section, it must be unpacked using the above compression scheme first. The contents of this section is as follows:

Bytes Content
1 The level's width (W)
1 The level's height (H)
Varies A sequence of tile specifications for each tile in the level, arranged in left-to-right, top-to-bottom order.

Tile specification[edit]

The tile specification consists of 1 or more bytes. The first byte is always the tile value, decoded as follows:

Value Tile Additional data, if any Modifier
0x1 Floor Wires
0x2 Wall
0x3 Ice
0x4 Ice corner (SW)
0x5 Ice corner (NW)
0x6 Ice corner (NE)
0x7 Ice corner (SE)
0x8 Water
0x9 Fire
0xa Force floor (N)
0xb Force floor (E)
0xc Force floor (S)
0xd Force floor (W)
0xe Green toggle wall
0xf Green toggle floor
0x10 Red teleport Wires
0x11 Blue teleport Wires
0x12 Yellow teleport
0x13 Green teleport
0x14 Exit
0x15 Slime
0x16 Chip (the hero) Direction byte, Tile Specification for lower layer
0x17 Dirt block Direction byte, Tile Specification for lower layer
0x18 Walker Direction byte, Tile Specification for lower layer
0x19 Ship Direction byte, Tile Specification for lower layer
0x1a Ice block Direction byte, Tile Specification for lower layer
0x1b Thin wall (S) (used in CC1 levels) Tile Specification for lower layer
0x1c Thin wall (E) (used in CC1 levels) Tile Specification for lower layer
0x1d Thin wall (SE) (used in CC1 levels) Tile Specification for lower layer
0x1e Gravel
0x1f Green button
0x20 Blue button
0x21 Blue tank Direction byte, Tile Specification for lower layer
0x22 Red door
0x23 Blue door
0x24 Yellow door
0x25 Green door
0x26 Red key Tile Specification for lower layer
0x27 Blue key Tile Specification for lower layer
0x28 Yellow key Tile Specification for lower layer
0x29 Green key Tile Specification for lower layer
0x2a IC Chip Tile Specification for lower layer
0x2b Extra IC Chip Tile Specification for lower layer
0x2c Chip socket
0x2d Pop-up wall
0x2e Appearing wall
0x2f Invisible wall
0x30 Solid blue wall
0x31 False blue wall
0x32 Dirt
0x33 Ant Direction byte, Tile Specification for lower layer
0x34 Centipede Direction byte, Tile Specification for lower layer
0x35 Purple ball Direction byte, Tile Specification for lower layer
0x36 Blob Direction byte, Tile Specification for lower layer
0x37 Angry teeth Direction byte, Tile Specification for lower layer
0x38 Fire box Direction byte, Tile Specification for lower layer
0x39 Red button
0x3a Brown button
0x3b Cleats Tile Specification for lower layer
0x3c Suction boots Tile Specification for lower layer
0x3d Fire boots Tile Specification for lower layer
0x3e Flippers Tile Specification for lower layer
0x3f Tool thief
0x40 Cherry bomb Tile Specification for lower layer
0x41 Open trap (unused in main levels)
0x42 Trap
0x43 Clone machine (used in CC1 levels) Clone direction (?)
0x44 Clone machine Clone direction
0x45 Clue
0x46 Force floor (random)
0x47 Gray button
0x48 Swivel door (SW)
0x49 Swivel door (NW)
0x4a Swivel door (NE)
0x4b Swivel door (SE)
0x4c Time bonus Tile Specification for lower layer
0x4d Stopwatch Tile Specification for lower layer
0x4e Transmogrifier Wires
0x4f Railroad track Tracks (see below)
0x50 Steel wall Wires
0x51 Time bomb Tile Specification for lower layer
0x52 Helmet Tile Specification for lower layer
0x53 (Unused) Direction byte, Tile Specification for lower layer
0x54 (Unused)
0x55 (Unused)
0x56 Melinda Direction byte, Tile Specification for lower layer
0x57 Timid teeth Direction byte, Tile Specification for lower layer
0x58 Explosion animation (unused in main levels) Direction byte, Tile Specification for lower layer
0x59 Hiking boots Tile Specification for lower layer
0x5a Male-only sign
0x5b Female-only sign
0x5c Logic gate Gate type and direction (see below)
0x5d (Unused) Direction byte, Tile Specification for lower layer
0x5e Pink button Wires
0x5f Flame jet (OFF)
0x60 Flame jet (ON)
0x61 Orange button
0x62 Lightning bolt Tile Specification for lower layer
0x63 Yellow tank Direction byte, Tile Specification for lower layer
0x64 Yellow tank button
0x65 Mirror Chip Direction byte, Tile Specification for lower layer
0x66 Mirror Melinda Direction byte, Tile Specification for lower layer
0x67 (Unused)
0x68 Bowling ball Tile Specification for lower layer
0x69 Rover Direction byte, Tile Specification for lower layer
0x6a Time penalty Tile Specification for lower layer
0x6b Custom floor Style (see below)
0x6c (Unused)
0x6d Thin wall / Canopy Panel/Canopy bitmask (see below), Tile Specification for lower layer
0x6e (Unused)
0x6f Railroad sign Tile Specification for lower layer
0x70 Custom wall Style (see below)
0x71 Letter tile (space) Glyph type (see below)
0x72 Purple toggle floor
0x73 Purple toggle wall
0x74 (Unused)
0x75 (Unused)
0x76 8-bit Modifier (see Modifier section below) 1 modifier byte, Tile Specification for affected tile N/A
0x77 16-bit Modifier (see Modifier section below) 2 modifier bytes, Tile Specification for affected tile N/A
0x78 32-bit Modifier (see Modifier section below) 4 modifier bytes, Tile Specification for affected tile N/A
0x79 (Unused) Direction byte, Tile Specification for lower layer
0x7a 10 point flag Tile Specification for lower layer
0x7b 100 point flag Tile Specification for lower layer
0x7c 1000 point flag Tile Specification for lower layer
0x7d Solid green wall
0x7e False green wall
0x7f Not allowed marker Modifies tools/keys. Tile Specification for lower layer
0x80 2x points flag Tile Specification for lower layer
0x81 Directional block Direction byte, Directional Arrows Bitmask, Tile Specification for lower layer
0x82 Floor mimic Direction byte, Tile Specification for lower layer
0x83 Green bomb Tile Specification for lower layer
0x84 Green chip Tile Specification for lower layer
0x85 (Unused) Tile Specification for lower layer
0x86 (Unused) Tile Specification for lower layer
0x87 Black button Wires
0x88 ON/OFF switch (OFF) Wires
0x89 ON/OFF switch (ON) Wires
0x8a Key thief
0x8b Ghost Direction byte, Tile Specification for lower layer
0x8c Steel foil Tile Specification for lower layer
0x8d Turtle
0x8e Secret eye Tile Specification for lower layer
0x8f Thief bribe Tile Specification for lower layer
0x90 Speed boots Tile Specification for lower layer
0x91 (Unused)
0x92 Hook Tile Specification for lower layer

Direction byte[edit]

The direction byte comes after enemy tiles and some others:

Value Meaning
0 North
1 East
2 South
3 West

Thin wall/Canopy bitmask[edit]

Any number of these bits can be combined:

Bitmask Meaning
0x1 Thin wall (N)
0x2 Thin wall (E)
0x4 Thin wall (S)
0x8 Thin wall (W)
0x10 Canopy

Directional block arrows bitmask[edit]

Any number of these bits can be combined:

Bitmask Meaning
0x1 North
0x2 East
0x4 South
0x8 West

Tile modifiers[edit]

The modifier "tiles" (0x76, 0x77, 0x78) affect the tile specification that they carry in their additional data. The meaning of the modifier value depends on the type of tile they affect.

The size of the modifier is irrelevant, and modifiers default to zero. That is, if a tile is expecting a 16-bit modifier but the high byte is zero, an 8-bit modifier works as well. If a tile is expecting an 8-bit modifier which is zero, the modifier may be omitted entirely.

Wire modifier[edit]

This is an 8-bit modifier that affects floors, steel walls, ON/OFF switches, transmogrifiers, and blue and red teleports. It adds wires to the tile it affects. Any number of these bits can be combined:

Bitmask Meaning
0x1 Wire (N)
0x2 Wire (E)
0x4 Wire (S)
0x8 Wire (W)
0x10 Wire tunnel (N)
0x20 Wire tunnel (E)
0x40 Wire tunnel (S)
0x80 Wire tunnel (W)

Letter tile modifier[edit]

This is an 8-bit modifier that affects letter tiles by adding a symbol (usually an ASCII symbol) to them:

Values Meaning
0x1c Up arrow
0x1d Right arrow
0x1e Down arrow
0x1f Left arrow
0x20 through 0x5f Corresponding ASCII character (' ' through '_')

Clone machine arrow modifier[edit]

This is an 8-bit modifier that affects clone machines by specifying their direction. The values can be combined and will show up on the clone machine appropriately, but the game will only clone in one direction.

Value Meaning
0x1 Arrow (N)
0x2 Arrow (E)
0x4 Arrow (S)
0x8 Arrow (W)

Custom floor/wall modifier[edit]

This is an 8-bit modifier that affects custom walls or floors by replaces their style:

Value Meaning
0x0 Green
0x1 Pink
0x2 Yellow
0x3 Blue

Logic modifier[edit]

This is an 8-bit modifier that affects an inverter gate by replacing it with another gate. Modifiers outside of the ranges specified below will produce voodoo tiles.

Most logic gates have 4 assigned values instead of just 1; unless otherwise specified below, the face direction of the logic gate is determined by its index, stored in the order: North, East, South, West.

Values Meaning
0x0 through 0x3 Inverter gate
0x4 through 0x7 AND gate
0x8 through 0xb OR gate
0xc through 0xf XOR gate
0x10 through 0x13 Latch gate (clockwise arrow)
0x14 through 0x17 NAND gate
0x1e through 0x27 Counter gate (0 through 9)
0x40 through 0x43 Latch gate (counterclockwise arrow)

Track modifier[edit]

This is a 16-bit modifier that affects the railroad track tile. The low byte specifies which tracks exist; any number of bits can be combined:

Bitmask Meaning
0x1 Turn (NE)
0x2 Turn (SE)
0x4 Turn (SW)
0x8 Turn (NW)
0x10 Horizontal
0x20 Vertical
0x40 Track switch

The high byte is comprised of two nybbles. The lower nybble specifies which track is active. For tiles with a track switch, the active track is the only one that can be used; the others are shown in red.

Value Meaning
0x000 NE track is active
0x100 SE track is active
0x200 SW track is active
0x300 NW track is active
0x400 Horizontal track is active
0x500 Vertical track is active

The upper nybble is the tile's initial "entered" direction. When an actor starts the level already on top of this tile, it's treated as though it entered by moving in this direction. (If there are no tracks corresponding to that direction, the actor will be unable to move.)

REPL / PRPL section[edit]

This section contains the replay data. If this is a PRPL section, it must be unpacked first (see Section Packing). However the hash for the replay and the valid solution bit-flag is set in the OPTN section and not here

The contents of this section are as follows:

Bytes Content
1 Usually 0; function unknown
1 Random force floor initial direction
1 Randomness seed (used by blobs)
Varies A sequence of input changes; optionally terminated by 0xff

Input change[edit]

Specifies a change in input:

Bytes Content
1 Number of frames to wait before inputting the new input. The last input is still held while the new input is pending. Always <= 0xfc. Larger delays are specified via multiple input changes
1 An input bitmask specifying the new input

Input bitmask[edit]

Specifies which keys are pressed, any number of bits can be combined:

Bitmask Meaning
0x1 Drop item
0x2 Down
0x4 Left
0x8 Right
0x10 Up
0x20 Switch character
0x40 Cycle items
0x80 If set, this input is for player 2 in a split-screen game
  1. 1.0 1.1 The NOTE section can contain multiple clues separated by a "[CLUE]" line. The clues are assigned to the clue tiles in reading order.