Field reference › Check reference
Check reference
What each family of Check finding means, what actually triggers it, how to fix it, and — the distinction that matters most — whether it is one an export itself refuses, or one Check flags on its own, stricter bar.
The export gate is narrower than Check. Check sweeps the whole database and sorts every finding into one of two bars: blocking (4 of the 19 families below) and advisory — legal bytes the game loads fine, listed because it is probably not what you meant. But the export preflight itself tests a narrower, more exact condition than even the blocking half of Check does: both shipped Harpoon databases trip Check's blocking "Points at the wrong annex" family, and the game loads and plays both of them anyway. Where the two disagree, the section below says so.
One whole-database fault stops an export before any of this even runs, and is not a Check finding at all: a database file structure version the editor has no codec set for. Check only sweeps records that already loaded; if the file itself cannot be written back, the Export blocked dialog says so directly, with nothing to fix per record.
A database whose resources were stored LZH-compressed is not stopped. The editor reads that compression and does not produce it, so it writes those resources back uncompressed: the file that comes out is materially larger than the one that went in.
Neither is a database whose loadouts and multi-mounts carry four weapon slots rather than eight. A Harpoon Gold-era build wrote them that way in records of exactly the same size, so nothing in the file declares it — not even the structure version, since a 2017 database declares the same one and carries eight. The editor works it out from the data, keeps the current layout unless the evidence is decisive, and says which it used on the last line of the Overview.
Points at the wrong annex
blocks export
Triggers when a field that references another record — a mount's
WepId, a platform's MntId/SensId
slot, a plane's LoadId — holds an id whose top four
bits name a different annex than the field is allowed to point at. The
same family also covers a weapon's Dp/SubDp/
SurfDp above 30,000: above that
threshold the number is not a damage figure at all, it is an id
reference into I1 (nuclear warheads) or F1 (torpedo payload), and this
family flags one that names a record outside I1/F1, or — for this
field kind only — a value inside I1/F1's own window that names no
record at all, because a damage field has no "none" sentinel to fall
back on the way an ordinary reference slot does.
Fix. Open the record the finding names, and either clear the slot (set it to 65535) or repoint it at a real record of the annex the field wants — the field's own row on its annex page here names which annexes are acceptable. For a run of them, select the group on the Check screen and use Replace references….
This is the one family where the export gate is narrower than what this page reports as blocking. Both shipped Harpoon databases trip this family and the game loads and plays both, so the export preflight tolerates two shapes Check still reports here: an ordinary reference field holding plain 0 (measured: two zeroed magazine-weapon lines and a zeroed sensor slot in an extended database), and a Dp/SubDp/SurfDp id that is dangling but still inside I1/F1 (measured: hcgold's own "M51 SLBM" missile). Anything else in this family — a nonzero id whose annex nibble names the wrong annex outright — stops the export on both bars alike.
Points at a record that isn't there
advisory
Triggers when a reference slot holds an id in the annex the slot is allowed to name, and no record holds that id. The format allows it (65535 is the only value that means "nothing"), and the game skips some of these and stops on others. The sharper trouble is outside the database: a scenario or saved game that wanted that record cannot get it back. Damage-field references are reported under Points at the wrong annex, not here.
Fix. Open the record the finding names and clear the slot, or point it at another record. Or keep the reference and give a record the id it wants: Change id… on that record's page offers every id its annex is missing first.
Advisory: nothing refuses an export for it.
Will not fit in its field
blocks export
Triggers when a record holds a value its own field cannot store on
disk: a whole number outside the signed or unsigned range its C type
allows (a u8 over 255, an i8 under −128,
and so on for every integer kind the codecs use), an array with the
wrong number of elements, or a name/bytes field whose stored value is
not exactly the declared number of bytes. These pack into the working
project file without complaint — nothing stops a JSON edit or an
imported record from carrying one — and only fail once the writer
tries to pack the record into the fixed-width struct a .res record
actually is.
Fix. Open the record the finding names and correct the field it points at. The record screen runs the identical test at save time, so a database edited entirely inside the editor from here on will not produce new findings in this family — they mostly turn up on data imported or hand-edited outside it.
No narrowing here: RANGE is identical on both bars. It is the first thing an export refuses, on the first record it finds one on.
Source level the game cannot hold
blocks export
Triggers when an A1, A2 or F1 record's BaseSourceLevel
is above 127, or negative (the same stored byte read the other way).
The game holds a source level in a signed char, so 127 is
the most it can hold.
Fix. Open the record and pick a level from 0 to 127 on its ladder. A ship's or sub's active sonar at full power is 92.
Blocking for battleset 22 and higher: the export refuses until it is fixed. Below battleset 22 the game assigns its own source level, so it is reported as a rating warning instead and does not stop the export. See Ratings.
Ships and subs with no hull names
blocks export
Triggers when an A1 (ships and land units) or A2 (subs) record has no hull-name list, or its list is empty. The game names each ship or sub it places from its class's hull names.
Fix. Open the record, go to its hull names and add at least one.
Blocking: the export refuses until it is fixed.
Magazine blocks out of order
advisory
Triggers when a ship or base's magazine block breaks the shared
pool's writer contract: MagCount is 0 but
MagStart is not the 0 sentinel it should be, MagStart is
not a whole multiple of the 5-byte magazine
record, the block runs past the end of the pool, or its rows partly
overlap a block another platform already owns. Two platforms on exactly
the same block (the same start and count) are not a fault: they share
it, and each carries the full stock.
Fix. Open the platform's record, change its magazine rows and apply, which re-saves the block. The editor's own magazine edits always keep the pool valid — it is a splice, not a free-form edit — so this only appears after a hand-edited MagStart/MagCount or a spliced-in imported block.
Advisory: nothing in the writer refuses this shape at export. It is listed because the game trusts a platform's magazine rows are exactly where MagStart says they are, and a broken block is a corrupted game state waiting to happen the moment that platform is resupplied.
Magazine pool nearly full
advisory
Triggers once the shared magazine pool has used at least
90% of its 13,107-row
ceiling — 65,535
bytes, because MagStart is a 16-bit byte offset and
cannot address a block starting past byte 65,535. Reported once for
the whole database, not once per platform.
Fix. There is no record to open — this is a warning before the wall, not a broken one. Share identical magazines on the magazine pool's page frees the rows that platforms with the same stock hold twice, usually a large share of the pool. Past that, free rows by trimming magazine stocks that are not doing anything, or accept the risk and keep going; watch it as more magazines are added.
Advisory: the writer only refuses once the pool actually overflows past its ceiling. This fires while there is still room, as the warning before that point.
Annex nearly full
advisory
Two cases. An annex is reported once its records use more than 90% of the 4,096 disk ids its window holds (Z2 has 4,095, because 65535 means "none"), with how many are left, for example "3,912 of 4,096 ids used; 184 left". "Used" counts records, not the highest id: Add and Clone take the lowest free id, so the count is what says how much room remains. This is the same figure the Overview gauge shows. An aircraft is reported when every one of its loadout slots is taken ("32 of 32 loadouts"), which is all the file has room for.
Fix. For an annex, delete records nothing uses (the Unused tool lists them) or merge duplicates; at 100% nothing more can be added. For an aircraft, remove a loadout before adding another.
Advisory: nothing refuses an export for either. This is the warning before the wall.
Ids that collide
advisory
Triggers two ways: two records anywhere in the database share the same id (the later one in scan order is reported, naming the first it collides with), or a record's own DiskId falls outside the 4096-id window its own annex owns.
Fix. Renumber the reported record to an id inside its own annex's window that nothing else already uses.
Advisory: nothing at export enforces uniqueness or windowing. A collision just means every reference to that id silently resolves to whichever record a lookup finds first — the other record becomes unreachable by id without a single byte being wrong.
Hull-name classes nothing claims
advisory
Triggers when a hull-name class — the pool of names a ship or sub class draws its display name from — is keyed to an id that no A1 ship or A2 sub record actually carries. Usually the leftovers of a deleted class, kept in the pool but claimed by nothing.
Fix. Open the class in the Ship names list (Go → Lists) and either delete the orphaned class or point an existing ship or sub at its id.
Advisory: the names simply never get drawn in game. Export does not look at hull-name classes at all.
Description that is not there
advisory
Triggers when a ship, sub, or aircraft's TextIndex
names a position past the end of the platform description pool. There is
no "no text" sentinel value to fall back on — every legitimate record
in the shipped databases holds an in-range index — so a value past the
end is a genuine defect, not a deliberate "none".
Fix. Open the record and pick a real text entry from the pool.
Advisory: the game shows nothing for that record's platform description rather than refusing to load it, and export carries the value through unchanged either way.
Nothing where a range is needed
advisory
Triggers when every field that defines a weapon's or sensor's reach is zero at once: a gun's or missile's surface and air range together, a standoff weapon's or torpedo's max range, a radar's max range, a sonar's active and passive range together — or, for a B1 aircraft, its Runway is "none", meaning no base is too small for it to operate from. Ordnance (bombs, drop tanks) is deliberately excluded: a third of the shipped ordnance annex legitimately has zero range, so the lint would fire on ordinary content there rather than on the unfinished records it is meant to catch.
Fix. Fill in the missing range figures if the record is meant to reach anything, or leave it if it is genuinely a special case.
Advisory: a weapon that reaches nothing packs and exports fine. This is a "probably unfinished" flag, not a rule anything enforces.
Records with no name
advisory
Triggers when a record's own name field is empty — the twelve annexes that carry one. Nukes, loadouts, multi-mounts and magazine lines have no name field at all and are never flagged.
Fix. Open the record and name it, or delete it — and where a sweep turns up a run of them, open the family as a grid and use Delete on its toolbar rather than one record at a time (the Tools guide covers the verb and what it does about anything still referencing the records). A fresh record made in the editor cannot reach this state any more: saving a new record refuses a blank name outright. Saving over an existing name with an empty one is refused outright too, so what a sweep turns up here is almost always older than that, a record that arrived nameless from an import or an older database, rather than one born that way here.
Advisory: the game does not care, and neither does the writer — an empty name packs and exports like any other. It is listed because a record nothing can refer to by name is almost never what was meant.
Multi-mounts the mount editor would not make
advisory
Triggers when a Z2 multi-mount record is shaped in a way the mount editor's own save path never produces: an empty one holding no weapons at all (the editor stores an empty load as 65535 directly on the mount, never as an empty multi-mount), a single-weapon one a carrying mount could have stated inline instead, or a duplicate of another multi-mount's exact weapon-and-quantity composition (the editor reuses an existing one rather than creating a second).
Fix. Usually nothing — these are legal, and the next time that mount's weapon load is opened and saved in the editor, the shape normalises on its own. Hand-edit the Z2 record directly only if the unusual shape is deliberate and meant to persist.
Advisory: the bytes are entirely legal either way. This only flags a shape a save from the mount editor itself would never leave behind.
Battery totals in a per-mount field
advisory
Triggers on a mount record fitted in more than one copy whose tube
count is exactly its rounds figure times its mount count. A mount
record is one mount and the number of copies of it carried, so every
other number on it describes a single copy — the rounds field says so
in its own name, NumRoundsMnt. A battery entered as one
record is where that gets lost: the launcher's own tubes are counted,
multiplied by the number of launchers, and the product written into
the field that wanted the first number. Because a canister or rail
launcher carries one round per tube, that mistake lands on disk as
exactly this arithmetic — and the record then reads as a launcher with
several times more tubes than rounds to load into them.
Fix. Divide the tube count by the number of mounts. Or leave it, if the launcher really does fire a salvo larger than its own magazine — a rocket launcher or an ASW mortar legitimately has many tubes and one reload, and those are only reported here when the salvo also happens to match the mount count exactly.
Advisory: the bytes are legal and the export writes them unchanged. Only records with more than one mount are examined, and only the tube field — a record where the rounds figure is also the battery total is arithmetically identical to a perfectly correct pair of six-tube launchers, so it is left alone rather than guessed at.
Values no vocabulary names
advisory
Triggers when a scalar field wired to a coded vocabulary (its record page shows a picker for it) holds a value that vocabulary does not name at all — not merely a value outside what that field's own picker offers. Several fields only offer a stretch of a bigger axis (an aircraft's altitude band, a submarine's depth band, a ship's mast height are three stretches of one shared table), and a value outside a field's own stretch can still be a real row of the wider table it was cut from — that is named, and is not a finding here. This only fires when the value is unknown to the table itself.
Fix. Open the record and pick a value from the field's own list, or leave it if the value is deliberate — the game loads the record either way and reads the stored number as whatever it means to the engine.
Advisory: nothing about export or the game's loader
cares what a picker can name. This is listed because a value nothing
names is usually a typo, not a deliberate choice — Propulsion
53 (the ASCII character "5") on a real shipped ship looks exactly like
one.
Rating out of range
advisory
Triggers when a record's RCS is above the highest its
annex uses (237 for ships and subs, 200 for mobile land units and bases,
164 for aircraft, missiles and standoff ASW), or its
BaseSourceLevel is above 92, a ship's or sub's active
sonar at full power. Each maximum is where detect range reaches the
radar's own range.
Fix. Open the record and pick a value from the ladder, or leave it if it is deliberate.
Advisory: the bytes are legal and the game loads them. A source level above 127 is a separate, blocking family. Below battleset 22 the game assigns RCS and source level itself, so this family is not reported there. The full table is in Ratings.
Country is a side-name slot
advisory
Triggers when a record's Country is one of the first
8 slots of the country table (0 to
7), in any annex that has the field. Those
slots are meant for the side names (a real database has 0 "Blue", 1
"Red" and the rest empty), and using one as a record's country is
highly discouraged.
Fix. Open the record and pick a real country, or leave it if it is deliberate.
Advisory: the bytes are legal and the game loads them.
Text outside plain ASCII
advisory
Triggers on any text the game reads that is not printable ASCII (0x20 to 0x7E): a record's name, a platform description, a hull-name class, a string-table entry, or the database name. The game's font only approximates the rest: an accented letter shows without its accent, and the curly quotes a word processor makes (bytes 0x91 and 0x92) show as an extremely leaning apostrophe. A finding names the item, each offending character with its count, and the first occurrence in context with the plain form it would become.
Fix. Select the findings and press Replace
with plain text on the Check toolbar. Curly quotes, dashes, accented letters and similar become
their plain equivalents; a character with no plain form becomes
^, a control character a space (a line break in an
platform description is kept), and the old end-of-file byte 0x1A is removed.
The whole batch is one entry in History and one Undo. New text typed into
the editor is converted the same way when it is saved.
Advisory: the game loads the text, it just shows it wrongly.