C2M

Revision as of 20:16, 5 January 2019 by imported>Zrax0111 (Update tile and modifier specifications based on testing.)
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

Overview

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.

All data in the file is little-endian.

Section header format

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

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 by CC2.
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 [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, could be a MD5 hash of something
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 readonly so it can't be edited in the level editor.
END No content (length is 0) Signifies end of file

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

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

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.

A Data Block:

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.

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

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

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:

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
0x1 Floor
0x2 Wall
0x3 Ice
0x4 Ice, South West Corner
0x5 Ice, North West Corner
0x6 Ice, North East Corner
0x7 Ice, South East Corner
0x8 Water
0x9 Fire
0xa Force Floor, North
0xb Force Floor, East
0xc Force Floor, South
0xd Force Floor, West
0xe Green Toggle Wall
0xf Green Toggle Floor
0x10 Red Teleport
0x11 Blue Teleport
0x12 Yellow Teleport
0x13 Green Teleport
0x14 Exit
0x15 Slime (the obstacle)
0x16 Chip (the hero) Direction byte, Tile Specification for tile underneath
0x17 Dirt Block Direction byte, Tile Specification for tile underneath
0x18 Walker Enemy Direction byte, Tile Specification for tile underneath
0x19 Ship Enemy Direction byte, Tile Specification for tile underneath
0x1a Ice Block Direction byte, Tile Specification for tile underneath
0x1b (Unused) East Panel Tile Specification for tile underneath
0x1c (Unused) South Panel Tile Specification for tile underneath
0x1d (Unused) South+East Panel Tile Specification for tile underneath
0x1e Gravel
0x1f Door Toggle Button
0x20 Blue Tank Button
0x21 Blue Tank Direction byte, Tile Specification for tile underneath
0x22 Red Door
0x23 Blue Door
0x24 Yellow Door
0x25 Green Door
0x26 Red Key Tile Specification for tile underneath
0x27 Blue Key Tile Specification for tile underneath
0x28 Yellow Key Tile Specification for tile underneath
0x29 Green Key Tile Specification for tile underneath
0x2a IC Chip Tile Specification for tile underneath
0x2b Extra IC Chip Tile Specification for tile underneath
0x2c IC Chip Socket
0x2d Push-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 tile underneath
0x34 Centipede Direction byte, Tile Specification for tile underneath
0x35 Purple Ball Direction byte, Tile Specification for tile underneath
0x36 Blob Direction byte, Tile Specification for tile underneath
0x37 Red Teeth Direction byte, Tile Specification for tile underneath
0x38 Fire box Direction byte, Tile Specification for tile underneath
0x39 Clone Button
0x3a Trap Button
0x3b Cleats Tile Specification for tile underneath
0x3c Magno Shoes Tile Specification for tile underneath
0x3d Fire Shoes Tile Specification for tile underneath
0x3e Flippers Tile Specification for tile underneath
0x3f Red Thief
0x40 Red Bomb Tile Specification for tile underneath
0x41 (Unused)
0x42 Trap
0x43 (Unused -- Behaves like Clone Machine)
0x44 Clone Machine (Modifier required, see below)
0x45 Clue Tile
0x46 Force Field, Random
0x47 Area Control Button
0x48 Revolving Door, South West
0x49 Revolving Door, North West
0x4a Revolving Door, North East
0x4b Revolving Door, South East
0x4c Time Bonus Tile Specification for tile underneath
0x4d Time Toggle Tile Specification for tile underneath
0x4e Transformer
0x4f Train Tracks Base (Modifier required, see section below)
0x50 Metal Wall
0x51 Time Bomb Tile Specification for tile underneath
0x52 Helmet Tile Specification for tile underneath
0x53 (Unused) Direction byte, Tile Specification for tile underneath
0x54 (Unused)
0x55 (Unused)
0x56 Melinda Direction byte, Tile Specification for tile underneath
0x57 Blue Teeth Direction byte, Tile Specification for tile underneath
0x58 (Unused) Explosion Animation Direction byte, Tile Specification for tile underneath
0x59 Hiking Shoes Tile Specification for tile underneath
0x5a Male Only Sign
0x5b Female Only Sign
0x5c Inverter Gate, North (Modifier allows other gates, see below)
0x5d (Unused) Direction byte, Tile Specification for tile underneath
0x5e Logic Switch, On
0x5f Flame Jet, Off
0x60 Flame Jet, On
0x61 Flame Jet Button
0x62 Lightning Bolt Tile Specification for tile underneath
0x63 Yellow Tank Direction byte, Tile Specification for tile underneath
0x64 Yellow Tank D-Pad
0x65 Mirror Chip (the enemy) Direction byte, Tile Specification for tile underneath
0x66 Mirror Melinda Direction byte, Tile Specification for tile underneath
0x67 (Unused)
0x68 Bowling Ball Tile Specification for tile underneath
0x69 Rover Direction byte, Tile Specification for tile underneath
0x6a Time Penalty Tile Specification for tile underneath
0x6b Custom Floor, Brown (Modifier allows other styles, see below)
0x6c (Unused)
0x6d Panels/Canopy, see below Panel/Canopy bitmask, Tile Specification for tile underneath
0x6e (Unused)
0x6f Railroad Crossing Sign Tile Specification for tile underneath
0x70 Custom Wall, Brown (Modifier allows other styles, see below)
0x71 "Sunken" Floor (Modifier required, see below)
0x72 Purple Toggle Wall
0x73 Purple Toggle Floor
0x74 (Unused)
0x75 (Unused)
0x76 8-bit Modifier (see Modifier section below) 1 modifier byte, Tile Specification for affected tile
0x77 16-bit Modifier (see Modifier section below) 2 modifier bytes, Tile Specification for affected tile
0x78 32-bit Modifier (see Modifier section below) 4 modifier bytes, Tile Specification for affected tile
0x79 (Unused) Direction byte, Tile Specification for tile underneath
0x7a 10 Point Flag Tile Specification for tile underneath
0x7b 100 Point Flag Tile Specification for tile underneath
0x7c 1000 Point Flag Tile Specification for tile underneath
0x7d Stay Up Green Wall
0x7e Pop Down Green Wall
0x7f "Forbidden" mark (modifies items/keys) Tile Specification for tile underneath
0x80 2x Points Flag Tile Specification for tile underneath
0x81 Directional Block Direction byte, Directional Arrows Bitmask, Tile Specification for tile underneath
0x82 Floor Mimic Direction byte, Tile Specification for tile underneath
0x83 Green Bomb Tile Specification for tile underneath
0x84 Green IC Chip Tile Specification for tile underneath
0x85 (Unused) Tile Specification for tile underneath
0x86 (Unused) Tile Specification for tile underneath
0x87 Reverse Logic Button
0x88 Off Switch, Off
0x89 On Switch, On
0x8a Red Thief
0x8b Ghost Direction byte, Tile Specification for tile underneath
0x8c Steel Foil Tile Specification for tile underneath
0x8d Turtle
0x8e Eye Tile Specification for tile underneath
0x8f Bribe Tile Specification for tile underneath
0x90 Speed Shoes Tile Specification for tile underneath
0x91 (Unused)
0x92 Hook Tile Specification for tile underneath

Direction Byte

The direction byte comes after enemy tiles and some others:

Value Meaning
0 North
1 East
2 South
3 West

Panel/Canopy Bitmask

Any number of these bits can be combined:

Bitmask Meaning
0x1 Panel, North
0x2 Panel, East
0x4 Panel, South
0x8 Panel, West
0x10 Canopy

Directional Arrows Bitmask

Any number of these bits can be combined:

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

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.

Wire Modifier

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:

Bitmask Meaning
0x1 Wire, North
0x2 Wire, East
0x4 Wire, South
0x8 Wire, West
0x10 Wire Tunnel, North
0x20 Wire Tunnel, East
0x40 Wire Tunnel, South
0x80 Wire Tunnel, West

ASCII Modifier

This is an 8-bit modifier that affects "sunken" floors 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 Characterr (' ' through '_')

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:

Value Meaning
0x1 Arrow, North
0x2 Arrow, East
0x4 Arrow, South
0x8 Arrow, West

Custom Floor/Wall Modifier

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

Value Meaning
0x1 Custom Wall/Floor, Pink
0x2 Custom Wall/Floor, Yellow
0x3 Custom Wall/Floor, Blue

Logic Modifier

This is an 8-bit modifier that affects an inverter gate by replacing it with another gate:

Values Meaning
0x1 through 0x3 Inverter Gate East/South/West
0x4 through 0x7 And Gate North/East/South/West
0x8 through 0xb Or Gate North/East/South/West
0xc through 0xf Xor Gate North/East/South/West
0x10 through 0x13 Latch North/East/South/West, Clockwise Arrow
0x14 through 0x17 Nand Gate North/East/South/West
0x1e through 0x27 Counter Gate 0 through 9
0x40 through 0x43 Latch North/East/South/West, Counter Clockwise Arrow

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:

Bitmask Meaning
0x1 Track, North East
0x2 Track, South East
0x4 Track, South West
0x8 Track, North West
0x10 Track, Horizontal
0x20 Track, Vertical
0x40 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).

Value Meaning
(Omitted) North East track is active
0x100 South East track is active
0x200 South West track is active
0x300 North West track is active
0x400 Horizontal track is active
0x500 Vertical track is active

REPL / PRPL section

This section contains the replay data. If this is a PRPL section, it must be unpacked first (see Section Packing).

The contents of this section are as follows:

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

Input Change

Specifies a change in input:

Bytes Content
1 Number of frames passed since previous input change. Always <= 0xfc. Larger delays are specified via multiple input changes.
1 An input bitmask specifying the new input

Input Bitmask

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 "[CLUE]" line. The clues are assigned to the clue tiles in order of appearance of both.