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,...