BIN Format (Fury of the Furries)

From ModdingWiki
Jump to navigation Jump to search
BIN Format (Fury of the Furries)
BIN Format (Fury of the Furries).png
Format typeMap/level
Map type2D tile-based
Layer count3
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.
byt1 and byt3 are 25482 bytes long, and include currents.
byt4 is 25518, it's the version seen for the vast majority of the files, and includes all the fields after the currents.

UINT16LE length Number of bytes in section.

if zero then stop decompressing.
if less than 0x7D00 then use the following length bytes from the input.
otherwise use the following byte from the input (length - 0x7D00) times.

compressed and uncompressed sections always alternate, even if this makes the packing less efficient. This means that if you have two adjacent runs, There will be at least 1 character represented as uncompressed.

... 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 PlatformView? Create new? Modify? Access hidden data? Edit metadata? Notes
FuryUtils x64Windows, LinuxNoYesYesNoNo 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!)