Battle Isle 2

Mission files

MIS/MISS000.DAT ... MISS040.DAT

One file per campaign mission: scenario settings, the map, facilities, timed actions and deferred map changes.

A campaign mission is one MIS/MISS###.DAT file. A fixed header gives the offsets of five sections: MISS (scenario settings and rule tables), ACTN (the map: terrain, overlay and unit planes), SHOP (facilities and starting cargo), MAP\0 (timed actions: weather, announcements, win and loss rules) and DFxx (map changes applied later). All integers are little-endian. Every byte of the 24 shipped campaign files has a place in the layout; a few fields are still not understood, and the page says which.

Each box is one part of the file, in file order, split into the groups of the structure below. A block is as wide as its bytes where its label fits. ACTN, SHOP, MAP and DFxx vary in length (the range is across the campaign): a stack stands for the records of that section, and its label gives the record count. Dashed blocks (the tags) hold the same string in every file. A line means one field decides where a section starts or how large another block is; the label says how, and field, line and section share a shade.

File Header

278 bytes8 fields● 8 ◐ 0 ○ 0
0x0000char[4]tag ●Literal MSSN.

Section offsets

4 fields · 16 bytes
0x0004u32lemissOffset ●Absolute file offset of the MISS metadata section.
0x0008u32lemapOffset ●Absolute file offset of the MAP\0 action-record section.
0x000cu32leshopOffset ●Absolute file offset of the SHOP place/facility section.
0x0010u32leactnOffset ●Absolute file offset of the ACTN map-plane section.

Deferred layers

3 fields · 258 bytes
0x0014u16ledfLayerCount ●Number of declared DFxx offset/size entries.
0x0016u32le[32]dfOffsetsPlus4 ●One file offset per deferred layer, each stored 4 too high.
0x0096u32le[32]dfSizes ●Byte size of each DFxx layer, tag included, in the same order as dfOffsetsPlus4.

MISS Section

332 bytes26 fields● 14 ◐ 10 ○ 2values from 24 campaign missions, MISS section
0x0000MISS00x00200x00400x00600x00800x00a00x00c00x00e00x01000x01200x0140
Point at the bar to name a field; select it to jump to its row.
knownpartly knownunknown: investigatenamed, never setalways one valueunused bits
0x0000char[4]tag ●Literal MISS.

Identity

3 fields · 6 bytes
0x0004u16letitleTextId ●0 · 2Text id for scenario title, resolved against ENG/MISS###.TXT.
0x0006u16leforceTextId ●1 · 3Text id for the force/player label.
0x012au16leselfMissionId ●0–4024 distinct valuesThe mission's own file id, stored a second time.

Sides

4 fields · 11 bytes
0x0008u16leside_selection_mask ◐Side masksA mask over sides, shipped as 16, 19, 28 and 31.
1514131211109876543210
5 named2 named but never set9 unused
bitmasknamemeaning
00x0001side 0Blue: the player in campaign missions.
10x0002side 1Red.
20x0004side 2Orange-yellow.
30x0008side 3Olive green.
40x0010side 4Grey-green.
50x0020side 5never set in this fieldYellow. Owns units and facilities only in MISS035, 036, 037 and 040, so owner_side_mask sets it there; side_selection_mask never does.
60x0040side 6never set in this fieldNeutral (brown-grey): unowned buildings and units.
7–15unusedNever set in any record.
0x000du8present_sides_mask ◐3–4311 distinct valuesA mask over sides: the sides that take part.
0x000eu8mission_side_mask ◐0–3010 distinct valuesA mask over sides.
0x0014bytes[7]alliances ●Who is allied with whom: byte s, bit n set means side s is allied with side n, and the table is symmetric (side n then lists side s too).

Campaign

3 fields · 6 bytes
0x000au16lenextMissionId ●1–999923 distinct valuesId of the campaign mission file that follows this one on completion; 9999 marks the final mission.
0x0010u8[2]resource_selector_pair ◐always 0Both bytes are zero in all 24 shipped missions.
0x0012u16lemusicWord ●0 · 256 · 512 · 768The high byte selects the song archive LIB/SNG000..003.LIB.

