BLO file

From Pikmin Technical Knowledge Base
Jump to navigation Jump to search

Types of BLO

The BLO filetype is used by several Nintendo games such as Pikmin, Pikmin 2, Super Mario Sunshine, and The Legend of Zelda: The Wind Waker to control screen data, such as which sprites appear and where. There are 3 main types of a blo file, scrnblo1 (which Sunshine and Wind Waker use), scrnblo2 (which Pikmin 2 uses), and the format Pikmin uses, sometimes called scrnblo0. There are several differences between them and they are not interchangeable. This page will focus on scrnblo2, the flavour Pikmin 2 uses.

TEX1

The first main segment of a scrnblo2 file, this is where the game loads BTI textures in /new_screen/*language*/*screen szs*/timg. You can change the filenames of the textures to be loaded, and possibly add or remove entries. The number of textures to load is defined in a BE 32 bit integer 0x08 away from the sections magic TEX1.

FNT1

This section is dedicated to loading fonts, hence the name FNT1. In Pikmin 2, this only ever loads piki2_font00.bfn.

MAT1

This section creates screen "objects" with internal names that the game uses to control them. Its by far the biggest segment of the BLO. The important part is where the names of the materials are listed. They always follow the naming convention of mat_name_v. The main makeup of this section is padding.

PAN2

This section acts like a group, it holds many PIC2 and TBX2 segments together so you can easily move a whole object as one piece. There is always a PAN2 section called ROOT in every scrnblo2, and sometimes more.

  • 0x12: The name of the material.
  • 0x20: 2 floats representing x and y size coordinates. Does nothing in PAN2.
  • 0x28: 2 floats representing x and y scale. Often 1.
  • 0x3C: 2 floats representing x and y coordinates, relative to parent PAN2.

A PAN2 is like an opening curly bracket, everything after it will be a child of it, until you reach and "END1" command, which acts like the closing bracket. You can have PAN2 objects nested in other PAN2s as well.

PIC2

This is very similar to the last segment, but for an individual sprite object. They are notably longer than PAN2 segments. You probably shouldn't change their parameters if you have the option to edit their whole PAN2 segment instead. Here's some info about them:

  • 0x07: string saying pan2
  • 0x19: Name of material, it likes to have RE before it for some reason, but that's not part of the name.
  • 0x28: x and y pixel dimensions.
  • 0x30: x and y scale.
  • 0x45: x and y coordinates relative to parent PAN2 entry.

After that is a whole row for the RGBA gradient colors for each corner of the sprite.

TBX2

These are a lot like PIC2, and are also part of a PAN2. The difference is they write text using the loaded font.

  • 0x07: string for pan2, could be what connects the single tbx2 to a pan2.
  • 0x1A: internal name of material being used.
  • 0x21: text ID used. The developers like to put placeholder text IDs here when the screen could show multiple messages, so it only really works for fully static text.
  • 0x27: x and y dimensions of containing box
  • 0x30: x and y scale.
  • 0x43: x and y offset to parent.

After that is some random data, followed by the text itself, in an early version where things like color and size change and text box terminators are called by their internal names. Can show early scripts of the games text in some areas.

Colors

To do: Cleanup. Also, what JSON is this referring to?

There are three BLO colors for a single object, TevColors, MatColors and Color1 and Color2

TevColors are shown like this in the json:

 "tevcolors": [
   "00000000008c0000",
   "00000000008c00ff",
   "0000000000000000",
   "0000000000000000"

Colors here are Hex values, and each RGBA value has a "00" before each value, so "00ff00ff00ff00ff" is white. this colors the entire bti.

MatColors are shown like this:

 "matcolors": [
   [
     255,
     255,
     255,
     2
   ],
   [
     255,
     255,
     255,
     255
   ]

I rarely see vanilla blo files use this aside from alpha values most of the time. Because I have rarely seen them, I assume this is for coloring the top and bottom of the bti respectfully.

Color1 and Color2 are shown like this, and are located in the Pane section of an object, rather than the material section, unlike MatColors and TevColors

 "color1": {
     "unk1": 812,
     "unk2": 813,
     "unknowns": [
       0,
       0,
       256,
       0
   ],
     "col1": [
       255,
       255,
       255,
       255
   ],
     "col2": [
       255,
       255,
       255,
       255
   ]
 },
 "color2": {
     "unk1": 814,
     "unk2": 815,
     "unknowns": [
       0,
       256,
       256,
       256
 ],
     "col1": [
       255,
       255,
       255,
       255
 ],
     "col2": [
       255,
       255,
       255,
       255
 ]

These values color the top and bottom corners of the bti/object. col1 is for the left corners, and col2 is for the right corners, color1 is for the top corners, color2 is for the bottom corners