the cutting room mirror

SpongeBob SquarePants: Battle for Bikini Bottom (GameCube, PlayStation 2, Xbox)

This article has a talk page!This article has a talk page!
view on tcrf.net

This page contains notes for the game SpongeBob SquarePants: Battle for Bikini Bottom (GameCube, PlayStation 2, Xbox).

The .HIP/.HOP files can be extracted with the Industrial Park level editor or a QuickBMS script. Industrial Park is recommended nowadays as it lets you view levels in 3D and edit them.

Most of the information known surrounding the filesystem and the assets used in the game can be found at the BFBB Wiki.

Filetypes commonly found in .HOP files#

.HOP files contain the assets of each level. Since Battle for Bikini Bottom uses the same .HIP/.HOP filesystem as the SpongeBob Movie Game, please refer to that game's notes page for the list of filetypes commonly found in .HOP files.

Filetypes commonly found in .HIP files#

.HIP files contain spawn data, as well as markers (cameras, triggers, ports) and other things that make up the inner working of each level. Since Battle for Bikini Bottom uses the same .HIP/.HOP filesystem as the SpongeBob Movie Game, please refer to that game's notes page for the list of filetypes commonly found in .HIP files.

Folder Abbreviations#

HIP/HOP files#

HIP/HOP files are archives, much like ZIP or RAR files. They are made up of many individual assets. HIP/HOP files group specific assets together into layers, in order to optimize loading.

HIP/HOP files are used in 5 Heavy Iron games:

  • Scooby Doo: Night of 100 Frights
  • SpongeBob SquarePants: Battle for Bikini Bottom
  • The SpongeBob SquarePants Movie
  • The Incredibles
  • The Incredibles: Rise of the Underminer

Assets#

There are a total of 94 asset types used in HIP/HOP files:

Asset Type

Full name

Description

1

2

3

4

5

ALST

AnimList

✔

✔

✔

✔

✔

ANIM

Anim

✔

✔

✔

✔

✔

ATBL

AnimTable

✔

✔

✔

✔

✔

ATKT

AttackTable

✔

BINK

Bink

✔

✔

BOUL

Boulder

✔

✔

✔

✔

BSP

BSP (RenderWare .bsp)

✔

BUTN

Button

✔

✔

✔

✔

CAM

Camera

✔

✔

✔

✔

✔

CCRV

CamCurve

✔

CNTR

Counter

✔

✔

✔

✔

✔

COLL

.collision table

✔

✔

✔

✔

COND

Conditional

✔

✔

✔

✔

✔

CRDT

Credits

✔

✔

✔

✔

CSN

Cutscene

✔

✔

✔

CSNM

Cutscene Mgr

✔

✔

✔

✔

CSSS

Cutscene Streaming Sound

✔

✔

CTOC

Cutscene TOC

✔

✔

✔

✔

DEST

Destructible Object

✔

✔

✔

DPAT

Dispatcher

✔

✔

✔

✔

✔

DSCO

Disco Floor

✔

✔

DSTR

Destructible Object

✔

✔

DTRK

✔

DUPC

✔

DYNA

Dynamic Type

✔

✔

✔

✔

EGEN

Electric Arc Generator

✔

✔

✔

ENV

Environment

✔

✔

✔

✔

✔

FLY

Flythrough

✔

✔

FOG

Fog

✔

✔

✔

✔

✔

GRSM

GrassMesh

✔

GRUP

Group

✔

✔

✔

✔

✔

GUST

✔

HANG

✔

✔

JAW

.jaw data

✔

✔

✔

JSP

JSP (RenderWare .jsp)

✔

✔

✔

✔

LITE

Light

✔

LKIT

LightKit

✔

✔

✔

✔

LOBM

LobMaster

✔

LODT

.lod.table

✔

✔

✔

✔

MAPR

✔

✔

✔

✔

✔

MINF

Model Info

✔

✔

✔

✔

✔

MODL

Model (RenderWare .dff)

✔

✔

✔

✔

✔

MPHT

✔

MRKR

Marker

✔

✔

✔

✔

✔

MVPT

Move Point

✔

✔

✔

✔

✔

NGMS

NavMesh

✔

✔

NPC

NPC

✔

NPCS

NPC Settings

✔

✔

ONEL

Oneliners

✔

PARE

Particle Emitter

✔

✔

✔

✔

PARP

Particle Emitter Property

✔

✔

✔

PARS

Particle System

✔

✔

✔

✔

PEND

Pendulum

✔

PGRS

✔

✔

PICK

PickupTable

✔

✔

✔

✔

PIPT

.pipe info table

✔

✔

✔

✔

PKUP

Power Up/Item

✔

✔

✔

PLAT

Platform

✔

✔

✔

✔

✔

PLYR

Player

✔

✔

✔

✔

✔

PORT

Portal

✔

✔

✔

✔

✔

PRJT

Projectile

✔

RANM

Reactive Anim

✔

✔

RAW

Raw

✔

✔

✔

RWTX

Texture (RenderWare .txd)

✔

✔

✔

✔

✔

SCRP

Script

✔

✔

✔

SDFX

SFX

✔

✔

