Unit class table
LIB/UNIT000.DAT
One 88-byte record per unit type: movement, fuel, weapons, armour, transport and terrain.
Every other unit reference in the game, such as the units placed on a mission map or stored in a facility, is a record index into this table.
Abilities
1 field · 4 bytes
datainferred
| bit | mask | name | meaning |
|---|---|---|---|
| 0 | 0x00000001 | build | Builds roads through constructor selector0. |
| 1 | 0x00000002 | fortify | Builds fortifications through constructor selector2. |
| 2 | 0x00000004 | lay rails | Lays rails through constructor selector1. |
| 3 | 0x00000008 | occupy | Can occupy buildings. |
| 4 | 0x00000010 | transporter | Carries other units. |
| 5 | 0x00000020 | unnamed | Meaning unknown. Set in 32 of 54. |
| 6 | 0x00000040 | unnamed | Meaning unknown. Set in 42 of 54. |
| 7 | 0x00000080 | unusednever set in this field | Always zero in the shipped unit class table. |
| 8 | 0x00000100 | unnamed | Meaning unknown. Set in 11 of 54. |
| 9 | 0x00000200 | single unit | Fights as one entity; strength comes from 0x47. |
| 10 | 0x00000400 | repair | Repairs other units. |
| 11 | 0x00000800 | refuel | Hands out fuel. |
| 12 | 0x00001000 | no tracks | Leaves no vehicle tracks. |
| 13 | 0x00002000 | unnamed | Meaning unknown. Set in 39 of 54. |
| 14 | 0x00004000 | rearm | Hands out ammunition. |
| 15 | 0x00008000 | unnamed | Meaning unknown. Set in 1 of 54. |
| 16 | 0x00010000 | demolish | Admits demolition in the generic material constructor route. |
| 17 | 0x00020000 | no attack after move | Must stand still to attack. |
| 18 | 0x00040000 | move after attack | Offers a follow-up Move after a selected attack when the unit survives and its calculated remaining allowance is greater than one whole hex. The grant branch does not require a first Move. |
| 19 | 0x00080000 | unnamed | Meaning unknown. Set in 10 of 54. |
| 20 | 0x00100000 | refuel aircraft | Refuels aircraft. |
| 21 | 0x00200000 | unnamed | Meaning unknown. Set in 1 of 54. |
| 22 | 0x00400000 | unnamed | Meaning unknown. Set in 1 of 54. |
| 23 | 0x00800000 | plane | Aircraft or helicopter; classifies units into the AIRFORCE experience tally. |
| 24 | 0x01000000 | climb | Can climb to the high-air layer. |
| 25 | 0x02000000 | dive | Can dive. |
| 26 | 0x04000000 | unnamed | Meaning unknown. Set in 11 of 54. |
| 27 | 0x08000000 | no counterfire (provisional) | Losses inflicted by side 2 are cleared in selected attacks. |
| 28 | 0x10000000 | rail | Train. |
| 29 | 0x20000000 | no experience tally | Left out of the end-of-mission (ASCR250) experience tally. The units still gain experience. |
| 30 | 0x40000000 | crystal | The crystal object. |
| 31 | 0x80000000 | ship | Hull, submarines included; classifies units into the MARINE experience tally. |
Movement
4 fields · 8 bytes
Byte 0x0b is always 0, so only bits 0..22 are used.
datainferred
| bit | mask | name | meaning |
|---|---|---|---|
| 0 | 0x000001 | road | |
| 1 | 0x000002 | path | |
| 2 | 0x000004 | ditch | |
| 3 | 0x000008 | rail | |
| 4 | 0x000010 | minor obstacle | |
| 5 | 0x000020 | major obstacle | |
| 6 | 0x000040 | hill | |
| 7 | 0x000080 | mountain | |
| 8 | 0x000100 | slope | |
| 9 | 0x000200 | grassland | |
| 10 | 0x000400 | forest | |
| 11 | 0x000800 | hazard | |
| 12 | 0x001000 | water basin | |
| 13 | 0x002000 | mud | |
| 14 | 0x004000 | snow | |
| 15 | 0x008000 | rock in water | |
| 16 | 0x010000 | shallow water | |
| 17 | 0x020000 | medium water | |
| 18 | 0x040000 | deep water | |
| 19 | 0x080000 | ice | |
| 20 | 0x100000 | buildingnever set in this field | |
| 21 | 0x200000 | building (enterable) | |
| 22 | 0x400000 | building entrance | |
| 23–31 | unused | Never set in any record. |
fuel / fuel_usage is the tiles a full tank covers: 20-40 for most ground classes, 50-130 for aircraft and hulls, and always at least one full turn of move_range.
datainferred
The player-visible movement caller first supplies an integer tile distance and the range builder multiplies it by 8, then caps it to this byte. ATLAS stores 58 but uses runtime budget 56; TECHNOTRAX stores 50 but uses 48, so fractional stored values are truncated in these calls. Difficult terrain reduces the reachable endpoint set through the mission table at MISS+0x1c, selected by PART000.DAT+0x06. A non-zero value alone does not make a special class mobile: the manual calls RUNE and SKULL fixed despite their 1.25 value. GUN TOWER is 0; largest is 128 (FAST TRAIN, 16 normal-tile points).
datamanualbehaviour
1..6 in the shipped table.
The selected Move constructor does not debit a summed terrain cost or detour length.
databehaviour
Identity
3 fields · 6 bytes
ENG/UNIT000.TXT, band 0..53; equals the record index in every shipped record.
data
64..117 band of ENG/UNIT000.TXT (the proper/model name, e.g. TECHNOTRAX).
data
128..181 band (four-letter code, e.g. TANK).
Not simply index + 128: record 1 (CONTR.VEH. FORT.) points at 128 (BAU), not 129 (BAUD).
data
Production
2 fields · 2 bytes
The construction-list builder compares this signed byte with the selected facility's current energy limit.
databehaviour
The construction-list builder compares this signed byte with the selected facility's current material limit.
databehaviour
Weapons
5 fields · 40 bytes
0 marks an unused slot or a supply pod.
data
data
data
For a supply pod this is the store the unit carries (fuel, ammunition, energy or material).
data
datamanual
| bit | mask | name | meaning |
|---|---|---|---|
| 0 | 0x0001 | ammo | Supplies ammunition. |
| 1 | 0x0002 | fuel | Supplies fuel. |
| 2 | 0x0004 | energy | Supplies energy. |
| 3 | 0x0008 | material | Supplies material. |
| 4 | 0x0010 | high air (high-altitude aircraft) | Hits high-altitude aircraft. |
| 5 | 0x0020 | air (low-flying aircraft) | Hits low-flying aircraft. |
| 6 | 0x0040 | land (ground) | Hits ground units. |
| 7 | 0x0080 | water (naval) | Hits surface ships. |
| 8 | 0x0100 | underwater (submarines) | Hits submarines. |
| 9 | 0x0200 | structure (buildings) | Hits buildings. |
| 10 | 0x0400 | unnamed | Meaning unknown. Set in 6 of 216. |
| 11 | 0x0800 | Air-Air Rocket | |
| 12 | 0x1000 | Ground-Air Rocket | |
| 13 | 0x2000 | Air-Ground Rocket | |
| 14 | 0x4000 | Ground-Ground Rocket | |
| 15 | 0x8000 | Torpedo | |
| 16 | 0x10000 | unnamed | Meaning unknown. Set in 2 of 216. |
| 17 | 0x20000 | unnamed | Meaning unknown. Set in 3 of 216. |
| 18 | 0x40000 | unnamed | Meaning unknown. Set in 10 of 216. |
| 19 | 0x80000 | unnamed | Meaning unknown. Set in 46 of 216. |
| 20 | 0x100000 | unnamed | Meaning unknown. Set in 24 of 216. |
| 21 | 0x200000 | unnamed | Meaning unknown. Set in 54 of 216. |
| 22 | 0x400000 | unnamed | Meaning unknown. Set in 4 of 216. |
| 23 | 0x800000 | unnamed | Meaning unknown. Set in 10 of 216. |
| 24 | 0x1000000 | unnamed | Meaning unknown. Set in 36 of 216. |
| 25 | 0x2000000 | unnamed | Meaning unknown. Set in 10 of 216. |
| 26 | 0x4000000 | unnamed | Meaning unknown. Set in 20 of 216. |
| 27 | 0x8000000 | unnamed | Meaning unknown. Set in 2 of 216. |
| 28 | 0x10000000 | unnamed | Meaning unknown. Set in 3 of 216. |
| 29 | 0x20000000 | unnamed | Meaning unknown. Set in 3 of 216. |
| 31 | 0x80000000 | unnamed | Meaning unknown. Set in 7 of 216. |
| 30 | unused | Never set in any record. |
| slot | weapon_damage | weapon_min_range | weapon_max_range | weapon_ammo | weapon_targets |
|---|---|---|---|---|---|
| A | 0x1c | 0x24 | 0x28 | 0x2c | 0x34 |
| B | 0x1e | 0x25 | 0x29 | 0x2e | 0x38 |
| C | 0x20 | 0x26 | 0x2a | 0x30 | 0x3c |
| D | 0x22 | 0x27 | 0x2b | 0x32 | 0x40 |
Transport & facilities
7 fields · 7 bytes
datainferred
0 for non-transporters.
datainferred
datainferred
| bit | mask | name | meaning |
|---|---|---|---|
| 0 | 0x01 | infantry | the three RECON. PATROL / robot classes |
| 1 | 0x02 | mine | MINE |
| 2 | 0x04 | crystal | CRYSTAL |
| 3 | 0x08 | light | light vehicles, artillery, emplacements |
| 4 | 0x10 | heavy | REPAIR VEHICLE, MAIN BATTLE TANK, ASSAULT TANK, TRANSPORT TANK |
| 5 | 0x20 | support | radar, tanker, ammunition and transport vehicles, LANDING BOAT |
| 6 | 0x40 | air | every aircraft and helicopter |
| 7 | 0x80 | not transportable | structures, trains, hulls, the heavy aircraft |
datainferred
| bit | mask | name | meaning |
|---|---|---|---|
| 0 | 0x01 | hq | set on every mobile class |
| 1 | 0x02 | airport | fixed-wing aircraft, both helicopters, and classes with the all-category mask 0xff |
| 2 | 0x04 | harbour | hulls, LANDING BOAT, and classes with the all-category mask 0xff |
| 3 | 0x08 | factory | ground classes |
| 4 | 0x10 | depot | ground and rail classes, and both helicopters |
| 5 | 0x20 | city | ground classes, and both helicopters |
| 6 | 0x40 | academy | the classes that can gain experience |
| 7 | 0x80 | - | unlabelled |
+0x4f tag in a movement interaction filter.
In the tested class-14 fixture, value 2 lets the SPRING move onto the MINE-class target, which then became cargo in play; with value 1, Move was not offered for that MINE target. In a matched class-9 SNAKE fixture, value 1 let the unit pick up a CRYSTAL as cargo in play, while value 0 left ALDINIUM unavailable as a Move target even though an ordinary compatible neighbor was available. This supports scoped bit-0 CRYSTAL-target eligibility for that fixture, not a general pickup rule or value-0 cargo refusal. Other consumers remain unknown. See "Interaction mask" and unit_stats_4e_consumer_probe.md.
databehaviour
1 Crystal, 2 Mine.
This is distinct from the normal transport class/mask/capacity rules; the two objects must be loaded into an eligible transport.
datainferred
Same bit vocabulary as transport_class.
datainferred
Uses the bits listed under transport_class.
Combat
4 fields · 6 bytes
10 for ordinary units, 5 for a few, 1 for a unit that fights as a single entity (structures, trains, capital ships, submarines).
datamanual
0 when the class fights as a group.
datamanual
4..750.
Lowest on ARTILLERY (110) and ROCKET LAUNCHER (135), highest on BATTLESHIP (750). The combat side builder copies it into the casualty divisor.
databehaviour
0..990; the game's manual calls it the attack initiation value.
Highest on the indirect-fire and guided classes (ANTI AIR EMPLAC. 990, ARTILLERY 950, ROCKET LAUNCHER 910), low on units whose only weapon is a self-defence gun (REP.&TRANS. SHIP 12, AMMUNITION TRANS 64). The combat resolver uses it to limit first-strike casualties.
datamanualbehaviour
Senses & sound
4 fields · 4 bytes
ANTI RADAR VEHIC jams radar in player-confirmed play, and the manual labels the field.
Native player-view radius units, affected side, stacking, and exceptions are not captured. See player visibility evidence review.
datamanual
Its native player-view conversion, predicate, and exact geometry are unverified. See player visibility evidence review.
datainferred
2 ground, 4 air, 9 ship, 26 rail, 10 structure, 1 small boat).
datainferred
datainferred
Unknown / reserved
5 fields · 11 bytes
0 across all 54 records.
Most likely an in-memory pointer or handle slot zeroed on disk.
data
0x60e0 ground, 0x18f0/0x18e0 air, 0xe0e0/0xe1e0 sea, 0x0040 crystal.
This correlation does not establish a role.
data
0x0d ground, 0x08/0x0c air, 0x09 ship, 0x0b submarine); a non-zero high byte occurs only on ARMOURED CAR, ROCKET TANK, RAILMOUNTED GUN, ANTI AIR EMPLAC. and TRANSPORT HELI. These distributions do not establish a role.
data
0.
data
0.
data
Example: the Samurai 2 main battle tank
The Samurai 2 is unit id 11, the twelfth record, so its 88 bytes start at 11 x 88 = 0x3c8 in UNIT000.DAT. Each line is one field: its offset in the record, its bytes as stored, and the value they decode to.
0x00 00 00 00 00 reserved_head = 0
0x04 60 20 00 00 flags = 0x00002060
0x08 1f 62 00 00 terrain_mask = 0x0000621f: road, path, ditch, rail,
minor obstacle, grassland, mud, snow
0x0c e0 60 unknown_word_0c = 24800
0x0e 0d 00 unknown_word_0e = 13
0x10 0b 00 class_name_id = 11
0x12 4b 00 model_name_id = 75
0x14 8b 00 short_name_id = 139
0x16 5a 00 fuel = 90
0x18 28 move_range = 40
0x19 03 fuel_usage = 3
0x1a 09 cost_energy = 9
0x1b 08 cost_material = 8
0x1c 30 02 36 01 00 00 00 00 weapon_damage = 560, 310, 0, 0
0x24 01 01 00 00 weapon_min_range = 1, 1, 0, 0
0x28 01 01 00 00 weapon_max_range = 1, 1, 0, 0
0x2c 06 00 08 00 00 00 00 00 weapon_ammo = 6, 8, 0, 0
0x34 c0 00 28 01 60 00 28 01 00 00 00 00 ... weapon_targets = 0x012800c0, 0x01280060, 0, 0
0x44 0a weight = 10
0x45 00 transport_volume = 0
0x46 0a group_size = 10
0x47 00 group_strength_override = 0
0x48 c2 01 armour = 450
0x4a 10 transport_class = 0x10: heavy
0x4b 79 shop_mask = 0x79: hq, factory, depot, city, academy
0x4c 10 sight_block = 16
0x4d 10 sight = 16
0x4e 00 interaction_mask = 0
0x4f 00 pickup_type = 0
0x50 00 transport_mask = 0x00
0x51 00 reserved_51 = 0
0x52 a4 01 attack_initiative = 420
0x54 02 sfx_select = 2
0x55 01 sfx_fire = 1
0x56 00 00 reserved_tail = 0
The four weapon arrays (weapon_damage, weapon_min_range, weapon_max_range, weapon_ammo) and the target masks hold one entry per weapon slot, and this tank uses two. Slot A is the main gun: 560 damage at range 1 to 1, 6 rounds, and its target mask 0x012800c0 has the land and water bits (0xc0) set. Slot B is the secondary gun: 310 damage, 8 rounds, with mask 0x01280060, whose low bits (0x60) are air and land. That is how a tank shoots at aircraft. The other two slots are zero. terrain_mask is a bit set naming the tile classes the Samurai may enter; it has no major obstacle, which the lighter Ranger does, and no hill or mountain.
Still to investigate
Every field marked unknown or partial above, and every bit that is set without a name or named without ever being set.
- flags◐Unit capability bit set. Bits 5–6, 8, 13, 15, 19, 21–22, 26 are set but unnamed. Bit 7 (unused) is named but never set. UnitClassRecord
- terrain_mask●Bit 20 (building) is named but never set. UnitClassRecord
- unknown_word_0c○Values cluster within broad movement domains:
0x60e0ground,0x18f0/0x18e0air,0xe0e0/0xe1e0sea,0x0040crystal. UnitClassRecord - unknown_word_0e○Low-byte values cluster by movement domain (
0x0dground,0x08/0x0cair,0x09ship,0x0bsubmarine); a non-zero high byte occurs only onARMOURED CAR,ROCKET TANK,RAILMOUNTED GUN,ANTI AIR EMPLAC.andTRANSPORT HELI.These distributions do not establish a role. UnitClassRecord - weapon_targets●Bits 10, 16–29, 31 are set but unnamed. UnitClassRecord
- sight_block◐Class-table byte associated with radar jamming:
ANTI RADAR VEHICjams radar in player-confirmed play, and the manual labels the field. UnitClassRecord - sight◐Class-table byte labelled sight; the AI availability builder passes it to a geometry helper. UnitClassRecord
- interaction_mask◐Compared with another class's
+0x4ftag in a movement interaction filter. UnitClassRecord - pickup_type◐Special map-object pickup kind:
1Crystal,2Mine. UnitClassRecord - sfx_select◐Sound id candidate: constant per movement domain (
2ground,4air,9ship,26rail,10structure,1small boat). UnitClassRecord - sfx_fire◐Sound id candidate: varies with the weapon loadout rather than the movement domain. UnitClassRecord