Indexed pair

3 fields · 11 bytes
0x000cu8side_or_tail_pair_index ◐0 · 1 · 3Selects an entry from each of the five-byte tables indexed_tail_bytes_a and indexed_tail_bytes_b.
0x0124bytes[5]indexed_tail_bytes_a ◐Five bytes, one per value of side_or_tail_pair_index.
0x012cbytes[5]indexed_tail_bytes_b ◐Five bytes, one per value of side_or_tail_pair_index, read like indexed_tail_bytes_a with no established use.

Mission result

4 fields · 13 bytes
0x000fu8terminal_condition_count_threshold ●1 · 2 · 3Threshold against the accumulated count of satisfied mission terminal conditions (action types 0x08..0x0e).
0x011cbytes[8]tail_script_ids_a ●Up to eight animation-script ids.
0x0129u8tail_byte_129 ◐Passed to a lookup in a later step.
0x0131bytes[3]tail_script_ids_b ◐Three optional animation-script ids.

Movement

2 fields · 64 bytes
0x001ci8[32]terrain_cost_table ●Movement cost for each terrain class.
0x003ci8[32]auxiliary_terrain_cost_table ◐A second per-terrain-class cost row.

Combat

2 fields · 64 bytes
0x005ci8[32]combat_initiative_percent_by_terrain_class ●Signed initiative modifier, in percent, for each selected terrain class.
0x007ci8[32]combat_damage_percent_by_terrain_class ●Signed weapon-damage modifier, in percent, for each selected terrain class.

Production

1 field · 128 bytes
0x009cu16le[64]unit_construction_flags ●One flags word per unit class id, 64 slots.
313029282726252423222120191817161514131211109876543210
2 named30 not listed
bitmasknamemeaning
00x0001factory listThe class may appear in the generic construction list.
10x0002side conditionAlso required when the construction list's side-mask condition is active. OLARIBU sets it for unit ids 3, 4, 6, 8, 10, 11, 12, 52.
2–31not listedNo name recorded.

Unknown / reserved

3 fields · 25 bytes
0x001bu8intro_byte_1b ○Zero in all 24 shipped missions.
0x0134u16le[4]tail_zero_padding ●Zero across all 24 local campaign missions.
0x013cbytesunknown_tail_payload ○Zero in all 24 shipped missions.

ACTN Section

variable size6 fields● 6 ◐ 0 ○ 0
0x00char[4]tag ●Literal ACTN.

Header

2 fields · 4 bytes
0x04u16lewidth ●Map width in hex cells.
0x06u16leheight ●Map height in hex cells.

Planes

3 fields
0x0008..0x0008+cell_count*2-1i16le[]terrain ●cell_count = width * height; row-major terrain tile ids.
0x0008+cell_count*2..0x0008+cell_count*4-1i16le[]overlay ●width * height overlay tile ids; values < 1 are empty.
0x0008+cell_count*4..0x0008+cell_count*6-1i16le[]units ●width * height unit words, row-major; 0xffff (-1) marks an empty cell.

SHOP Section

variable size3 fields● 2 ◐ 1 ○ 0
0x00char[4]tag ●Literal SHOP.

Header

1 field · 2 bytes
0x04u16lerecord_count ●Number of 80-byte records following the header.

Records

1 field
0x0006..0x0006+record_count*80-1repeat record_count x ShopRecordfacility_records ◐40 signed words per record.

ShopRecord

80 bytes21 fields● 7 ◐ 13 ○ 1values from 24 campaign missions, SHOP section
0x0000x2800
Point at the bar to name a field; select it to jump to its row.
knownpartly knownunknown: investigatenamed, never setalways one valueunused bits

Type and place

