# ✅ The unit datasheet ships its own schema Chasing the previous iteration's Shift-JIS value turned up something much larger than the placeholder I called it. **Correction to that entry: `文字列` is not a developer's leftover — it is one member of a six-word *type* vocabulary, and the records carrying it are a machine-readable schema for the unit datasheet.** ## The whole non-ASCII population is six words Across every parsed IDXD string on the disc: | | distinct | non-ASCII | |---|---|---| | values | 99 328 | **6** | | record names | 3 496 | 0 | | field names | 12 173 | 0 | All six decode cleanly as Shift-JIS, and all six are type names: | bytes | Shift-JIS | meaning | uses | |---|---|---|---| | `95B68E9A97F1` | `文字列` | string | 366 | | `4E535F22…22` | `NS_"文字列"` | NS_ string | 12 | | `90AE9094` | `整数` | integer | 66 | | `90AE9094926C` | `整数値` | integer value | 6 | | `958293AE8FAC9094926C` | `浮動小数値` | floating-point value | 504 | | `…5B308160315D` | `浮動小数値[0〜1]` | float in [0,1] | 36 | 990 type-valued fields in total. So the reader defect noted last time is real but **bounded to these six strings** — nothing else on the disc is non-ASCII, and `name_hash` re-encodes Latin-1 byte-for-byte, so hashing was never affected. ## 15 wildcard schema records, one per substructure The 990 fields sit in **15 records × 6 `GP_MAIN_GAME_*` paks = 90 instances**, i.e. **15 records with one user** under the per-pak-copy rule. Their names are exactly the unit substructure family — and six of them carry a literal wildcard: `Generic`, `Maneuver`, `Effect`, `Shield`, `Mass`, `SE`, `Explosion`, `StructureCount`, plus `Turret_???`, `Hatch_???`, `Bridge_???`, `Thruster_???`, `ShieldGenerator_???`, `Versatile_???` and `NS_*`. 🔑 **`???` is the numeric-suffix wildcard**, at record *and* field level: `Turret_???` is the schema for `Turret_000…00N`, and inside it `CannonFrame_???` / `MuzzleFrame_???` stand for the numbered frame slots. ⚠️ The control separates schema from data cleanly. The six `_???` records and `NS_*` exist **only** as schema — 6 of 6 instances typed. The eight real substructure names are typed in 6 instances and untyped in the rest: `Generic` 6 of 3 651, `Maneuver`/`Shield`/`Mass`/`SE`/`Explosion`/`Effect`/ `StructureCount` 6 of 684 each. A schema record is one extra instance of a name the datasheets already use. ## Where the type is an enum, the schema holds an example Not every field is typed — `Generic` is 20 typed of 23, `Turret_???` 20 of 25. The untyped slots hold a **sample value** instead, which names the enum: | field | schema slot | reading | |---|---|---| | `IsDestructible`, `IsAuto`, `IsShielded`, `IsRadarVisible`, `IsInvolved` | `Yes` | boolean | | `Generic.Type` | `Vessel` | the Craft/Vessel enum (43 + 71) | | `Generic.ID` | `Ship_` | the ID *prefix* convention | `Maneuver` is the one fully-typed record: **34 of 34**. Two readings worth keeping for the port: * every `ResistanceTo*` (`Shell`, `Explosion`, `Optics`) and every `Color_*` channel is **`FLOAT[0..1]`** — declared normalised, matching the sampled values (`ResistanceToShell 0.1`, `ResistanceToExplosion 0.5`) in [[unit-datasheet-static]]; * `Generic.NozzleSpec_???` has its own type `NS_"文字列"`, and `NS_*` is a record — the nozzle spec is a nested sub-schema, not a plain string. ⚠️ `Turret_???` carries the game's own typo **`NomalModel`** (beside `DamagedModel`), which is a join key in the usual way. This is the authoritative field-type table for the unit datasheet: types the disc declares, rather than types inferred from sampled values. Regenerate with `tools/re-capture/datasheet_schema.py` → [`docs/re/data/datasheet-schema.txt`](../data/datasheet-schema.txt).