✔

SFX

SFX

✔

✔

SGRP

Sound Group

✔

✔

✔

SHDW

.simple shadow table

✔

SHRP

Shrapnel

✔

✔

✔

✔

SIMP

Simple Object

✔

✔

✔

✔

✔

SLID

Slide Properties

✔

SND

Sound

✔

✔

✔

✔

✔

SNDI

Sound Info

✔

✔

✔

✔

✔

SNDS

Streaming Sound

✔

✔

✔

✔

✔

SPLN

Spline

✔

✔

✔

SPLP

Spline Path

✔

SSET

Scene Settings

✔

SUBT

Subtitles

✔

✔

SURF

Surface

✔

✔

✔

✔

✔

TEXS

✔

✔

✔

TEXT

Text

✔

✔

✔

✔

✔

TIMR

Timer

✔

✔

✔

✔

✔

TPIK

✔

✔

TRIG

Trigger

✔

✔

✔

✔

✔

TRWT

✔

✔

UI

UI

✔

✔

UIFT

UI Font

✔

✔

UIM

UI Motion

✔

✔

✔

VIL

NPC

✔

✔

VILP

NPC Properties

✔

VOLU

✔

✔

WIRE

Wireframe

✔

✔

ZLIN

ZipLine

✔

Layers#

There are 11 layer types in BFBB:

  • DEFAULT
  • TEXTURE
  • BSP
  • MODEL
  • ANIMATION
  • VRAM
  • SRAM
  • SNDTOC
  • CUTSCENE
  • CUTSCENETOC
  • JSPINFO

Format#

HIP/HOP files are big endian.

HIP/HOP files use sections as organization. Sections can contain data as well as sub-sections. There are 20 defined section types:

  • HIPA, PACK, PVER, PFLG, PCNT, PCRT, PMOD, PLAT, DICT, ATOC, AINF, AHDR, ADBG, LTOC, LINF, LHDR, LDBG, STRM, DHDR, DPAK

Sections#

Each section starts with an 8-byte header:

char[4] sectionType
int sectionSize

After the header is all the data for the section, which must be the same size as sectionSize. The data is made up of various fields and sub-sections. The exact format for each section type is defined in Structure (below).

Strings#

HIP/HOP files store strings with a null-terminator and align them to a 2-byte offset. This means that there will always be one 0x00 at the end of a string (including empty strings), and possibly one more 0x00 for padding.

Structure#

section HIPA:
    // This section is empty

section PACK:
    section PVER:
        int subVersion
        int clientVersion
        int compatible
    section PFLG:
        int flags
    section PCNT:
        int numAssets
        int numLayers
        int[3] unknown
    section PCRT:
        time_t dateCreated
        string dateCreatedString // Format: "Sat Jan 01 00:00:00 2000"
    section PMOD:
        time_t dateModified
    section PLAT:
        // Optional section (game doesn't crash if not present).
        // Scooby Doo: N100F doesn't have this section.

        // Format for BFBB:
        string platformCode // GC, P2, or XB
        string platformName // GameCube, PlayStation 2, or Xbox
        string regionFormat // NTSC or PAL
        string language // US Common
        string game // Sponge Bob

        // Format for TSSM/Incredibles:
        string platformCode // GC, PS2, or BX
        string languageCode // US
        string regionFormat // NTSC or PAL
        string game // Incredibles
                    // Yes, in TSSM this is set to Incredibles

section DICT:
    section ATOC:
        section AINF:
            int unknown = 0
        section[numAssets] AHDR:
            int assetID
            char[4] assetType
            int assetDataOffset
            int assetSize
            int assetPlus // amount of padding after asset data (ignored)
            int assetFlags // 1 = SOURCE_FILE
                           // 2 = SOURCE_VIRTUAL
                           // 4 = READ_TRANSFORM
                           // 8 = WRITE_TRANSFORM
            section ADBG:
                int unknown
                string assetName
                string assetFilename // empty string if !(assetFlags & SOURCE_FILE)
                int assetChecksum // ignored
    section LTOC:
        section LINF:
            int unknown = 0
        section[numLayers] LHDR:
            int layerType
            int layerNumAssets
            int[layerNumAssets] layerAssets // asset IDs
            section LDBG:
                int unknown = -1
section STRM:
    section DHDR:
        int unknown = -1
    section DPAK:
        // If numAssets == 0, this section is empty. (No paddingBeforeFirstLayer)
        // Else, this section contains each layer (in order of LHDR sections),
        //     padded with 0x33 bytes to the layer alignment setting,
        //     which depends on the game and target platform.
        // Each layer contains the data of each asset in the layer
        //     (in order of LHDR.layerAssets), padded with 0x33 bytes
        //     to the alignment setting for the asset's type,
        //     which depends on the game and target platform.
        //     The amount of padding is written to the assetPlus field
        //     in the AHDR section for the asset.

        int paddingBeforeFirstLayer
        byte[paddingBeforeFirstLayer] padding
        for each LHDR:
            for each asset in LHDR.layerAssets:
                byte[...] asset.data
                byte[...] padding = [0x33, ...]
            byte[...] padding = [0x33, ...]