6 fields · 12 bytes
0x00i16lerecord_type_flags ●1 · 2Only 1 and 2 occur in the 1,081 records.
0x02u16lepacked_position ●65–3931812 distinct valuesCell position as x + y * factor.
0x04i16leshopFunction ◐Shop functionsObserved values are 0, 1, 2, 4, 8, 16, 32.
1514131211109876543210
6 named10 unused
bitmasknamemeaning
00x0001HQHeadquarters (33).
10x0002airport or harbourWhere aircraft or ships are built and enter (135).
20x0004depot(14).
30x0008academy(38).
40x0010city or village(221).
50x0020loaded transportA carrier already holding cargo, not a building (22).
6–15unusedNever set in any record.
0x06i16lefacility_creation_arg ◐always 0Zero in all 1,081 nonempty campaign SHOP records.
0x0ai16leactive_packed_position_copy ◐0–3931420 distinct valuesA second copy of the position: it equals packed_position in all 465 base-game records whose last contents word is -1, and is zero in all 616 whose last word is 0.
0x32u16lefacility_or_carrier_category ◐Facility categoriesOn 440 of 441 building records the high byte is one facility-category bit, the same vocabulary as the unit class shop_mask; a unit may enter only when its mask has the matching bit.
1514131211109876543210
8 named5 set but unnamed3 unused
bitmasknamemeaning
00x0001unnamedMeaning unknown. Set in 1 of 1081.
10x0002unnamedMeaning unknown. Set in 1 of 1081.
50x0020unnamedMeaning unknown. Set in 1 of 1081.
60x0040unnamedMeaning unknown. Set in 9 of 1081.
70x0080unnamedMeaning unknown. Set in 1 of 1081.
80x0100HQHeadquarters.
90x0200airport
100x0400harbour
110x0800factory
120x1000depot
130x2000city
140x4000academy
150x8000special facility
2–4unusedNever set in any record.

Name and owner

2 fields · 4 bytes
0x08i16lenameId ●0–5050 distinct valuesText id in ENG/MISS###.TXT.
0x40i16leowner_side_mask ◐Side masksThe owning side as a single bit.
1514131211109876543210
7 named1 set but unnamed8 unused
bitmasknamemeaning
00x0001side 0Blue: the player in campaign missions.
10x0002side 1Red.
20x0004side 2Orange-yellow.
30x0008side 3Olive green.
40x0010side 4Grey-green.
50x0020side 5Yellow. Owns units and facilities only in MISS035, 036, 037 and 040, so owner_side_mask sets it there; side_selection_mask never does.
60x0040side 6Neutral (brown-grey): unowned buildings and units.
70x0080unnamedMeaning unknown. Set in 1 of 1081.
8–15unusedNever set in any record.

Economy

6 fields · 10 bytes
0x0ci16leinitial_energy ◐0–9027 distinct valuesThe facility's starting energy limit, read when the construction list is built.
0x0ei16leinitial_material ◐0–7039 distinct valuesThe facility's starting material limit, read when the construction list is built.
0x10i8facility_energy_increment ●Signed energy income of this facility, added to its owning side's total when the incoming-owner update includes facility rates.
0x11i8facility_material_increment ●Signed material income of this facility, added to its current material by the incoming-owner update when that update includes facility rates.
0x3ci16lecapacity_state ◐always 0Zero in all 1,081 nonempty campaign records.
0x3ei16leunidentified_facility_word_3e ◐0–94086 distinct valuesAn unidentified word that is not the owner.

Contents

2 fields · 40 bytes
0x12i16le[16]contents_slots ●-1–5343 distinct valuesSixteen positions for starting unit class ids.
0x34i16le[4]construction_unit_ids ●0–5235 distinct valuesUp to four extra unit class ids appended to this facility's generic production list.

Unit extension (type 2)

4 fields · 8 bytes
0x48i16letype2_extension_word_0 ◐0–189 distinct valuesObserved values: 0, 1, 2, 4, 8, 9, 12, 17, 18.
0x4ai16letype2_extension_word_1 ◐0 · 5 · 6 · 7 · 10 · 20Observed values: 0, 5, 6, 7, 10, 20; 10 occurs in 596 records.
0x4ci16letype2_extension_word_2 ◐0–23319 distinct valuesObserved values: 0, 105, 137, 342, 793, 1556, 1808, 2327, 2331.
0x4ei16letype2_extension_word_3 ◐0 · 4 · 7 · 794 · 1350Observed values: 0, 4, 7, 794, 1350.

