terrible ffl_odb.dat reader for david

by arian_

HTML

<h3>parser for CFL_DB.dat (3DS), FFL_ODB.dat (Wii U) mii databases</h3>
<input type="file" id="fileInput" accept=".dat" />
<h2>Data List:</h2>
<ul id="miiList">
    <!-- Mii images with Base64 strings will be appended here -->
</ul>

<script src="cfl-ffl-db-reader.js"></script>

<script>
// embedded version of chayton's gzipped FFL_ODB.dat
// source (private): https://discord.com/channels/360173962862395392/485919503369371648/1244505755844087809
var FFL_ODB_GZ_B64 =...

JavaScript

// @ts-check

/* eslint @stylistic/indent: ['error', 4] -- Define indent rules. */
/* eslint no-var: "off", prefer-const: "off", -- Configure for ES5 environment. */
/* eslint @stylistic/no-multi-spaces: 'off' -- Allow spaces after comments. */

// read the bottom of the file for official CFL structs!
var CFL_DB_IDENTIFIER = 'CFOG';
var FFL_ODB_IDENTIFIER = 'FFOC';
/** Start of m_MiiDataOfficial (Mii data) array, same for CFL_DB.dat as well. */
var DATABASE_MIIDATA_OFFSET = 8;
/** Size of FFLiMiiDataOfficial/CFLiPackedMiiDataOfficial - 0x5C bytes. */
var FFLI_MII_DATA_OFFICIAL_SIZE = 92;
/** Size of FFLCreateID/Ver3CreateId - 0xA bytes. */
var FFL_CREATE_ID_SIZE = 10;
/** Total data entries for FFLiDatabaseFileOfficial. */
var TOTAL_MIIS = 3000;
var TOTAL_MIIS_CFL = 100;
/** Starting offset of the name in FFLiMiiDataCore/Ver3StoreData. */
var NAME_OFFSET = 0x1A;
/** Length for Mii names as UTF-16 characters. */
var MAX_NAME_LENGTH = 10;

/**
 * Reference: https://github.com/aboood40091/ffl/blob/73fe9fc70c0f96ebea373122e50f6d3acc443180/include/nn/ffl/FFLiSwapEndian.h#L8
 * @enum {number}
 */
var SwapEndianType = {
    U8: 0,
    U16: 1,
    U32: 2
};

/** Maps {@link SwapEndianType} endian swap type to byte size. */
var swapEndianTypeToSize = [1, 2, 4];

/** @typedef {Array<{type: SwapEndianType, count: number}>} SwapEndianDesc */

/**
 * Swap descriptor for FFLiMiiDataCore (from FFLiSwapEndianDesc)
 * Reference: https://github.com/aboood40091/ffl/blob/73fe9fc70c0f96ebea373122e50f6d3acc443180/src/FFLiMiiDataCore.cpp#L6
 * @type {SwapEndianDesc}
 */
var SwapEndianDescCore = [
    { type: SwapEndianType.U32, count: 1 },  // miiVersion + personal, bitfields
    { type: SwapEndianType.U8,  count: 8 },  // authorID (8 bytes)
    { type: SwapEndianType.U8,  count: FFL_CREATE_ID_SIZE }, // createID (10 bytes)
    { type: SwapEndianType.U8,  count: 2 },  // reserved
    { type: SwapEndianType.U16, count: 11 }, // gender,...