BIN Format (Fury of the Furries)
Format type | Map/level |
---|---|
Map type | 2D tile-based |
Layer count | 3 |
Tile size (pixels) | 16×16 |
Viewport (pixels) | 320×200 |
Games |
Fury of the Furries maps contain the static background and landscape for the level, collectable coins, time extensions and extra lives and destructible bricks. They also contain the 'scripting for the game play itself', this is in the form of the definitions of the sprites that interact with the player character. There are up to 10 sprites in the level, each having up to 10 states. Triggers are defined for switching between states, and for the player and or sprites to switch on or off other game-play elements.
The file itself is run-length encoded, and after decompression is always a fixed length. Generally unused elements within the game are marked by the UINT16LE value 0xFFFF.
File Formats
RLE Compressed File Format
Data Type | Name | Description |
---|---|---|
FOURCC | header | Appears to be a header with version number. Most files decompress to an object 25518 bytes in length, but a handful of files are shorter, and appear to be earlier versions. byte is the shortest, at 25432 bytes, the last entry is the time field. |
UINT16LE | length | Number of bytes in section. if zero then stop decompressing. |
... | etc | continue with another 'length' until the final file size is achieved (25,518 bytes), or you read a 0 length. |
The file should end with a zero length section. i.e. two bytes of 0.
Uncompressed File Format
FILE Format
Data Type | Name | Description |
---|---|---|
UINT16LE | mapWidth | Width of the playable area (in tiles) between 20 and 78. |
UINT16LE | mapHeight | Height of the playable area (in tiles) between 13 and 51.
The maximum number of tiles in a game is 1024. This places constraints on the width and height. The minimum width is 20 to match the viewport size of 320 pixels, and this constrains the height to 51 (20 × 51 = 1020). The minimum height is 13 to match the viewport size of 200 pixels, and this constrains the width to 78 (13 × 78 = 1014). Any other combination of width and height is possible so long as it meets these constraints. |
UINT8[2][78 × 51] | tileIndex | Pairs of coordinates into a LBM Format DEC file containing the tiles. |
UINT16LE | decFile | The DEC file number less one. i.e. a value of 3 indicates DECOR04.LBM. |
UINT16LE | startLeft | The center of the starting position for the player character from the left of the level, less 16 pixels. |
UINT16LE | startTop | The center of starting position for the player character from the top of the level, less 16 pixels. |
UINT16LE | foregroundPaletteIndex | The index of the first palette entry to be regarded as foreground.
The palette for the DEC file has 16 colours and they are used in a particular order. The first is always black and is background (i.e. the player character is not blocked by this colour) The next 4 usually dark versions of yellow, red, green and blue and are used for the shadow colour of the player character sprite, in the 4 different forms that the player can take. The next colour (colour 5 in the palette) is the bright colour of the player character, and will be swapped out as the player changes form. The remaining colours a chosen to suit the needs of the stage of the game (desert, forest, mountains etc). Generally the lower colours are regarded as background, and the upper colours as foreground, and this is used in the collision detection for the player and the landscape. |
EXIT[5] | exit | 5 instances of a 6-byte structure describing the exits from the level. |
WATER[5] | water1 | 5 instances of an 8-byte structure describing the regions of water in the level. |
TELEPORT[5] | teleport | 5 instances of an 8-byte structure describing the regions of the game that can teleport the player. |
NONSTICK[5] | nonStick | 5 instances of an 8-byte structure describing regions that the player cannot attach a rope to. |
ACID[5] | acid | 5 instances of an 8-byte structure describing regions that will dissolve the player if touched. |
DANGER[20] | danger | 20 instances of an 8-byte structure describing regions that will explode the player if touched. |
SPRITE[10] | sprite | 10 instances of a 1688-byte structure describing sprites. |
UINT16LE | blueStart | 1 if the blue form of the player is available at the start of the game. |
UINT16LE | greenStart | 1 if the green form of the player is available at the start of the game. |
UINT16LE | redStart | 1 if the red form of the player is available at the start of the game. |
UINT16LE | yellowStart | 1 if the yellow form of the player is available at the start of the game. |
UINT8[12] | unknown | Purpose unknown. |
FIELD[5] | redField | 5 instances of an 8-byte structure describing the particle field that enables/disables the red form of the player. |
FIELD[5] | greenField | 5 instances of an 8-byte structure describing the particle field that enables/disables the green form of the player. |
FIELD[5] | yellowField | 5 instances of an 8-byte structure describing the particle field that enables/disables the yellow form of the player. |
FIELD[5] | blueField | 5 instances of an 8-byte structure describing the particle field that enables/disables the blue form of the player. |
WATER[5] | water2 | 5 further instances of an 8-byte structure describing the regions of water in the level.
Probably one of these 2 sets of water data describes regions that start full of water and can be emptied, and the others describe regions which start empty and can be filled. I'm not sure. |
UINT8[10] | unknown | Purpose unknown. |
UINT8 | waterPaletteIndex | Index of colour in palette used for water. |
UINT8 | airPaletteIndex | Index of colour in palette used for air.
These two palette entries can be used to modify the image as regions of water fill/empty. |
UINT16LE | time | Amount of time the player has to complete the level. In 30ths of a second (The game plays at 30 fps). |
CURRENT[5] | current | 5 instances of a 10-byte structure describing regions of air or water currents. |
UINT8 | motePaletteIndex | Index of colour in palette used for dust motes moving in currents. |
UINT8 | unknown | Purpose unknown. |
UINT16LE | spriteMap | Index of LBM Format SPR sprite map image to use for this level. 0 = A, 1 = B. |
EXITRETURN[5] | exitReturn | 5 instances of a 4-byte structure describing where the player character should re-enter the level following a side-quest. |
UINT16LE[5] | exitGraphic | 5 instances of and indication of how a player is depicted exiting. 0 used for the end of the level dissolves the level viewport in a swirling vortex. 1 is smooth and is used for tunnelling in multi-map levels. |
UINT16LE | unknown | Seems to indicate a row in the map at which some odd palette behaviour is observed. Possibly a bug, but it could be that the intention is to shift something in the colour scheme when the player is above ground / below ground. |
EXIT Format
The exit region is 16 × 16 pixels.
Data Type | Name | Description |
---|---|---|
UINT16LE | left | Left pixel of the centre of the exit. |
UINT16LE | top | top pixel of the centre of the exit. |
UINT16LE | destination | Level number less one to go to next from this exit. Also the most significant bit indicates 0 = level exit, 1 = go to side quest. e.g. if this value is 0x8006, then go to level 7 as a side-quest. |
WATER Format
Data Type | Name | Description |
---|---|---|
UINT16LE | left | Left pixel of the water region. |
UINT16LE | top | Top pixel of the water region. |
UINT16LE | right | Right pixel of the water region. |
UINT16LE | bottom | Bottom pixel of the water region. |
TELEPORT Format
The teleport region is 16 × 16 pixels.
Data Type | Name | Description |
---|---|---|
UINT16LE | srcX | Left pixel of the centre of the teleport region. |
UINT16LE | srcY | Top pixel of the centre of the teleport region. |
UINT16LE | destX | Right pixel of the centre of the teleport region. |
UINT16LE | destY | Bottom pixel of the centre of the teleport region. |
NONSTICK Format
Data Type | Name | Description |
---|---|---|
UINT16LE | left | Left pixel of the non-stick region. |
UINT16LE | top | Top pixel of the non-stick region. |
UINT16LE | right | Right pixel of the non-stick region. |
UINT16LE | bottom | Bottom pixel of the non-stick region. |
ACID Format
Data Type | Name | Description |
---|---|---|
UINT16LE | left | Left pixel of the acid region. |
UINT16LE | top | Top pixel of the acid region. |
UINT16LE | right | Right pixel of the acid region. |
UINT16LE | bottom | Bottom pixel of the acid region. |
DANGER Format
Data Type | Name | Description |
---|---|---|
UINT16LE | left | Left pixel of the danger region. |
UINT16LE | top | Top pixel of the danger region. |
UINT16LE | right | Right pixel of the danger region. |
UINT16LE | bottom | Bottom pixel of the danger region. |
FIELD Format
Data Type | Name | Description |
---|---|---|
UINT16LE | left | Left pixel of the particle field. |
UINT16LE | top | Top pixel of the particle field. |
UINT16LE | right | Right pixel of the particle field. |
UINT16LE | bottom | Bottom pixel of the particle field. |
CURRENT Format
Data Type | Name | Description |
---|---|---|
UINT16LE | left | Left pixel of the current region. |
UINT16LE | top | Top pixel of the current region. |
UINT16LE | right | Right pixel of the current region. |
UINT16LE | bottom | Bottom pixel of the current region. |
UINT16LE | flags | bit-0 and bit-1 : direction 00 = down, 01 = right, 10 = up, 11 = left bit-2: strength of current 0 = weak, 1 = strong bit-3: show current using dust motes 0 = no, 1 = yes |
EXITRETURN Format
Data Type | Name | Description |
---|---|---|
UINT16LE | left | Left pixel of the centre of the return region. |
UINT16LE | top | Top pixel of the return region. |
REGION Format
Data Type | Name | Description |
---|---|---|
UINT16LE | left | Left of region |
UINT16LE | top | Top of region |
UINT16LE | right | Right of region |
UINT16LE | bottom | Bottom of region |
SPRITE Format
Data Type | Name | Description |
---|---|---|
UINT8 | layer | 0 = middleground (can interact with the player) 1=background 2=foreground (player can move behind it). |
UINT8 | malevolence | Bit-0: sprite will kill player in ? form Bit-1: sprite will kill player in yellow form Bit-2: sprite will kill player in ? form Bit-3: sprite will kill player in ? form. |
UINT16LE | unknown | Purpose unknown |
UINT16LE | mask | Sprite requires a mask graphic for transparency. If a mask is required, it will be immediately below the sprite tile in the SPR file. |
UINT16LE | cleanUp | The previous sprite image needs to be removed for each frame. This is not necessary if the sprite is unmasked and never changes position. |
UINT16LE | strength | How much damage the sprite can sustain. 0 = infinite, otherwise 1-127. |
UINT16LE | blastArea | Size of the explosion if the sprite is destroyed. (Purely a decorative concern, there is no splash damage). |
UINT16LE | active | Is the sprite in use. |
UINT8[2] | unknown | |
REGION | furryEntryRegion | Sprite will activate if furry enters this region. |
REGION | furryExitRegion | Sprite will activate if furry leaves this region. |
UINT8[72] | unknown | Suspect that this region is actually populated and used as working space while the level is being played. |
UINT16LE | fireRate | How often the sprite fires projectiles. 0 = none, 1-5 = low-high. |
UINT16LE | fireType | How are projectiles fired. 1 = All directions slowly, 2 = Right, 3 = Left, 4 = All directions medium, 5 = All directions fast. |
STATE[10] | state | 10 instances of a 158-byte structure describing the states that the sprite can be in. |
STATE Format
Data Type | Name | Description |
---|---|---|
UINT16LE | left | Left pixel of the sprite location. |
UINT16LE | top | Top pixel of the sprite location. |
UINT16LE | destState | Another state to move towards. The sprite will physically move to the location of the destination state, and change state when it reaches that location. |
UINT16LE | speed | Speed of sprite movement 0 = None, 1-5 = slow-fast. |
UINT8 | movementType | 0 = horizontal then vertical, 1 = as the crow flies, 2 = just track player vertically, no sideways movement, 3 = just track player horizontally, no up/down movement, 4 = track player, 5 = fast move??, 6 = None. |
UINT8 | destWaterState | Another state to change to when a requested water level change is acheived. |
UINT8 | gravity | If 1, the sprite falls when unsupported. |
UINT8 | current | Control currents. Bits 0-4 specify currents affected, Bit-5 turns currents off, Bit-6 turns currents on. |
UINT16LE | activateSprite | Number of another sprite to activate. |
TRIGGER | entryTrigger | A 10-byte structure that describes a trigger to change state when the player enters a region. |
TRIGGER | exitTrigger | A 10-byte structure that describes a trigger to change state when the player leaves a region. |
TRIGGER | spriteEntryTrigger | A 10-byte structure that describes a trigger to change state when another sprite enters a region. |
TRIGGER | spriteExitTrigger | A 10-byte structure that describes a trigger to change state when another sprite leaves a region (or is destroyed). |
UINT8 | destroy | The sprite is destroyed (deactivated) when it enters this state. |
UINT8 | bounce | The sprite bounces ballistically when it hits a surface. |
UINT16LE | emptyWater | Bits 8-15 speed of emptying, Bits 0-7 number of water region to empty. |
UINT16LE | fillWater | Bits 8-15 speed of filling, Bits 0-7 number of water region to fill. |
UINT8[4] | unknown | Seems to affect the starting location of projectiles, relative to the sprite location. |
UINT16LE | waterTriggerLeft | Left pixel of region for water trigger (see destWaterState field). |
UINT16LE | waterTriggerTop | Top pixel of region for water trigger. |
UINT16LE | waterTriggerRight | Right pixel of region for water trigger. |
FRAME[10] | frame | 10 instances of an 8-byte structure describing the sprite tile location within the SPR image file |
UINT16LE | animSpeed | Rate of frame change of sprite animation. |
UINT16LE | cycle | Does the animation cycle repeat. |
UINT8 | cycleCount | Number of animation frames before changing state. |
UINT8 | animTriggerState | Sprite state to move to when cycleCount is reached. |
UINT16LE | waterTriggerBottom | Bottom pixel of region for water trigger. |
TRIGGER Format
Data Type | Name | Description |
---|---|---|
UINT16LE | state | State to move to when triggered. |
UINT16LE | left | Left pixel of the trigger region. |
UINT16LE | top | Top pixel of the trigger region. |
UINT16LE | right | Right pixel of the trigger region. |
UINT16LE | bottom | Bottom pixel of the trigger region. |
FRAME Format
Data Type | Name | Description |
---|---|---|
UINT16LE | left | Left pixel of the sprite on the SPR image file. |
UINT16LE | top | Top pixel of the sprite on the SPR image file. |
UINT16LE | right | Right pixel of the sprite on the SPR image file + 8 pixels. |
UINT16LE | bottom | Bottom pixel of the sprite on the SPR image file. |
Notes
There are 10 different stages in the game, and correspondingly 10 different tile and sprite sets.
The tile images for the backgrounds and landscape are stored in the DEC directory, in image files which are in LBM Format. These files are named DECORxx.LBM where xx is specified by the decFile field of the main structure.
The sprite images are stored in the SPR directory, in image files which are in LBM Format. These files are named SPRxxn where xx is specified by the decFile field of the main structure, and n is specified by the spriteMap field in the main structure.
The sprites can be of varying sizes, the FRAME data structure describes the bounding box in pixels within the sprite image file. If the sprite requires a transparency mask, then this mask will be a rectangular region with the same size as the sprite, and placed in the image file immediately below the sprite.
Within the tile image file, all the tiles are 16 × 16 pixels, tiles are referenced in the main file structure as a pair of byte coordinates, giving the X and Y position in tiles within the image file.
Certain tiles in the image file have special meaning.
The tile at 0,1 is a coin. If the player touches this tile in the level, they will gain a coin, and the tile will be swapped out for the tile at 0,0 which is always empty.
The tile at 0,2 is an extra life. If the player touches this tile in the level, they will gain an extra life, and the tile will be swapped out for the tile at 0,0.
The tile at 0,3 is a time extension. If the player touches this tile in the level, they will gain an extra 30 seconds on the clock, and the tile will be swapped out for the tile at 0,0.
All the remaining tiles on rows 0, 1 and 2 in the map are destructible tiles. The red form of the player can chew through the scenery. Chewing a tile from row 0 will cause that tile to be swapped out with the tile immediately below it in row 1. Chewing a tile from row 1 will cause that tile to be swapped out with the tile immediately below it in row 2. Chewing a tile from row 2 will cause that tile to be swapped out with the tile at 0,0, which is empty, so the player can then get through the gap created. Typically the tiles in these rows depict a gradually degraded state, you can have tiles that require more or less action to destroy them, by choosing from the three rows. Often the top row tiles are visually indistinguishable from some other non-destructible tiles in the tileset, allowing you to hide destructible tiles.
Tools
The following tools are able to work with files in this format.
Name | Platform | View? | Create new? | Modify? | Access hidden data? | Edit metadata? | Notes |
---|---|---|---|---|---|---|---|
FuryUtils | x64Windows, Linux | No | Yes | Yes | No | No | Converts to and from text files |
Credits
This file format was reverse engineered by carbon14. 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!)