Unknown / reserved

1 field · 6 bytes
0x42i16le[3]zero_extension_words ○always 0All three words are zero in every shipped record, and nothing is known to read them.

MAP Section

variable size2 fields● 1 ◐ 1 ○ 0
0x00char[4]tag ●Literal MAP\0: MAP plus a NUL terminator.

Records

1 field
0x0004..firstDfOffset-1repeat action_record_count x MapActionRecordaction_records ◐action_record_count = (firstDfOffset - mapOffset - 4) / 40; the section ends where the first DFxx section begins.

MapActionRecord

40 bytes12 fields● 6 ◐ 5 ○ 1values from 24 campaign missions, MAP section
0x00000
Point at the bar to name a field; select it to jump to its row.
knownpartly knownunknown: investigatenamed, never setalways one valueunused bits

Condition

3 fields · 6 bytes
0x00u16lecategory_or_scope ◐0 · 48 · 80Corpus values are 0, 0x30, and 0x50.
0x02u16leturn ●0–3027 distinct valuesCopied by parser and insertion to entry +0x0c; second-pass scheduling requires signed entry turn <= signed manager turn +0x12.
0x04u16letrigger_group_or_side ●0–1212 distinct valuesCopied through insertion to entry +0x0a; second-pass scheduling requires signed entry event <= signed manager event +0x10.

Action

3 fields · 4 bytes
0x06u8action_selector ●Copied to entry +0x0e.
0x07u8action_type ●The action kind; the game dispatches on this byte.
0x08u16leduration_or_count ●0 · 100Copied to entry +0x06, the unsigned low sequence ceiling; entry +0x08 is its signed high word.

Operands

4 fields · 8 bytes
0x0au16leaction_param_a ●always 0Zero in all 364 shipped action records.
0x0cu16leaction_param_b ◐0–9898 distinct valuesFamily-specific operand: type 0x04 DF index, 0x05/06/07 side number, 0x0d returned request word; type 0x02 weather state; type 0x03 ASCR scene id; type 0x07 side whose alliance row changes; type 0x08 target side; type 0x09 requested facility-owner side; type 0x0a maximum mission turn count; type 0x0c target unit class id.
0x0eu16leaction_param_c ◐0–2717 distinct valuesFamily-specific operand: 0x05 signed energy delta, 0x06 native facility ordinal; 0x0900 native facility ordinal (not a universal SHOP-array index); 0x0c00 target unit side id.
0x10u16leaction_param_d ◐0 · 1Usually zero; the only nonzero shipped value is 1, in MISS003.DAT MAP record 4 (0x0704).

Unknown / reserved

2 fields · 22 bytes
0x12u16le[3]copied_zero_action_words ◐always 0All three words are zero in the shipped records.
0x18u16le[8]unread_map_record_tail ○always 0All eight words are zero in the shipped records, and the game never reads this part of the record.

DFxx Layers

variable size2 fields● 1 ◐ 1 ○ 0

Header

1 field · 4 bytes
0x00char[4]tag ●DF00, DF01 and so on.

Records

1 field
0x0004..df_size-1repeat df_record_count x DfCellRecorddeferred_cells ◐Sparse map edits.

DfCellRecord

8 bytes4 fields● 4 ◐ 0 ○ 0
0x00
Point at the bar to name a field; select it to jump to its row.
knownpartly knownunknown: investigatenamed, never setalways one valueunused bits

Cell patch

4 fields · 8 bytes
0x00u16lepacked_position ●Padded native cell index; the writer uses P for byte base/overlay planes and P*2 for word occupancy.
0x02i16leterrain ●Compare raw word with source-ID word of each loaded 46-byte PART row; first match writes compact ordinal to base byte plane.
0x04i16leoverlay ●Same source-ID lookup; write matching compact ordinal, or ff when no row matches.
0x06i16leunit ●ffff requests no creation.

Reference: terrain classes

