From ZeldaMods (Breath of the Wild)
Jump to navigation Jump to search

beco is a file format that is used for storing per-coordinate data.


beco files are little endian on Switch and big endian on Wii U.


Offset Type Description
0x0 u32 Magic (0x00112233)
0x4 u32 Number of rows
0x8 u32 Divisor
0xc u32 Padding


Offset Type Description
0x0 u32[num_rows] Offsets to row data, divided by 2 and relative to the start of the row section



Offset Type Description
0x0 u16 Custom data
0x2 u16 Length (X axis)

This structure is repeated until the entire row has been covered by segments. The sum of all segment lengths is equal to the length of the map on the X axis.


Getting data for a given coordinate

The algorithm that returns the custom data that is associated with a coordinate is very simple. It consists of determining the correct row index in the table, then iterating over segments in that row and returning the segment data when the X coordinate is within its bounds.

s32 Ecosystem::getMapArea(const EcoMapInfo& info, f32 posX, f32 posZ) const {
    posX = sead::Mathf::clamp(posX, -5000.0f, 4999.0f);
    posZ = sead::Mathf::clamp(posZ, -4000.0f, 4000.0f);

    const auto epsilon = [](float n) { return n >= 0.0f ? 0.5f : -0.5f; };

    s32 x = s32(posX + 5000.0f + epsilon(posX + 5000.0f));
    s32 z = s32(posZ + 4000.0f + epsilon(posZ + 4000.0f)) / info.mHeader->divisor;
    s32 row = sead::Mathi::clamp(z, 0, info.mHeader->num_rows - 2);

    if (info.mHeader->divisor == 10)
        x /= 10;

    if (info.mRowOffsets[row] >= info.mRowOffsets[row + 1])
        return -1;

    auto* segmentEnd = reinterpret_cast<const Segment*>(info.mRows + 2 * info.mRowOffsets[row + 1]);
    auto* segment = reinterpret_cast<const Segment*>(info.mRows + 2 * info.mRowOffsets[row]);
    s32 totalLength = 0;
    while (true) {
        totalLength += segment->length;
        if (x < totalLength)
        if (segment >= segmentEnd)
            return -1;
    return segment->value;


Usage in Breath of the Wild

beco files are used in Breath of the Wild to map coordinates to arbitrary u16 data. Three beco files are used for different purposes: FieldMapArea.beco, MapTower.beco and LoadBalancer.beco.