Bit n of a terrain record's entry mask names a terrain class (see Terrain records). The four per-class rows in the MISS section (terrain_cost_table, auxiliary_terrain_cost_table, combat_initiative_percent_by_terrain_class and combat_damage_percent_by_terrain_class) are indexed by that bit. The values below are the row every shipped mission carries.

BitTerrain classMain costAuxiliary costCombat initiative %Combat damage %
0road00+500
1path80+300
2ditch204+90+50
3rail10000
4minor obstacle164−30+40
5major obstacle2016−10+30
6hill2424−20+50
7mountain3832−40+60
8slope268−15+25
9grassland12000
10forest1616−20+40
11hazard1204−95−20
12water basin300−60−10
13mud320−40−30
14snow200−10−20
15rock in water164−10−10
16shallow water0000
17medium water0000
18deep water0000
19unnamed80+40−10
20building1201600
21building (enterable)1680+30
22building entrance01600
23..31unused in shipped entry masks0000

The class names describe common base-tile uses of each bit; they are not exclusive. The two cost columns are local threshold values, not amounts summed along a route. The two percentage columns are the raw mission values; difficulty decides whether they are applied.

Reference: MAP action types and selectors

The stored word 0xTTSS at bytes 0x06..0x07 of a MapActionRecord is the action type TT and the selector SS; 0x0201 and 0x0202 are the same type with different selectors, not separate subtypes. In the table, word[n] is the n-th 16-bit word of the 40-byte record: word[1] is turn, word[6] is action_param_b, word[7] is action_param_c and word[8] is action_param_d.

Stored wordCountCurrent roleEvidence in playNotes
0x020190global weather change, selector 1confirmed in playword[6] selects the weather: 0 clear, 1 light rain, 2 heavy rain, 3 light snow, 4 heavy snow. All five states were seen in AMPORGE. Value 5 occurs three times in ULUARGE, but the game's weather routine rejects values outside 0..4 and leaves the weather unchanged.
0x02023global weather change, selector 2type confirmed in play; selector 2 untestedWAGOPAY uses selector 2 with weather values 1, 2 and 0. Selector 2 has not been tested against selector 1 in play.
0x0301155mission announcement/reportconfirmed in playword[6] selects the animation script ASCR###; the script's write(...) calls select the ATXT### text archives.
0x032013mission announcement/report, selector 0x20same shape as 0x0301; selector difference untestedThe same script-selection field as selector 1; the difference between the selectors has not been tested.
0x04017deferred DF-layer activation, selector 1original executable bytesActivates a DFxx layer: word[1] is the turn and word[6] the layer index. These 7 actions cover 7 of the 9 genuine layers; ULUARGE and DAFATWA have a layer with no activation record. No placeholder-layer mission has one.
0x07041alliance change for one side, selector 4not tested in playSeen once, in MISS003.DAT record 4 at turn 16. Type 0x07 selects the side row from word[6], clears the bit for word[8] and adds the bit for word[7] in the table at alliances. The stored values 2, 0, 1 therefore take side 1 out of side 2's row and add side 0 (already there): side 2 stops being allied with side 1 and stays with side 0. A player-visible test is open.
0x080014side-elimination terminal conditionconfirmed in playword[6] is the target side; true when no active unit of that side has class bit 29 clear. Contained units count; strength is not tested. Category 0x30 is success, category 0x50 is failure.
0x090056facility-ownership terminal conditionconfirmed in playword[6] is the requested owner side and word[7] the SHOP record index; the condition tests plain ownership of any facility. Category 0x30 is success, category 0x50 is failure.
0x0a0019mission turn-limit failure conditionconfirmed in playCategory 0x50. word[6] is the maximum mission turn count (campaign values 15..60) and word[7] is zero. The exact predicate is signed native manager turn >= signed B. Visible-turn conversion needs a counted-turn/context binding.
0x0a011mission turn-limit failure condition, selector 1confirmed in playCategory 0x50. The same dispatched type as 0x0a00; the only one is in MISS015.DAT with word[6] = 35.
0x0c005matching-unit terminal conditionconfirmed in play; polarity depends on the categoryword[6] is a unit class and word[7] its side. Category 0x30 is a destroy-all-matching-units success rule, and repeated blocks are separate one-shot counted conditions; mission threshold controls the aggregate result. Category 0x50 reads as a protect rule that fails when the matching units die; it still needs a normal-combat replay.

Example: an announcement in AMPORGE

MIS/MISS000.DAT is the first campaign mission, AMPORGE. Its MAP\0 section starts at the offset in the header word mapOffset (0x0c60 in this file), and each action record is 40 bytes after the 4-byte tag. Record 3 is the fourth: it starts at 0x0c60 + 4 + 3 x 40. Each line is one field: its offset in the record, its bytes as stored, and the value they decode to.

0x00  00 00                                      category_or_scope = 0
0x02  00 00                                      turn = 0
0x04  00 00                                      trigger_group_or_side = 0
0x06  01                                         action_selector = 1
0x07  03                                         action_type = 0x03: announcement
0x08  64 00                                      duration_or_count = 100
0x0a  00 00                                      action_param_a = 0
0x0c  11 00                                      action_param_b = 17: animation script ASCR017
0x0e  00 00                                      action_param_c = 0
0x10  00 00                                      action_param_d = 0
0x12  00 00 00 00 00 00                          copied_zero_action_words = 0, 0, 0
0x18  00 00 00 00 00 00 00 00 00 00 00 00 ...    unread_map_record_tail = 0 (16 bytes)

The stored word at 0x06 reads 0x0301: type 0x03, selector 1. The record fires at turn 0, so the announcement plays as the mission opens. It names script ASCR017 in action_param_b; that script shows General Odan's contact message. Record 4 has the same shape with script ASCR019, the objective briefing. A condition record such as record 1 (50 00 ... 08 00) has category 0x50 and type 0x08; it is a failure rule that names side 0, the player.

Example: a neutral city in AMPORGE

The same mission's SHOP section holds three records. Record 0 starts at shopOffset + 6 and is 80 bytes long. It is a type-1 record: a facility, here a city.

0x00  01 00                                      record_type_flags = 1: facility
0x02  d5 00                                      packed_position = 213: x 21, y 3
0x04  10 00                                      shopFunction = 0x0010: city or village
0x06  00 00                                      facility_creation_arg = 0
0x08  02 00                                      nameId = 2
0x0a  d5 00                                      active_packed_position_copy = 213
0x0c  14 00                                      initial_energy = 20
0x0e  1e 00                                      initial_material = 30
0x10  08                                         facility_energy_increment = 8
0x11  04                                         facility_material_increment = 4
0x12  ff ff ff ff ff ff ff ff ff ff ff ff ...    contents_slots = -1 x 16 (empty)
0x32  00 20                                      facility_or_carrier_category = 0x2000: city
0x34  00 00 00 00 00 00 00 00                    construction_unit_ids = 0, 0, 0, 0
0x3c  00 00                                      capacity_state = 0
0x3e  2c 01                                      unidentified_facility_word_3e = 300
0x40  40 00                                      owner_side_mask = 0x0040: side 6, neutral
0x42  00 00 00 00 00 00                          zero_extension_words = 0, 0, 0
0x48  00 00                                      type2_extension_word_0 = 0
0x4a  00 00                                      type2_extension_word_1 = 0
0x4c  00 00                                      type2_extension_word_2 = 0
0x4e  00 00                                      type2_extension_word_3 = 0

The position 213 is 3 x 64 + 21, since the map is no wider or taller than 64. Nobody owns the city, so its side is the neutral side 6, and a plain city builds nothing: all four extra unit ids are zero and all sixteen contents positions are empty. It still produces: each turn it adds 8 energy and 4 material. The three type-2 words are unused here because they apply only to type-2 records, which annotate units already on the map.

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.

  • side_selection_mask◐A mask over sides, shipped as 16, 19, 28 and 31. Bit 5 (side 5), Bit 6 (side 6) are named but never set. MISS Section
  • side_or_tail_pair_index◐Selects an entry from each of the five-byte tables indexed_tail_bytes_a and indexed_tail_bytes_b. MISS Section
  • present_sides_mask◐A mask over sides: the sides that take part. MISS Section
  • mission_side_mask◐A mask over sides. MISS Section
  • resource_selector_pair◐Both bytes are zero in all 24 shipped missions. MISS Section
  • intro_byte_1b○Zero in all 24 shipped missions. MISS Section
  • auxiliary_terrain_cost_table◐A second per-terrain-class cost row. MISS Section
  • indexed_tail_bytes_a◐Five bytes, one per value of side_or_tail_pair_index. MISS Section
  • tail_byte_129◐Passed to a lookup in a later step. MISS Section
  • indexed_tail_bytes_b◐Five bytes, one per value of side_or_tail_pair_index, read like indexed_tail_bytes_a with no established use. MISS Section
  • tail_script_ids_b◐Three optional animation-script ids. MISS Section
  • unknown_tail_payload○Zero in all 24 shipped missions. MISS Section
  • facility_records◐40 signed words per record. SHOP Section
  • shopFunction◐Observed values are 0, 1, 2, 4, 8, 16, 32. ShopRecord
  • facility_creation_arg◐Zero in all 1,081 nonempty campaign SHOP records. ShopRecord
  • active_packed_position_copy◐A second copy of the position: it equals packed_position in all 465 base-game records whose last contents word is -1, and is zero in all 616 whose last word is 0. ShopRecord
  • initial_energy◐The facility's starting energy limit, read when the construction list is built. ShopRecord
  • initial_material◐The facility's starting material limit, read when the construction list is built. ShopRecord
  • facility_or_carrier_category◐On 440 of 441 building records the high byte is one facility-category bit, the same vocabulary as the unit class shop_mask; a unit may enter only when its mask has the matching bit. Bits 0–1, 5–7 are set but unnamed. ShopRecord
  • capacity_state◐Zero in all 1,081 nonempty campaign records. ShopRecord
  • unidentified_facility_word_3e◐An unidentified word that is not the owner. ShopRecord
  • owner_side_mask◐The owning side as a single bit. Bit 7 is set but unnamed. ShopRecord
  • zero_extension_words○All three words are zero in every shipped record, and nothing is known to read them. ShopRecord
  • type2_extension_word_0◐Observed values: 0, 1, 2, 4, 8, 9, 12, 17, 18. ShopRecord
  • type2_extension_word_1◐Observed values: 0, 5, 6, 7, 10, 20; 10 occurs in 596 records. ShopRecord
  • type2_extension_word_2◐Observed values: 0, 105, 137, 342, 793, 1556, 1808, 2327, 2331. ShopRecord
  • type2_extension_word_3◐Observed values: 0, 4, 7, 794, 1350. ShopRecord
  • action_records◐action_record_count = (firstDfOffset - mapOffset - 4) / 40; the section ends where the first DFxx section begins. MAP Section
  • category_or_scope◐Corpus values are 0, 0x30, and 0x50. MapActionRecord
  • action_param_b◐Family-specific operand: type 0x04 DF index, 0x05/06/07 side number, 0x0d returned request word; type 0x02 weather state; type 0x03 ASCR scene id; type 0x07 side whose alliance row changes; type 0x08 target side; type 0x09 requested facility-owner side; type 0x0a maximum mission turn count; type 0x0c target unit class id. MapActionRecord
  • action_param_c◐Family-specific operand: 0x05 signed energy delta, 0x06 native facility ordinal; 0x0900 native facility ordinal (not a universal SHOP-array index); 0x0c00 target unit side id. MapActionRecord
  • action_param_d◐Usually zero; the only nonzero shipped value is 1, in MISS003.DAT MAP record 4 (0x0704). MapActionRecord
  • copied_zero_action_words◐All three words are zero in the shipped records. MapActionRecord
  • unread_map_record_tail○All eight words are zero in the shipped records, and the game never reads this part of the record. MapActionRecord
  • deferred_cells◐Sparse map edits. DFxx Layers